kube_cluster 0.7.0 → 0.9.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 (29) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +27 -1
  3. data/examples/02-manifest-with-middleware/manifest.rb +1 -1
  4. data/guides/middleware/readme.md +1 -1
  5. data/kube_cluster.gemspec +1 -0
  6. data/lib/kube/cluster/manifest.rb +7 -7
  7. data/lib/kube/cluster/middleware/namespace.rb +75 -71
  8. data/lib/kube/cluster/middleware/set_namespace.rb +38 -0
  9. data/lib/kube/cluster/middleware/set_reloader_auto.rb +36 -0
  10. data/lib/kube/cluster/middleware/stack.rb +1 -1
  11. data/lib/kube/cluster/standard/cdi/data_volume.rb +35 -0
  12. data/lib/kube/cluster/standard/cloud_native_pg/cluster.rb +27 -0
  13. data/lib/kube/cluster/standard/cloud_native_pg/database_with_external_secret.rb +44 -0
  14. data/lib/kube/cluster/standard/cloud_native_pg/external_secret.rb +57 -0
  15. data/lib/kube/cluster/standard/config_map.rb +45 -0
  16. data/lib/kube/cluster/standard/custom_resource_definition.rb +82 -0
  17. data/lib/kube/cluster/standard/daemon_set.rb +70 -0
  18. data/lib/kube/cluster/standard/eso/external_secret.rb +96 -0
  19. data/lib/kube/cluster/standard/forgejo/helm.rb +64 -0
  20. data/lib/kube/cluster/standard/gateway_api/http_route.rb +33 -0
  21. data/lib/kube/cluster/standard/job.rb +50 -0
  22. data/lib/kube/cluster/standard/kube_virt/virtual_machine.rb +36 -0
  23. data/lib/kube/cluster/standard/meta_controller/composite_controller.rb +80 -0
  24. data/lib/kube/cluster/standard/meta_controller/decorator_controller.rb +79 -0
  25. data/lib/kube/cluster/standard/persistent_volume_claim.rb +37 -0
  26. data/lib/kube/cluster/version.rb +1 -1
  27. data/lib/kube/cluster.rb +1 -0
  28. metadata +32 -2
  29. data/lib/kube/cluster/standard/cloud_native_pg.rb +0 -17
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0f1c23db70574ae658780a8fcdcaefa84a23b917f206cce85749c84739ccd8c1
4
- data.tar.gz: bd673c8ab74f4a2c6c046d27e40994cd7a819ad6e552b5a98e14fc1974f52bcc
3
+ metadata.gz: '09a4ece33b5d85dc6b05a89a322f2dcb5521b9ff50794b83b1d9603cc933b96b'
4
+ data.tar.gz: 97e408aca7876972b6c15f83b96c8889df81e7d86af98c7586c00ebbcdad9ad3
5
5
  SHA512:
6
- metadata.gz: 49d328773bd999a1270386fec416f6a4afa0aa88d8fe6fe51e42af84e134154ac80b0220426c7be1b45e534ab2c164dc5ff22a9c0208f2d623c67aaba1be621e
7
- data.tar.gz: fe000f50ed0f0b55a2b4efedc4fbedbf0bfcbf61039b64dd8584384cd0cf317d31e8b8db2d1bb79ae1b46dffcd6165ce27835d57cd5a9b86fbabdf976675dd21
6
+ metadata.gz: 1a86af7b79ec182074ee9ec96eefbe15a30abbfce3d4bbfce60290fc0e6fee81de0bf4d665b7851cd24ae8701e3b29149776883ea8e81cd1f2fd1fc7bd61e228
7
+ data.tar.gz: 6ccb1f6c68c6f91b8d261f8babb3244d476d73f60e8bbe992e50215f22d165950dc8afd730c5f2a95a11905f482f82c5f3ba32b0fd6e1ffabbd565e91501ed92
data/Gemfile.lock CHANGED
@@ -1,7 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- kube_cluster (0.7.0)
4
+ kube_cluster (0.9.0)
5
+ activesupport (~> 8.0)
5
6
  kube_kubectl (~> 2.0)
6
7
  kube_schema (~> 1.5)
7
8
  scampi (~> 0.1)
@@ -9,6 +10,19 @@ PATH
9
10
  GEM
10
11
  remote: https://rubygems.org/
11
12
  specs:
