Skip to content

Commit

Permalink
✨ Add support for modes and bimary analysis. (#19)
Browse files Browse the repository at this point in the history
Add support for modes:
- binary
  - with uploaded binary
  - with maven coordinates.
- source
- source+deps

Support RuleSet dependencies.
Set maven settings.xml for credentials.

Structured error reporting.  Includes reporting analyzer rule errors.

Disabled reporting application facts for now. The _Extras_ are not
facts.

closes #18

---------

Signed-off-by: Jeff Ortel <[email protected]>
  • Loading branch information
jortel authored Jul 7, 2023
1 parent 7ad6351 commit 555f4c0
Show file tree
Hide file tree
Showing 10 changed files with 462 additions and 126 deletions.
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

0 comments on commit 555f4c0

Please sign in to comment.