legionio 0.3.0 → 0.3.1

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