diff --git a/pkg/analyzer/deployment.go b/pkg/analyzer/deployment.go index 5ece4e5c..df33b0db 100644 --- a/pkg/analyzer/deployment.go +++ b/pkg/analyzer/deployment.go @@ -54,7 +54,7 @@ func (d DeploymentAnalyzer) Analyze(a common.Analyzer) ([]common.Result, error) for _, deployment := range deployments.Items { var failures []common.Failure - if *deployment.Spec.Replicas != deployment.Status.ReadyReplicas { + if deployment.Spec.Replicas != nil && *deployment.Spec.Replicas != deployment.Status.ReadyReplicas { if deployment.Status.Replicas > *deployment.Spec.Replicas { doc := apiDoc.GetApiDocV2("spec.replicas") diff --git a/pkg/analyzer/deployment_test.go b/pkg/analyzer/deployment_test.go index d7486351..9e214949 100644 --- a/pkg/analyzer/deployment_test.go +++ b/pkg/analyzer/deployment_test.go @@ -74,6 +74,48 @@ func TestDeploymentAnalyzer(t *testing.T) { assert.Equal(t, analysisResults[0].Name, "default/example") } +func TestDeploymentAnalyzerNilReplicas(t *testing.T) { + // A Deployment with an unset spec.replicas (nil) must not panic the analyzer. + clientset := fake.NewSimpleClientset(&appsv1.Deployment{ + ObjectMeta: metav1.ObjectMeta{ + Name: "example", + Namespace: "default", + }, + Spec: appsv1.DeploymentSpec{ + Replicas: nil, + Template: v1.PodTemplateSpec{ + Spec: v1.PodSpec{ + Containers: []v1.Container{ + { + Name: "example-container", + Image: "nginx", + }, + }, + }, + }, + }, + Status: appsv1.DeploymentStatus{ + Replicas: 2, + AvailableReplicas: 1, + }, + }) + + config := common.Analyzer{ + Client: &kubernetes.Client{ + Client: clientset, + }, + Context: context.Background(), + Namespace: "default", + } + + deploymentAnalyzer := DeploymentAnalyzer{} + analysisResults, err := deploymentAnalyzer.Analyze(config) + if err != nil { + t.Error(err) + } + assert.Equal(t, len(analysisResults), 0) +} + func TestDeploymentAnalyzerNamespaceFiltering(t *testing.T) { clientset := fake.NewSimpleClientset( &appsv1.Deployment{