diff --git a/cmd/analyze-bin.go b/cmd/analyze-bin.go index 03e87f44..77529f72 100644 --- a/cmd/analyze-bin.go +++ b/cmd/analyze-bin.go @@ -265,6 +265,7 @@ func (a *analyzeCommand) RunAnalysisContainerless(ctx context.Context) error { if a.enableDefaultRulesets { a.rules = append(a.rules, filepath.Join(a.kantraDir, RulesetsLocation)) } + providerConditions := map[string][]provider.ConditionsByCap{} progressMode.Printf(" ✓ Started rules engine\n") @@ -273,7 +274,7 @@ func (a *analyzeCommand) RunAnalysisContainerless(ctx context.Context) error { for _, f := range a.rules { operationalLog.Info("parsing rules for analysis", "rules", f) - internRuleSet, internNeedProviders, err := parser.LoadRules(f) + internRuleSet, internNeedProviders, provConditions, err := parser.LoadRules(f) if err != nil { a.log.Error(err, "unable to parse all the rules for ruleset", "file", f) } @@ -281,6 +282,20 @@ func (a *analyzeCommand) RunAnalysisContainerless(ctx context.Context) error { for k, v := range internNeedProviders { needProviders[k] = v } + for k, v := range provConditions { + if _, ok := providerConditions[k]; !ok { + providerConditions[k] = []provider.ConditionsByCap{} + } + providerConditions[k] = append(providerConditions[k], v...) + } + } + + for name, conditions := range providerConditions { + if provider, ok := needProviders[name]; ok { + if err := provider.Prepare(ctx, conditions); err != nil { + errLog.Error(err, "unable to prepare provider", "provider", name) + } + } } operationalLog.Info("[TIMING] Rule loading complete", "duration_ms", time.Since(startRuleLoading).Milliseconds()) @@ -314,8 +329,8 @@ func (a *analyzeCommand) RunAnalysisContainerless(ctx context.Context) error { // Cancel progress context and wait for goroutine to finish if progressMode.IsEnabled() { - progressCancel() // This closes the Events() channel - <-progressDone // Wait for goroutine to finish + progressCancel() // This closes the Events() channel + <-progressDone // Wait for goroutine to finish } engineSpan.End() diff --git a/cmd/analyze-hybrid.go b/cmd/analyze-hybrid.go index 611b2568..fc001388 100644 --- a/cmd/analyze-hybrid.go +++ b/cmd/analyze-hybrid.go @@ -269,7 +269,7 @@ func (a *analyzeCommand) setupNetworkProvider(ctx context.Context, providerName providerConfig := provider.Config{ Name: providerName, Address: fmt.Sprintf("localhost:%d", provInit.port), // Connect to containerized provider - BinaryPath: "", // Empty = network mode + BinaryPath: "", // Empty = network mode InitConfig: []provider.InitConfig{ { Location: util.SourceMountPath, // Path inside provider container @@ -396,8 +396,8 @@ func (a *analyzeCommand) setupBuiltinProviderHybrid(ctx context.Context, additio Name: "builtin", InitConfig: []provider.InitConfig{ { - Location: a.input, - AnalysisMode: provider.AnalysisMode(a.mode), + Location: a.input, + AnalysisMode: provider.AnalysisMode(a.mode), ProviderSpecificConfig: map[string]interface{}{ // Don't set excludedDirs - let analyzer-lsp use default exclusions // (node_modules, vendor, dist, build, target, .git, .venv, venv) @@ -741,15 +741,16 @@ func (a *analyzeCommand) RunAnalysisHybridInProcess(ctx context.Context) error { // Parallelize rule loading across multiple rulesets type ruleLoadResult struct { - rulePath string - ruleSets []engine.RuleSet - providers map[string]provider.InternalProviderClient - err error + rulePath string + ruleSets []engine.RuleSet + providers map[string]provider.InternalProviderClient + provConditions map[string][]provider.ConditionsByCap + err error } var ruleWg sync.WaitGroup resultChan := make(chan ruleLoadResult, len(a.rules)) - + providerConditions := map[string][]provider.ConditionsByCap{} // Load each ruleset in parallel for _, f := range a.rules { ruleWg.Add(1) @@ -757,16 +758,17 @@ func (a *analyzeCommand) RunAnalysisHybridInProcess(ctx context.Context) error { defer ruleWg.Done() a.log.Info("parsing rules for analysis", "rules", rulePath) - internRuleSet, internNeedProviders, err := ruleParser.LoadRules(rulePath) + internRuleSet, internNeedProviders, provConditions, err := ruleParser.LoadRules(rulePath) if err != nil { a.log.Error(err, "unable to parse all the rules for ruleset", "file", rulePath) } resultChan <- ruleLoadResult{ - rulePath: rulePath, - ruleSets: internRuleSet, - providers: internNeedProviders, - err: err, + rulePath: rulePath, + ruleSets: internRuleSet, + providers: internNeedProviders, + provConditions: provConditions, + err: err, } }(f) } @@ -786,6 +788,12 @@ func (a *analyzeCommand) RunAnalysisHybridInProcess(ctx context.Context) error { for k, v := range result.providers { needProviders[k] = v } + for k, v := range result.provConditions { + if _, ok := providerConditions[k]; !ok { + providerConditions[k] = []provider.ConditionsByCap{} + } + providerConditions[k] = append(providerConditions[k], v...) + } } // Check if we have at least one ruleset loaded successfully @@ -805,6 +813,15 @@ func (a *analyzeCommand) RunAnalysisHybridInProcess(ctx context.Context) error { a.log.Info("[TIMING] Rule loading complete", "duration_ms", time.Since(startRuleLoading).Milliseconds()) + // prpare the providers + for name, conditions := range providerConditions { + if provider, ok := needProviders[name]; ok { + if err := provider.Prepare(ctx, conditions); err != nil { + errLog.Error(err, "unable to prepare provider", "provider", name) + } + } + } + // Start dependency analysis for full analysis mode wg := &sync.WaitGroup{} var depSpan trace.Span @@ -830,7 +847,6 @@ func (a *analyzeCommand) RunAnalysisHybridInProcess(ctx context.Context) error { if progressCancel != nil { defer progressCancel() } - // Run analysis with progress reporter rulesets := eng.RunRulesWithOptions(ctx, ruleSets, []engine.RunOption{ engine.WithProgressReporter(reporter), @@ -838,8 +854,8 @@ func (a *analyzeCommand) RunAnalysisHybridInProcess(ctx context.Context) error { // Cancel progress context and wait for goroutine to finish if progressMode.IsEnabled() { - progressCancel() // This closes the Events() channel - <-progressDone // Wait for goroutine to finish + progressCancel() // This closes the Events() channel + <-progressDone // Wait for goroutine to finish } engineSpan.End() diff --git a/go.mod b/go.mod index cc899027..a9241fea 100644 --- a/go.mod +++ b/go.mod @@ -135,8 +135,8 @@ require ( github.com/bombsimon/logrusr/v3 v3.1.0 github.com/codingconcepts/env v0.0.0-20200821220118-a8fbf8d84482 github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/konveyor/analyzer-lsp v0.8.1-alpha.2.0.20251031191139-321209b0bb21 - github.com/konveyor/analyzer-lsp/external-providers/java-external-provider v0.0.0-20251031191139-321209b0bb21 + github.com/konveyor/analyzer-lsp v0.9.0-alpha.1.0.20251122145207-25a951d7e1d9 + github.com/konveyor/analyzer-lsp/external-providers/java-external-provider v0.0.0-20251122145207-25a951d7e1d9 github.com/shopspring/decimal v1.4.0 // indirect github.com/sirupsen/logrus v1.9.3 github.com/spf13/pflag v1.0.7 // indirect diff --git a/go.sum b/go.sum index c3aa4f24..e1912e8d 100644 --- a/go.sum +++ b/go.sum @@ -140,10 +140,10 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/konveyor/analyzer-lsp v0.8.1-alpha.2.0.20251031191139-321209b0bb21 h1:jFr01QAcEz6u0Afy2tMPvWGVaV5oIuI3cdXMxVKP7NA= -github.com/konveyor/analyzer-lsp v0.8.1-alpha.2.0.20251031191139-321209b0bb21/go.mod h1:tZkfGRokJZqtmNVeEPIFlxltZhZXXMM5g2NNdxmhTXM= -github.com/konveyor/analyzer-lsp/external-providers/java-external-provider v0.0.0-20251031191139-321209b0bb21 h1:UAvonakPIqBT0q3Es1Un9rngf8d6HdtcYABDXCETWsU= -github.com/konveyor/analyzer-lsp/external-providers/java-external-provider v0.0.0-20251031191139-321209b0bb21/go.mod h1:QheVeScOOoCMuWMEYO9ypHgoasRaYddedh9cxWJwn94= +github.com/konveyor/analyzer-lsp v0.9.0-alpha.1.0.20251122145207-25a951d7e1d9 h1:sTFkOBUBwmk8vN2zHozNwdo4xQxr1FepfJ4WZGQUVZQ= +github.com/konveyor/analyzer-lsp v0.9.0-alpha.1.0.20251122145207-25a951d7e1d9/go.mod h1:tZkfGRokJZqtmNVeEPIFlxltZhZXXMM5g2NNdxmhTXM= +github.com/konveyor/analyzer-lsp/external-providers/java-external-provider v0.0.0-20251122145207-25a951d7e1d9 h1:Nl8LVmhKU5rb2co5aI0b/k1efpC63nN6CFjiRxk+TP8= +github.com/konveyor/analyzer-lsp/external-providers/java-external-provider v0.0.0-20251122145207-25a951d7e1d9/go.mod h1:+DpIwx2+9oomoBXvE62jk+zyCpI/ozRpW4QQWfi8zOk= github.com/konveyor/asset-generation v0.2.2 h1:bzg4wDO3M4NxayS3b7SKk0f6Ai2MP/mioCZozhphKfw= github.com/konveyor/asset-generation v0.2.2/go.mod h1:X5K2VuEV+PEBAI5O+9mNVDtCW4vFWDvFYRThpea+56U= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=