Skip to content

Commit 15b33ac

Browse files
authored
Move namespace creation into a separate job. (#892)
It requires the frontend service, so now we have helm hooks preventing the services coming up until the schema job finishes namespace creation would cause a deadlock.
1 parent 3a4f6ab commit 15b33ac

5 files changed

Lines changed: 289 additions & 56 deletions

File tree

charts/temporal/ci/postgres-values.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,8 @@ server:
2222
connectProtocol: "tcp"
2323
user: temporal
2424
password: temporal
25+
namespaces:
26+
create: true
27+
namespace:
28+
- name: test
29+
retention: 1d

charts/temporal/templates/server-job.yaml

Lines changed: 1 addition & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -134,50 +134,7 @@ spec:
134134
{{- end }}
135135
{{- end }}
136136
{{- end }}
137-
{{- if $.Values.server.config.namespaces.create }}
138-
{{- range $namespace := $.Values.server.config.namespaces.namespace }}
139-
- name: create-{{ $namespace.name }}-namespace
140-
image: "{{ $.Values.admintools.image.repository }}:{{ $.Values.admintools.image.tag }}"
141-
imagePullPolicy: {{ $.Values.admintools.image.pullPolicy }}
142-
command: ['/bin/sh','-c']
143-
args: ['temporal operator namespace describe -n {{ $namespace.name }} || temporal operator namespace create -n {{ $namespace.name }}{{- if hasKey $namespace "retention" }} --retention {{ $namespace.retention }}{{- end }}']
144-
env:
145-
- name: TEMPORAL_ADDRESS
146-
{{- if (index $.Values.server "internal-frontend").enabled }}
147-
value: {{ include "temporal.fullname" $ }}-internal-frontend.{{ $.Release.Namespace }}.svc:{{ (index $.Values.server "internal-frontend").service.port }}
148-
{{- else if $.Values.server.frontend.ingress.enabled }}
149-
value: "{{ index $.Values.server.frontend.ingress.hosts 0 }}"
150-
{{- else }}
151-
value: "{{ include "temporal.fullname" $ }}-frontend.{{ $.Release.Namespace }}.svc:{{ $.Values.server.frontend.service.port }}"
152-
{{- end }}
153-
{{- with $.Values.admintools.additionalEnv }}
154-
{{- toYaml . | nindent 12 }}
155-
{{- end }}
156-
{{- if or $.Values.admintools.additionalEnvSecretName $.Values.admintools.additionalEnvConfigMapName }}
157-
envFrom:
158-
{{- with $.Values.admintools.additionalEnvSecretName }}
159-
- secretRef:
160-
name: {{ . }}
161-
{{- end }}
162-
{{- with $.Values.admintools.additionalEnvConfigMapName }}
163-
- configMapRef:
164-
name: {{ . }}
165-
{{- end }}
166-
{{- end }}
167-
{{- with $.Values.admintools.additionalVolumeMounts }}
168-
volumeMounts:
169-
{{- toYaml . | nindent 12 }}
170-
{{- end }}
171-
{{- with $.Values.schema.resources }}
172-
resources:
173-
{{- toYaml . | nindent 12 }}
174-
{{- end }}
175-
{{- with $.Values.schema.containerSecurityContext }}
176-
securityContext:
177-
{{- toYaml . | nindent 12 }}
178-
{{- end }}
179-
{{- end }}
180-
{{- end }}
137+
181138
containers:
182139
- name: done
183140
image: "{{ $.Values.admintools.image.repository }}:{{ $.Values.admintools.image.tag }}"
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
{{- if $.Values.server.config.namespaces.create }}
2+
{{- $jobName := include "temporal.componentname" (list $ (printf "namespace-%s-%d" $.Chart.Version $.Release.Revision | replace "." "-")) }}
3+
apiVersion: batch/v1
4+
kind: Job
5+
metadata:
6+
name: {{ $jobName }}
7+
labels:
8+
{{- include "temporal.resourceLabels" (list $ "database" "") | nindent 4 }}
9+
{{- with $.Values.schema.jobAnnotations }}
10+
annotations:
11+
{{- toYaml . | nindent 4 }}
12+
{{- end }}
13+
spec:
14+
backoffLimit: {{ $.Values.schema.backoffLimit }}
15+
ttlSecondsAfterFinished: {{ $.Values.schema.ttlSecondsAfterFinished }}
16+
template:
17+
metadata:
18+
name: {{ $jobName }}
19+
labels:
20+
{{- include "temporal.resourceLabels" (list $ "database" "") | nindent 8 }}
21+
{{- with $.Values.schema.podLabels }}
22+
{{- toYaml . | nindent 8 }}
23+
{{- end }}
24+
{{- with $.Values.schema.podAnnotations }}
25+
annotations:
26+
{{- toYaml . | nindent 8 }}
27+
{{- end }}
28+
spec:
29+
{{ include "temporal.serviceAccount" $ }}
30+
restartPolicy: OnFailure
31+
initContainers:
32+
{{- range $namespace := $.Values.server.config.namespaces.namespace }}
33+
- name: create-{{ $namespace.name }}-namespace
34+
image: "{{ $.Values.admintools.image.repository }}:{{ $.Values.admintools.image.tag }}"
35+
imagePullPolicy: {{ $.Values.admintools.image.pullPolicy }}
36+
command: ['/bin/sh', '-c']
37+
args: ['temporal operator namespace describe -n {{ $namespace.name }} || temporal operator namespace create -n {{ $namespace.name }}{{- if hasKey $namespace "retention" }} --retention {{ $namespace.retention }}{{- end }}']
38+
env:
39+
- name: TEMPORAL_ADDRESS
40+
{{- if (index $.Values.server "internal-frontend").enabled }}
41+
value: {{ include "temporal.fullname" $ }}-internal-frontend.{{ $.Release.Namespace }}.svc:{{ (index $.Values.server "internal-frontend").service.port }}
42+
{{- else if $.Values.server.frontend.ingress.enabled }}
43+
value: "{{ index $.Values.server.frontend.ingress.hosts 0 }}"
44+
{{- else }}
45+
value: "{{ include "temporal.fullname" $ }}-frontend.{{ $.Release.Namespace }}.svc:{{ $.Values.server.frontend.service.port }}"
46+
{{- end }}
47+
{{- with $.Values.admintools.additionalEnv }}
48+
{{- toYaml . | nindent 12 }}
49+
{{- end }}
50+
{{- if or $.Values.admintools.additionalEnvSecretName $.Values.admintools.additionalEnvConfigMapName }}
51+
envFrom:
52+
{{- with $.Values.admintools.additionalEnvSecretName }}
53+
- secretRef:
54+
name: {{ . }}
55+
{{- end }}
56+
{{- with $.Values.admintools.additionalEnvConfigMapName }}
57+
- configMapRef:
58+
name: {{ . }}
59+
{{- end }}
60+
{{- end }}
61+
{{- with $.Values.admintools.additionalVolumeMounts }}
62+
volumeMounts:
63+
{{- toYaml . | nindent 12 }}
64+
{{- end }}
65+
{{- with $.Values.schema.resources }}
66+
resources:
67+
{{- toYaml . | nindent 12 }}
68+
{{- end }}
69+
{{- with $.Values.schema.containerSecurityContext }}
70+
securityContext:
71+
{{- toYaml . | nindent 12 }}
72+
{{- end }}
73+
{{- end }}
74+
containers:
75+
- name: done
76+
image: "{{ $.Values.admintools.image.repository }}:{{ $.Values.admintools.image.tag }}"
77+
imagePullPolicy: {{ $.Values.admintools.image.pullPolicy }}
78+
command: ['sh', '-c', 'echo "Namespace setup completed"']
79+
{{- with $.Values.schema.resources }}
80+
resources:
81+
{{- toYaml . | nindent 12 }}
82+
{{- end }}
83+
{{- with $.Values.schema.containerSecurityContext }}
84+
securityContext:
85+
{{- toYaml . | nindent 12 }}
86+
{{- end }}
87+
{{- with $.Values.schema.securityContext }}
88+
securityContext:
89+
{{- toYaml . | nindent 8 }}
90+
{{- end }}
91+
{{- with $.Values.imagePullSecrets }}
92+
imagePullSecrets:
93+
{{- toYaml . | nindent 8 }}
94+
{{- end }}
95+
{{- with $.Values.admintools.nodeSelector }}
96+
nodeSelector:
97+
{{- toYaml . | nindent 8 }}
98+
{{- end }}
99+
{{- with $.Values.admintools.tolerations }}
100+
tolerations:
101+
{{- toYaml . | nindent 8 }}
102+
{{- end }}
103+
{{- with $.Values.admintools.additionalVolumes }}
104+
volumes:
105+
{{- toYaml . | nindent 8 }}
106+
{{- end }}
107+
{{- end }}

charts/temporal/tests/server_job_test.yaml

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,6 @@ tests:
6666
pluginName: mysql8
6767
connectAddr: "temporal-visibility:3306"
6868
databaseName: temporal_visibility
69-
namespaces:
70-
create: true
7169
admintools:
7270
additionalEnv:
7371
- name: MY_ENV_VAR
@@ -113,16 +111,6 @@ tests:
113111
- equal:
114112
path: spec.template.spec.initContainers[?(@.name=="manage-schema-visibility-store")].envFrom[1].configMapRef.name
115113
value: env-configmap
116-
# create-*-namespace containers
117-
- equal:
118-
path: spec.template.spec.initContainers[?(@.name=="create-default-namespace")].env[?(@.name=="MY_ENV_VAR")].value
119-
value: my-value
120-
- equal:
121-
path: spec.template.spec.initContainers[?(@.name=="create-default-namespace")].envFrom[0].secretRef.name
122-
value: env-secret
123-
- equal:
124-
path: spec.template.spec.initContainers[?(@.name=="create-default-namespace")].envFrom[1].configMapRef.name
125-
value: env-configmap
126114
- it: includes additional volumes
127115
set:
128116
server:
Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
suite: test server namespace job
2+
templates:
3+
- server-namespace-job.yaml
4+
tests:
5+
- it: does not create the namespace job when namespaces.create is false
6+
set:
7+
server:
8+
config:
9+
namespaces:
10+
create: false
11+
asserts:
12+
- hasDocuments:
13+
count: 0
14+
- it: creates the namespace job when namespaces.create is true
15+
set:
16+
server:
17+
config:
18+
namespaces:
19+
create: true
20+
namespace:
21+
- name: default
22+
retention: 3d
23+
asserts:
24+
- containsDocument:
25+
kind: Job
26+
apiVersion: batch/v1
27+
- it: creates an init container per namespace
28+
set:
29+
server:
30+
config:
31+
namespaces:
32+
create: true
33+
namespace:
34+
- name: default
35+
retention: 3d
36+
- name: my-namespace
37+
asserts:
38+
- equal:
39+
path: spec.template.spec.initContainers[0].name
40+
value: create-default-namespace
41+
- equal:
42+
path: spec.template.spec.initContainers[1].name
43+
value: create-my-namespace-namespace
44+
- it: sets TEMPORAL_ADDRESS to the frontend service by default
45+
set:
46+
server:
47+
config:
48+
namespaces:
49+
create: true
50+
namespace:
51+
- name: default
52+
asserts:
53+
- equal:
54+
path: spec.template.spec.initContainers[?(@.name=="create-default-namespace")].env[?(@.name=="TEMPORAL_ADDRESS")].value
55+
value: RELEASE-NAME-temporal-frontend.NAMESPACE.svc:7233
56+
- it: sets TEMPORAL_ADDRESS to the internal-frontend service when enabled
57+
set:
58+
server:
59+
internal-frontend:
60+
enabled: true
61+
config:
62+
namespaces:
63+
create: true
64+
namespace:
65+
- name: default
66+
asserts:
67+
- equal:
68+
path: spec.template.spec.initContainers[?(@.name=="create-default-namespace")].env[?(@.name=="TEMPORAL_ADDRESS")].value
69+
value: RELEASE-NAME-temporal-internal-frontend.NAMESPACE.svc:7236
70+
- it: includes additional environment variables
71+
set:
72+
server:
73+
config:
74+
namespaces:
75+
create: true
76+
namespace:
77+
- name: default
78+
admintools:
79+
additionalEnv:
80+
- name: MY_ENV_VAR
81+
value: my-value
82+
additionalEnvSecretName: env-secret
83+
additionalEnvConfigMapName: env-configmap
84+
asserts:
85+
- equal:
86+
path: spec.template.spec.initContainers[?(@.name=="create-default-namespace")].env[?(@.name=="MY_ENV_VAR")].value
87+
value: my-value
88+
- equal:
89+
path: spec.template.spec.initContainers[?(@.name=="create-default-namespace")].envFrom[0].secretRef.name
90+
value: env-secret
91+
- equal:
92+
path: spec.template.spec.initContainers[?(@.name=="create-default-namespace")].envFrom[1].configMapRef.name
93+
value: env-configmap
94+
- it: does not include Helm hook annotations
95+
set:
96+
server:
97+
config:
98+
namespaces:
99+
create: true
100+
namespace:
101+
- name: default
102+
asserts:
103+
- isNull:
104+
path: metadata.annotations["helm.sh/hook"]
105+
- it: sets backoffLimit and ttlSecondsAfterFinished from schema values
106+
set:
107+
server:
108+
config:
109+
namespaces:
110+
create: true
111+
namespace:
112+
- name: default
113+
schema:
114+
backoffLimit: 5
115+
ttlSecondsAfterFinished: 3600
116+
asserts:
117+
- equal:
118+
path: spec.backoffLimit
119+
value: 5
120+
- equal:
121+
path: spec.ttlSecondsAfterFinished
122+
value: 3600
123+
- it: includes custom annotations and labels for pod and job
124+
set:
125+
server:
126+
config:
127+
namespaces:
128+
create: true
129+
namespace:
130+
- name: default
131+
schema:
132+
jobAnnotations:
133+
custom-job-annotation: abc
134+
podAnnotations:
135+
custom-pod-annotation: def
136+
podLabels:
137+
custom-pod-label: ghi
138+
asserts:
139+
- equal:
140+
path: metadata.annotations.custom-job-annotation
141+
value: abc
142+
- equal:
143+
path: spec.template.metadata.annotations.custom-pod-annotation
144+
value: def
145+
- equal:
146+
path: spec.template.metadata.labels.custom-pod-label
147+
value: ghi
148+
- it: includes resource limits and requests on init containers
149+
set:
150+
server:
151+
config:
152+
namespaces:
153+
create: true
154+
namespace:
155+
- name: default
156+
schema:
157+
resources:
158+
requests:
159+
cpu: 12
160+
memory: 12Gi
161+
limits:
162+
cpu: 16
163+
memory: 16Gi
164+
asserts:
165+
- equal:
166+
path: spec.template.spec.initContainers[*].resources.requests.cpu
167+
value: 12
168+
- equal:
169+
path: spec.template.spec.initContainers[*].resources.requests.memory
170+
value: 12Gi
171+
- equal:
172+
path: spec.template.spec.initContainers[*].resources.limits.cpu
173+
value: 16
174+
- equal:
175+
path: spec.template.spec.initContainers[*].resources.limits.memory
176+
value: 16Gi

0 commit comments

Comments
 (0)