diff --git a/Gopkg.lock b/Gopkg.lock index d5a321da..62055488 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -9,6 +9,29 @@ revision = "c9474f2f8deb81759839474b6bd1726bbfe1c1c4" version = "v0.36.0" +[[projects]] + digest = "1:7adf747afc4e08f91b8a3314cdcb43b25fb37ee1764d6b584b85bb51f14e48fd" + name = "github.com/Azure/go-autorest" + packages = [ + "autorest", + "autorest/adal", + "autorest/azure", + "autorest/date", + "logger", + "tracing", + ] + pruneopts = "NT" + revision = "69b4126ece6b5257e2f9b0017007d2334153655f" + version = "v13.0.1" + +[[projects]] + digest = "1:75d2b55b13298745ec068057251d05d65bbae0a668201fe45ad6986551a55601" + name = "github.com/BurntSushi/toml" + packages = ["."] + pruneopts = "NT" + revision = "3012a1dbe2e4bd1391d42b32f0577cb7bbc7f005" + version = "v0.3.1" + [[projects]] digest = "1:0a111edd8693fd977f42a0c4f199a0efb13c20aec9da99ad8830c7bb6a87e8d6" name = "github.com/PuerkitoBio/purell" @@ -70,6 +93,14 @@ revision = "8991bc29aa16c548c550c7ff78260e27b9ab7c73" version = "v1.1.1" +[[projects]] + digest = "1:3a5601f7ac7fc10fc2a98039b18d83a767f3830141a08c19ae45c45244f43e57" + name = "github.com/dgrijalva/jwt-go" + packages = ["."] + pruneopts = "NT" + revision = "06ea1031745cb8b3dab3f6a236daf2b0aa468b7e" + version = "v3.2.0" + [[projects]] digest = "1:2453249730493850718f891fb40b8f1bc932a0265384fc85b269dc04a01d4673" name = "github.com/emicklei/go-restful" @@ -230,6 +261,22 @@ revision = "7c663266750e7d82587642f65e60bc4083f1f84e" version = "v0.2.0" +[[projects]] + digest = "1:ef4ece953b3f7d098796d0b933f108455a98de6e96428b296c72c473b64fc4b1" + name = "github.com/gophercloud/gophercloud" + packages = [ + ".", + "openstack", + "openstack/identity/v2/tenants", + "openstack/identity/v2/tokens", + "openstack/identity/v3/tokens", + "openstack/utils", + "pagination", + ] + pruneopts = "NT" + revision = "a84f8b330d669c6dff53ee9743a7579ac9541b69" + version = "v0.4.0" + [[projects]] branch = "master" digest = "1:bb7bd892abcb75ef819ce2efab9d54d22b7e38dc05ffac55428bb0578b52912b" @@ -260,6 +307,14 @@ revision = "7c29201646fa3de8506f701213473dd407f19646" version = "v0.3.7" +[[projects]] + digest = "1:406338ad39ab2e37b7f4452906442a3dbf0eb3379dd1f06aafb5c07e769a5fbb" + name = "github.com/inconshreveable/mousetrap" + packages = ["."] + pruneopts = "NT" + revision = "76626ae9c91c4f2a10f34cad8ce83ea42c93bb75" + version = "v1.0" + [[projects]] digest = "1:f5b9328966ccea0970b1d15075698eff0ddb3e75889560aad2e9f76b289b536a" name = "github.com/joho/godotenv" @@ -276,6 +331,14 @@ revision = "1624edc4454b8682399def8740d46db5e4362ba4" version = "v1.1.5" +[[projects]] + digest = "1:58999a98719fddbac6303cb17e8d85b945f60b72f48e3a2df6b950b97fa926f1" + name = "github.com/konsorten/go-windows-terminal-sequences" + packages = ["."] + pruneopts = "NT" + revision = "f55edac94c9bbba5d6182a4be46d86a2c9b5b50e" + version = "v1.0.2" + [[projects]] branch = "master" digest = "1:4925ec3736ef6c299cfcf61597782e3d66ec13114f7476019d04c742a7be55d0" @@ -304,6 +367,14 @@ revision = "c12348ce28de40eed0136aa2b644d0ee0650e56c" version = "v1.0.1" +[[projects]] + digest = "1:f9f72e583aaacf1d1ac5d6121abd4afd3c690baa9e14e1d009df26bf831ba347" + name = "github.com/mitchellh/go-homedir" + packages = ["."] + pruneopts = "NT" + revision = "af06845cf3004701891bf4fdb884bfe4920b3727" + version = "v1.1.0" + [[projects]] digest = "1:2f42fa12d6911c7b7659738758631bec870b7e9b4c6be5444f963cdcfccc191f" name = "github.com/modern-go/concurrent" @@ -324,18 +395,41 @@ branch = "master" digest = "1:f0d91aa2c20f5806c77aa0850576a285b4df25effc8b646c41be02ee316636f6" name = "github.com/openshift/api" - packages = ["route/v1"] + packages = [ + "apps/v1", + "route/v1", + ] pruneopts = "NT" revision = "77b8897ec79a562e85920134fc65b63300c4d27a" +[[projects]] + digest = "1:3e8b0f8d2ed4b10f83a0719c1e8853bdb4bbce2ca365aba2843dc9487e4ab35c" + name = "github.com/openshift/client-go" + packages = [ + "apps/clientset/versioned/scheme", + "apps/clientset/versioned/typed/apps/v1", + ] + pruneopts = "NT" + revision = "1fa528d3be060e4c7178eb69e76d37cf7e699e3c" + version = "v3.9.0" + [[projects]] digest = "1:fe3c97fb1956829a81d7b8221b4710c40d6dae2c6c3b4d222db5b7f96c975d99" name = "github.com/operator-framework/operator-sdk" packages = [ + "internal/pkg/scaffold", + "internal/pkg/scaffold/input", + "internal/pkg/scaffold/internal/deps", + "internal/util/fileutil", + "internal/util/k8sutil", + "internal/util/projutil", + "internal/util/yamlutil", "pkg/k8sutil", "pkg/leader", "pkg/log/zap", "pkg/metrics", + "pkg/test", + "pkg/test/e2eutil", "version", ] pruneopts = "NT" @@ -432,6 +526,14 @@ revision = "1cf9852c553c5b7da2d5a4a091129a7822fed0c9" version = "v1.2.2" +[[projects]] + digest = "1:efe8ddffa78bddbd1d826faf622cca77dbf7ddc72df04077d69a688cac657148" + name = "github.com/sirupsen/logrus" + packages = ["."] + pruneopts = "NT" + revision = "839c75faf7f98a33d445d181f3018b5c3409a45e" + version = "v1.4.2" + [[projects]] digest = "1:1bc08ec221c4fb25e6f2c019b23fe989fb44573c696983d8e403a3b76cc378e1" name = "github.com/spf13/afero" @@ -443,6 +545,14 @@ revision = "f4711e4db9e9a1d3887343acb72b2bbfc2f686f5" version = "v1.2.1" +[[projects]] + digest = "1:37a91e5093cb260946900c75198c293f3439187e43f48e1a3ae10b4aa55bd7ad" + name = "github.com/spf13/cobra" + packages = ["."] + pruneopts = "NT" + revision = "f2b07da1e2c38d5f12845a4f607e2e1018cbb1f5" + version = "v0.0.5" + [[projects]] digest = "1:9d8420bbf131d1618bde6530af37c3799340d3762cc47210c1d9532a4c3a2779" name = "github.com/spf13/pflag" @@ -665,6 +775,7 @@ packages = [ "pkg/apis/apiextensions", "pkg/apis/apiextensions/v1beta1", + "pkg/client/clientset/clientset/scheme", ] pruneopts = "NT" revision = "0fe22c71c47604641d9aa352c785b7912c200562" @@ -725,6 +836,7 @@ name = "k8s.io/client-go" packages = [ "discovery", + "discovery/cached", "dynamic", "kubernetes", "kubernetes/scheme", @@ -764,8 +876,12 @@ "pkg/apis/clientauthentication/v1alpha1", "pkg/apis/clientauthentication/v1beta1", "pkg/version", + "plugin/pkg/client/auth", + "plugin/pkg/client/auth/azure", "plugin/pkg/client/auth/exec", "plugin/pkg/client/auth/gcp", + "plugin/pkg/client/auth/oidc", + "plugin/pkg/client/auth/openstack", "rest", "rest/watch", "restmapper", @@ -907,7 +1023,7 @@ version = "v0.1.10" [[projects]] - digest = "1:0a14ea9a2647d064bb9d48b2de78306e74b196681efd7b654eb0b518d90c2e8d" + digest = "1:00eecd8f1e0541da85a37549f6514c4b3517e2e000b74a0dc9f47cee07d7e1b5" name = "sigs.k8s.io/controller-tools" packages = [ "pkg/crd/generator", @@ -918,8 +1034,7 @@ "pkg/util", ] pruneopts = "NT" - revision = "950a0e88e4effb864253b3c7504b326cc83b9d11" - version = "v0.1.8" + revision = "9d55346c2bde73fb3326ac22eac2e5210a730207" [[projects]] digest = "1:8730e0150dfb2b7e173890c8b9868e7a273082ef8e39f4940e3506a481cf895c" @@ -937,16 +1052,20 @@ "github.com/go-logr/logr", "github.com/go-openapi/spec", "github.com/openshift/api/route/v1", + "github.com/openshift/client-go/apps/clientset/versioned/typed/apps/v1", "github.com/operator-framework/operator-sdk/pkg/k8sutil", "github.com/operator-framework/operator-sdk/pkg/leader", "github.com/operator-framework/operator-sdk/pkg/log/zap", "github.com/operator-framework/operator-sdk/pkg/metrics", + "github.com/operator-framework/operator-sdk/pkg/test", + "github.com/operator-framework/operator-sdk/pkg/test/e2eutil", "github.com/operator-framework/operator-sdk/version", "github.com/spf13/pflag", "k8s.io/api/apps/v1", "k8s.io/api/batch/v1", "k8s.io/api/batch/v1beta1", "k8s.io/api/core/v1", + "k8s.io/apimachinery/pkg/api/errors", "k8s.io/apimachinery/pkg/api/resource", "k8s.io/apimachinery/pkg/apis/meta/v1", "k8s.io/apimachinery/pkg/labels", @@ -954,6 +1073,7 @@ "k8s.io/apimachinery/pkg/runtime/schema", "k8s.io/apimachinery/pkg/types", "k8s.io/apimachinery/pkg/util/intstr", + "k8s.io/apimachinery/pkg/util/wait", "k8s.io/client-go/kubernetes/scheme", "k8s.io/client-go/plugin/pkg/client/auth/gcp", "k8s.io/client-go/rest", diff --git a/Gopkg.toml b/Gopkg.toml index ffd5f7fd..68de4ce9 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -26,7 +26,7 @@ required = [ [[override]] name = "sigs.k8s.io/controller-tools" - version = "=v0.1.8" + revision = "9d55346c2bde73fb3326ac22eac2e5210a730207" [[override]] name = "k8s.io/api" diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 00000000..5449435a --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,178 @@ +pipeline { + agent { + node { + label "psi_rhel7_openshift311" + } + } + + libraries { + lib('fh-pipeline-library') + lib('qe-pipeline-library') + } + + environment { + GOPATH = "${env.WORKSPACE}/" + PATH = "${env.PATH}:${env.WORKSPACE}/bin:/usr/local/go/bin" + GOOS = "linux" + GOARCH = "amd64" + CGO_ENABLED = 0 + OPERATOR_NAME = "mobile-security-service-operator" + OPERATOR_CONTAINER_IMAGE_CANDIDATE_NAME = "quay.io/aerogear/${env.OPERATOR_NAME}:candidate-${env.BRANCH_NAME}" + OPERATOR_CONTAINER_IMAGE_NAME = "quay.io/aerogear/${env.OPERATOR_NAME}:${env.BRANCH_NAME}" + OPERATOR_CONTAINER_IMAGE_NAME_LATEST = "quay.io/aerogear/${env.OPERATOR_NAME}:latest" + OPENSHIFT_PROJECT_NAME = "mobile-security-service" + CLONED_REPOSITORY_PATH = "src/github.com/aerogear/mobile-security-service-operator" + CREDENTIALS_ID = "quay-aerogear-bot" + } + + options { + checkoutToSubdirectory("src/github.com/aerogear/mobile-security-service-operator") + } + + stages { + + stage("Trust"){ + steps{ + enforceTrustedApproval('aerogear') + } + post{ + failure{ + echo "====++++'Trust' execution failed++++====" + echo "You are not authorized to run this job" + } + + } + } + + stage("Run oc-cluster-up"){ + steps{ + // qe-pipeline-library step + ocClusterUp() + } + post{ + failure{ + echo "====++++Run oc-cluster-up execution failed++++====" + echo "Try to rerun the job" + } + + } + } + + stage("Create an OpenShift project") { + steps { + // qe-pipeline-library step + newOpenshiftProject "${env.OPENSHIFT_PROJECT_NAME}" + } + } + stage("Install dependencies") { + steps { + dir("${env.CLONED_REPOSITORY_PATH}") { + sh "mkdir -p ${env.WORKSPACE}/bin" + sh "curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh" + sh "make setup" + } + } + } + + stage("Build code binary"){ + steps{ + dir("${env.CLONED_REPOSITORY_PATH}") { + sh "make code/compile" + } + } + post{ + failure{ + echo "====++++'Build code binary' execution failed++++====" + echo "Try to run 'make code/compile' locally and make sure it pass" + } + } + } + + stage("Build & push container image") { + steps{ + dir("${env.CLONED_REPOSITORY_PATH}") { + // qe-pipeline-library step + dockerBuildAndPush( + credentialsId: "${env.CREDENTIALS_ID}", + containerRegistryServerName: "quay.io", + containerImageName: "${env.OPERATOR_CONTAINER_IMAGE_CANDIDATE_NAME}", + pathToDockerfile: "build/Dockerfile" + ) + } + } + post{ + failure{ + echo "====++++'Build & push container image' execution failed++++====" + } + } + } + + stage("Build test binary"){ + steps{ + dir("${env.CLONED_REPOSITORY_PATH}") { + script { + sh "make test/compile" + } + } + } + post{ + failure{ + echo "====++++'Build test binary' execution failed++++====" + echo "Try to run 'make test/compile' locally and make sure it pass" + } + } + } + stage("Test operator") { + steps{ + dir("${env.CLONED_REPOSITORY_PATH}") { + // qe-pipeline-library step + runOperatorTestWithImage ( + containerImageName: "${env.OPERATOR_CONTAINER_IMAGE_CANDIDATE_NAME}", + namespace: "${env.OPENSHIFT_PROJECT_NAME}", + namespacedManifest: true, + globalManifest: true + ) + } + } + post{ + failure{ + echo "====++++Test operator execution failed++++====" + } + } + } + stage("Retag the image if the test passed and delete an old tag") { + steps{ + // qe-pipeline-library step + tagRemoteContainerImage( + credentialsId: "${env.CREDENTIALS_ID}", + sourceImage: "${env.OPERATOR_CONTAINER_IMAGE_CANDIDATE_NAME}", + targetImage: "${env.OPERATOR_CONTAINER_IMAGE_NAME}", + deleteOriginalImage: true + ) + } + } + stage("Create a 'latest' tag from 'master'") { + when { + branch 'master' + } + steps{ + // qe-pipeline-library step + tagRemoteContainerImage( + credentialsId: "${env.CREDENTIALS_ID}", + sourceImage: "${env.OPERATOR_CONTAINER_IMAGE_NAME}", + targetImage: "${env.OPERATOR_CONTAINER_IMAGE_NAME_latest}", + deleteOriginalImage: false + ) + } + } + } + post { + failure { + mail( + to: 'stethoma@redhat.com', + subject: 'MSS Operator build failed', + body: "See the pipeline here: ${env.RUN_DISPLAY_URL}" + ) + } + } +} diff --git a/Makefile b/Makefile index 54bf3b85..5c3e1c81 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,8 @@ IMAGE_MASTER_TAG=$(IMAGE_REGISTRY)/$(REGISTRY_ORG)/$(REGISTRY_REPO):master IMAGE_RELEASE_TAG=$(IMAGE_REGISTRY)/$(REGISTRY_ORG)/$(REGISTRY_REPO):$(CIRCLE_TAG) NAMESPACE=mobile-security-service APP_NAMESPACES=mobile-security-service-apps - +CODE_COMPILE_OUTPUT = build/_output/bin/mobile-security-service-operator +TEST_COMPILE_OUTPUT = build/_output/bin/mobile-security-service-operator-test # This follows the output format for goreleaser BINARY_LINUX_64 = ./dist/linux_amd64/$(BINARY) @@ -36,8 +37,8 @@ install: - kubectl apply -f deploy/crds/mobile-security-service_v1alpha1_mobilesecurityserviceapp_crd.yaml - kubectl apply -f deploy/crds/mobile-security-service_v1alpha1_mobilesecurityservicebackup_crd.yaml @echo ....... Applying Rules and Service Account ....... - - kubectl apply -f deploy/cluster_role.yaml - - kubectl apply -f deploy/cluster_role_binding.yaml + - kubectl apply -f deploy/role.yaml + - kubectl apply -f deploy/role_binding.yaml - kubectl apply -f deploy/service_account.yaml @echo ....... Applying Mobile Security Service Operator ....... - kubectl apply -f deploy/operator.yaml @@ -60,8 +61,8 @@ uninstall: - kubectl delete -f deploy/crds/mobile-security-service_v1alpha1_mobilesecurityservicedb_crd.yaml - kubectl delete -f deploy/crds/mobile-security-service_v1alpha1_mobilesecurityservicebackup_crd.yaml @echo ....... Deleting Rules and Service Account ....... - - kubectl delete -f deploy/cluster_role.yaml - - kubectl delete -f deploy/cluster_role_binding.yaml + - kubectl delete -f deploy/role.yaml + - kubectl delete -f deploy/role_binding.yaml - kubectl delete -f deploy/service_account.yaml @echo ....... Deleting Mobile Security Service Operator ....... - kubectl delete -f deploy/operator.yaml @@ -131,6 +132,10 @@ backup/uninstall: code/build/linux: env GOOS=linux GOARCH=amd64 go build $(APP_FILE) +.PHONY: code/compile +code/compile: code/gen + @GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o=$(CODE_COMPILE_OUTPUT) ./cmd/manager/main.go + .PHONY: image/build/master image/build/master: @echo Building operator with the tag: $(IMAGE_MASTER_TAG) @@ -212,7 +217,9 @@ code/gen: test/run: @echo Running tests: GOCACHE=off go test -cover $(TEST_PKGS) - +.PHONY: test/compile +test/compile: + @GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go test -c -o=$(TEST_COMPILE_OUTPUT) ./test/e2e/... .PHONY: test/integration-cover test/integration-cover: echo "mode: count" > coverage-all.out diff --git a/deploy/cluster_role.yaml b/deploy/role.yaml similarity index 100% rename from deploy/cluster_role.yaml rename to deploy/role.yaml diff --git a/deploy/cluster_role_binding.yaml b/deploy/role_binding.yaml similarity index 100% rename from deploy/cluster_role_binding.yaml rename to deploy/role_binding.yaml diff --git a/test/e2e/main_test.go b/test/e2e/main_test.go new file mode 100644 index 00000000..6d2e6988 --- /dev/null +++ b/test/e2e/main_test.go @@ -0,0 +1,11 @@ +package e2e + +import ( + "testing" + + f "github.com/operator-framework/operator-sdk/pkg/test" +) + +func TestMain(m *testing.M) { + f.MainEntry(m) +} diff --git a/test/e2e/mobile_security_service_test.go b/test/e2e/mobile_security_service_test.go new file mode 100644 index 00000000..6e403db2 --- /dev/null +++ b/test/e2e/mobile_security_service_test.go @@ -0,0 +1,194 @@ +package e2e + +import ( + goctx "context" + apis "github.com/aerogear/mobile-security-service-operator/pkg/apis" + mssv1alpha1 "github.com/aerogear/mobile-security-service-operator/pkg/apis/mobilesecurityservice/v1alpha1" + framework "github.com/operator-framework/operator-sdk/pkg/test" + e2eutil "github.com/operator-framework/operator-sdk/pkg/test/e2eutil" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + "testing" + "time" +) + +var ( + retryInterval = time.Second * 5 + timeout = time.Second * 200 + cleanupRetryInterval = time.Second * 1 + cleanupTimeout = time.Second * 5 +) + +func TestMss(t *testing.T) { + mssList := &mssv1alpha1.MobileSecurityServiceList{} + if err := framework.AddToFrameworkScheme(apis.AddToScheme, mssList); err != nil { + t.Fatalf("failed to add custom resource scheme to framework: %v", err) + } + + t.Run("mss-e2e", MssTest) +} +func MssTest(t *testing.T) { + ctx := framework.NewTestCtx(t) + defer ctx.Cleanup() + // get namespace + namespace, err := ctx.GetNamespace() + if err != nil { + t.Fatalf("failed to get namespace %v", err) + } + // get global framework variables + f := framework.Global + if err := initializeMssResources(t, f, ctx, namespace); err != nil { + t.Fatal(err) + } + //MSS database CR for testing + mssdbName := "mobile-security-service-db" + mssDBTestCR := &mssv1alpha1.MobileSecurityServiceDB{ + TypeMeta: metav1.TypeMeta{ + APIVersion: " mobile-security-service.aerogear.org/v1alpha1", + Kind: "MobileSecurityServiceDB", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: mssdbName, + Namespace: namespace, + }, + Spec: mssv1alpha1.MobileSecurityServiceDBSpec{ + + DatabaseName: "mobile_security_service", + DatabasePassword: "postgres", + DatabaseUser: "postgresql", + DatabaseNameParam: "POSTGRESQL_DATABASE", + DatabasePasswordParam: "POSTGRESQL_PASSWORD", + DatabaseUserParam: "POSTGRESQL_USER", + DatabasePort: 5432, + Image: "centos/postgresql-96-centos7", + ContainerName: "database", + DatabaseMemoryLimit: "512Mi", + DatabaseMemoryRequest: "512Mi", + DatabaseStorageRequest: "1Gi", + }, + Status: mssv1alpha1.MobileSecurityServiceDBStatus{ + DatabaseStatus: "OK", + }, + } + //MSS CR struct for testing + mssName := "mobile-security-service" + mssTestCR := &mssv1alpha1.MobileSecurityService{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "mobile-security-service.aerogear.org/v1alpha1", + Kind: "MobileSecurityService", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: mssName, + Namespace: namespace, + }, + Spec: mssv1alpha1.MobileSecurityServiceSpec{ + DatabaseName: "mobile_security_service", + DatabasePassword: "postgres", + DatabaseUser: "postgresql", + DatabaseHost: "mobile-security-service-db", + LogLevel: "info", + LogFormat: "json", + AccessControlAllowOrigin: "*", + AccessControlAllowCredentials: "false", + Port: 3000, + Image: "quay.io/aerogear/mobile-security-service:0.2.2", + ContainerName: "application", + ClusterProtocol: "https", + }, + Status: mssv1alpha1.MobileSecurityServiceStatus{ + AppStatus: "OK", + ConfigMapName: "mobile-security-service-config", + DeploymentName: "mobile-security-service", + }, + } + + // Create MSS database Custom Resource + if err := createMSSdbCustomeResource(t, f, ctx, mssDBTestCR, namespace, mssdbName); err != nil { + t.Fatal(err) + } + //Create MSS Custom Resource + if err := createMSSCustomResource(t, f, ctx, mssTestCR, namespace, mssName); err != nil { + t.Fatal(err) + } + + //Delete MSS database CR + if err := deleteMSSdbCustomResource(t, f, ctx, mssDBTestCR, namespace, mssdbName); err != nil { + t.Fatal(err) + } + + //Delete MSS CR + if err := deleteMSSCustomResource(t, f, ctx, mssTestCR, namespace, mssName); err != nil { + t.Fatal(err) + } + +} +func initializeMssResources(t *testing.T, f *framework.Framework, ctx *framework.TestCtx, namespace string) error { + err := ctx.InitializeClusterResources(&framework.CleanupOptions{ + TestContext: ctx, + Timeout: cleanupTimeout, + RetryInterval: cleanupRetryInterval, + }) + if err != nil { + t.Fatalf("failed to initialize cluster resources: %v", err) + } + t.Log("Successfully initialized cluster resources") + + // wait for mobile-security-service-operator to be ready + if err = e2eutil.WaitForOperatorDeployment(t, f.KubeClient, namespace, "mobile-security-service-operator", 1, retryInterval, timeout); err != nil { + t.Fatal(err) + } + return err +} + +func createMSSdbCustomeResource(t *testing.T, f *framework.Framework, ctx *framework.TestCtx, testCR *mssv1alpha1.MobileSecurityServiceDB, namespace string, mssdbName string) error { + err := f.Client.Create(goctx.TODO(), testCR, &framework.CleanupOptions{ + TestContext: ctx, + Timeout: cleanupTimeout, + RetryInterval: cleanupRetryInterval, + }) + if err != nil { + return err + } + t.Log("Successfully created MSS database Custom Resource") + // Ensure MSS database was deployed successfully + if err = e2eutil.WaitForDeployment(t, f.KubeClient, namespace, mssdbName, 1, retryInterval, timeout); err != nil { + t.Fatal(err) + } + t.Log("MSS database deployment was successful") + return err +} +func createMSSCustomResource(t *testing.T, f *framework.Framework, ctx *framework.TestCtx, testCR *mssv1alpha1.MobileSecurityService, namespace string, mssName string) error { + err := f.Client.Create(goctx.TODO(), testCR, &framework.CleanupOptions{ + TestContext: ctx, + Timeout: cleanupTimeout, + RetryInterval: cleanupRetryInterval, + }) + if err != nil { + return err + } + t.Log("Successfully created MSS Custom Resource") + //Ensure MSS was deployed successfully + if err = e2eutil.WaitForDeployment(t, f.KubeClient, namespace, mssName, 1, retryInterval, timeout); err != nil { + t.Fatal(err) + } + t.Log("MSS deployment was successful") + + return err +} +func deleteMSSdbCustomResource(t *testing.T, f *framework.Framework, ctx *framework.TestCtx, mssDBTestCR *mssv1alpha1.MobileSecurityServiceDB, namespace string, mssdbName string) error { + err := f.Client.Delete(goctx.TODO(), mssDBTestCR) + if err != nil { + return err + } + t.Log("Successfully deleted MSS database Custom Resource") + + return nil +} +func deleteMSSCustomResource(t *testing.T, f *framework.Framework, ctx *framework.TestCtx, mssTestCR *mssv1alpha1.MobileSecurityService, namespace string, mssName string) error { + err := f.Client.Delete(goctx.TODO(), mssTestCR) + if err != nil { + return err + } + t.Log("Successfully deleted MSS Custom Resource") + return nil +}