Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

✨ Add support for modes and bimary analysis. #19

Merged
merged 16 commits into from
Jul 7, 2023
79 changes: 59 additions & 20 deletions builder/issue.go
Original file line number Diff line number Diff line change
@@ -1,20 +1,26 @@
package builder

import (
"encoding/json"
"fmt"
output "github.com/konveyor/analyzer-lsp/output/v1/konveyor"
hub "github.com/konveyor/tackle2-hub/addon"
"github.com/konveyor/tackle2-hub/api"
"go.lsp.dev/uri"
"gopkg.in/yaml.v3"
"io"
"os"
)

var (
addon = hub.Addon
)

//
// Issues builds issues and facts.
type Issues struct {
facts []api.Fact
Path string
ruleErr RuleError
facts []api.Fact
Path string
}

//
Expand Down Expand Up @@ -44,6 +50,10 @@ func (b *Issues) Write(writer io.Writer) (err error) {
}
encoder := yaml.NewEncoder(writer)
for _, ruleset := range input {
b.ruleErr.Append(ruleset)
if b.ruleErr.NotEmpty() {
continue
}
for ruleid, v := range ruleset.Violations {
issue := api.Issue{
RuleSet: ruleset.Name,
Expand Down Expand Up @@ -81,6 +91,13 @@ func (b *Issues) Write(writer io.Writer) (err error) {
_ = encoder.Encode(&issue)
}
}
if err != nil {
return
}
if b.ruleErr.NotEmpty() {
err = &b.ruleErr
return
}
return
}

Expand Down Expand Up @@ -124,24 +141,46 @@ func (b *Issues) Tags() (tags []string) {

//
// Facts builds facts.
func (b *Issues) Facts() (facts []api.Fact) {
input, err := b.read()
if err != nil {
func (b *Issues) Facts() (facts api.FactMap) {
return
}

//
// RuleError reported by the analyzer.
type RuleError struct {
hub.SoftError
items []string
}

func (e *RuleError) Error() (s string) {
s = fmt.Sprintf(
"Analyser reported %d errors.",
len(e.items))
return
}

func (e *RuleError) Is(err error) (matched bool) {
_, matched = err.(*RuleError)
return
}

func (e *RuleError) Append(ruleset output.RuleSet) {
for s, _ := range ruleset.Errors {
e.items = append(e.items, s)
}
}

func (e *RuleError) NotEmpty() (b bool) {
return len(e.items) > 0
}

func (e *RuleError) Report() {
if len(e.items) == 0 {
return
}
for _, r := range input {
for _, v := range r.Violations {
mp := make(map[string]interface{})
_ = json.Unmarshal(v.Extras, &mp)
for k, v := range mp {
facts = append(
facts,
api.Fact{
Key: k,
Value: v,
})
}
}
addon.Activity("Analyzer reported:")
for _, s := range e.items {
addon.Activity("> [ERROR] %s.", s)
addon.Error("Error", s)
}
return
}
19 changes: 13 additions & 6 deletions cmd/analyzer.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package main

import (
"errors"
"github.com/konveyor/tackle2-addon-analyzer/builder"
"github.com/konveyor/tackle2-addon/command"
"path"
)

type RuleError = builder.RuleError

//
// Analyzer application analyzer.
type Analyzer struct {
Expand All @@ -24,6 +27,9 @@ func (r *Analyzer) Run() (b *builder.Issues, err error) {
b = &builder.Issues{Path: output}
err = cmd.Run()
if err != nil {
if errors.Is(err, &RuleError{}) {
err.(*RuleError).Report()
}
return
}
return
Expand All @@ -33,13 +39,13 @@ func (r *Analyzer) Run() (b *builder.Issues, err error) {
// options builds Analyzer options.
func (r *Analyzer) options(output string) (options command.Options, err error) {
settings := &Settings{}
err = settings.Read(SETTINGS)
err = settings.Read()
if err != nil {
return
}
options = command.Options{
"--provider-settings",
SETTINGS,
settings.path(),
"--output-file",
output,
}
Expand All @@ -59,10 +65,11 @@ func (r *Analyzer) options(output string) (options command.Options, err error) {
if err != nil {
return
}
err = settings.Write(SETTINGS)
err = settings.Write()
if err != nil {
return
}
settings.Report()
return
}

Expand Down Expand Up @@ -93,21 +100,21 @@ func (r *DepAnalyzer) Run() (b *builder.Deps, err error) {
// options builds Analyzer options.
func (r *DepAnalyzer) options(output string) (options command.Options, err error) {
settings := &Settings{}
err = settings.Read(SETTINGS)
err = settings.Read()
if err != nil {
return
}
options = command.Options{
"--provider-settings",
SETTINGS,
settings.path(),
"--output-file",
output,
}
err = r.Mode.AddOptions(settings)
if err != nil {
return
}
err = settings.Write(SETTINGS)
err = settings.Write()
if err != nil {
return
}
Expand Down
68 changes: 68 additions & 0 deletions cmd/cmd_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package main

import (
"github.com/onsi/gomega"
"testing"
)

func TestRuleSelector(t *testing.T) {
g := gomega.NewGomegaWithT(t)
// all clauses
selector := RuleSelector{}
selector.Included = []string{
"p1",
"p2",
"konveyor.io/source=s1",
"konveyor.io/source=s2",
"konveyor.io/target=t1",
"konveyor.io/target=t2",
}
expected :=
"(p1||p2)||((konveyor.io/source=s1||konveyor.io/source=s2)&&(konveyor.io/target=t1||konveyor.io/target=t2))"
g.Expect(selector.String()).To(gomega.Equal(expected))
// other
selector = RuleSelector{}
selector.Included = []string{
"p1",
"p2",
}
expected = "(p1||p2)"
g.Expect(selector.String()).To(gomega.Equal(expected))
// sources and targets
selector = RuleSelector{}
selector.Included = []string{
"konveyor.io/source=s1",
"konveyor.io/source=s2",
"konveyor.io/target=t1",
"konveyor.io/target=t2",
}
expected =
"(konveyor.io/source=s1||konveyor.io/source=s2)&&(konveyor.io/target=t1||konveyor.io/target=t2)"
g.Expect(selector.String()).To(gomega.Equal(expected))
// sources
selector = RuleSelector{}
selector.Included = []string{
"konveyor.io/source=s1",
"konveyor.io/source=s2",
}
expected = "(konveyor.io/source=s1||konveyor.io/source=s2)"
g.Expect(selector.String()).To(gomega.Equal(expected))
// targets
selector = RuleSelector{}
selector.Included = []string{
"konveyor.io/target=t1",
"konveyor.io/target=t2",
}
expected = "(konveyor.io/target=t1||konveyor.io/target=t2)"
g.Expect(selector.String()).To(gomega.Equal(expected))
// other and targets
selector = RuleSelector{}
selector.Included = []string{
"p1",
"p2",
"konveyor.io/target=t1",
"konveyor.io/target=t2",
}
expected = "(p1||p2)||(konveyor.io/target=t1||konveyor.io/target=t2)"
g.Expect(selector.String()).To(gomega.Equal(expected))
}
16 changes: 0 additions & 16 deletions cmd/labels.go

This file was deleted.

4 changes: 3 additions & 1 deletion cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,13 @@ var (
Dir = ""
M2Dir = ""
RuleDir = ""
OptDir = ""
Source = "Analysis"
)

func init() {
Dir, _ = os.Getwd()
OptDir = path.Join(Dir, "opt")
SourceDir = path.Join(Dir, "source")
BinDir = path.Join(Dir, "bin")
RuleDir = path.Join(Dir, "rules")
Expand Down Expand Up @@ -58,7 +60,7 @@ func main() {
}
//
// Create directories.
for _, dir := range []string{BinDir, M2Dir, RuleDir} {
for _, dir := range []string{BinDir, M2Dir, RuleDir, OptDir} {
err = nas.MkDir(dir, 0755)
if err != nil {
return
Expand Down
Loading