From 5a59abb55d9e76f3095b903ea973138b1afdccf2 Mon Sep 17 00:00:00 2001 From: Matthis Holleville Date: Tue, 4 Apr 2023 22:59:26 +0200 Subject: [PATCH 1/4] feat: add tests for hpa analyzer Signed-off-by: Matthis Holleville --- pkg/analyzer/hpaAnalyzer_test.go | 205 +++++++++++++++++++++++++++++++ 1 file changed, 205 insertions(+) create mode 100644 pkg/analyzer/hpaAnalyzer_test.go diff --git a/pkg/analyzer/hpaAnalyzer_test.go b/pkg/analyzer/hpaAnalyzer_test.go new file mode 100644 index 0000000..5ff60eb --- /dev/null +++ b/pkg/analyzer/hpaAnalyzer_test.go @@ -0,0 +1,205 @@ +package analyzer + +import ( + "context" + "strings" + "testing" + + "github.com/k8sgpt-ai/k8sgpt/pkg/kubernetes" + "github.com/magiconair/properties/assert" + appsv1 "k8s.io/api/apps/v1" + autoscalingv1 "k8s.io/api/autoscaling/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes/fake" +) + +func TestHPAAnalyzer(t *testing.T) { + clientset := fake.NewSimpleClientset( + &autoscalingv1.HorizontalPodAutoscaler{ + ObjectMeta: metav1.ObjectMeta{ + Name: "example", + Namespace: "default", + Annotations: map[string]string{}, + }, + }) + hpaAnalyzer := HpaAnalyzer{} + var analysisResults []Analysis + err := hpaAnalyzer.RunAnalysis(context.Background(), + &AnalysisConfiguration{ + Namespace: "default", + }, + &kubernetes.Client{ + Client: clientset, + }, nil, &analysisResults) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + assert.Equal(t, len(analysisResults), 1) +} + +func TestHPAAnalyzerWithMultipleHPA(t *testing.T) { + clientset := fake.NewSimpleClientset( + &autoscalingv1.HorizontalPodAutoscaler{ + ObjectMeta: metav1.ObjectMeta{ + Name: "example", + Namespace: "default", + Annotations: map[string]string{}, + }, + }, + &autoscalingv1.HorizontalPodAutoscaler{ + ObjectMeta: metav1.ObjectMeta{ + Name: "example-2", + Namespace: "default", + Annotations: map[string]string{}, + }, + }, + ) + hpaAnalyzer := HpaAnalyzer{} + var analysisResults []Analysis + err := hpaAnalyzer.RunAnalysis(context.Background(), + &AnalysisConfiguration{ + Namespace: "default", + }, + &kubernetes.Client{ + Client: clientset, + }, nil, &analysisResults) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + assert.Equal(t, len(analysisResults), 2) +} + +func TestHPAAnalyzerWithUnsuportedScaleTargetRef(t *testing.T) { + + clientset := fake.NewSimpleClientset( + &autoscalingv1.HorizontalPodAutoscaler{ + ObjectMeta: metav1.ObjectMeta{ + Name: "example", + Namespace: "default", + Annotations: map[string]string{}, + }, + Spec: autoscalingv1.HorizontalPodAutoscalerSpec{ + ScaleTargetRef: autoscalingv1.CrossVersionObjectReference{ + Kind: "unsuported", + }, + }, + }) + hpaAnalyzer := HpaAnalyzer{} + + var analysisResults []Analysis + err := hpaAnalyzer.RunAnalysis(context.Background(), + &AnalysisConfiguration{ + Namespace: "default", + }, + &kubernetes.Client{ + Client: clientset, + }, nil, &analysisResults) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + var errorFound bool + for _, analysis := range analysisResults { + for _, err := range analysis.Error { + if strings.Contains(err, "does not possible option.") { + errorFound = true + break + } + } + if errorFound { + break + } + } + if !errorFound { + t.Error("expected error 'does not possible option.' not found in analysis results") + } +} + +func TestHPAAnalyzerWithUnexistentScaleTargetRef(t *testing.T) { + + clientset := fake.NewSimpleClientset( + &autoscalingv1.HorizontalPodAutoscaler{ + ObjectMeta: metav1.ObjectMeta{ + Name: "example", + Namespace: "default", + Annotations: map[string]string{}, + }, + Spec: autoscalingv1.HorizontalPodAutoscalerSpec{ + ScaleTargetRef: autoscalingv1.CrossVersionObjectReference{ + Kind: "Deployment", + Name: "unexistent", + }, + }, + }) + hpaAnalyzer := HpaAnalyzer{} + + var analysisResults []Analysis + err := hpaAnalyzer.RunAnalysis(context.Background(), + &AnalysisConfiguration{ + Namespace: "default", + }, + &kubernetes.Client{ + Client: clientset, + }, nil, &analysisResults) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + var errorFound bool + for _, analysis := range analysisResults { + for _, err := range analysis.Error { + if strings.Contains(err, "does not exist.") { + errorFound = true + break + } + } + if errorFound { + break + } + } + if !errorFound { + t.Error("expected error 'does not exist.' not found in analysis results") + } +} + +func TestHPAAnalyzerWithExistingScaleTargetRef(t *testing.T) { + + clientset := fake.NewSimpleClientset( + &autoscalingv1.HorizontalPodAutoscaler{ + ObjectMeta: metav1.ObjectMeta{ + Name: "example", + Namespace: "default", + Annotations: map[string]string{}, + }, + Spec: autoscalingv1.HorizontalPodAutoscalerSpec{ + ScaleTargetRef: autoscalingv1.CrossVersionObjectReference{ + Kind: "Deployment", + Name: "example", + }, + }, + }, + &appsv1.Deployment{ + ObjectMeta: metav1.ObjectMeta{ + Name: "example", + Namespace: "default", + Annotations: map[string]string{}, + }, + }, + ) + hpaAnalyzer := HpaAnalyzer{} + + var analysisResults []Analysis + err := hpaAnalyzer.RunAnalysis(context.Background(), + &AnalysisConfiguration{ + Namespace: "default", + }, + &kubernetes.Client{ + Client: clientset, + }, nil, &analysisResults) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + for _, analysis := range analysisResults { + assert.Equal(t, len(analysis.Error), 0) + } +} From a24d1f1b304e9448e63c1b7fc283b4cc8bc639aa Mon Sep 17 00:00:00 2001 From: Matthis Holleville Date: Wed, 5 Apr 2023 08:53:49 +0200 Subject: [PATCH 2/4] fix: fixed hpa tests after rebase Signed-off-by: Matthis Holleville --- pkg/analyzer/hpaAnalyzer_test.go | 80 ++++++++++++++++---------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/pkg/analyzer/hpaAnalyzer_test.go b/pkg/analyzer/hpaAnalyzer_test.go index 5ff60eb..70bdeaa 100644 --- a/pkg/analyzer/hpaAnalyzer_test.go +++ b/pkg/analyzer/hpaAnalyzer_test.go @@ -23,16 +23,16 @@ func TestHPAAnalyzer(t *testing.T) { }, }) hpaAnalyzer := HpaAnalyzer{} - var analysisResults []Analysis - err := hpaAnalyzer.RunAnalysis(context.Background(), - &AnalysisConfiguration{ - Namespace: "default", - }, - &kubernetes.Client{ + config := Analyzer{ + Client: &kubernetes.Client{ Client: clientset, - }, nil, &analysisResults) + }, + Context: context.Background(), + Namespace: "default", + } + analysisResults, err := hpaAnalyzer.Analyze(config) if err != nil { - t.Fatalf("unexpected error: %v", err) + t.Error(err) } assert.Equal(t, len(analysisResults), 1) } @@ -55,16 +55,16 @@ func TestHPAAnalyzerWithMultipleHPA(t *testing.T) { }, ) hpaAnalyzer := HpaAnalyzer{} - var analysisResults []Analysis - err := hpaAnalyzer.RunAnalysis(context.Background(), - &AnalysisConfiguration{ - Namespace: "default", - }, - &kubernetes.Client{ + config := Analyzer{ + Client: &kubernetes.Client{ Client: clientset, - }, nil, &analysisResults) + }, + Context: context.Background(), + Namespace: "default", + } + analysisResults, err := hpaAnalyzer.Analyze(config) if err != nil { - t.Fatalf("unexpected error: %v", err) + t.Error(err) } assert.Equal(t, len(analysisResults), 2) } @@ -86,16 +86,16 @@ func TestHPAAnalyzerWithUnsuportedScaleTargetRef(t *testing.T) { }) hpaAnalyzer := HpaAnalyzer{} - var analysisResults []Analysis - err := hpaAnalyzer.RunAnalysis(context.Background(), - &AnalysisConfiguration{ - Namespace: "default", - }, - &kubernetes.Client{ + config := Analyzer{ + Client: &kubernetes.Client{ Client: clientset, - }, nil, &analysisResults) + }, + Context: context.Background(), + Namespace: "default", + } + analysisResults, err := hpaAnalyzer.Analyze(config) if err != nil { - t.Fatalf("unexpected error: %v", err) + t.Error(err) } var errorFound bool @@ -133,16 +133,16 @@ func TestHPAAnalyzerWithUnexistentScaleTargetRef(t *testing.T) { }) hpaAnalyzer := HpaAnalyzer{} - var analysisResults []Analysis - err := hpaAnalyzer.RunAnalysis(context.Background(), - &AnalysisConfiguration{ - Namespace: "default", - }, - &kubernetes.Client{ + config := Analyzer{ + Client: &kubernetes.Client{ Client: clientset, - }, nil, &analysisResults) + }, + Context: context.Background(), + Namespace: "default", + } + analysisResults, err := hpaAnalyzer.Analyze(config) if err != nil { - t.Fatalf("unexpected error: %v", err) + t.Error(err) } var errorFound bool @@ -188,16 +188,16 @@ func TestHPAAnalyzerWithExistingScaleTargetRef(t *testing.T) { ) hpaAnalyzer := HpaAnalyzer{} - var analysisResults []Analysis - err := hpaAnalyzer.RunAnalysis(context.Background(), - &AnalysisConfiguration{ - Namespace: "default", - }, - &kubernetes.Client{ + config := Analyzer{ + Client: &kubernetes.Client{ Client: clientset, - }, nil, &analysisResults) + }, + Context: context.Background(), + Namespace: "default", + } + analysisResults, err := hpaAnalyzer.Analyze(config) if err != nil { - t.Fatalf("unexpected error: %v", err) + t.Error(err) } for _, analysis := range analysisResults { assert.Equal(t, len(analysis.Error), 0) From ba4d7016814ce97353e98658d5bbcd692007e4a9 Mon Sep 17 00:00:00 2001 From: Matthis Holleville Date: Wed, 5 Apr 2023 16:06:35 +0200 Subject: [PATCH 3/4] fix: Spelling Signed-off-by: Matthis Holleville --- pkg/analyzer/hpaAnalyzer_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/analyzer/hpaAnalyzer_test.go b/pkg/analyzer/hpaAnalyzer_test.go index 70bdeaa..cbe0a1a 100644 --- a/pkg/analyzer/hpaAnalyzer_test.go +++ b/pkg/analyzer/hpaAnalyzer_test.go @@ -80,7 +80,7 @@ func TestHPAAnalyzerWithUnsuportedScaleTargetRef(t *testing.T) { }, Spec: autoscalingv1.HorizontalPodAutoscalerSpec{ ScaleTargetRef: autoscalingv1.CrossVersionObjectReference{ - Kind: "unsuported", + Kind: "unsupported", }, }, }) @@ -115,7 +115,7 @@ func TestHPAAnalyzerWithUnsuportedScaleTargetRef(t *testing.T) { } } -func TestHPAAnalyzerWithUnexistentScaleTargetRef(t *testing.T) { +func TestHPAAnalyzerWithNonExistentScaleTargetRef(t *testing.T) { clientset := fake.NewSimpleClientset( &autoscalingv1.HorizontalPodAutoscaler{ @@ -127,7 +127,7 @@ func TestHPAAnalyzerWithUnexistentScaleTargetRef(t *testing.T) { Spec: autoscalingv1.HorizontalPodAutoscalerSpec{ ScaleTargetRef: autoscalingv1.CrossVersionObjectReference{ Kind: "Deployment", - Name: "unexistent", + Name: "non-existent", }, }, }) From f5e3ca0bcab9325145a2e1d8624f585ffee8e29f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 5 Apr 2023 16:59:35 +0000 Subject: [PATCH 4/4] fix(deps): update module github.com/stretchr/testify to v1.8.2 Signed-off-by: Renovate Bot --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index a6f10e1..6c428ed 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/schollz/progressbar/v3 v3.13.1 github.com/spf13/cobra v1.7.0 github.com/spf13/viper v1.15.0 - github.com/stretchr/testify v1.8.1 + github.com/stretchr/testify v1.8.2 golang.org/x/term v0.7.0 k8s.io/api v0.26.3 k8s.io/apimachinery v0.26.3 diff --git a/go.sum b/go.sum index 24b7032..2ef6601 100644 --- a/go.sum +++ b/go.sum @@ -254,8 +254,9 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=