legionio 0.3.0 → 0.3.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 732846134f79449f2a5c0141e57e40379015403485296374f39263c2dcda4060
4
- data.tar.gz: 7867fa05990668a0d4742134ba017fcdc19f5a00a2272f750b07e2810539e516
3
+ metadata.gz: 054fe7a9c7707f232d0e93719567254ff8b1ca190f0248abc3b8ba1bcba45a84
4
+ data.tar.gz: 658bd9bb7e565268e15fc768f7b7691eef6c77738ccd4fba1d87b6bf44e9fbb6
5
5
  SHA512:
6
- metadata.gz: 932ab867c3212b6893b414e35051c90117e38ed0036301a5559f77c38f4574953a127e5194c199cff099d74336fdbaca41e3709887d465d0940a4034c830daae
7
- data.tar.gz: b9d6af4416f0261cee4df3d6111eb4ec09b324ae64e7efef6f8f09f76b67db1a9897fe1e82405a80cd82b7f65ef48b4e21ea1628a2cf688ceec6c03750581c76
6
+ metadata.gz: 98a94510b0408b5f857adaaaa41efe74de4dcc0c509c21d5630001d9aa4a5af16cb2d7ecf5ff0174d310e6f9e159c81948c2e87c44067100d95e106db8b7e390
7
+ data.tar.gz: 1c21c38abdbfc70e384a09604f88a712e5a1d240409443f7f50a8df75ed4f528f856c1a23b038d89d0f7e7c167d3b645df0ef07378d77ce6b311bbb34d27bd9c
@@ -62,7 +62,7 @@ Metrics/CyclomaticComplexity:
62
62
  - .debug
63
63
  - .trace
64
64
  Metrics/PerceivedComplexity:
65
- Max: 15
65
+ Max: 17
66
66
  IgnoredMethods:
67
67
  - .unknown
68
68
  - .fatal
data/Gemfile CHANGED
@@ -1,3 +1,14 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
+
5
+ gem 'lex-conditioner'
6
+ gem 'lex-esphome'
7
+ gem 'lex-health'
8
+ gem 'lex-http'
9
+ gem 'lex-influxdb'
10
+ gem 'lex-lex'
11
+ gem 'lex-log'
12
+ gem 'lex-scheduler', path: '../../lex/lex-scheduler'
13
+ gem 'lex-tasker'
14
+ gem 'lex-transformer'
data/bin/legion CHANGED
@@ -2,6 +2,7 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'optparse'
5
+ require 'etc'
5
6
 
6
7
  options = { action: :run }
7
8
 
@@ -44,7 +45,46 @@ op.on('-v', '--version') { options[:action] = :version }
44
45
  op.separator ''
45
46
  op.parse!(ARGV)
46
47
 
47
- require File.expand_path('lib/legion.rb') unless options[:action] == :help
48
- Legion.start
49
- require File.expand_path('lib/legion/process.rb') unless options[:action] == :help
50
- Legion::Process.new(options).run!
48
+ @children = []
49
+ children = 5
50
+ if children == 1
51
+ require File.expand_path('lib/legion.rb') unless options[:action] == :help
52
+ require File.expand_path('lib/legion/process.rb') unless options[:action] == :help
53
+ Legion.start
54
+ Legion::Process.new(options).run!
55
+ else
56
+ children.times do
57
+ @children.push(
58
+ Process.fork do
59
+ require File.expand_path('lib/legion.rb') unless options[:action] == :help
60
+ require File.expand_path('lib/legion/process.rb') unless options[:action] == :help
61
+
62
+ Legion.start
63
+ sleep(1)
64
+ Legion::Process.new(options).run!
65
+ end
66
+ )
67
+ sleep(5)
68
+ end
69
+
70
+ @quit = false
71
+ trap('SIGINT') do
72
+ @quit = true
73
+ @children.each do |child|
74
+ Process.kill('SIGINT', child)
75
+ end
76
+ sleep(5)
77
+ end
78
+
79
+ trap('SIGTERM') do
80
+ @children.each do |child|
81
+ Process.kill('SIGTERM', child)
82
+ end
83
+
84
+ sleep(5)
85
+ end
86
+
87
+ sleep(1) until @quit
88
+ end
89
+
90
+ sleep(2)
@@ -148,6 +148,62 @@ module Legion
148
148
 
