diff --git a/pkg/analyzer/analyzer.go b/pkg/analyzer/analyzer.go index 8247c1a2e4..b57228d8d2 100644 --- a/pkg/analyzer/analyzer.go +++ b/pkg/analyzer/analyzer.go @@ -11,19 +11,17 @@ import ( "github.com/spf13/viper" ) -var coreAnalyzerMap = map[string]func(ctx context.Context, config *AnalysisConfiguration, - client *kubernetes.Client, aiClient ai.IAI, analysisResults *[]Analysis) error{ - "Pod": AnalyzePod, - "ReplicaSet": AnalyzeReplicaSet, - "PersistentVolumeClaim": AnalyzePersistentVolumeClaim, - "Service": AnalyzeEndpoints, - "Ingress": AnalyzeIngress, +var coreAnalyzerMap = map[string]IAnalyzer{ + "Pod": PodAnalyzer{}, + "ReplicaSet": ReplicaSetAnalyzer{}, + "PersistentVolumeClaim": PvcAnalyzer{}, + "Service": ServiceAnalyzer{}, + "Ingress": IngressAnalyzer{}, } -var additionalAnalyzerMap = map[string]func(ctx context.Context, config *AnalysisConfiguration, - client *kubernetes.Client, aiClient ai.IAI, analysisResults *[]Analysis) error{ - "HorizontalPodAutoScaler": AnalyzeHpa, - "PodDisruptionBudget": AnalyzePdb, +var additionalAnalyzerMap = map[string]IAnalyzer{ + "HorizontalPodAutoScaler": HpaAnalyzer{}, + "PodDisruptionBudget": PdbAnalyzer{}, } func RunAnalysis(ctx context.Context, filters []string, config *AnalysisConfiguration, @@ -37,7 +35,7 @@ func RunAnalysis(ctx context.Context, filters []string, config *AnalysisConfigur // 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 { + if err := analyzer.RunAnalysis(ctx, config, client, aiClient, analysisResults); err != nil { return err } } @@ -48,7 +46,7 @@ func RunAnalysis(ctx context.Context, filters []string, config *AnalysisConfigur if len(filters) != 0 { for _, filter := range filters { if analyzer, ok := analyzerMap[filter]; ok { - if err := analyzer(ctx, config, client, aiClient, analysisResults); err != nil { + if err := analyzer.RunAnalysis(ctx, config, client, aiClient, analysisResults); err != nil { return err } } @@ -59,7 +57,7 @@ func RunAnalysis(ctx context.Context, filters []string, config *AnalysisConfigur // use active_filters for _, filter := range activeFilters { if analyzer, ok := analyzerMap[filter]; ok { - if err := analyzer(ctx, config, client, aiClient, analysisResults); err != nil { + if err := analyzer.RunAnalysis(ctx, config, client, aiClient, analysisResults); err != nil { return err } } @@ -118,11 +116,9 @@ func ListFilters() ([]string, []string) { return coreKeys, additionalKeys } -func getAnalyzerMap() map[string]func(ctx context.Context, config *AnalysisConfiguration, - client *kubernetes.Client, aiClient ai.IAI, analysisResults *[]Analysis) error { +func getAnalyzerMap() map[string]IAnalyzer { - mergedMap := make(map[string]func(ctx context.Context, config *AnalysisConfiguration, - client *kubernetes.Client, aiClient ai.IAI, analysisResults *[]Analysis) error) + mergedMap := make(map[string]IAnalyzer) // add core analyzer for key, value := range coreAnalyzerMap { diff --git a/pkg/analyzer/hpaAnalyzer.go b/pkg/analyzer/hpaAnalyzer.go index ed44970e5c..8ca77d5fba 100644 --- a/pkg/analyzer/hpaAnalyzer.go +++ b/pkg/analyzer/hpaAnalyzer.go @@ -10,7 +10,9 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) -func AnalyzeHpa(ctx context.Context, config *AnalysisConfiguration, client *kubernetes.Client, aiClient ai.IAI, +type HpaAnalyzer struct{} + +func (HpaAnalyzer) RunAnalysis(ctx context.Context, config *AnalysisConfiguration, client *kubernetes.Client, aiClient ai.IAI, analysisResults *[]Analysis) error { list, err := client.GetClient().AutoscalingV1().HorizontalPodAutoscalers(config.Namespace).List(ctx, metav1.ListOptions{}) diff --git a/pkg/analyzer/ianalyzer.go b/pkg/analyzer/ianalyzer.go new file mode 100644 index 0000000000..8cb7a9135f --- /dev/null +++ b/pkg/analyzer/ianalyzer.go @@ -0,0 +1,13 @@ +package analyzer + +import ( + "context" + + "github.com/k8sgpt-ai/k8sgpt/pkg/ai" + "github.com/k8sgpt-ai/k8sgpt/pkg/kubernetes" +) + +type IAnalyzer interface { + RunAnalysis(ctx context.Context, config *AnalysisConfiguration, client *kubernetes.Client, aiClient ai.IAI, + analysisResults *[]Analysis) error +} diff --git a/pkg/analyzer/ingressAnalyzer.go b/pkg/analyzer/ingressAnalyzer.go index 18836b067e..1897f6b9be 100644 --- a/pkg/analyzer/ingressAnalyzer.go +++ b/pkg/analyzer/ingressAnalyzer.go @@ -10,7 +10,9 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) -func AnalyzeIngress(ctx context.Context, config *AnalysisConfiguration, client *kubernetes.Client, aiClient ai.IAI, +type IngressAnalyzer struct{} + +func (IngressAnalyzer) RunAnalysis(ctx context.Context, config *AnalysisConfiguration, client *kubernetes.Client, aiClient ai.IAI, analysisResults *[]Analysis) error { list, err := client.GetClient().NetworkingV1().Ingresses(config.Namespace).List(ctx, metav1.ListOptions{}) diff --git a/pkg/analyzer/pdbAnalyzer.go b/pkg/analyzer/pdbAnalyzer.go index 5d00194ade..f28a74d9b1 100644 --- a/pkg/analyzer/pdbAnalyzer.go +++ b/pkg/analyzer/pdbAnalyzer.go @@ -3,13 +3,16 @@ package analyzer import ( "context" "fmt" + "github.com/k8sgpt-ai/k8sgpt/pkg/ai" "github.com/k8sgpt-ai/k8sgpt/pkg/kubernetes" "github.com/k8sgpt-ai/k8sgpt/pkg/util" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) -func AnalyzePdb(ctx context.Context, config *AnalysisConfiguration, client *kubernetes.Client, aiClient ai.IAI, +type PdbAnalyzer struct{} + +func (PdbAnalyzer) RunAnalysis(ctx context.Context, config *AnalysisConfiguration, client *kubernetes.Client, aiClient ai.IAI, analysisResults *[]Analysis) error { list, err := client.GetClient().PolicyV1().PodDisruptionBudgets(config.Namespace).List(ctx, metav1.ListOptions{}) diff --git a/pkg/analyzer/podAnalyzer.go b/pkg/analyzer/podAnalyzer.go index 2c02ced644..9dc172aa93 100644 --- a/pkg/analyzer/podAnalyzer.go +++ b/pkg/analyzer/podAnalyzer.go @@ -10,7 +10,9 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) -func AnalyzePod(ctx context.Context, config *AnalysisConfiguration, +type PodAnalyzer struct{} + +func (PodAnalyzer) RunAnalysis(ctx context.Context, config *AnalysisConfiguration, client *kubernetes.Client, aiClient ai.IAI, analysisResults *[]Analysis) error { // search all namespaces for pods that are not running diff --git a/pkg/analyzer/pvcAnalyzer.go b/pkg/analyzer/pvcAnalyzer.go index 95b5d9124f..60e5cd2676 100644 --- a/pkg/analyzer/pvcAnalyzer.go +++ b/pkg/analyzer/pvcAnalyzer.go @@ -10,7 +10,9 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) -func AnalyzePersistentVolumeClaim(ctx context.Context, config *AnalysisConfiguration, client *kubernetes.Client, aiClient ai.IAI, analysisResults *[]Analysis) error { +type PvcAnalyzer struct{} + +func (PvcAnalyzer) RunAnalysis(ctx context.Context, config *AnalysisConfiguration, client *kubernetes.Client, aiClient ai.IAI, analysisResults *[]Analysis) error { // search all namespaces for pods that are not running list, err := client.GetClient().CoreV1().PersistentVolumeClaims(config.Namespace).List(ctx, metav1.ListOptions{}) diff --git a/pkg/analyzer/rsAnalyzer.go b/pkg/analyzer/rsAnalyzer.go index 360c7ef038..1f0222cd74 100644 --- a/pkg/analyzer/rsAnalyzer.go +++ b/pkg/analyzer/rsAnalyzer.go @@ -10,7 +10,9 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) -func AnalyzeReplicaSet(ctx context.Context, config *AnalysisConfiguration, +type ReplicaSetAnalyzer struct{} + +func (ReplicaSetAnalyzer) RunAnalysis(ctx context.Context, config *AnalysisConfiguration, client *kubernetes.Client, aiClient ai.IAI, analysisResults *[]Analysis) error { // search all namespaces for pods that are not running diff --git a/pkg/analyzer/serviceAnalyzer.go b/pkg/analyzer/serviceAnalyzer.go index 34c8e930b2..59a5ed444b 100644 --- a/pkg/analyzer/serviceAnalyzer.go +++ b/pkg/analyzer/serviceAnalyzer.go @@ -11,7 +11,9 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) -func AnalyzeEndpoints(ctx context.Context, config *AnalysisConfiguration, client *kubernetes.Client, aiClient ai.IAI, +type ServiceAnalyzer struct{} + +func (ServiceAnalyzer) RunAnalysis(ctx context.Context, config *AnalysisConfiguration, client *kubernetes.Client, aiClient ai.IAI, analysisResults *[]Analysis) error { // search all namespaces for pods that are not running