Skip to content

Commit

Permalink
kola: support denylist Warn feature
Browse files Browse the repository at this point in the history
coreos#3344

We bubble denylisted tests with 'Warn: true' option as warnings rather than hard failures:
```
kola -p qemu run --parallel 8 ext.config.ntp.* --output-dir tmp/kola

⚠️  Snoozing expired on: Jul 07 2023. Warning kola test pattern: "ext.config.ntp.chrony.dhcp-propagation":
  👉 coreos/fedora-coreos-tracker#1508
🕒 Snoozing kola test pattern "ext.config.ntp.timesyncd.dhcp-propagation" until Jul 20 2023:
  👉 coreos/fedora-coreos-tracker#1508
=== RUN   ext.config.ntp.timesyncd.dhcp-propagation
=== RUN   ext.config.ntp.chrony.coreos-platform-chrony-config
=== RUN   ext.config.ntp.chrony.dhcp-propagation
--- PASS: ext.config.ntp.chrony.coreos-platform-chrony-config (27.02s)
--- FAIL: ext.config.ntp.chrony.dhcp-propagation (107.62s)
--- FAIL: ext.config.ntp.timesyncd.dhcp-propagation (118.02s)
FAIL, output in tmp/kola
--- ⚠️ IGNORE: "ext.config.ntp.chrony.dhcp-propagation"
--- ⚠️ IGNORE: "ext.config.ntp.timesyncd.dhcp-propagation"
+ rc=0
+ set +x
```
  • Loading branch information
nikita-dubrovskii committed Jul 18, 2023
1 parent 5111b60 commit b946582
Showing 1 changed file with 50 additions and 6 deletions.
56 changes: 50 additions & 6 deletions mantle/kola/harness.go
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ var (
// SkipConsoleWarnings is set via SkipConsoleWarningsTag in kola-denylist.yaml
SkipConsoleWarnings bool
DenylistedTests []string // tests which are on the denylist
WarnOnErrorTests []string // denylisted tests we are going to run and warn in case of error
Tags []string // tags to be ran

// Sharding is a string of the form: hash:m/n where m and n are integers to run only tests which hash to m.
Expand Down Expand Up @@ -356,6 +357,7 @@ type DenyListObj struct {
Platforms []string `yaml:"platforms"`
SnoozeDate string `yaml:"snooze"`
OsVersion []string `yaml:"osversion"`
Warn bool `yaml:"warn,omitempty"`
}

type ManifestData struct {
Expand Down Expand Up @@ -451,13 +453,23 @@ func ParseDenyListYaml(pltfrm string) error {
snoozeDate, err := time.Parse(snoozeFormat, obj.SnoozeDate)
if err != nil {
return err
} else if today.After(snoozeDate) {
continue
}

fmt.Printf("🕒 Snoozing kola test pattern \"%s\" until %s:\n", obj.Pattern, snoozeDate.Format("Jan 02 2006"))
if today.After(snoozeDate) {
if !obj.Warn {
continue
}
fmt.Printf("⚠️ Snoozing expired on: %s. Warning kola test pattern: \"%s\":\n", snoozeDate.Format("Jan 02 2006"), obj.Pattern)
WarnOnErrorTests = append(WarnOnErrorTests, obj.Pattern)
} else {
fmt.Printf("🕒 Snoozing kola test pattern \"%s\" until %s:\n", obj.Pattern, snoozeDate.Format("Jan 02 2006"))
}
} else {
fmt.Printf("⚠️ Skipping kola test pattern \"%s\":\n", obj.Pattern)
if obj.Warn {
fmt.Printf("⚠️ Warning kola test pattern: \"%s\":\n", obj.Pattern)
WarnOnErrorTests = append(WarnOnErrorTests, obj.Pattern)
} else {
fmt.Printf("⚠️ Skipping kola test pattern \"%s\":\n", obj.Pattern)
}
}

if obj.Tracker != "" {
Expand All @@ -467,7 +479,7 @@ func ParseDenyListYaml(pltfrm string) error {
/// Process "special" patterns which aren't test names, but influence overall behavior
if obj.Pattern == SkipConsoleWarningsTag {
SkipConsoleWarnings = true
} else {
} else if !obj.Warn {
DenylistedTests = append(DenylistedTests, obj.Pattern)
}
}
Expand Down Expand Up @@ -854,10 +866,29 @@ func runProvidedTests(testsBank map[string]*register.Test, patterns []string, mu
return reRunErr
}
}

// Ignore the error when only denied tests with Warn:true feaute failed
if runErr != nil && allTestsWarnOnError(testResults.getResults()) {
return nil
}

// If the intial run failed and the rerun passed, we still return an error
return runErr
}

func allTestsWarnOnError(tests []*harness.H) bool {
for _, test := range tests {
if !test.Failed() {
continue
}
if !IsWarningOnFailure(test.Name()) {
return false
}
fmt.Printf("--- ⚠️ IGNORE: \"%s\"\n", test.Name())
}
return true
}

func allTestsAllowRerunSuccess(testsBank map[string]*register.Test, testsToRerun, rerunSuccessTags []string) bool {
// Always consider the special AllowRerunSuccessTag that is added
// by the test harness in some failure scenarios.
Expand All @@ -875,6 +906,9 @@ func allTestsAllowRerunSuccess(testsBank map[string]*register.Test, testsToRerun
// Iterate over the tests that were re-ran. If any of them don't
// allow rerun success then just exit early.
for _, test := range testsToRerun {
if IsWarningOnFailure(test) {
continue
}
testAllowsRerunSuccess := false
for _, tag := range testsBank[test].Tags {
if rerunSuccessTagMap[tag] {
Expand Down Expand Up @@ -913,6 +947,16 @@ func GetRerunnableTestName(testName string) (string, bool) {
}
}

func IsWarningOnFailure(testName string) bool {
for _, pattern := range WarnOnErrorTests {
found, _ := filepath.Match(pattern, testName)
if found {
return true
}
}
return false
}

func getRerunnable(tests []*harness.H) []string {
var testsToRerun []string
for _, h := range tests {
Expand Down

0 comments on commit b946582

Please sign in to comment.