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
@@ -61,82 +61,82 @@ module Kube
61
61
  end
62
62
  end
63
63
 
64
- test do
65
- Middleware = Kube::Cluster::Middleware
64
+ __END__
66
65
 
67
- it "adds_standard_labels" do
68
- m = manifest(Kube::Cluster["ConfigMap"].new { metadata.name = "test" })
66
+ Middleware = Kube::Cluster::Middleware
69
67
 
70
- Middleware::Labels.new(app: "web", managed_by: "kube_cluster").call(m)
71
- labels = m.resources.first.to_h.dig(:metadata, :labels)
68
+ it "adds_standard_labels" do
69
+ m = manifest(Kube::Cluster["ConfigMap"].new { metadata.name = "test" })
72
70
 
73
- labels[:"app.kubernetes.io/name"].should == "web"
74
- end
75
-
76
- it "maps_all_standard_keys" do
77
- m = manifest(Kube::Cluster["ConfigMap"].new { metadata.name = "test" })
71
+ Middleware::Labels.new(app: "web", managed_by: "kube_cluster").call(m)
72
+ labels = m.resources.first.to_h.dig(:metadata, :labels)
78
73
 
79
- Middleware::Labels.new(
80
- app: "web",
81
- instance: "my-release",
82
- version: "1.0.0",
83
- component: "frontend",
84
- part_of: "platform",
85
- managed_by: "kube_cluster",
86
- ).call(m)
74
+ labels[:"app.kubernetes.io/name"].should == "web"
75
+ end
87
76
 
88
- labels = m.resources.first.to_h.dig(:metadata, :labels)
77
+ it "maps_all_standard_keys" do
78
+ m = manifest(Kube::Cluster["ConfigMap"].new { metadata.name = "test" })
89
79
 
90
- labels[:"app.kubernetes.io/managed-by"].should == "kube_cluster"
91
- end
80
+ Middleware::Labels.new(
81
+ app: "web",
82
+ instance: "my-release",
83
+ version: "1.0.0",
84
+ component: "frontend",
85
+ part_of: "platform",
86
+ managed_by: "kube_cluster",
87
+ ).call(m)
92
88
 
93
- it "resource_labels_override_middleware_defaults" do
94
- m = manifest(Kube::Cluster["ConfigMap"].new {
95
- metadata.name = "test"
96
- metadata.labels = { "app.kubernetes.io/name": "override" }
97
- })
89
+ labels = m.resources.first.to_h.dig(:metadata, :labels)
98
90
 
99
- Middleware::Labels.new(app: "default").call(m)
100
- labels = m.resources.first.to_h.dig(:metadata, :labels)
91
+ labels[:"app.kubernetes.io/managed-by"].should == "kube_cluster"
92
+ end
101
93
 
102
- labels[:"app.kubernetes.io/name"].should == "override"
103
- end
94
+ it "resource_labels_override_middleware_defaults" do
95
+ m = manifest(Kube::Cluster["ConfigMap"].new {
96
+ metadata.name = "test"
97
+ metadata.labels = { "app.kubernetes.io/name": "override" }
98
+ })
104
99
 
105
- it "preserves_existing_labels" do
106
- m = manifest(Kube::Cluster["ConfigMap"].new {
107
- metadata.name = "test"
108
- metadata.labels = { custom: "value" }
109
- })
100
+ Middleware::Labels.new(app: "default").call(m)
101
+ labels = m.resources.first.to_h.dig(:metadata, :labels)
110
102
 
111
- Middleware::Labels.new(app: "web").call(m)
112
- labels = m.resources.first.to_h.dig(:metadata, :labels)
103
+ labels[:"app.kubernetes.io/name"].should == "override"
104
+ end
113
105
 
114
- labels[:custom].should == "value"
115
- end
106
+ it "preserves_existing_labels" do
107
+ m = manifest(Kube::Cluster["ConfigMap"].new {
108
+ metadata.name = "test"
109
+ metadata.labels = { custom: "value" }
110
+ })
116
111
 
