From 32ddf6691ce083fd4283a1d5ac4b9f02e90df867 Mon Sep 17 00:00:00 2001 From: Matthis Holleville Date: Thu, 30 Mar 2023 22:02:17 +0200 Subject: [PATCH 1/6] feat: add & remove default filter(s) to analyze. Signed-off-by: Matthis Holleville --- README.md | 38 +++++++++++++++++---- cmd/filters/filters.go | 2 ++ cmd/filters/filtersAdd.go | 65 ++++++++++++++++++++++++++++++++++++ cmd/filters/filtersRemove.go | 62 ++++++++++++++++++++++++++++++++++ pkg/analyzer/analyzer.go | 21 ++++++++++-- pkg/util/util.go | 17 ++++++++++ 6 files changed, 195 insertions(+), 10 deletions(-) create mode 100644 cmd/filters/filtersAdd.go create mode 100644 cmd/filters/filtersRemove.go diff --git a/README.md b/README.md index de9c76350f..742ce994d1 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ If you install gcc as suggested, the problem will persist. Therefore, you need t * Currently the default AI provider is OpenAI, you will need to generate an API key from [OpenAI](https://openai.com) * You can do this by running `k8sgpt generate` to open a browser link to generate it * Run `k8sgpt auth` to set it in k8sgpt. -* Run `k8sgpt filters` to manage filters. +* Run `k8sgpt filters` to manage the default filters used by the analyzer. By default, all filters are executed during analysis. * Run `k8sgpt analyze` to run a scan. * And use `k8sgpt analyze --explain` to get a more detailed explanation of the issues. @@ -92,18 +92,42 @@ Flags: Use "k8sgpt [command] --help" for more information about a command. ``` -_Run a scan with the default analyzers_ +_Manage filters_ + +_List filters_ ``` -k8sgpt generate -k8sgpt auth -k8sgpt analyze --explain +k8sgpt filters list ``` -_List filters_ +_Add default filters_ ``` -k8sgpt filters list +k8sgpt filters add [filter(s)] +``` + +### Examples : + +- Simple filter : `k8sgpt filters add Service` +- Multiple filters : `k8sgpt filters add Ingress Pod` + +_Add default filters_ + +``` +k8sgpt filters remove [filter(s)] +``` + +### Examples : + +- Simple filter : `k8sgpt filters remove Service` +- Multiple filters : `k8sgpt filters remove Ingress Pod` + +_Run a scan with the default analyzers_ + +``` +k8sgpt generate +k8sgpt auth +k8sgpt analyze --explain ``` _Filter on resource_ diff --git a/cmd/filters/filters.go b/cmd/filters/filters.go index f2146ffff4..5edcdb2a86 100644 --- a/cmd/filters/filters.go +++ b/cmd/filters/filters.go @@ -20,4 +20,6 @@ var FiltersCmd = &cobra.Command{ func init() { FiltersCmd.AddCommand(filterListCmd) + FiltersCmd.AddCommand(filtersAddCmd) + FiltersCmd.AddCommand(filtersRemoveCmd) } diff --git a/cmd/filters/filtersAdd.go b/cmd/filters/filtersAdd.go new file mode 100644 index 0000000000..bada0943d6 --- /dev/null +++ b/cmd/filters/filtersAdd.go @@ -0,0 +1,65 @@ +package filters + +import ( + "os" + "strings" + + "github.com/fatih/color" + "github.com/k8sgpt-ai/k8sgpt/pkg/analyzer" + "github.com/k8sgpt-ai/k8sgpt/pkg/util" + "github.com/spf13/cobra" + "github.com/spf13/viper" +) + +var filtersAddCmd = &cobra.Command{ + Use: "add [filter(s)]", + Short: "Adds one or more new filters.", + Long: `The add command adds one or more new filters to the default set of filters used by the analyze.`, + Args: cobra.MinimumNArgs(1), + Run: func(cmd *cobra.Command, args []string) { + + // Verify filter exist + invalidFilters := []string{} + for _, f := range args { + foundFilter := false + for _, filter := range analyzer.ListFilters() { + if filter == f { + foundFilter = true + break + } + } + if !foundFilter { + invalidFilters = append(invalidFilters, f) + } + } + + if len(invalidFilters) != 0 { + color.Red("Filter %s does not exist. Please use k8sgpt filters list", strings.Join(invalidFilters, ", ")) + os.Exit(1) + } + + // Get defined default_filters + defaultFilters := viper.GetStringSlice("default_filters") + if len(defaultFilters) == 0 { + defaultFilters = []string{} + } + + mergedFilters := append(defaultFilters, args...) + + uniqueFilters, dupplicateFilters := util.RemoveDuplicates(mergedFilters) + + // Verify dupplicate + if len(dupplicateFilters) != 0 { + color.Red("Duplicate filters found: %s", strings.Join(dupplicateFilters, ", ")) + os.Exit(1) + } + + viper.Set("default_filters", uniqueFilters) + + if err := viper.WriteConfig(); err != nil { + color.Red("Error writing config file: %s", err.Error()) + os.Exit(1) + } + color.Green("Filter %s added", strings.Join(args, ", ")) + }, +} diff --git a/cmd/filters/filtersRemove.go b/cmd/filters/filtersRemove.go new file mode 100644 index 0000000000..7e15387535 --- /dev/null +++ b/cmd/filters/filtersRemove.go @@ -0,0 +1,62 @@ +package filters + +import ( + "os" + "strings" + + "github.com/fatih/color" + "github.com/k8sgpt-ai/k8sgpt/pkg/util" + "github.com/spf13/cobra" + "github.com/spf13/viper" +) + +var filtersRemoveCmd = &cobra.Command{ + Use: "remove [filter(s)]", + Short: "Remove one or more filters.", + Long: `The add command remove one or more filters to the default set of filters used by the analyze.`, + Args: cobra.MinimumNArgs(1), + Run: func(cmd *cobra.Command, args []string) { + + // Get defined default_filters + defaultFilters := viper.GetStringSlice("default_filters") + if len(defaultFilters) == 0 { + defaultFilters = []string{} + } + + // verify dupplicate filters example: k8sgpt filters remove Pod Pod + uniqueFilters, dupplicateFilters := util.RemoveDuplicates(args) + if len(dupplicateFilters) != 0 { + color.Red("Duplicate filters found: %s", strings.Join(dupplicateFilters, ", ")) + os.Exit(1) + } + + // Verify if filter exist in config file and update default_filter + filterNotFound := []string{} + for _, filter := range uniqueFilters { + foundFilter := false + for i, f := range defaultFilters { + if f == filter { + foundFilter = true + defaultFilters = append(defaultFilters[:i], defaultFilters[i+1:]...) + break + } + } + if !foundFilter { + filterNotFound = append(filterNotFound, filter) + } + } + + if len(filterNotFound) != 0 { + color.Red("Filter(s) %s does not exist in configuration file. Please use k8sgpt filters add.", strings.Join(filterNotFound, ", ")) + os.Exit(1) + } + + viper.Set("default_filters", defaultFilters) + + if err := viper.WriteConfig(); err != nil { + color.Red("Error writing config file: %s", err.Error()) + os.Exit(1) + } + color.Green("Filter(s) %s removed", strings.Join(args, ", ")) + }, +} diff --git a/pkg/analyzer/analyzer.go b/pkg/analyzer/analyzer.go index e5a7d954d9..325ace230f 100644 --- a/pkg/analyzer/analyzer.go +++ b/pkg/analyzer/analyzer.go @@ -24,8 +24,10 @@ func RunAnalysis(ctx context.Context, filters []string, config *AnalysisConfigur client *kubernetes.Client, aiClient ai.IAI, analysisResults *[]Analysis) error { - // if there are no filters selected then run all of them - if len(filters) == 0 { + defaultFilters := viper.GetStringSlice("default_filters") + + // if there are no filters selected and no default_filters then run all of them + if len(filters) == 0 && len(defaultFilters) == 0 { for _, analyzer := range analyzerMap { if err := analyzer(ctx, config, client, aiClient, analysisResults); err != nil { return err @@ -34,7 +36,20 @@ func RunAnalysis(ctx context.Context, filters []string, config *AnalysisConfigur return nil } - for _, filter := range filters { + // if the filters flag is specified + if len(filters) != 0 { + for _, filter := range filters { + if analyzer, ok := analyzerMap[filter]; ok { + if err := analyzer(ctx, config, client, aiClient, analysisResults); err != nil { + return err + } + } + } + return nil + } + + // use default_filters + for _, filter := range defaultFilters { if analyzer, ok := analyzerMap[filter]; ok { if err := analyzer(ctx, config, client, aiClient, analysisResults); err != nil { return err diff --git a/pkg/util/util.go b/pkg/util/util.go index 598a8c73c3..79a7223f37 100644 --- a/pkg/util/util.go +++ b/pkg/util/util.go @@ -65,3 +65,20 @@ func GetParent(client *kubernetes.Client, meta metav1.ObjectMeta) (string, bool) } return meta.Name, false } + +func RemoveDuplicates(slice []string) ([]string, []string) { + set := make(map[string]bool) + duplicates := []string{} + for _, val := range slice { + if _, ok := set[val]; !ok { + set[val] = true + } else { + duplicates = append(duplicates, val) + } + } + uniqueSlice := make([]string, 0, len(set)) + for val := range set { + uniqueSlice = append(uniqueSlice, val) + } + return uniqueSlice, duplicates +} From 30faf842541c0be6b6483f71f6cf04d5cafecef5 Mon Sep 17 00:00:00 2001 From: Matthis Holleville Date: Fri, 31 Mar 2023 12:55:16 +0200 Subject: [PATCH 2/6] feat: remove filter prefix on subcommand Signed-off-by: Matthis Holleville --- cmd/filters/{filtersAdd.go => add.go} | 2 +- cmd/filters/filters.go | 6 +++--- cmd/filters/list.go | 2 +- cmd/filters/{filtersRemove.go => remove.go} | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) rename cmd/filters/{filtersAdd.go => add.go} (97%) rename cmd/filters/{filtersRemove.go => remove.go} (97%) diff --git a/cmd/filters/filtersAdd.go b/cmd/filters/add.go similarity index 97% rename from cmd/filters/filtersAdd.go rename to cmd/filters/add.go index bada0943d6..32aa99aa9a 100644 --- a/cmd/filters/filtersAdd.go +++ b/cmd/filters/add.go @@ -11,7 +11,7 @@ import ( "github.com/spf13/viper" ) -var filtersAddCmd = &cobra.Command{ +var addCmd = &cobra.Command{ Use: "add [filter(s)]", Short: "Adds one or more new filters.", Long: `The add command adds one or more new filters to the default set of filters used by the analyze.`, diff --git a/cmd/filters/filters.go b/cmd/filters/filters.go index 5edcdb2a86..eb555240be 100644 --- a/cmd/filters/filters.go +++ b/cmd/filters/filters.go @@ -19,7 +19,7 @@ var FiltersCmd = &cobra.Command{ } func init() { - FiltersCmd.AddCommand(filterListCmd) - FiltersCmd.AddCommand(filtersAddCmd) - FiltersCmd.AddCommand(filtersRemoveCmd) + FiltersCmd.AddCommand(listCmd) + FiltersCmd.AddCommand(addCmd) + FiltersCmd.AddCommand(removeCmd) } diff --git a/cmd/filters/list.go b/cmd/filters/list.go index 3f230b522c..006cf7b1fc 100644 --- a/cmd/filters/list.go +++ b/cmd/filters/list.go @@ -8,7 +8,7 @@ import ( "github.com/spf13/cobra" ) -var filterListCmd = &cobra.Command{ +var listCmd = &cobra.Command{ Use: "list", Short: "List available filters", Long: `The list command displays a list of available filters that can be used to analyze Kubernetes resources.`, diff --git a/cmd/filters/filtersRemove.go b/cmd/filters/remove.go similarity index 97% rename from cmd/filters/filtersRemove.go rename to cmd/filters/remove.go index 7e15387535..cb8705218b 100644 --- a/cmd/filters/filtersRemove.go +++ b/cmd/filters/remove.go @@ -10,7 +10,7 @@ import ( "github.com/spf13/viper" ) -var filtersRemoveCmd = &cobra.Command{ +var removeCmd = &cobra.Command{ Use: "remove [filter(s)]", Short: "Remove one or more filters.", Long: `The add command remove one or more filters to the default set of filters used by the analyze.`, From 0a124484a23789376258413e73628c7b1d7abded Mon Sep 17 00:00:00 2001 From: Matthis Holleville Date: Fri, 31 Mar 2023 13:02:26 +0200 Subject: [PATCH 3/6] fix: spelling on dupplicateFilters Signed-off-by: Matthis Holleville --- cmd/filters/add.go | 6 +++--- cmd/filters/remove.go | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cmd/filters/add.go b/cmd/filters/add.go index 32aa99aa9a..e6b67cc943 100644 --- a/cmd/filters/add.go +++ b/cmd/filters/add.go @@ -46,11 +46,11 @@ var addCmd = &cobra.Command{ mergedFilters := append(defaultFilters, args...) - uniqueFilters, dupplicateFilters := util.RemoveDuplicates(mergedFilters) + uniqueFilters, dupplicatedFilters := util.RemoveDuplicates(mergedFilters) // Verify dupplicate - if len(dupplicateFilters) != 0 { - color.Red("Duplicate filters found: %s", strings.Join(dupplicateFilters, ", ")) + if len(dupplicatedFilters) != 0 { + color.Red("Duplicate filters found: %s", strings.Join(dupplicatedFilters, ", ")) os.Exit(1) } diff --git a/cmd/filters/remove.go b/cmd/filters/remove.go index cb8705218b..02168e2304 100644 --- a/cmd/filters/remove.go +++ b/cmd/filters/remove.go @@ -24,9 +24,9 @@ var removeCmd = &cobra.Command{ } // verify dupplicate filters example: k8sgpt filters remove Pod Pod - uniqueFilters, dupplicateFilters := util.RemoveDuplicates(args) - if len(dupplicateFilters) != 0 { - color.Red("Duplicate filters found: %s", strings.Join(dupplicateFilters, ", ")) + uniqueFilters, dupplicatedFilters := util.RemoveDuplicates(args) + if len(dupplicatedFilters) != 0 { + color.Red("Duplicate filters found: %s", strings.Join(dupplicatedFilters, ", ")) os.Exit(1) } From 9aa0e8960ee340208b4749954c99867842ba58b9 Mon Sep 17 00:00:00 2001 From: Matthis Holleville Date: Fri, 31 Mar 2023 13:30:59 +0200 Subject: [PATCH 4/6] feat: update filters add & remove to be more consistent Signed-off-by: Matthis Holleville --- README.md | 4 ++-- cmd/filters/add.go | 9 +++++---- cmd/filters/remove.go | 7 ++++--- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 742ce994d1..02ed7adb5c 100644 --- a/README.md +++ b/README.md @@ -109,7 +109,7 @@ k8sgpt filters add [filter(s)] ### Examples : - Simple filter : `k8sgpt filters add Service` -- Multiple filters : `k8sgpt filters add Ingress Pod` +- Multiple filters : `k8sgpt filters add Ingress,Pod` _Add default filters_ @@ -120,7 +120,7 @@ k8sgpt filters remove [filter(s)] ### Examples : - Simple filter : `k8sgpt filters remove Service` -- Multiple filters : `k8sgpt filters remove Ingress Pod` +- Multiple filters : `k8sgpt filters remove Ingress,Pod` _Run a scan with the default analyzers_ diff --git a/cmd/filters/add.go b/cmd/filters/add.go index e6b67cc943..5a280aa80d 100644 --- a/cmd/filters/add.go +++ b/cmd/filters/add.go @@ -15,12 +15,13 @@ var addCmd = &cobra.Command{ Use: "add [filter(s)]", Short: "Adds one or more new filters.", Long: `The add command adds one or more new filters to the default set of filters used by the analyze.`, - Args: cobra.MinimumNArgs(1), + Args: cobra.ExactArgs(1), Run: func(cmd *cobra.Command, args []string) { + filters := strings.Split(args[0], ",") // Verify filter exist invalidFilters := []string{} - for _, f := range args { + for _, f := range filters { foundFilter := false for _, filter := range analyzer.ListFilters() { if filter == f { @@ -44,7 +45,7 @@ var addCmd = &cobra.Command{ defaultFilters = []string{} } - mergedFilters := append(defaultFilters, args...) + mergedFilters := append(defaultFilters, filters...) uniqueFilters, dupplicatedFilters := util.RemoveDuplicates(mergedFilters) @@ -60,6 +61,6 @@ var addCmd = &cobra.Command{ color.Red("Error writing config file: %s", err.Error()) os.Exit(1) } - color.Green("Filter %s added", strings.Join(args, ", ")) + color.Green("Filter %s added", strings.Join(filters, ", ")) }, } diff --git a/cmd/filters/remove.go b/cmd/filters/remove.go index 02168e2304..3461a0d069 100644 --- a/cmd/filters/remove.go +++ b/cmd/filters/remove.go @@ -14,8 +14,9 @@ var removeCmd = &cobra.Command{ Use: "remove [filter(s)]", Short: "Remove one or more filters.", Long: `The add command remove one or more filters to the default set of filters used by the analyze.`, - Args: cobra.MinimumNArgs(1), + Args: cobra.ExactArgs(1), Run: func(cmd *cobra.Command, args []string) { + filters := strings.Split(args[0], ",") // Get defined default_filters defaultFilters := viper.GetStringSlice("default_filters") @@ -24,7 +25,7 @@ var removeCmd = &cobra.Command{ } // verify dupplicate filters example: k8sgpt filters remove Pod Pod - uniqueFilters, dupplicatedFilters := util.RemoveDuplicates(args) + uniqueFilters, dupplicatedFilters := util.RemoveDuplicates(filters) if len(dupplicatedFilters) != 0 { color.Red("Duplicate filters found: %s", strings.Join(dupplicatedFilters, ", ")) os.Exit(1) @@ -57,6 +58,6 @@ var removeCmd = &cobra.Command{ color.Red("Error writing config file: %s", err.Error()) os.Exit(1) } - color.Green("Filter(s) %s removed", strings.Join(args, ", ")) + color.Green("Filter(s) %s removed", strings.Join(filters, ", ")) }, } From 975813d3284719c877630ad20f90c6fe163283da Mon Sep 17 00:00:00 2001 From: Matthis Holleville Date: Fri, 31 Mar 2023 13:57:03 +0200 Subject: [PATCH 5/6] feat: check if filters does not empty on add & remove Signed-off-by: Matthis Holleville --- cmd/filters/add.go | 4 ++++ cmd/filters/remove.go | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/cmd/filters/add.go b/cmd/filters/add.go index 5a280aa80d..b59379cb22 100644 --- a/cmd/filters/add.go +++ b/cmd/filters/add.go @@ -22,6 +22,10 @@ var addCmd = &cobra.Command{ // Verify filter exist invalidFilters := []string{} for _, f := range filters { + if f == "" { + color.Red("Filter cannot be empty. Please use correct syntax.") + os.Exit(1) + } foundFilter := false for _, filter := range analyzer.ListFilters() { if filter == f { diff --git a/cmd/filters/remove.go b/cmd/filters/remove.go index 3461a0d069..8ebdc48ef2 100644 --- a/cmd/filters/remove.go +++ b/cmd/filters/remove.go @@ -24,6 +24,14 @@ var removeCmd = &cobra.Command{ defaultFilters = []string{} } + // Check if input filters is not empty + for _, f := range filters { + if f == "" { + color.Red("Filter cannot be empty. Please use correct syntax.") + os.Exit(1) + } + } + // verify dupplicate filters example: k8sgpt filters remove Pod Pod uniqueFilters, dupplicatedFilters := util.RemoveDuplicates(filters) if len(dupplicatedFilters) != 0 { From 3ed545f33fb3ecb3827c03e8c89027c61386c44f Mon Sep 17 00:00:00 2001 From: Matthis Holleville Date: Fri, 31 Mar 2023 15:43:52 +0200 Subject: [PATCH 6/6] feat: rework filters Signed-off-by: Matthis Holleville --- README.md | 2 +- cmd/filters/add.go | 21 +++++++++++---------- cmd/filters/list.go | 24 +++++++++++++++++++++--- cmd/filters/remove.go | 25 +++++++++++++------------ pkg/analyzer/analyzer.go | 10 +++++----- pkg/util/util.go | 14 ++++++++++++++ 6 files changed, 65 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index 02ed7adb5c..4007263626 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ If you install gcc as suggested, the problem will persist. Therefore, you need t * Currently the default AI provider is OpenAI, you will need to generate an API key from [OpenAI](https://openai.com) * You can do this by running `k8sgpt generate` to open a browser link to generate it * Run `k8sgpt auth` to set it in k8sgpt. -* Run `k8sgpt filters` to manage the default filters used by the analyzer. By default, all filters are executed during analysis. +* Run `k8sgpt filters` to manage the active filters used by the analyzer. By default, all filters are executed during analysis. * Run `k8sgpt analyze` to run a scan. * And use `k8sgpt analyze --explain` to get a more detailed explanation of the issues. diff --git a/cmd/filters/add.go b/cmd/filters/add.go index b59379cb22..2387fa95a4 100644 --- a/cmd/filters/add.go +++ b/cmd/filters/add.go @@ -17,17 +17,18 @@ var addCmd = &cobra.Command{ Long: `The add command adds one or more new filters to the default set of filters used by the analyze.`, Args: cobra.ExactArgs(1), Run: func(cmd *cobra.Command, args []string) { - filters := strings.Split(args[0], ",") + inputFilters := strings.Split(args[0], ",") + availableFilters := analyzer.ListFilters() // Verify filter exist invalidFilters := []string{} - for _, f := range filters { + for _, f := range inputFilters { if f == "" { color.Red("Filter cannot be empty. Please use correct syntax.") os.Exit(1) } foundFilter := false - for _, filter := range analyzer.ListFilters() { + for _, filter := range availableFilters { if filter == f { foundFilter = true break @@ -43,13 +44,13 @@ var addCmd = &cobra.Command{ os.Exit(1) } - // Get defined default_filters - defaultFilters := viper.GetStringSlice("default_filters") - if len(defaultFilters) == 0 { - defaultFilters = []string{} + // Get defined active_filters + activeFilters := viper.GetStringSlice("active_filters") + if len(activeFilters) == 0 { + activeFilters = availableFilters } - mergedFilters := append(defaultFilters, filters...) + mergedFilters := append(activeFilters, inputFilters...) uniqueFilters, dupplicatedFilters := util.RemoveDuplicates(mergedFilters) @@ -59,12 +60,12 @@ var addCmd = &cobra.Command{ os.Exit(1) } - viper.Set("default_filters", uniqueFilters) + viper.Set("active_filters", uniqueFilters) if err := viper.WriteConfig(); err != nil { color.Red("Error writing config file: %s", err.Error()) os.Exit(1) } - color.Green("Filter %s added", strings.Join(filters, ", ")) + color.Green("Filter %s added", strings.Join(inputFilters, ", ")) }, } diff --git a/cmd/filters/list.go b/cmd/filters/list.go index 006cf7b1fc..349ad8beba 100644 --- a/cmd/filters/list.go +++ b/cmd/filters/list.go @@ -5,7 +5,9 @@ import ( "github.com/fatih/color" "github.com/k8sgpt-ai/k8sgpt/pkg/analyzer" + "github.com/k8sgpt-ai/k8sgpt/pkg/util" "github.com/spf13/cobra" + "github.com/spf13/viper" ) var listCmd = &cobra.Command{ @@ -13,9 +15,25 @@ var listCmd = &cobra.Command{ Short: "List available filters", Long: `The list command displays a list of available filters that can be used to analyze Kubernetes resources.`, Run: func(cmd *cobra.Command, args []string) { - fmt.Printf("Available filters : \n") - for _, analyzer := range analyzer.ListFilters() { - fmt.Printf("> %s\n", color.GreenString(analyzer)) + activeFilters := viper.GetStringSlice("active_filters") + availableFilters := analyzer.ListFilters() + + if len(activeFilters) == 0 { + activeFilters = availableFilters + } + + inactiveFilters := util.SliceDiff(availableFilters, activeFilters) + fmt.Printf(color.YellowString("Active: \n")) + for _, filter := range activeFilters { + fmt.Printf("> %s\n", color.GreenString(filter)) } + // display inactive filters + if len(inactiveFilters) != 0 { + fmt.Printf(color.YellowString("Unused: \n")) + for _, filter := range inactiveFilters { + fmt.Printf("> %s\n", color.RedString(filter)) + } + } + }, } diff --git a/cmd/filters/remove.go b/cmd/filters/remove.go index 8ebdc48ef2..dab99a1e6e 100644 --- a/cmd/filters/remove.go +++ b/cmd/filters/remove.go @@ -5,6 +5,7 @@ import ( "strings" "github.com/fatih/color" + "github.com/k8sgpt-ai/k8sgpt/pkg/analyzer" "github.com/k8sgpt-ai/k8sgpt/pkg/util" "github.com/spf13/cobra" "github.com/spf13/viper" @@ -16,16 +17,16 @@ var removeCmd = &cobra.Command{ Long: `The add command remove one or more filters to the default set of filters used by the analyze.`, Args: cobra.ExactArgs(1), Run: func(cmd *cobra.Command, args []string) { - filters := strings.Split(args[0], ",") + inputFilters := strings.Split(args[0], ",") - // Get defined default_filters - defaultFilters := viper.GetStringSlice("default_filters") - if len(defaultFilters) == 0 { - defaultFilters = []string{} + // Get defined active_filters + activeFilters := viper.GetStringSlice("active_filters") + if len(activeFilters) == 0 { + activeFilters = analyzer.ListFilters() } - // Check if input filters is not empty - for _, f := range filters { + // Check if input input filters is not empty + for _, f := range inputFilters { if f == "" { color.Red("Filter cannot be empty. Please use correct syntax.") os.Exit(1) @@ -33,7 +34,7 @@ var removeCmd = &cobra.Command{ } // verify dupplicate filters example: k8sgpt filters remove Pod Pod - uniqueFilters, dupplicatedFilters := util.RemoveDuplicates(filters) + uniqueFilters, dupplicatedFilters := util.RemoveDuplicates(inputFilters) if len(dupplicatedFilters) != 0 { color.Red("Duplicate filters found: %s", strings.Join(dupplicatedFilters, ", ")) os.Exit(1) @@ -43,10 +44,10 @@ var removeCmd = &cobra.Command{ filterNotFound := []string{} for _, filter := range uniqueFilters { foundFilter := false - for i, f := range defaultFilters { + for i, f := range activeFilters { if f == filter { foundFilter = true - defaultFilters = append(defaultFilters[:i], defaultFilters[i+1:]...) + activeFilters = append(activeFilters[:i], activeFilters[i+1:]...) break } } @@ -60,12 +61,12 @@ var removeCmd = &cobra.Command{ os.Exit(1) } - viper.Set("default_filters", defaultFilters) + viper.Set("active_filters", activeFilters) if err := viper.WriteConfig(); err != nil { color.Red("Error writing config file: %s", err.Error()) os.Exit(1) } - color.Green("Filter(s) %s removed", strings.Join(filters, ", ")) + color.Green("Filter(s) %s removed", strings.Join(inputFilters, ", ")) }, } diff --git a/pkg/analyzer/analyzer.go b/pkg/analyzer/analyzer.go index 325ace230f..72bc8ea786 100644 --- a/pkg/analyzer/analyzer.go +++ b/pkg/analyzer/analyzer.go @@ -24,10 +24,10 @@ func RunAnalysis(ctx context.Context, filters []string, config *AnalysisConfigur client *kubernetes.Client, aiClient ai.IAI, analysisResults *[]Analysis) error { - defaultFilters := viper.GetStringSlice("default_filters") + activeFilters := viper.GetStringSlice("active_filters") - // if there are no filters selected and no default_filters then run all of them - if len(filters) == 0 && len(defaultFilters) == 0 { + // if there are no filters selected and no active_filters then run all of them + if len(filters) == 0 && len(activeFilters) == 0 { for _, analyzer := range analyzerMap { if err := analyzer(ctx, config, client, aiClient, analysisResults); err != nil { return err @@ -48,8 +48,8 @@ func RunAnalysis(ctx context.Context, filters []string, config *AnalysisConfigur return nil } - // use default_filters - for _, filter := range defaultFilters { + // use active_filters + for _, filter := range activeFilters { if analyzer, ok := analyzerMap[filter]; ok { if err := analyzer(ctx, config, client, aiClient, analysisResults); err != nil { return err diff --git a/pkg/util/util.go b/pkg/util/util.go index 79a7223f37..78e3cf3774 100644 --- a/pkg/util/util.go +++ b/pkg/util/util.go @@ -82,3 +82,17 @@ func RemoveDuplicates(slice []string) ([]string, []string) { } return uniqueSlice, duplicates } + +func SliceDiff(source, dest []string) []string { + mb := make(map[string]struct{}, len(dest)) + for _, x := range dest { + mb[x] = struct{}{} + } + var diff []string + for _, x := range source { + if _, found := mb[x]; !found { + diff = append(diff, x) + } + } + return diff +}