From fa087ff5593871d2a07d68f203dd91e66c57e40b Mon Sep 17 00:00:00 2001 From: Matthis Date: Thu, 20 Apr 2023 11:10:29 +0200 Subject: [PATCH] feat: modify error handling to return a list of errors to display to the user at the end of analysis without blocking it if an error is detected (e.g., version of an object is not available on user's cluster) Signed-off-by: Matthis --- cmd/analyze/analyze.go | 9 +++++---- pkg/analysis/analysis.go | 19 +++++++++++-------- pkg/server/server.go | 12 +++++++----- 3 files changed, 23 insertions(+), 17 deletions(-) diff --git a/cmd/analyze/analyze.go b/cmd/analyze/analyze.go index 9522dd3546..dea8225258 100644 --- a/cmd/analyze/analyze.go +++ b/cmd/analyze/analyze.go @@ -36,10 +36,11 @@ var AnalyzeCmd = &cobra.Command{ os.Exit(1) } - err = config.RunAnalysis() - if err != nil { - color.Red("Error: %v", err) - os.Exit(1) + analysisErrors := config.RunAnalysis() + if len(analysisErrors) != 0 { + for _, err := range analysisErrors { + color.Red("Error: %s", err) + } } if explain { diff --git a/pkg/analysis/analysis.go b/pkg/analysis/analysis.go index e7ed414bd5..c8fcadf9aa 100644 --- a/pkg/analysis/analysis.go +++ b/pkg/analysis/analysis.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "os" + "reflect" "strings" "github.com/fatih/color" @@ -95,7 +96,7 @@ func NewAnalysis(backend string, language string, filters []string, namespace st }, nil } -func (a *Analysis) RunAnalysis() error { +func (a *Analysis) RunAnalysis() []error { activeFilters := viper.GetStringSlice("active_filters") analyzerMap := analyzer.GetAnalyzerMap() @@ -107,16 +108,18 @@ func (a *Analysis) RunAnalysis() error { AIClient: a.AIClient, } + var errorList []error + // if there are no filters selected and no active_filters then run all of them if len(a.Filters) == 0 && len(activeFilters) == 0 { for _, analyzer := range analyzerMap { results, err := analyzer.Analyze(analyzerConfig) if err != nil { - return err + errorList = append(errorList, errors.New(fmt.Sprintf("[%s] %s", reflect.TypeOf(analyzer).Name(), err))) } a.Results = append(a.Results, results...) } - return nil + return errorList } // if the filters flag is specified @@ -125,14 +128,14 @@ func (a *Analysis) RunAnalysis() error { if analyzer, ok := analyzerMap[filter]; ok { results, err := analyzer.Analyze(analyzerConfig) if err != nil { - return err + errorList = append(errorList, errors.New(fmt.Sprintf("[%s] %s", filter, err))) } a.Results = append(a.Results, results...) } else { - return errors.New(fmt.Sprintf("\"%s\" filter does not exist. Please run k8sgpt filters list.", filter)) + errorList = append(errorList, errors.New(fmt.Sprintf("\"%s\" filter does not exist. Please run k8sgpt filters list.", filter))) } } - return nil + return errorList } // use active_filters @@ -140,12 +143,12 @@ func (a *Analysis) RunAnalysis() error { if analyzer, ok := analyzerMap[filter]; ok { results, err := analyzer.Analyze(analyzerConfig) if err != nil { - return err + errorList = append(errorList, errors.New(fmt.Sprintf("[%s] %s", filter, err))) } a.Results = append(a.Results, results...) } } - return nil + return errorList } func (a *Analysis) GetAIResults(output string, anonymize bool) error { diff --git a/pkg/server/server.go b/pkg/server/server.go index 341a611159..34e7471ade 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -55,12 +55,14 @@ func (s *Config) analyzeHandler(w http.ResponseWriter, r *http.Request) { return } - err = config.RunAnalysis() - if err != nil { - color.Red("Error: %v", err) + analysisErrors := config.RunAnalysis() + if analysisErrors != nil { + var errorMessage string + for _, err := range analysisErrors { + errorMessage += err.Error() + "\n" + } + http.Error(w, errorMessage, http.StatusInternalServerError) health.Failure++ - http.Error(w, err.Error(), http.StatusInternalServerError) - return } if explain {