117
- it "passes_through_non_standard_keys" do
118
- m = manifest(Kube::Cluster["ConfigMap"].new { metadata.name = "test" })
112
+ Middleware::Labels.new(app: "web").call(m)
113
+ labels = m.resources.first.to_h.dig(:metadata, :labels)
119
114
 
120
- Middleware::Labels.new(:"team.io/name" => "platform").call(m)
121
- labels = m.resources.first.to_h.dig(:metadata, :labels)
115
+ labels[:custom].should == "value"
116
+ end
122
117
 
123
- labels[:"team.io/name"].should == "platform"
124
- end
118
+ it "passes_through_non_standard_keys" do
119
+ m = manifest(Kube::Cluster["ConfigMap"].new { metadata.name = "test" })
125
120
 
126
- it "converts_values_to_strings" do
127
- m = manifest(Kube::Cluster["ConfigMap"].new { metadata.name = "test" })
121
+ Middleware::Labels.new(:"team.io/name" => "platform").call(m)
122
+ labels = m.resources.first.to_h.dig(:metadata, :labels)
128
123
 
129
- Middleware::Labels.new(version: 2).call(m)
130
- labels = m.resources.first.to_h.dig(:metadata, :labels)
124
+ labels[:"team.io/name"].should == "platform"
125
+ end
131
126
 
132
- labels[:"app.kubernetes.io/version"].should == "2"
133
- end
127
+ it "converts_values_to_strings" do
128
+ m = manifest(Kube::Cluster["ConfigMap"].new { metadata.name = "test" })
134
129
 
135
- private
130
+ Middleware::Labels.new(version: 2).call(m)
131
+ labels = m.resources.first.to_h.dig(:metadata, :labels)
136
132
 
137
- def manifest(*resources)
138
- m = Kube::Cluster::Manifest.new
139
- resources.each { |r| m << r }
140
- m
141
- end
133
+ labels[:"app.kubernetes.io/version"].should == "2"
142
134
  end
135
+
136
+ private
137
+
138
+ def manifest(*resources)
139
+ m = Kube::Cluster::Manifest.new
140
+ resources.each { |r| m << r }
141
+ m
142
+ end
@@ -63,125 +63,125 @@ module Kube
63
63
  end
64
64
  end
65
65
 
66
- test do
67
- Middleware = Kube::Cluster::Middleware
68
-
69
- it "injects_soft_anti_affinity_on_deployment" do
70
- m = manifest(Kube::Cluster["Deployment"].new {
71
- metadata.name = "web"
72
- spec.selector.matchLabels = { app: "web", instance: "prod" }
73
- spec.template.metadata.labels = { app: "web" }
74
- spec.template.spec.containers = [
75
- { name: "web", image: "nginx:latest" },
76
- ]
77
- })
78
-
79
- Middleware::PodAntiAffinity.new.call(m)
80
- affinity = m.resources.first.to_h.dig(:spec, :template, :spec, :affinity)
81
-
82
- paa = affinity.dig(:podAntiAffinity, :preferredDuringSchedulingIgnoredDuringExecution)
83
- paa.size.should == 1
84
- end
66
+ __END__
85
67
 
86
- it "custom_topology_key" do
87
- m = manifest(Kube::Cluster["Deployment"].new {
88
- metadata.name = "web"
89
- spec.selector.matchLabels = { app: "web" }
90
- spec.template.metadata.labels = { app: "web" }
91
- spec.template.spec.containers = [
92
- { name: "web", image: "nginx:latest" },
93
- ]
94
- })
68
+ Middleware = Kube::Cluster::Middleware
95
69
 
96
- Middleware::PodAntiAffinity.new(
97
- topology_key: "topology.kubernetes.io/zone",
98
- ).call(m)
70
+ it "injects_soft_anti_affinity_on_deployment" do
71
+ m = manifest(Kube::Cluster["Deployment"].new {
72
+ metadata.name = "web"
73
+ spec.selector.matchLabels = { app: "web", instance: "prod" }
74
+ spec.template.metadata.labels = { app: "web" }
75
+ spec.template.spec.containers = [
76
+ { name: "web", image: "nginx:latest" },
77
+ ]
78
+ })
99
79
 
