Skip to content

Commit 1d949ed

Browse files
pooknullhors
andauthored
K8SPS-414: add imagePullSecrets to the cr.yaml (#921)
* K8SPS-414: add `imagePullSecrets` to the `cr.yaml` https://perconadev.atlassian.net/browse/K8SPS-414 * K8SPS-415: add `runtimeClassName` to the `cr.yaml` https://perconadev.atlassian.net/browse/K8SPS-415 * K8SPS-416: add tolerations to the `cr.yaml` https://perconadev.atlassian.net/browse/K8SPS-416 * fix manifests * small fixes * update mysql, router, xtrabackup tests * delete haproxy and orchestrator unit-tests before merge * update unit-test * fix lint --------- Co-authored-by: Viacheslav Sarzhan <slava.sarzhan@percona.com>
1 parent e85543f commit 1d949ed

19 files changed

+800
-88
lines changed

api/v1alpha1/perconaservermysql_types.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,6 @@ type PMMSpec struct {
217217
Resources corev1.ResourceRequirements `json:"resources,omitempty"`
218218
ContainerSecurityContext *corev1.SecurityContext `json:"containerSecurityContext,omitempty"`
219219
ImagePullPolicy corev1.PullPolicy `json:"imagePullPolicy,omitempty"`
220-
RuntimeClassName *string `json:"runtimeClassName,omitempty"`
221220
}
222221

223222
type BackupSpec struct {

api/v1alpha1/zz_generated.deepcopy.go

Lines changed: 0 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config/crd/bases/ps.percona.com_perconaservermysqls.yaml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6450,8 +6450,6 @@ spec:
64506450
x-kubernetes-int-or-string: true
64516451
type: object
64526452
type: object
6453-
runtimeClassName:
6454-
type: string
64556453
serverHost:
64566454
type: string
64576455
required:

deploy/bundle.yaml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8373,8 +8373,6 @@ spec:
83738373
x-kubernetes-int-or-string: true
83748374
type: object
83758375
type: object
8376-
runtimeClassName:
8377-
type: string
83788376
serverHost:
83798377
type: string
83808378
required:

deploy/cr.yaml

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,15 @@ spec:
4141
autoRecovery: true
4242
image: perconalab/percona-server-mysql-operator:main-psmysql
4343
imagePullPolicy: Always
44+
# runtimeClassName: image-rc
45+
# tolerations:
46+
# - key: "node.alpha.kubernetes.io/unreachable"
47+
# operator: "Exists"
48+
# effect: "NoExecute"
49+
# tolerationSeconds: 6000
50+
# imagePullSecrets:
51+
# - "secret-1"
52+
# - "secret-2"
4453
# initImage: perconalab/percona-server-mysql-operator:main
4554
size: 3
4655

@@ -156,6 +165,15 @@ spec:
156165

157166
image: perconalab/percona-server-mysql-operator:main-haproxy
158167
imagePullPolicy: Always
168+
# runtimeClassName: image-rc
169+
# tolerations:
170+
# - key: "node.alpha.kubernetes.io/unreachable"
171+
# operator: "Exists"
172+
# effect: "NoExecute"
173+
# tolerationSeconds: 6000
174+
# imagePullSecrets:
175+
# - "secret-1"
176+
# - "secret-2"
159177

160178
resources:
161179
requests:
@@ -265,6 +283,15 @@ spec:
265283
enabled: false
266284
image: perconalab/percona-server-mysql-operator:main-router
267285
imagePullPolicy: Always
286+
# runtimeClassName: image-rc
287+
# tolerations:
288+
# - key: "node.alpha.kubernetes.io/unreachable"
289+
# operator: "Exists"
290+
# effect: "NoExecute"
291+
# tolerationSeconds: 6000
292+
# imagePullSecrets:
293+
# - "secret-1"
294+
# - "secret-2"
268295
# initImage: perconalab/percona-server-mysql-operator:main
269296

270297
size: 3
@@ -320,6 +347,15 @@ spec:
320347

321348
image: perconalab/percona-server-mysql-operator:main-orchestrator
322349
imagePullPolicy: Always
350+
# runtimeClassName: image-rc
351+
# tolerations:
352+
# - key: "node.alpha.kubernetes.io/unreachable"
353+
# operator: "Exists"
354+
# effect: "NoExecute"
355+
# tolerationSeconds: 6000
356+
# imagePullSecrets:
357+
# - "secret-1"
358+
# - "secret-2"
323359
# serviceAccountName: percona-server-mysql-operator-orchestrator
324360
# initImage: perconalab/percona-server-mysql-operator:main
325361

@@ -394,6 +430,9 @@ spec:
394430
# storageName: s3
395431
# backoffLimit: 6
396432
imagePullPolicy: Always
433+
# imagePullSecrets:
434+
# - "secret-1"
435+
# - "secret-2"
397436
# initImage: perconalab/percona-server-mysql-operator:main
398437
# containerSecurityContext:
399438
# privileged: true
@@ -447,6 +486,7 @@ spec:
447486
# podSecurityContext:
448487
# fsGroup: 1001
449488
# supplementalGroups: [1001, 1002, 1003]
489+
# runtimeClassName: image-rc
450490
s3:
451491
bucket: S3-BACKUP-BUCKET-NAME-HERE
452492
credentialsSecret: cluster1-s3-credentials

deploy/crd.yaml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8373,8 +8373,6 @@ spec:
83738373
x-kubernetes-int-or-string: true
83748374
type: object
83758375
type: object
8376-
runtimeClassName:
8377-
type: string
83788376
serverHost:
83798377
type: string
83808378
required:

deploy/cw-bundle.yaml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8373,8 +8373,6 @@ spec:
83738373
x-kubernetes-int-or-string: true
83748374
type: object
83758375
type: object
8376-
runtimeClassName:
8377-
type: string
83788376
serverHost:
83798377
type: string
83808378
required:

pkg/haproxy/haproxy.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,8 +159,9 @@ func StatefulSet(cr *apiv1alpha1.PerconaServerMySQL, initImage, configHash, tlsH
159159
Annotations: annotations,
160160
},
161161
Spec: corev1.PodSpec{
162-
NodeSelector: cr.Spec.Proxy.HAProxy.NodeSelector,
163-
Tolerations: cr.Spec.Proxy.HAProxy.Tolerations,
162+
NodeSelector: cr.Spec.Proxy.HAProxy.NodeSelector,
163+
Tolerations: cr.Spec.Proxy.HAProxy.Tolerations,
164+
RuntimeClassName: cr.Spec.Proxy.HAProxy.RuntimeClassName,
164165
InitContainers: []corev1.Container{
165166
k8s.InitContainer(
166167
AppName,

pkg/haproxy/haproxy_test.go

Lines changed: 114 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -4,55 +4,133 @@ import (
44
"testing"
55

66
"github.com/stretchr/testify/assert"
7+
corev1 "k8s.io/api/core/v1"
78
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
9+
"k8s.io/utils/ptr"
810

9-
apiv1alpha1 "github.com/percona/percona-server-mysql-operator/api/v1alpha1"
10-
"github.com/percona/percona-server-mysql-operator/pkg/naming"
11+
"github.com/percona/percona-server-mysql-operator/pkg/platform"
12+
"github.com/percona/percona-server-mysql-operator/pkg/version"
1113
)
1214

13-
func TestStatefulSet(t *testing.T) {
14-
configHash := "123abc"
15-
tlsHash := "123abc"
16-
initImage := "percona/init:latest"
15+
func TestStatefulset(t *testing.T) {
16+
const ns = "haproxy-ns"
17+
const initImage = "init-image"
18+
const configHash = "config-hash"
19+
const tlsHash = "tls-hash"
1720

18-
cr := &apiv1alpha1.PerconaServerMySQL{
21+
cr := readDefaultCluster(t, "cluster", ns)
22+
if err := cr.CheckNSetDefaults(t.Context(), &platform.ServerVersion{
23+
Platform: platform.PlatformKubernetes,
24+
}); err != nil {
25+
t.Fatal(err)
26+
}
27+
28+
secret := &corev1.Secret{
1929
ObjectMeta: metav1.ObjectMeta{
20-
Name: "cluster1",
21-
Namespace: "test-ns",
22-
},
23-
Spec: apiv1alpha1.PerconaServerMySQLSpec{
24-
Proxy: apiv1alpha1.ProxySpec{HAProxy: &apiv1alpha1.HAProxySpec{
25-
Enabled: true,
26-
PodSpec: apiv1alpha1.PodSpec{
27-
Size: 3,
28-
TerminationGracePeriodSeconds: pointerInt64(30),
29-
},
30-
}},
30+
Name: "some-secret",
31+
Namespace: ns,
3132
},
33+
StringData: map[string]string{},
3234
}
3335

34-
sts := StatefulSet(cr, initImage, configHash, tlsHash, nil)
36+
t.Run("object meta", func(t *testing.T) {
37+
cluster := cr.DeepCopy()
3538

36-
assert.NotNil(t, sts)
37-
assert.Equal(t, "cluster1-haproxy", sts.Name)
38-
assert.Equal(t, "test-ns", sts.Namespace)
39-
assert.Equal(t, int32(3), *sts.Spec.Replicas)
39+
sts := StatefulSet(cluster, initImage, configHash, tlsHash, secret)
4040

41-
actualTLSAnn, ok := sts.Spec.Template.Annotations[string(naming.AnnotationTLSHash)]
42-
assert.True(t, ok)
43-
assert.Equal(t, tlsHash, actualTLSAnn)
41+
assert.NotNil(t, sts)
42+
assert.Equal(t, "cluster-haproxy", sts.Name)
43+
assert.Equal(t, "haproxy-ns", sts.Namespace)
44+
labels := map[string]string{
45+
"app.kubernetes.io/name": "haproxy",
46+
"app.kubernetes.io/part-of": "percona-server",
47+
"app.kubernetes.io/version": "v" + version.Version(),
48+
"app.kubernetes.io/instance": "cluster",
49+
"app.kubernetes.io/managed-by": "percona-server-mysql-operator",
50+
"app.kubernetes.io/component": "proxy",
51+
}
52+
assert.Equal(t, labels, sts.Labels)
53+
})
4454

45-
actualConfigAnn, ok := sts.Spec.Template.Annotations[string(naming.AnnotationConfigHash)]
46-
assert.True(t, ok)
47-
assert.Equal(t, configHash, actualConfigAnn)
55+
t.Run("defaults", func(t *testing.T) {
56+
cluster := cr.DeepCopy()
4857

49-
initContainers := sts.Spec.Template.Spec.InitContainers
50-
assert.Len(t, initContainers, 1)
51-
assert.Equal(t, initImage, initContainers[0].Image)
58+
sts := StatefulSet(cluster, initImage, configHash, tlsHash, secret)
5259

53-
assert.Equal(t, pointerInt64(30), sts.Spec.Template.Spec.TerminationGracePeriodSeconds)
54-
}
60+
assert.Equal(t, int32(3), *sts.Spec.Replicas)
61+
initContainers := sts.Spec.Template.Spec.InitContainers
62+
assert.Len(t, initContainers, 1)
63+
assert.Equal(t, initImage, initContainers[0].Image)
64+
65+
assert.Equal(t, map[string]string{
66+
"percona.com/last-applied-tls": tlsHash,
67+
"percona.com/configuration-hash": configHash,
68+
}, sts.Spec.Template.Annotations)
69+
})
70+
71+
t.Run("termination grace period seconds", func(t *testing.T) {
72+
cluster := cr.DeepCopy()
73+
74+
cluster.Spec.Proxy.HAProxy.TerminationGracePeriodSeconds = nil
75+
sts := StatefulSet(cluster, initImage, configHash, tlsHash, secret)
76+
assert.Equal(t, int64(600), *sts.Spec.Template.Spec.TerminationGracePeriodSeconds)
77+
78+
cluster.Spec.Proxy.HAProxy.TerminationGracePeriodSeconds = ptr.To(int64(30))
79+
80+
sts = StatefulSet(cluster, initImage, configHash, tlsHash, secret)
81+
assert.Equal(t, int64(30), *sts.Spec.Template.Spec.TerminationGracePeriodSeconds)
82+
})
83+
84+
t.Run("image pull secrets", func(t *testing.T) {
85+
cluster := cr.DeepCopy()
86+
87+
sts := StatefulSet(cluster, initImage, configHash, tlsHash, secret)
88+
assert.Equal(t, []corev1.LocalObjectReference(nil), sts.Spec.Template.Spec.ImagePullSecrets)
89+
90+
imagePullSecrets := []corev1.LocalObjectReference{
91+
{
92+
Name: "secret-1",
93+
},
94+
{
95+
Name: "secret-2",
96+
},
97+
}
98+
cluster.Spec.Proxy.HAProxy.ImagePullSecrets = imagePullSecrets
99+
100+
sts = StatefulSet(cluster, initImage, configHash, tlsHash, secret)
101+
assert.Equal(t, imagePullSecrets, sts.Spec.Template.Spec.ImagePullSecrets)
102+
})
103+
104+
t.Run("runtime class name", func(t *testing.T) {
105+
cluster := cr.DeepCopy()
106+
sts := StatefulSet(cluster, initImage, configHash, tlsHash, secret)
107+
var e *string
108+
assert.Equal(t, e, sts.Spec.Template.Spec.RuntimeClassName)
109+
110+
const runtimeClassName = "runtimeClassName"
111+
cluster.Spec.Proxy.HAProxy.RuntimeClassName = ptr.To(runtimeClassName)
112+
113+
sts = StatefulSet(cluster, initImage, configHash, tlsHash, secret)
114+
assert.Equal(t, runtimeClassName, *sts.Spec.Template.Spec.RuntimeClassName)
115+
})
116+
117+
t.Run("tolerations", func(t *testing.T) {
118+
cluster := cr.DeepCopy()
119+
sts := StatefulSet(cluster, initImage, configHash, tlsHash, secret)
120+
assert.Equal(t, []corev1.Toleration(nil), sts.Spec.Template.Spec.Tolerations)
121+
122+
tolerations := []corev1.Toleration{
123+
{
124+
Key: "node.alpha.kubernetes.io/unreachable",
125+
Operator: "Exists",
126+
Value: "value",
127+
Effect: "NoExecute",
128+
TolerationSeconds: ptr.To(int64(1001)),
129+
},
130+
}
131+
cluster.Spec.Proxy.HAProxy.Tolerations = tolerations
55132

56-
func pointerInt64(i int64) *int64 {
57-
return &i
133+
sts = StatefulSet(cluster, initImage, configHash, tlsHash, secret)
134+
assert.Equal(t, tolerations, sts.Spec.Template.Spec.Tolerations)
135+
})
58136
}

pkg/haproxy/helpers_test.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package haproxy
2+
3+
import (
4+
"os"
5+
"path/filepath"
6+
"testing"
7+
8+
"sigs.k8s.io/yaml"
9+
10+
apiv1alpha1 "github.com/percona/percona-server-mysql-operator/api/v1alpha1"
11+
)
12+
13+
func readDefaultCluster(t *testing.T, name, namespace string) *apiv1alpha1.PerconaServerMySQL {
14+
t.Helper()
15+
16+
cr := &apiv1alpha1.PerconaServerMySQL{}
17+
readDefaultFile(t, "cr.yaml", cr)
18+
19+
cr.Name = name
20+
cr.Namespace = namespace
21+
cr.Spec.InitImage = "init-image"
22+
return cr
23+
}
24+
25+
func readDefaultFile[T any](t *testing.T, filename string, obj *T) {
26+
t.Helper()
27+
28+
data, err := os.ReadFile(filepath.Join("..", "..", "deploy", filename))
29+
if err != nil {
30+
t.Fatal(err)
31+
}
32+
33+
if err := yaml.Unmarshal(data, obj); err != nil {
34+
t.Fatal(err)
35+
}
36+
}

0 commit comments

Comments
 (0)