kube_cluster 0.20.1 → 1.0.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 (61) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/CHANGELOG.md +34 -0
  4. data/Gemfile.lock +5 -37
  5. data/flake.nix +2 -1
  6. data/kube_cluster.gemspec +2 -4
  7. data/lib/kube/cluster/container.rb +17 -17
  8. data/lib/kube/cluster/manifest.rb +158 -158
  9. data/lib/kube/cluster/middleware/annotations.rb +42 -42
  10. data/lib/kube/cluster/middleware/hpa_for_deployment.rb +134 -134
  11. data/lib/kube/cluster/middleware/ingress_for_service.rb +75 -75
  12. data/lib/kube/cluster/middleware/labels.rb +58 -58
  13. data/lib/kube/cluster/middleware/pod_anti_affinity.rb +104 -104
  14. data/lib/kube/cluster/middleware/resource_preset.rb +145 -145
  15. data/lib/kube/cluster/middleware/security_context.rb +127 -127
  16. data/lib/kube/cluster/middleware/service_for_deployment.rb +120 -120
  17. data/lib/kube/cluster/middleware.rb +219 -221
  18. data/lib/kube/cluster/resource/dirty_tracking.rb +388 -388
  19. data/lib/kube/cluster/resource.rb +16 -16
  20. data/lib/kube/cluster/standard/cdi/data_volume.rb +13 -13
  21. data/lib/kube/cluster/standard/cloud_native_pg/cluster.rb +11 -11
  22. data/lib/kube/cluster/standard/cloud_native_pg/database_with_external_secret.rb +11 -11
  23. data/lib/kube/cluster/standard/cloud_native_pg/external_secret.rb +11 -11
  24. data/lib/kube/cluster/standard/cloud_native_pg/helm.rb +26 -26
  25. data/lib/kube/cluster/standard/config_map.rb +11 -11
  26. data/lib/kube/cluster/standard/cron_job.rb +13 -13
  27. data/lib/kube/cluster/standard/cron_job_with_service_account.rb +12 -12
  28. data/lib/kube/cluster/standard/custom_resource_definition.rb +12 -12
  29. data/lib/kube/cluster/standard/daemon_set.rb +12 -12
  30. data/lib/kube/cluster/standard/deployment_with_service.rb +82 -82
  31. data/lib/kube/cluster/standard/env_processing.rb +15 -15
  32. data/lib/kube/cluster/standard/eso/external_secret.rb +13 -13
  33. data/lib/kube/cluster/standard/forgejo/helm.rb +11 -11
  34. data/lib/kube/cluster/standard/gateway_api/http_route.rb +322 -19
  35. data/lib/kube/cluster/standard/job.rb +12 -12
  36. data/lib/kube/cluster/standard/job_with_service_account.rb +11 -11
  37. data/lib/kube/cluster/standard/kube_virt/virtual_machine.rb +11 -11
  38. data/lib/kube/cluster/standard/meta_controller/composite_controller.rb +13 -13
  39. data/lib/kube/cluster/standard/meta_controller/decorator_controller.rb +13 -13
  40. data/lib/kube/cluster/standard/perses/perses.rb +9 -9
  41. data/lib/kube/cluster/standard/perses/perses_datasource.rb +13 -13
  42. data/lib/kube/cluster/standard/persistent_volume_claim.rb +12 -12
  43. data/lib/kube/cluster/standard/role.rb +12 -12
  44. data/lib/kube/cluster/standard/role_binding.rb +10 -10
  45. data/lib/kube/cluster/standard/secret.rb +11 -11
  46. data/lib/kube/cluster/standard/service.rb +12 -12
  47. data/lib/kube/cluster/standard/service_account.rb +9 -9
  48. data/lib/kube/cluster/standard/service_account_with_role.rb +10 -10
  49. data/lib/kube/cluster/standard/victoria_metrics/vl_agent.rb +9 -9
  50. data/lib/kube/cluster/standard/victoria_metrics/vl_single.rb +9 -9
  51. data/lib/kube/cluster/standard/victoria_metrics/vm_agent.rb +9 -9
  52. data/lib/kube/cluster/standard/victoria_metrics/vm_node_scrape.rb +9 -9
  53. data/lib/kube/cluster/standard/victoria_metrics/vm_service_scrape.rb +9 -9
  54. data/lib/kube/cluster/standard/victoria_metrics/vm_single.rb +9 -9
  55. data/lib/kube/cluster/standard/volume_processing.rb +3 -3
  56. data/lib/kube/cluster/version.rb +1 -1
  57. data/lib/kube/cluster.rb +137 -1
  58. data/lib/kube/helm/chart.rb +323 -323
  59. data/lib/kube/helm/endpoint.rb +58 -58
  60. data/lib/kube/helm/repo.rb +160 -160
  61. metadata +7 -20
