kube_cluster 0.3.8 → 0.3.9
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 +4 -4
- data/Gemfile.lock +9 -5
- data/Rakefile +1 -1
- data/bin/test +2 -15
- data/kube_cluster.gemspec +3 -2
- data/lib/kube/cluster/manifest.rb +160 -193
- data/lib/kube/cluster/middleware/annotations.rb +43 -51
- data/lib/kube/cluster/middleware/hpa_for_deployment.rb +136 -158
- data/lib/kube/cluster/middleware/ingress_for_service.rb +84 -110
- data/lib/kube/cluster/middleware/labels.rb +60 -73
- data/lib/kube/cluster/middleware/namespace.rb +49 -55
- data/lib/kube/cluster/middleware/pod_anti_affinity.rb +102 -113
- data/lib/kube/cluster/middleware/resource_preset.rb +145 -169
- data/lib/kube/cluster/middleware/security_context.rb +127 -154
- data/lib/kube/cluster/middleware/service_for_deployment.rb +123 -146
- data/lib/kube/cluster/resource/dirty_tracking.rb +328 -418
- data/lib/kube/cluster/version.rb +1 -1
- data/lib/kube/cluster.rb +4 -9
- data/lib/kube/helm/chart.rb +326 -325
- data/lib/kube/helm/endpoint.rb +59 -65
- data/lib/kube/helm/repo.rb +159 -166
- metadata +7 -7
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
require "kube/cluster"
|
|
6
|
-
end
|
|
3
|
+
require "bundler/setup"
|
|
4
|
+
require "kube/cluster"
|
|
7
5
|
|
|
8
6
|
module Kube
|
|
9
7
|
module Cluster
|
|
@@ -63,93 +61,82 @@ module Kube
|
|
|
63
61
|
end
|
|
64
62
|
end
|
|
65
63
|
|
|
66
|
-
|
|
67
|
-
|
|
64
|
+
test do
|
|
65
|
+
Middleware = Kube::Cluster::Middleware
|
|
68
66
|
|
|
69
|
-
|
|
70
|
-
|
|
67
|
+
it "adds_standard_labels" do
|
|
68
|
+
m = manifest(Kube::Cluster["ConfigMap"].new { metadata.name = "test" })
|
|
71
69
|
|
|
72
|
-
|
|
73
|
-
|
|
70
|
+
Middleware::Labels.new(app: "web", managed_by: "kube_cluster").call(m)
|
|
71
|
+
labels = m.resources.first.to_h.dig(:metadata, :labels)
|
|
74
72
|
|
|
75
|
-
|
|
76
|
-
|
|
73
|
+
labels[:"app.kubernetes.io/name"].should == "web"
|
|
74
|
+
end
|
|
77
75
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
end
|
|
76
|
+
it "maps_all_standard_keys" do
|
|
77
|
+
m = manifest(Kube::Cluster["ConfigMap"].new { metadata.name = "test" })
|
|
81
78
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
part_of: "platform",
|
|
91
|
-
managed_by: "kube_cluster",
|
|
92
|
-
).call(m)
|
|
93
|
-
|
|
94
|
-
labels = m.resources.first.to_h.dig(:metadata, :labels)
|
|
95
|
-
|
|
96
|
-
assert_equal "web", labels[:"app.kubernetes.io/name"]
|
|
97
|
-
assert_equal "my-release", labels[:"app.kubernetes.io/instance"]
|
|
98
|
-
assert_equal "1.0.0", labels[:"app.kubernetes.io/version"]
|
|
99
|
-
assert_equal "frontend", labels[:"app.kubernetes.io/component"]
|
|
100
|
-
assert_equal "platform", labels[:"app.kubernetes.io/part-of"]
|
|
101
|
-
assert_equal "kube_cluster", labels[:"app.kubernetes.io/managed-by"]
|
|
102
|
-
end
|
|
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)
|
|
103
87
|
|
|
104
|
-
|
|
105
|
-
m = manifest(Kube::Cluster["ConfigMap"].new {
|
|
106
|
-
metadata.name = "test"
|
|
107
|
-
metadata.labels = { "app.kubernetes.io/name": "override" }
|
|
108
|
-
})
|
|
88
|
+
labels = m.resources.first.to_h.dig(:metadata, :labels)
|
|
109
89
|
|
|
110
|
-
|
|
111
|
-
|
|
90
|
+
labels[:"app.kubernetes.io/managed-by"].should == "kube_cluster"
|
|
91
|
+
end
|
|
112
92
|
|
|
113
|
-
|
|
114
|
-
|
|
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
|
+
})
|
|
115
98
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
metadata.name = "test"
|
|
119
|
-
metadata.labels = { custom: "value" }
|
|
120
|
-
})
|
|
99
|
+
Middleware::Labels.new(app: "default").call(m)
|
|
100
|
+
labels = m.resources.first.to_h.dig(:metadata, :labels)
|
|
121
101
|
|
|
122
|
-
|
|
123
|
-
|
|
102
|
+
labels[:"app.kubernetes.io/name"].should == "override"
|
|
103
|
+
end
|
|
124
104
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
105
|
+
it "preserves_existing_labels" do
|
|
106
|
+
m = manifest(Kube::Cluster["ConfigMap"].new {
|
|
107
|
+
metadata.name = "test"
|
|
108
|
+
metadata.labels = { custom: "value" }
|
|
109
|
+
})
|
|
128
110
|
|
|
129
|
-
|
|
130
|
-
|
|
111
|
+
Middleware::Labels.new(app: "web").call(m)
|
|
112
|
+
labels = m.resources.first.to_h.dig(:metadata, :labels)
|
|
131
113
|
|
|
132
|
-
|
|
133
|
-
|
|
114
|
+
labels[:custom].should == "value"
|
|
115
|
+
end
|
|
134
116
|
|
|
135
|
-
|
|
136
|
-
|
|
117
|
+
it "passes_through_non_standard_keys" do
|
|
118
|
+
m = manifest(Kube::Cluster["ConfigMap"].new { metadata.name = "test" })
|
|
137
119
|
|
|
138
|
-
|
|
139
|
-
|
|
120
|
+
Middleware::Labels.new(:"team.io/name" => "platform").call(m)
|
|
121
|
+
labels = m.resources.first.to_h.dig(:metadata, :labels)
|
|
140
122
|
|
|
141
|
-
|
|
142
|
-
|
|
123
|
+
labels[:"team.io/name"].should == "platform"
|
|
124
|
+
end
|
|
143
125
|
|
|
144
|
-
|
|
145
|
-
|
|
126
|
+
it "converts_values_to_strings" do
|
|
127
|
+
m = manifest(Kube::Cluster["ConfigMap"].new { metadata.name = "test" })
|
|
146
128
|
|
|
147
|
-
|
|
129
|
+
Middleware::Labels.new(version: 2).call(m)
|
|
130
|
+
labels = m.resources.first.to_h.dig(:metadata, :labels)
|
|
148
131
|
|
|
149
|
-
|
|
150
|
-
m = Kube::Cluster::Manifest.new
|
|
151
|
-
resources.each { |r| m << r }
|
|
152
|
-
m
|
|
153
|
-
end
|
|
132
|
+
labels[:"app.kubernetes.io/version"].should == "2"
|
|
154
133
|
end
|
|
134
|
+
|
|
135
|
+
private
|
|
136
|
+
|
|
137
|
+
def manifest(*resources)
|
|
138
|
+
m = Kube::Cluster::Manifest.new
|
|
139
|
+
resources.each { |r| m << r }
|
|
140
|
+
m
|
|
141
|
+
end
|
|
155
142
|
end
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
require "kube/cluster"
|
|
6
|
-
end
|
|
3
|
+
require "bundler/setup"
|
|
4
|
+
require "kube/cluster"
|
|
7
5
|
|
|
8
6
|
module Kube
|
|
9
7
|
module Cluster
|
|
@@ -35,78 +33,74 @@ module Kube
|
|
|
35
33
|
end
|
|
36
34
|
end
|
|
37
35
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
class NamespaceMiddlewareTest < Minitest::Test
|
|
42
|
-
Middleware = Kube::Cluster::Middleware
|
|
36
|
+
test do
|
|
37
|
+
Middleware = Kube::Cluster::Middleware
|
|
43
38
|
|
|
44
|
-
|
|
45
|
-
|
|
39
|
+
it "sets_namespace_on_configmap" do
|
|
40
|
+
m = manifest(Kube::Cluster["ConfigMap"].new { metadata.name = "test" })
|
|
46
41
|
|
|
47
|
-
|
|
42
|
+
Middleware::Namespace.new("production").call(m)
|
|
48
43
|
|
|
49
|
-
|
|
50
|
-
|
|
44
|
+
m.resources.first.to_h.dig(:metadata, :namespace).should == "production"
|
|
45
|
+
end
|
|
51
46
|
|
|
52
|
-
|
|
53
|
-
|
|
47
|
+
it "sets_namespace_on_deployment" do
|
|
48
|
+
m = manifest(Kube::Cluster["Deployment"].new { metadata.name = "web" })
|
|
54
49
|
|
|
55
|
-
|
|
50
|
+
Middleware::Namespace.new("staging").call(m)
|
|
56
51
|
|
|
57
|
-
|
|
58
|
-
|
|
52
|
+
m.resources.first.to_h.dig(:metadata, :namespace).should == "staging"
|
|
53
|
+
end
|
|
59
54
|
|
|
60
|
-
|
|
61
|
-
|
|
55
|
+
it "skips_namespace_resource" do
|
|
56
|
+
m = manifest(Kube::Cluster["Namespace"].new { metadata.name = "my-ns" })
|
|
62
57
|
|
|
63
|
-
|
|
58
|
+
Middleware::Namespace.new("production").call(m)
|
|
64
59
|
|
|
65
|
-
|
|
66
|
-
|
|
60
|
+
m.resources.first.to_h.dig(:metadata, :namespace).should.be.nil
|
|
61
|
+
end
|
|
67
62
|
|
|
68
|
-
|
|
69
|
-
|
|
63
|
+
it "skips_cluster_role" do
|
|
64
|
+
m = manifest(Kube::Cluster["ClusterRole"].new { metadata.name = "admin" })
|
|
70
65
|
|
|
71
|
-
|
|
66
|
+
Middleware::Namespace.new("production").call(m)
|
|
72
67
|
|
|
73
|
-
|
|
74
|
-
|
|
68
|
+
m.resources.first.to_h.dig(:metadata, :namespace).should.be.nil
|
|
69
|
+
end
|
|
75
70
|
|
|
76
|
-
|
|
77
|
-
|
|
71
|
+
it "skips_cluster_role_binding" do
|
|
72
|
+
m = manifest(Kube::Cluster["ClusterRoleBinding"].new { metadata.name = "admin-binding" })
|
|
78
73
|
|
|
79
|
-
|
|
74
|
+
Middleware::Namespace.new("production").call(m)
|
|
80
75
|
|
|
81
|
-
|
|
82
|
-
|
|
76
|
+
m.resources.first.to_h.dig(:metadata, :namespace).should.be.nil
|
|
77
|
+
end
|
|
83
78
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
79
|
+
it "overwrites_existing_namespace" do
|
|
80
|
+
m = manifest(Kube::Cluster["ConfigMap"].new {
|
|
81
|
+
metadata.name = "test"
|
|
82
|
+
metadata.namespace = "old"
|
|
83
|
+
})
|
|
89
84
|
|
|
90
|
-
|
|
85
|
+
Middleware::Namespace.new("new").call(m)
|
|
91
86
|
|
|
92
|
-
|
|
93
|
-
|
|
87
|
+
m.resources.first.to_h.dig(:metadata, :namespace).should == "new"
|
|
88
|
+
end
|
|
94
89
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
90
|
+
it "returns_new_resource_instance" do
|
|
91
|
+
resource = Kube::Cluster["ConfigMap"].new { metadata.name = "test" }
|
|
92
|
+
m = manifest(resource)
|
|
98
93
|
|
|
99
|
-
|
|
94
|
+
Middleware::Namespace.new("production").call(m)
|
|
100
95
|
|
|
101
|
-
|
|
102
|
-
|
|
96
|
+
resource.equal?(m.resources.first).should.be.false
|
|
97
|
+
end
|
|
103
98
|
|
|
104
|
-
|
|
99
|
+
private
|
|
105
100
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
end
|
|
101
|
+
def manifest(*resources)
|
|
102
|
+
m = Kube::Cluster::Manifest.new
|
|
103
|
+
resources.each { |r| m << r }
|
|
104
|
+
m
|
|
105
|
+
end
|
|
112
106
|
end
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
require "kube/cluster"
|
|
6
|
-
end
|
|
3
|
+
require "bundler/setup"
|
|
4
|
+
require "kube/cluster"
|
|
7
5
|
|
|
8
6
|
module Kube
|
|
9
7
|
module Cluster
|
|
@@ -65,134 +63,125 @@ module Kube
|
|
|
65
63
|
end
|
|
66
64
|
end
|
|
67
65
|
|
|
68
|
-
|
|
69
|
-
|
|
66
|
+
test do
|
|
67
|
+
Middleware = Kube::Cluster::Middleware
|
|
70
68
|
|
|
71
|
-
|
|
72
|
-
|
|
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
|
+
})
|
|
73
78
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
metadata.name = "web"
|
|
77
|
-
spec.selector.matchLabels = { app: "web", instance: "prod" }
|
|
78
|
-
spec.template.metadata.labels = { app: "web" }
|
|
79
|
-
spec.template.spec.containers = [
|
|
80
|
-
{ name: "web", image: "nginx:latest" },
|
|
81
|
-
]
|
|
82
|
-
})
|
|
79
|
+
Middleware::PodAntiAffinity.new.call(m)
|
|
80
|
+
affinity = m.resources.first.to_h.dig(:spec, :template, :spec, :affinity)
|
|
83
81
|
|
|
84
|
-
|
|
85
|
-
|
|
82
|
+
paa = affinity.dig(:podAntiAffinity, :preferredDuringSchedulingIgnoredDuringExecution)
|
|
83
|
+
paa.size.should == 1
|
|
84
|
+
end
|
|
86
85
|
|
|
87
|
-
|
|
88
|
-
|
|
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
|
+
})
|
|
89
95
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
assert_equal({ app: "web", instance: "prod" }, term.dig(:podAffinityTerm, :labelSelector, :matchLabels))
|
|
94
|
-
end
|
|
96
|
+
Middleware::PodAntiAffinity.new(
|
|
97
|
+
topology_key: "topology.kubernetes.io/zone",
|
|
98
|
+
).call(m)
|
|
95
99
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
metadata.name = "web"
|
|
99
|
-
spec.selector.matchLabels = { app: "web" }
|
|
100
|
-
spec.template.metadata.labels = { app: "web" }
|
|
101
|
-
spec.template.spec.containers = [
|
|
102
|
-
{ name: "web", image: "nginx:latest" },
|
|
103
|
-
]
|
|
104
|
-
})
|
|
100
|
+
affinity = m.resources.first.to_h.dig(:spec, :template, :spec, :affinity)
|
|
101
|
+
term = affinity.dig(:podAntiAffinity, :preferredDuringSchedulingIgnoredDuringExecution, 0)
|
|
105
102
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
).call(m)
|
|
103
|
+
term.dig(:podAffinityTerm, :topologyKey).should == "topology.kubernetes.io/zone"
|
|
104
|
+
end
|
|
109
105
|
|
|
110
|
-
|
|
111
|
-
|
|
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
|
|
112
122
|
|
|
113
|
-
|
|
114
|
-
|
|
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
|
|
115
139
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
spec.selector.matchLabels = { app: "web" }
|
|
120
|
-
spec.template.metadata.labels = { app: "web" }
|
|
121
|
-
spec.template.spec.containers = [
|
|
122
|
-
{ name: "web", image: "nginx:latest" },
|
|
123
|
-
]
|
|
124
|
-
})
|
|
125
|
-
|
|
126
|
-
Middleware::PodAntiAffinity.new(weight: 100).call(m)
|
|
127
|
-
term = m.resources.first.to_h.dig(:spec, :template, :spec, :affinity,
|
|
128
|
-
:podAntiAffinity, :preferredDuringSchedulingIgnoredDuringExecution, 0)
|
|
129
|
-
|
|
130
|
-
assert_equal 100, term[:weight]
|
|
131
|
-
end
|
|
140
|
+
it "skips_non_pod_bearing_resources" do
|
|
141
|
+
resource = Kube::Cluster["ConfigMap"].new { metadata.name = "config" }
|
|
142
|
+
m = manifest(resource)
|
|
132
143
|
|
|
133
|
-
|
|
134
|
-
m = manifest(Kube::Cluster["Deployment"].new {
|
|
135
|
-
metadata.name = "web"
|
|
136
|
-
spec.selector.matchLabels = { app: "web" }
|
|
137
|
-
spec.template.metadata.labels = { app: "web" }
|
|
138
|
-
spec.template.spec.affinity = { nodeAffinity: { custom: true } }
|
|
139
|
-
spec.template.spec.containers = [
|
|
140
|
-
{ name: "web", image: "nginx:latest" },
|
|
141
|
-
]
|
|
142
|
-
})
|
|
143
|
-
|
|
144
|
-
Middleware::PodAntiAffinity.new.call(m)
|
|
145
|
-
affinity = m.resources.first.to_h.dig(:spec, :template, :spec, :affinity)
|
|
146
|
-
|
|
147
|
-
assert_equal({ nodeAffinity: { custom: true } }, affinity)
|
|
148
|
-
end
|
|
144
|
+
Middleware::PodAntiAffinity.new.call(m)
|
|
149
145
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
m = manifest(resource)
|
|
146
|
+
m.resources.first.to_h.should == resource.to_h
|
|
147
|
+
end
|
|
153
148
|
|
|
154
|
-
|
|
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
|
+
})
|
|
155
157
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
+
Middleware::PodAntiAffinity.new.call(m)
|
|
159
|
+
affinity = m.resources.first.to_h.dig(:spec, :template, :spec, :affinity)
|
|
158
160
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
metadata.name = "web"
|
|
162
|
-
spec.template.metadata.labels = { app: "web" }
|
|
163
|
-
spec.template.spec.containers = [
|
|
164
|
-
{ name: "web", image: "nginx:latest" },
|
|
165
|
-
]
|
|
166
|
-
})
|
|
161
|
+
affinity.should.be.nil
|
|
162
|
+
end
|
|
167
163
|
|
|
168
|
-
|
|
169
|
-
|
|
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
|
+
})
|
|
170
173
|
|
|
171
|
-
|
|
172
|
-
|
|
174
|
+
Middleware::PodAntiAffinity.new.call(m)
|
|
175
|
+
affinity = m.resources.first.to_h.dig(:spec, :template, :spec, :affinity)
|
|
173
176
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
metadata.name = "db"
|
|
177
|
-
spec.selector.matchLabels = { app: "db" }
|
|
178
|
-
spec.template.metadata.labels = { app: "db" }
|
|
179
|
-
spec.template.spec.containers = [
|
|
180
|
-
{ name: "postgres", image: "postgres:16" },
|
|
181
|
-
]
|
|
182
|
-
})
|
|
177
|
+
affinity.dig(:podAntiAffinity).should.not.be.nil
|
|
178
|
+
end
|
|
183
179
|
|
|
184
|
-
|
|
185
|
-
affinity = m.resources.first.to_h.dig(:spec, :template, :spec, :affinity)
|
|
180
|
+
private
|
|
186
181
|
|
|
187
|
-
|
|
182
|
+
def manifest(*resources)
|
|
183
|
+
m = Kube::Cluster::Manifest.new
|
|
184
|
+
resources.each { |r| m << r }
|
|
185
|
+
m
|
|
188
186
|
end
|
|
189
|
-
|
|
190
|
-
private
|
|
191
|
-
|
|
192
|
-
def manifest(*resources)
|
|
193
|
-
m = Kube::Cluster::Manifest.new
|
|
194
|
-
resources.each { |r| m << r }
|
|
195
|
-
m
|
|
196
|
-
end
|
|
197
|
-
end
|
|
198
187
|
end
|