lex-node 0.2.0 → 0.3.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 (43) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +16 -0
  3. data/.gitignore +2 -0
  4. data/.rubocop.yml +40 -10
  5. data/CHANGELOG.md +43 -0
  6. data/CLAUDE.md +109 -0
  7. data/Dockerfile +1 -1
  8. data/Gemfile +2 -0
  9. data/README.md +65 -5
  10. data/docker_deploy.rb +1 -0
  11. data/lex-node.gemspec +6 -1
  12. data/lib/legion/extensions/node/actors/beat.rb +27 -19
  13. data/lib/legion/extensions/node/actors/crypt.rb +12 -4
  14. data/lib/legion/extensions/node/actors/push_key.rb +27 -19
  15. data/lib/legion/extensions/node/actors/vault.rb +27 -19
  16. data/lib/legion/extensions/node/actors/vault_token_request.rb +27 -19
  17. data/lib/legion/extensions/node/data_test/migrations/001_nodes_table.rb +2 -0
  18. data/lib/legion/extensions/node/data_test/migrations/002_node_history_table.rb +2 -1
  19. data/lib/legion/extensions/node/data_test/migrations/003_legion_version_colume.rb +2 -0
  20. data/lib/legion/extensions/node/data_test/migrations/004_node_extensions.rb +2 -1
  21. data/lib/legion/extensions/node/runners/beat.rb +17 -9
  22. data/lib/legion/extensions/node/runners/node.rb +132 -52
  23. data/lib/legion/extensions/node/runners/vault.rb +52 -36
  24. data/lib/legion/extensions/node/transport/exchanges/node.rb +12 -6
  25. data/lib/legion/extensions/node/transport/messages/beat.rb +82 -22
  26. data/lib/legion/extensions/node/transport/messages/public_key.rb +24 -14
  27. data/lib/legion/extensions/node/transport/messages/push_cluster_secret.rb +34 -24
  28. data/lib/legion/extensions/node/transport/messages/push_vault_token.rb +34 -24
  29. data/lib/legion/extensions/node/transport/messages/request_cluster_secret.rb +26 -16
  30. data/lib/legion/extensions/node/transport/messages/request_public_keys.rb +23 -13
  31. data/lib/legion/extensions/node/transport/messages/request_vault_token.rb +33 -21
  32. data/lib/legion/extensions/node/transport/messages/update_result.rb +36 -0
  33. data/lib/legion/extensions/node/transport/queues/crypt.rb +14 -4
  34. data/lib/legion/extensions/node/transport/queues/health.rb +14 -4
  35. data/lib/legion/extensions/node/transport/queues/node.rb +17 -8
  36. data/lib/legion/extensions/node/transport/queues/vault.rb +14 -4
  37. data/lib/legion/extensions/node/transport.rb +17 -8
  38. data/lib/legion/extensions/node/version.rb +3 -1
  39. data/lib/legion/extensions/node.rb +2 -0
  40. metadata +24 -11
  41. data/.github/workflows/rspec.yml +0 -69
  42. data/.github/workflows/rubocop.yml +0 -28
  43. data/lib/legion/extensions/node/runners/crypt.rb +0 -61
@@ -1,23 +1,33 @@
1
- module Legion::Extensions::Node::Transport::Messages
2
- class RequestClusterSecret < Legion::Transport::Message
3
- def routing_key
4
- 'node.crypt.push_cluster_secret'
5
- end
1
+ # frozen_string_literal: true
6
2
 
7
- def message
8
- { function: 'push_cluster_secret', node_name: Legion::Settings[:client][:name] }
9
- end
3
+ module Legion
4
+ module Extensions
5
+ module Node
6
+ module Transport
7
+ module Messages
8
+ class RequestClusterSecret < Legion::Transport::Message
9
+ def routing_key
10
+ 'node.crypt.push_cluster_secret'
11
+ end
10
12
 
11
- def type
12
- 'task'
13
- end
13
+ def message
14
+ { function: 'push_cluster_secret', node_name: Legion::Settings[:client][:name] }
15
+ end
14
16
 
15
- def encrypt?
16
- false
17
- end
17
+ def type
18
+ 'task'
19
+ end
20
+
21
+ def encrypt?
22
+ false
23
+ end
18
24
 