@@ -1,8 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "bundler/setup"
4
- require "scampi"
5
- require "kube/cluster"
6
4
 
7
5
  require_relative "middleware/stack"
8
6
  require_relative "middleware/namespace"
@@ -121,296 +119,296 @@ module Kube
121
119
  end
122
120
  end
123
121
 
124
- test do
125
- Middleware = Kube::Cluster::Middleware
122
+ __END__
126
123
 
127
- # --- filter helper ----------------------------------------------------------
124
+ Middleware = Kube::Cluster::Middleware
128
125
 
129
- it "filter_runs_block_when_filter_matches" do
130
- mw = Middleware.new(filter: ->(r) { true })
131
- resource = Kube::Cluster["ConfigMap"].new { metadata.name = "test" }
126
+ # --- filter helper ----------------------------------------------------------
132
127
 
133
- result = mw.filter(resource) { :ran }
128
+ it "filter_runs_block_when_filter_matches" do
129
+ mw = Middleware.new(filter: ->(r) { true })
130
+ resource = Kube::Cluster["ConfigMap"].new { metadata.name = "test" }
134
131
 
135
- result.should == :ran
136
- end
132
+ result = mw.filter(resource) { :ran }
137
133
 
138
- it "filter_returns_resource_when_filter_rejects" do
139
- mw = Middleware.new(filter: ->(r) { false })
140
- resource = Kube::Cluster["ConfigMap"].new { metadata.name = "test" }
134
+ result.should == :ran
135
+ end
141
136
 
142
- result = mw.filter(resource) { :should_not_run }
137
+ it "filter_returns_resource_when_filter_rejects" do
138
+ mw = Middleware.new(filter: ->(r) { false })
139
+ resource = Kube::Cluster["ConfigMap"].new { metadata.name = "test" }
143
140
 
144
- result.should == resource
145
- end
141
+ result = mw.filter(resource) { :should_not_run }
146
142
 
147
- it "filter_runs_block_by_default" do
148
- mw = Middleware.new
149
- resource = Kube::Cluster["ConfigMap"].new { metadata.name = "test" }
143
+ result.should == resource
144
+ end
150
145
 
151
- result = mw.filter(resource) { :ran }
146
+ it "filter_runs_block_by_default" do
147
+ mw = Middleware.new
148
+ resource = Kube::Cluster["ConfigMap"].new { metadata.name = "test" }
152
149
 
153
- result.should == :ran
154
- end
150
+ result = mw.filter(resource) { :ran }
155
151
 
156
- it "filter_passes_resource_to_filter_proc" do
157
- received = nil
158
- mw = Middleware.new(filter: ->(r) { received = r; true })
159
- resource = Kube::Cluster["ConfigMap"].new { metadata.name = "test" }
152
+ result.should == :ran
153
+ end
160
154
 
161
- mw.filter(resource) { :ok }
155
+ it "filter_passes_resource_to_filter_proc" do
156
+ received = nil
157
+ mw = Middleware.new(filter: ->(r) { received = r; true })
158
+ resource = Kube::Cluster["ConfigMap"].new { metadata.name = "test" }
162
159
 
163
- received.should == resource
164
- end
160
+ mw.filter(resource) { :ok }
165
161
 
