forked from percona/percona-server-mongodb-operator
-
Notifications
You must be signed in to change notification settings - Fork 0
/
statefulset.go
144 lines (129 loc) · 3.65 KB
/
statefulset.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
package psmdb
import (
"fmt"
appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
api "github.com/percona/percona-server-mongodb-operator/pkg/apis/psmdb/v1"
"github.com/percona/percona-server-mongodb-operator/version"
)
// NewStatefulSet returns a StatefulSet object configured for a name
func NewStatefulSet(name, namespace string) *appsv1.StatefulSet {
return &appsv1.StatefulSet{
TypeMeta: metav1.TypeMeta{
APIVersion: "apps/v1",
Kind: "StatefulSet",
},
ObjectMeta: metav1.ObjectMeta{
Name: name,
Namespace: namespace,
},
}
}
var secretFileMode int32 = 288
// StatefulSpec returns spec for stateful set
// TODO: Unify Arbiter and Node. Shoudn't be 100500 parameters
func StatefulSpec(m *api.PerconaServerMongoDB, replset *api.ReplsetSpec, containerName string, ls map[string]string, multiAZ api.MultiAZ, size int32, ikeyName string, sv *version.ServerVersion) (appsv1.StatefulSetSpec, error) {
var fsgroup *int64
if sv.Platform == api.PlatformKubernetes {
var tp int64 = 1001
fsgroup = &tp
}
fvar := false
// TODO: do as the backup - serialize resources straight via cr.yaml
resources, err := CreateResources(replset.Resources)
if err != nil {
return appsv1.StatefulSetSpec{}, fmt.Errorf("resource creation: %v", err)
}
for k, v := range multiAZ.Labels {
if _, ok := ls[k]; !ok {
ls[k] = v
}
}
return appsv1.StatefulSetSpec{
ServiceName: m.Name + "-" + replset.Name,
Replicas: &size,
Selector: &metav1.LabelSelector{
MatchLabels: ls,
},
Template: corev1.PodTemplateSpec{
ObjectMeta: metav1.ObjectMeta{
Labels: ls,
Annotations: multiAZ.Annotations,
},
Spec: corev1.PodSpec{
Affinity: PodAffinity(multiAZ.Affinity, ls),
NodeSelector: multiAZ.NodeSelector,
Tolerations: multiAZ.Tolerations,
PriorityClassName: multiAZ.PriorityClassName,
RestartPolicy: corev1.RestartPolicyAlways,
ImagePullSecrets: m.Spec.ImagePullSecrets,
Containers: []corev1.Container{
container(m, replset, containerName, resources, fsgroup, ikeyName),
},
SecurityContext: &corev1.PodSecurityContext{
FSGroup: fsgroup,
},
Volumes: []corev1.Volume{
{
Name: ikeyName,
VolumeSource: corev1.VolumeSource{
Secret: &corev1.SecretVolumeSource{
DefaultMode: &secretFileMode,
SecretName: ikeyName,
Optional: &fvar,
},
},
},
},
},
},
}, nil
}
// PersistentVolumeClaim returns a Persistent Volume Claims for Mongod pod
func PersistentVolumeClaim(name, namespace string, spec *corev1.PersistentVolumeClaimSpec) corev1.PersistentVolumeClaim {
return corev1.PersistentVolumeClaim{
TypeMeta: metav1.TypeMeta{
Kind: "PersistentVolumeClaim",
APIVersion: "v1",
},
ObjectMeta: metav1.ObjectMeta{
Name: name,
Namespace: namespace,
},
Spec: *spec,
}
}
// PodAffinity returns podAffinity options for the pod
func PodAffinity(af *api.PodAffinity, labels map[string]string) *corev1.Affinity {
if af == nil {
return nil
}
switch {
case af.Advanced != nil:
return af.Advanced
case af.TopologyKey != nil:
if *af.TopologyKey == api.AffinityOff {
return nil
}
lablesCopy := make(map[string]string)
for k, v := range labels {
if k != "app.kubernetes.io/component" {
lablesCopy[k] = v
}
}
return &corev1.Affinity{
PodAntiAffinity: &corev1.PodAntiAffinity{
RequiredDuringSchedulingIgnoredDuringExecution: []corev1.PodAffinityTerm{
{
LabelSelector: &metav1.LabelSelector{
MatchLabels: lablesCopy,
},
TopologyKey: *af.TopologyKey,
},
},
},
}
}
return nil
}