lex-kubernetes 0.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: d291c27e14825e0deb973cfbe620bc9868c00e7734cb0d108f2df25ae9724174
4
+ data.tar.gz: 59a86d3db6dd62219dde08cf5b42e57ebc3bfd57d5721ba649278759b69526d9
5
+ SHA512:
6
+ metadata.gz: cab2abf7fc6e07ae3e09aab13c5a02cf6c10ae2147f78209ddda12641ffdaec2e2e102070c6ca664710acb2abdb586e0d30f0fe10f3b02c8efe0bf87b8e1e12d
7
+ data.tar.gz: bb4719d53f84dade37c5ace54afb256fb54e88d8a3870afce33ba63bf6b100cf014ccbb1521848a2930acfc66a60f18025980b0e18b9044eefd651bd420f21bc
@@ -0,0 +1,16 @@
1
+ name: CI
2
+ on:
3
+ push:
4
+ branches: [main]
5
+ pull_request:
6
+
7
+ jobs:
8
+ ci:
9
+ uses: LegionIO/.github/.github/workflows/ci.yml@main
10
+
11
+ release:
12
+ needs: ci
13
+ if: github.event_name == 'push' && github.ref == 'refs/heads/main'
14
+ uses: LegionIO/.github/.github/workflows/release.yml@main
15
+ secrets:
16
+ rubygems-api-key: ${{ secrets.RUBYGEMS_API_KEY }}
data/.gitignore ADDED
@@ -0,0 +1,12 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
12
+ Gemfile.lock
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,53 @@
1
+ AllCops:
2
+ TargetRubyVersion: 3.4
3
+ NewCops: enable
4
+ SuggestExtensions: false
5
+
6
+ Layout/LineLength:
7
+ Max: 160
8
+
9
+ Layout/SpaceAroundEqualsInParameterDefault:
10
+ EnforcedStyle: space
11
+
12
+ Layout/HashAlignment:
13
+ EnforcedHashRocketStyle: table
14
+ EnforcedColonStyle: table
15
+
16
+ Metrics/MethodLength:
17
+ Max: 50
18
+
19
+ Metrics/ClassLength:
20
+ Max: 1500
21
+
22
+ Metrics/ModuleLength:
23
+ Max: 1500
24
+
25
+ Metrics/BlockLength:
26
+ Max: 40
27
+ Exclude:
28
+ - 'spec/**/*'
29
+
30
+ Metrics/ParameterLists:
31
+ Max: 10
32
+
33
+ Metrics/AbcSize:
34
+ Max: 60
35
+
36
+ Metrics/CyclomaticComplexity:
37
+ Max: 15
38
+
39
+ Metrics/PerceivedComplexity:
40
+ Max: 17
41
+
42
+ Style/Documentation:
43
+ Enabled: false
44
+
45
+ Style/SymbolArray:
46
+ Enabled: true
47
+
48
+ Style/FrozenStringLiteralComment:
49
+ Enabled: true
50
+ EnforcedStyle: always
51
+
52
+ Naming/FileName:
53
+ Enabled: false
data/CHANGELOG.md ADDED
@@ -0,0 +1,12 @@
1
+ # Changelog
2
+
3
+ ## [0.1.0] - 2026-03-22
4
+
5
+ ### Added
6
+ - Initial release
7
+ - `Helpers::Client` — Kubeclient::Client connection builder with server/token/namespace/ssl configuration
8
+ - `Runners::Pods` — list_pods, get_pod, delete_pod, pod_logs
9
+ - `Runners::Deployments` — list_deployments, get_deployment, scale_deployment, restart_deployment
10
+ - `Runners::Services` — list_services, get_service
11
+ - `Runners::Namespaces` — list_namespaces, get_namespace
12
+ - Standalone `Client` class for use outside the Legion framework
data/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gemspec
6
+
7
+ gem 'base64'
8
+ gem 'kubeclient', '~> 4.0'
9
+ gem 'rake', '~> 12.0'
10
+ gem 'rspec', '~> 3.0'
11
+ gem 'rspec_junit_formatter'
12
+ gem 'rubocop'
13
+ gem 'rubocop-rspec'
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/legion/extensions/kubernetes/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'lex-kubernetes'
7
+ spec.version = Legion::Extensions::Kubernetes::VERSION
8
+ spec.authors = ['Esity']
9
+ spec.email = ['matthewdiverson@gmail.com']
10
+
11
+ spec.summary = 'LEX::Kubernetes'
12
+ spec.description = 'Used to connect Legion to Kubernetes'
13
+ spec.homepage = 'https://github.com/LegionIO/lex-kubernetes'
14
+ spec.license = 'MIT'
15
+ spec.required_ruby_version = '>= 3.4'
16
+
17
+ spec.metadata['homepage_uri'] = spec.homepage
18
+ spec.metadata['source_code_uri'] = 'https://github.com/LegionIO/lex-kubernetes'
19
+ spec.metadata['changelog_uri'] = 'https://github.com/LegionIO/lex-kubernetes/blob/main/CHANGELOG.md'
20
+ spec.metadata['rubygems_mfa_required'] = 'true'
21
+
22
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
23
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
24
+ end
25
+ spec.bindir = 'exe'
26
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
27
+ spec.require_paths = ['lib']
28
+
29
+ spec.add_dependency 'base64'
30
+ spec.add_dependency 'kubeclient', '~> 4.0'
31
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'helpers/client'
4
+ require_relative 'runners/pods'
5
+ require_relative 'runners/deployments'
6
+ require_relative 'runners/services'
7
+ require_relative 'runners/namespaces'
8
+
9
+ module Legion
10
+ module Extensions
11
+ module Kubernetes
12
+ class Client
13
+ include Helpers::Client
14
+ include Runners::Pods
15
+ include Runners::Deployments
16
+ include Runners::Services
17
+ include Runners::Namespaces
18
+
19
+ attr_reader :opts
20
+
21
+ def initialize(server: 'https://localhost:6443', token: nil, namespace: 'default', **extra)
22
+ @opts = { server: server, token: token, namespace: namespace, **extra }
23
+ end
24
+
25
+ def settings
26
+ { options: @opts }
27
+ end
28
+
29
+ def connection(**override)
30
+ Helpers::Client.connection(**@opts, **override)
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'kubeclient'
4
+ require 'openssl'
5
+
6
+ module Legion
7
+ module Extensions
8
+ module Kubernetes
9
+ module Helpers
10
+ module Client
11
+ module_function
12
+
13
+ def connection(**opts)
14
+ server = opts[:server] || settings_value(:server, 'https://localhost:6443')
15
+ token = opts[:token] || settings_value(:token, nil)
16
+ namespace = opts[:namespace] || settings_value(:namespace, 'default')
17
+ verify = opts.fetch(:verify_ssl, OpenSSL::SSL::VERIFY_PEER)
18
+
19
+ ssl_options = { verify_ssl: verify }
20
+ auth_options = token ? { bearer_token: token } : {}
21
+
22
+ client = Kubeclient::Client.new(server, 'v1', ssl_options: ssl_options, auth_options: auth_options)
23
+ client.instance_variable_set(:@namespace, namespace)
24
+ client
25
+ end
26
+
27
+ def settings_value(key, default)
28
+ return default unless defined?(Legion::Settings)
29
+
30
+ settings = Legion::Settings[:'lex-kubernetes']
31
+ settings.is_a?(Hash) ? settings.fetch(key, default) : default
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Kubernetes
6
+ module Runners
7
+ module Deployments
8
+ def list_deployments(namespace: 'default', **)
9
+ resp = extensions_connection(**).get_deployments(namespace: namespace)
10
+ { deployments: resp.items }
11
+ end
12
+
13
+ def get_deployment(name:, namespace: 'default', **)
14
+ resp = extensions_connection(**).get_deployment(name, namespace)
15
+ { deployment: resp }
16
+ end
17
+
18
+ def scale_deployment(name:, replicas:, namespace: 'default', **)
19
+ conn = extensions_connection(**)
20
+ scale = conn.get_scale('Deployment', name, namespace)
21
+ scale.spec.replicas = replicas
22
+ conn.update_scale(scale)
23
+ { scaled: true, name: name, namespace: namespace, replicas: replicas }
24
+ end
25
+
26
+ def restart_deployment(name:, namespace: 'default', **)
27
+ conn = extensions_connection(**)
28
+ deployment = conn.get_deployment(name, namespace)
29
+ deployment.spec.template.metadata ||= Kubeclient::Resource.new
30
+ deployment.spec.template.metadata.annotations ||= {}
31
+ deployment.spec.template.metadata.annotations['kubectl.kubernetes.io/restartedAt'] = Time.now.utc.iso8601
32
+ conn.update_deployment(deployment)
33
+ { restarted: true, name: name, namespace: namespace }
34
+ end
35
+
36
+ def extensions_connection(**opts)
37
+ server = opts[:server] || helpers_settings_value(:server, 'https://localhost:6443')
38
+ token = opts[:token] || helpers_settings_value(:token, nil)
39
+ verify = opts.fetch(:verify_ssl, OpenSSL::SSL::VERIFY_PEER)
40
+
41
+ ssl_options = { verify_ssl: verify }
42
+ auth_options = token ? { bearer_token: token } : {}
43
+
44
+ Kubeclient::Client.new("#{server}/apis/apps", 'v1', ssl_options: ssl_options, auth_options: auth_options)
45
+ end
46
+
47
+ def helpers_settings_value(key, default)
48
+ return default unless defined?(Legion::Settings)
49
+
50
+ settings = Legion::Settings[:'lex-kubernetes']
51
+ settings.is_a?(Hash) ? settings.fetch(key, default) : default
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Kubernetes
6
+ module Runners
7
+ module Namespaces
8
+ def list_namespaces(**)
9
+ resp = connection(**).get_namespaces
10
+ { namespaces: resp.items }
11
+ end
12
+
13
+ def get_namespace(name:, **)
14
+ resp = connection(**).get_namespace(name)
15
+ { namespace: resp }
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Kubernetes
6
+ module Runners
7
+ module Pods
8
+ def list_pods(namespace: 'default', **)
9
+ resp = connection(**).get_pods(namespace: namespace)
10
+ { pods: resp.items }
11
+ end
12
+
13
+ def get_pod(name:, namespace: 'default', **)
14
+ resp = connection(**).get_pod(name, namespace)
15
+ { pod: resp }
16
+ end
17
+
18
+ def delete_pod(name:, namespace: 'default', **)
19
+ connection(**).delete_pod(name, namespace)
20
+ { deleted: true, name: name, namespace: namespace }
21
+ end
22
+
23
+ def pod_logs(name:, namespace: 'default', container: nil, **)
24
+ query = container ? { container: container } : {}
25
+ resp = connection(**).get_pod_log(name, namespace, **query)
26
+ { logs: resp }
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Kubernetes
6
+ module Runners
7
+ module Services
8
+ def list_services(namespace: 'default', **)
9
+ resp = connection(**).get_services(namespace: namespace)
10
+ { services: resp.items }
11
+ end
12
+
13
+ def get_service(name:, namespace: 'default', **)
14
+ resp = connection(**).get_service(name, namespace)
15
+ { service: resp }
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Kubernetes
6
+ VERSION = '0.1.1'
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/kubernetes/version'
4
+ require 'legion/extensions/kubernetes/helpers/client'
5
+ require 'legion/extensions/kubernetes/runners/pods'
6
+ require 'legion/extensions/kubernetes/runners/deployments'
7
+ require 'legion/extensions/kubernetes/runners/services'
8
+ require 'legion/extensions/kubernetes/runners/namespaces'
9
+ require 'legion/extensions/kubernetes/client'
10
+
11
+ module Legion
12
+ module Extensions
13
+ module Kubernetes
14
+ extend Legion::Extensions::Core if Legion::Extensions.const_defined? :Core
15
+ end
16
+ end
17
+ end
metadata ADDED
@@ -0,0 +1,87 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lex-kubernetes
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Esity
8
+ bindir: exe
9
+ cert_chain: []
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'
26
+ - !ruby/object:Gem::Dependency
27
+ name: kubeclient
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '4.0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '4.0'
40
+ description: Used to connect Legion to Kubernetes
41
+ email:
42
+ - matthewdiverson@gmail.com
43
+ executables: []
44
+ extensions: []
45
+ extra_rdoc_files: []
46
+ files:
47
+ - ".github/workflows/ci.yml"
48
+ - ".gitignore"
49
+ - ".rspec"
50
+ - ".rubocop.yml"
51
+ - CHANGELOG.md
52
+ - Gemfile
53
+ - lex-kubernetes.gemspec
54
+ - lib/legion/extensions/kubernetes.rb
55
+ - lib/legion/extensions/kubernetes/client.rb
56
+ - lib/legion/extensions/kubernetes/helpers/client.rb
57
+ - lib/legion/extensions/kubernetes/runners/deployments.rb
58
+ - lib/legion/extensions/kubernetes/runners/namespaces.rb
59
+ - lib/legion/extensions/kubernetes/runners/pods.rb
60
+ - lib/legion/extensions/kubernetes/runners/services.rb
61
+ - lib/legion/extensions/kubernetes/version.rb
62
+ homepage: https://github.com/LegionIO/lex-kubernetes
63
+ licenses:
64
+ - MIT
65
+ metadata:
66
+ homepage_uri: https://github.com/LegionIO/lex-kubernetes
67
+ source_code_uri: https://github.com/LegionIO/lex-kubernetes
68
+ changelog_uri: https://github.com/LegionIO/lex-kubernetes/blob/main/CHANGELOG.md
69
+ rubygems_mfa_required: 'true'
70
+ rdoc_options: []
71
+ require_paths:
72
+ - lib
73
+ required_ruby_version: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: '3.4'
78
+ required_rubygems_version: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ requirements: []
84
+ rubygems_version: 3.6.9
85
+ specification_version: 4
86
+ summary: LEX::Kubernetes
87
+ test_files: []