166
- it "filter_can_match_on_kind" do
167
- only_deployments = ->(r) { r.kind == "Deployment" }
162
+ received.should == resource
163
+ end
168
164
 
169
- mw = Middleware.new(filter: only_deployments)
170
- deploy = Kube::Cluster["Deployment"].new { metadata.name = "web" }
171
- config = Kube::Cluster["ConfigMap"].new { metadata.name = "cfg" }
165
+ it "filter_can_match_on_kind" do
166
+ only_deployments = ->(r) { r.kind == "Deployment" }
172
167
 
173
- mw.filter(deploy) { :ran }.should == :ran
174
- mw.filter(config) { :ran }.should == config
175
- end
168
+ mw = Middleware.new(filter: only_deployments)
169
+ deploy = Kube::Cluster["Deployment"].new { metadata.name = "web" }
170
+ config = Kube::Cluster["ConfigMap"].new { metadata.name = "cfg" }
176
171
 
177
- it "filter_can_match_on_label" do
178
- only_labeled = ->(r) { r.label("app.kubernetes.io/name") == "web" }
172
+ mw.filter(deploy) { :ran }.should == :ran
173
+ mw.filter(config) { :ran }.should == config
174
+ end
179
175
 
180
- mw = Middleware.new(filter: only_labeled)
181
- labeled = Kube::Cluster["ConfigMap"].new {
182
- metadata.name = "cm"
183
- metadata.labels = { "app.kubernetes.io/name": "web" }
184
- }
185
- unlabeled = Kube::Cluster["ConfigMap"].new { metadata.name = "other" }
176
+ it "filter_can_match_on_label" do
177
+ only_labeled = ->(r) { r.label("app.kubernetes.io/name") == "web" }
186
178
 
187
- mw.filter(labeled) { :ran }.should == :ran
188
- mw.filter(unlabeled) { :ran }.should == unlabeled
189
- end
179
+ mw = Middleware.new(filter: only_labeled)
180
+ labeled = Kube::Cluster["ConfigMap"].new {
181
+ metadata.name = "cm"
182
+ metadata.labels = { "app.kubernetes.io/name": "web" }
183
+ }
184
+ unlabeled = Kube::Cluster["ConfigMap"].new { metadata.name = "other" }
190
185
 
191
- it "filter_can_match_on_pod_bearing" do
192
- only_pods = ->(r) { r.pod_bearing? }
193
- mw = Middleware.new(filter: only_pods)
186
+ mw.filter(labeled) { :ran }.should == :ran
187
+ mw.filter(unlabeled) { :ran }.should == unlabeled
188
+ end
194
189
 
195
- deploy = Kube::Cluster["Deployment"].new { metadata.name = "web" }
196
- config = Kube::Cluster["ConfigMap"].new { metadata.name = "cfg" }
190
+ it "filter_can_match_on_pod_bearing" do
191
+ only_pods = ->(r) { r.pod_bearing? }
192
+ mw = Middleware.new(filter: only_pods)
197
193
 
198
- mw.filter(deploy) { :ran }.should == :ran
199
- mw.filter(config) { :ran }.should == config
200
- end
194
+ deploy = Kube::Cluster["Deployment"].new { metadata.name = "web" }
195
+ config = Kube::Cluster["ConfigMap"].new { metadata.name = "cfg" }
201
196
 
202
- it "filter_block_has_access_to_middleware_instance" do
203
- mw = Middleware.new
204
- resource = Kube::Cluster["ConfigMap"].new { metadata.name = "test" }
197
+ mw.filter(deploy) { :ran }.should == :ran
198
+ mw.filter(config) { :ran }.should == config
199
+ end
205
200
 
206
- # deep_merge is a private method on Middleware — the block should
207
- # be able to call it via instance_exec.
208
- result = mw.filter(resource) {
209
- deep_merge({ a: 1 }, { b: 2 })
210
- }
201
+ it "filter_block_has_access_to_middleware_instance" do
202
+ mw = Middleware.new
203
+ resource = Kube::Cluster["ConfigMap"].new { metadata.name = "test" }
211
204
 
