Skip to content

Commit f586ae9

Browse files
author
root
committed
Added tuned defer test for service service
Signed-off-by: Sargun Narula <snarula@redhat.com>
1 parent df3b43e commit f586ae9

File tree

1 file changed

+93
-34
lines changed

1 file changed

+93
-34
lines changed

test/e2e/performanceprofile/functests/2_performance_update/tuned_deferred.go

Lines changed: 93 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -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

3643
var _ = 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

318375
func 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

340397
func 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

Comments
 (0)