@@ -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