From c07f0f5860f2ea072b4a9675f8eba84915d3e7c1 Mon Sep 17 00:00:00 2001 From: Rahul Ganesh Date: Wed, 17 Jul 2024 10:53:53 -0700 Subject: [PATCH] Fix panic when datacenter obj is not found Signed-off-by: Rahul Ganesh --- pkg/cluster/cloudstack.go | 4 ++++ pkg/cluster/cloudstack_test.go | 10 ++++++++++ pkg/cluster/docker.go | 4 ++++ pkg/cluster/docker_test.go | 10 ++++++++++ pkg/cluster/nutanix.go | 4 ++++ pkg/cluster/nutanix_test.go | 5 +++++ pkg/cluster/tinkerbell.go | 4 ++++ pkg/cluster/tinkerbell_test.go | 10 ++++++++++ pkg/cluster/vsphere.go | 4 ++++ pkg/cluster/vsphere_test.go | 10 ++++++++++ 10 files changed, 65 insertions(+) diff --git a/pkg/cluster/cloudstack.go b/pkg/cluster/cloudstack.go index 6a9195d73f65..404143da0943 100644 --- a/pkg/cluster/cloudstack.go +++ b/pkg/cluster/cloudstack.go @@ -2,7 +2,9 @@ package cluster import ( "context" + "fmt" + "github.com/aws/eks-anywhere/pkg/api/v1alpha1" anywherev1 "github.com/aws/eks-anywhere/pkg/api/v1alpha1" ) @@ -38,6 +40,8 @@ func cloudstackEntry() *ConfigManagerEntry { func(c *Config) error { if c.CloudStackDatacenter != nil { return c.CloudStackDatacenter.Validate() + } else if c.Cluster.Spec.DatacenterRef.Kind == v1alpha1.CloudStackDatacenterKind { // We need this conditional check as CloudStackDatacenter will be nil for other providers + return fmt.Errorf("CloudStackDatacenterConfig %s not found", c.Cluster.Spec.DatacenterRef.Name) } return nil }, diff --git a/pkg/cluster/cloudstack_test.go b/pkg/cluster/cloudstack_test.go index f2727d5c976f..7f909311aac4 100644 --- a/pkg/cluster/cloudstack_test.go +++ b/pkg/cluster/cloudstack_test.go @@ -21,6 +21,16 @@ func TestParseConfigMissingCloudstackDatacenter(t *testing.T) { g.Expect(got.CloudStackDatacenter).To(BeNil()) } +func TestValidateCloudStackDatacenterNotFoundError(t *testing.T) { + g := NewWithT(t) + got, _ := cluster.ParseConfigFromFile("testdata/cluster_cloudstack_missing_datacenter.yaml") + g.Expect(got.CloudStackDatacenter).To(BeNil()) + + cm, _ := cluster.NewDefaultConfigManager() + err := cm.Validate(got) + g.Expect(err).To(MatchError(ContainSubstring("CloudStackDatacenterConfig eksa-unit-test not found"))) +} + func TestDefaultConfigClientBuilderBuildCloudStackClusterSuccess(t *testing.T) { g := NewWithT(t) ctx := context.Background() diff --git a/pkg/cluster/docker.go b/pkg/cluster/docker.go index 54016c9a04c4..5246af06ecd7 100644 --- a/pkg/cluster/docker.go +++ b/pkg/cluster/docker.go @@ -2,7 +2,9 @@ package cluster import ( "context" + "fmt" + "github.com/aws/eks-anywhere/pkg/api/v1alpha1" anywherev1 "github.com/aws/eks-anywhere/pkg/api/v1alpha1" ) @@ -20,6 +22,8 @@ func dockerEntry() *ConfigManagerEntry { func(c *Config) error { if c.DockerDatacenter != nil { return c.DockerDatacenter.Validate() + } else if c.Cluster.Spec.DatacenterRef.Kind == v1alpha1.DockerDatacenterKind { // We need this conditional check as DockerDatacenter will be nil for other providers + return fmt.Errorf("DockerDatacenterConfig %s not found", c.Cluster.Spec.DatacenterRef.Name) } return nil }, diff --git a/pkg/cluster/docker_test.go b/pkg/cluster/docker_test.go index 100d162b4f7b..b763a8fea666 100644 --- a/pkg/cluster/docker_test.go +++ b/pkg/cluster/docker_test.go @@ -22,6 +22,16 @@ func TestParseConfigMissingDockerDatacenter(t *testing.T) { g.Expect(got.DockerDatacenter).To(BeNil()) } +func TestValidateDockerDatacenterNotFoundError(t *testing.T) { + g := NewWithT(t) + got, _ := cluster.ParseConfigFromFile("testdata/cluster_docker_missing_datacenter.yaml") + g.Expect(got.DockerDatacenter).To(BeNil()) + + cm, _ := cluster.NewDefaultConfigManager() + err := cm.Validate(got) + g.Expect(err).To(MatchError(ContainSubstring("DockerDatacenterConfig eksa-unit-test not found"))) +} + func TestDefaultConfigClientBuilderDockerCluster(t *testing.T) { g := NewWithT(t) ctx := context.Background() diff --git a/pkg/cluster/nutanix.go b/pkg/cluster/nutanix.go index 81bb6dc21ce2..d1f0d3ca2451 100644 --- a/pkg/cluster/nutanix.go +++ b/pkg/cluster/nutanix.go @@ -2,7 +2,9 @@ package cluster import ( "context" + "fmt" + "github.com/aws/eks-anywhere/pkg/api/v1alpha1" anywherev1 "github.com/aws/eks-anywhere/pkg/api/v1alpha1" ) @@ -24,6 +26,8 @@ func nutanixEntry() *ConfigManagerEntry { func(c *Config) error { if c.NutanixDatacenter != nil { return c.NutanixDatacenter.Validate() + } else if c.Cluster.Spec.DatacenterRef.Kind == v1alpha1.NutanixDatacenterKind { // We need this conditional check as NutanixDatacenter will be nil for other providers + return fmt.Errorf("NutanixDatacenterConfig %s not found", c.Cluster.Spec.DatacenterRef.Name) } return nil }, diff --git a/pkg/cluster/nutanix_test.go b/pkg/cluster/nutanix_test.go index a35ebfd01727..a40ed79e2277 100644 --- a/pkg/cluster/nutanix_test.go +++ b/pkg/cluster/nutanix_test.go @@ -57,6 +57,11 @@ func TestValidateNutanixEntry(t *testing.T) { err = cm.Validate(config) assert.NoError(t, err) + + config.NutanixDatacenter = nil + err = cm.Validate(config) + assert.Error(t, err) + assert.Contains(t, err.Error(), "NutanixDatacenterConfig eksa-unit-test not found") } func TestNutanixConfigClientBuilder(t *testing.T) { diff --git a/pkg/cluster/tinkerbell.go b/pkg/cluster/tinkerbell.go index 5b83adf17d3f..e22692a84b61 100644 --- a/pkg/cluster/tinkerbell.go +++ b/pkg/cluster/tinkerbell.go @@ -2,7 +2,9 @@ package cluster import ( "context" + "fmt" + "github.com/aws/eks-anywhere/pkg/api/v1alpha1" anywherev1 "github.com/aws/eks-anywhere/pkg/api/v1alpha1" ) @@ -32,6 +34,8 @@ func tinkerbellEntry() *ConfigManagerEntry { if err := validateSameNamespace(c, c.TinkerbellDatacenter); err != nil { return err } + } else if c.Cluster.Spec.DatacenterRef.Kind == v1alpha1.TinkerbellDatacenterKind { // We need this conditional check as TinkerbellDatacenter will be nil for other providers + return fmt.Errorf("TinkerbellDatacenterConfig %s not found", c.Cluster.Spec.DatacenterRef.Name) } return nil }, diff --git a/pkg/cluster/tinkerbell_test.go b/pkg/cluster/tinkerbell_test.go index a3251eb6694b..34ceea7ac1b2 100644 --- a/pkg/cluster/tinkerbell_test.go +++ b/pkg/cluster/tinkerbell_test.go @@ -163,6 +163,16 @@ func TestParseConfigFromFileTinkerbellCluster(t *testing.T) { ) } +func TestValidateTinkerbellDatacenterNotFoundError(t *testing.T) { + g := NewWithT(t) + got, err := cluster.ParseConfigFromFile("testdata/cluster_tinkerbell_1_19.yaml") + g.Expect(err).NotTo(HaveOccurred()) + got.TinkerbellDatacenter = nil + cm, _ := cluster.NewDefaultConfigManager() + err = cm.Validate(got) + g.Expect(err).To(MatchError(ContainSubstring("TinkerbellDatacenterConfig test not found"))) +} + func TestDefaultConfigClientBuilderTinkerbellCluster(t *testing.T) { g := NewWithT(t) ctx := context.Background() diff --git a/pkg/cluster/vsphere.go b/pkg/cluster/vsphere.go index ddc2de621689..74c179283f7b 100644 --- a/pkg/cluster/vsphere.go +++ b/pkg/cluster/vsphere.go @@ -2,7 +2,9 @@ package cluster import ( "context" + "fmt" + "github.com/aws/eks-anywhere/pkg/api/v1alpha1" anywherev1 "github.com/aws/eks-anywhere/pkg/api/v1alpha1" ) @@ -39,6 +41,8 @@ func vsphereEntry() *ConfigManagerEntry { func(c *Config) error { if c.VSphereDatacenter != nil { return c.VSphereDatacenter.Validate() + } else if c.Cluster.Spec.DatacenterRef.Kind == v1alpha1.VSphereDatacenterKind { // We need this conditional check as VSphereDatacenter will be nil for other providers + return fmt.Errorf("VSphereDatacenterConfig %s not found", c.Cluster.Spec.DatacenterRef.Name) } return nil }, diff --git a/pkg/cluster/vsphere_test.go b/pkg/cluster/vsphere_test.go index 10a9aea86d48..f162cb480c32 100644 --- a/pkg/cluster/vsphere_test.go +++ b/pkg/cluster/vsphere_test.go @@ -23,6 +23,16 @@ func TestParseConfigMissingVSphereDatacenter(t *testing.T) { g.Expect(got.VSphereDatacenter).To(BeNil()) } +func TestValidateVSphereDatacenterNotFoundError(t *testing.T) { + g := NewWithT(t) + got, _ := cluster.ParseConfigFromFile("testdata/cluster_vsphere_missing_datacenter.yaml") + g.Expect(got.VSphereDatacenter).To(BeNil()) + + cm, _ := cluster.NewDefaultConfigManager() + err := cm.Validate(got) + g.Expect(err).To(MatchError(ContainSubstring("VSphereDatacenterConfig eksa-unit-test2 not found"))) +} + func TestDefaultConfigClientBuilderVSphereCluster(t *testing.T) { g := NewWithT(t) ctx := context.Background()