149
149
  def find_extensions
150
150
  @extensions ||= {}
151
+ # puts Gem.install('lex-esphome')
152
+ # puts Gem::Installer.new('lex-esphome')
153
+ # test = Gem::Installer.new('lex-esphome')
154
+ # puts test.install
155
+ # puts Gem::Dependency.new('lex-esphome')
156
+ # $LOAD_PATH << "#{ENV['GEM_HOME']}/gems/lex-esphome-0.1.0/lib"
157
+ # require 'legion/extensions/esphome'
158
+ # $LOAD_PATH << "#{ENV['GEM_HOME']}/gems/lex-esphome-0.1.0/lib"
159
+ # ENV['MY_RUBY_HOME'] #/Users/miverso2/.rvm/rubies/ruby-2.7.0
160
+ # ENV['GEM_HOME'] # /Users/miverso2/.rvm/gems/ruby-2.7.0
161
+ # require 'rubygems/dependency_installer.rb'
162
+ # puts Gem::DependencyInstaller.new.install('lex-esphome')
163
+ # puts Gem::Installer.new('lex-esphome').install
164
+ # puts Gem::Installer.new('lex-esphome').ensure_loadable_spec
165
+ # puts Gem.search('lex-esphome')
166
+ # Gem.clear_paths
167
+ # require 'legion/extensions/esphome'
168
+
169
+ # puts Gem.use_gemdeps
170
+ # pp Gem.gemdeps
171
+ # puts 'gems things'
172
+ # puts Gem.loaded_specs.key? 'lex-esphome'
173
+ # pp Gem.loaded_specs.keys
174
+ #
175
+ # require 'rubygems'
176
+ # require 'rubygems/command.rb'
177
+ # require 'rubygems/dependency_installer.rb'
178
+ #
179
+ # Gem::Command.build_args = ARGV
180
+ # inst = Gem::DependencyInstaller.new
181
+ # puts inst.installed_gems
182
+ # puts inst.install 'lex-esphome', install_as_default: true
183
+ # puts inst.installed_gems
184
+ # puts '....'
185
+ # test = Gem::DependencyList.new
186
+ # test.add(inst)
187
+ # pp test.find_name('lex-esphome')
188
+ # pp test.find_name('lex-logger')
189
+ # pp test.specs
190
+ # pp Gem::DependencyList.from_specs
191
+ # pp Gem::DependencyList.from_specs.key? 'lex-logg'
192
+ # pp inst
193
+ #
194
+ # pp Gem.new.all_specs
195
+ # load 'legion/extensions/esphome.rb'
196
+ # puts Gem.register_default_spec()
197
+ # :use_gemdeps,
198
+ # :detect_gemdeps,
199
+ # :source_date_epoch,
200
+ # :gemdeps,
201
+ # :register_default_spec,
202
+ # :find_unresolved_default_spec,
203
+ # :clear_default_specs,
204
+ # :loaded_specs,
205
+ # :default_path,
206
+
151
207
  Gem::Specification.all_names.each do |gem|
152
208
  next unless gem[0..3] == 'lex-'
153
209
 
@@ -158,6 +214,10 @@ module Legion
158
214
  version: lex[2],
159
215
  extension_class: "Legion::Extensions::#{lex[1].capitalize}" }
160
216
  end
217
+
218
+ # Legion::Settings[:extensions].each do |extension|
219
+ # puts extension unless @extensions.key? extension
220
+ # end
161
221
  end
162
222
  end
163
223
  end
@@ -65,22 +65,26 @@ module Legion
65
65
  end