13
+ activesupport (8.1.3)
14
+ base64
15
+ bigdecimal
16
+ concurrent-ruby (~> 1.0, >= 1.3.1)
17
+ connection_pool (>= 2.2.5)
18
+ drb
19
+ i18n (>= 1.6, < 2)
20
+ json
21
+ logger (>= 1.4.2)
22
+ minitest (>= 5.1)
23
+ securerandom (>= 0.3)
24
+ tzinfo (~> 2.0, >= 2.0.5)
25
+ uri (>= 0.13.1)
12
26
  ast (2.4.3)
13
27
  async (2.39.0)
14
28
  console (~> 1.29)
@@ -60,12 +74,14 @@ GEM
60
74
  bake-releases (0.5.4)
61
75
  bake (~> 0.21)
62
76
  markly (~> 0.8)
77
+ base64 (0.3.0)
63
78
  bigdecimal (4.1.2)
64
79
  build-files (1.10.2)
65
80
  colorize (1.1.0)
66
81
  colorize-extended (0.1.0)
67
82
  colorize (~> 1.1)
68
83
  concurrent-ruby (1.3.6)
84
+ connection_pool (3.0.2)
69
85
  console (1.34.3)
70
86
  fiber-annotation
71
87
  fiber-local (~> 1.1)
@@ -77,6 +93,7 @@ GEM
77
93
  decode (0.27.0)
78
94
  prism
79
95
  rbs
96
+ drb (2.2.3)
80
97
  erb (6.0.4)
81
98
  falcon (0.55.3)
82
99
  async
@@ -97,6 +114,8 @@ GEM
97
114
  fiber-storage (1.0.1)
98
115
  hana (1.3.7)
99
116
  http-accept (2.2.1)
117
+ i18n (1.14.8)
118
+ concurrent-ruby (~> 1.0)
100
119
  io-console (0.8.2)
101
120
  io-endpoint (0.17.2)
102
121
  io-event (1.16.0)
@@ -140,6 +159,9 @@ GEM
140
159
  mime-types-data (~> 3.2025, >= 3.2025.0507)
141
160
  mime-types-data (3.2026.0414)
142
161
  mini_mime (1.1.5)
162
+ minitest (6.0.6)
163
+ drb (~> 2.0)
164
+ prism (~> 1.5)
143
165
  msgpack (1.8.0)
144
166
  net-imap (0.6.4)
145
167
  date
@@ -215,6 +237,7 @@ GEM
215
237
  mapping (~> 1.0)
216
238
  scampi (0.1.7)
217
239
  colorize-extended
240
+ securerandom (0.4.1)
218
241
  shellwords (0.2.2)
219
242
  simpleidn (0.2.3)
220
243
  string-format (0.2.0)
@@ -224,9 +247,12 @@ GEM
224
247
  timeout (0.6.1)
225
248
  traces (0.18.2)
226
249
  tsort (0.2.0)
250
+ tzinfo (2.0.6)
251
+ concurrent-ruby (~> 1.0)
227
252
  unicode-display_width (3.2.0)
228
253
  unicode-emoji (~> 4.1)
229
254
  unicode-emoji (4.2.0)
255
+ uri (1.1.1)
230
256
  utopia (2.32.1)
231
257
  bake (~> 0.20)
232
258
  concurrent-ruby (~> 1.2)
@@ -28,7 +28,7 @@ manifest = Kube::Cluster::Manifest.new(
28
28
  )
29
29
 
30
30
  stack = Kube::Cluster::Middleware::Stack.new do
31
- use Middleware::Namespace
31
+ use Middleware::SetNamespace
32
32
  use Middleware::Labels
33
33
  end
34
34
 
@@ -24,7 +24,7 @@ Kube::Cluster::Middleware::Stack.new {
24
24
  use Middleware::ServiceForDeployment
25
25
  use Middleware::IngressForService
26
26
  use Middleware::HPAForDeployment
27
- use Middleware::Namespace, "production"
27
+ use Middleware::SetNamespace, "production"
28
28
  use Middleware::Labels, managed_by: "kube_cluster"
29
29
  use Middleware::ResourcePreset
30
30
  use Middleware::SecurityContext
data/kube_cluster.gemspec CHANGED
@@ -35,4 +35,5 @@ Gem::Specification.new do |spec|
35
35
 
36
36
  spec.add_dependency "kube_schema", "~> 1.5"
37
37
  spec.add_dependency "kube_kubectl", "~> 2.0"
38
+ spec.add_dependency "activesupport", "~> 8.0"
38
39
  end
@@ -14,7 +14,7 @@ module Kube
14
14
  # manifest << Kube::Cluster["Deployment"].new { ... }
15
15
  #
16
16
  # stack = Kube::Cluster::Middleware::Stack.new do
17
- # use Middleware::Namespace, "production"
17
+ # use Middleware::SetNamespace, "production"
18
18
  # use Middleware::Labels, app: "web-app"
19
19
  # end
20
20
  #
@@ -77,7 +77,7 @@ test do
77
77
  }
