kube_cluster 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 (59) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/release.yml +43 -0
  3. data/.github/workflows/tag-gem-version-bump.yml +47 -0
  4. data/.gitignore +2 -0
  5. data/Gemfile.lock +48 -52
  6. data/bin/console +3 -0
  7. data/bin/dev +4 -0
  8. data/docker-compose.yml +26 -0
  9. data/examples/01-basic-redis-pod/manifest.rb +60 -0
  10. data/examples/02-manifest-with-middleware/manifest.rb +37 -0
  11. data/examples/02-manifest-with-middleware/middleware/labels.rb +4 -0
  12. data/examples/02-manifest-with-middleware/middleware/namespace.rb +4 -0
  13. data/examples/02-manifest-with-middleware/templates/config_map.rb +13 -0
  14. data/examples/02-manifest-with-middleware/templates/deployment.rb +59 -0
  15. data/examples/02-manifest-with-middleware/templates/horizontal_pod_autoscaler.rb +30 -0
  16. data/examples/02-manifest-with-middleware/templates/ingress.rb +38 -0
  17. data/examples/02-manifest-with-middleware/templates/service.rb +12 -0
  18. data/examples/03-app-with-database/demo.rb +87 -0
  19. data/examples/03-app-with-database/helpers.rb +18 -0
  20. data/examples/03-app-with-database/my_app.rb +45 -0
  21. data/examples/03-app-with-database/postgresql.rb +81 -0
  22. data/examples/03-app-with-database/ruby_on_rails.rb +31 -0
  23. data/flake.lock +3 -3
  24. data/flake.nix +6 -0
  25. data/kube_cluster.gemspec +3 -1
  26. data/lib/kube/cli/cluster.rb +41 -0
  27. data/lib/kube/cluster/connection.rb +18 -0
  28. data/lib/kube/cluster/instance.rb +21 -0
  29. data/lib/kube/cluster/manifest.rb +25 -0
  30. data/lib/kube/cluster/middleware/annotations.rb +32 -0
  31. data/lib/kube/cluster/middleware/hpa_for_deployment.rb +111 -0
  32. data/lib/kube/cluster/middleware/ingress_for_service.rb +91 -0
  33. data/lib/kube/cluster/middleware/labels.rb +59 -0
  34. data/lib/kube/cluster/middleware/namespace.rb +31 -0
  35. data/lib/kube/cluster/middleware/pod_anti_affinity.rb +61 -0
  36. data/lib/kube/cluster/middleware/resource_preset.rb +64 -0
  37. data/lib/kube/cluster/middleware/security_context.rb +84 -0
  38. data/lib/kube/cluster/middleware/service_for_deployment.rb +71 -0
  39. data/lib/kube/cluster/middleware/stack.rb +43 -0
  40. data/lib/kube/cluster/middleware.rb +69 -0
  41. data/lib/kube/cluster/resource/dirty_tracking.rb +113 -0
  42. data/lib/kube/cluster/resource/persistence.rb +67 -0
  43. data/lib/kube/cluster/resource.rb +99 -0
  44. data/lib/kube/cluster/version.rb +1 -1
  45. data/lib/kube/cluster.rb +34 -7
  46. data/lib/kube/errors.rb +57 -0
  47. metadata +69 -17
  48. data/Rakefile +0 -11
  49. data/TREE_PLAN.md +0 -513
  50. data/bin/generate-command-schema-v1 +0 -44
  51. data/data/kubectl-command-tree-v1-minimal.json +0 -125
  52. data/data/kubectl-command-tree-v1.json +0 -1469
  53. data/examples/quick-repl/docker-compose.yml +0 -52
  54. data/exe/kube_cluster +0 -6
  55. data/lib/kube/cluster/command_node.rb +0 -89
  56. data/lib/kube/cluster/ctl.rb +0 -33
  57. data/lib/kube/cluster/query_builder.rb +0 -35
  58. data/lib/kube/cluster/resource_selector.rb +0 -19
  59. data/lib/kube/cluster/tree_node.rb +0 -51
data/lib/kube/cluster.rb CHANGED
@@ -1,16 +1,43 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "kube/schema"
4
+ require_relative "../kube/errors"
3
5
  require_relative "cluster/version"
