diff --git a/.github/codecov.yml b/.github/codecov.yml new file mode 100644 index 0000000000..be4c8bf19a --- /dev/null +++ b/.github/codecov.yml @@ -0,0 +1,4 @@ +comment: false + +github_checks: + annotations: false \ No newline at end of file diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml index 83b957c64c..11d0401312 100644 --- a/.github/workflows/test-e2e.yml +++ b/.github/workflows/test-e2e.yml @@ -177,7 +177,7 @@ jobs: echo "k8s_platform=$platform" >> $GITHUB_OUTPUT - name: Create k8s Kind Cluster if: ${{ steps.properties.outputs.k8s_platform == 'kind' && !env.ACT }} - uses: helm/kind-action@v1.4.0 + uses: helm/kind-action@v1.5.0 with: version: v0.11.1 config: test/e2e/config/kind.yaml @@ -193,6 +193,10 @@ 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: Install CRDs if needed + if: ${{ !( matrix.test == 'helm-update' || matrix.test == 'helm-wide' || matrix.test == 'bundle-test' ) }} + run: | + kubectl apply -f deploy/crds - name: Run e2e test env: MCLI_PUBLIC_API_KEY: ${{ secrets.ATLAS_PUBLIC_KEY }} @@ -221,17 +225,26 @@ jobs: run: | helm version go version - + go install github.com/onsi/ginkgo/v2/ginkgo@v2.6.1 && \ go install github.com/onsi/gomega/... + + cd test/e2e # no `long-run`, no `broken` tests. `Long-run` tests run as a separate job [[ $TEST_NAME == 'long-run' ]] && filter='long-run && !broken' || filter="$TEST_NAME"' && !long-run && !broken' && \ - echo 'Running: ginkgo --label-filter="${filter}" --timeout 120m --nodes=10 -v test/e2e/' && \ - ginkgo --label-filter="${filter}" --timeout 120m --nodes=10 -v test/e2e/ + echo 'Running: ginkgo --label-filter="${filter}" --timeout 120m --nodes=10 --cover --v' && \ + ginkgo --label-filter="${filter}" --timeout 120m --nodes=10 --cover --v --coverpkg=github.com/mongodb/mongodb-atlas-kubernetes/pkg/... - name: Upload operator logs if: ${{ failure() }} uses: actions/upload-artifact@v3 with: name: logs path: test/e2e/output/** + - name: Upload test results to codecov.io + if: ${{ success() }} + uses: codecov/codecov-action@v3 + with: + files: test/e2e/coverprofile.out + name: ${{ matrix.test }} + verbose: true diff --git a/.github/workflows/test-int.yml b/.github/workflows/test-int.yml index 74f918787c..22477a555f 100644 --- a/.github/workflows/test-int.yml +++ b/.github/workflows/test-int.yml @@ -42,13 +42,36 @@ jobs: ~/.cache/go-build ~/go/pkg/mod key: ${{ runner.os }}-build-${{ hashFiles('**/go.sum') }} - - - name: Run testing - uses: ./.github/actions/int-test + - name: Setup Go + uses: actions/setup-go@v3 with: + go-version-file: "${{ github.workspace }}/go.mod" + - name: Run testing + env: ATLAS_ORG_ID: ${{ secrets.ATLAS_ORG_ID }} ATLAS_PUBLIC_KEY: ${{ secrets.ATLAS_PUBLIC_KEY }} ATLAS_PRIVATE_KEY: ${{ secrets.ATLAS_PRIVATE_KEY }} TEST_NAME: ${{ matrix.test }} - TEST_PATH: ${{ matrix.path }} PARALLEL_NODES: ${{ matrix.nodes }} + GO111MODULE: on + GINKGO_EDITOR_INTEGRATION: "true" + run: | + + # Download binaries for envtests (api-server, etcd) + sudo curl -Lo setup-envtest.sh https://raw.githubusercontent.com/kubernetes-sigs/controller-runtime/v0.8.0/hack/setup-envtest.sh && \ + sudo mkdir -p /usr/local/kubebuilder/bin && \ + sudo /bin/bash -c "source setup-envtest.sh && fetch_envtest_tools /usr/local/kubebuilder" + + go install github.com/onsi/ginkgo/v2/ginkgo@v2.6.1 && \ + go install github.com/onsi/gomega/... + + cd ${{ matrix.path }} + ginkgo --label-filter="${TEST_NAME}" --timeout 80m --v --nodes="${PARALLEL_NODES}" --cover --coverpkg=github.com/mongodb/mongodb-atlas-kubernetes/pkg/... + + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v3 + with: + name: ${{ matrix.test }} + files: ${{ matrix.path }}/coverprofile.out + verbose: true + diff --git a/.github/workflows/test-unit.yml b/.github/workflows/test-unit.yml index 7a72301b30..8cfbf83196 100644 --- a/.github/workflows/test-unit.yml +++ b/.github/workflows/test-unit.yml @@ -38,4 +38,11 @@ jobs: - run: go version - name: Run testing - run: CGO_ENABLED=0 go test -v $(go list ./pkg/...) + run: CGO_ENABLED=0 go test -v $(go list ./pkg/...) -coverprofile=coverage.out + + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v3 + with: + name: unit-tests + files: coverage.out + verbose: true diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9ed704874c..f976ee3c20 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -28,6 +28,27 @@ jobs: steps: - name: allowed message run: echo "Allowed to run" + - name: check Github action bot comment + if: github.event_name == 'pull_request' + uses: peter-evans/find-comment@v2 + id: find-bot-comment + with: + issue-number: ${{ github.event.pull_request.number }} + comment-author: github-actions[bot] + body-includes: 'https://app.codecov.io/github/mongodb/mongodb-atlas-kubernetes/commit' + - name: edit comment if exists + if: github.event_name == 'pull_request' && steps.find-bot-comment.outputs.comment-id != '' + uses: peter-evans/create-or-update-comment@v2 + with: + edit-mode: replace + comment-id: ${{ steps.find-bot-comment.outputs.comment-id }} + body: https://app.codecov.io/github/mongodb/mongodb-atlas-kubernetes/commit/${{ github.event.pull_request.head.sha }} + - name: comment PR + if: github.event_name == 'pull_request' && steps.find-bot-comment.outputs.comment-id == '' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh pr comment ${{ github.event.pull_request.number }} -R mongodb/mongodb-atlas-kubernetes -b "https://app.codecov.io/github/mongodb/mongodb-atlas-kubernetes/commit/${{ github.event.pull_request.head.sha }}" unit-tests: needs: allowed diff --git a/test/e2e/actions/deploy/deploy_operator.go b/test/e2e/actions/deploy/deploy_operator.go index 6fae047b6e..44c61f121d 100644 --- a/test/e2e/actions/deploy/deploy_operator.go +++ b/test/e2e/actions/deploy/deploy_operator.go @@ -2,169 +2,46 @@ package deploy import ( + "context" "fmt" - "os" - "path/filepath" - "strings" "time" - "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/k8s" - - "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1/status" - - corev1 "k8s.io/api/core/v1" - - "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions/kube" - - "k8s.io/apimachinery/pkg/types" - - "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/api/atlas" - . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/types" + "sigs.k8s.io/controller-runtime/pkg/client" - kubecli "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/cli/kubecli" - "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/cli/kustomize" + "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1/status" + "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/k8s" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/model" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/utils" ) -// prepareNamespaceOperatorResources create copy of `/deploy/namespaced` folder with kustomization file for overriding namespace -func prepareNamespaceOperatorResources(input model.UserInputs) { - fullPath := input.GetOperatorFolder() - os.Mkdir(fullPath, os.ModePerm) - utils.CopyFile(config.DefaultNamespacedCRDConfig, filepath.Join(fullPath, "crds.yaml")) - utils.CopyFile(config.DefaultNamespacedOperatorConfig, filepath.Join(fullPath, "namespaced-config.yaml")) - data := []byte( - "namespace: " + input.Namespace + "\n" + - "resources:" + "\n" + - "- crds.yaml" + "\n" + - "- namespaced-config.yaml", - ) - utils.SaveToFile(filepath.Join(fullPath, "kustomization.yaml"), data) -} - -// CopyKustomizeNamespaceOperator create copy of `/deploy/namespaced` folder with kustomization file for overriding namespace -func prepareWideOperatorResources(input model.UserInputs) { - fullPath := input.GetOperatorFolder() - os.Mkdir(fullPath, os.ModePerm) - utils.CopyFile(config.DefaultClusterWideCRDConfig, filepath.Join(fullPath, "crds.yaml")) - utils.CopyFile(config.DefaultClusterWideOperatorConfig, filepath.Join(fullPath, "clusterwide-config.yaml")) -} - -// CopyKustomizeNamespaceOperator create copy of `/deploy/namespaced` folder with kustomization file for overriding namespace -func prepareMultiNamespaceOperatorResources(input model.UserInputs, watchedNamespaces []string) { - fullPath := input.GetOperatorFolder() - err := os.Mkdir(fullPath, os.ModePerm) - Expect(err).ShouldNot(HaveOccurred()) - utils.CopyFile(config.DefaultClusterWideCRDConfig, filepath.Join(fullPath, "crds.yaml")) - utils.CopyFile(config.DefaultClusterWideOperatorConfig, filepath.Join(fullPath, "multinamespace-config.yaml")) - namespaces := strings.Join(watchedNamespaces, ",") - patchWatch := []byte( - "apiVersion: apps/v1\n" + - "kind: Deployment\n" + - "metadata:\n" + - " name: mongodb-atlas-operator\n" + - "spec:\n" + - " template:\n" + - " spec:\n" + - " containers:\n" + - " - name: manager\n" + - " env:\n" + - " - name: WATCH_NAMESPACE\n" + - " value: \"" + namespaces + "\"", - ) - err = utils.SaveToFile(filepath.Join(fullPath, "patch.yaml"), patchWatch) - Expect(err).ShouldNot(HaveOccurred()) - kustomization := []byte( - "resources:\n" + - "- multinamespace-config.yaml\n" + - "patches:\n" + - "- path: patch.yaml\n" + - " target:\n" + - " group: apps\n" + - " version: v1\n" + - " kind: Deployment\n" + - " name: mongodb-atlas-operator", - ) - err = utils.SaveToFile(filepath.Join(fullPath, "kustomization.yaml"), kustomization) - Expect(err).ShouldNot(HaveOccurred()) -} - -func NamespacedOperator(data *model.TestDataProvider) { - prepareNamespaceOperatorResources(data.Resources) - By("Deploy namespaced Operator\n", func() { - kubecli.Apply("-k", data.Resources.GetOperatorFolder()) - CheckOperatorRunning(data, data.Resources.Namespace) - }) -} - -func CheckOperatorRunning(data *model.TestDataProvider, namespace string) { - By("Check Operator is running", func() { - Eventually( - func(g Gomega) string { - status, err := k8s.GetPodStatus(data.Context, data.K8SClient, namespace) - g.Expect(err).ShouldNot(HaveOccurred()) - return status - }, - "5m", "3s", - ).Should(Equal("Running"), "The operator should successfully run") - }) -} - -func ClusterWideOperator(data *model.TestDataProvider) { - prepareWideOperatorResources(data.Resources) - By("Deploy clusterwide Operator \n", func() { - kubecli.Apply("-k", data.Resources.GetOperatorFolder()) - CheckOperatorRunning(data, config.DefaultOperatorNS) - }) -} - func MultiNamespaceOperator(data *model.TestDataProvider, watchNamespace []string) { - prepareMultiNamespaceOperatorResources(data.Resources, watchNamespace) By("Deploy multinamespaced Operator \n", func() { - kustomOperatorPath := data.Resources.GetOperatorFolder() + "/final.yaml" - utils.SaveToFile(kustomOperatorPath, kustomize.Build(data.Resources.GetOperatorFolder())) - kubecli.Apply(kustomOperatorPath) - CheckOperatorRunning(data, config.DefaultOperatorNS) - }) -} - -func DeleteProject(testData *model.TestDataProvider) { - By("Delete Project", func() { - projectId := testData.Project.Status.ID - Expect(testData.K8SClient.Get(testData.Context, types.NamespacedName{Name: testData.Project.Name, Namespace: testData.Project.Namespace}, testData.Project)).Should(Succeed(), "Get project failed") - Expect(testData.K8SClient.Delete(testData.Context, testData.Project)).Should(Succeed(), "Delete project failed") - aClient := atlas.GetClientOrFail() - Eventually(func(g Gomega) bool { - return aClient.IsProjectExists(g, projectId) - }).WithTimeout(5*time.Minute).WithPolling(20*time.Second).Should(BeTrue(), "Project was not deleted in Atlas") - }) -} - -func DeleteUsers(testData *model.TestDataProvider) { - By("Delete Users", func() { - for _, user := range testData.Users { - Expect(testData.K8SClient.Get(testData.Context, types.NamespacedName{Name: user.Name, Namespace: user.Namespace}, user)).Should(Succeed(), "Get user failed") - Expect(testData.K8SClient.Delete(testData.Context, user)).Should(Succeed(), "Delete user failed") - } - }) -} - -func DeleteInitialDeployments(testData *model.TestDataProvider) { - By("Delete initial deployments", func() { - for _, deployment := range testData.InitialDeployments { - projectId := testData.Project.Status.ID - deploymentName := deployment.Spec.DeploymentSpec.Name - Expect(testData.K8SClient.Get(testData.Context, types.NamespacedName{Name: deployment.Name, - Namespace: testData.Resources.Namespace}, deployment)).Should(Succeed(), "Get deployment failed") - Expect(testData.K8SClient.Delete(testData.Context, deployment)).Should(Succeed(), "Deployment %s was not deleted", deployment.Name) - aClient := atlas.GetClientOrFail() - Eventually(func() bool { - return aClient.IsDeploymentExist(projectId, deploymentName) - }).WithTimeout(15*time.Minute).WithPolling(20*time.Second).Should(BeFalse(), "Deployment should be deleted in Atlas") + watchNamespaceMap := make(map[string]bool, len(watchNamespace)) + for _, ns := range watchNamespace { + watchNamespaceMap[ns] = true } + mgr, err := k8s.RunOperator(&k8s.Config{ + Namespace: config.DefaultOperatorNS, + GlobalAPISecret: client.ObjectKey{ + Namespace: config.DefaultOperatorNS, + Name: config.DefaultOperatorGlobalKey, + }, + WatchedNamespaces: watchNamespaceMap, + LogDir: "logs", + }) + Expect(err).Should(Succeed()) + ctx := context.Background() + go func(ctx context.Context) { + err = mgr.Start(ctx) + Expect(err).Should(Succeed(), "Operator should be started") + }(ctx) + data.ManagerContext = ctx }) } @@ -175,8 +52,11 @@ func CreateProject(testData *model.TestDataProvider) { By(fmt.Sprintf("Deploy Project %s", testData.Project.GetName()), func() { err := testData.K8SClient.Create(testData.Context, testData.Project) Expect(err).ShouldNot(HaveOccurred(), "Project %s was not created", testData.Project.GetName()) - Eventually(kube.ProjectReadyCondition(testData)).WithTimeout(5*time.Minute).WithPolling(20*time.Second). - Should(Not(Equal("False")), "Project %s should be ready", testData.Project.GetName()) + Eventually(func(g Gomega) { + condition, _ := k8s.GetProjectStatusCondition(testData.Context, testData.K8SClient, status.ReadyType, + testData.Resources.Namespace, testData.Project.GetName()) + g.Expect(condition).Should(Equal("True")) + }).Should(Succeed(), "Project %s was not created", testData.Project.GetName()) }) By(fmt.Sprintf("Wait for Project %s", testData.Project.GetName()), func() { Eventually(func() bool { diff --git a/test/e2e/actions/project_flow.go b/test/e2e/actions/project_flow.go index 803fac8099..33f5bfa775 100644 --- a/test/e2e/actions/project_flow.go +++ b/test/e2e/actions/project_flow.go @@ -1,28 +1,54 @@ package actions import ( + "context" "fmt" - - kubecli "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/k8s" + "path" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/manager" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions/deploy" "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" ) func ProjectCreationFlow(userData *model.TestDataProvider) { - By("Deploy Project with requested configuration", func() { - PrepareUsersConfigurations(userData) - deploy.NamespacedOperator(userData) // TODO: how to deploy operator by code? - By(fmt.Sprintf("Create namespace %s", userData.Resources.Namespace)) - Expect(kubecli.CreateNamespace(userData.Context, userData.K8SClient, userData.Resources.Namespace)).Should(Succeed()) - kubecli.CreateDefaultSecret(userData.Context, userData.K8SClient, config.DefaultOperatorGlobalKey, userData.Resources.Namespace) - if !userData.Resources.AtlasKeyAccessType.GlobalLevelKey { - CreateConnectionAtlasKey(userData) - } + By("Prepare operator configurations", func() { + mgr := PrepareOperatorConfigurations(userData) + ctx := context.Background() + go func(ctx context.Context) context.Context { + err := mgr.Start(ctx) + Expect(err).NotTo(HaveOccurred()) + return ctx + }(ctx) deploy.CreateProject(userData) + userData.ManagerContext = ctx + }) +} + +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) + } + logPath := path.Join("output", userData.Resources.Namespace) + mgr, err := k8s.RunOperator(&k8s.Config{ + Namespace: userData.Resources.Namespace, + WatchedNamespaces: map[string]bool{ + userData.Resources.Namespace: true, + }, + GlobalAPISecret: client.ObjectKey{ + Namespace: userData.Resources.Namespace, + Name: config.DefaultOperatorGlobalKey, + }, + LogDir: logPath, }) + Expect(err).NotTo(HaveOccurred()) + return mgr } diff --git a/test/e2e/actions/steps.go b/test/e2e/actions/steps.go index b6ec0b8bf6..7cca0d5b53 100644 --- a/test/e2e/actions/steps.go +++ b/test/e2e/actions/steps.go @@ -294,7 +294,20 @@ func SaveProjectsToFile(ctx context.Context, k8sClient client.Client, ns string) return nil } -func SaveDeploymentToFile(ctx context.Context, k8sClient client.Client, ns string) error { +func SaveTeamsToFile(ctx context.Context, k8sClient client.Client, ns string) error { + yaml, err := k8s.TeamListYaml(ctx, k8sClient, ns) + if err != nil { + return fmt.Errorf("error getting team list: %w", err) + } + path := fmt.Sprintf("output/%s/%s.yaml", ns, "teams") + err = utils.SaveToFile(path, yaml) + if err != nil { + return fmt.Errorf("error saving teams to file: %w", err) + } + return nil +} + +func SaveDeploymentsToFile(ctx context.Context, k8sClient client.Client, ns string) error { yaml, err := k8s.DeploymentListYml(ctx, k8sClient, ns) if err != nil { return fmt.Errorf("error getting deployment list: %w", err) @@ -307,6 +320,19 @@ func SaveDeploymentToFile(ctx context.Context, k8sClient client.Client, ns strin return nil } +func SaveUsersToFile(ctx context.Context, k8sClient client.Client, ns string) error { + yaml, err := k8s.UserListYaml(ctx, k8sClient, ns) + if err != nil { + return fmt.Errorf("error getting user list: %w", err) + } + path := fmt.Sprintf("output/%s/%s.yaml", ns, "users") + err = utils.SaveToFile(path, yaml) + if err != nil { + return fmt.Errorf("error saving users to file: %w", err) + } + return nil +} + func SaveTestAppLogs(input model.UserInputs) { for _, user := range input.Users { utils.SaveToFile( @@ -320,22 +346,6 @@ func SaveTestAppLogs(input model.UserInputs) { } } -// SaveOperatorLogs save logs from user input namespace -func SaveOperatorLogs(input model.UserInputs) { - utils.SaveToFile( - fmt.Sprintf("output/%s/operator-logs.txt", input.Namespace), - kubecli.GetManagerLogs(input.Namespace), - ) -} - -// SaveDefaultOperatorLogs save logs from default namespace -func SaveDefaultOperatorLogs(input model.UserInputs) { - utils.SaveToFile( - fmt.Sprintf("output/%s/operator-logs.txt", input.Namespace), - kubecli.GetManagerLogs("default"), - ) -} - func SaveDeploymentDump(input model.UserInputs) { kubecli.GetDeploymentDump(fmt.Sprintf("output/%s/dump", input.Namespace)) } @@ -468,8 +478,10 @@ func PrepareUsersConfigurations(data *model.TestDataProvider) { func CreateConnectionAtlasKey(data *model.TestDataProvider) { By("Change resources depends on AtlasKey and create key", func() { if data.Resources.AtlasKeyAccessType.GlobalLevelKey { + By("Create secret in the data namespace") k8s.CreateDefaultSecret(data.Context, data.K8SClient, config.DefaultOperatorGlobalKey, data.Resources.Namespace) } else { + By("Create secret in the data prefix name") k8s.CreateDefaultSecret(data.Context, data.K8SClient, data.Prefix, data.Resources.Namespace) } }) @@ -595,13 +607,25 @@ func DeleteTestDataProject(data *model.TestDataProvider) { Expect(data.K8SClient.Get(data.Context, types.NamespacedName{Name: data.Project.Name, Namespace: data.Project.Namespace}, data.Project)).Should(Succeed()) projectID := data.Project.Status.ID Expect(data.K8SClient.Delete(data.Context, data.Project)).Should(Succeed()) - Eventually( - func(g Gomega) bool { - aClient := atlas.GetClientOrFail() - return aClient.IsProjectExists(g, projectID) - }, - "15m", "20s", - ).Should(BeFalse(), "Project should be deleted from Atlas") + if projectID != "" { + Eventually( + func(g Gomega) bool { + aClient := atlas.GetClientOrFail() + return aClient.IsProjectExists(g, projectID) + }, + "15m", "20s", + ).Should(BeFalse(), "Project should be deleted from Atlas") + } + }) +} + +func DeleteTestDataTeams(data *model.TestDataProvider) { + By("Delete teams", func() { + teams := &v1.AtlasTeamList{} + Expect(data.K8SClient.List(data.Context, teams, &client.ListOptions{Namespace: data.Resources.Namespace})).Should(Succeed()) + for i := range teams.Items { + Expect(data.K8SClient.Delete(data.Context, &teams.Items[i])).Should(Succeed()) + } }) } @@ -624,23 +648,26 @@ func DeleteTestDataDeployments(data *model.TestDataProvider) { }) } -func DeleteGlobalKeyIfExist(data model.TestDataProvider) { +func DeleteAtlasGlobalKeyIfExist(data model.TestDataProvider) { if data.Resources.AtlasKeyAccessType.GlobalLevelKey { By("Delete Global API key for test", func() { client, err := atlas.AClient() Expect(err).ShouldNot(HaveOccurred()) - err = client.DeleteGlobalKey(*data.Resources.AtlasKeyAccessType.GlobalKeyAttached) - Expect(err).ShouldNot(HaveOccurred()) + if data.Resources.AtlasKeyAccessType.GlobalKeyAttached != nil { + err = client.DeleteGlobalKey(*data.Resources.AtlasKeyAccessType.GlobalKeyAttached) + Expect(err).ShouldNot(HaveOccurred()) + } }) } } func AfterEachFinalCleanup(datas []model.TestDataProvider) { - for _, data := range datas { + for i := range datas { + data := datas[i] GinkgoWriter.Write([]byte("AfterEach. Final cleanup...\n")) DeleteDBUsersApps(data) + DeleteAtlasGlobalKeyIfExist(data) Expect(k8s.DeleteNamespace(data.Context, data.K8SClient, data.Resources.Namespace)).Should(Succeed(), "Can't delete namespace") - DeleteGlobalKeyIfExist(data) GinkgoWriter.Write([]byte("AfterEach. Cleanup finished\n")) } } diff --git a/test/e2e/alert_configurations_test.go b/test/e2e/alert_config_test.go similarity index 67% rename from test/e2e/alert_configurations_test.go rename to test/e2e/alert_config_test.go index cb0892f6be..3d1c72d212 100644 --- a/test/e2e/alert_configurations_test.go +++ b/test/e2e/alert_config_test.go @@ -17,7 +17,7 @@ import ( "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/model" ) -var _ = Describe("UserLogin", Label("alert-config"), func() { +var _ = Describe("Alert configuration tests", Label("alert-config"), func() { var testData *model.TestDataProvider _ = BeforeEach(func() { @@ -30,12 +30,10 @@ var _ = Describe("UserLogin", Label("alert-config"), func() { GinkgoWriter.Write([]byte("Operator namespace: " + testData.Resources.Namespace + "\n")) GinkgoWriter.Write([]byte("===============================================\n")) if CurrentSpecReport().Failed() { - SaveDump(testData) + Expect(actions.SaveProjectsToFile(testData.Context, testData.K8SClient, testData.Resources.Namespace)).Should(Succeed()) } - By("Delete Resources, Project with custom alert configurations", func() { - actions.DeleteTestDataProject(testData) - actions.DeleteGlobalKeyIfExist(*testData) - }) + actions.DeleteTestDataProject(testData) + actions.AfterEachFinalCleanup([]model.TestDataProvider{*testData}) }) DescribeTable("Namespaced operators working only with its own namespace with different configuration", @@ -47,7 +45,7 @@ var _ = Describe("UserLogin", Label("alert-config"), func() { Entry("Test[alert-configs-1]: Project with 2 identical alert configs", Label("alert-configs-1"), model.DataProvider( "alert-configs-1", - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), 40000, []func(*model.TestDataProvider){}, ).WithProject(data.DefaultProject()), @@ -99,7 +97,7 @@ var _ = Describe("UserLogin", Label("alert-config"), func() { Entry("Test[alert-configs-2]: Project with 2 different alert configs", Label("alert-configs-2"), model.DataProvider( "alert-configs-2", - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), 40000, []func(*model.TestDataProvider){}, ).WithProject(data.DefaultProject()), @@ -144,37 +142,32 @@ var _ = Describe("UserLogin", Label("alert-config"), func() { }, ), ) + }) func alertConfigFlow(userData *model.TestDataProvider, alertConfigs []v1.AlertConfiguration) { - By("Create project with alert configurations", func() { - Expect(userData.K8SClient.Get(userData.Context, types.NamespacedName{Name: userData.Project.Name, - Namespace: userData.Project.Namespace}, userData.Project)).Should(Succeed()) - userData.Project.Spec.AlertConfigurationSyncEnabled = true - userData.Project.Spec.AlertConfigurations = append(userData.Project.Spec.AlertConfigurations, alertConfigs...) - Expect(userData.K8SClient.Update(userData.Context, userData.Project)).Should(Succeed()) - }) + Expect(userData.K8SClient.Get(userData.Context, types.NamespacedName{Name: userData.Project.Name, + Namespace: userData.Project.Namespace}, userData.Project)).Should(Succeed()) + userData.Project.Spec.AlertConfigurationSyncEnabled = true + userData.Project.Spec.AlertConfigurations = append(userData.Project.Spec.AlertConfigurations, alertConfigs...) + Expect(userData.K8SClient.Update(userData.Context, userData.Project)).Should(Succeed()) - By("Check project status", func() { - actions.WaitForConditionsToBecomeTrue(userData, status.AlertConfigurationReadyType, status.ReadyType) - Expect(userData.K8SClient.Get(userData.Context, types.NamespacedName{Name: userData.Project.Name, Namespace: userData.Project.Namespace}, userData.Project)).Should(Succeed()) - Expect(userData.Project.Status.AlertConfigurations).Should(HaveLen(len(alertConfigs))) - }) + actions.WaitForConditionsToBecomeTrue(userData, status.AlertConfigurationReadyType, status.ReadyType) + Expect(userData.K8SClient.Get(userData.Context, types.NamespacedName{Name: userData.Project.Name, Namespace: userData.Project.Namespace}, userData.Project)).Should(Succeed()) + Expect(userData.Project.Status.AlertConfigurations).Should(HaveLen(len(alertConfigs))) - By("Check alert configurations in Atlas", func() { - atlasClient := atlas.GetClientOrFail() - alertConfigurations, _, err := atlasClient.Client.AlertConfigurations.List(userData.Context, userData.Project.ID(), nil) - Expect(err).ShouldNot(HaveOccurred()) - Expect(alertConfigurations).Should(HaveLen(len(alertConfigs))) + atlasClient := atlas.GetClientOrFail() + alertConfigurations, _, err := atlasClient.Client.AlertConfigurations.List(userData.Context, userData.Project.ID(), nil) + Expect(err).ShouldNot(HaveOccurred()) + Expect(alertConfigurations).Should(HaveLen(len(alertConfigs)), "Atlas alert configurations", alertConfigurations) - var atlasIDList []string - for _, alertConfig := range alertConfigurations { - atlasIDList = append(atlasIDList, alertConfig.ID) - } - var statusIDList []string - for _, alertConfig := range userData.Project.Status.AlertConfigurations { - statusIDList = append(statusIDList, alertConfig.ID) - } - Expect(util.IsEqualWithoutOrder(statusIDList, atlasIDList)).Should(BeTrue()) - }) + atlasIDList := make([]string, 0, len(alertConfigurations)) + for _, alertConfig := range alertConfigurations { + atlasIDList = append(atlasIDList, alertConfig.ID) + } + statusIDList := make([]string, 0, len(userData.Project.Status.AlertConfigurations)) + for _, alertConfig := range userData.Project.Status.AlertConfigurations { + statusIDList = append(statusIDList, alertConfig.ID) + } + Expect(util.IsEqualWithoutOrder(statusIDList, atlasIDList)).Should(BeTrue()) } diff --git a/test/e2e/annotations_test.go b/test/e2e/annotations_test.go index 136ca3550e..b82c4a9e22 100644 --- a/test/e2e/annotations_test.go +++ b/test/e2e/annotations_test.go @@ -1,8 +1,6 @@ package e2e_test import ( - "fmt" - . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" . "github.com/onsi/gomega/gbytes" @@ -11,7 +9,6 @@ import ( 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" ) var _ = Describe("Annotations base test.", Label("deployment-annotations-ns"), func() { @@ -26,25 +23,12 @@ var _ = Describe("Annotations base test.", Label("deployment-annotations-ns"), f GinkgoWriter.Write([]byte("Operator namespace: " + testData.Resources.Namespace + "\n")) GinkgoWriter.Write([]byte("===============================================\n")) if CurrentSpecReport().Failed() { - GinkgoWriter.Write([]byte("Test has been failed. Trying to save logs...\n")) - utils.SaveToFile( - fmt.Sprintf("output/%s/operatorDecribe.txt", testData.Resources.Namespace), - []byte(kubecli.DescribeOperatorPod(testData.Resources.Namespace)), - ) - utils.SaveToFile( - fmt.Sprintf("output/%s/operator-logs.txt", testData.Resources.Namespace), - kubecli.GetManagerLogs(testData.Resources.Namespace), - ) - actions.SaveTestAppLogs(testData.Resources) Expect(actions.SaveProjectsToFile(testData.Context, testData.K8SClient, testData.Resources.Namespace)).Should(Succeed()) - actions.SaveK8sResources( - []string{"deploy", "atlasdeployments"}, - testData.Resources.Namespace, - ) - actions.AfterEachFinalCleanup([]model.TestDataProvider{*testData}) - actions.DeleteTestDataDeployments(testData) - actions.DeleteTestDataProject(testData) + Expect(actions.SaveDeploymentsToFile(testData.Context, testData.K8SClient, testData.Resources.Namespace)).Should(Succeed()) } + actions.DeleteTestDataDeployments(testData) + actions.DeleteTestDataProject(testData) + actions.AfterEachFinalCleanup([]model.TestDataProvider{*testData}) }) DescribeTable("Namespaced operators working only with its own namespace with different configuration", @@ -55,7 +39,7 @@ var _ = Describe("Annotations base test.", Label("deployment-annotations-ns"), f Entry("Simple configuration with keep resource policy annotation on deployment", Label("ns-crd"), model.DataProvider( "operator-ns-crd", - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), 30000, []func(*model.TestDataProvider){ actions.DeleteDeploymentCRWithKeepAnnotation, diff --git a/test/e2e/auditing_test.go b/test/e2e/auditing_test.go index 20d6634227..c128fe7646 100644 --- a/test/e2e/auditing_test.go +++ b/test/e2e/auditing_test.go @@ -28,11 +28,11 @@ var _ = Describe("UserLogin", Label("auditing"), func() { GinkgoWriter.Write([]byte("Operator namespace: " + testData.Resources.Namespace + "\n")) GinkgoWriter.Write([]byte("===============================================\n")) if CurrentSpecReport().Failed() { - SaveDump(testData) + Expect(actions.SaveProjectsToFile(testData.Context, testData.K8SClient, testData.Resources.Namespace)).Should(Succeed()) } By("Delete Resources", func() { actions.DeleteTestDataProject(testData) - actions.DeleteGlobalKeyIfExist(*testData) + actions.AfterEachFinalCleanup([]model.TestDataProvider{*testData}) }) }) @@ -45,7 +45,7 @@ var _ = Describe("UserLogin", Label("auditing"), func() { Entry("Test[auditing]: User has project to which Auditing was added", Label("auditing"), model.DataProvider( "auditing", - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), 40000, []func(*model.TestDataProvider){}, ).WithProject(data.DefaultProject()), diff --git a/test/e2e/bundle_test.go b/test/e2e/bundle_test.go index 9de35dc5e2..139139aa29 100644 --- a/test/e2e/bundle_test.go +++ b/test/e2e/bundle_test.go @@ -4,20 +4,19 @@ import ( "fmt" "os" - "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1/status" - - "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions/deploy" - "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/data" - . "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/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" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/model" ) @@ -43,6 +42,7 @@ var _ = Describe("User can deploy operator from bundles", func() { } actions.DeleteTestDataDeployments(testData) actions.DeleteTestDataProject(testData) + actions.AfterEachFinalCleanup([]model.TestDataProvider{*testData}) }) }) @@ -50,7 +50,7 @@ var _ = Describe("User can deploy operator from bundles", func() { By("User creates configuration for a new Project and Deployment", func() { testData = model.DataProvider( "bundle-wide", - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), 30005, []func(*model.TestDataProvider){}, ).WithProject(data.DefaultProject()). @@ -67,7 +67,13 @@ var _ = Describe("User can deploy operator from bundles", func() { }) By("Apply configuration", func() { - actions.ProjectCreationFlow(testData) + By(fmt.Sprintf("Create namespace %s", testData.Resources.Namespace)) + Expect(k8s.CreateNamespace(testData.Context, testData.K8SClient, testData.Resources.Namespace)).Should(Succeed()) + k8s.CreateDefaultSecret(testData.Context, testData.K8SClient, config.DefaultOperatorGlobalKey, testData.Resources.Namespace) + if !testData.Resources.AtlasKeyAccessType.GlobalLevelKey { + actions.CreateConnectionAtlasKey(testData) + } + deploy.CreateProject(testData) By(fmt.Sprintf("project namespace %v", testData.Project.Namespace)) actions.WaitForConditionsToBecomeTrue(testData, status.ReadyType) deploy.CreateInitialDeployments(testData) diff --git a/test/e2e/cli/kubecli/kubecli.go b/test/e2e/cli/kubecli/kubecli.go index 3f39c97f2a..ad2fa623ad 100644 --- a/test/e2e/cli/kubecli/kubecli.go +++ b/test/e2e/cli/kubecli/kubecli.go @@ -10,13 +10,6 @@ import ( "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/cli" ) -// DescribeOperatorPod performs "kubectl describe" to get Operator pod information -func DescribeOperatorPod(ns string) string { - session := cli.Execute("kubectl", "describe", "pods", "-l", "app.kubernetes.io/instance=mongodb-atlas-kubernetes-operator", "-n", ns) - cli.SessionShouldExit(session) - return string(session.Out.Contents()) -} - func GetVersionOutput() *Buffer { session := cli.Execute("kubectl", "version") return session.Wait().Out diff --git a/test/e2e/cloud_access_role_test.go b/test/e2e/cloud_access_role_test.go index 9a32cdb27e..7b1f592254 100644 --- a/test/e2e/cloud_access_role_test.go +++ b/test/e2e/cloud_access_role_test.go @@ -34,14 +34,14 @@ var _ = Describe("UserLogin", Label("cloud-access-role"), func() { GinkgoWriter.Write([]byte("Operator namespace: " + testData.Resources.Namespace + "\n")) GinkgoWriter.Write([]byte("===============================================\n")) if CurrentSpecReport().Failed() { - SaveDump(testData) + Expect(actions.SaveProjectsToFile(testData.Context, testData.K8SClient, testData.Resources.Namespace)).Should(Succeed()) } By("Clean Roles", func() { DeleteAllRoles(testData) }) By("Delete Resources, Project with Cloud provider access roles", func() { actions.DeleteTestDataProject(testData) - actions.DeleteGlobalKeyIfExist(*testData) + actions.AfterEachFinalCleanup([]model.TestDataProvider{*testData}) }) }) @@ -54,7 +54,7 @@ var _ = Describe("UserLogin", Label("cloud-access-role"), func() { Entry("Test[cloud-access-role-aws-1]: User has project which was updated with AWS custom role", Label("cloud-access-role-aws-1"), model.DataProvider( "cloud-access-role-aws-1", - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), 40000, []func(*model.TestDataProvider){}, ).WithProject(data.DefaultProject()), diff --git a/test/e2e/configuration_test.go b/test/e2e/configuration_test.go index 8e2a26a9e1..e92eca5918 100644 --- a/test/e2e/configuration_test.go +++ b/test/e2e/configuration_test.go @@ -1,13 +1,7 @@ package e2e_test import ( - "fmt" - - "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/k8s" - - "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/data" - - "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/config" + "context" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" @@ -16,9 +10,8 @@ import ( "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" - "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/utils" ) var _ = Describe("Configuration namespaced. Deploy deployment", Label("deployment-ns"), func() { @@ -33,25 +26,14 @@ var _ = Describe("Configuration namespaced. Deploy deployment", Label("deploymen GinkgoWriter.Write([]byte("Operator namespace: " + testData.Resources.Namespace + "\n")) GinkgoWriter.Write([]byte("===============================================\n")) if CurrentSpecReport().Failed() { - GinkgoWriter.Write([]byte("Test has been failed. Trying to save logs...\n")) - utils.SaveToFile( - fmt.Sprintf("output/%s/operatorDecribe.txt", testData.Resources.Namespace), - []byte(kubecli.DescribeOperatorPod(testData.Resources.Namespace)), - ) - utils.SaveToFile( - fmt.Sprintf("output/%s/operator-logs.txt", testData.Resources.Namespace), - kubecli.GetManagerLogs(testData.Resources.Namespace), - ) - actions.SaveTestAppLogs(testData.Resources) - actions.SaveProjectsToFile(testData.Context, testData.K8SClient, testData.Resources.Namespace) - actions.SaveK8sResources( - []string{"deploy", "atlasdeployments", "atlasdatabaseusers"}, - testData.Resources.Namespace, - ) - actions.AfterEachFinalCleanup([]model.TestDataProvider{*testData}) - actions.DeleteTestDataDeployments(testData) - actions.DeleteTestDataProject(testData) + Expect(actions.SaveProjectsToFile(testData.Context, testData.K8SClient, testData.Resources.Namespace)).Should(Succeed()) + Expect(actions.SaveDeploymentsToFile(testData.Context, testData.K8SClient, testData.Resources.Namespace)).Should(Succeed()) + Expect(actions.SaveUsersToFile(testData.Context, testData.K8SClient, testData.Resources.Namespace)).Should(Succeed()) } + + actions.DeleteTestDataDeployments(testData) + actions.DeleteTestDataProject(testData) + actions.AfterEachFinalCleanup([]model.TestDataProvider{*testData}) }) DescribeTable("Namespaced operators working only with its own namespace with different configuration", @@ -62,7 +44,7 @@ var _ = Describe("Configuration namespaced. Deploy deployment", Label("deploymen Entry("Trial - Simplest configuration with no backup and one Admin User", Label("ns-trial"), model.DataProvider( "operator-ns-trial", - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), 30000, []func(*model.TestDataProvider){ actions.DeleteFirstUser, @@ -74,7 +56,7 @@ var _ = Describe("Configuration namespaced. Deploy deployment", Label("deploymen Entry("Almost Production - Backup and 2 DB users: one Admin and one read-only", Label("ns-backup2db", "long-run"), model.DataProvider( "operator-ns-prodlike", - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), 30001, []func(*model.TestDataProvider){ actions.UpdateSpecOfSelectedDeployment(data.NewDeploymentWithBackupSpec(), 0), @@ -91,7 +73,7 @@ var _ = Describe("Configuration namespaced. Deploy deployment", Label("deploymen Entry("Multiregion AWS, Backup and 2 DBUsers", Label("ns-multiregion-aws-2"), model.DataProvider( "operator-ns-multiregion-aws", - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), 30003, []func(*model.TestDataProvider){ actions.SuspendDeployment, @@ -106,7 +88,7 @@ var _ = Describe("Configuration namespaced. Deploy deployment", Label("deploymen Entry("Multiregion Azure, Backup and 1 DBUser", Label("ns-multiregion-azure-1"), model.DataProvider( "operator-multiregion-azure", - model.NewEmptyAtlasKeyType().UseDefaulFullAccess().CreateAsGlobalLevelKey(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess().CreateAsGlobalLevelKey(), 30012, []func(*model.TestDataProvider){ actions.DeleteFirstUser, @@ -118,7 +100,7 @@ var _ = Describe("Configuration namespaced. Deploy deployment", Label("deploymen Entry("Multiregion GCP, Backup and 1 DBUser", Label("ns-multiregion-gcp-1"), model.DataProvider( "operator-multiregion-gcp", - model.NewEmptyAtlasKeyType().UseDefaulFullAccess().CreateAsGlobalLevelKey(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess().CreateAsGlobalLevelKey(), 30013, []func(*model.TestDataProvider){ actions.DeleteFirstUser, @@ -143,7 +125,7 @@ var _ = Describe("Configuration namespaced. Deploy deployment", Label("deploymen Entry("Trial - Global connection", Label("ns-global-key"), model.DataProvider( "operator-ns-trial-global", - model.NewEmptyAtlasKeyType().UseDefaulFullAccess().CreateAsGlobalLevelKey(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess().CreateAsGlobalLevelKey(), 30011, []func(*model.TestDataProvider){ actions.DeleteFirstUser, @@ -157,7 +139,7 @@ var _ = Describe("Configuration namespaced. Deploy deployment", Label("deploymen Entry("Free - Users can use M0, default key", Label("ns-m0"), model.DataProvider( "operator-ns-free", - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), 30016, []func(*model.TestDataProvider){ actions.DeleteFirstUser, @@ -169,7 +151,7 @@ var _ = Describe("Configuration namespaced. Deploy deployment", Label("deploymen Entry("Free - Users can use M0, global", Label("ns-global-key-m0"), model.DataProvider( "operator-ns-free", - model.NewEmptyAtlasKeyType().UseDefaulFullAccess().CreateAsGlobalLevelKey(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess().CreateAsGlobalLevelKey(), 30017, []func(*model.TestDataProvider){ actions.DeleteFirstUser, @@ -182,15 +164,14 @@ var _ = Describe("Configuration namespaced. Deploy deployment", Label("deploymen }) func mainCycle(testData *model.TestDataProvider) { - actions.PrepareUsersConfigurations(testData) - deploy.NamespacedOperator(testData) // TODO: how to deploy operator by code? - Expect(k8s.CreateNamespace(testData.Context, testData.K8SClient, testData.Resources.Namespace)).Should(Succeed()) + mgr := actions.PrepareOperatorConfigurations(testData) + ctx := context.Background() + go func(ctx context.Context) { + err := mgr.Start(ctx) + Expect(err).NotTo(HaveOccurred()) + }(ctx) By("Deploy User Resouces", func() { - k8s.CreateDefaultSecret(testData.Context, testData.K8SClient, config.DefaultOperatorGlobalKey, testData.Resources.Namespace) - if !testData.Resources.AtlasKeyAccessType.GlobalLevelKey { - actions.CreateConnectionAtlasKey(testData) - } deploy.CreateProject(testData) deploy.CreateInitialDeployments(testData) deploy.CreateUsers(testData) @@ -201,9 +182,4 @@ func mainCycle(testData *model.TestDataProvider) { check(testData) } }) - By("Delete User Resources", func() { - deploy.DeleteInitialDeployments(testData) - deploy.DeleteProject(testData) - deploy.DeleteUsers(testData) - }) } diff --git a/test/e2e/custom_roles_test.go b/test/e2e/custom_roles_test.go index 128214179a..4c92b65e31 100644 --- a/test/e2e/custom_roles_test.go +++ b/test/e2e/custom_roles_test.go @@ -30,11 +30,11 @@ var _ = Describe("UserLogin", Label("custom-roles"), func() { GinkgoWriter.Write([]byte("Operator namespace: " + testData.Resources.Namespace + "\n")) GinkgoWriter.Write([]byte("===============================================\n")) if CurrentSpecReport().Failed() { - SaveDump(testData) + Expect(actions.SaveProjectsToFile(testData.Context, testData.K8SClient, testData.Resources.Namespace)).Should(Succeed()) } By("Delete Resources", func() { actions.DeleteTestDataProject(testData) - actions.DeleteGlobalKeyIfExist(*testData) + actions.AfterEachFinalCleanup([]model.TestDataProvider{*testData}) }) }) @@ -47,7 +47,7 @@ var _ = Describe("UserLogin", Label("custom-roles"), func() { Entry("Test[custom-roles-1]: User has project to which custom roles where added", model.DataProvider( "custom-roles-1", - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), 40000, []func(*model.TestDataProvider){}, ).WithProject(data.DefaultProject()), diff --git a/test/e2e/encryption_at_rest_test.go b/test/e2e/encryption_at_rest_test.go index 45e361f494..168ee2bae3 100644 --- a/test/e2e/encryption_at_rest_test.go +++ b/test/e2e/encryption_at_rest_test.go @@ -1,7 +1,6 @@ package e2e_test import ( - "fmt" "time" "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1/status" @@ -39,22 +38,7 @@ var _ = Describe("UserLogin", Label("encryption-at-rest"), func() { GinkgoWriter.Write([]byte("Operator namespace: " + testData.Resources.Namespace + "\n")) GinkgoWriter.Write([]byte("===============================================\n")) if CurrentSpecReport().Failed() { - By("Save logs to output directory ", func() { - GinkgoWriter.Write([]byte("Test has been failed. Trying to save logs...\n")) - utils.SaveToFile( - fmt.Sprintf("output/%s/operatorDecribe.txt", testData.Resources.Namespace), - []byte(kubecli.DescribeOperatorPod(testData.Resources.Namespace)), - ) - utils.SaveToFile( - fmt.Sprintf("output/%s/operator-logs.txt", testData.Resources.Namespace), - kubecli.GetManagerLogs(testData.Resources.Namespace), - ) - actions.SaveTestAppLogs(testData.Resources) - actions.SaveK8sResources( - []string{"deploy", "atlasprojects"}, - testData.Resources.Namespace, - ) - }) + Expect(actions.SaveProjectsToFile(testData.Context, testData.K8SClient, testData.Resources.Namespace)).Should(Succeed()) } By("Clean Cloud", func() { DeleteAllRoles(testData) @@ -62,7 +46,7 @@ var _ = Describe("UserLogin", Label("encryption-at-rest"), func() { By("Delete Resources, Project with Encryption at rest", func() { actions.DeleteTestDataProject(testData) - actions.DeleteGlobalKeyIfExist(*testData) + actions.AfterEachFinalCleanup([]model.TestDataProvider{*testData}) }) }) @@ -75,7 +59,7 @@ var _ = Describe("UserLogin", Label("encryption-at-rest"), func() { Entry("Test[encryption-at-rest-aws]: Can add Encryption at Rest to AWS project", Label("encryption-at-rest-aws"), model.DataProvider( "encryption-at-rest-aws", - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), 40000, []func(*model.TestDataProvider){}, ).WithProject(data.DefaultProject()), diff --git a/test/e2e/global_deployment_test.go b/test/e2e/global_deployment_test.go index 2552b2b073..ea378acd65 100644 --- a/test/e2e/global_deployment_test.go +++ b/test/e2e/global_deployment_test.go @@ -32,12 +32,13 @@ var _ = Describe("UserLogin", Label("global-deployment"), func() { GinkgoWriter.Write([]byte("Operator namespace: " + testData.Resources.Namespace + "\n")) GinkgoWriter.Write([]byte("===============================================\n")) if CurrentSpecReport().Failed() { - SaveDump(testData) + Expect(actions.SaveProjectsToFile(testData.Context, testData.K8SClient, testData.Resources.Namespace)).Should(Succeed()) + Expect(actions.SaveDeploymentsToFile(testData.Context, testData.K8SClient, testData.Resources.Namespace)).Should(Succeed()) } - By("Delete Resources, Project with PEService", func() { + By("Delete Resources", func() { actions.DeleteTestDataDeployments(testData) actions.DeleteTestDataProject(testData) - actions.DeleteGlobalKeyIfExist(*testData) + actions.AfterEachFinalCleanup([]model.TestDataProvider{*testData}) }) }) @@ -50,7 +51,7 @@ var _ = Describe("UserLogin", Label("global-deployment"), func() { Entry("Test[gc-regular-deployment]: Deployment with global config", Label("gc-regular-deployment"), model.DataProvider( "gc-regular-deployment", - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), 40000, []func(*model.TestDataProvider){}, ).WithProject(data.DefaultProject()).WithInitialDeployments(data.CreateRegularGeoshardedDeployment("gc-regular-deployment")), @@ -71,7 +72,7 @@ var _ = Describe("UserLogin", Label("global-deployment"), func() { Entry("Test[gc-advanced-deployment]: Advanced", Label("gc-advanced-deployment"), model.DataProvider( "gc-advanced-deployment", - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), 40000, []func(*model.TestDataProvider){}, ).WithProject(data.DefaultProject()).WithInitialDeployments(data.CreateAdvancedGeoshardedDeployment("gc-advanced-deployment")), diff --git a/test/e2e/helm_chart_test.go b/test/e2e/helm_chart_test.go index dfa1e3035e..2397036446 100644 --- a/test/e2e/helm_chart_test.go +++ b/test/e2e/helm_chart_test.go @@ -55,7 +55,7 @@ var _ = Describe("HELM charts", func() { data.Resources.Namespace, ) actions.SaveTestAppLogs(data.Resources) - actions.DeleteGlobalKeyIfExist(data) + actions.AfterEachFinalCleanup([]model.TestDataProvider{data}) } }) }) @@ -95,7 +95,7 @@ var _ = Describe("HELM charts", func() { model.DataProviderWithResources( "helm-ns", model.AProject{}, - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), []string{"data/atlasdeployment_basic_helm.yaml"}, []string{}, []model.DBUser{ @@ -117,7 +117,7 @@ var _ = Describe("HELM charts", func() { model.DataProviderWithResources( "helm-advanced", model.AProject{}, - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), []string{"data/atlasdeployment_advanced_helm.yaml"}, []string{}, []model.DBUser{ @@ -135,7 +135,7 @@ var _ = Describe("HELM charts", func() { model.DataProviderWithResources( "helm-advanced-multiregion", model.AProject{}, - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), []string{"data/atlasdeployment_advanced_multi_region_helm.yaml"}, []string{}, []model.DBUser{ @@ -153,7 +153,7 @@ var _ = Describe("HELM charts", func() { model.DataProviderWithResources( "helm-serverless", model.AProject{}, - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), []string{"data/atlasdeployment_serverless.yaml"}, []string{}, []model.DBUser{ @@ -175,7 +175,7 @@ var _ = Describe("HELM charts", func() { data = model.DataProviderWithResources( "helm-wide", model.AProject{}, - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), []string{"data/atlasdeployment_basic_helm.yaml"}, []string{}, []model.DBUser{ @@ -208,7 +208,7 @@ var _ = Describe("HELM charts", func() { data = model.DataProviderWithResources( "helm-upgrade", model.AProject{}, - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), []string{"data/atlasdeployment_basic_helm.yaml"}, []string{}, []model.DBUser{ diff --git a/test/e2e/integration_test.go b/test/e2e/integration_test.go index 9a36f90f91..386b74227d 100644 --- a/test/e2e/integration_test.go +++ b/test/e2e/integration_test.go @@ -42,10 +42,10 @@ var _ = Describe("Configuration namespaced. Deploy deployment", Label("integrati GinkgoWriter.Write([]byte("Operator namespace: " + testData.Resources.Namespace + "\n")) GinkgoWriter.Write([]byte("===============================================\n")) if CurrentSpecReport().Failed() { - SaveDump(testData) + Expect(actions.SaveProjectsToFile(testData.Context, testData.K8SClient, testData.Resources.Namespace)).Should(Succeed()) } actions.DeleteTestDataProject(testData) - actions.DeleteGlobalKeyIfExist(*testData) + actions.AfterEachFinalCleanup([]model.TestDataProvider{*testData}) }) DescribeTable("Namespaced operators working only with its own namespace with different configuration", @@ -57,7 +57,7 @@ var _ = Describe("Configuration namespaced. Deploy deployment", Label("integrati Entry("Users can use integration section", Label("project-integration"), model.DataProvider( "operator-integration-cr", - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), 30018, []func(*model.TestDataProvider){}, ).WithProject(data.DefaultProject()), diff --git a/test/e2e/k8s/k8s.go b/test/e2e/k8s/k8s.go index 84a6cad1ff..9be9ba3986 100644 --- a/test/e2e/k8s/k8s.go +++ b/test/e2e/k8s/k8s.go @@ -222,7 +222,15 @@ func CreateSecret(ctx context.Context, k8sClient client.Client, publicKey, priva }, StringData: map[string]string{"orgId": os.Getenv("MCLI_ORG_ID"), "publicApiKey": publicKey, "privateApiKey": privateKey}, } - return k8sClient.Create(ctx, &connectionSecret) + err := k8sClient.Create(ctx, &connectionSecret) + if err != nil && !k8serrors.IsAlreadyExists(err) { + return fmt.Errorf("error creating secret: %w", err) + } + err = k8sClient.Update(ctx, &connectionSecret) + if err != nil { + return fmt.Errorf("error updating existing secret: %w", err) + } + return nil } func DeleteKey(ctx context.Context, k8sClient client.Client, keyName, ns string) error { @@ -298,6 +306,24 @@ func ProjectListYaml(ctx context.Context, k8sClient client.Client, ns string) ([ return yaml.Marshal(projectList) } +func UserListYaml(ctx context.Context, k8sClient client.Client, ns string) ([]byte, error) { + userList := &v1.AtlasDatabaseUserList{} + err := k8sClient.List(ctx, userList, client.InNamespace(ns)) + if err != nil { + return nil, err + } + return yaml.Marshal(userList) +} + +func TeamListYaml(ctx context.Context, k8sClient client.Client, ns string) ([]byte, error) { + teamList := &v1.AtlasTeamList{} + err := k8sClient.List(ctx, teamList, client.InNamespace(ns)) + if err != nil { + return nil, err + } + return yaml.Marshal(teamList) +} + func DeploymentListYml(ctx context.Context, k8sClient client.Client, ns string) ([]byte, error) { deploymentList := &v1.AtlasDeploymentList{} err := k8sClient.List(ctx, deploymentList, client.InNamespace(ns)) diff --git a/test/e2e/k8s/operator.go b/test/e2e/k8s/operator.go new file mode 100644 index 0000000000..f27336a90a --- /dev/null +++ b/test/e2e/k8s/operator.go @@ -0,0 +1,233 @@ +package k8s + +import ( + "errors" + "fmt" + "os" + "path" + "strings" + "time" + + "github.com/go-logr/zapr" + "go.uber.org/zap" + "go.uber.org/zap/zapcore" + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/runtime" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" + clientgoscheme "k8s.io/client-go/kubernetes/scheme" + _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/cache" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/healthz" + ctrzap "sigs.k8s.io/controller-runtime/pkg/log/zap" + "sigs.k8s.io/controller-runtime/pkg/manager" + "sigs.k8s.io/controller-runtime/pkg/predicate" + + mdbv1 "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1" + "github.com/mongodb/mongodb-atlas-kubernetes/pkg/controller/atlasdatabaseuser" + "github.com/mongodb/mongodb-atlas-kubernetes/pkg/controller/atlasdeployment" + "github.com/mongodb/mongodb-atlas-kubernetes/pkg/controller/atlasproject" + "github.com/mongodb/mongodb-atlas-kubernetes/pkg/controller/connectionsecret" + "github.com/mongodb/mongodb-atlas-kubernetes/pkg/controller/watch" +) + +func RunOperator(initCfg *Config) (manager.Manager, error) { + scheme := runtime.NewScheme() + setupLog := ctrl.Log.WithName("setup") + + utilruntime.Must(clientgoscheme.AddToScheme(scheme)) + utilruntime.Must(mdbv1.AddToScheme(scheme)) + + ctrzap.NewRaw(ctrzap.UseDevMode(true), ctrzap.StacktraceLevel(zap.ErrorLevel)) + config := mergeConfiguration(initCfg) + err := os.MkdirAll(config.LogDir, os.ModePerm) + if err != nil { + return nil, fmt.Errorf("failed to create log directory: %w", err) + } + logger, err := initCustomZapLogger(config.LogLevel, config.LogEncoder, path.Join(config.LogDir, "operator.log")) + if err != nil { + return nil, fmt.Errorf("failed to initialize custom zap logger: %w", err) + } + + logger.Info("starting with configuration", zap.Any("config", config)) + + ctrl.SetLogger(zapr.NewLogger(logger)) + + syncPeriod := time.Hour * 3 + + var cacheFunc cache.NewCacheFunc + if len(config.WatchedNamespaces) > 1 { + var namespaces []string + for ns := range config.WatchedNamespaces { + namespaces = append(namespaces, ns) + } + cacheFunc = cache.MultiNamespacedCacheBuilder(namespaces) + } else { + cacheFunc = cache.BuilderWithOptions(cache.Options{ + SelectorsByObject: cache.SelectorsByObject{ + &corev1.Secret{}: { + Label: labels.SelectorFromSet(labels.Set{ + connectionsecret.TypeLabelKey: connectionsecret.CredLabelVal, + }), + }, + }, + }) + } + + mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ + Scheme: scheme, + MetricsBindAddress: config.MetricsAddr, + Port: 9443, + Namespace: config.Namespace, + HealthProbeBindAddress: config.ProbeAddr, + LeaderElection: config.EnableLeaderElection, + LeaderElectionID: "06d035fb.mongodb.com", + SyncPeriod: &syncPeriod, + NewCache: cacheFunc, + }) + if err != nil { + setupLog.Error(err, "unable to start manager") + return nil, err + } + + // globalPredicates should be used for general controller Predicates + // that should be applied to all controllers in order to limit the + // resources they receive events for. + globalPredicates := []predicate.Predicate{ + watch.CommonPredicates(), // ignore spurious changes. status changes etc. + watch.SelectNamespacesPredicate(config.WatchedNamespaces), // select only desired namespaces + } + + if err = (&atlasdeployment.AtlasDeploymentReconciler{ + Client: mgr.GetClient(), + Log: logger.Named("controllers").Named("AtlasDeployment").Sugar(), + Scheme: mgr.GetScheme(), + AtlasDomain: config.AtlasDomain, + GlobalAPISecret: config.GlobalAPISecret, + ResourceWatcher: watch.NewResourceWatcher(), + GlobalPredicates: globalPredicates, + EventRecorder: mgr.GetEventRecorderFor("AtlasDeployment"), + }).SetupWithManager(mgr); err != nil { + setupLog.Error(err, "unable to create controller", "controller", "AtlasDeployment") + return nil, err + } + + if err = (&atlasproject.AtlasProjectReconciler{ + Client: mgr.GetClient(), + Log: logger.Named("controllers").Named("AtlasProject").Sugar(), + Scheme: mgr.GetScheme(), + AtlasDomain: config.AtlasDomain, + ResourceWatcher: watch.NewResourceWatcher(), + GlobalAPISecret: config.GlobalAPISecret, + GlobalPredicates: globalPredicates, + EventRecorder: mgr.GetEventRecorderFor("AtlasProject"), + }).SetupWithManager(mgr); err != nil { + setupLog.Error(err, "unable to create controller", "controller", "AtlasProject") + return nil, err + } + + if err = (&atlasdatabaseuser.AtlasDatabaseUserReconciler{ + Client: mgr.GetClient(), + Log: logger.Named("controllers").Named("AtlasDatabaseUser").Sugar(), + Scheme: mgr.GetScheme(), + AtlasDomain: config.AtlasDomain, + ResourceWatcher: watch.NewResourceWatcher(), + GlobalAPISecret: config.GlobalAPISecret, + GlobalPredicates: globalPredicates, + EventRecorder: mgr.GetEventRecorderFor("AtlasDatabaseUser"), + }).SetupWithManager(mgr); err != nil { + setupLog.Error(err, "unable to create controller", "controller", "AtlasDatabaseUser") + return nil, err + } + + if err = mgr.AddHealthzCheck("health", healthz.Ping); err != nil { + setupLog.Error(err, "unable to set up health check") + return nil, err + } + if err = mgr.AddReadyzCheck("check", healthz.Ping); err != nil { + setupLog.Error(err, "unable to set up ready check") + return nil, err + } + return mgr, nil +} + +type Config struct { + AtlasDomain string + EnableLeaderElection bool + MetricsAddr string + Namespace string + WatchedNamespaces map[string]bool + ProbeAddr string + GlobalAPISecret client.ObjectKey + LogLevel string + LogEncoder string + LogDir string +} + +// ParseConfiguration fills the 'OperatorConfig' from the flags passed to the program +func mergeConfiguration(initCfg *Config) *Config { + config := initCfg + if config.AtlasDomain == "" { + config.AtlasDomain = "https://cloud-qa.mongodb.com/" + } + if config.MetricsAddr == "" { + // random port + config.MetricsAddr = ":0" + } + if config.ProbeAddr == "" { + // random port + config.ProbeAddr = ":0" + } + if config.LogLevel == "" { + config.LogLevel = "debug" + } + if config.LogEncoder == "" { + config.LogEncoder = "json" + } + + watchedNamespace := "" + if config.WatchedNamespaces == nil { + config.WatchedNamespaces = make(map[string]bool) + for _, namespace := range strings.Split(watchedNamespace, ",") { + namespace = strings.TrimSpace(namespace) + config.WatchedNamespaces[namespace] = true + } + } + + if len(config.WatchedNamespaces) == 1 && config.Namespace == "" { + config.Namespace = watchedNamespace + } + + return config +} + +func initCustomZapLogger(level, encoding, logFileName string) (*zap.Logger, error) { + lv := zap.AtomicLevel{} + err := lv.UnmarshalText([]byte(strings.ToLower(level))) + if err != nil { + return nil, err + } + + enc := strings.ToLower(encoding) + if enc != "json" && enc != "console" { + return nil, errors.New("'encoding' parameter can only by either 'json' or 'console'") + } + + cfg := zap.Config{ + Level: lv, + OutputPaths: []string{logFileName}, + DisableCaller: false, + DisableStacktrace: false, + Encoding: enc, + EncoderConfig: zapcore.EncoderConfig{ + MessageKey: "msg", + LevelKey: "level", + EncodeLevel: zapcore.CapitalLevelEncoder, + TimeKey: "time", + EncodeTime: zapcore.ISO8601TimeEncoder, + }, + } + return cfg.Build() +} diff --git a/test/e2e/model/atlas_key_type.go b/test/e2e/model/atlas_key_type.go index 5dc2f18a18..67ad000dfe 100644 --- a/test/e2e/model/atlas_key_type.go +++ b/test/e2e/model/atlas_key_type.go @@ -44,7 +44,7 @@ func (a *AtlasKeyType) GetRole() []AtlasRoles { return a.Roles } -func (a *AtlasKeyType) UseDefaulFullAccess() *AtlasKeyType { +func (a *AtlasKeyType) UseDefaultFullAccess() *AtlasKeyType { a.DefaultFullAccessKey = true return a } diff --git a/test/e2e/model/dataprovider.go b/test/e2e/model/dataprovider.go index c02506a6e6..8f90848028 100644 --- a/test/e2e/model/dataprovider.go +++ b/test/e2e/model/dataprovider.go @@ -27,6 +27,7 @@ type TestDataProvider struct { Prefix string Users []*v1.AtlasDatabaseUser Teams []*v1.AtlasTeam + ManagerContext context.Context } func DataProviderWithResources(keyTestPrefix string, project AProject, r *AtlasKeyType, initDeploymentConfigs []string, updateDeploymentConfig []string, users []DBUser, portGroup int, actions []func(*TestDataProvider)) TestDataProvider { diff --git a/test/e2e/multinamespace_test.go b/test/e2e/multinamespace_test.go index a9aa497f73..f32b4c5098 100644 --- a/test/e2e/multinamespace_test.go +++ b/test/e2e/multinamespace_test.go @@ -1,24 +1,26 @@ package e2e_test import ( + "fmt" + . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - - "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/k8s" - . "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" - kube "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions/kube" 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" "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/model" - "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/utils" ) var _ = Describe("Users can use clusterwide configuration with limitation to watch only particular namespaces", Label("multinamespaced"), func() { - var listData []model.TestDataProvider + var listData []*model.TestDataProvider var watchedNamespace []string _ = BeforeEach(func() { @@ -27,144 +29,115 @@ var _ = Describe("Users can use clusterwide configuration with limitation to wat _ = 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(config.DefaultOperatorNS), - ) - actions.SaveK8sResources( - []string{"deploy"}, - config.DefaultOperatorNS, - ) - for _, data := range listData { - actions.SaveK8sResources( - []string{"atlasprojects"}, - data.Resources.Namespace, - ) + for i := range listData { + testData := listData[i] + actions.DeleteTestDataProject(testData) + actions.AfterEachFinalCleanup([]model.TestDataProvider{*testData}) + if testData.ManagerContext != nil { + testData.ManagerContext.Done() } - actions.AfterEachFinalCleanup(listData) } }) + }) // (Consider Shared Deployments when E2E tests could conflict with each other) It("Deploy deployment multi-namespaced operator and create resources in each of them", func() { By("Set up test data configuration", func() { - watched1 := model.DataProviderWithResources( - "multinamestace-watched1", - model.AProject{}, - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), - []string{"data/atlasdeployment_basic.yaml"}, - []string{}, - []model.DBUser{}, - 30013, + watched := model.DataProvider( + "multinamespace-watched", + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), + 40000, []func(*model.TestDataProvider){}, - ) - watchedGlobal := model.DataProviderWithResources( - "multinamestace-watched-global", - model.AProject{}, - model.NewEmptyAtlasKeyType().UseDefaulFullAccess().CreateAsGlobalLevelKey(), - []string{"data/atlasdeployment_basic.yaml"}, - []string{}, - []model.DBUser{}, - 30013, + ).WithProject(data.DefaultProject()) + watchedGlobal := model.DataProvider( + "multinamespace-watched-global", + model.NewEmptyAtlasKeyType().UseDefaultFullAccess().CreateAsGlobalLevelKey(), + 40000, []func(*model.TestDataProvider){}, - ) - notWatched := model.DataProviderWithResources( - "multinamestace-notwatched", - model.AProject{}, - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), - []string{"data/atlasdeployment_basic.yaml"}, - []string{}, - []model.DBUser{}, - 30013, + ).WithProject(data.DefaultProject()) + notWatched := model.DataProvider( + "multinamespace-not-watched", + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), + 40000, []func(*model.TestDataProvider){}, - ) - notWatchedGlobal := model.DataProviderWithResources( - "multinamestace-notwatched", - model.AProject{}, - model.NewEmptyAtlasKeyType().UseDefaulFullAccess().CreateAsGlobalLevelKey(), - []string{"data/atlasdeployment_basic.yaml"}, - []string{}, - []model.DBUser{}, - 30013, + ).WithProject(data.DefaultProject()) + notWatchedGlobal := model.DataProvider( + "multinamespace-not-watched-global", + model.NewEmptyAtlasKeyType().UseDefaultFullAccess().CreateAsGlobalLevelKey(), + 40000, []func(*model.TestDataProvider){}, - ) - listData = []model.TestDataProvider{watched1, watchedGlobal, notWatched, notWatchedGlobal} - watchedNamespace = []string{watched1.Resources.Namespace, watchedGlobal.Resources.Namespace} + ).WithProject(data.DefaultProject()) + listData = []*model.TestDataProvider{watched, watchedGlobal, notWatched, notWatchedGlobal} + watchedNamespace = []string{watched.Resources.Namespace, watchedGlobal.Resources.Namespace} }) firstData := listData[0] - By("User Install CRD, deployment multinamespace Operator", func() { + By("Run operator and deploy resources", func() { + Expect(k8s.CreateNamespace(firstData.Context, firstData.K8SClient, config.DefaultOperatorNS)).Should(Succeed()) + watchedNamespace = append(watchedNamespace, config.DefaultOperatorNS) + k8s.CreateDefaultSecret(firstData.Context, firstData.K8SClient, config.DefaultOperatorGlobalKey, config.DefaultOperatorNS) for i := range listData { - actions.PrepareUsersConfigurations(&listData[i]) + deployMultiNSResources(listData[i]) } - watchedNamespace = append(watchedNamespace, "mongodb-atlas-system") - deploy.MultiNamespaceOperator(&firstData, watchedNamespace) - k8s.CreateDefaultSecret(firstData.Context, firstData.K8SClient, config.DefaultOperatorGlobalKey, config.DefaultOperatorNS) + deploy.MultiNamespaceOperator(firstData, watchedNamespace) }) By("Check if operator working as expected: watched/not watched namespaces", func() { - crdsFile := firstData.Resources.GetOperatorFolder() + "/crds.yaml" for i := range listData { - testFlow(&listData[i], crdsFile, watchedNamespace) + multiNSFlow(listData[i], watchedNamespace) } }) }) }) -func testFlow(data *model.TestDataProvider, crdsFile string, watchedNamespece []string) { - isWatchedNamespace := func(target string, list []string) bool { - for _, item := range list { - if item == target { - return true - } +func deployMultiNSResources(testData *model.TestDataProvider) { + By("User create namespace", func() { + Expect(k8s.CreateNamespace(testData.Context, testData.K8SClient, testData.Resources.Namespace)).Should(Succeed()) + }) + By("Deploy resources", func() { + if testData.Project.GetNamespace() == "" { + testData.Project.Namespace = testData.Resources.Namespace } - return false - } - if isWatchedNamespace(data.Resources.Namespace, watchedNamespece) { - watchedFlow(data, crdsFile) + if !testData.Resources.AtlasKeyAccessType.GlobalLevelKey { + testData.Project.Spec.ConnectionSecret = &common.ResourceRef{Name: testData.Prefix} + } + By(fmt.Sprintf("Deploy Project %s", testData.Project.GetName()), func() { + err := testData.K8SClient.Create(testData.Context, testData.Project) + Expect(err).ShouldNot(HaveOccurred(), "Project %s was not created", testData.Project.GetName()) + }) + }) +} + +func multiNSFlow(data *model.TestDataProvider, watchedNamespaces []string) { + isWatchedNamespace := stringutil.Contains(watchedNamespaces, data.Resources.Namespace) + if isWatchedNamespace { + watchedFlow(data) } else { - notWatchedFlow(data, crdsFile) + notWatchedFlow(data) } } -func watchedFlow(data *model.TestDataProvider, crdsFile string) { - By("Deploy users resorces", func() { - if !data.Resources.AtlasKeyAccessType.GlobalLevelKey { - actions.CreateConnectionAtlasKey(data) - } - kubecli.Apply(crdsFile, "-n", data.Resources.Namespace) - kubecli.Apply(data.Resources.ProjectPath, "-n", data.Resources.Namespace) - }) - By("Check if projects were deployed", func() { - Eventually( - func() string { - return kube.ProjectReadyCondition(data) - }, - ).Should(Equal("True"), "kubernetes resource: Project status `Ready` should be True. Watched namespace") +func watchedFlow(data *model.TestDataProvider) { + By("Deploy secret", func() { + actions.CreateConnectionAtlasKey(data) }) - By("Get IDs for deletion", func() { - resource, err := kube.GetProjectResource(data) - Expect(err).Should(BeNil()) - data.Resources.ProjectID = resource.Status.ID - Expect(data.Resources.ProjectID).ShouldNot(BeEmpty()) - }) - By("Delete Resources", func() { - actions.DeleteUserResourcesProject(data) + By(fmt.Sprintf("Check if projects were deployed. Project name: %s, namespace: %s", + data.Project.GetName(), data.Project.GetNamespace()), func() { + Eventually(func(g Gomega) { + condition, _ := k8s.GetProjectStatusCondition(data.Context, data.K8SClient, status.ReadyType, data.Resources.Namespace, data.Project.GetName()) + g.Expect(condition).Should(Equal("True")) + }).Should(Succeed(), "kubernetes resource: Project status `Ready` should be True. Watched namespace") }) } -func notWatchedFlow(data *model.TestDataProvider, crdsFile string) { - By("Deploy users resorces", func() { - if !data.Resources.AtlasKeyAccessType.GlobalLevelKey { - actions.CreateConnectionAtlasKey(data) - } - kubecli.Apply(crdsFile, "-n", data.Resources.Namespace) - kubecli.Apply(data.Resources.ProjectPath, "-n", data.Resources.Namespace) +func notWatchedFlow(data *model.TestDataProvider) { + By("Deploy secret", func() { + actions.CreateConnectionAtlasKey(data) }) - By("Check if projects were deployed", func() { - Eventually( - kube.ProjectReadyCondition(data), - ).Should(BeEmpty(), "Kubernetes resource: Project status `Ready` should be False. NOT Watched namespace") + By(fmt.Sprintf("Check if projects were deployed. Project name: %s, namespace: %s", + data.Project.GetName(), data.Project.GetNamespace()), func() { + Eventually(func(g Gomega) { + condition, _ := k8s.GetProjectStatusCondition(data.Context, data.K8SClient, status.ReadyType, data.Resources.Namespace, data.Project.GetName()) + g.Expect(condition).Should(Equal("")) + }).Should(Succeed(), "Kubernetes resource: Project status `Ready` should be empty. NOT Watched namespace") }) } diff --git a/test/e2e/network_peering_test.go b/test/e2e/network_peering_test.go index dcf64c157d..71ae93d0ec 100644 --- a/test/e2e/network_peering_test.go +++ b/test/e2e/network_peering_test.go @@ -27,7 +27,6 @@ import ( 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/model" - "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/utils" ) const ( @@ -61,30 +60,14 @@ var _ = Describe("NetworkPeering", Label("networkpeering"), func() { GinkgoWriter.Write([]byte("Operator namespace: " + testData.Resources.Namespace + "\n")) GinkgoWriter.Write([]byte("===============================================\n")) if CurrentSpecReport().Failed() { - By("Save logs to output directory ", func() { - GinkgoWriter.Write([]byte("Test has been failed. Trying to save logs...\n")) - utils.SaveToFile( - fmt.Sprintf("output/%s/operatorDecribe.txt", testData.Resources.Namespace), - []byte(kubecli.DescribeOperatorPod(testData.Resources.Namespace)), - ) - utils.SaveToFile( - fmt.Sprintf("output/%s/operator-logs.txt", testData.Resources.Namespace), - kubecli.GetManagerLogs(testData.Resources.Namespace), - ) - actions.SaveTestAppLogs(testData.Resources) - actions.SaveProjectsToFile(testData.Context, testData.K8SClient, testData.Resources.Namespace) - actions.SaveK8sResources( - []string{"deploy"}, - testData.Resources.Namespace, - ) - }) + Expect(actions.SaveProjectsToFile(testData.Context, testData.K8SClient, testData.Resources.Namespace)).Should(Succeed()) } By("Clean Cloud", func() { DeleteAllNetworkPeering(testData) }) By("Delete Resources, Project with NetworkPeering", func() { actions.DeleteTestDataProject(testData) - actions.DeleteGlobalKeyIfExist(*testData) + actions.AfterEachFinalCleanup([]model.TestDataProvider{*testData}) }) }) @@ -98,7 +81,7 @@ var _ = Describe("NetworkPeering", Label("networkpeering"), func() { Label("network-peering-aws-1"), model.DataProvider( "networkpeering-aws-1", - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), 40000, []func(*model.TestDataProvider){}, ).WithProject(data.DefaultProject()), @@ -116,7 +99,7 @@ var _ = Describe("NetworkPeering", Label("networkpeering"), func() { Label("network-peering-aws-2"), model.DataProvider( "networkpeering-aws-2", - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), 40000, []func(*model.TestDataProvider){}, ).WithProject(data.DefaultProject()), @@ -134,7 +117,7 @@ var _ = Describe("NetworkPeering", Label("networkpeering"), func() { Label("network-peering-aws-3"), model.DataProvider( "networkpeering-aws-3", - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), 40000, []func(*model.TestDataProvider){}, ).WithProject(data.DefaultProject()), @@ -158,7 +141,7 @@ var _ = Describe("NetworkPeering", Label("networkpeering"), func() { Label("network-peering-gcp-1"), model.DataProvider( "networkpeering-gcp-1", - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), 40000, []func(*model.TestDataProvider){}, ).WithProject(data.DefaultProject()), @@ -177,7 +160,7 @@ var _ = Describe("NetworkPeering", Label("networkpeering"), func() { Label("network-peering-azure-1"), model.DataProvider( "networkpeering-azure-1", - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), 40000, []func(*model.TestDataProvider){}, ).WithProject(data.DefaultProject()), diff --git a/test/e2e/operator_type_wide_test.go b/test/e2e/operator_type_wide_test.go index b320a12b42..1474bc627f 100644 --- a/test/e2e/operator_type_wide_test.go +++ b/test/e2e/operator_type_wide_test.go @@ -82,7 +82,7 @@ var _ = Describe("Users (Norton and Nimnul) can work with one Deployment wide op NortonData = model.DataProviderWithResources( "norton-wide", model.AProject{}, - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), []string{"data/atlasdeployment_backup.yaml"}, []string{}, []model.DBUser{ @@ -97,7 +97,7 @@ var _ = Describe("Users (Norton and Nimnul) can work with one Deployment wide op NimnulData = model.DataProviderWithResources( "nimnul-wide", model.AProject{}, - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), []string{"data/atlasdeployment_basic.yaml"}, []string{}, []model.DBUser{ diff --git a/test/e2e/private_link_test.go b/test/e2e/private_link_test.go index 9c80b98455..3ba5bf1d93 100644 --- a/test/e2e/private_link_test.go +++ b/test/e2e/private_link_test.go @@ -1,8 +1,6 @@ package e2e_test import ( - "fmt" - . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" . "github.com/onsi/gomega/gbytes" @@ -12,12 +10,11 @@ import ( "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/test/e2e/actions" - cloud "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/actions/cloud" + "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" - "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/utils" ) // NOTES @@ -33,27 +30,6 @@ type privateEndpoint struct { region string } -func SaveDump(data *model.TestDataProvider) { - By("Save logs to output directory ", func() { - GinkgoWriter.Write([]byte("Test has been failed. Trying to save logs...\n")) - utils.SaveToFile( - fmt.Sprintf("output/%s/operatorDecribe.txt", data.Resources.Namespace), - []byte(kubecli.DescribeOperatorPod(data.Resources.Namespace)), - ) - utils.SaveToFile( - fmt.Sprintf("output/%s/operator-logs.txt", data.Resources.Namespace), - kubecli.GetManagerLogs(data.Resources.Namespace), - ) - actions.SaveTestAppLogs(data.Resources) - actions.SaveProjectsToFile(data.Context, data.K8SClient, data.Resources.Namespace) - actions.SaveDeploymentToFile(data.Context, data.K8SClient, data.Resources.Namespace) - actions.SaveK8sResources( - []string{"deploy"}, - data.Resources.Namespace, - ) - }) -} - var _ = Describe("UserLogin", Label("privatelink"), func() { var testData *model.TestDataProvider @@ -70,14 +46,14 @@ var _ = Describe("UserLogin", Label("privatelink"), func() { GinkgoWriter.Write([]byte("Operator namespace: " + testData.Resources.Namespace + "\n")) GinkgoWriter.Write([]byte("===============================================\n")) if CurrentSpecReport().Failed() { - SaveDump(testData) + Expect(actions.SaveProjectsToFile(testData.Context, testData.K8SClient, testData.Resources.Namespace)).Should(Succeed()) } By("Clean Cloud", func() { DeleteAllPrivateEndpoints(testData) }) By("Delete Resources, Project with PEService", func() { actions.DeleteTestDataProject(testData) - actions.DeleteGlobalKeyIfExist(*testData) + actions.AfterEachFinalCleanup([]model.TestDataProvider{*testData}) }) }) @@ -90,7 +66,7 @@ var _ = Describe("UserLogin", Label("privatelink"), func() { Entry("Test[privatelink-aws-1]: User has project which was updated with AWS PrivateEndpoint", Label("privatelink-aws-1"), model.DataProvider( "privatelink-aws-1", - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), 40000, []func(*model.TestDataProvider){}, ).WithProject(data.DefaultProject()), @@ -104,7 +80,7 @@ var _ = Describe("UserLogin", Label("privatelink"), func() { Entry("Test[privatelink-azure-1]: User has project which was updated with Azure PrivateEndpoint", Label("privatelink-azure-1"), model.DataProvider( "privatelink-azure-1", - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), 40000, []func(*model.TestDataProvider){}, ).WithProject(data.DefaultProject()), @@ -116,7 +92,7 @@ var _ = Describe("UserLogin", Label("privatelink"), func() { Entry("Test[privatelink-aws-2]: User has project which was updated with 2 AWS PrivateEndpoint", Label("privatelink-aws-2"), model.DataProvider( "privatelink-aws-2", - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), 40000, []func(*model.TestDataProvider){}, ).WithProject(data.DefaultProject()), @@ -134,7 +110,7 @@ var _ = Describe("UserLogin", Label("privatelink"), func() { Entry("Test[privatelink-aws-azure-2]: User has project which was updated with 2 AWS and 1 Azure PrivateEndpoint", Label("privatelink-aws-azure-2"), model.DataProvider( "privatelink-aws-azure", - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), 40000, []func(*model.TestDataProvider){}, ).WithProject(data.DefaultProject()), @@ -156,7 +132,7 @@ var _ = Describe("UserLogin", Label("privatelink"), func() { Entry("Test[privatelink-gpc-1]: User has project which was updated with 1 GCP PrivateEndpoint", Label("privatelink-gpc-1"), model.DataProvider( "privatelink-gpc-1", - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), 40000, []func(*model.TestDataProvider){}, ).WithProject(data.DefaultProject()), diff --git a/test/e2e/project_settings_test.go b/test/e2e/project_settings_test.go index fa065facfe..4acf68db6b 100644 --- a/test/e2e/project_settings_test.go +++ b/test/e2e/project_settings_test.go @@ -28,11 +28,11 @@ var _ = Describe("UserLogin", Label("project-settings"), func() { GinkgoWriter.Write([]byte("Operator namespace: " + testData.Resources.Namespace + "\n")) GinkgoWriter.Write([]byte("===============================================\n")) if CurrentSpecReport().Failed() { - SaveDump(testData) + Expect(actions.SaveProjectsToFile(testData.Context, testData.K8SClient, testData.Resources.Namespace)).Should(Succeed()) } By("Delete Resources", func() { actions.DeleteTestDataProject(testData) - actions.DeleteGlobalKeyIfExist(*testData) + actions.AfterEachFinalCleanup([]model.TestDataProvider{*testData}) }) }) @@ -45,7 +45,7 @@ var _ = Describe("UserLogin", Label("project-settings"), func() { Entry("Test[project-settings]: User has project to which Project Settings was added", Label("project-settings"), model.DataProvider( "project-settings", - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), 40000, []func(*model.TestDataProvider){}, ).WithProject(data.DefaultProject()), diff --git a/test/e2e/serverless_pe_test.go b/test/e2e/serverless_pe_test.go index d5e98448ac..2f04129fb1 100644 --- a/test/e2e/serverless_pe_test.go +++ b/test/e2e/serverless_pe_test.go @@ -37,15 +37,16 @@ var _ = Describe("UserLogin", Label("serverless-pe"), func() { GinkgoWriter.Write([]byte("Operator namespace: " + testData.Resources.Namespace + "\n")) GinkgoWriter.Write([]byte("===============================================\n")) if CurrentSpecReport().Failed() { - SaveDump(testData) + Expect(actions.SaveProjectsToFile(testData.Context, testData.K8SClient, testData.Resources.Namespace)).Should(Succeed()) + Expect(actions.SaveDeploymentsToFile(testData.Context, testData.K8SClient, testData.Resources.Namespace)).Should(Succeed()) } By("Clean Cloud", func() { DeleteSPE(testData) }) - By("Delete Resources, Project with PEService", func() { + By("Delete Resources", func() { actions.DeleteTestDataDeployments(testData) actions.DeleteTestDataProject(testData) - actions.DeleteGlobalKeyIfExist(*testData) + actions.AfterEachFinalCleanup([]model.TestDataProvider{*testData}) }) }) @@ -58,7 +59,7 @@ var _ = Describe("UserLogin", Label("serverless-pe"), func() { Entry("Test[spe-aws-1]: Serverless deployment with one AWS PE", Label("spe-aws-1"), model.DataProvider( "spe-aws-1", - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), 40000, []func(*model.TestDataProvider){}, ).WithProject(data.DefaultProject()).WithInitialDeployments(data.CreateServerlessDeployment("spetest1", "AWS", "US_EAST_1")), @@ -71,7 +72,7 @@ var _ = Describe("UserLogin", Label("serverless-pe"), func() { Entry("Test[spe-azure-1]: Serverless deployment with one Azure PE", Label("spe-azure-1"), model.DataProvider( "spe-azure-1", - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), 40000, []func(*model.TestDataProvider){}, ).WithProject(data.DefaultProject()).WithInitialDeployments(data.CreateServerlessDeployment("spetest3", "AZURE", "US_EAST_2")), @@ -84,7 +85,7 @@ var _ = Describe("UserLogin", Label("serverless-pe"), func() { Entry("Test[spe-azure-2]: Serverless deployment with one valid and one non-valid Azure PEs", Label("spe-azure-2"), model.DataProvider( "spe-azure-2", - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), 40000, []func(*model.TestDataProvider){}, ).WithProject(data.DefaultProject()).WithInitialDeployments(data.CreateServerlessDeployment("spetest3", "AZURE", "US_EAST_2")), diff --git a/test/e2e/teams_test.go b/test/e2e/teams_test.go index 20f04d5689..2fe623bdf4 100644 --- a/test/e2e/teams_test.go +++ b/test/e2e/teams_test.go @@ -33,11 +33,13 @@ var _ = Describe("Teams", Label("teams"), func() { GinkgoWriter.Write([]byte("Operator namespace: " + testData.Resources.Namespace + "\n")) GinkgoWriter.Write([]byte("===============================================\n")) if CurrentSpecReport().Failed() { - SaveDump(testData) + Expect(actions.SaveProjectsToFile(testData.Context, testData.K8SClient, testData.Resources.Namespace)).Should(Succeed()) + Expect(actions.SaveTeamsToFile(testData.Context, testData.K8SClient, testData.Resources.Namespace)).Should(Succeed()) } By("Delete Resources", func() { + actions.DeleteTestDataTeams(testData) actions.DeleteTestDataProject(testData) - actions.DeleteGlobalKeyIfExist(*testData) + actions.AfterEachFinalCleanup([]model.TestDataProvider{*testData}) }) }) @@ -51,7 +53,7 @@ var _ = Describe("Teams", Label("teams"), func() { Entry("Test[teams-1]: User has project to which a team was added", model.DataProvider( "teams-1", - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), 40000, []func(*model.TestDataProvider){}, ).WithProject(data.DefaultProject()), diff --git a/test/e2e/x509_test.go b/test/e2e/x509_test.go index f39076420e..e9e0693acf 100644 --- a/test/e2e/x509_test.go +++ b/test/e2e/x509_test.go @@ -32,11 +32,10 @@ var _ = Describe("UserLogin", Label("x509auth"), func() { GinkgoWriter.Write([]byte("Operator namespace: " + testData.Resources.Namespace + "\n")) GinkgoWriter.Write([]byte("===============================================\n")) if CurrentSpecReport().Failed() { - SaveDump(testData) + Expect(actions.SaveProjectsToFile(testData.Context, testData.K8SClient, testData.Resources.Namespace)).Should(Succeed()) } - By("Delete Resources", func() { - actions.DeleteTestDataProject(testData) - }) + actions.DeleteTestDataProject(testData) + actions.AfterEachFinalCleanup([]model.TestDataProvider{*testData}) }) DescribeTable("Namespaced operators working only with its own namespace with different configuration", func(test *model.TestDataProvider, certRef common.ResourceRefNamespaced) { @@ -47,7 +46,7 @@ var _ = Describe("UserLogin", Label("x509auth"), func() { Entry("Test[x509auth]: Can create project and add X.509 Auth to that project", Label("x509auth-basic"), model.DataProvider( "x509auth", - model.NewEmptyAtlasKeyType().UseDefaulFullAccess(), + model.NewEmptyAtlasKeyType().UseDefaultFullAccess(), 30000, []func(*model.TestDataProvider){}, ).WithProject(data.DefaultProject()),