diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml index 11d0401312..05e01d7b35 100644 --- a/.github/workflows/test-e2e.yml +++ b/.github/workflows/test-e2e.yml @@ -193,6 +193,9 @@ jobs: wget https://github.com/operator-framework/operator-sdk/releases/download/v1.22.0/operator-sdk_linux_amd64 -q chmod +x operator-sdk_linux_amd64 && sudo mv operator-sdk_linux_amd64 /usr/local/bin/operator-sdk operator-sdk version + - name: Print kubectl version + run: | + kubectl version - name: Install CRDs if needed if: ${{ !( matrix.test == 'helm-update' || matrix.test == 'helm-wide' || matrix.test == 'bundle-test' ) }} run: | @@ -203,7 +206,7 @@ jobs: MCLI_PRIVATE_API_KEY: ${{ secrets.ATLAS_PRIVATE_KEY }} MCLI_ORG_ID: ${{ secrets.ATLAS_ORG_ID}} MCLI_OPS_MANAGER_URL: "https://cloud-qa.mongodb.com/" - IMAGE_URL: ${{ env.DOCKER_REPO }}:${{ steps.prepare.outputs.tag }} + IMAGE_URL: "${{ env.DOCKER_REGISTRY }}/${{ env.DOCKER_REPO }}:${{ steps.prepare.outputs.tag }}" BUNDLE_IMAGE: "${{ env.DOCKER_REGISTRY }}/${{ env.DOCKER_BUNDLES_REPO}}:${{ steps.prepare.outputs.tag }}" K8S_PLATFORM: "${{ steps.properties.outputs.k8s_platform }}" K8S_VERSION: "${{ steps.properties.outputs.k8s_version }}" diff --git a/test/e2e/actions/project_flow.go b/test/e2e/actions/project_flow.go index 33f5bfa775..86ad6598d2 100644 --- a/test/e2e/actions/project_flow.go +++ b/test/e2e/actions/project_flow.go @@ -31,12 +31,7 @@ func ProjectCreationFlow(userData *model.TestDataProvider) { } func PrepareOperatorConfigurations(userData *model.TestDataProvider) manager.Manager { - By(fmt.Sprintf("Create namespace %s", userData.Resources.Namespace)) - Expect(k8s.CreateNamespace(userData.Context, userData.K8SClient, userData.Resources.Namespace)).Should(Succeed()) - k8s.CreateDefaultSecret(userData.Context, userData.K8SClient, config.DefaultOperatorGlobalKey, userData.Resources.Namespace) - if !userData.Resources.AtlasKeyAccessType.GlobalLevelKey { - CreateConnectionAtlasKey(userData) - } + CreateNamespaceAndSecrets(userData) logPath := path.Join("output", userData.Resources.Namespace) mgr, err := k8s.RunOperator(&k8s.Config{ Namespace: userData.Resources.Namespace, @@ -52,3 +47,12 @@ func PrepareOperatorConfigurations(userData *model.TestDataProvider) manager.Man Expect(err).NotTo(HaveOccurred()) return mgr } + +func CreateNamespaceAndSecrets(userData *model.TestDataProvider) { + By(fmt.Sprintf("Create namespace %s", userData.Resources.Namespace)) + Expect(k8s.CreateNamespace(userData.Context, userData.K8SClient, userData.Resources.Namespace)).Should(Succeed()) + k8s.CreateDefaultSecret(userData.Context, userData.K8SClient, config.DefaultOperatorGlobalKey, userData.Resources.Namespace) + if !userData.Resources.AtlasKeyAccessType.GlobalLevelKey { + CreateConnectionAtlasKey(userData) + } +} diff --git a/test/e2e/actions/steps.go b/test/e2e/actions/steps.go index 7cca0d5b53..d1b7ade748 100644 --- a/test/e2e/actions/steps.go +++ b/test/e2e/actions/steps.go @@ -6,28 +6,23 @@ import ( "strconv" "time" - "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/k8s" - - v1 "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1" - - "k8s.io/apimachinery/pkg/types" - - "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1/status" - . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" . "github.com/onsi/gomega/gstruct" "go.mongodb.org/atlas/mongodbatlas" + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/types" + "sigs.k8s.io/controller-runtime/pkg/client" + v1 "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1" + "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1/status" kube "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions/kube" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/api/atlas" appclient "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/appclient" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/cli" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/cli/helm" - kubecli "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/cli/kubecli" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/config" + "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/k8s" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/model" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/utils" ) @@ -133,16 +128,6 @@ func WaitDeploymentWithoutGenerationCheck(data *model.TestDataProvider) { } } -func WaitProject(data *model.TestDataProvider, generation int) { - EventuallyWithOffset(1, kube.ProjectReadyCondition(data), "25m", "10s").Should(Equal("True"), "Kubernetes resource: Project status `Ready` should be 'True'") - gen, err := k8s.GetProjectObservedGeneration(data.Context, data.K8SClient, data.Resources.Namespace, data.Resources.Project.GetK8sMetaName()) - Expect(err).ToNot(HaveOccurred()) - ExpectWithOffset(1, gen).Should(Equal(generation), "Kubernetes resource: Generation should be upgraded") - atlasProject, err := kube.GetProjectResource(data) - Expect(err).ShouldNot(HaveOccurred()) - ExpectWithOffset(1, atlasProject.Status.ID).ShouldNot(BeNil(), "Kubernetes resource: Project status should have non-empty ID field") -} - func WaitProjectWithoutGenerationCheck(data *model.TestDataProvider) { EventuallyWithOffset(1, func() string { return kube.ProjectReadyCondition(data) @@ -163,13 +148,6 @@ func WaitTestApplication(data *model.TestDataProvider, ns, labelKey, labelValue EventuallyWithOffset(1, isAppRunning(), "2m", "10s").Should(BeTrue(), "Test application should be running") } -func CheckIfDeploymentExist(input model.UserInputs) func() bool { - return func() bool { - aClient := atlas.GetClientOrFail() - return aClient.IsDeploymentExist(input.ProjectID, input.Deployments[0].Spec.DeploymentSpec.Name) - } -} - func CheckIfUsersExist(input model.UserInputs) func() bool { return func() bool { atlasClient, err := atlas.AClient() @@ -269,18 +247,6 @@ func CompareServerlessSpec(requested model.DeploymentSpec, created mongodbatlas. Expect(created.GroupID).To(Not(BeEmpty())) } -func SaveK8sResourcesTo(resources []string, ns string, destination string) { - for _, resource := range resources { - data := kubecli.GetYamlResource(resource, ns) - path := fmt.Sprintf("output/%s/%s.yaml", destination, resource) - utils.SaveToFile(path, data) - } -} - -func SaveK8sResources(resources []string, ns string) { - SaveK8sResourcesTo(resources, ns, ns) -} - func SaveProjectsToFile(ctx context.Context, k8sClient client.Client, ns string) error { yaml, err := k8s.ProjectListYaml(ctx, k8sClient, ns) if err != nil { @@ -335,21 +301,17 @@ func SaveUsersToFile(ctx context.Context, k8sClient client.Client, ns string) er func SaveTestAppLogs(input model.UserInputs) { for _, user := range input.Users { - utils.SaveToFile( - fmt.Sprintf("output/%s/testapp-describe-%s.txt", input.Namespace, user.Spec.Username), - kubecli.DescribeTestApp(config.TestAppLabelPrefix+user.Spec.Username, input.Namespace), - ) + testAppName := fmt.Sprintf("test-app-%s", user.Spec.Username) + bytes, err := k8s.GetPodLogsByDeployment(testAppName, input.Namespace, corev1.PodLogOptions{}) + Expect(err).ToNot(HaveOccurred()) + utils.SaveToFile( fmt.Sprintf("output/%s/testapp-logs-%s.txt", input.Namespace, user.Spec.Username), - kubecli.GetLogs(config.TestAppLabelPrefix+user.Spec.Username, input.Namespace), + bytes, ) } } -func SaveDeploymentDump(input model.UserInputs) { - kubecli.GetDeploymentDump(fmt.Sprintf("output/%s/dump", input.Namespace)) -} - func CheckUsersAttributes(data *model.TestDataProvider) { input := data.Resources aClient := atlas.GetClientOrFail() @@ -487,85 +449,6 @@ func CreateConnectionAtlasKey(data *model.TestDataProvider) { }) } -func createConnectionAtlasKeyFrom(data *model.TestDataProvider, key *mongodbatlas.APIKey) { - By("Change resources depends on AtlasKey and create key", func() { - if data.Resources.AtlasKeyAccessType.GlobalLevelKey { - err := k8s.CreateSecret(data.Context, data.K8SClient, key.PublicKey, key.PrivateKey, config.DefaultOperatorGlobalKey, data.Resources.Namespace) - Expect(err).NotTo(HaveOccurred()) - } else { - err := k8s.CreateSecret(data.Context, data.K8SClient, key.PublicKey, key.PrivateKey, data.Resources.KeyName, data.Resources.Namespace) - Expect(err).NotTo(HaveOccurred()) - } - }) -} - -func recreateAtlasKeyIfNeed(data *model.TestDataProvider) { - if !data.Resources.AtlasKeyAccessType.IsFullAccess() { - aClient, err := atlas.AClient() - Expect(err).ShouldNot(HaveOccurred()) - globalKey, err := aClient.AddKeyWithAccessList(data.Resources.ProjectID, data.Resources.AtlasKeyAccessType.Roles, data.Resources.AtlasKeyAccessType.Whitelist) - Expect(err).ShouldNot(HaveOccurred()) - Expect(globalKey.PublicKey).ShouldNot(BeEmpty()) - Expect(globalKey.PrivateKey).ShouldNot(BeEmpty()) - data.Resources.AtlasKeyAccessType.GlobalKeyAttached = globalKey - - k8s.DeleteKey(data.Context, data.K8SClient, data.Resources.KeyName, data.Resources.Namespace) - createConnectionAtlasKeyFrom(data, globalKey) - } -} - -func DeployProjectAndWait(data *model.TestDataProvider, generation int) { - By("Create users resources: keys, project", func() { - CreateConnectionAtlasKey(data) - kubecli.Apply(data.Resources.ProjectPath, "-n", data.Resources.Namespace) - By("Wait project creation and get projectID", func() { - WaitProject(data, generation) - atlasProject, err := kube.GetProjectResource(data) - Expect(err).Should(BeNil(), "Error has Occurred") - data.Resources.ProjectID = atlasProject.Status.ID - Expect(data.Resources.ProjectID).ShouldNot(BeEmpty()) - }) - recreateAtlasKeyIfNeed(data) - }) -} - -func DeployDeployment(data *model.TestDataProvider) { - if len(data.Resources.Deployments) > 0 { - By("Create deployment", func() { - kubecli.Apply(data.Resources.Deployments[0].DeploymentFileName(data.Resources), "-n", data.Resources.Namespace) - }) - By("Wait deployment creation", func() { - WaitDeploymentWithoutGenerationCheck(data) - }) - By("check deployment Attribute", func() { - aClient, err := atlas.AClient() - Expect(err).NotTo(HaveOccurred()) - deployment := aClient.GetDeployment(data.Resources.ProjectID, data.Resources.Deployments[0].Spec.DeploymentSpec.Name) - CompareDeploymentsSpec(data.Resources.Deployments[0].Spec, deployment) - }) - } -} - -func DeployUsers(data *model.TestDataProvider) { - By("create users", func() { - kubecli.Apply(data.Resources.GetResourceFolder()+"/user/", "-n", data.Resources.Namespace) - }) - By("check database users Attributes", func() { - Eventually(CheckIfUsersExist(data.Resources), "2m", "10s").Should(BeTrue()) - CheckUsersAttributes(data) - }) - By("Deploy application for user", func() { - CheckUsersCanUseApp(data) - }) -} - -// DeployUserResourcesAction deploy all user resources, wait, and check results -func DeployUserResourcesAction(data *model.TestDataProvider) { - DeployProjectAndWait(data, 1) - DeployDeployment(data) - DeployUsers(data) -} - func DeleteDBUsersApps(data model.TestDataProvider) { By("Delete dbusers applications", func() { for _, user := range data.Resources.Users { @@ -574,34 +457,6 @@ func DeleteDBUsersApps(data model.TestDataProvider) { }) } -func DeleteUserResources(data *model.TestDataProvider) { - DeleteUserResourcesDeployment(data) - DeleteUserResourcesProject(data) -} - -func DeleteUserResourcesDeployment(data *model.TestDataProvider) { - By("Delete deployment", func() { - kubecli.Delete(data.Resources.Deployments[0].DeploymentFileName(data.Resources), "-n", data.Resources.Namespace) - Eventually( - CheckIfDeploymentExist(data.Resources), - "10m", "1m", - ).Should(BeFalse(), "Deployment should be deleted from Atlas") - }) -} - -func DeleteUserResourcesProject(data *model.TestDataProvider) { - By("Delete project", func() { - kubecli.Delete(data.Resources.ProjectPath, "-n", data.Resources.Namespace) - Eventually( - func(g Gomega) bool { - aClient := atlas.GetClientOrFail() - return aClient.IsProjectExists(g, data.Resources.ProjectID) - }, - "5m", "20s", - ).Should(BeFalse(), "Project should be deleted from Atlas") - }) -} - func DeleteTestDataProject(data *model.TestDataProvider) { By("Delete project", func() { Expect(data.K8SClient.Get(data.Context, types.NamespacedName{Name: data.Project.Name, Namespace: data.Project.Namespace}, data.Project)).Should(Succeed()) @@ -648,6 +503,16 @@ func DeleteTestDataDeployments(data *model.TestDataProvider) { }) } +func DeleteTestDataUsers(data *model.TestDataProvider) { + By("Delete Users", func() { + for _, user := range data.Users { + Expect(data.K8SClient.Get(data.Context, types.NamespacedName{Name: data.Project.Name, Namespace: data.Project.Namespace}, data.Project)).Should(Succeed()) + Expect(data.K8SClient.Get(data.Context, types.NamespacedName{Name: user.Name, Namespace: user.Namespace}, user)).Should(Succeed()) + Expect(data.K8SClient.Delete(data.Context, user)).Should(Succeed()) + } + }) +} + func DeleteAtlasGlobalKeyIfExist(data model.TestDataProvider) { if data.Resources.AtlasKeyAccessType.GlobalLevelKey { By("Delete Global API key for test", func() { diff --git a/test/e2e/alert_config_test.go b/test/e2e/alert_config_test.go index 3d1c72d212..5b8fe9c5b9 100644 --- a/test/e2e/alert_config_test.go +++ b/test/e2e/alert_config_test.go @@ -3,7 +3,6 @@ package e2e_test import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - . "github.com/onsi/gomega/gbytes" "k8s.io/apimachinery/pkg/types" v1 "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1" @@ -12,7 +11,6 @@ import ( "github.com/mongodb/mongodb-atlas-kubernetes/pkg/util/toptr" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/api/atlas" - kubecli "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/cli/kubecli" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/data" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/model" ) @@ -20,10 +18,6 @@ import ( var _ = Describe("Alert configuration tests", Label("alert-config"), func() { var testData *model.TestDataProvider - _ = BeforeEach(func() { - Eventually(kubecli.GetVersionOutput()).Should(Say(K8sVersion)) - }) - _ = AfterEach(func() { GinkgoWriter.Write([]byte("\n")) GinkgoWriter.Write([]byte("===============================================\n")) diff --git a/test/e2e/annotations_test.go b/test/e2e/annotations_test.go index b82c4a9e22..03b895bce8 100644 --- a/test/e2e/annotations_test.go +++ b/test/e2e/annotations_test.go @@ -3,10 +3,8 @@ package e2e_test import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - . "github.com/onsi/gomega/gbytes" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions" - kubecli "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/cli/kubecli" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/data" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/model" ) @@ -14,9 +12,6 @@ import ( var _ = Describe("Annotations base test.", Label("deployment-annotations-ns"), func() { var testData *model.TestDataProvider - BeforeEach(func() { - Eventually(kubecli.GetVersionOutput()).Should(Say(K8sVersion)) - }) AfterEach(func() { GinkgoWriter.Write([]byte("\n")) GinkgoWriter.Write([]byte("===============================================\n")) diff --git a/test/e2e/auditing_test.go b/test/e2e/auditing_test.go index c128fe7646..ef69d1dc66 100644 --- a/test/e2e/auditing_test.go +++ b/test/e2e/auditing_test.go @@ -3,13 +3,11 @@ package e2e_test import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - . "github.com/onsi/gomega/gbytes" v1 "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1" "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1/status" "github.com/mongodb/mongodb-atlas-kubernetes/pkg/util/toptr" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions" - kubecli "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/cli/kubecli" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/data" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/model" ) @@ -17,10 +15,6 @@ import ( var _ = Describe("UserLogin", Label("auditing"), func() { var testData *model.TestDataProvider - _ = BeforeEach(func() { - Eventually(kubecli.GetVersionOutput()).Should(Say(K8sVersion)) - }) - _ = AfterEach(func() { GinkgoWriter.Write([]byte("\n")) GinkgoWriter.Write([]byte("===============================================\n")) diff --git a/test/e2e/bundle_test.go b/test/e2e/bundle_test.go index 139139aa29..30d4a02606 100644 --- a/test/e2e/bundle_test.go +++ b/test/e2e/bundle_test.go @@ -6,14 +6,12 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - . "github.com/onsi/gomega/gbytes" "github.com/onsi/gomega/gexec" "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1/status" - actions "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions" + "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions/deploy" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/cli" - kubecli "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/cli/kubecli" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/config" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/data" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/k8s" @@ -27,18 +25,12 @@ var _ = Describe("User can deploy operator from bundles", func() { _ = BeforeEach(func() { imageURL = os.Getenv("BUNDLE_IMAGE") Expect(imageURL).ShouldNot(BeEmpty(), "SetUP BUNDLE_IMAGE") - Eventually(kubecli.GetVersionOutput()).Should(Say(K8sVersion)) }) _ = AfterEach(func() { By("After each.", func() { if CurrentSpecReport().Failed() { - actions.SaveProjectsToFile(testData.Context, testData.K8SClient, testData.Resources.Namespace) Expect(actions.SaveProjectsToFile(testData.Context, testData.K8SClient, testData.Resources.Namespace)).Should(Succeed()) - actions.SaveK8sResources( - []string{"atlasdeployments", "atlasdatabaseusers"}, - testData.Resources.Namespace, - ) - actions.SaveDeploymentDump(testData.Resources) + Expect(actions.SaveDeploymentsToFile(testData.Context, testData.K8SClient, testData.Resources.Namespace)).Should(Succeed()) } actions.DeleteTestDataDeployments(testData) actions.DeleteTestDataProject(testData) @@ -63,7 +55,7 @@ var _ = Describe("User can deploy operator from bundles", func() { By("OLM install", func() { Eventually(cli.Execute("operator-sdk", "olm", "install"), "3m").Should(gexec.Exit(0)) - Eventually(cli.Execute("operator-sdk", "run", "bundle", imageURL, fmt.Sprintf("--namespace=%s", testData.Resources.Namespace), "--verbose", "--timeout", "15m"), "15m").Should(gexec.Exit(0)) // timeout of operator-sdk is bigger then our default + Eventually(cli.Execute("operator-sdk", "run", "bundle", imageURL, fmt.Sprintf("--namespace=%s", testData.Resources.Namespace), "--verbose", "--timeout", "30m"), "30m").Should(gexec.Exit(0)) // timeout of operator-sdk is bigger then our default }) By("Apply configuration", func() { diff --git a/test/e2e/cli/helm/helm.go b/test/e2e/cli/helm/helm.go index d2e935ac80..9c98d78c92 100644 --- a/test/e2e/cli/helm/helm.go +++ b/test/e2e/cli/helm/helm.go @@ -48,7 +48,7 @@ func GetAppVersion(name string) string { func Uninstall(name string, ns string) { session := cli.Execute("helm", "uninstall", name, "--namespace", ns, "--wait", "--timeout", "15m") // remove timeout - EventuallyWithOffset(1, session.Wait("15m")).Should(Say("uninstalled"), "HELM. Can't unninstall "+name) + EventuallyWithOffset(1, session.Wait("15m")).Should(Or(Say("uninstalled"), Say("")), "HELM. Can't uninstall "+name) } func Install(args ...string) { diff --git a/test/e2e/cli/kubecli/kubecli.go b/test/e2e/cli/kubecli/kubecli.go deleted file mode 100644 index ad2fa623ad..0000000000 --- a/test/e2e/cli/kubecli/kubecli.go +++ /dev/null @@ -1,64 +0,0 @@ -package kube - -import ( - "fmt" - - . "github.com/onsi/gomega" - . "github.com/onsi/gomega/gbytes" - "github.com/onsi/gomega/gexec" - - "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/cli" -) - -func GetVersionOutput() *Buffer { - session := cli.Execute("kubectl", "version") - return session.Wait().Out -} - -func Apply(args ...string) *Buffer { - if args[0] == "-k" { - args = append([]string{"apply"}, args...) - } else { - args = append([]string{"apply", "-f"}, args...) - } - session := cli.Execute("kubectl", args...) - EventuallyWithOffset(1, session).ShouldNot(Say("error")) - EventuallyWithOffset(1, session).ShouldNot(Say("invalid")) - return session.Wait().Out -} - -func Delete(args ...string) *Buffer { - args = append([]string{"delete", "-f"}, args...) - session := cli.Execute("kubectl", args...) - return session.Wait("10m").Out -} - -func GetManagerLogs(ns string) []byte { - session := cli.ExecuteWithoutWriter("kubectl", "logs", "deploy/mongodb-atlas-operator", "manager", "-n", ns) - cli.SessionShouldExit(session) - return session.Out.Contents() -} - -func GetLogs(label, ns string) []byte { - session := cli.ExecuteWithoutWriter("kubectl", "logs", "-l", label, "-n", ns) - cli.SessionShouldExit(session) - return session.Out.Contents() -} - -func DescribeTestApp(label, ns string) []byte { - session := cli.Execute("kubectl", "describe", "pods", "-l", label, "-n", ns) - cli.SessionShouldExit(session) - return session.Out.Contents() -} - -func GetYamlResource(resource string, ns string) []byte { - session := cli.ExecuteWithoutWriter("kubectl", "get", resource, "-o", "yaml", "-n", ns) - cli.SessionShouldExit(session) - return session.Out.Contents() -} - -func GetDeploymentDump(output string) { - outputFolder := fmt.Sprintf("--output-directory=%s", output) - session := cli.Execute("kubectl", "cluster-info", "dump", "--all-namespaces", outputFolder) - EventuallyWithOffset(1, session).Should(gexec.Exit(0)) -} diff --git a/test/e2e/cloud_access_role_test.go b/test/e2e/cloud_access_role_test.go index 7b1f592254..e0181ea721 100644 --- a/test/e2e/cloud_access_role_test.go +++ b/test/e2e/cloud_access_role_test.go @@ -5,14 +5,12 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - . "github.com/onsi/gomega/gbytes" "k8s.io/apimachinery/pkg/types" v1 "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1" "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1/status" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions/cloudaccess" - kubecli "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/cli/kubecli" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/data" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/model" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/utils" @@ -24,7 +22,6 @@ var _ = Describe("UserLogin", Label("cloud-access-role"), func() { var testData *model.TestDataProvider _ = BeforeEach(func() { - Eventually(kubecli.GetVersionOutput()).Should(Say(K8sVersion)) checkUpAWSEnvironment() }) diff --git a/test/e2e/configuration_test.go b/test/e2e/configuration_test.go index e92eca5918..192c9f5ef8 100644 --- a/test/e2e/configuration_test.go +++ b/test/e2e/configuration_test.go @@ -5,11 +5,9 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - . "github.com/onsi/gomega/gbytes" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions/deploy" - kubecli "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/cli/kubecli" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/data" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/model" ) @@ -17,9 +15,6 @@ import ( var _ = Describe("Configuration namespaced. Deploy deployment", Label("deployment-ns"), func() { var testData *model.TestDataProvider - BeforeEach(func() { - Eventually(kubecli.GetVersionOutput()).Should(Say(K8sVersion)) - }) AfterEach(func() { GinkgoWriter.Write([]byte("\n")) GinkgoWriter.Write([]byte("===============================================\n")) diff --git a/test/e2e/custom_roles_test.go b/test/e2e/custom_roles_test.go index 4c92b65e31..eb1c985e6d 100644 --- a/test/e2e/custom_roles_test.go +++ b/test/e2e/custom_roles_test.go @@ -1,17 +1,14 @@ package e2e_test import ( - "k8s.io/apimachinery/pkg/types" - . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - . "github.com/onsi/gomega/gbytes" + "k8s.io/apimachinery/pkg/types" v1 "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1" "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1/status" "github.com/mongodb/mongodb-atlas-kubernetes/pkg/util/toptr" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions" - kubecli "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/cli/kubecli" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/data" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/model" ) @@ -19,10 +16,6 @@ import ( var _ = Describe("UserLogin", Label("custom-roles"), func() { var testData *model.TestDataProvider - _ = BeforeEach(func() { - Eventually(kubecli.GetVersionOutput()).Should(Say(K8sVersion)) - }) - _ = AfterEach(func() { GinkgoWriter.Write([]byte("\n")) GinkgoWriter.Write([]byte("===============================================\n")) diff --git a/test/e2e/e2e_suite_test.go b/test/e2e/e2e_suite_test.go index 6ee76770f8..5513d5d422 100644 --- a/test/e2e/e2e_suite_test.go +++ b/test/e2e/e2e_suite_test.go @@ -5,11 +5,10 @@ import ( "testing" "time" - "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/api/atlas" - . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/api/atlas" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/config" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/utils" ) diff --git a/test/e2e/encryption_at_rest_test.go b/test/e2e/encryption_at_rest_test.go index 168ee2bae3..46044ba0a5 100644 --- a/test/e2e/encryption_at_rest_test.go +++ b/test/e2e/encryption_at_rest_test.go @@ -3,23 +3,19 @@ package e2e_test import ( "time" - "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1/status" - . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - . "github.com/onsi/gomega/gbytes" "k8s.io/apimachinery/pkg/types" - "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/data" - v1 "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1" + "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1/status" "github.com/mongodb/mongodb-atlas-kubernetes/pkg/util/toptr" - actions "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions" + "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions/cloud" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions/cloudaccess" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/api/atlas" - kubecli "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/cli/kubecli" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/config" + "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/data" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/model" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/utils" ) @@ -28,7 +24,6 @@ var _ = Describe("UserLogin", Label("encryption-at-rest"), func() { var testData *model.TestDataProvider _ = BeforeEach(func() { - Eventually(kubecli.GetVersionOutput()).Should(Say(K8sVersion)) checkUpAWSEnvironment() }) diff --git a/test/e2e/global_deployment_test.go b/test/e2e/global_deployment_test.go index ea378acd65..56ed11965c 100644 --- a/test/e2e/global_deployment_test.go +++ b/test/e2e/global_deployment_test.go @@ -3,18 +3,15 @@ package e2e_test import ( "time" - "github.com/mongodb/mongodb-atlas-kubernetes/pkg/util/toptr" - . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - . "github.com/onsi/gomega/gbytes" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" v1 "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1" "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1/status" + "github.com/mongodb/mongodb-atlas-kubernetes/pkg/util/toptr" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions" - kubecli "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/cli/kubecli" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/data" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/model" ) @@ -22,10 +19,6 @@ import ( var _ = Describe("UserLogin", Label("global-deployment"), func() { var testData *model.TestDataProvider - _ = BeforeEach(func() { - Eventually(kubecli.GetVersionOutput()).Should(Say(K8sVersion)) - }) - _ = AfterEach(func() { GinkgoWriter.Write([]byte("\n")) GinkgoWriter.Write([]byte("===============================================\n")) diff --git a/test/e2e/helm_chart_test.go b/test/e2e/helm_chart_test.go index 2397036446..a520c0c5d8 100644 --- a/test/e2e/helm_chart_test.go +++ b/test/e2e/helm_chart_test.go @@ -1,20 +1,19 @@ package e2e_test import ( + "encoding/json" "fmt" "os" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - . "github.com/onsi/gomega/gbytes" - - actions "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions" - kube "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions/kube" - helm "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/cli/helm" - - kubecli "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/cli/kubecli" + corev1 "k8s.io/api/core/v1" + "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions" + "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions/kube" + "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/cli/helm" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/config" + "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/k8s" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/model" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/utils" ) @@ -25,7 +24,6 @@ var _ = Describe("HELM charts", func() { _ = BeforeEach(func() { imageURL := os.Getenv("IMAGE_URL") Expect(imageURL).ShouldNot(BeEmpty(), "SetUP IMAGE_URL") - Eventually(kubecli.GetVersionOutput()).Should(Say(K8sVersion)) }) _ = AfterEach(func() { @@ -36,27 +34,40 @@ var _ = Describe("HELM charts", func() { GinkgoWriter.Write([]byte("===============================================\n")) if CurrentSpecReport().Failed() { GinkgoWriter.Write([]byte("Resources wasn't clean")) + namespaceDeployment, err := k8s.GetDeployment("mongodb-atlas-operator", data.Resources.Namespace) + Expect(err).Should(BeNil()) + namespaceDeploymentJSON, err := json.MarshalIndent(namespaceDeployment, "", " ") + Expect(err).Should(BeNil()) + utils.SaveToFile("namespace-deployment.json", namespaceDeploymentJSON) + + pod, err := k8s.GetAllDeploymentPods("mongodb-atlas-operator", data.Resources.Namespace) + Expect(err).Should(BeNil()) + podJSON, err := json.MarshalIndent(pod, "", " ") + Expect(err).Should(BeNil()) + utils.SaveToFile("namespace-pod.json", podJSON) + + bytes, err := k8s.GetPodLogsByDeployment("mongodb-atlas-operator", config.DefaultOperatorNS, corev1.PodLogOptions{}) + if err != nil { + GinkgoWriter.Write([]byte(err.Error())) + } utils.SaveToFile( fmt.Sprintf("output/%s/operator-logs-default.txt", data.Resources.Namespace), - kubecli.GetManagerLogs(config.DefaultOperatorNS), + bytes, ) + bytes, err = k8s.GetPodLogsByDeployment("mongodb-atlas-operator", data.Resources.Namespace, corev1.PodLogOptions{}) + if err != nil { + GinkgoWriter.Write([]byte(err.Error())) + } utils.SaveToFile( fmt.Sprintf("output/%s/operator-logs.txt", data.Resources.Namespace), - kubecli.GetManagerLogs(data.Resources.Namespace), - ) - actions.SaveK8sResourcesTo( - []string{"deploy"}, - "default", - data.Resources.Namespace, + bytes, ) actions.SaveProjectsToFile(data.Context, data.K8SClient, data.Resources.Namespace) - actions.SaveK8sResources( - []string{"atlasdeployments", "atlasdatabaseusers"}, - data.Resources.Namespace, - ) + actions.SaveDeploymentsToFile(data.Context, data.K8SClient, data.Resources.Namespace) + actions.SaveUsersToFile(data.Context, data.K8SClient, data.Resources.Namespace) actions.SaveTestAppLogs(data.Resources) - actions.AfterEachFinalCleanup([]model.TestDataProvider{data}) } + actions.AfterEachFinalCleanup([]model.TestDataProvider{data}) }) }) diff --git a/test/e2e/integration_test.go b/test/e2e/integration_test.go index 386b74227d..ea456a3d41 100644 --- a/test/e2e/integration_test.go +++ b/test/e2e/integration_test.go @@ -4,25 +4,17 @@ import ( "os" "strings" - "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/k8s" - - "k8s.io/apimachinery/pkg/types" - - "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1/common" - - "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/data" - . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - . "github.com/onsi/gomega/gbytes" + "k8s.io/apimachinery/pkg/types" + "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1/common" "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1/project" "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1/status" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/api/atlas" - - kubecli "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/cli/kubecli" - + "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/data" + "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/k8s" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/model" ) @@ -31,7 +23,6 @@ var _ = Describe("Configuration namespaced. Deploy deployment", Label("integrati var key string BeforeEach(func() { - Eventually(kubecli.GetVersionOutput()).Should(Say(K8sVersion)) key = os.Getenv("DATADOG_KEY") Expect(key).ShouldNot(BeEmpty()) }) diff --git a/test/e2e/k8s/operator.go b/test/e2e/k8s/operator.go index f27336a90a..5690d945f9 100644 --- a/test/e2e/k8s/operator.go +++ b/test/e2e/k8s/operator.go @@ -57,6 +57,8 @@ func RunOperator(initCfg *Config) (manager.Manager, error) { syncPeriod := time.Hour * 3 + logger.Info("starting manager", zap.Any("config", config)) + var cacheFunc cache.NewCacheFunc if len(config.WatchedNamespaces) > 1 { var namespaces []string diff --git a/test/e2e/k8s/pod_logs.go b/test/e2e/k8s/pod_logs.go new file mode 100644 index 0000000000..bb9d668f66 --- /dev/null +++ b/test/e2e/k8s/pod_logs.go @@ -0,0 +1,92 @@ +package k8s + +import ( + "bytes" + "context" + "fmt" + + appsv1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes" + "sigs.k8s.io/controller-runtime/pkg/client/config" +) + +func GetPodLogsByDeployment(deploymentName, deploymentNS string, options corev1.PodLogOptions) ([]byte, error) { + pods, err := GetAllDeploymentPods(deploymentName, deploymentNS) + if err != nil { + return nil, fmt.Errorf("failed to get pods: %w", err) + } + if len(pods) == 0 { + return nil, fmt.Errorf("no pods found") + } + return GetPodLogs(options, deploymentNS, pods[0].Name) +} + +func GetPodLogs(options corev1.PodLogOptions, ns string, podName string) ([]byte, error) { + cfg, err := config.GetConfig() + if err != nil { + return nil, fmt.Errorf("failed to get config: %w", err) + } + clientSet, err := kubernetes.NewForConfig(cfg) + if err != nil { + return nil, fmt.Errorf("failed to get client set: %w", err) + } + + podLogRequest := clientSet.CoreV1(). + Pods(ns). + GetLogs(podName, &options) + stream, err := podLogRequest.Stream(context.Background()) + if err != nil { + return nil, fmt.Errorf("failed to get stream: %w", err) + } + defer stream.Close() + buf := new(bytes.Buffer) + _, err = buf.ReadFrom(stream) + if err != nil { + return nil, fmt.Errorf("failed to read from stream: %w", err) + } + return buf.Bytes(), nil +} + +func GetAllDeploymentPods(deploymentName, deploymentNS string) ([]corev1.Pod, error) { + cfg, err := config.GetConfig() + if err != nil { + return nil, fmt.Errorf("failed to get config: %w", err) + } + clientSet, err := kubernetes.NewForConfig(cfg) + if err != nil { + return nil, fmt.Errorf("failed to get client set: %w", err) + } + + deployment, err := clientSet.AppsV1().Deployments(deploymentNS).Get(context.Background(), deploymentName, metav1.GetOptions{}) + if err != nil { + return nil, fmt.Errorf("failed to get deployment: %w", err) + } + + pods, err := clientSet.CoreV1().Pods(deploymentNS).List(context.Background(), metav1.ListOptions{ + LabelSelector: metav1.FormatLabelSelector(deployment.Spec.Selector), + }) + if err != nil { + return nil, fmt.Errorf("failed to get pods: %w", err) + } + + return pods.Items, nil +} + +func GetDeployment(deploymentName, deploymentNS string) (*appsv1.Deployment, error) { + cfg, err := config.GetConfig() + if err != nil { + return nil, fmt.Errorf("failed to get config: %w", err) + } + clientSet, err := kubernetes.NewForConfig(cfg) + if err != nil { + return nil, fmt.Errorf("failed to get client set: %w", err) + } + + deployment, err := clientSet.AppsV1().Deployments(deploymentNS).Get(context.Background(), deploymentName, metav1.GetOptions{}) + if err != nil { + return nil, fmt.Errorf("failed to get deployment: %w", err) + } + return deployment, err +} diff --git a/test/e2e/multinamespace_test.go b/test/e2e/multinamespace_test.go index f32b4c5098..c871b7bbc2 100644 --- a/test/e2e/multinamespace_test.go +++ b/test/e2e/multinamespace_test.go @@ -5,14 +5,12 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - . "github.com/onsi/gomega/gbytes" "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1/common" "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1/status" "github.com/mongodb/mongodb-atlas-kubernetes/pkg/util/stringutil" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions/deploy" - kubecli "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/cli/kubecli" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/config" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/data" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/k8s" @@ -23,10 +21,6 @@ var _ = Describe("Users can use clusterwide configuration with limitation to wat var listData []*model.TestDataProvider var watchedNamespace []string - _ = BeforeEach(func() { - Eventually(kubecli.GetVersionOutput()).Should(Say(K8sVersion)) - }) - _ = AfterEach(func() { By("AfterEach. clean-up", func() { for i := range listData { diff --git a/test/e2e/network_peering_test.go b/test/e2e/network_peering_test.go index 71ae93d0ec..780c949b7e 100644 --- a/test/e2e/network_peering_test.go +++ b/test/e2e/network_peering_test.go @@ -6,26 +6,20 @@ import ( "testing" "time" - "github.com/mongodb/mongodb-atlas-kubernetes/pkg/controller/atlasproject" - - "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1/status" - - "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/data" - - "k8s.io/apimachinery/pkg/types" - "github.com/google/uuid" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - . "github.com/onsi/gomega/gbytes" + "k8s.io/apimachinery/pkg/types" v1 "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1" "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1/provider" + "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1/status" + "github.com/mongodb/mongodb-atlas-kubernetes/pkg/controller/atlasproject" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions/cloud" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions/networkpeer" - kubecli "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/cli/kubecli" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/config" + "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/data" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/model" ) @@ -47,7 +41,6 @@ var _ = Describe("NetworkPeering", Label("networkpeering"), func() { var testData *model.TestDataProvider _ = BeforeEach(func() { - Eventually(kubecli.GetVersionOutput()).Should(Say(K8sVersion)) checkUpAWSEnvironment() checkUpAzureEnvironment() checkNSetUpGCPEnvironment() diff --git a/test/e2e/operator_type_wide_test.go b/test/e2e/operator_type_wide_test.go index 1474bc627f..0f68873f49 100644 --- a/test/e2e/operator_type_wide_test.go +++ b/test/e2e/operator_type_wide_test.go @@ -2,152 +2,123 @@ package e2e_test import ( "context" - - "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/k8s" - - "k8s.io/apimachinery/pkg/types" - - v1 "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1" + "fmt" + "path" + "time" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - . "github.com/onsi/gomega/gbytes" + "sigs.k8s.io/controller-runtime/pkg/client" - "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1/common" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions" - kubecli "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/cli/kubecli" - . "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/config" + "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions/deploy" + "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions/kube" + "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/config" + "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/data" + "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/k8s" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/model" - "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/utils" ) -var _ = Describe("Users (Norton and Nimnul) can work with one Deployment wide operator", Label("deployment-wide"), func() { - var NortonData, NimnulData model.TestDataProvider +// DO NOT RUN THIS TEST IN PARALLEL WITH OTHER TESTS + +var _ = Describe("Deployment wide operator can work with resources in different namespaces without conflict", Label("deployment-wide"), func() { + var NortonData, NimnulData *model.TestDataProvider commonDeploymentName := "megadeployment" k8sClient, err := k8s.CreateNewClient() Expect(err).To(BeNil()) ctx := context.Background() - _ = BeforeEach(func() { - Eventually(kubecli.GetVersionOutput()).Should(Say(K8sVersion)) - By("User Install CRD, deployment wide Operator", func() { - Eventually(kubecli.Apply(DefaultDeployConfig)).Should( - Say("customresourcedefinition.apiextensions.k8s.io/atlasdeployments.atlas.mongodb.com"), - ) - Eventually( - func() string { - status, err := k8s.GetPodStatus(ctx, k8sClient, DefaultOperatorNS) - if err != nil { - return "" - } - return status - }, - "5m", "3s", - ).Should(Equal("Running"), "The operator should successfully run") - }) - }) - _ = AfterEach(func() { By("AfterEach. clean-up", func() { if CurrentSpecReport().Failed() { - GinkgoWriter.Write([]byte("Resources wasn't clean")) - utils.SaveToFile( - "output/operator-logs.txt", - kubecli.GetManagerLogs(DefaultOperatorNS), - ) - actions.SaveK8sResources( - []string{"deploy"}, - DefaultOperatorNS, - ) - actions.SaveProjectsToFile(NortonData.Context, NortonData.K8SClient, NortonData.Resources.Namespace) - actions.SaveK8sResources( - []string{"atlasdeployments", "atlasdatabaseusers", "atlasprojects"}, - NortonData.Resources.Namespace, - ) - actions.SaveProjectsToFile(NimnulData.Context, NimnulData.K8SClient, NimnulData.Resources.Namespace) - actions.SaveK8sResources( - []string{"atlasdeployments", "atlasdatabaseusers", "atlasprojects"}, - NimnulData.Resources.Namespace, - ) - actions.SaveTestAppLogs(NortonData.Resources) - actions.SaveTestAppLogs(NimnulData.Resources) + Expect(actions.SaveProjectsToFile(NortonData.Context, NortonData.K8SClient, NortonData.Resources.Namespace)).Should(Succeed()) + Expect(actions.SaveDeploymentsToFile(NortonData.Context, NortonData.K8SClient, NortonData.Resources.Namespace)).Should(Succeed()) + Expect(actions.SaveUsersToFile(NortonData.Context, NortonData.K8SClient, NortonData.Resources.Namespace)).Should(Succeed()) + + Expect(actions.SaveProjectsToFile(NimnulData.Context, NimnulData.K8SClient, NimnulData.Resources.Namespace)).Should(Succeed()) + Expect(actions.SaveDeploymentsToFile(NimnulData.Context, NimnulData.K8SClient, NimnulData.Resources.Namespace)).Should(Succeed()) + Expect(actions.SaveUsersToFile(NimnulData.Context, NimnulData.K8SClient, NimnulData.Resources.Namespace)).Should(Succeed()) } - actions.AfterEachFinalCleanup([]model.TestDataProvider{NortonData, NimnulData}) + actions.DeleteTestDataUsers(NortonData) + actions.DeleteTestDataUsers(NimnulData) + actions.DeleteTestDataDeployments(NortonData) + actions.DeleteTestDataProject(NortonData) + actions.DeleteTestDataDeployments(NimnulData) + actions.DeleteTestDataProject(NimnulData) + actions.AfterEachFinalCleanup([]model.TestDataProvider{*NortonData, *NimnulData}) }) }) - // (Consider Shared Deployments when E2E tests could conflict with each other) It("Deploy deployment wide operator and create resources in each of them", func() { By("Users can create deployments with the same name", func() { - NortonData = model.DataProviderWithResources( + NortonData = model.DataProvider( "norton-wide", - model.AProject{}, model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), - []string{"data/atlasdeployment_backup.yaml"}, - []string{}, - []model.DBUser{ - *model.NewDBUser("reader2"). - WithSecretRef("dbuser-secret-u2"). - AddCustomRole(model.RoleCustomReadWrite, "Ships", ""). - WithAuthDatabase("admin"), - }, 30008, []func(*model.TestDataProvider){}, - ) - NimnulData = model.DataProviderWithResources( + ).WithProject(data.DefaultProject()). + WithInitialDeployments(data.CreateDeploymentWithBackup(commonDeploymentName)). + WithUsers(data.BasicUser("reader2", "reader2", data.WithSecretRef("dbuser-secret-u2"), data.WithReadWriteRole())) + + NimnulData = model.DataProvider( "nimnul-wide", - model.AProject{}, model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), - []string{"data/atlasdeployment_basic.yaml"}, - []string{}, - []model.DBUser{ - *model.NewDBUser("reader2"). - WithSecretRef("dbuser-secret-u2"). - AddCustomRole(model.RoleCustomReadWrite, "Ships", ""). - WithAuthDatabase("admin"), - }, - 30009, + 30008, []func(*model.TestDataProvider){}, - ) - NortonData.Resources.Deployments[0].ObjectMeta.Name = "norton-deployment" - NortonData.Resources.Deployments[0].Spec.DeploymentSpec.Name = commonDeploymentName - NimnulData.Resources.Deployments[0].ObjectMeta.Name = "nimnul-deployment" - NimnulData.Resources.Deployments[0].Spec.DeploymentSpec.Name = commonDeploymentName + ).WithProject(data.DefaultProject()). + WithInitialDeployments(data.CreateBasicDeployment(commonDeploymentName)). + WithUsers(data.BasicUser("reader2", "reader2", data.WithSecretRef("dbuser-secret-u2"), data.WithReadWriteRole())) }) - By("Deploy users resorces", func() { - actions.PrepareUsersConfigurations(&NortonData) - actions.PrepareUsersConfigurations(&NimnulData) - actions.DeployUserResourcesAction(&NortonData) - actions.DeployUserResourcesAction(&NimnulData) + By("Initial preparation", func() { + actions.CreateNamespaceAndSecrets(NortonData) + actions.CreateNamespaceAndSecrets(NimnulData) + k8s.CreateNamespace(ctx, k8sClient, config.DefaultOperatorNS) + k8s.CreateDefaultSecret(ctx, k8sClient, config.DefaultOperatorGlobalKey, config.DefaultOperatorNS) + logPath := path.Join("output", fmt.Sprintf("deployments-wide-operator-%s-%s", NortonData.Resources.Namespace, NimnulData.Resources.Namespace)) + mgr, err := k8s.RunOperator(&k8s.Config{ + GlobalAPISecret: client.ObjectKey{ + Namespace: config.DefaultOperatorNS, + Name: config.DefaultOperatorGlobalKey, + }, + LogDir: logPath, + }) + Expect(err).NotTo(HaveOccurred()) + go func(ctx context.Context) context.Context { + err := mgr.Start(ctx) + Expect(err).NotTo(HaveOccurred()) + return ctx + }(ctx) }) - By("Operator working with right deployment if one of the user update configuration", func() { - NortonData.Resources.Deployments[0].Spec.DeploymentSpec.Labels = []common.LabelSpec{{Key: "something", Value: "awesome"}} - utils.SaveToFile( - NortonData.Resources.Deployments[0].DeploymentFileName(NortonData.Resources), - utils.JSONToYAMLConvert(NortonData.Resources.Deployments[0]), - ) - kubecli.Apply(NortonData.Resources.Deployments[0].DeploymentFileName(NortonData.Resources), "-n", NortonData.Resources.Namespace) - actions.WaitDeployment(&NortonData, 2) + By("Norton creates resources", func() { + deploy.CreateProject(NortonData) + deploy.CreateUsers(NortonData) - By("Norton deployment has labels", func() { - deployment := &v1.AtlasDeployment{} - Expect(NortonData.K8SClient.Get(NortonData.Context, types.NamespacedName{Name: NortonData.Resources.Deployments[0].ObjectMeta.Name, Namespace: NortonData.Resources.Namespace}, deployment)).To(Succeed()) - Expect(len(deployment.Spec.DeploymentSpec.Labels)).To(Equal(1)) - Expect(deployment.Spec.DeploymentSpec.Labels[0]).To(Equal(common.LabelSpec{Key: "something", Value: "awesome"})) - }) + deployment := NortonData.InitialDeployments[0] + if deployment.Namespace == "" { + deployment.Namespace = NortonData.Resources.Namespace + deployment.Spec.Project.Namespace = NortonData.Resources.Namespace + } + err := k8sClient.Create(ctx, deployment) + Expect(err).ShouldNot(HaveOccurred(), fmt.Sprintf("Deployment was not created: %v", deployment)) + }) - By("Nimnul deployment does not have labels", func() { - deployment := &v1.AtlasDeployment{} - Expect(NimnulData.K8SClient.Get(NimnulData.Context, types.NamespacedName{Name: NimnulData.Resources.Deployments[0].ObjectMeta.Name, Namespace: NimnulData.Resources.Namespace}, deployment)).To(Succeed()) - Expect(len(deployment.Spec.DeploymentSpec.Labels)).To(Equal(0)) - }) + By("Nimnul creates resources", func() { + deploy.CreateProject(NimnulData) + deploy.CreateUsers(NimnulData) + deployment := NimnulData.InitialDeployments[0] + if deployment.Namespace == "" { + deployment.Namespace = NimnulData.Resources.Namespace + deployment.Spec.Project.Namespace = NimnulData.Resources.Namespace + } + err := k8sClient.Create(ctx, deployment) + Expect(err).ShouldNot(HaveOccurred(), fmt.Sprintf("Deployment was not created: %v", deployment)) }) - By("Delete Norton/Nimnul Resources", func() { - actions.DeleteUserResources(&NortonData) - actions.DeleteUserResources(&NimnulData) + By("Check resources", func() { + Eventually(kube.DeploymentReadyCondition(NortonData), time.Minute*60, time.Second*5).Should(Equal("True"), "Deployment was not created") + Eventually(kube.DeploymentReadyCondition(NimnulData), time.Minute*60, time.Second*5).Should(Equal("True"), "Deployment was not created") }) }) }) diff --git a/test/e2e/private_link_test.go b/test/e2e/private_link_test.go index 3ba5bf1d93..aabecceee2 100644 --- a/test/e2e/private_link_test.go +++ b/test/e2e/private_link_test.go @@ -3,7 +3,6 @@ package e2e_test import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - . "github.com/onsi/gomega/gbytes" "k8s.io/apimachinery/pkg/types" v1 "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1" @@ -11,7 +10,6 @@ import ( "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1/status" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions/cloud" - kubecli "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/cli/kubecli" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/config" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/data" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/model" @@ -34,7 +32,6 @@ var _ = Describe("UserLogin", Label("privatelink"), func() { var testData *model.TestDataProvider _ = BeforeEach(func() { - Eventually(kubecli.GetVersionOutput()).Should(Say(K8sVersion)) checkUpAWSEnvironment() checkUpAzureEnvironment() checkNSetUpGCPEnvironment() diff --git a/test/e2e/project_settings_test.go b/test/e2e/project_settings_test.go index 4acf68db6b..22aca1639f 100644 --- a/test/e2e/project_settings_test.go +++ b/test/e2e/project_settings_test.go @@ -3,13 +3,11 @@ package e2e_test import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - . "github.com/onsi/gomega/gbytes" v1 "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1" "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1/status" "github.com/mongodb/mongodb-atlas-kubernetes/pkg/util/toptr" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions" - kubecli "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/cli/kubecli" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/data" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/model" ) @@ -17,10 +15,6 @@ import ( var _ = Describe("UserLogin", Label("project-settings"), func() { var testData *model.TestDataProvider - _ = BeforeEach(func() { - Eventually(kubecli.GetVersionOutput()).Should(Say(K8sVersion)) - }) - _ = AfterEach(func() { GinkgoWriter.Write([]byte("\n")) GinkgoWriter.Write([]byte("===============================================\n")) diff --git a/test/e2e/serverless_pe_test.go b/test/e2e/serverless_pe_test.go index 2f04129fb1..dfa2d7002e 100644 --- a/test/e2e/serverless_pe_test.go +++ b/test/e2e/serverless_pe_test.go @@ -4,19 +4,16 @@ import ( "fmt" "time" - "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1/status" - . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - . "github.com/onsi/gomega/gbytes" "k8s.io/apimachinery/pkg/types" v1 "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1" "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1/provider" + "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1/status" "github.com/mongodb/mongodb-atlas-kubernetes/pkg/controller/atlasdeployment" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions/serverlessprivateendpoint" - kubecli "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/cli/kubecli" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/data" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/model" ) @@ -25,7 +22,6 @@ var _ = Describe("UserLogin", Label("serverless-pe"), func() { var testData *model.TestDataProvider _ = BeforeEach(func() { - Eventually(kubecli.GetVersionOutput()).Should(Say(K8sVersion)) checkUpAWSEnvironment() checkUpAzureEnvironment() checkNSetUpGCPEnvironment() diff --git a/test/e2e/teams_test.go b/test/e2e/teams_test.go index 2fe623bdf4..1f3498a68d 100644 --- a/test/e2e/teams_test.go +++ b/test/e2e/teams_test.go @@ -3,18 +3,14 @@ package e2e_test import ( "time" - "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1/common" - - "k8s.io/apimachinery/pkg/types" - . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - . "github.com/onsi/gomega/gbytes" + "k8s.io/apimachinery/pkg/types" v1 "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1" + "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1/common" "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1/status" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions" - kubecli "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/cli/kubecli" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/data" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/model" ) @@ -22,10 +18,6 @@ import ( var _ = Describe("Teams", Label("teams"), func() { var testData *model.TestDataProvider - _ = BeforeEach(func() { - Eventually(kubecli.GetVersionOutput()).Should(Say(K8sVersion)) - }) - _ = AfterEach(func() { GinkgoWriter.Write([]byte("\n")) GinkgoWriter.Write([]byte("===============================================\n")) diff --git a/test/e2e/x509_test.go b/test/e2e/x509_test.go index e9e0693acf..4817eec904 100644 --- a/test/e2e/x509_test.go +++ b/test/e2e/x509_test.go @@ -1,31 +1,22 @@ package e2e_test import ( - "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1/status" - - "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/k8s" - . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - . "github.com/onsi/gomega/gbytes" "k8s.io/apimachinery/pkg/types" - "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions/deploy" - "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1/common" + "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1/status" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions" - kubecli "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/cli/kubecli" + "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions/deploy" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/data" + "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/k8s" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/model" ) var _ = Describe("UserLogin", Label("x509auth"), func() { var testData *model.TestDataProvider - _ = BeforeEach(func() { - Eventually(kubecli.GetVersionOutput()).Should(Say(K8sVersion)) - }) - _ = AfterEach(func() { GinkgoWriter.Write([]byte("\n")) GinkgoWriter.Write([]byte("===============================================\n"))