66
66
 
67
67
  def process_message(message, metadata, delivery_info)
68
- payload = if metadata[:content_encoding] && metadata[:content_encoding] == 'encrypted/cs'
69
- Legion::Crypt.decrypt(message, metadata[:headers]['iv'])
70
- elsif metadata[:content_encoding] && metadata[:content_encoding] == 'encrypted/pk'
71
- Legion::Crypt.decrypt_from_keypair(metadata[:headers][:public_key], message)
68
+ payload = if metadata.content_encoding && metadata.content_encoding == 'encrypted/cs'
69
+ Legion::Crypt.decrypt(message, metadata.headers['iv'])
70
+ elsif metadata.content_encoding && metadata.content_encoding == 'encrypted/pk'
71
+ Legion::Crypt.decrypt_from_keypair(metadata.headers[:public_key], message)
72
72
  else
73
73
  message
74
74
  end
75
75
 
76
- message = if metadata[:content_type] == 'application/json'
76
+ message = if metadata.content_type == 'application/json'
77
77
  Legion::JSON.load(payload)
78
78
  else
79
79
  { value: payload }
80
80
  end
81
81
  if include_metadata_in_message?
82
- message = message.merge(metadata[:headers].transform_keys(&:to_sym))
83
- message[:routing_key] = delivery_info[:routing_key]
82
+ message = message.merge(metadata.headers.transform_keys(&:to_sym)) unless metadata.headers.nil?
83
+ message[:routing_key] = if Legion::Transport::TYPE == 'march_hare'
84
+ metadata.routing_key
85
+ else
86
+ delivery_info[:routing_key]
87
+ end
84
88
  end
85
89
 
86
90
  message[:timestamp] = (message[:timestamp_in_ms] / 1000).round if message.key?(:timestamp_in_ms) && !message.key?(:timestamp)
@@ -98,11 +102,15 @@ module Legion
98
102
  end
99
103
 
100
104
  def subscribe
101
- require 'legion/extensions/tasker/runners/updater'
102
105
  sleep(delay_start)
103
106
  consumer_tag = "#{Legion::Settings[:client][:name]}_#{lex_name}_#{runner_name}_#{Thread.current.object_id}"
104
107
  on_cancellation = block { cancel }
105
- @consumer = @queue.subscribe(manual_ack: manual_ack, block: false, consumer_tag: consumer_tag, on_cancellation: on_cancellation) do |delivery_info, metadata, payload|
108
+
109
+ @consumer = @queue.subscribe(manual_ack: manual_ack, block: false, consumer_tag: consumer_tag, on_cancellation: on_cancellation) do |*rmq_message|
110
+ payload = rmq_message.pop
111
+ metadata = rmq_message.last
112
+ delivery_info = rmq_message.first
113
+
106
114
  message = process_message(payload, metadata, delivery_info)
107
115
  if use_runner?