212
- result.should == { a: 1, b: 2 }
213
- end
205
+ # deep_merge is a private method on Middleware — the block should
206
+ # be able to call it via instance_exec.
207
+ result = mw.filter(resource) {
208
+ deep_merge({ a: 1 }, { b: 2 })
209
+ }
210
+
211
+ result.should == { a: 1, b: 2 }
212
+ end
213
+
214
+ it "filter_recovers_when_super_was_not_called" do
215
+ # Simulate a subclass that overrides initialize without calling super,
216
+ # leaving @filter as nil.
217
+ mw = Middleware.allocate
218
+ resource = Kube::Cluster["ConfigMap"].new { metadata.name = "test" }
219
+
220
+ result = mw.filter(resource) { :ran }
214
221
 
215
- it "filter_recovers_when_super_was_not_called" do
216
- # Simulate a subclass that overrides initialize without calling super,
217
- # leaving @filter as nil.
218
- mw = Middleware.allocate
219
- resource = Kube::Cluster["ConfigMap"].new { metadata.name = "test" }
222
+ result.should == :ran
223
+ end
224
+
225
+ # --- filter in a transform middleware (map! pattern) ------------------------
226
+
227
+ it "filter_with_transform_middleware_skips_non_matching" do
228
+ m = manifest(
229
+ Kube::Cluster["Deployment"].new { metadata.name = "web" },
230
+ Kube::Cluster["ConfigMap"].new { metadata.name = "cfg" },
231
+ )
220
232
 
221
- result = mw.filter(resource) { :ran }
233
+ # A middleware that adds a label, but only to Deployments.
234
+ mw = Middleware.new(filter: ->(r) { r.kind == "Deployment" })
222
235
 
223
- result.should == :ran
236
+ m.resources.map! do |resource|
237
+ mw.filter(resource) do
238
+ h = resource.to_h
239
+ h[:metadata] ||= {}
240
+ h[:metadata][:labels] = (h[:metadata][:labels] || {}).merge(tagged: "yes")
241
+ resource.rebuild(h)
242
+ end
224
243
  end
225
244
 
226
- # --- filter in a transform middleware (map! pattern) ------------------------
245
+ m.resources[0].to_h.dig(:metadata, :labels, :tagged).should == "yes"
246
+ m.resources[1].to_h.dig(:metadata, :labels, :tagged).should.be.nil
247
+ end
227
248
 
228
- it "filter_with_transform_middleware_skips_non_matching" do
229
- m = manifest(
230
- Kube::Cluster["Deployment"].new { metadata.name = "web" },
231
- Kube::Cluster["ConfigMap"].new { metadata.name = "cfg" },
232
- )
249
+ it "filter_with_transform_middleware_applies_to_all_by_default" do
250
+ m = manifest(
251
+ Kube::Cluster["Deployment"].new { metadata.name = "web" },
252
+ Kube::Cluster["ConfigMap"].new { metadata.name = "cfg" },
253
+ )
233
254
 
234
- # A middleware that adds a label, but only to Deployments.
235
- mw = Middleware.new(filter: ->(r) { r.kind == "Deployment" })
255
+ mw = Middleware.new
236
256
 
237
- m.resources.map! do |resource|
238
- mw.filter(resource) do
239
- h = resource.to_h
240
- h[:metadata] ||= {}
241
- h[:metadata][:labels] = (h[:metadata][:labels] || {}).merge(tagged: "yes")
242
- resource.rebuild(h)
243
- end
257
+ m.resources.map! do |resource|
258
+ mw.filter(resource) do
259
+ h = resource.to_h
260
+ h[:metadata] ||= {}
261
+ h[:metadata][:labels] = (h[:metadata][:labels] || {}).merge(tagged: "yes")
262
+ resource.rebuild(h)
244
263
  end
