Skip to content

Commit 1475bc9

Browse files
committed
operator: support updating container env variables
1 parent d206e00 commit 1475bc9

File tree

4 files changed

+229
-109
lines changed

4 files changed

+229
-109
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
1616

1717
### Fixed
1818
- Not working update of replicaset roles
19+
- Not working update of container env vars
1920

2021
## [0.0.8] - 2020-12-16
2122

pkg/controller/role/role_controller.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,12 @@ func (r *ReconcileRole) Reconcile(request reconcile.Request) (reconcile.Result,
235235
}
236236
}
237237

238+
sts.Spec.Template.Spec.Containers[0].Env = template.Spec.Template.Spec.Containers[0].Env
239+
reqLogger.Info("Env variables", "vars", sts.Spec.Template.Spec.Containers[0].Env)
240+
if err := r.client.Update(context.TODO(), &sts); err != nil {
241+
return reconcile.Result{}, err
242+
}
243+
238244
if templateRolesToAssign, ok := template.ObjectMeta.Annotations["tarantool.io/rolesToAssign"]; ok {
239245
// check rolesToAssign from annotations
240246
if templateRolesToAssign != sts.ObjectMeta.Annotations["tarantool.io/rolesToAssign"] {

pkg/controller/role/role_test.go

Lines changed: 195 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
helpers "github.com/tarantool/tarantool-operator/test/helpers"
1212

1313
appsv1 "k8s.io/api/apps/v1"
14+
corev1 "k8s.io/api/core/v1"
1415
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1516

1617
tarantoolv1alpha1 "github.com/tarantool/tarantool-operator/pkg/apis/tarantool/v1alpha1"
@@ -22,75 +23,73 @@ var _ = Describe("role_controller unit testing", func() {
2223
var (
2324
namespace = "default"
2425
ctx = context.TODO()
26+
27+
roleName = "" // setup for every spec in hook
28+
rsTemplateName = ""
29+
stsName = ""
30+
31+
clusterId = "t"
32+
33+
defaultRolesToAssign = "[\"A\",\"B\"]"
34+
newRolesToAssign = "[\"A\",\"B\",\"C\"]"
2535
)
2636

27-
Describe("role_controller should react to the sts-template change and update the sts", func() {
28-
Context("update rolesToAssign annotation in sts-template", func() {
29-
var (
30-
roleName = "" // setup for every spec in hook
31-
rsTemplateName = ""
32-
stsName = ""
33-
34-
clusterId = "t"
35-
36-
defaultRolesToAssign = "[\"A\",\"B\"]"
37-
newRolesToAssign = "[\"A\",\"B\",\"C\"]"
38-
)
39-
40-
BeforeEach(func() {
41-
// setup variables for each spec
42-
roleName = fmt.Sprintf("test-role-%s", RandStringRunes(4))
43-
rsTemplateName = fmt.Sprintf("test-rs-%s", RandStringRunes(4))
44-
stsName = fmt.Sprintf("%s-%d", roleName, 0)
45-
46-
By("create new Role " + roleName)
47-
role := helpers.NewRole(helpers.RoleParams{
48-
Name: roleName,
49-
Namespace: namespace,
50-
RolesToAssign: defaultRolesToAssign,
51-
RsNum: int32(1),
52-
RsTemplateName: rsTemplateName,
53-
ClusterId: clusterId,
54-
})
55-
// mock owner reference
56-
role.SetOwnerReferences([]metav1.OwnerReference{
57-
{
58-
APIVersion: "v0",
59-
Kind: "mockRef",
60-
Name: "mockRef",
61-
UID: "-",
62-
},
63-
})
64-
Expect(k8sClient.Create(ctx, &role)).NotTo(HaveOccurred(), "failed to create Role")
65-
66-
By("create new ReplicasetTemplate " + rsTemplateName)
67-
rsTemplate := helpers.NewReplicasetTemplate(helpers.ReplicasetTemplateParams{
68-
Name: rsTemplateName,
69-
Namespace: namespace,
70-
RoleName: roleName,
71-
RolesToAssign: defaultRolesToAssign,
72-
})
73-
Expect(k8sClient.Create(ctx, &rsTemplate)).NotTo(HaveOccurred(), "failed to create ReplicasetTemplate")
74-
})
37+
BeforeEach(func() {
38+
// setup variables for each spec
39+
roleName = fmt.Sprintf("test-role-%s", RandStringRunes(4))
40+
rsTemplateName = fmt.Sprintf("test-rs-%s", RandStringRunes(4))
41+
stsName = fmt.Sprintf("%s-%d", roleName, 0)
7542

76-
AfterEach(func() {
77-
By("remove role object " + roleName)
78-
role := &tarantoolv1alpha1.Role{}
79-
Expect(
80-
k8sClient.Get(ctx, client.ObjectKey{Name: roleName, Namespace: namespace}, role),
81-
).NotTo(HaveOccurred(), "failed to get Role")
43+
By("create new Role " + roleName)
44+
role := helpers.NewRole(helpers.RoleParams{
45+
Name: roleName,
46+
Namespace: namespace,
47+
RolesToAssign: defaultRolesToAssign,
48+
RsNum: int32(1),
49+
RsTemplateName: rsTemplateName,
50+
ClusterId: clusterId,
51+
})
52+
// mock owner reference
53+
role.SetOwnerReferences([]metav1.OwnerReference{
54+
{
55+
APIVersion: "v0",
56+
Kind: "mockRef",
57+
Name: "mockRef",
58+
UID: "-",
59+
},
60+
})
61+
Expect(k8sClient.Create(ctx, &role)).NotTo(HaveOccurred(), "failed to create Role")
62+
63+
By("create new ReplicasetTemplate " + rsTemplateName)
64+
rsTemplate := helpers.NewReplicasetTemplate(helpers.ReplicasetTemplateParams{
65+
Name: rsTemplateName,
66+
Namespace: namespace,
67+
RoleName: roleName,
68+
RolesToAssign: defaultRolesToAssign,
69+
})
70+
Expect(k8sClient.Create(ctx, &rsTemplate)).NotTo(HaveOccurred(), "failed to create ReplicasetTemplate")
71+
})
8272

83-
Expect(k8sClient.Delete(ctx, role)).NotTo(HaveOccurred(), "failed to delete Role")
73+
AfterEach(func() {
74+
By("remove role object " + roleName)
75+
role := &tarantoolv1alpha1.Role{}
76+
Expect(
77+
k8sClient.Get(ctx, client.ObjectKey{Name: roleName, Namespace: namespace}, role),
78+
).NotTo(HaveOccurred(), "failed to get Role")
8479

85-
By("remove ReplicasetTemplate object " + rsTemplateName)
86-
rsTemplate := &tarantoolv1alpha1.ReplicasetTemplate{}
87-
Expect(
88-
k8sClient.Get(ctx, client.ObjectKey{Name: rsTemplateName, Namespace: namespace}, rsTemplate),
89-
)
80+
Expect(k8sClient.Delete(ctx, role)).NotTo(HaveOccurred(), "failed to delete Role")
9081

91-
Expect(k8sClient.Delete(ctx, rsTemplate)).NotTo(HaveOccurred(), "failed to delete Role")
92-
})
82+
By("remove ReplicasetTemplate object " + rsTemplateName)
83+
rsTemplate := &tarantoolv1alpha1.ReplicasetTemplate{}
84+
Expect(
85+
k8sClient.Get(ctx, client.ObjectKey{Name: rsTemplateName, Namespace: namespace}, rsTemplate),
86+
)
9387

88+
Expect(k8sClient.Delete(ctx, rsTemplate)).NotTo(HaveOccurred(), "failed to delete Role")
89+
})
90+
91+
Describe("role_controller should react to the sts-template change and update the sts", func() {
92+
Context("update rolesToAssign annotation in sts-template", func() {
9493
It("set rolesToAssign by creating sts", func() {
9594
By("get sts")
9695
sts := &appsv1.StatefulSet{}
@@ -150,5 +149,139 @@ var _ = Describe("role_controller unit testing", func() {
150149
).Should(BeTrue())
151150
})
152151
})
152+
153+
Context("update env variables in container template", func() {
154+
It("update existed variable", func() {
155+
By("update MEMTX_MEMORY value in ReplicasetTemplate")
156+
var (
157+
value = "300000"
158+
)
159+
160+
rsTemplate := &tarantoolv1alpha1.ReplicasetTemplate{}
161+
Expect(
162+
k8sClient.Get(ctx, client.ObjectKey{Name: rsTemplateName, Namespace: namespace}, rsTemplate),
163+
).NotTo(HaveOccurred(), "failed to get ReplicasetTemplate")
164+
165+
vars := rsTemplate.Spec.Template.Spec.Containers[0].Env
166+
for i := range vars {
167+
if vars[i].Name == "TARANTOOL_MEMTX_MEMORY" {
168+
vars[i].Value = value
169+
break
170+
}
171+
}
172+
173+
Expect(
174+
k8sClient.Update(ctx, rsTemplate),
175+
).NotTo(HaveOccurred(), "failed to update ReplicasetTemplate")
176+
177+
By("check that the TARANTOOL_MEMTX_MEMORY in sts")
178+
sts := &appsv1.StatefulSet{}
179+
Eventually(
180+
func() bool {
181+
err := k8sClient.Get(ctx, client.ObjectKey{Name: stsName, Namespace: namespace}, sts)
182+
if err != nil {
183+
return false
184+
}
185+
186+
for _, env := range sts.Spec.Template.Spec.Containers[0].Env {
187+
if env.Name == "TARANTOOL_MEMTX_MEMORY" && env.Value == value {
188+
return true
189+
}
190+
}
191+
192+
return false
193+
},
194+
time.Second*10, time.Millisecond*500,
195+
).Should(BeTrue())
196+
})
197+
198+
It("add new variable", func() {
199+
By("add new env variable in ReplicasetTemplate")
200+
var (
201+
newVarName = "NEW_NAME"
202+
newVarValue = "NEW_VALUE"
203+
)
204+
205+
rsTemplate := &tarantoolv1alpha1.ReplicasetTemplate{}
206+
Expect(
207+
k8sClient.Get(ctx, client.ObjectKey{Name: rsTemplateName, Namespace: namespace}, rsTemplate),
208+
).NotTo(HaveOccurred(), "failed to get ReplicasetTemplate")
209+
210+
rsTemplate.Spec.Template.Spec.Containers[0].Env = append(
211+
rsTemplate.Spec.Template.Spec.Containers[0].Env,
212+
corev1.EnvVar{Name: newVarName, Value: newVarValue},
213+
)
214+
215+
Expect(
216+
k8sClient.Update(ctx, rsTemplate),
217+
).NotTo(HaveOccurred(), "failed to update ReplicasetTemplate")
218+
219+
By("check that the new env variable in sts")
220+
sts := &appsv1.StatefulSet{}
221+
Eventually(
222+
func() bool {
223+
err := k8sClient.Get(ctx, client.ObjectKey{Name: stsName, Namespace: namespace}, sts)
224+
if err != nil {
225+
return false
226+
}
227+
228+
for _, env := range sts.Spec.Template.Spec.Containers[0].Env {
229+
if env.Name == newVarName && env.Value == newVarValue {
230+
return true
231+
}
232+
}
233+
234+
return false
235+
},
236+
time.Second*10, time.Millisecond*500,
237+
).Should(BeTrue())
238+
})
239+
240+
It("unset variable", func() {
241+
var (
242+
varName = "TARANTOOL_WORKDIR"
243+
)
244+
rsTemplate := &tarantoolv1alpha1.ReplicasetTemplate{}
245+
Expect(
246+
k8sClient.Get(ctx, client.ObjectKey{Name: rsTemplateName, Namespace: namespace}, rsTemplate),
247+
).NotTo(HaveOccurred(), "failed to get ReplicasetTemplate")
248+
249+
removeFromSlice := func(s []corev1.EnvVar, i int) []corev1.EnvVar {
250+
return append(s[:i], s[i+1:]...)
251+
}
252+
253+
for i, v := range rsTemplate.Spec.Template.Spec.Containers[0].Env {
254+
if v.Name == varName {
255+
rsTemplate.Spec.Template.Spec.Containers[0].Env = removeFromSlice(
256+
rsTemplate.Spec.Template.Spec.Containers[0].Env, i)
257+
break
258+
}
259+
}
260+
261+
Expect(
262+
k8sClient.Update(ctx, rsTemplate),
263+
).NotTo(HaveOccurred(), "failed to update ReplicasetTemplate")
264+
265+
By("check that the old env variable is not in sts")
266+
sts := &appsv1.StatefulSet{}
267+
Eventually(
268+
func() bool {
269+
err := k8sClient.Get(ctx, client.ObjectKey{Name: stsName, Namespace: namespace}, sts)
270+
if err != nil {
271+
return false
272+
}
273+
274+
for _, env := range sts.Spec.Template.Spec.Containers[0].Env {
275+
if env.Name == varName {
276+
return false
277+
}
278+
}
279+
280+
return true
281+
},
282+
time.Second*10, time.Millisecond*500,
283+
).Should(BeTrue())
284+
})
285+
})
153286
})
154287
})

0 commit comments

Comments
 (0)