Skip to content

Commit

Permalink
🐛 Support incident selectors. (#70)
Browse files Browse the repository at this point in the history
Add support for incident selectors. Users can filter in/out incidents
based on packages. The `package` is reported as an Incident.Variables
with key=`package`.
The `!package` and ` !(package)` syntax is used to match incidents
without the _package_ variable.

Passes `--incident-selector` option as needed.

Signed-off-by: Jeff Ortel <jortel@redhat.com>
  • Loading branch information
jortel committed Dec 20, 2023
1 parent 386d508 commit 41f5d3c
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 5 deletions.
24 changes: 24 additions & 0 deletions cmd/cmd_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,3 +101,27 @@ func TestLabelMatch(t *testing.T) {
rule = "konveyor.io/target=thing4-"
g.Expect(rule.Match(included)).To(gomega.BeTrue())
}

func TestIncidentSelector(t *testing.T) {
g := gomega.NewGomegaWithT(t)
// Empty.
scope := Scope{}
selector := scope.incidentSelector()
g.Expect("").To(gomega.Equal(selector))
// Included.
scope = Scope{}
scope.Packages.Included = []string{"a", "b"}
selector = scope.incidentSelector()
g.Expect("(!package||package=a||package=b)").To(gomega.Equal(selector))
// Excluded.
scope = Scope{}
scope.Packages.Excluded = []string{"C", "D"}
selector = scope.incidentSelector()
g.Expect("!(package||package=C||package=D)").To(gomega.Equal(selector))
// Included and Excluded.
scope = Scope{}
scope.Packages.Included = []string{"a", "b"}
scope.Packages.Excluded = []string{"C", "D"}
selector = scope.incidentSelector()
g.Expect("(!package||package=a||package=b) && !(package=C||package=D)").To(gomega.Equal(selector))
}
42 changes: 37 additions & 5 deletions cmd/scope.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package main

import "github.com/konveyor/tackle2-addon/command"
import (
"github.com/konveyor/tackle2-addon/command"
"strings"
)

// Scope settings.
type Scope struct {
Expand All @@ -18,11 +21,40 @@ func (r *Scope) AddOptions(options *command.Options) (err error) {
"--dep-label-selector",
"!konveyor.io/dep-source=open-source")
}
if len(r.Packages.Included) > 0 {
options.Add("--packages", r.Packages.Included...)
selector := r.incidentSelector()
if selector != "" {
options.Add("--incident-selector", selector)
}
if len(r.Packages.Excluded) > 0 {
options.Add("--excludePackages", r.Packages.Excluded...)
return
}

//
// incidentSelector returns an incident selector.
// The injected `!package` matches incidents without a package variable.
func (r *Scope) incidentSelector() (selector string) {
predicate := func(in []string) (p string) {
var refs []string
for _, s := range in {
refs = append(refs, "package="+s)
}
p = strings.Join(refs, "||")
return
}
var predicates []string
p := predicate(r.Packages.Included)
if len(p) > 0 {
p = "(!package||" + p + ")"
predicates = append(predicates, p)
}
p = predicate(r.Packages.Excluded)
if len(p) > 0 {
if len(predicates) == 0 {
p = "!(package||" + p + ")"
} else {
p = "!(" + p + ")"
}
predicates = append(predicates, p)
}
selector = strings.Join(predicates, " && ")
return
}

0 comments on commit 41f5d3c

Please sign in to comment.