4
- require_relative "cluster/tree_node"
5
- require_relative "cluster/resource_selector"
6
- require_relative "cluster/query_builder"
7
- require_relative "cluster/command_node"
8
- require_relative "cluster/ctl"
6
+ require_relative "cluster/connection"
7
+ require_relative "cluster/instance"
8
+ require_relative "cluster/resource"
9
+ require_relative "cluster/manifest"
10
+ require_relative "cluster/middleware"
11
+ require 'kube/ctl'
9
12
 
10
13
  module Kube
14
+ def self.cluster
15
+ Cluster
16
+ end
17
+
11
18
  module Cluster
12
- def self.ctl
13
- Ctl.new
19
+ def self.connect(kubeconfig:)
20
+ Instance.new(kubeconfig: kubeconfig)
21
+ end
22
+
23
+ # Returns an anonymous subclass of Kube::Cluster::Resource for the
24
+ # given Kubernetes kind, mirroring Kube::Schema[kind] but with
25
+ # dirty tracking, persistence, and resource helper methods.
26
+ #
27
+ # Kube::Cluster["Deployment"].new { metadata.name = "web" }
28
+ #
29
+ def self.[](kind)
30
+ @resource_classes ||= {}
31
+ @resource_classes[kind] ||= begin
32
+ schema_class = Kube::Schema[kind]
33
+ Class.new(Resource) do
34
+ @schema = schema_class.schema
35
+ @defaults = schema_class.defaults
36
+
37
+ def self.schema = @schema || superclass.schema
38
+ def self.defaults = @defaults || superclass.defaults
39
+ end
40
+ end
14
41
  end
15
42
  end
16
43
  end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This file defines cluster-specific errors in the Kube namespace.
4
+
5
+ module Kube
6
+ # Base error class for the Kube namespace.
7
+ class Error < StandardError; end
8
+ # Raised when a kubectl command fails.
9
+ #
10
+ # begin
11
+ # resource.patch
12
+ # rescue Kube::CommandError => e
13
+ # e.subcommand # => "patch"
14
+ # e.stderr # => "Error from server (NotFound): ..."
15
+ # e.exit_code # => 1
16
+ # e.reason # => "NotFound" (parsed from stderr, or nil)
17
+ # end
18
+ #
19
+ class CommandError < Error
20
+ attr_reader :subcommand, :stderr, :exit_code, :reason
21
+
22
+ def initialize(message = nil, subcommand: nil, stderr: nil, exit_code: nil, reason: nil)
23
+ @subcommand = subcommand
24
+ @stderr = stderr
25
+ @exit_code = exit_code
26
+ @reason = reason || parse_reason(stderr)
27
+ super(message || build_message)
28
+ end
29
+
30
+ def self.from_kubectl(subcommand:, stderr:, exit_code:)
31
+ new(
32
+ subcommand: subcommand,
33
+ stderr: stderr,
34
+ exit_code: exit_code
35
+ )
36
+ end
37
+
38
+ private
39
+
40
+ def build_message
41
+ "kubectl #{@subcommand} failed (exit #{@exit_code}): #{@stderr}"
42
+ end
43
+
44
+ # Attempts to extract the reason from kubectl stderr.
45
+ # kubectl errors typically look like:
46
+ # Error from server (NotFound): deployments.apps "foo" not found
47
+ # Error from server (Forbidden): ...
48
+ # error: the server doesn't have a resource type "foo"
49
+ def parse_reason(stderr)
50
+ return nil if stderr.nil? || stderr.empty?
51
+
52
+ if stderr =~ /\((\w+)\)/
53
+ $1
54
+ end
55
+ end
56
+ end
57
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kube_cluster
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
  - Nathan K
@@ -57,56 +57,108 @@ dependencies:
57
57
  requirements:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
- version: '1.0'
60
+ version: 1.2.0
61
61
  type: :runtime
62
62
  prerelease: false
63
63
  version_requirements: !ruby/object:Gem::Requirement
64
64
  requirements:
65
65
  - - "~>"
66
66
  - !ruby/object:Gem::Version
67
- version: '1.0'
67
+ version: 1.2.0
68
+ - !ruby/object:Gem::Dependency
69
+ name: kube_kit
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">"
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ type: :runtime
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">"
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ - !ruby/object:Gem::Dependency
83
+ name: kube_kubectl
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: 2.0.0
89
+ type: :runtime
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: 2.0.0
68
96
  description: 'OOP abstraction that allows you to deploy and manage kubernetes resources
