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

🐛 fixing logs with new command format, adding new format to dep command #523

Merged
merged 1 commit into from
Mar 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 14 additions & 13 deletions cmd/analyzer/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"strings"

logrusr "github.com/bombsimon/logrusr/v3"
"github.com/go-logr/logr"
"github.com/konveyor/analyzer-lsp/engine"
"github.com/konveyor/analyzer-lsp/engine/labels"
"github.com/konveyor/analyzer-lsp/output/v1/konveyor"
Expand Down Expand Up @@ -43,22 +44,15 @@ var (
)

func AnalysisCmd() *cobra.Command {

logrusLog := logrus.New()
logrusLog.SetOutput(os.Stdout)
logrusLog.SetFormatter(&logrus.TextFormatter{})
// need to do research on mapping in logrusr to level here TODO
logrusLog.SetLevel(logrus.Level(logLevel))
log := logrusr.New(logrusLog)

logrusErrLog := logrus.New()
logrusErrLog.SetOutput(os.Stderr)
errLog := logrusr.New(logrusErrLog)
var errLog logr.Logger

rootCmd := &cobra.Command{
Use: "analyze",
Short: "Tool for working with analyzer-lsp",
Use: "konveyor-analyzer",
Short: "Tool for working with konveyor-analyzer",
PreRunE: func(c *cobra.Command, args []string) error {
logrusErrLog := logrus.New()
logrusErrLog.SetOutput(os.Stderr)
errLog = logrusr.New(logrusErrLog)
err := validateFlags()
if err != nil {
errLog.Error(err, "failed to validate flags")
Expand All @@ -70,6 +64,13 @@ func AnalysisCmd() *cobra.Command {
},
Run: func(c *cobra.Command, args []string) {

logrusLog := logrus.New()
logrusLog.SetOutput(os.Stdout)
logrusLog.SetFormatter(&logrus.TextFormatter{})
// need to do research on mapping in logrusr to level here TODO
logrusLog.SetLevel(logrus.Level(logLevel))
log := logrusr.New(logrusLog)

// This will globally prevent the yaml library from auto-wrapping lines at 80 characters
yaml.FutureLineWrap()

Expand Down
284 changes: 149 additions & 135 deletions cmd/dep/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"time"

"github.com/bombsimon/logrusr/v3"
"github.com/go-logr/logr"
"github.com/konveyor/analyzer-lsp/engine/labels"
"github.com/konveyor/analyzer-lsp/output/v1/konveyor"
"github.com/konveyor/analyzer-lsp/provider"
Expand All @@ -23,173 +24,186 @@ var (
treeOutput bool
outputFile string
depLabelSelector string

rootCmd = &cobra.Command{
Use: "analyze",
Short: "Tool for working with analyzer-lsp",
Run: func(c *cobra.Command, args []string) {},
}
)

func init() {
rootCmd.Flags().StringVar(&providerSettings, "provider-settings", "provider_settings.json", "path to the provider settings")
rootCmd.Flags().BoolVar(&treeOutput, "tree", false, "output dependencies as a tree")
rootCmd.Flags().StringVar(&outputFile, "output-file", "output.yaml", "path to output file")
rootCmd.Flags().StringVar(&depLabelSelector, "dep-label-selector", "", "an expression to select dependencies based on labels provided by the provider")
}

func main() {
if err := rootCmd.Execute(); err != nil {
println(err.Error())
}

logrusLog := logrus.New()
logrusLog.SetOutput(os.Stdout)
logrusLog.SetFormatter(&logrus.TextFormatter{})
log := logrusr.New(logrusLog)

logrusErrLog := logrus.New()
logrusErrLog.SetOutput(os.Stderr)
errLog := logrusr.New(logrusErrLog)

err := validateFlags()
if err != nil {
errLog.Error(err, "failed to validate input flags")
os.Exit(1)
}
func DependencyCmd() *cobra.Command {

var errLog logr.Logger
rootCmd := &cobra.Command{
Use: "konveyor-analyzer-dep",
Short: "tool for retrieving dependencies from konveyor-analyzer dependecy providers",
PreRunE: func(c *cobra.Command, args []string) error {
logrusErrLog := logrus.New()
logrusErrLog.SetOutput(os.Stderr)
errLog = logrusr.New(logrusErrLog)
err := validateFlags()
if err != nil {
errLog.Error(err, "failed to validate flags")

var labelSelector *labels.LabelSelector[*konveyor.Dep]
if depLabelSelector != "" {
labelSelector, err = labels.NewLabelSelector[*konveyor.Dep](depLabelSelector, nil)
if err != nil {
errLog.Error(err, "invalid label selector")
os.Exit(1)
}
}
return err
}

ctx, cancelFunc := context.WithCancel(context.Background())
defer cancelFunc()
return nil
},
Run: func(c *cobra.Command, args []string) {
logrusLog := logrus.New()
logrusLog.SetOutput(os.Stdout)
logrusLog.SetFormatter(&logrus.TextFormatter{})
log := logrusr.New(logrusLog)
var labelSelector *labels.LabelSelector[*konveyor.Dep]
var err error
if depLabelSelector != "" {
labelSelector, err = labels.NewLabelSelector[*konveyor.Dep](depLabelSelector, nil)
if err != nil {
errLog.Error(err, "invalid label selector")
os.Exit(1)
}
}

providers := map[string]provider.Client{}
ctx, cancelFunc := context.WithCancel(context.Background())
defer cancelFunc()

// Get the configs
configs, err := provider.GetConfig(providerSettings)
if err != nil {
errLog.Error(err, "unable to get configuration")
os.Exit(1)
}
providers := map[string]provider.Client{}

for _, config := range configs {
prov, err := lib.GetProviderClient(config, log)
if err != nil {
errLog.Error(err, "unable to create provider client")
os.Exit(1)
}
if s, ok := prov.(provider.Startable); ok {
if err := s.Start(ctx); err != nil {
errLog.Error(err, "unable to create provider client")
// Get the configs
configs, err := provider.GetConfig(providerSettings)
if err != nil {
errLog.Error(err, "unable to get configuration")
os.Exit(1)
}
}

time.Sleep(5 * time.Second)

err = prov.ProviderInit(ctx)
b, _ := json.Marshal(config)
if err != nil {
errLog.Error(err, "unable to init the providers", "provider", config.Name, "the-error-is", err, "config", string(b))
os.Exit(1)
} else {
log.Info("init'd provider", "provider", config.Name, "config", string(b))
}
providers[config.Name] = prov
for _, config := range configs {
prov, err := lib.GetProviderClient(config, log)
if err != nil {
errLog.Error(err, "unable to create provider client")
os.Exit(1)
}
if s, ok := prov.(provider.Startable); ok {
if err := s.Start(ctx); err != nil {
errLog.Error(err, "unable to create provider client")
os.Exit(1)
}
}

}
time.Sleep(5 * time.Second)

var depsFlat []konveyor.DepsFlatItem
var depsTree []konveyor.DepsTreeItem
for name, prov := range providers {
if !provider.HasCapability(prov.Capabilities(), "dependency") {
log.Info("provider does not have dependency capability", "provider", name)
continue
}
err = prov.ProviderInit(ctx)
b, _ := json.Marshal(config)
if err != nil {
errLog.Error(err, "unable to init the providers", "provider", config.Name, "the-error-is", err, "config", string(b))
os.Exit(1)
} else {
log.Info("init'd provider", "provider", config.Name, "config", string(b))
}
providers[config.Name] = prov

if treeOutput {
deps, err := prov.GetDependenciesDAG(ctx)
if err != nil {
errLog.Error(err, "failed to get list of dependencies for provider", "provider", name)
continue
}
for u, ds := range deps {
depsTree = append(depsTree, konveyor.DepsTreeItem{
FileURI: string(u),
Provider: name,
Dependencies: ds,
})
}
} else {
deps, err := prov.GetDependencies(ctx)
if err != nil {
errLog.Error(err, "failed to get list of dependencies for provider", "provider", name)
continue
}
for u, ds := range deps {
newDeps := ds
if labelSelector != nil {
newDeps, err = labelSelector.MatchList(ds)

var depsFlat []konveyor.DepsFlatItem
var depsTree []konveyor.DepsTreeItem
for name, prov := range providers {
if !provider.HasCapability(prov.Capabilities(), "dependency") {
log.Info("provider does not have dependency capability", "provider", name)
continue
}

if treeOutput {
deps, err := prov.GetDependenciesDAG(ctx)
if err != nil {
errLog.Error(err, "error matching label selector on deps")
errLog.Error(err, "failed to get list of dependencies for provider", "provider", name)
continue
}
for u, ds := range deps {
depsTree = append(depsTree, konveyor.DepsTreeItem{
FileURI: string(u),
Provider: name,
Dependencies: ds,
})
}
} else {
deps, err := prov.GetDependencies(ctx)
if err != nil {
errLog.Error(err, "failed to get list of dependencies for provider", "provider", name)
continue
}
for u, ds := range deps {
newDeps := ds
if labelSelector != nil {
newDeps, err = labelSelector.MatchList(ds)
if err != nil {
errLog.Error(err, "error matching label selector on deps")
continue
}
}
depsFlat = append(depsFlat, konveyor.DepsFlatItem{
Provider: name,
FileURI: string(u),
Dependencies: newDeps,
})
}
}
depsFlat = append(depsFlat, konveyor.DepsFlatItem{
Provider: name,
FileURI: string(u),
Dependencies: newDeps,
})
}
}
}

// stop providers before exiting
for _, prov := range providers {
prov.Stop()
}
// stop providers before exiting
for _, prov := range providers {
prov.Stop()
}

if depsFlat == nil && depsTree == nil {
errLog.Info("failed to get dependencies from all given providers")
os.Exit(1)
}
if depsFlat == nil && depsTree == nil {
errLog.Info("failed to get dependencies from all given providers")
os.Exit(1)
}

var b []byte
if treeOutput {
b, err = yaml.Marshal(depsTree)
if err != nil {
errLog.Error(err, "failed to marshal dependency data as yaml")
os.Exit(1)
}
} else {
// Sort depsFlat
sort.SliceStable(depsFlat, func(i, j int) bool {
if depsFlat[i].Provider == depsFlat[j].Provider {
return depsFlat[i].FileURI < depsFlat[j].FileURI
var b []byte
if treeOutput {
b, err = yaml.Marshal(depsTree)
if err != nil {
errLog.Error(err, "failed to marshal dependency data as yaml")
os.Exit(1)
}
} else {
return depsFlat[i].Provider < depsFlat[j].Provider
// Sort depsFlat
sort.SliceStable(depsFlat, func(i, j int) bool {
if depsFlat[i].Provider == depsFlat[j].Provider {
return depsFlat[i].FileURI < depsFlat[j].FileURI
} else {
return depsFlat[i].Provider < depsFlat[j].Provider
}
})

b, err = yaml.Marshal(depsFlat)
if err != nil {
errLog.Error(err, "failed to marshal dependency data as yaml")
os.Exit(1)
}
}
})

b, err = yaml.Marshal(depsFlat)
if err != nil {
errLog.Error(err, "failed to marshal dependency data as yaml")
os.Exit(1)
}
err = os.WriteFile(outputFile, b, 0644)
if err != nil {
errLog.Error(err, "failed to write dependencies to output file", "file", outputFile)
os.Exit(1)
}

},
}
rootCmd.Flags().StringVar(&providerSettings, "provider-settings", "provider_settings.json", "path to the provider settings")
rootCmd.Flags().BoolVar(&treeOutput, "tree", false, "output dependencies as a tree")
rootCmd.Flags().StringVar(&outputFile, "output-file", "output.yaml", "path to output file")
rootCmd.Flags().StringVar(&depLabelSelector, "dep-label-selector", "", "an expression to select dependencies based on labels provided by the provider")
return rootCmd

err = os.WriteFile(outputFile, b, 0644)
if err != nil {
errLog.Error(err, "failed to write dependencies to output file", "file", outputFile)
}

func main() {
if err := DependencyCmd().Execute(); err != nil {
os.Exit(1)
} else if DependencyCmd().Flags().Changed("help") {
return
}

}

func validateFlags() error {
Expand Down
Loading