108
116
  Legion::Runner.run(**message,
@@ -7,6 +7,8 @@ require_relative 'helpers/task'
7
7
  require_relative 'helpers/logger'
8
8
  require_relative 'helpers/lex'
9
9
  require_relative 'helpers/transport'
10
+ require_relative 'helpers/data'
11
+ require_relative 'helpers/cache'
10
12
 
11
13
  require_relative 'actors/base'
12
14
  require_relative 'actors/every'
@@ -37,11 +39,33 @@ module Legion
37
39
  @messages = {}
38
40
  build_settings
39
41
  build_transport
42
+ build_data
40
43
  build_helpers
41
44
  build_runners
42
45
  build_actors
43
46
  end
44
47
 
48
+ def data_required?
49
+ false
50
+ end
51
+
52
+ def transport_required?
53
+ true
54
+ end
55
+
56
+ def cache_required?
57
+ false
58
+ end
59
+
60
+ def crypt_required?
61
+ false
62
+ end
63
+
64
+ def build_data
65
+ auto_generate_data
66
+ extension_class::Data.build
67
+ end
68
+
45
69
  def build_transport
46
70
  if File.exist? "#{extension_path}/transport/autobuild.rb"
47
71
  require "#{extension_path}/transport/autobuild"
@@ -89,6 +113,14 @@ module Legion
89
113
 
90
114
  Kernel.const_get(lex_class.to_s).const_set('Transport', Module.new { extend Legion::Extensions::Transport })
91
115
  end
116
+
117
+ def auto_generate_data
118
+ require 'legion/extensions/data'
119
+ log.debug 'running meta magic to generate a data base class'
120
+ return if Kernel.const_defined? "#{lex_class}::Data"
121
+
122
+ Kernel.const_get(lex_class.to_s).const_set('Data', Module.new { extend Legion::Extensions::Data })
123
+ end
92
124
  end
93
125
  end
94
126
  end
@@ -1,9 +1,57 @@
1
+ require 'legion/extensions/data/migrator'
2
+ require 'legion/extensions/data/model'
3
+
1
4
  module Legion
2
5
  module Extensions
3
6
  module Data
7
+ include Legion::Extensions::Helpers::Data
8
+ include Legion::Extensions::Helpers::Logger
9
+
4
10
  def build
5
11
  @models = []
6
12
  @migrations = []
13
+ if Dir[File.expand_path("#{data_path}/migrations/*.rb")].count.positive?
14
+ log.debug('Has migrations, checking status')
15
+ run
16
+ end
17
+
18
+ models = Dir[File.expand_path("#{data_path}/models/*.rb")]
19
+ if models.count.positive?
20
+ log.debug('Including LEX models')
21
+ models.each do |file|
22
+ require file
23
+ end
24
+
25
+ models_class.constants.select do |model|
26
+ models_class.const_get(model).extend Legion::Extensions::Data::Model
27
+ end
28
+ end
29
+
30
+ true
31
+ end
32
+
33
+ def extension_model
34
+ Legion::Data::Model::Extension[namespace: lex_class.to_s]
35
+ end
36
+
37
+ def schema_version
38
+ extension_model.values[:schema_version]
39
+ end
40
+
41
+ def migrations_path
42
+ "#{data_path}/migrations/"
43
+ end
44
+
45
+ def migrate_class
46
+ @migrate_class ||= Legion::Extensions::Data::Migrator.new(migrations_path, lex_class.to_s)
47
+ end
48
+
49
+ def run
50
+ return true if migrate_class.is_current?
51
+
52
+ log.debug('Running LEX schema migrator')
53
+ results = migrate_class.run
54
+ extension_model.update(schema_version: results)
7
55
  end
8
56
  end
9
57
  end
@@ -0,0 +1,28 @@
1
+ require 'sequel/extensions/migration'
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Data
6
+ class Migrator < Sequel::IntegerMigrator
7
+ def initialize(path, extension, **)
8
+ @path = path
9
+ @extension = extension
10
+ super(Legion::Data::Connection.sequel, path)
11
+ end
12
+
13
+ def default_schema_column
14
+ :schema_version
15
+ end
16
+
17
+ def default_schema_table
18
+ :extensions
19
+ end
20
+
21
+ def schema_dataset
22
+ Legion::Data::Connection.sequel.from(default_schema_table).where(namespace: @extension)
23
+ end
24
+ alias ds schema_dataset
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,8 @@
1
+ module Legion
2
+ module Extensions
3
+ module Data
4
+ module Model
5
+ end
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,23 @@
1
+ require 'legion/extensions/helpers/base'
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Helpers
6
+ module Cache
7
+ include Legion::Extensions::Helpers::Base
8
+
9
+ def cache_namespace
10
+ @cache_namespace ||= lex_name
11
+ end
12
+
13
+ def cache_set(key, value, ttl: 60, **)
14
+ Legion::Cache.set(cache_namespace + key, value, ttl: ttl)
15
+ end
16
+
17
+ def cache_get(key)
18
+ Legion::Cache.get(cache_namespace + key)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ require 'legion/extensions/helpers/base'
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Helpers
6
+ module Data
7
+ include Legion::Extensions::Helpers::Base
8
+
9
+ def data_path
10
+ @data_path ||= "#{full_path}/data"
11
+ end
12
+
13
+ def data_class
14
+ @data_class ||= lex_class::Data
15
+ end
16
+
17
+ def models_class
18
+ @models_class ||= data_class::Model
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -6,13 +6,13 @@ module Legion
6
6
  include Legion::Extensions::Helpers::Logger
7
7
 
8
8
  def self.included(base)
9
- base.send :extend, Legion::Extensions::Helpers::Core if base.class == Class
10
- base.send :extend, Legion::Extensions::Helpers::Logger if base.class == Class
11
- base.extend base if base.class == Module
9
+ base.send :extend, Legion::Extensions::Helpers::Core if base.instance_of?(Class)
10
+ base.send :extend, Legion::Extensions::Helpers::Logger if base.instance_of?(Class)
11
+ base.extend base if base.instance_of?(Module)
12
12
  end
13
13
 
14
14
  def default_settings
15
- { logger: { level: 'info' } }
15
+ { logger: { level: 'info' }, workers: 1 }
16
16
  end
17
17
  end
18
18
  end
@@ -6,13 +6,33 @@ module Legion
6
6
  module Extensions
7
7
  module Helpers
8
8
  module Task
9
- def generate_task_log(task_id:, runner_class: to_s, function:, **payload)
9
+ def generate_task_log(task_id:, function:, runner_class: to_s, **payload)
10
+ begin
11
+ if Legion::Settings[:data][:connected]
12
+ runner_id = Legion::Data::Model::Runner[namespace: runner_class].values[:id]
13
+ function_id = Legion::Data::Model::Function.where(runner_id: runner_id, name: function).first.values[:id]
14
+ return true if Legion::Data::Model::TaskLog.insert(task_id: task_id, function_id: function_id, entry: Legion::JSON.dump(payload))
15
+ end
16
+ rescue StandardError => e
17
+ log.warn e.backtrace
18
+ log.warn("generate_task_log failed, reverting to rmq message, e: #{e.message}")
19
+ end
10
20
  Legion::Transport::Messages::TaskLog.new(task_id: task_id, runner_class: runner_class, function: function, entry: payload).publish
11
21
  end
12
22
 
13
23
  def task_update(task_id, status, **opts)
14
24
  return if task_id.nil? || status.nil?
15
25
 
26
+ begin
27
+ if Legion::Settings[:data][:connected]
28
+ task = Legion::Data::Model::Task[task_id]
29
+ task.update(status: status)
30
+ return true
31
+ end
32
+ rescue StandardError => e
33
+ log.warn("task_update failed, reverting to rmq message, e: #{e.message}")
34
+ end
35
+
16
36
  update_hash = { task_id: task_id, status: status }
17
37
  %i[results payload function_args payload results].each do |column|
18
38
  update_hash[column] = opts[column] if opts.key? column
@@ -36,6 +36,7 @@ module Legion
36
36
 
37
37
  transport_class::Exchanges.const_set(lex_const, Class.new(Legion::Transport::Exchange))
38
38
  @default_exchange = Kernel.const_get(exchange)
39
+ @default_exchange
39
40
  end
40
41
  end
41
42
  end
@@ -2,6 +2,7 @@ module Legion
2
2
  module Extensions
3
3
  module Transport
4
4
  include Legion::Extensions::Helpers::Transport
5
+ include Legion::Extensions::Helpers::Logger
5
6
 
6
7
  attr_accessor :exchanges, :queues, :consumers, :messages
7
8
 
@@ -88,12 +89,13 @@ module Legion
88
89
  def build_e_to_q(array)
89
90
  array.each do |binding|
90
91
  binding[:routing_key] = nil unless binding.key? :routing_key
91
- binding[:to] = nil unless binding.key? :to
92
+ binding[:to] = nil unless binding.key?(:to)
93
+ binding[:from] = default_exchange if !binding.key?(:from) || binding[:from].nil?
92
94
  bind_e_to_q(**binding)
93
95
  end
94
96
  end
95
97
 
96
- def bind_e_to_q(to:, from: default_exchange, routing_key: nil)
98
+ def bind_e_to_q(to:, from: default_exchange, routing_key: nil, **)
97
99
  if from.is_a? String
98
100
  from = "#{transport_class}::Exchanges::#{from.split('_').collect(&:capitalize).join}" unless from.include?('::')
99
101
  auto_create_exchange(from) unless Object.const_defined? from
@@ -129,9 +131,9 @@ module Legion
129
131
  to = to.is_a?(String) ? Kernel.const_get(to).new : to.new
130
132
  to.bind(from, routing_key: routing_key)
131
133
  rescue StandardError => e
132
- Legion::Logging.fatal e.message
133
- Legion::Logging.fatal e.backtrace
134
- Legion::Logging.fatal({ from: from, to: to, routing_key: routing_key })
134
+ log.fatal e.message
135
+ log.fatal e.backtrace
136
+ log.fatal({ from: from, to: to, routing_key: routing_key })
135
137
  end
136
138
 
137
139
  def e_to_q
@@ -49,9 +49,7 @@ module Legion
49
49
 
50
50
  until quit
51
51
  sleep(1)
52
- if @options.key? :time_limit
53
- @quit = true if Time.now - start_time > @options[:time_limit]
54
- end
52
+ @quit = true if @options.key?(:time_limit) && Time.now - start_time > @options[:time_limit]
55
53
  end
56
54
  Legion::Logging.info('Legion is shutting down!')
57
55
  Legion.shutdown
@@ -62,8 +62,9 @@ module Legion
62
62
  Legion::Logging.info('Legion::Service.shutdown was called')
63
63
  @shutdown = true
64
64
  Legion::Settings[:client][:shutting_down] = true
65
- sleep(1)
65
+ sleep(0.5)
66
66
  Legion::Extensions.shutdown
67
+ sleep(1)
67
68
  Legion::Data.shutdown
68
69
  Legion::Cache.shutdown
69
70
  Legion::Transport::Connection.shutdown
@@ -1,3 +1,3 @@
1
1
  module Legion
2
- VERSION = '0.3.0'.freeze
2
+ VERSION = '0.3.1'.freeze
3
3
  end
@@ -8,10 +8,12 @@
8
8
  },