78
78
 
79
79
  stack = Middleware::Stack.new do
80
- use Middleware::Namespace, "production"
80
+ use Middleware::SetNamespace, "production"
81
81
  end
82
82
  stack.call(m)
83
83
 
@@ -91,7 +91,7 @@ test do
91
91
  metadata.name = "test"
92
92
  }
93
93
 
94
- Middleware::Namespace.new("production").call(m)
94
+ Middleware::SetNamespace.new("production").call(m)
95
95
 
96
96
  yaml = m.to_yaml
97
97
  yaml.should.include "namespace: production"
@@ -102,7 +102,7 @@ test do
102
102
  m << Kube::Cluster["ConfigMap"].new { metadata.name = "a" }
103
103
  m << Kube::Cluster["ConfigMap"].new { metadata.name = "b" }
104
104
 
105
- Middleware::Namespace.new("production").call(m)
105
+ Middleware::SetNamespace.new("production").call(m)
106
106
 
107
107
  names = m.map { |r| r.to_h.dig(:metadata, :name) }
108
108
  names.should == %w[a b]
@@ -117,7 +117,7 @@ test do
117
117
  }
118
118
 
119
119
  stack = Middleware::Stack.new do
120
- use Middleware::Namespace, "staging"
120
+ use Middleware::SetNamespace, "staging"
121
121
  use Middleware::Labels, app: "myapp", managed_by: "kube_cluster"
122
122
  end
123
123
  stack.call(m)
@@ -144,7 +144,7 @@ test do
144
144
  m = Kube::Cluster::Manifest.new
145
145
  m << Kube::Cluster["ConfigMap"].new { metadata.name = "test" }
146
146
 
147
- Middleware::Namespace.new("production").call(m)
147
+ Middleware::SetNamespace.new("production").call(m)
148
148
 
149
149
  enum = m.each
150
150
  enum.should.be.instance_of Enumerator
@@ -197,7 +197,7 @@ test do
197
197
 
198
198
  stack = Middleware::Stack.new do
199
199
  use Middleware::ServiceForDeployment # generates Service
200
- use Middleware::Namespace, "production" # namespaces everything
200
+ use Middleware::SetNamespace, "production" # namespaces everything
201
201
  use Middleware::Labels, managed_by: "middleware" # labels everything
202
202
  end
203
203
  stack.call(m)
@@ -14,7 +14,11 @@ module Kube
14
14
  # end
15
15
  #
16
16
  class Namespace < Middleware
17
- def initialize(namespace, filter: DEFAULT_FILTER)
17
+ def initialize(namespace, filter: DEFAULT_FILTER, force: false)
18
+ unless force
19
+ raise "Middleware::Namespace is deprecated... use Middleware::SetNamespace"
20
+ end
21
+
18
22
  super(filter: filter)
19
23
  @namespace = namespace
20
24
  end
@@ -35,73 +39,73 @@ module Kube
35
39
  end
36
40
  end
37
41
 