264
+ end
265
+
266
+ m.resources[0].to_h.dig(:metadata, :labels, :tagged).should == "yes"
267
+ m.resources[1].to_h.dig(:metadata, :labels, :tagged).should == "yes"
268
+ end
269
+
270
+ # --- Middleware.build -------------------------------------------------------
271
+
272
+ it "build_creates_middleware_from_block" do
273
+ m = manifest(Kube::Cluster["ConfigMap"].new { metadata.name = "test" })
245
274
 
246
- m.resources[0].to_h.dig(:metadata, :labels, :tagged).should == "yes"
247
- m.resources[1].to_h.dig(:metadata, :labels, :tagged).should.be.nil
275
+ klass = Middleware.build do |manifest|
276
+ manifest.resources.map! do |resource|
277
+ h = resource.to_h
278
+ h[:metadata][:labels] = { injected: "yes" }
279
+ resource.rebuild(h)
280
+ end
248
281
  end
282
+ klass.new.call(m)
249
283
 
250
- it "filter_with_transform_middleware_applies_to_all_by_default" do
251
- m = manifest(
252
- Kube::Cluster["Deployment"].new { metadata.name = "web" },
253
- Kube::Cluster["ConfigMap"].new { metadata.name = "cfg" },
254
- )
284
+ m.resources.first.to_h.dig(:metadata, :labels, :injected).should == "yes"
285
+ end
255
286
 
256
- mw = Middleware.new
287
+ it "build_bakes_in_filter" do
288
+ m = manifest(
289
+ Kube::Cluster["Deployment"].new { metadata.name = "web" },
290
+ Kube::Cluster["ConfigMap"].new { metadata.name = "cfg" },
291
+ )
257
292
 
258
- m.resources.map! do |resource|
259
- mw.filter(resource) do
293
+ klass = Middleware.build(filter: ->(r) { r.kind == "Deployment" }) do |manifest|
294
+ manifest.resources.map! do |resource|
295
+ filter(resource) do
260
296
  h = resource.to_h
261
- h[:metadata] ||= {}
262
297
  h[:metadata][:labels] = (h[:metadata][:labels] || {}).merge(tagged: "yes")
263
298
  resource.rebuild(h)
264
299
  end
265
300
  end
266
-
267
- m.resources[0].to_h.dig(:metadata, :labels, :tagged).should == "yes"
268
- m.resources[1].to_h.dig(:metadata, :labels, :tagged).should == "yes"
269
301
  end
302
+ klass.new.call(m)
270
303
 
271
- # --- Middleware.build -------------------------------------------------------
304
+ m.resources[0].to_h.dig(:metadata, :labels, :tagged).should == "yes"
305
+ m.resources[1].to_h.dig(:metadata, :labels, :tagged).should.be.nil
306
+ end
272
307
 
273
- it "build_creates_middleware_from_block" do
274
- m = manifest(Kube::Cluster["ConfigMap"].new { metadata.name = "test" })
308
+ it "build_has_access_to_deep_merge" do
309
+ m = manifest(Kube::Cluster["ConfigMap"].new { metadata.name = "test" })
275
310
 
276
- klass = Middleware.build do |manifest|
277
- manifest.resources.map! do |resource|
278
- h = resource.to_h
279
- h[:metadata][:labels] = { injected: "yes" }
280
- resource.rebuild(h)
281
- end
311
+ klass = Middleware.build do |manifest|
312
+ manifest.resources.map! do |resource|
313
+ h = resource.to_h
314
+ h[:metadata][:labels] = deep_merge({ a: 1 }, { b: 2 })
315
+ resource.rebuild(h)
282
316
  end
283
- klass.new.call(m)
317
+ end
318
+ klass.new.call(m)
319
+
320
+ m.resources.first.to_h.dig(:metadata, :labels).should == { a: 1, b: 2 }
321
+ end
284
322
 
285
- m.resources.first.to_h.dig(:metadata, :labels, :injected).should == "yes"
323
+ it "build_bakes_in_opts" do
324
+ m = manifest(Kube::Cluster["ConfigMap"].new { metadata.name = "test" })
325
+
326
+ klass = Middleware.build(team: "platform") do |manifest|
327
+ manifest.resources.map! do |resource|
328
+ h = resource.to_h
329
+ h[:metadata][:labels] = { team: @opts[:team] }
330
+ resource.rebuild(h)
331
+ end
286
332
  end