9
9
  "data": {
10
10
  "connection": {
11
- "max_connections": 25
11
+ "max_connections": 100,
12
+ "preconnect": false
12
13
  }
13
14
  },
14
15
  "crypt": {
16
+ "cluster_secret": "fkljwelkfjwelkfjwelkjfwe",
15
17
  "vault": {
16
18
  "read_cluster_secret": false,
17
19
  "connected": false,
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: legionio
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Esity
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-08-26 00:00:00.000000000 Z
11
+ date: 2020-10-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby-ext
@@ -365,8 +365,12 @@ files:
365
365
  - lib/legion/extensions/builders/runners.rb
366
366
  - lib/legion/extensions/core.rb
367
367
  - lib/legion/extensions/data.rb
368
+ - lib/legion/extensions/data/migrator.rb
369
+ - lib/legion/extensions/data/model.rb
368
370
  - lib/legion/extensions/helpers/base.rb
371
+ - lib/legion/extensions/helpers/cache.rb
369
372
  - lib/legion/extensions/helpers/core.rb
373
+ - lib/legion/extensions/helpers/data.rb
370
374
  - lib/legion/extensions/helpers/lex.rb
371
375
  - lib/legion/extensions/helpers/logger.rb
372
376
  - lib/legion/extensions/helpers/task.rb