38
- test do
39
- Middleware = Kube::Cluster::Middleware
40
-
41
- it "sets_namespace_on_configmap" do
42
- m = manifest(Kube::Cluster["ConfigMap"].new { metadata.name = "test" })
43
-
44
- Middleware::Namespace.new("production").call(m)
45
-
46
- m.resources.first.to_h.dig(:metadata, :namespace).should == "production"
47
- end
48
-
49
- it "sets_namespace_on_deployment" do
50
- m = manifest(Kube::Cluster["Deployment"].new { metadata.name = "web" })
51
-
52
- Middleware::Namespace.new("staging").call(m)
53
-
54
- m.resources.first.to_h.dig(:metadata, :namespace).should == "staging"
55
- end
56
-
57
- it "skips_namespace_resource" do
58
- m = manifest(Kube::Cluster["Namespace"].new { metadata.name = "my-ns" })
59
-
60
- Middleware::Namespace.new("production").call(m)
61
-
62
- m.resources.first.to_h.dig(:metadata, :namespace).should.be.nil
63
- end
64
-
65
- it "skips_cluster_role" do
66
- m = manifest(Kube::Cluster["ClusterRole"].new { metadata.name = "admin" })
67
-
68
- Middleware::Namespace.new("production").call(m)
69
-
70
- m.resources.first.to_h.dig(:metadata, :namespace).should.be.nil
71
- end
72
-
73
- it "skips_cluster_role_binding" do
74
- m = manifest(Kube::Cluster["ClusterRoleBinding"].new { metadata.name = "admin-binding" })
75
-
76
- Middleware::Namespace.new("production").call(m)
77
-
78
- m.resources.first.to_h.dig(:metadata, :namespace).should.be.nil
79
- end
80
-
81
- it "overwrites_existing_namespace" do
82
- m = manifest(Kube::Cluster["ConfigMap"].new {
83
- metadata.name = "test"
84
- metadata.namespace = "old"
85
- })
86
-
87
- Middleware::Namespace.new("new").call(m)
88
-
89
- m.resources.first.to_h.dig(:metadata, :namespace).should == "new"
90
- end
91
-
92
- it "returns_new_resource_instance" do
93
- resource = Kube::Cluster["ConfigMap"].new { metadata.name = "test" }
94
- manifest(resource).tap do |m|
95
- Middleware::Namespace.new("production").call(m)
96
- resource.equal?(m.resources.first).should.be.false
97
- end
98
- end
99
-
100
- private
101
-
102
- def manifest(*resources)
103
- Kube::Cluster::Manifest.new.tap do |manifest|
104
- resources.each { |x| manifest << x }
105
- end
106
- end
107
- end
42
+ #test do
43
+ # Middleware = Kube::Cluster::Middleware
44
+ #
45
+ # it "sets_namespace_on_configmap" do
46
+ # m = manifest(Kube::Cluster["ConfigMap"].new { metadata.name = "test" })
47
+ #
48
+ # Middleware::Namespace.new("production").call(m)
49
+ #
50
+ # m.resources.first.to_h.dig(:metadata, :namespace).should == "production"
51
+ # end
52
+ #
53
+ # it "sets_namespace_on_deployment" do
54
+ # m = manifest(Kube::Cluster["Deployment"].new { metadata.name = "web" })
55
+ #
56
+ # Middleware::Namespace.new("staging").call(m)
57
+ #
58
+ # m.resources.first.to_h.dig(:metadata, :namespace).should == "staging"
59
+ # end
60
+ #
61
+ # it "skips_namespace_resource" do
62
+ # m = manifest(Kube::Cluster["Namespace"].new { metadata.name = "my-ns" })
63
+ #
64
+ # Middleware::Namespace.new("production").call(m)
65
+ #
66
+ # m.resources.first.to_h.dig(:metadata, :namespace).should.be.nil
67
+ # end
68
+ #
69
+ # it "skips_cluster_role" do
70
+ # m = manifest(Kube::Cluster["ClusterRole"].new { metadata.name = "admin" })
71
+ #
72
+ # Middleware::Namespace.new("production").call(m)
73
+ #
74
+ # m.resources.first.to_h.dig(:metadata, :namespace).should.be.nil
75
+ # end
76
+ #
77
+ # it "skips_cluster_role_binding" do
78
+ # m = manifest(Kube::Cluster["ClusterRoleBinding"].new { metadata.name = "admin-binding" })
79
+ #
80
+ # Middleware::Namespace.new("production").call(m)
81
+ #
82
+ # m.resources.first.to_h.dig(:metadata, :namespace).should.be.nil
83
+ # end
84
+ #
85
+ # it "overwrites_existing_namespace" do
86
+ # m = manifest(Kube::Cluster["ConfigMap"].new {
87
+ # metadata.name = "test"
88
+ # metadata.namespace = "old"
89
+ # })
90
+ #
91
+ # Middleware::Namespace.new("new").call(m)
92
+ #
93
+ # m.resources.first.to_h.dig(:metadata, :namespace).should == "new"
94
+ # end
95
+ #
96
+ # it "returns_new_resource_instance" do
97
+ # resource = Kube::Cluster["ConfigMap"].new { metadata.name = "test" }
98
+ # manifest(resource).tap do |m|
99
+ # Middleware::Namespace.new("production").call(m)
100
+ # resource.equal?(m.resources.first).should.be.false
101
+ # end
102
+ # end
103
+ #
104
+ # private
105
+ #
106
+ # def manifest(*resources)
107
+ # Kube::Cluster::Manifest.new.tap do |manifest|
108
+ # resources.each { |x| manifest << x }
109
+ # end
110
+ # end
111
+ #end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/setup"
4
+ require 'kube/cluster'
5
+
6
+ module Kube
7
+ module Cluster
8
+ class Middleware
9
+ # Sets +metadata.namespace+ on all namespace-scoped resources,
10
+ # skipping HelmCharts and resources that already have a
11
+ # non-default namespace set.
12
+ #
13
+ # use SetNamespace, 'authelia'
14
+ #
15
+ class SetNamespace < Middleware
16
+ def initialize(namespace)
17
+ super(filter: ->(r) { r.kind != 'HelmChart' })
18
+ @namespace = namespace
19
+ end
20
+
21
+ def call(manifest)
22
+ manifest.resources.map! { |resource|
23
+ filter(resource) {
24
+ next resource if resource.cluster_scoped?
25
+
26
+ h = resource.to_h
27
+ h[:metadata] ||= {}
28
+ next resource if h[:metadata][:namespace] && h[:metadata][:namespace] != 'default'
29
+
30
+ h[:metadata][:namespace] = @namespace
31
+ resource.rebuild(h)
32
+ }
33
+ }
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/setup"
4
+ require 'kube/cluster'
5
+
6
+ module Kube
7
+ module Cluster
8
+ class Middleware
9
+ # Adds +reloader.stakater.com/auto: "true"+ to Deployments,
10
+ # StatefulSets, and DaemonSets so Stakater Reloader triggers
11
+ # rolling restarts when referenced ConfigMaps or Secrets change.
12
+ #
13
+ # use SetReloaderAuto
14
+ #
15
+ class SetReloaderAuto < Middleware
16
+ KINDS = %w[Deployment StatefulSet DaemonSet].freeze
17
+
18
+ def initialize
19
+ super(filter: ->(r) { KINDS.include?(r.kind) })
20
+ end
21
+
22
+ def call(manifest)
23
+ manifest.resources.map! { |resource|
24
+ filter(resource) {
25
+ h = resource.to_h
26
+ h[:metadata] ||= {}
27
+ h[:metadata][:annotations] ||= {}
28
+ h[:metadata][:annotations][:'reloader.stakater.com/auto'] = 'true'
29
+ resource.rebuild(h)
30
+ }
31
+ }
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -9,7 +9,7 @@ module Kube
9
9
  # stack = Kube::Cluster::Middleware::Stack.new do