19
- def validate
20
- @valid = true
25
+ def validate
26
+ @valid = true
27
+ end
28
+ end
29
+ end
30
+ end
21
31
  end
22
32
  end
23
33
  end
@@ -1,19 +1,29 @@
1
- module Legion::Extensions::Node::Transport::Messages
2
- class RequestPublicKeys < Legion::Transport::Message
3
- def routing_key
4
- 'node'
5
- end
1
+ # frozen_string_literal: true
6
2
 
7
- def type
8
- 'task'
9
- end
3
+ module Legion
4
+ module Extensions
5
+ module Node
6
+ module Transport
7
+ module Messages
8
+ class RequestPublicKeys < Legion::Transport::Message
9
+ def routing_key
10
+ 'node'
11
+ end
10
12
 
11
- def encrypt?
12
- false
13
- end
13
+ def type
14
+ 'task'
15
+ end
16
+
17
+ def encrypt?
18
+ false
19
+ end
14
20
 
15
- def validate
16
- @valid = true
21
+ def validate
22
+ @valid = true
23
+ end
24
+ end
25
+ end
26
+ end
17
27
  end
18
28
  end
19
29
  end
@@ -1,28 +1,40 @@
1
- module Legion::Extensions::Node::Transport::Messages
2
- class RequestVaultToken < Legion::Transport::Message
3
- def routing_key
4
- 'vault'
5
- end
1
+ # frozen_string_literal: true
6
2
 
7
- def message
8
- {
9
- function: 'push_vault_token',
10
- node_name: Legion::Settings[:client][:name],
11
- runner_class: 'Legion::Extensions::Node::Runners::Vault',
12
- public_key: Legion::Crypt.public_key
13
- }
14
- end
3
+ require 'base64'
15
4
 
16
- def type
17
- 'task'
18
- end
5
+ module Legion
6
+ module Extensions
7
+ module Node
8
+ module Transport
9
+ module Messages
10
+ class RequestVaultToken < Legion::Transport::Message
11
+ def routing_key
12
+ 'vault'
13
+ end
19
14
 
20
- def encrypt?
21
- false
22
- end
15
+ def message
16
+ {
17
+ function: 'push_vault_token',
18
+ node_name: Legion::Settings[:client][:name],
19
+ runner_class: 'Legion::Extensions::Node::Runners::Vault',
20
+ public_key: Base64.encode64(Legion::Crypt.public_key.to_s)
21
+ }
22
+ end
23
+
24
+ def type
25
+ 'task'
26
+ end
27
+
28
+ def encrypt?
29
+ false
30
+ end
23
31
 
24
- def validate
25
- @valid = true
32
+ def validate
33
+ @valid = true
34
+ end
35
+ end
36
+ end
37
+ end
26
38
  end
27
39
  end
28
40
  end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Node
6
+ module Transport
7
+ module Messages
8
+ class UpdateResult < Legion::Transport::Message
9
+ def routing_key
10
+ "node.#{Legion::Settings[:client][:name]}.update_result"
11
+ end
12
+
13
+ def exchange
14
+ Legion::Transport::Exchanges::Node
15
+ end
16
+
17
+ def type
18
+ 'task'
19
+ end
20
+
21
+ def encrypt?
22
+ false
23
+ end
24
+
25
+ def validate
26
+ raise 'action is required' unless @options[:action].is_a?(String)
27
+ raise 'status is required' unless @options[:status].is_a?(String)
28
+
29
+ @valid = true
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -1,7 +1,17 @@
1
- module Legion::Extensions::Node::Transport::Queues
2
- class Crypt < Legion::Transport::Queue
3
- def queue_options
4
- { auto_delete: false }
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Node
6
+ module Transport
7
+ module Queues
8
+ class Crypt < Legion::Transport::Queue
9
+ def queue_options
10
+ { auto_delete: false }
11
+ end
12
+ end
13
+ end
14
+ end
5
15
  end
6
16
  end
7
17
  end
@@ -1,7 +1,17 @@
1
- module Legion::Extensions::Node::Transport::Queues
2
- class Health < Legion::Transport::Queue
3
- def queue_options
4
- { arguments: { 'x-single-active-consumer': true }, auto_delete: false }
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Node
6
+ module Transport
7
+ module Queues
8
+ class Health < Legion::Transport::Queue
9
+ def queue_options
10
+ { arguments: { 'x-single-active-consumer': true }, auto_delete: false }
11
+ end
12
+ end
13
+ end
14
+ end
5
15
  end