100
- affinity = m.resources.first.to_h.dig(:spec, :template, :spec, :affinity)
101
- term = affinity.dig(:podAntiAffinity, :preferredDuringSchedulingIgnoredDuringExecution, 0)
80
+ Middleware::PodAntiAffinity.new.call(m)
81
+ affinity = m.resources.first.to_h.dig(:spec, :template, :spec, :affinity)
102
82
 
103
- term.dig(:podAffinityTerm, :topologyKey).should == "topology.kubernetes.io/zone"
104
- end
83
+ paa = affinity.dig(:podAntiAffinity, :preferredDuringSchedulingIgnoredDuringExecution)
84
+ paa.size.should == 1
85
+ end
105
86
 
106
- it "custom_weight" do
107
- m = manifest(Kube::Cluster["Deployment"].new {
108
- metadata.name = "web"
109
- spec.selector.matchLabels = { app: "web" }
110
- spec.template.metadata.labels = { app: "web" }
111
- spec.template.spec.containers = [
112
- { name: "web", image: "nginx:latest" },
113
- ]
114
- })
115
-
116
- Middleware::PodAntiAffinity.new(weight: 100).call(m)
117
- term = m.resources.first.to_h.dig(:spec, :template, :spec, :affinity,
118
- :podAntiAffinity, :preferredDuringSchedulingIgnoredDuringExecution, 0)
119
-
120
- term[:weight].should == 100
121
- end
87
+ it "custom_topology_key" do
88
+ m = manifest(Kube::Cluster["Deployment"].new {
89
+ metadata.name = "web"
90
+ spec.selector.matchLabels = { app: "web" }
91
+ spec.template.metadata.labels = { app: "web" }
92
+ spec.template.spec.containers = [
93
+ { name: "web", image: "nginx:latest" },
94
+ ]
95
+ })
122
96
 
123
- it "skips_resources_with_existing_affinity" do
124
- m = manifest(Kube::Cluster["Deployment"].new {
125
- metadata.name = "web"
126
- spec.selector.matchLabels = { app: "web" }
127
- spec.template.metadata.labels = { app: "web" }
128
- spec.template.spec.affinity = { nodeAffinity: { custom: true } }
129
- spec.template.spec.containers = [
130
- { name: "web", image: "nginx:latest" },
131
- ]
132
- })
133
-
134
- Middleware::PodAntiAffinity.new.call(m)
135
- affinity = m.resources.first.to_h.dig(:spec, :template, :spec, :affinity)
136
-
137
- affinity.should == { nodeAffinity: { custom: true } }
138
- end
97
+ Middleware::PodAntiAffinity.new(
98
+ topology_key: "topology.kubernetes.io/zone",
99
+ ).call(m)
139
100
 
140
- it "skips_non_pod_bearing_resources" do
141
- resource = Kube::Cluster["ConfigMap"].new { metadata.name = "config" }
142
- m = manifest(resource)
101
+ affinity = m.resources.first.to_h.dig(:spec, :template, :spec, :affinity)
102
+ term = affinity.dig(:podAntiAffinity, :preferredDuringSchedulingIgnoredDuringExecution, 0)
143
103
 
144
- Middleware::PodAntiAffinity.new.call(m)
104
+ term.dig(:podAffinityTerm, :topologyKey).should == "topology.kubernetes.io/zone"
105
+ end
145
106
 
146
- m.resources.first.to_h.should == resource.to_h
147
- end
107
+ it "custom_weight" do
108
+ m = manifest(Kube::Cluster["Deployment"].new {
109
+ metadata.name = "web"
110
+ spec.selector.matchLabels = { app: "web" }
111
+ spec.template.metadata.labels = { app: "web" }
112
+ spec.template.spec.containers = [
113
+ { name: "web", image: "nginx:latest" },
114
+ ]
115
+ })
116
+
117
+ Middleware::PodAntiAffinity.new(weight: 100).call(m)
118
+ term = m.resources.first.to_h.dig(:spec, :template, :spec, :affinity,
119
+ :podAntiAffinity, :preferredDuringSchedulingIgnoredDuringExecution, 0)
120
+
121
+ term[:weight].should == 100
122
+ end
148
123
 
