From b53b9d3dacf398ff851ad33c11f03a5521aed88e Mon Sep 17 00:00:00 2001 From: Deepak Muley Date: Fri, 9 Aug 2024 11:19:25 -0700 Subject: [PATCH] fix: ignore category value delete error added basic test which creates 2 clusters with same name and deletes last one --- controllers/helpers.go | 8 ++-- test/e2e/categories_test.go | 90 +++++++++++++++++++++++++++++++++++++ test/e2e/test_helpers.go | 5 +++ 3 files changed, 100 insertions(+), 3 deletions(-) diff --git a/controllers/helpers.go b/controllers/helpers.go index 6fa6ff6932..e8b76e81bd 100644 --- a/controllers/helpers.go +++ b/controllers/helpers.go @@ -504,9 +504,11 @@ func deleteCategoryKeyValues(ctx context.Context, client *prismclientv3.Client, err = client.V3.DeleteCategoryValue(ctx, key, value) if err != nil { - errorMsg := fmt.Errorf("failed to delete category with key %s. error: %v", key, err) - log.Error(errorMsg, "failed to delete category") - return errorMsg + errorMsg := fmt.Errorf("failed to delete category value with key:value %s:%s. error: %v", key, value, err) + log.Error(errorMsg, "failed to delete category value") + // NCN-101935: If the category value still has VMs assigned, do not delete the category key:value + // TODO:deepakmntnx Add a check for specific error mentioned in NCN-101935 + return nil } } diff --git a/test/e2e/categories_test.go b/test/e2e/categories_test.go index 08989c8f8a..1290ffdc90 100644 --- a/test/e2e/categories_test.go +++ b/test/e2e/categories_test.go @@ -20,6 +20,7 @@ package e2e import ( "context" + "os" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" @@ -174,4 +175,93 @@ var _ = Describe("Nutanix categories", Label("capx-feature-test", "categories"), By("PASSED!") }) + + It("Create and delete 2 clusters with same name with default cluster categories and should succeed", Label("same-name-two-cluster-test"), func() { + Expect(namespace).NotTo(BeNil()) + flavor := clusterctl.DefaultFlavor + expectedClusterNameCategoryKey := infrav1.DefaultCAPICategoryKeyForName + By("Creating a workload cluster 1", func() { + testHelper.deployClusterAndWait( + deployClusterParams{ + clusterName: clusterName, + namespace: namespace, + flavor: flavor, + clusterctlConfigPath: clusterctlConfigPath, + artifactFolder: artifactFolder, + bootstrapClusterProxy: bootstrapClusterProxy, + }, clusterResources) + }) + + By("Checking cluster category condition is true", func() { + testHelper.verifyConditionOnNutanixCluster(verifyConditionParams{ + clusterName: clusterName, + namespace: namespace, + bootstrapClusterProxy: bootstrapClusterProxy, + expectedCondition: clusterv1.Condition{ + Type: infrav1.ClusterCategoryCreatedCondition, + Status: corev1.ConditionTrue, + }, + }) + }) + + By("Checking if a category was created", func() { + testHelper.verifyCategoryExists(ctx, expectedClusterNameCategoryKey, clusterName) + }) + + By("Checking if there are VMs assigned to this category", func() { + expectedCategories := map[string]string{ + expectedClusterNameCategoryKey: clusterName, + } + testHelper.verifyCategoriesNutanixMachines(ctx, clusterName, namespace.Name, expectedCategories) + }) + + By("Setting different Control plane endpoint IP for 2nd cluster", func() { + cp2EndpointIP := testHelper.getVariableFromE2eConfig("CONTROL_PLANE_ENDPOINT_IP_2") + if cp2EndpointIP == "" { + cp2EndpointIP = os.Getenv("CONTROL_PLANE_ENDPOINT_IP_2") + if cp2EndpointIP == "" { + Fail("CONTROL_PLANE_ENDPOINT_IP_2 not set") + } + } + testHelper.updateVariableInE2eConfig("CONTROL_PLANE_ENDPOINT_IP", cp2EndpointIP) + }) + + By("Creating a workload cluster 2 with same name", func() { + testHelper.deployClusterAndWait( + deployClusterParams{ + clusterName: clusterName, + namespace: namespace, + flavor: flavor, + clusterctlConfigPath: clusterctlConfigPath, + artifactFolder: artifactFolder, + bootstrapClusterProxy: bootstrapClusterProxy, + }, clusterResources) + }) + + By("Checking cluster category condition is true", func() { + testHelper.verifyConditionOnNutanixCluster(verifyConditionParams{ + clusterName: clusterName, + namespace: namespace, + bootstrapClusterProxy: bootstrapClusterProxy, + expectedCondition: clusterv1.Condition{ + Type: infrav1.ClusterCategoryCreatedCondition, + Status: corev1.ConditionTrue, + }, + }) + }) + + By("Checking if a category was created", func() { + testHelper.verifyCategoryExists(ctx, expectedClusterNameCategoryKey, clusterName) + }) + + By("Checking if there are VMs assigned to this category", func() { + expectedCategories := map[string]string{ + expectedClusterNameCategoryKey: clusterName, + } + testHelper.verifyCategoriesNutanixMachines(ctx, clusterName, namespace.Name, expectedCategories) + }) + + // After each test, cluster with name clusterName will be deleted and if it fails due to categories + // issue then we will know since the test will fail. + }) }) diff --git a/test/e2e/test_helpers.go b/test/e2e/test_helpers.go index 35802f99b0..fafc9449db 100644 --- a/test/e2e/test_helpers.go +++ b/test/e2e/test_helpers.go @@ -144,6 +144,7 @@ type testHelperInterface interface { getNutanixResourceIdentifierFromEnv(envVarKey string) infrav1.NutanixResourceIdentifier getNutanixResourceIdentifierFromE2eConfig(variableKey string) infrav1.NutanixResourceIdentifier getVariableFromE2eConfig(variableKey string) string + updateVariableInE2eConfig(variableKey string, variableValue string) stripNutanixIDFromProviderID(providerID string) string verifyCategoryExists(ctx context.Context, categoryKey, categoyValue string) verifyCategoriesNutanixMachines(ctx context.Context, clusterName, namespace string, expectedCategories map[string]string) @@ -559,6 +560,10 @@ func (t testHelper) getVariableFromE2eConfig(variableKey string) string { return variableValue } +func (t testHelper) updateVariableInE2eConfig(variableKey string, variableValue string) { + t.e2eConfig.Variables[variableKey] = variableValue +} + func (t testHelper) stripNutanixIDFromProviderID(providerID string) string { return strings.TrimPrefix(providerID, nutanixProviderIDPrefix) }