6
16
  end
7
17
  end
@@ -1,13 +1,22 @@
1
- require 'socket'
1
+ # frozen_string_literal: true
2
2
 
3
- module Legion::Extensions::Node::Transport::Queues
4
- class Node < Legion::Transport::Queue
5
- def queue_name
6
- "node.#{Legion::Settings[:client][:name]}"
7
- end
3
+ module Legion
4
+ module Extensions
5
+ module Node
6
+ module Transport
7
+ module Queues
8
+ class Node < Legion::Transport::Queue
9
+ def queue_name
10
+ "node.#{Legion::Settings[:client][:name]}"
11
+ end
8
12
 
9
- def queue_options
10
- { durable: false, exclusive: true, auto_delete: true }
13
+ def queue_options
14
+ { durable: false, exclusive: true, auto_delete: true,
15
+ arguments: { 'x-queue-type': 'classic' } }
16
+ end
17
+ end
18
+ end
19
+ end
11
20
  end
12
21
  end
13
22
  end
@@ -1,7 +1,17 @@
1
- module Legion::Extensions::Node::Transport::Queues
2
- class Vault < Legion::Transport::Queue
3
- def queue_options
4
- { auto_delete: false }
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Node
6
+ module Transport
7
+ module Queues
8
+ class Vault < Legion::Transport::Queue
9
+ def queue_options
10
+ { auto_delete: false }
11
+ end
12
+ end
13
+ end
14
+ end
5
15
  end
6
16
  end
7
17
  end
@@ -1,12 +1,21 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'legion/extensions/transport'
2
4
 
3
- module Legion::Extensions::Node::Transport
4
- extend Legion::Extensions::Transport
5
- def self.additional_e_to_q
6
- array = [{ from: 'node', to: 'node', routing_key: "node.#{Legion::Settings[:client][:name]}" }]
7
- array.push(from: 'node', to: 'node', routing_key: 'node.data.#') if Legion::Settings[:data][:connected]
8
- array.push(from: 'node', to: 'node', routing_key: 'node.cache.#') if Legion::Settings[:cache][:connected]
9
- array.push(from: 'node', to: 'node', routing_key: 'node.crypt.#')
10
- array
5
+ module Legion
6
+ module Extensions
7
+ module Node
8
+ module Transport
9
+ extend Legion::Extensions::Transport
10
+
11
+ def self.additional_e_to_q
12
+ array = [{ from: 'node', to: 'node', routing_key: "node.#{Legion::Settings[:client][:name]}" }]
13
+ array.push(from: 'node', to: 'node', routing_key: 'node.data.#') if Legion::Settings[:data]&.[](:connected) || false
14
+ array.push(from: 'node', to: 'node', routing_key: 'node.cache.#') if Legion::Settings[:cache]&.[](:connected) || false
15
+ array.push(from: 'node', to: 'node', routing_key: 'node.crypt.#')
16
+ array
17
+ end
18
+ end
19
+ end
11
20
  end
12
21
  end
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Legion
2
4
  module Extensions
3
5
  module Node
4
- VERSION = '0.2.0'.freeze
6
+ VERSION = '0.3.0'
5
7
  end
6
8
  end
7
9
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'legion/extensions/node/version'
2
4
 
3
5
  module Legion
metadata CHANGED
@@ -1,15 +1,28 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lex-node
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Esity
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2021-06-11 00:00:00.000000000 Z
12
- dependencies: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: base64
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '0'
13
26
  description: This lex is responsible for sending heartbeats, allowing for dynamic
14
27
  config, cluster secret, etc
15
28
  email:
@@ -18,11 +31,12 @@ executables: []
18
31
  extensions: []
19
32
  extra_rdoc_files: []
20
33
  files:
21
- - ".github/workflows/rspec.yml"
22
- - ".github/workflows/rubocop.yml"
34
+ - ".github/workflows/ci.yml"
23
35
  - ".gitignore"
24
36
  - ".rspec"
25
37
  - ".rubocop.yml"