149
- it "skips_resources_without_match_labels" do
150
- m = manifest(Kube::Cluster["Deployment"].new {
151
- metadata.name = "web"
152
- spec.template.metadata.labels = { app: "web" }
153
- spec.template.spec.containers = [
154
- { name: "web", image: "nginx:latest" },
155
- ]
156
- })
124
+ it "skips_resources_with_existing_affinity" do
125
+ m = manifest(Kube::Cluster["Deployment"].new {
126
+ metadata.name = "web"
127
+ spec.selector.matchLabels = { app: "web" }
128
+ spec.template.metadata.labels = { app: "web" }
129
+ spec.template.spec.affinity = { nodeAffinity: { custom: true } }
130
+ spec.template.spec.containers = [
131
+ { name: "web", image: "nginx:latest" },
132
+ ]
133
+ })
134
+
135
+ Middleware::PodAntiAffinity.new.call(m)
136
+ affinity = m.resources.first.to_h.dig(:spec, :template, :spec, :affinity)
137
+
138
+ affinity.should == { nodeAffinity: { custom: true } }
139
+ end
157
140
 
158
- Middleware::PodAntiAffinity.new.call(m)
159
- affinity = m.resources.first.to_h.dig(:spec, :template, :spec, :affinity)
141
+ it "skips_non_pod_bearing_resources" do
142
+ resource = Kube::Cluster["ConfigMap"].new { metadata.name = "config" }
143
+ m = manifest(resource)
160
144
 
161
- affinity.should.be.nil
162
- end
145
+ Middleware::PodAntiAffinity.new.call(m)
163
146
 
164
- it "applies_to_statefulset" do
165
- m = manifest(Kube::Cluster["StatefulSet"].new {
166
- metadata.name = "db"
167
- spec.selector.matchLabels = { app: "db" }
168
- spec.template.metadata.labels = { app: "db" }
169
- spec.template.spec.containers = [
170
- { name: "postgres", image: "postgres:16" },
171
- ]
172
- })
147
+ m.resources.first.to_h.should == resource.to_h
148
+ end
173
149
 
174
- Middleware::PodAntiAffinity.new.call(m)
175
- affinity = m.resources.first.to_h.dig(:spec, :template, :spec, :affinity)
150
+ it "skips_resources_without_match_labels" do
151
+ m = manifest(Kube::Cluster["Deployment"].new {
152
+ metadata.name = "web"
153
+ spec.template.metadata.labels = { app: "web" }
154
+ spec.template.spec.containers = [
155
+ { name: "web", image: "nginx:latest" },
156
+ ]
157
+ })
176
158
 
177
- affinity.dig(:podAntiAffinity).should.not.be.nil
178
- end
159
+ Middleware::PodAntiAffinity.new.call(m)
160
+ affinity = m.resources.first.to_h.dig(:spec, :template, :spec, :affinity)
179
161
 
180
- private
162
+ affinity.should.be.nil
163
+ end
181
164
 
182
- def manifest(*resources)
183
- m = Kube::Cluster::Manifest.new
184
- resources.each { |r| m << r }
185
- m
186
- end
165
+ it "applies_to_statefulset" do
166
+ m = manifest(Kube::Cluster["StatefulSet"].new {
167
+ metadata.name = "db"
168
+ spec.selector.matchLabels = { app: "db" }
169
+ spec.template.metadata.labels = { app: "db" }
170
+ spec.template.spec.containers = [
171
+ { name: "postgres", image: "postgres:16" },
172
+ ]
173
+ })
174
+
175
+ Middleware::PodAntiAffinity.new.call(m)
176
+ affinity = m.resources.first.to_h.dig(:spec, :template, :spec, :affinity)
177
+
178
+ affinity.dig(:podAntiAffinity).should.not.be.nil
187
179
  end
180
+
181
+ private
182
+
183
+ def manifest(*resources)
184
+ m = Kube::Cluster::Manifest.new
185
+ resources.each { |r| m << r }
186
+ m
187
+ end