10
10
  # use Middleware::ServiceForDeployment
11
11
  # use Middleware::Labels, app: "web"
12
- # use Middleware::Namespace, "production"
12
+ # use Middleware::SetNamespace, "production"
13
13
  # end
14
14
  #
15
15
  # stack.call(manifest)
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/setup"
4
+ require "kube/cluster"
5
+
6
+ module Kube
7
+ module Cluster
8
+ module Standard
9
+ module CDI
10
+ #class DataVolume < Kube::Cluster['DataVolume']
11
+ # def initialize(name:, &block)
12
+ # super() {
13
+ # metadata.name = name
14
+ # instance_exec(&block) if block
15
+ # }
16
+ # end
17
+ #end
18
+ end
19
+ end
20
+ end
21
+ end
22
+
23
+ test do
24
+ #describe "CDI::DataVolume" do
25
+ # it "initializes without error" do
26
+ # Kube::Cluster::Standard::CDI::DataVolume
27
+ # .new(
28
+ # name: "my-example-volume"
29
+ # )
30
+ # .to_yaml
31
+ # .is_a?(String)
32
+ # .should == true
33
+ # end
34
+ #end
35
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/setup"
4
+ require "kube/cluster"
5
+
6
+ module Kube
7
+ module Cluster
8
+ module Standard
9
+ module CloudNativePg
10
+ #class Cluster < Kube::Cluster["Cluster"]
11
+ #end
12
+ end
13
+ end
14
+ end
15
+ end
16
+
17
+ test do
18
+ #describe "CloudNativePg::Cluster" do
19
+ # it "initializes without error" do
20
+ # Kube::Cluster::Standard::CloudNativePg::Cluster
21
+ # .new()
22
+ # .to_yaml
23
+ # .is_a?(String)
24
+ # .should == true
25
+ # end
26
+ #end
27
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/setup"
4
+ require "kube/cluster"
5
+
6
+ module Kube
7
+ module Cluster
8
+ module Standard
9
+ module CloudNativePg
10
+ class DatabaseWithExternalSecret < Kube::Cluster::Manifest
11
+ def initialize(name:, cluster: "postgres", owner: "app", &block)
12
+ database = Kube::Cluster["Database"].new {
13
+ metadata.name = name
14
+ spec.cluster = { name: cluster }
15
+ spec.databaseReclaimPolicy = "retain"
16
+ spec.ensure = "present"
17
+ spec.name = name
18
+ spec.owner = owner
19
+ }
20
+
21
+ external_secret = CloudNativePg::ExternalSecret.new(name: name)
22
+
23
+ super(database, external_secret)
24
+ instance_exec(&block) if block
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ test do
33
+ describe "CloudNativePg::DatabaseWithExternalSecret" do
34
+ it "initializes without error" do
35
+ Kube::Cluster::Standard::CloudNativePg::DatabaseWithExternalSecret
36
+ .new(
37
+ name: "my-example-cluster"
38
+ )
39
+ .to_yaml
40
+ .is_a?(String)
41
+ .should == true
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/setup"
4
+ require "kube/cluster"
5
+
6
+ module Kube
7
+ module Cluster
8
+ module Standard
9
+ module CloudNativePg
10
+ class ExternalSecret < Kube::Cluster["ExternalSecret"]
11
+
12
+ DB_HOST = "postgres-rw.cloudnative-pg.svc.cluster.local"
13
+
14
+ def initialize(name:, env_prefix: "DB", db_host: DB_HOST, &block)
15
+ super() {
16
+ metadata.name = "#{name}-db"
17
+ spec.refreshInterval = "1h"
18
+ spec.secretStoreRef = { kind: "ClusterSecretStore", name: "cnpg-credentials" }
19
+ spec.target = {
20
+ name: "#{name}-db",
21
+ creationPolicy: "Owner",
22
+ deletionPolicy: "Retain",
23
+ template: {
24
+ data: {
25
+ "#{env_prefix}_URL" => "jdbc:postgresql://#{db_host}:5432/#{name}",
26
+ "#{env_prefix}_USER" => "{{ .username }}",
27
+ "#{env_prefix}_PASSWORD" => "{{ .password }}",
28
+ },
29
+ },
30
+ }
31
+ spec.data = [
32
+ { secretKey: "username", remoteRef: { key: "postgres-app", property: "username" } },
33
+ { secretKey: "password", remoteRef: { key: "postgres-app", property: "password" } },
34
+ ]
35
+
36
+ instance_exec(&block) if block_given?
37
+ }
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+
45
+ test do
46
+ describe "CloudNativePg::ExternalSecret" do
47
+ it "initializes without error" do
48
+ Kube::Cluster::Standard::CloudNativePg::ExternalSecret
49
+ .new(
50
+ name: "my-external-secret"
51
+ )
52
+ .to_yaml
53
+ .is_a?(String)
54
+ .should == true
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/setup"
4
+ require "kube/cluster"
5
+
6
+ module Kube
7
+ module Cluster
8
+ module Standard
9
+ class ConfigMap < Kube::Cluster['ConfigMap']
10
+
11
+ # wtf is this????? I hate it... claude made it and it needs to dead...
12
+ KeyRef = Struct.new(:config_map, :key_name)
13
+
14
+ def initialize(name: 'config', **options, &block)
15
+ super(**options) do
16
+ metadata.name = name
17
+ instance_exec(&block) if block
18
+ end
19
+ end
20
+
21
+ def config_map_name
22
+ to_h.dig(:metadata, :name)
23
+ end
24
+
25
+ def key(key_name)
26
+ KeyRef.new(self, key_name)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+
33
+ test do
34
+ describe "ConfigMap" do
35
+ it "initializes without error" do
36
+ Kube::Cluster::Standard::ConfigMap
37
+ .new(
38
+ #name: "example-config"
39
+ )
40
+ .to_yaml
41
+ .is_a?(String)
42
+ .should == true
43
+ end
44
+ end
45
+ end