38
+ - CHANGELOG.md
39
+ - CLAUDE.md
26
40
  - Dockerfile
27
41
  - Gemfile
28
42
  - LICENSE
@@ -40,7 +54,6 @@ files:
40
54
  - lib/legion/extensions/node/data_test/migrations/003_legion_version_colume.rb
41
55
  - lib/legion/extensions/node/data_test/migrations/004_node_extensions.rb
42
56
  - lib/legion/extensions/node/runners/beat.rb
43
- - lib/legion/extensions/node/runners/crypt.rb
44
57
  - lib/legion/extensions/node/runners/node.rb
45
58
  - lib/legion/extensions/node/runners/vault.rb
46
59
  - lib/legion/extensions/node/transport.rb
@@ -52,6 +65,7 @@ files:
52
65
  - lib/legion/extensions/node/transport/messages/request_cluster_secret.rb
53
66
  - lib/legion/extensions/node/transport/messages/request_public_keys.rb
54
67
  - lib/legion/extensions/node/transport/messages/request_vault_token.rb
68
+ - lib/legion/extensions/node/transport/messages/update_result.rb
55
69
  - lib/legion/extensions/node/transport/queues/crypt.rb
56
70
  - lib/legion/extensions/node/transport/queues/health.rb
57
71
  - lib/legion/extensions/node/transport/queues/node.rb
@@ -67,7 +81,7 @@ metadata:
67
81
  documentation_uri: https://github.com/LegionIO/lex-node
68
82
  changelog_uri: https://github.com/LegionIO/lex-node
69
83
  bug_tracker_uri: https://github.com/LegionIO/lex-node/issues
70
- post_install_message:
84
+ rubygems_mfa_required: 'true'
71
85
  rdoc_options: []
72
86
  require_paths:
73
87
  - lib
@@ -75,15 +89,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
75
89
  requirements:
76
90
  - - ">="
77
91
  - !ruby/object:Gem::Version
78
- version: 2.5.0
92
+ version: '3.4'
79
93
  required_rubygems_version: !ruby/object:Gem::Requirement
80
94
  requirements:
81
95
  - - ">="
82
96
  - !ruby/object:Gem::Version
83
97
  version: '0'
84
98
  requirements: []
85
- rubygems_version: 3.1.6
86
- signing_key:
99
+ rubygems_version: 3.6.9
87
100
  specification_version: 4
88
101
  summary: Does Legion Node things
89
102
  test_files: []