69
97
  using Ruby.
70
98
 
71
99
  '
72
100
  email:
73
101
  - nathankidd@hey.com
74
- executables:
75
- - kube_cluster
102
+ executables: []
76
103
  extensions: []
77
104
  extra_rdoc_files: []
78
105
  files:
79
106
  - ".envrc"
107
+ - ".github/workflows/release.yml"
108
+ - ".github/workflows/tag-gem-version-bump.yml"
80
109
  - ".gitignore"
81
110
  - ".rubocop.yml"
82
111
  - Gemfile
83
112
  - Gemfile.lock
84
113
  - LICENSE
85
114
  - README.md
86
- - Rakefile
87
- - TREE_PLAN.md
88
115
  - bin/console
89
- - bin/generate-command-schema-v1
116
+ - bin/dev
90
117
  - bin/increment-version
91
118
  - bin/release-gem
92
119
  - bin/setup
93
120
  - bin/tag-version
94
121
  - bin/test
95
- - data/kubectl-command-tree-v1-minimal.json
96
- - data/kubectl-command-tree-v1.json
97
- - examples/quick-repl/docker-compose.yml
98
- - exe/kube_cluster
122
+ - docker-compose.yml
123
+ - examples/01-basic-redis-pod/manifest.rb
124
+ - examples/02-manifest-with-middleware/manifest.rb
125
+ - examples/02-manifest-with-middleware/middleware/labels.rb
126
+ - examples/02-manifest-with-middleware/middleware/namespace.rb
127
+ - examples/02-manifest-with-middleware/templates/config_map.rb
128
+ - examples/02-manifest-with-middleware/templates/deployment.rb
129
+ - examples/02-manifest-with-middleware/templates/horizontal_pod_autoscaler.rb
130
+ - examples/02-manifest-with-middleware/templates/ingress.rb
131
+ - examples/02-manifest-with-middleware/templates/service.rb
132
+ - examples/03-app-with-database/demo.rb
133
+ - examples/03-app-with-database/helpers.rb
134
+ - examples/03-app-with-database/my_app.rb
135
+ - examples/03-app-with-database/postgresql.rb
136
+ - examples/03-app-with-database/ruby_on_rails.rb
99
137
  - flake.lock
100
138
  - flake.nix
101
139
  - kube_cluster.gemspec
140
+ - lib/kube/cli/cluster.rb
102
141
  - lib/kube/cluster.rb
103
- - lib/kube/cluster/command_node.rb
104
- - lib/kube/cluster/ctl.rb
105
- - lib/kube/cluster/query_builder.rb
106
- - lib/kube/cluster/resource_selector.rb
107
- - lib/kube/cluster/tree_node.rb
142
+ - lib/kube/cluster/connection.rb
143
+ - lib/kube/cluster/instance.rb
144
+ - lib/kube/cluster/manifest.rb
145
+ - lib/kube/cluster/middleware.rb
146
+ - lib/kube/cluster/middleware/annotations.rb
147
+ - lib/kube/cluster/middleware/hpa_for_deployment.rb
148
+ - lib/kube/cluster/middleware/ingress_for_service.rb
149
+ - lib/kube/cluster/middleware/labels.rb
150
+ - lib/kube/cluster/middleware/namespace.rb
151
+ - lib/kube/cluster/middleware/pod_anti_affinity.rb
152
+ - lib/kube/cluster/middleware/resource_preset.rb
153
+ - lib/kube/cluster/middleware/security_context.rb
154
+ - lib/kube/cluster/middleware/service_for_deployment.rb
155
+ - lib/kube/cluster/middleware/stack.rb
156
+ - lib/kube/cluster/resource.rb
157
+ - lib/kube/cluster/resource/dirty_tracking.rb
158
+ - lib/kube/cluster/resource/persistence.rb
108
159
  - lib/kube/cluster/version.rb
109
160
  - lib/kube/cluster/version.rb.erb
161
+ - lib/kube/errors.rb
110
162
  homepage: https://github.com/general-intelligence-systems/kube_cluster
111
163
  licenses:
112
164
  - Apache-2.0
data/Rakefile DELETED
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "rake/testtask"
4
-
5
- Rake::TestTask.new(:test) do |t|
6
- t.libs << "test"
7
- t.libs << "lib"
8
- t.test_files = FileList["test/**/*_test.rb"]
9
- end
10
-
11
- task default: :test