diff --git a/report.xml b/report.xml new file mode 100644 index 0000000000..24f49b409e --- /dev/null +++ b/report.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + > Enter [ReportAfterSuite] TOP-LEVEL - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/0_config/test_suite_performance_config_test.go:65 @ 05/18/26 14:51:55.882 < Exit [ReportAfterSuite] TOP-LEVEL - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/0_config/test_suite_performance_config_test.go:65 @ 05/18/26 14:51:55.882 (0s) + + + + + + + + + + + + + + + + + + + + + + + + + > Enter [BeforeSuite] TOP-LEVEL - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/5_latency_testing_suite_test.go:43 @ 05/18/26 14:52:28.078 STEP: verify if the isolated cpus value under the performance profile "performance" is appropriate for this test suite - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/5_latency_testing_suite_test.go:52 @ 05/18/26 14:52:28.183 May 18 14:52:28.208: [INFO]: current isolated cpus: 1-51,53-103, desired is 1-9 STEP: Update the isolated and reserved cpus sets of the profile - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/5_latency_testing_suite_test.go:72 @ 05/18/26 14:52:28.208 May 18 14:52:28.319: [INFO]: created namespace "testing-prepull" err=<nil> May 18 14:52:28.319: [INFO]: [Info] Environment '' is empty or not set May 18 14:52:28.319: [INFO]: pull timeout: 5m0s May 18 14:52:28.319: [INFO]: creating daemonset testing-prepull/prepullcnf-tests to prepull "quay.io/openshift-kni/cnf-tests:4.19" May 18 14:52:28.346: [INFO]: created daemonset testing-prepull/prepullcnf-tests to prepull "quay.io/openshift-kni/cnf-tests:4.19": {"metadata":{"name":"prepullcnf-tests","namespace":"testing-prepull","uid":"b5800975-3c43-44f4-8d13-96594aaa6b09","resourceVersion":"437416","generation":1,"creationTimestamp":"2026-05-18T11:52:28Z","annotations":{"deprecated.daemonset.template.generation":"1"},"managedFields":[{"manager":"5_latency_testing.test","operation":"Update","apiVersion":"apps/v1","time":"2026-05-18T11:52:28Z","fieldsType":"FieldsV1","fieldsV1":{"f:metadata":{"f:annotations":{".":{},"f:deprecated.daemonset.template.generation":{}}},"f:spec":{"f:revisionHistoryLimit":{},"f:selector":{},"f:template":{"f:metadata":{"f:labels":{".":{},"f:name":{}}},"f:spec":{"f:containers":{"k:{\"name\":\"prepullcontainer\"}":{".":{},"f:args":{},"f:command":{},"f:image":{},"f:imagePullPolicy":{},"f:name":{},"f:resources":{},"f:terminationMessagePath":{},"f:terminationMessagePolicy":{}}},"f:dnsPolicy":{},"f:restartPolicy":{},"f:schedulerName":{},"f:securityContext":{},"f:terminationGracePeriodSeconds":{}}},"f:updateStrategy":{"f:rollingUpdate":{".":{},"f:maxSurge":{},"f:maxUnavailable":{}},"f:type":{}}}}}]},"spec":{"selector":{"matchLabels":{"name":"prepull-daemonset-cnf-tests"}},"template":{"metadata":{"labels":{"name":"prepull-daemonset-cnf-tests"}},"spec":{"containers":[{"name":"prepullcontainer","image":"quay.io/openshift-kni/cnf-tests:4.19","command":["/bin/sleep"],"args":["inf"],"resources":{},"terminationMessagePath":"/dev/termination-log","terminationMessagePolicy":"File","imagePullPolicy":"IfNotPresent"}],"restartPolicy":"Always","terminationGracePeriodSeconds":30,"dnsPolicy":"ClusterFirst","securityContext":{},"schedulerName":"default-scheduler"}},"updateStrategy":{"type":"RollingUpdate","rollingUpdate":{"maxUnavailable":1,"maxSurge":0}},"revisionHistoryLimit":10},"status":{"currentNumberScheduled":0,"numberMisscheduled":0,"desiredNumberScheduled":0,"numberReady":0}} May 18 14:52:28.346: [INFO]: wait for the daemonset "testing-prepull" "prepullcnf-tests" to be running May 18 14:52:28.386: [WARNING]: daemonset prepullcnf-tests pod testing-prepull/prepullcnf-tests-clxdl is not running, expected status Running got Pending May 18 14:52:28.407: [WARNING]: -> Binding Scheduled Successfully assigned testing-prepull/prepullcnf-tests-clxdl to cnfdt7.lab.eng.tlv2.redhat.com May 18 14:52:28.407: [WARNING]: daemonset prepullcnf-tests pod testing-prepull/prepullcnf-tests-kch7t is not running, expected status Running got Pending May 18 14:52:28.426: [WARNING]: -> Binding Scheduled Successfully assigned testing-prepull/prepullcnf-tests-kch7t to cnfdt6.lab.eng.tlv2.redhat.com May 18 14:52:28.426: [WARNING]: daemonset prepullcnf-tests pod testing-prepull/prepullcnf-tests-w2sfq is not running, expected status Running got Pending May 18 14:52:28.447: [WARNING]: -> Binding Scheduled Successfully assigned testing-prepull/prepullcnf-tests-w2sfq to cnfdt8.lab.eng.tlv2.redhat.com May 18 14:52:58.383: [INFO]: prepulled "quay.io/openshift-kni/cnf-tests:4.19" in 30.064111402s < Exit [BeforeSuite] TOP-LEVEL - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/5_latency_testing_suite_test.go:43 @ 05/18/26 14:52:58.383 (30.305s) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + > Enter [BeforeEach] when checking pod's resources - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:195 @ 05/18/26 14:52:58.383 < Exit [BeforeEach] when checking pod's resources - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:195 @ 05/18/26 14:52:58.383 (0s) > Enter [It] - oslat - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:289 @ 05/18/26 14:52:58.383 STEP: Run latency tools test : LATENCY_TEST_RUNTIME = 120 MAXIMUM_LATENCY = 10000000 LATENCY_TEST_CPUS = 4 LATENCY_TEST_MEMORY = dynamic - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:262 @ 05/18/26 14:52:58.383 STEP: Get the latency test pod and examining its resources - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:267 @ 05/18/26 14:52:58.383 < Exit [It] - oslat - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:289 @ 05/18/26 14:52:59.424 (1.041s) > Enter [AfterEach] when checking pod's resources - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:204 @ 05/18/26 14:52:59.425 [FAILED] Failure recorded during attempt 1: Expected success, but got an error: <context.deadlineExceededError>: context deadline exceeded {} In [AfterEach] at: /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:205 @ 05/18/26 14:54:59.453 < Exit [AfterEach] when checking pod's resources - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:204 @ 05/18/26 14:54:59.453 (2m0.029s) Attempt #1 Failed. Retrying ↺ @ 05/18/26 14:54:59.453 > Enter [BeforeEach] when checking pod's resources - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:195 @ 05/18/26 14:54:59.453 < Exit [BeforeEach] when checking pod's resources - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:195 @ 05/18/26 14:54:59.453 (0s) > Enter [It] - oslat - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:289 @ 05/18/26 14:54:59.453 STEP: Run latency tools test : LATENCY_TEST_RUNTIME = 120 MAXIMUM_LATENCY = 10000000 LATENCY_TEST_CPUS = 4 LATENCY_TEST_MEMORY = dynamic - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:262 @ 05/18/26 14:54:59.453 STEP: Get the latency test pod and examining its resources - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:267 @ 05/18/26 14:54:59.453 < Exit [It] - oslat - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:289 @ 05/18/26 14:54:59.473 (20ms) > Enter [AfterEach] when checking pod's resources - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:204 @ 05/18/26 14:54:59.473 < Exit [AfterEach] when checking pod's resources - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:204 @ 05/18/26 14:55:00.516 (1.043s) + + + > Enter [BeforeEach] when checking pod's resources - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:195 @ 05/18/26 14:55:00.516 < Exit [BeforeEach] when checking pod's resources - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:195 @ 05/18/26 14:55:00.516 (0s) > Enter [It] - cyclictest - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:290 @ 05/18/26 14:55:00.516 STEP: Run latency tools test : LATENCY_TEST_RUNTIME = 120 MAXIMUM_LATENCY = 10000000 LATENCY_TEST_CPUS = 4 LATENCY_TEST_MEMORY = dynamic - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:262 @ 05/18/26 14:55:00.516 STEP: Get the latency test pod and examining its resources - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:267 @ 05/18/26 14:55:00.516 < Exit [It] - cyclictest - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:290 @ 05/18/26 14:55:01.561 (1.045s) > Enter [AfterEach] when checking pod's resources - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:204 @ 05/18/26 14:55:01.561 [FAILED] Failure recorded during attempt 1: Expected success, but got an error: <context.deadlineExceededError>: context deadline exceeded {} In [AfterEach] at: /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:205 @ 05/18/26 14:57:01.585 < Exit [AfterEach] when checking pod's resources - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:204 @ 05/18/26 14:57:01.585 (2m0.024s) Attempt #1 Failed. Retrying ↺ @ 05/18/26 14:57:01.585 > Enter [BeforeEach] when checking pod's resources - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:195 @ 05/18/26 14:57:01.585 < Exit [BeforeEach] when checking pod's resources - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:195 @ 05/18/26 14:57:01.585 (0s) > Enter [It] - cyclictest - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:290 @ 05/18/26 14:57:01.585 STEP: Run latency tools test : LATENCY_TEST_RUNTIME = 120 MAXIMUM_LATENCY = 10000000 LATENCY_TEST_CPUS = 4 LATENCY_TEST_MEMORY = dynamic - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:262 @ 05/18/26 14:57:01.585 STEP: Get the latency test pod and examining its resources - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:267 @ 05/18/26 14:57:01.585 < Exit [It] - cyclictest - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:290 @ 05/18/26 14:57:01.605 (20ms) > Enter [AfterEach] when checking pod's resources - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:204 @ 05/18/26 14:57:01.605 < Exit [AfterEach] when checking pod's resources - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:204 @ 05/18/26 14:57:02.673 (1.068s) + + + > Enter [BeforeEach] when checking pod's resources - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:195 @ 05/18/26 14:57:02.673 < Exit [BeforeEach] when checking pod's resources - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:195 @ 05/18/26 14:57:02.673 (0s) > Enter [It] - hwlatdetect - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:291 @ 05/18/26 14:57:02.673 STEP: Run latency tools test : LATENCY_TEST_RUNTIME = 120 MAXIMUM_LATENCY = 10000000 LATENCY_TEST_CPUS = 4 LATENCY_TEST_MEMORY = dynamic - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:262 @ 05/18/26 14:57:02.673 STEP: Get the latency test pod and examining its resources - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:267 @ 05/18/26 14:57:02.673 < Exit [It] - hwlatdetect - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:291 @ 05/18/26 14:57:03.715 (1.042s) > Enter [AfterEach] when checking pod's resources - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:204 @ 05/18/26 14:57:03.715 [FAILED] Failure recorded during attempt 1: Expected success, but got an error: <context.deadlineExceededError>: context deadline exceeded {} In [AfterEach] at: /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:205 @ 05/18/26 14:59:03.745 < Exit [AfterEach] when checking pod's resources - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:204 @ 05/18/26 14:59:03.745 (2m0.03s) Attempt #1 Failed. Retrying ↺ @ 05/18/26 14:59:03.745 > Enter [BeforeEach] when checking pod's resources - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:195 @ 05/18/26 14:59:03.745 < Exit [BeforeEach] when checking pod's resources - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:195 @ 05/18/26 14:59:03.745 (0s) > Enter [It] - hwlatdetect - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:291 @ 05/18/26 14:59:03.745 STEP: Run latency tools test : LATENCY_TEST_RUNTIME = 120 MAXIMUM_LATENCY = 10000000 LATENCY_TEST_CPUS = 4 LATENCY_TEST_MEMORY = dynamic - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:262 @ 05/18/26 14:59:03.745 STEP: Get the latency test pod and examining its resources - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:267 @ 05/18/26 14:59:03.745 < Exit [It] - hwlatdetect - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:291 @ 05/18/26 14:59:03.766 (21ms) > Enter [AfterEach] when checking pod's resources - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:204 @ 05/18/26 14:59:03.766 < Exit [AfterEach] when checking pod's resources - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go:204 @ 05/18/26 14:59:04.822 (1.056s) + + + + + + + + + + + + > Enter [AfterSuite] TOP-LEVEL - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/5_latency_testing_suite_test.go:100 @ 05/18/26 14:59:04.822 < Exit [AfterSuite] TOP-LEVEL - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/5_latency_testing_suite_test.go:100 @ 05/18/26 14:59:56.02 (51.198s) + + + > Enter [ReportAfterSuite] TOP-LEVEL - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/5_latency_testing_suite_test.go:126 @ 05/18/26 14:59:56.02 < Exit [ReportAfterSuite] TOP-LEVEL - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/5_latency_testing/5_latency_testing_suite_test.go:126 @ 05/18/26 14:59:56.02 (0s) + + + \ No newline at end of file diff --git a/test/e2e/performanceprofile/functests/0_config/0_config.test b/test/e2e/performanceprofile/functests/0_config/0_config.test new file mode 100755 index 0000000000..31f5375f64 Binary files /dev/null and b/test/e2e/performanceprofile/functests/0_config/0_config.test differ diff --git a/test/e2e/performanceprofile/functests/0_config/config.go b/test/e2e/performanceprofile/functests/0_config/config.go index 2335244cfc..c2cbe2fe45 100644 --- a/test/e2e/performanceprofile/functests/0_config/config.go +++ b/test/e2e/performanceprofile/functests/0_config/config.go @@ -4,13 +4,10 @@ import ( "context" "fmt" "os" - "time" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - "github.com/onsi/gomega/format" - "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/serializer" @@ -25,14 +22,10 @@ import ( testutils "github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/utils" testclient "github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/utils/client" "github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/utils/cluster" - "github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/utils/discovery" "github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/utils/hypershift" - "github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/utils/label" testlog "github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/utils/log" "github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/utils/mcps" "github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/utils/nodepools" - "github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/utils/profiles" - "github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/utils/profilesupdate" ) var RunningOnSingleNode bool @@ -45,51 +38,51 @@ var _ = Describe("[performance][config] Performance configuration", Ordered, fun RunningOnSingleNode = isSNO }) - It("Should successfully deploy the performance profile", Label(string(label.Tier0)), func() { + // It("Should successfully deploy the performance profile", Label(string(label.Tier0)), func() { - performanceProfile, err := testProfile() - Expect(err).ToNot(HaveOccurred(), "failed to build performance profile: %v", err) - profileAlreadyExists := false + // performanceProfile, err := testProfile() + // Expect(err).ToNot(HaveOccurred(), "failed to build performance profile: %v", err) + // profileAlreadyExists := false - performanceManifest, foundOverride := os.LookupEnv("PERFORMANCE_PROFILE_MANIFEST_OVERRIDE") - if foundOverride { - performanceProfile, err = externalPerformanceProfile(performanceManifest) - Expect(err).ToNot(HaveOccurred(), "Failed overriding performance profile", performanceManifest) - testlog.Warningf("Consuming performance profile from %s", performanceManifest) - } - if discovery.Enabled() { - performanceProfile, err = profiles.GetByNodeLabels(testutils.NodeSelectorLabels) - Expect(err).ToNot(HaveOccurred(), "Failed finding a performance profile in discovery mode using selector %v", testutils.NodeSelectorLabels) - testlog.Info("Discovery mode: consuming a deployed performance profile from the cluster") - profileAlreadyExists = true - } + // performanceManifest, foundOverride := os.LookupEnv("PERFORMANCE_PROFILE_MANIFEST_OVERRIDE") + // if foundOverride { + // performanceProfile, err = externalPerformanceProfile(performanceManifest) + // Expect(err).ToNot(HaveOccurred(), "Failed overriding performance profile", performanceManifest) + // testlog.Warningf("Consuming performance profile from %s", performanceManifest) + // } + // if discovery.Enabled() { + // performanceProfile, err = profiles.GetByNodeLabels(testutils.NodeSelectorLabels) + // Expect(err).ToNot(HaveOccurred(), "Failed finding a performance profile in discovery mode using selector %v", testutils.NodeSelectorLabels) + // testlog.Info("Discovery mode: consuming a deployed performance profile from the cluster") + // profileAlreadyExists = true + // } - if !discovery.Enabled() { - By("Creating the PerformanceProfile") - // this might fail while the operator is still being deployed and the CRD does not exist yet - Eventually(func() error { - err := testclient.ControlPlaneClient.Create(context.TODO(), performanceProfile) - if errors.IsAlreadyExists(err) { - testlog.Warning(fmt.Sprintf("A PerformanceProfile with name %s already exists! If created externally, tests might have unexpected behaviour", performanceProfile.Name)) - profileAlreadyExists = true - return nil - } - return err - }, cluster.ComputeTestTimeout(15*time.Minute, RunningOnSingleNode), 15*time.Second).ShouldNot(HaveOccurred(), "Failed creating the performance profile") - } - unpauseMCP(context.TODO(), performanceProfile) - attachProfileToNodePool(context.TODO(), performanceProfile) - // if the profile exists, it's likely to have been through the updating phase, so we only - // wait for updated. - if !profileAlreadyExists { - profilesupdate.WaitForTuningUpdating(context.TODO(), performanceProfile) - } - profilesupdate.WaitForTuningUpdated(context.TODO(), performanceProfile) + // if !discovery.Enabled() { + // By("Creating the PerformanceProfile") + // // this might fail while the operator is still being deployed and the CRD does not exist yet + // Eventually(func() error { + // err := testclient.ControlPlaneClient.Create(context.TODO(), performanceProfile) + // if errors.IsAlreadyExists(err) { + // testlog.Warning(fmt.Sprintf("A PerformanceProfile with name %s already exists! If created externally, tests might have unexpected behaviour", performanceProfile.Name)) + // profileAlreadyExists = true + // return nil + // } + // return err + // }, cluster.ComputeTestTimeout(15*time.Minute, RunningOnSingleNode), 15*time.Second).ShouldNot(HaveOccurred(), "Failed creating the performance profile") + // } + // unpauseMCP(context.TODO(), performanceProfile) + // attachProfileToNodePool(context.TODO(), performanceProfile) + // // if the profile exists, it's likely to have been through the updating phase, so we only + // // wait for updated. + // if !profileAlreadyExists { + // profilesupdate.WaitForTuningUpdating(context.TODO(), performanceProfile) + // } + // profilesupdate.WaitForTuningUpdated(context.TODO(), performanceProfile) - Expect(testclient.ControlPlaneClient.Get(context.TODO(), client.ObjectKeyFromObject(performanceProfile), performanceProfile)) - By("Printing the updated profile") - testlog.Info(format.Object(performanceProfile, 2)) - }) + // Expect(testclient.ControlPlaneClient.Get(context.TODO(), client.ObjectKeyFromObject(performanceProfile), performanceProfile)) + // By("Printing the updated profile") + // testlog.Info(format.Object(performanceProfile, 2)) + // }) }) func externalPerformanceProfile(performanceManifest string) (*performancev2.PerformanceProfile, error) { diff --git a/test/e2e/performanceprofile/functests/0_config/report.xml b/test/e2e/performanceprofile/functests/0_config/report.xml new file mode 100644 index 0000000000..fdb7b77d99 --- /dev/null +++ b/test/e2e/performanceprofile/functests/0_config/report.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + > Enter [ReportAfterSuite] TOP-LEVEL - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/0_config/test_suite_performance_config_test.go:65 @ 05/18/26 15:04:26.157 < Exit [ReportAfterSuite] TOP-LEVEL - /home/shajmakh/ghrepo/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/0_config/test_suite_performance_config_test.go:65 @ 05/18/26 15:04:26.157 (0s) + + + \ No newline at end of file diff --git a/test/e2e/performanceprofile/functests/4_latency/latency.go b/test/e2e/performanceprofile/functests/4_latency/latency.go index 49f4514f28..576e3ea46a 100644 --- a/test/e2e/performanceprofile/functests/4_latency/latency.go +++ b/test/e2e/performanceprofile/functests/4_latency/latency.go @@ -36,13 +36,25 @@ import ( ) const ( - oslatTestName = "oslat" - cyclictestTestName = "cyclictest" - hwlatdetectTestName = "hwlatdetect" - defaultTestDelay = 0 - defaultTestRuntime = "300" - defaultMaxLatency = -1 - defaultTestCpus = -1 + //tools names + oslatTestName = "oslat" + cyclictestTestName = "cyclictest" + hwlatdetectTestName = "hwlatdetect" + + //default values + defaultTestDelay = 0 + defaultTestRuntime = "300" + defaultMaxLatency = -1 + defaultTestCpus = -1 + defaultTestMemory = "1Gi" + + //dynamic memory mode values + dynamicMemory = "dynamic" + // 32Mi per requested CPU should be reasonable for the test; if needed more, it can + // be overridden by explicitly setting the environment variable + perCpuMemoryFactor = 32 + memoryFactorFormat = "Mi" + minCpuAmountForOslat = 2 ) @@ -51,13 +63,14 @@ var ( latencyTestRuntime = defaultTestRuntime maximumLatency = defaultMaxLatency latencyTestCpus = defaultTestCpus + latencyTestMemory = defaultTestMemory ) // LATENCY_TEST_DELAY delay the run of the binary, can be useful to give time to the CPU manager reconcile loop // to update the default CPU pool // LATENCY_TEST_RUNTIME: the amount of time in seconds that the latency test should run // LATENCY_TEST_CPUS: the amount of CPUs the pod which run the latency test should request - +// LATENCY_TEST_MEMORY: the amount of memory the pod which run the latency test should request var _ = Describe("[performance] Latency Test", Ordered, func() { var workerRTNode *corev1.Node var profile *performancev2.PerformanceProfile @@ -278,6 +291,50 @@ func getLatencyTestCpus() (int, error) { return defaultTestCpus, nil } +// GetLatencyTestMemory returns the memory limit for the latency test pod based on +// LATENCY_TEST_MEMORY and the CPU count. +// If LATENCY_TEST_MEMORY is unset, it returns defaultTestMemory. +// If set to "dynamic", it returns max(32Mi per CPU, defaultTestMemory); when cpus is unset or +// less than 1, it returns defaultTestMemory without scaling. +// Any other value must be a valid Kubernetes resource quantity (e.g. "512Mi") and is returned as-is. +func GetLatencyTestMemory(cpus int) (string, error) { + if val, ok := os.LookupEnv("LATENCY_TEST_MEMORY"); ok { + if val == dynamicMemory { + // Defensive check: fall back to default memory if the CPU count was not normalized + if cpus == defaultTestCpus || cpus < 1 { + return defaultTestMemory, nil + } + + computedInt := perCpuMemoryFactor * cpus + + computedQuantity, err := resource.ParseQuantity(fmt.Sprintf("%d%s", computedInt, memoryFactorFormat)) + if err != nil { + return "", fmt.Errorf("failed to parse computed quantity %q: %w", fmt.Sprintf("%d%s", computedInt, memoryFactorFormat), err) + } + defaultQuantity, err := resource.ParseQuantity(defaultTestMemory) + if err != nil { + return "", fmt.Errorf("failed to parse default quantity %q: %w", defaultTestMemory, err) + } + + maxQuantity := defaultQuantity // floor at defaultTestMemory for backward compatibility + if computedQuantity.Cmp(defaultQuantity) > 0 { + maxQuantity = computedQuantity + } + return maxQuantity.String(), nil + } + + q, err := resource.ParseQuantity(val) + if err != nil { + return val, fmt.Errorf("the environment variable LATENCY_TEST_MEMORY has incorrect value %q, it must be a valid quantity: %w", val, err) + } + if q.Sign() <= 0 { + return val, fmt.Errorf("the environment variable LATENCY_TEST_MEMORY has invalid value %q, it must be greater than 0", val) + } + return val, nil + } + return defaultTestMemory, nil +} + // getMaximumLatency should look for one of the following environment variables: // OSLAT_MAXIMUM_LATENCY: the expected maximum latency for all buckets in us // CYCLICTEST_MAXIMUM_LATENCY: the expected maximum latency for all buckets in us @@ -325,6 +382,10 @@ func getLatencyTestPod(profile *performancev2.PerformanceProfile, node *corev1.N latencyTestCpus = cpus.Size() - 1 } + var err error + latencyTestMemory, err = GetLatencyTestMemory(latencyTestCpus) + Expect(err).ToNot(HaveOccurred()) + latencyTestRunnerArgs := []string{ "-logtostderr=false", "-alsologtostderr=true", @@ -361,7 +422,7 @@ func getLatencyTestPod(profile *performancev2.PerformanceProfile, node *corev1.N Resources: corev1.ResourceRequirements{ Limits: corev1.ResourceList{ corev1.ResourceCPU: resource.MustParse(strconv.Itoa(latencyTestCpus)), - corev1.ResourceMemory: resource.MustParse("1Gi"), + corev1.ResourceMemory: resource.MustParse(latencyTestMemory), }, }, SecurityContext: &corev1.SecurityContext{ diff --git a/test/e2e/performanceprofile/functests/4_latency/tester/unit_test.go b/test/e2e/performanceprofile/functests/4_latency/tester/unit_test.go new file mode 100644 index 0000000000..85e0152e95 --- /dev/null +++ b/test/e2e/performanceprofile/functests/4_latency/tester/unit_test.go @@ -0,0 +1,82 @@ +package tester + +import ( + "os" + "testing" + + latency "github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/4_latency" +) + +func TestGetLatencyTestMemory(t *testing.T) { + testcases := []struct { + testName string + envVarValue string + cpus int + expectedMemory string + }{ + { + testName: "no env var set should default to 1Gi - low count of CPUs", + envVarValue: "", + cpus: 4, + expectedMemory: "1Gi", + }, + { + testName: "no env var set should default to 1Gi - high count of CPUs", + envVarValue: "", + cpus: 50, + expectedMemory: "1Gi", + }, + { + testName: "dynamic memory should be 32Mi per CPU with high count of CPUs", + envVarValue: "dynamic", + cpus: 50, + expectedMemory: "1600Mi", + }, + { + testName: "explicitly set to 100Mi despite the CPUs count", + envVarValue: "100Mi", + cpus: 50, + expectedMemory: "100Mi", + }, + { + testName: "2 CPUs should default to 1Gi", + envVarValue: "dynamic", + cpus: 2, + expectedMemory: "1Gi", + }, + { + testName: "unset env var and unset cpus should default to 1Gi", + envVarValue: "", + cpus: -1, + expectedMemory: "1Gi", + }, + { + testName: "dynamic memory and unset cpus should default to 1Gi", + envVarValue: "dynamic", + cpus: -1, + expectedMemory: "1Gi", + }, + { + testName: "default memory and 0 cpus should default to 1Gi", + envVarValue: "", + cpus: 0, + expectedMemory: "1Gi", + }, + } + for _, testcase := range testcases { + t.Run(testcase.testName, func(t *testing.T) { + if testcase.envVarValue != "" { + os.Setenv("LATENCY_TEST_MEMORY", testcase.envVarValue) + } + defer os.Unsetenv("LATENCY_TEST_MEMORY") + + memory, err := latency.GetLatencyTestMemory(testcase.cpus) + if err != nil { + t.Fatalf("failed to get latency test memory: %v", err) + } + if memory != testcase.expectedMemory { + t.Fatalf("expected memory %s, got %s", testcase.expectedMemory, memory) + } + }) + } +} diff --git a/test/e2e/performanceprofile/functests/5_latency_testing/5_latency_testing.test b/test/e2e/performanceprofile/functests/5_latency_testing/5_latency_testing.test new file mode 100755 index 0000000000..ef4a3a63c3 Binary files /dev/null and b/test/e2e/performanceprofile/functests/5_latency_testing/5_latency_testing.test differ diff --git a/test/e2e/performanceprofile/functests/5_latency_testing/5_latency_testing_suite_test.go b/test/e2e/performanceprofile/functests/5_latency_testing/5_latency_testing_suite_test.go index b8e878314f..b1e74e1d60 100644 --- a/test/e2e/performanceprofile/functests/5_latency_testing/5_latency_testing_suite_test.go +++ b/test/e2e/performanceprofile/functests/5_latency_testing/5_latency_testing_suite_test.go @@ -5,7 +5,6 @@ import ( "encoding/json" "fmt" "os" - "reflect" "testing" "time" @@ -27,7 +26,6 @@ import ( nodeinspector "github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/utils/node_inspector" "github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/utils/nodes" "github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/utils/profiles" - "github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/utils/profilesupdate" qe_reporters "kubevirt.io/qe-tools/pkg/ginkgo-reporters" ) @@ -72,8 +70,8 @@ var _ = BeforeSuite(func() { if *initialIsolated != latencyIsolatedSet || *initialReserved != latencyReservedSet { By("Update the isolated and reserved cpus sets of the profile") - err = profilesupdate.UpdateIsolatedReservedCpus(latencyIsolatedSet, latencyReservedSet) - Expect(err).ToNot(HaveOccurred(), "could not update the profile with the desired CPUs sets") + // err = profilesupdate.UpdateIsolatedReservedCpus(latencyIsolatedSet, latencyReservedSet) + // Expect(err).ToNot(HaveOccurred(), "could not update the profile with the desired CPUs sets") } if err := createNamespace(); err != nil { @@ -107,15 +105,15 @@ var _ = AfterSuite(func() { } Expect(namespaces.WaitForDeletion(prePullNamespaceName, 5*time.Minute), "hitting timeout while waiting namespace %q deletion", prePullNamespaceName) - currentProfile, err := profiles.GetByNodeLabels(testutils.NodeSelectorLabels) - Expect(err).ToNot(HaveOccurred()) - if reflect.DeepEqual(currentProfile.Spec, profile.Spec) != true { - By("Restore initial performance profile") - err = profilesupdate.ApplyProfile(profile) - if err != nil { - testlog.Errorf("could not restore the initial profile: %v", err) - } - } + // currentProfile, err := profiles.GetByNodeLabels(testutils.NodeSelectorLabels) + // Expect(err).ToNot(HaveOccurred()) + // if reflect.DeepEqual(currentProfile.Spec, profile.Spec) != true { + // By("Restore initial performance profile") + // err = profilesupdate.ApplyProfile(profile) + // if err != nil { + // testlog.Errorf("could not restore the initial profile: %v", err) + // } + // } Expect(nodeinspector.Delete(context.TODO())).To(Succeed()) }) diff --git a/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go b/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go index e928258481..64a4837bb7 100644 --- a/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go +++ b/test/e2e/performanceprofile/functests/5_latency_testing/latency_testing.go @@ -13,6 +13,10 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" "github.com/onsi/gomega/format" + + "k8s.io/klog" + + latency "github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/4_latency" testutils "github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/utils" testlog "github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/utils/log" "github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/utils/nodes" @@ -33,8 +37,15 @@ const ( hwlatdetecMaxLatency = "HWLATDETECT_MAXIMUM_LATENCY" cyclictestMaxLatency = "CYCLICTEST_MAXIMUM_LATENCY" latencyTestCpus = "LATENCY_TEST_CPUS" + latencyTestMemory = "LATENCY_TEST_MEMORY" + defaultTestMemory = "1Gi" //invalid values error messages - unexpectedError = "Unexpected error" + incorrectMemory = incorrectMsgPart1 + latencyTestMemory + incorrectMsgPart2 + mustBeValidQuantity + mustBeValidQuantity = ".*it must be a valid quantity" + invalidNumberMemory = incorrectMsgPart1 + latencyTestMemory + invalidNumber + mustBeValidQuantity + dynamicMemory = "dynamic" + memoryFactor = 32 + unexpectedError = "Unexpected error" //incorrect values error messages incorrectMsgPart1 = "the environment variable " incorrectMsgPart2 = " has incorrect value" @@ -90,6 +101,7 @@ type latencyTest struct { cyclictestMaxLatency string hwlatdetectMaxLatency string testCpus string + testMemory string outputMsgs []string toolToTest string ginkgoTimeout string @@ -170,6 +182,141 @@ var _ = DescribeTable("Test latency measurement tools tests", func(testGroup []l Entry("[test_id:42856] Hwlatdetect - Verify that the latency tool test should print an expected error message when passing invalid environment variables values", getNegativeTests(hwlatdetect), negativeTesting), ) +// var _ = Describe("Latency pod testing", func() { +// var testRun latencyTest +// var latencyTestPod *corev1.Pod +// When("checking pod's resources", func() { + +// BeforeEach(func() { +// clearEnv() +// testRun = latencyTest{ +// testRuntime: "120", // high enough to allow doing the validation on the scheduled pod +// testMaxLatency: untunedLatencyThreshold, +// testCpus: "4", // good default for all tools +// } +// }) + +// AfterEach(func(ctx context.Context) { +// Expect(pods.DeleteAndSync(ctx, testclient.DataPlaneClient, latencyTestPod)).To(Succeed()) +// }) + +// DescribeTable("should have correct default memory amount when LATENCY_TEST_MEMORY is unset", func(ctx context.Context, toolName string) { +// testDescription := setEnvAndGetDescription(testRun) +// By(testDescription) + +// cancel := runTest(ctx, toolName) +// defer cancel() + +// By("Get the latency test pod and examining its resources") +// podlist := &corev1.PodList{} +// Eventually(func(g Gomega) { +// g.Expect(testclient.Client.List(ctx, podlist, client.InNamespace(testutils.NamespaceTesting))).To(Succeed(), "no latency pods were found") +// g.Expect(podlist.Items).ToNot(BeEmpty(), "no latency pods were found yet") +// }).WithTimeout(5 * time.Minute).WithPolling(1 * time.Second).Should(Succeed()) +// Expect(podlist.Items).To(HaveLen(1)) +// cancel() + +// latencyTestPod = &podlist.Items[0] +// Expect(latencyTestPod.Status.QOSClass).To(Equal(corev1.PodQOSGuaranteed)) +// Expect(latencyTestPod.Spec.Containers[0].Resources.Limits.Memory().String()).To(Equal(defaultTestMemory)) +// }, +// Entry("- oslat", oslat), +// Entry("- cyclictest", cyclictest), +// Entry("- hwlatdetect", hwlatdetect), +// ) + +// DescribeTable("should have correct memory amount when LATENCY_TEST_MEMORY is set to a valid quantity", func(ctx context.Context, toolName string) { +// testRun.testMemory = "512Mi" +// testDescription := setEnvAndGetDescription(testRun) +// By(testDescription) + +// cancel := runTest(ctx, toolName) +// defer cancel() + +// By("Get the latency test pod and examining its resources") +// podlist := &corev1.PodList{} +// Eventually(func(g Gomega) { +// g.Expect(testclient.Client.List(ctx, podlist, client.InNamespace(testutils.NamespaceTesting))).To(Succeed(), "no latency pods were found") +// g.Expect(podlist.Items).ToNot(BeEmpty(), "no latency pods were found yet") +// }).WithTimeout(5 * time.Minute).WithPolling(1 * time.Second).Should(Succeed()) +// Expect(podlist.Items).To(HaveLen(1)) +// cancel() + +// latencyTestPod = &podlist.Items[0] +// Expect(latencyTestPod.Status.QOSClass).To(Equal(corev1.PodQOSGuaranteed)) +// Expect(latencyTestPod.Spec.Containers[0].Resources.Limits.Memory().String()).To(Equal(testRun.testMemory)) +// }, +// Entry("- oslat", oslat), +// Entry("- cyclictest", cyclictest), +// Entry("- hwlatdetect", hwlatdetect), +// ) + +// FDescribeTable("should have correct memory amount when LATENCY_TEST_MEMORY is set to dynamic with default CPUs", func(ctx context.Context, toolName string) { +// testRun.testMemory = dynamicMemory +// testDescription := setEnvAndGetDescription(testRun) +// By(testDescription) + +// cancel := runTest(ctx, toolName) +// defer cancel() + +// By("Get the latency test pod and examining its resources") +// podlist := &corev1.PodList{} +// Eventually(func(g Gomega) { +// g.Expect(testclient.Client.List(ctx, podlist, client.InNamespace(testutils.NamespaceTesting))).To(Succeed(), "no latency pods were found") +// g.Expect(podlist.Items).ToNot(BeEmpty(), "no latency pods were found yet") +// }).WithTimeout(5 * time.Minute).WithPolling(1 * time.Second).Should(Succeed()) +// Expect(podlist.Items).To(HaveLen(1)) +// cancel() + +// latencyTestPod = &podlist.Items[0] +// Expect(latencyTestPod.Status.QOSClass).To(Equal(corev1.PodQOSGuaranteed)) +// autodetectedCPUs := latencyTestPod.Spec.Containers[0].Resources.Limits.Cpu() +// expectedMem := memoryFactor * autodetectedCPUs.Value() +// computedMem := resource.MustParse(fmt.Sprintf("%dMi", expectedMem)) +// defaultMem := resource.MustParse(defaultTestMemory) + +// expectedPodMemory := defaultMem +// if computedMem.Cmp(defaultMem) > 0 { +// expectedPodMemory = computedMem +// } +// Expect(latencyTestPod.Spec.Containers[0].Resources.Limits.Memory().String()).To(Equal(expectedPodMemory.String())) +// }, +// Entry("- oslat", oslat), +// Entry("- cyclictest", cyclictest), +// Entry("- hwlatdetect", hwlatdetect), +// ) + +// DescribeTable("should have correct memory amount when LATENCY_TEST_MEMORY is set to dynamic with low count of user specified CPUs - defaults to 1Gi", func(ctx context.Context, toolName string) { +// testRun.testMemory = dynamicMemory +// cpus := 4 +// testRun.testCpus = fmt.Sprint(cpus) +// testDescription := setEnvAndGetDescription(testRun) +// By(testDescription) + +// cancel := runTest(ctx, toolName) +// defer cancel() + +// By("Get the latency test pod and examining its resources") +// podlist := &corev1.PodList{} +// Eventually(func(g Gomega) { +// g.Expect(testclient.Client.List(ctx, podlist, client.InNamespace(testutils.NamespaceTesting))).To(Succeed(), "no latency pods were found") +// g.Expect(podlist.Items).ToNot(BeEmpty(), "no latency pods were found yet") +// }).WithTimeout(5 * time.Minute).WithPolling(1 * time.Second).Should(Succeed()) +// Expect(podlist.Items).To(HaveLen(1)) +// cancel() + +// latencyTestPod = &podlist.Items[0] +// Expect(latencyTestPod.Status.QOSClass).To(Equal(corev1.PodQOSGuaranteed)) +// Expect(latencyTestPod.Spec.Containers[0].Resources.Limits.Memory().String()).To(Equal(defaultTestMemory)) +// }, +// Entry("- oslat", oslat), +// Entry("- cyclictest", cyclictest), +// Entry("- hwlatdetect", hwlatdetect), +// ) +// }) +// }) + + func setEnvAndGetDescription(tst latencyTest) string { sb := bytes.NewBufferString("") testName := tst.toolToTest @@ -199,6 +346,9 @@ func setEnvAndGetDescription(tst latencyTest) string { if tst.testCpus != "" { setEnvWriteDescription(latencyTestCpus, tst.testCpus, sb, &nonDefaultValues) } + if tst.testMemory != "" { + setEnvWriteDescription(latencyTestMemory, tst.testMemory, sb, &nonDefaultValues) + } if !nonDefaultValues { fmt.Fprint(sb, "With default values of the environment variables") } @@ -220,6 +370,7 @@ func clearEnv() { os.Unsetenv(cyclictestMaxLatency) os.Unsetenv(hwlatdetecMaxLatency) os.Unsetenv(latencyTestCpus) + os.Unsetenv(latencyTestMemory) } func getValidValuesTests(toolToTest string) []latencyTest { @@ -314,3 +465,20 @@ func getNegativeTests(toolToTest string) []latencyTest { } return testSet } + +func runTest(ctx context.Context, toolName string) context.CancelFunc { + runCtx, cancel := context.WithCancel(ctx) + go func() { + cmd := exec.CommandContext(runCtx, testExecutablePath, "-ginkgo.v", "-ginkgo.focus", toolName) + output, err := cmd.CombinedOutput() + if runCtx.Err() != nil { + // spec ended or caller called cancel(); don't treat as failure + return + } + if err != nil { + klog.Errorf("latency test subprocess error: %v", err) + } + klog.Infof("latency test subprocess output: %s", output) + }() + return cancel +}