@@ -1,69 +0,0 @@
1
- name: RSpec
2
- on: [push, pull_request]
3
-
4
- jobs:
5
- rspec:
6
- strategy:
7
- fail-fast: false
8
- matrix:
9
- os: [ubuntu-latest]
10
- ruby: [2.7]
11
- runs-on: ${{ matrix.os }}
12
- steps:
13
- - uses: actions/checkout@v2
14
- - uses: ruby/setup-ruby@v1
15
- with:
16
- ruby-version: ${{ matrix.ruby }}
17
- bundler-cache: true
18
- - name: RSpec run
19
- run: |
20
- bash -c "
21
- bundle exec rspec
22
- [[ $? -ne 2 ]]
23
- "
24
- rspec-mri:
25
- needs: rspec
26
- strategy:
27
- fail-fast: false
28
- matrix:
29
- os: [ ubuntu-latest ]
30
- ruby: [2.5, 2.6, '3.0', head]
31
- runs-on: ${{ matrix.os }}
32
- steps:
33
- - uses: actions/checkout@v2
34
- - uses: ruby/setup-ruby@v1
35
- with:
36
- ruby-version: ${{ matrix.ruby }}
37
- bundler-cache: true
38
- - run: bundle exec rspec
39
- rspec-jruby:
40
- needs: rspec
41
- strategy:
42
- fail-fast: false
43
- matrix:
44
- os: [ ubuntu-latest ]
45
- ruby: [ jruby, jruby-head]
46
- runs-on: ${{ matrix.os }}
47
- steps:
48
- - uses: actions/checkout@v2
49
- - uses: ruby/setup-ruby@v1
50
- with:
51
- ruby-version: ${{ matrix.ruby }}
52
- bundler-cache: true
53
- - run: JRUBY_OPTS="--debug" bundle exec rspec
54
- rspec-truffleruby:
55
- needs: rspec
56
- strategy:
57
- fail-fast: false
58
- matrix:
59
- os: [ ubuntu-latest ]
60
- ruby: [truffleruby]
61
- runs-on: ${{ matrix.os }}
62
- steps:
63
- - uses: actions/checkout@v2
64
- - uses: ruby/setup-ruby@v1
65
- with:
66
- ruby-version: ${{ matrix.ruby }}
67
- bundler-cache: true
68
- - run: bundle exec rspec
69
-
@@ -1,28 +0,0 @@
1
- name: Rubocop
2
- on: [push, pull_request]
3
- jobs:
4
- rubocop:
5
- strategy:
6
- fail-fast: false
7
- matrix:
8
- os: [ubuntu-latest]
9
- ruby: [2.7]
10
- runs-on: ${{ matrix.os }}
11
- steps:
12
- - uses: actions/checkout@v2
13
- - uses: ruby/setup-ruby@v1
14
- with:
15
- ruby-version: ${{ matrix.ruby }}
16
- bundler-cache: true
17
- - name: Install Rubocop
18
- run: gem install rubocop code-scanning-rubocop
19
- - name: Rubocop run --no-doc
20
- run: |
21
- bash -c "
22
- rubocop --require code_scanning --format CodeScanning::SarifFormatter -o rubocop.sarif
23
- [[ $? -ne 2 ]]
24
- "
25
- - name: Upload Sarif output
26
- uses: github/codeql-action/upload-sarif@v1
27
- with:
28
- sarif_file: rubocop.sarif
@@ -1,61 +0,0 @@
1
- module Legion::Extensions::Node::Runners
2
- module Crypt
3
- def push_public_key(**_opts)
4
- log.debug 'push_public_key'
5
- message_hash = { function: 'update_public_key',
6
- public_key: Base64.encode64(Legion::Crypt.public_key),
7
- **Legion::Settings[:client] }
8
- Legion::Extensions::Node::Transport::Messages::PublicKey.new(message_hash).publish
9
- {}
10
- end
11
-
12
- def self.update_public_key(name:, public_key:, **_opts)
13
- log.debug 'update_public_key'
14
- Legion::Settings[:cluster][:public_keys][name] = public_key
15
- {}
16
- end
17
-
18
- def delete_public_key(name:, **_opts)
19
- log.debug 'delete_public_key'
20
- Legion::Settings[:cluster][:public_keys].delete(name)
21
- {}
22
- end
23
-
24
- def request_public_keys(**_opts)
25
- log.debug 'request_public_keys'
26
- message_hash = { function: 'push_public_key' }
27
- Legion::Extensions::Node::Transport::Messages::RequestPublicKeys.new(**message_hash).publish
28
- {}
29
- end
30
-
31
- def request_cluster_secret(**_opts)
32
- log.debug 'request_cluster_secret'
33
- Legion::Transport::Messages::RequestClusterSecret.new.publish
34
- {}
35
- end
36
-
37
- def push_cluster_secret(public_key:, queue_name:, **_opts)
38
- log.debug 'push_cluster_secret'
39
- return {} unless Legion::Settings[:crypt][:cs_encrypt_ready]
40
-
41
- encrypted = Legion::Crypt.encrypt_from_keypair(pub_key: public_key,
42
- message: Legion::Settings[:crypt][:cluster_secret].to_s)
43
- legion = Legion::Crypt.encrypt('legion')
44
- Legion::Extensions::Node::Transport::Messages::PushClusterSecret.new(message: encrypted,
45
- queue_name: queue_name,
46
- validation_string: 'legion',
47
- encrypted_string: legion).publish
48
- {}
49
- end
50
-
51
- def receive_cluster_secret(message:, **opts)
52
- log.debug 'receive_cluster_secret'
53
- Legion::Settings[:crypt][:cluster_secret] = Legion::Crypt.decrypt_from_keypair(message)
54
- Legion::Settings[:crypt][:encrypted_string] = opts[:encrypted_string]
55
- Legion::Settings[:crypt][:validation_string] = opts[:validation_string]
56
- {}
57
- end
58
-
59
- include Legion::Extensions::Helpers::Lex
60
- end
61
- end