333
+ klass.new.call(m)
287
334
 
288
- it "build_bakes_in_filter" do
289
- m = manifest(
290
- Kube::Cluster["Deployment"].new { metadata.name = "web" },
291
- Kube::Cluster["ConfigMap"].new { metadata.name = "cfg" },
292
- )
335
+ m.resources.first.to_h.dig(:metadata, :labels, :team).should == "platform"
336
+ end
293
337
 
294
- klass = Middleware.build(filter: ->(r) { r.kind == "Deployment" }) do |manifest|
338
+ it "build_works_in_stack" do
339
+ m = manifest(
340
+ Kube::Cluster["Deployment"].new { metadata.name = "web" },
341
+ Kube::Cluster["ConfigMap"].new { metadata.name = "cfg" },
342
+ )
343
+
344
+ stack = Middleware::Stack.new do
345
+ use Middleware.build(filter: ->(r) { r.kind == "Deployment" }) { |manifest|
295
346
  manifest.resources.map! do |resource|
296
347
  filter(resource) do
297
348
  h = resource.to_h
298
- h[:metadata][:labels] = (h[:metadata][:labels] || {}).merge(tagged: "yes")
349
+ h[:metadata][:labels] = (h[:metadata][:labels] || {}).merge(custom: "from-build")
299
350
  resource.rebuild(h)
300
351
  end
301
352
  end
302
- end
303
- klass.new.call(m)
304
-
305
- m.resources[0].to_h.dig(:metadata, :labels, :tagged).should == "yes"
306
- m.resources[1].to_h.dig(:metadata, :labels, :tagged).should.be.nil
353
+ }
307
354
  end
355
+ stack.call(m)
308
356
 
309
- it "build_has_access_to_deep_merge" do
310
- m = manifest(Kube::Cluster["ConfigMap"].new { metadata.name = "test" })
357
+ m.resources[0].to_h.dig(:metadata, :labels, :custom).should == "from-build"
358
+ m.resources[1].to_h.dig(:metadata, :labels, :custom).should.be.nil
359
+ end
311
360
 
312
- klass = Middleware.build do |manifest|
313
- manifest.resources.map! do |resource|
314
- h = resource.to_h
315
- h[:metadata][:labels] = deep_merge({ a: 1 }, { b: 2 })
316
- resource.rebuild(h)
317
- end
318
- end
319
- klass.new.call(m)
361
+ it "build_returns_a_class" do
362
+ klass = Middleware.build { |manifest| }
320
363
 
321
- m.resources.first.to_h.dig(:metadata, :labels).should == { a: 1, b: 2 }
322
- end
364
+ klass.should.be.kind_of(Class)
365
+ (klass < Middleware).should == true
366
+ end
323
367
 
324
- it "build_bakes_in_opts" do
325
- m = manifest(Kube::Cluster["ConfigMap"].new { metadata.name = "test" })
368
+ it "build_noop_base_class_without_block" do
369
+ m = manifest(Kube::Cluster["ConfigMap"].new { metadata.name = "test" })
370
+ original = m.resources.first.to_h.dup
326
371
 
327
- klass = Middleware.build(team: "platform") do |manifest|
328
- manifest.resources.map! do |resource|
329
- h = resource.to_h
330
- h[:metadata][:labels] = { team: @opts[:team] }
331
- resource.rebuild(h)
332
- end
333
- end
334
- klass.new.call(m)
372
+ Middleware.new.call(m)
335
373
 
336
- m.resources.first.to_h.dig(:metadata, :labels, :team).should == "platform"
337
- end
374
+ m.resources.first.to_h.should == original
375
+ end
338
376
 
