@@ -32,6 +32,13 @@ import (
3232 "github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/utils/profilesupdate"
3333 tunedutil "github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/utils/tuned"
3434)
35+ type TunedProfileConfig struct {
36+ DeferMode string
37+ ProfileChangeType string // "first-time" or "in-place"
38+ ExpectedBehavior string // "deferred" or "immediate"
39+ KernelSHMMNI string // 4096 or 8192
40+ ServiceStalld string // "start, enabled"
41+ }
3542
3643var _ = Describe ("Tuned Deferred tests of performance profile" , Ordered , Label (string (label .TunedDeferred )), func () {
3744 var (
@@ -42,13 +49,6 @@ var _ = Describe("Tuned Deferred tests of performance profile", Ordered, Label(s
4249 initialPolicy * string
4350 )
4451
45- type TunedProfileConfig struct {
46- DeferMode string
47- ProfileChangeType string // "first-time" or "in-place"
48- ExpectedBehavior string // "deferred" or "immediate"
49- KernelSHMMNI string // 4096 or 8192
50- }
51-
5252 name := "performance-patch"
5353
5454 BeforeAll (func () {
@@ -73,7 +73,7 @@ var _ = Describe("Tuned Deferred tests of performance profile", Ordered, Label(s
7373 Context ("Tuned Deferred status" , func () {
7474 DescribeTable ("Validate Tuned DeferMode behavior" ,
7575 func (tc TunedProfileConfig ) {
76-
76+ var data string
7777 if tc .ProfileChangeType == "first-time" {
7878 tuned = getTunedProfile (name )
7979
@@ -88,7 +88,12 @@ var _ = Describe("Tuned Deferred tests of performance profile", Ordered, Label(s
8888 return profile .Spec .Config .TunedProfile == "openshift-node-performance-performance"
8989 }, 2 * time .Minute , 10 * time .Second ).Should (BeTrue (), "Tuned profile deletion did not complete in time" )
9090 }
91- tuned , err = createTunedObject (tc .DeferMode , tc .KernelSHMMNI , name )
91+ if tc .KernelSHMMNI != "" {
92+ data = createTunedData (tc )
93+ } else if tc .ServiceStalld != "" {
94+ data = createTunedData (tc )
95+ }
96+ tuned , err = createTunedObject (tc .DeferMode , data , name )
9297 Expect (err ).NotTo (HaveOccurred ())
9398
9499 } else {
@@ -98,11 +103,19 @@ var _ = Describe("Tuned Deferred tests of performance profile", Ordered, Label(s
98103 cfg , err := ini .Load (tunedData )
99104 Expect (err ).ToNot (HaveOccurred ())
100105
101- sysctlSection , err := cfg .GetSection ("sysctl" )
102- Expect (err ).ToNot (HaveOccurred ())
106+ if tc .KernelSHMMNI != "" {
107+ sysctlSection , err := cfg .GetSection ("sysctl" )
108+ Expect (err ).ToNot (HaveOccurred ())
103109
104- sysctlSection .Key ("kernel.shmmni" ).SetValue (tc .KernelSHMMNI )
105- Expect (sysctlSection .Key ("kernel.shmmni" ).String ()).To (Equal (tc .KernelSHMMNI ))
110+ sysctlSection .Key ("kernel.shmmni" ).SetValue (tc .KernelSHMMNI )
111+ Expect (sysctlSection .Key ("kernel.shmmni" ).String ()).To (Equal (tc .KernelSHMMNI ))
112+ } else if tc .ServiceStalld != "" {
113+ serviceSection , err := cfg .GetSection ("service" )
114+ Expect (err ).ToNot (HaveOccurred ())
115+
116+ serviceSection .Key ("service.stalld" ).SetValue (tc .ServiceStalld )
117+ Expect (serviceSection .Key ("service.stalld" ).String ()).To (Equal (tc .ServiceStalld ))
118+ }
106119
107120 var updatedTunedData bytes.Buffer
108121 _ , err = cfg .WriteTo (& updatedTunedData )
@@ -121,15 +134,15 @@ var _ = Describe("Tuned Deferred tests of performance profile", Ordered, Label(s
121134
122135 switch tc .ExpectedBehavior {
123136 case "immediate" :
124- verifyImmediateApplication (tuned , workerCNFNodes , tc . KernelSHMMNI )
137+ verifyImmediateApplication (tuned , workerCNFNodes , tc )
125138 case "deferred" :
126139 Eventually (func () bool {
127140 result , err := verifyDeferredApplication (tuned , workerCNFNodes , name )
128141 Expect (err ).To (BeNil ())
129142 return result
130143 }, 1 * time .Minute , 5 * time .Second ).Should (BeTrue (), "Timed out checking deferred condition message" )
131144 rebootNode (poolName )
132- verifyImmediateApplication (tuned , workerCNFNodes , tc . KernelSHMMNI )
145+ verifyImmediateApplication (tuned , workerCNFNodes , tc )
133146 }
134147 },
135148 Entry ("[test_id:78115] Verify deferred Always with first-time profile change" , TunedProfileConfig {
@@ -168,6 +181,18 @@ var _ = Describe("Tuned Deferred tests of performance profile", Ordered, Label(s
168181 ExpectedBehavior : "immediate" ,
169182 KernelSHMMNI : "4096" ,
170183 }),
184+ Entry ("[test_id:78121] Verify deferred Always with first-time profile change - service plugin" , TunedProfileConfig {
185+ DeferMode : "always" ,
186+ ProfileChangeType : "first-time" ,
187+ ExpectedBehavior : "deferred" ,
188+ ServiceStalld : "start" ,
189+ }),
190+ Entry ("[test_id:78122] Verify deferred Always with in-place profile update - service plugin" , TunedProfileConfig {
191+ DeferMode : "always" ,
192+ ProfileChangeType : "in-place" ,
193+ ExpectedBehavior : "deferred" ,
194+ ServiceStalld : "start, enabled" ,
195+ }),
171196 )
172197 })
173198
@@ -229,19 +254,12 @@ func getTunedProfile(tunedName string) *tunedv1.Tuned {
229254 return matchedTuned
230255}
231256
232- func createTunedObject (deferMode string , KernelSHMMNI string , name string ) (* tunedv1.Tuned , error ) {
257+ func createTunedObject (deferMode string , data string , name string ) (* tunedv1.Tuned , error ) {
233258 GinkgoHelper ()
234259
235260 tunedName := name
236261 ns := components .NamespaceNodeTuningOperator
237262 priority := uint64 (19 )
238- data := fmt .Sprintf (`
239- [main]
240- summary=Configuration changes profile inherited from performance created tuned
241- include=openshift-node-performance-performance
242- [sysctl]
243- kernel.shmmni=%s
244- ` , KernelSHMMNI )
245263
246264 // Create a Tuned object
247265 tuned := & tunedv1.Tuned {
@@ -278,41 +296,80 @@ func createTunedObject(deferMode string, KernelSHMMNI string, name string) (*tun
278296 return tuned , nil
279297}
280298
281- func execSysctlOnWorkers (ctx context.Context , workerNodes []corev1.Node , sysctlMap map [string ]string ) {
299+ func createTunedData (tc TunedProfileConfig ) string {
300+ var data string
301+ switch {
302+ case tc .KernelSHMMNI != "" :
303+ data = fmt .Sprintf (`
304+ [main]
305+ summary=Configuration changes profile inherited from performance created tuned
306+ include=openshift-node-performance-performance
307+ [sysctl]
308+ kernel.shmmni=%s
309+ ` , tc .KernelSHMMNI )
310+
311+ case tc .ServiceStalld != "" :
312+ data = fmt .Sprintf (`
313+ [main]
314+ summary=Configuration changes profile inherited from performance created tuned
315+ include=openshift-node-performance-performance
316+ [service]
317+ service.stalld=%s
318+ ` , tc .ServiceStalld )
319+ return data
320+ }
321+ return data
322+ }
323+
324+ func verifyOnWorkers (ctx context.Context , workerNodes []corev1.Node , paramMap map [string ]string ) {
282325 GinkgoHelper ()
283326
284327 var err error
285328 var out []byte
286329 isSNO := false
287330 for _ , node := range workerNodes {
288- for param , expected := range sysctlMap {
331+ for param , expected := range paramMap {
289332 Eventually (func () bool {
290- By (fmt .Sprintf ("executing the command \" sysctl -n %s\" " , param ))
291- tunedCmd := []string {"/bin/sh" , "-c" , "chroot /host sysctl -a | grep shmmni" }
333+ var tunedCmd []string
334+ switch param {
335+ case "kernel.shmmni" :
336+ By (fmt .Sprintf ("Checking sysctl value of %s" , param ))
337+ tunedCmd = []string {"/bin/sh" , "-c" , fmt .Sprintf ("chroot /host sysctl -n %s" , param )}
338+ case "service.stalld" :
339+ expected = "active"
340+ By ("Checking if 'stalld' service is active" )
341+ // This will return "active" if stalld is running
342+ tunedCmd = []string {"/bin/sh" , "-c" , "chroot /host systemctl is-active stalld" }
343+ }
292344 tunedPod := nodes .TunedForNode (& node , isSNO )
293345 out , err = pods .WaitForPodOutput (ctx , testclient .K8sClient , tunedPod , tunedCmd )
294346 Expect (err ).ToNot (HaveOccurred ())
295- res := strings .TrimSpace (strings . SplitN ( string (out ), "=" , 2 )[ 1 ] )
347+ res := strings .TrimSpace (string (out ))
296348 if res != expected {
297- testlog .Errorf ("parameter %s value is not %s. " , out , expected )
349+ testlog .Errorf ("parameter %s returned '%s', expected '%s' " , param , res , expected )
298350 }
299351 return res == expected
300- }, 2 * time .Minute , 10 * time .Second ).Should (BeTrue (), "Timed out verifying kernel.shmmni on worker node" )
352+ }, 2 * time .Minute , 10 * time .Second ).Should (BeTrue (),
353+ fmt .Sprintf ("Timed out verifying %s on worker node %s" , param , node .Name ))
301354 }
302355 }
303356}
304357
305- func verifyImmediateApplication (tuned * tunedv1.Tuned , workerCNFNodes []corev1.Node , KernelSHMMNI string ) {
358+ func verifyImmediateApplication (tuned * tunedv1.Tuned , workerCNFNodes []corev1.Node , tc TunedProfileConfig ) {
306359 // Use Eventually to wait until the performance profile status is updated
307360 Eventually (func () bool {
308361 profile , _ := tunedutil .GetProfile (context .TODO (), testclient .ControlPlaneClient , components .NamespaceNodeTuningOperator , workerCNFNodes [0 ].Name )
309362 return profile .Spec .Config .TunedProfile == tuned .Name
310363 }, 2 * time .Minute , 10 * time .Second ).Should (BeTrue (), "Timed out waiting for profile.Spec.Config.TunedProfile to match tuned.Name" )
311364
312- sysctlMap := map [string ]string {
313- "kernel.shmmni" : KernelSHMMNI ,
365+ paramMap := make (map [string ]string )
366+ switch {
367+ case tc .KernelSHMMNI != "" :
368+ paramMap ["kernel.shmmni" ] = tc .KernelSHMMNI
369+ case tc .ServiceStalld != "" :
370+ paramMap ["service.stalld" ] = tc .ServiceStalld
314371 }
315- execSysctlOnWorkers (context .TODO (), workerCNFNodes , sysctlMap )
372+ verifyOnWorkers (context .TODO (), workerCNFNodes , paramMap )
316373}
317374
318375func verifyDeferredApplication (tuned * tunedv1.Tuned , workerCNFNodes []corev1.Node , name string ) (bool , error ) {
@@ -338,6 +395,7 @@ func verifyDeferredApplication(tuned *tunedv1.Tuned, workerCNFNodes []corev1.Nod
338395}
339396
340397func rebootNode (poolName string ) {
398+ fmt .Println ("\n \n \n \n Rebooting NODE" )
341399 profile , err := profiles .GetByNodeLabels (testutils .NodeSelectorLabels )
342400 if err != nil {
343401 testlog .Errorf ("Unable to fetch latest performance profile err: %v" , err )
@@ -364,3 +422,4 @@ func rebootNode(poolName string) {
364422 By (fmt .Sprintf ("Waiting when %s finishes updates" , poolName ))
365423 profilesupdate .WaitForTuningUpdated (context .TODO (), profile )
366424}
425+
0 commit comments