339
- it "build_works_in_stack" do
340
- m = manifest(
341
- Kube::Cluster["Deployment"].new { metadata.name = "web" },
342
- Kube::Cluster["ConfigMap"].new { metadata.name = "cfg" },
343
- )
344
-
345
- stack = Middleware::Stack.new do
346
- use Middleware.build(filter: ->(r) { r.kind == "Deployment" }) { |manifest|
347
- manifest.resources.map! do |resource|
348
- filter(resource) do
349
- h = resource.to_h
350
- h[:metadata][:labels] = (h[:metadata][:labels] || {}).merge(custom: "from-build")
351
- resource.rebuild(h)
352
- end
353
- end
377
+ # --- filter in a generative middleware (each pattern) -----------------------
378
+
379
+ it "filter_with_generative_middleware_skips_non_matching" do
380
+ m = manifest(
381
+ Kube::Cluster["Deployment"].new {
382
+ metadata.name = "web"
383
+ metadata.labels = { "app.kubernetes.io/name": "web" }
384
+ },
385
+ Kube::Cluster["Deployment"].new {
386
+ metadata.name = "worker"
387
+ metadata.labels = { "app.kubernetes.io/name": "worker" }
388
+ },
389
+ )
390
+
391
+ only_web = ->(r) { r.label("app.kubernetes.io/name") == "web" }
392
+ mw = Middleware.new(filter: only_web)
393
+
394
+ generated = []
395
+ m.resources.each do |resource|
396
+ mw.filter(resource) do
397
+ generated << Kube::Cluster["ConfigMap"].new {
398
+ metadata.name = "generated-for-#{resource.to_h.dig(:metadata, :name)}"
354
399
  }
355
400
  end
356
- stack.call(m)
357
-
358
- m.resources[0].to_h.dig(:metadata, :labels, :custom).should == "from-build"
359
- m.resources[1].to_h.dig(:metadata, :labels, :custom).should.be.nil
360
- end
361
-
362
- it "build_returns_a_class" do
363
- klass = Middleware.build { |manifest| }
364
-
365
- klass.should.be.kind_of(Class)
366
- (klass < Middleware).should == true
367
401
  end
402
+ m.resources.concat(generated)
368
403
 
369
- it "build_noop_base_class_without_block" do
370
- m = manifest(Kube::Cluster["ConfigMap"].new { metadata.name = "test" })
371
- original = m.resources.first.to_h.dup
372
-
373
- Middleware.new.call(m)
374
-
375
- m.resources.first.to_h.should == original
376
- end
404
+ m.resources.size.should == 3
405
+ m.resources.last.to_h.dig(:metadata, :name).should == "generated-for-web"
406
+ end
377
407
 
378
- # --- filter in a generative middleware (each pattern) -----------------------
379
-
380
- it "filter_with_generative_middleware_skips_non_matching" do
381
- m = manifest(
382
- Kube::Cluster["Deployment"].new {
383
- metadata.name = "web"
384
- metadata.labels = { "app.kubernetes.io/name": "web" }
385
- },
386
- Kube::Cluster["Deployment"].new {
387
- metadata.name = "worker"
388
- metadata.labels = { "app.kubernetes.io/name": "worker" }
389
- },
390
- )
391
-
392
- only_web = ->(r) { r.label("app.kubernetes.io/name") == "web" }
393
- mw = Middleware.new(filter: only_web)
394
-
395
- generated = []
396
- m.resources.each do |resource|
397
- mw.filter(resource) do
398
- generated << Kube::Cluster["ConfigMap"].new {
399
- metadata.name = "generated-for-#{resource.to_h.dig(:metadata, :name)}"
400
- }
401
- end
402
- end
403
- m.resources.concat(generated)
408
+ private
404
409
 
405
- m.resources.size.should == 3
406
- m.resources.last.to_h.dig(:metadata, :name).should == "generated-for-web"
410
+ def manifest(*resources)
411
+ m = Kube::Cluster::Manifest.new
412
+ resources.each { |r| m << r }
413
+ m
407
414
  end
408
-
409
- private
410
-
411
- def manifest(*resources)
412
- m = Kube::Cluster::Manifest.new
413
- resources.each { |r| m << r }
414
- m
415
- end
416
- end