From 2c2b437f5eec9eb179edc604fc2e79b588dae5f7 Mon Sep 17 00:00:00 2001 From: Abhisek Dwivedi Date: Mon, 29 Jul 2024 14:09:12 +0530 Subject: [PATCH] Added backup test-case with s3 storage --- config/samples/aerospikebackup.yaml | 4 +- config/samples/aerospikebackupservice.yaml | 14 +- controllers/backup-service/reconciler.go | 13 +- controllers/backup/reconciler.go | 10 +- controllers/common/constant.go | 15 ++- test/backup/backup_test.go | 51 ++++++-- test/backup/test_utils.go | 145 +++++++++++---------- test/backup_service/test_utils.go | 53 +++++--- test/cleanup-test-namespace.sh | 3 + test/cluster/cluster_helper.go | 1 + test/cluster_prereq.go | 35 +++++ test/setup_test.go | 12 +- test/suite_test.go | 2 +- 13 files changed, 229 insertions(+), 129 deletions(-) diff --git a/config/samples/aerospikebackup.yaml b/config/samples/aerospikebackup.yaml index e6fad646..a05b504e 100644 --- a/config/samples/aerospikebackup.yaml +++ b/config/samples/aerospikebackup.yaml @@ -33,9 +33,9 @@ spec: source-cluster: test-cluster storage: local test-routine1: - backup-policy: test-policy + backup-policy: test-policy1 interval-cron: "@daily" incr-interval-cron: "@hourly" namespaces: [ "test" ] source-cluster: test-cluster - storage: local + storage: s3Storage diff --git a/config/samples/aerospikebackupservice.yaml b/config/samples/aerospikebackupservice.yaml index 3e4b8624..7081a239 100644 --- a/config/samples/aerospikebackupservice.yaml +++ b/config/samples/aerospikebackupservice.yaml @@ -28,11 +28,19 @@ spec: local: path: /localStorage type: local + s3Storage: + type: aws-s3 + path: "s3://aerospike-kubernetes-operator-test" + s3-region: us-east-1 + s3-profile: default + secrets: - - secretName: auth-secret + - secretName: aws-secret volumeMount: - name: auth-secret - mountPath: /etc/aerospike-backup-service/auth-secret + name: aws-secret + mountPath: /root/.aws/credentials + subPath: credentials + service: type: LoadBalancer diff --git a/controllers/backup-service/reconciler.go b/controllers/backup-service/reconciler.go index c9e95209..759f6f11 100644 --- a/controllers/backup-service/reconciler.go +++ b/controllers/backup-service/reconciler.go @@ -27,9 +27,6 @@ import ( "github.com/aerospike/aerospike-kubernetes-operator/pkg/utils" ) -// BackupServiceConfigYAML is the backup service configuration yaml file -const BackupServiceConfigYAML = "aerospike-backup-service.yml" - type serviceConfig struct { portInfo map[string]int32 contextPath string @@ -157,7 +154,7 @@ func (r *SingleBackupServiceReconciler) reconcileConfigMap() error { return err } - data := cm.Data[BackupServiceConfigYAML] + data := cm.Data[common.BackupServiceConfigYAML] if err := yaml.Unmarshal([]byte(data), ¤tDataMap); err != nil { return err @@ -173,7 +170,7 @@ func (r *SingleBackupServiceReconciler) reconcileConfigMap() error { return err } - cm.Data[BackupServiceConfigYAML] = string(updatedConfig) + cm.Data[common.BackupServiceConfigYAML] = string(updatedConfig) if err = r.Client.Update( context.TODO(), cm, common.UpdateOption, @@ -192,7 +189,7 @@ func (r *SingleBackupServiceReconciler) reconcileConfigMap() error { func (r *SingleBackupServiceReconciler) getConfigMapData() map[string]string { data := make(map[string]string) - data[BackupServiceConfigYAML] = string(r.aeroBackupService.Spec.Config.Raw) + data[common.BackupServiceConfigYAML] = string(r.aeroBackupService.Spec.Config.Raw) return data } @@ -419,8 +416,8 @@ func (r *SingleBackupServiceReconciler) getVolumeAndMounts() ([]corev1.VolumeMou // Backup service configMap mountPath volumeMounts = append(volumeMounts, corev1.VolumeMount{ Name: "backup-service-config", - MountPath: fmt.Sprintf("/etc/aerospike-backup-service/%s", BackupServiceConfigYAML), - SubPath: BackupServiceConfigYAML, + MountPath: fmt.Sprintf("/etc/aerospike-backup-service/%s", common.BackupServiceConfigYAML), + SubPath: common.BackupServiceConfigYAML, }) // Backup service configMap diff --git a/controllers/backup/reconciler.go b/controllers/backup/reconciler.go index ad6ba03e..d751b6f6 100644 --- a/controllers/backup/reconciler.go +++ b/controllers/backup/reconciler.go @@ -23,8 +23,6 @@ import ( "github.com/aerospike/aerospike-kubernetes-operator/pkg/utils" ) -const BackupConfigYAML = "aerospike-backup-service.yml" - // SingleBackupReconciler reconciles a single AerospikeBackup object type SingleBackupReconciler struct { client.Client @@ -139,7 +137,7 @@ func (r *SingleBackupReconciler) reconcileConfigMap() error { return err } - data := cm.Data[BackupConfigYAML] + data := cm.Data[common.BackupServiceConfigYAML] if err := yaml.Unmarshal([]byte(data), &cmDataMap); err != nil { return err @@ -184,7 +182,7 @@ func (r *SingleBackupReconciler) reconcileConfigMap() error { return err } - cm.Data[BackupConfigYAML] = string(updatedConfig) + cm.Data[common.BackupServiceConfigYAML] = string(updatedConfig) if err := r.Client.Update( context.TODO(), cm, common.UpdateOption, @@ -231,7 +229,7 @@ func (r *SingleBackupReconciler) removeBackupInfoFromConfigMap() error { return err } - data := cm.Data[BackupConfigYAML] + data := cm.Data[common.BackupServiceConfigYAML] if err := yaml.Unmarshal([]byte(data), &cmDataMap); err != nil { return err @@ -264,7 +262,7 @@ func (r *SingleBackupReconciler) removeBackupInfoFromConfigMap() error { return err } - cm.Data[BackupConfigYAML] = string(updatedConfig) + cm.Data[common.BackupServiceConfigYAML] = string(updatedConfig) if err := r.Client.Update( context.TODO(), cm, common.UpdateOption, diff --git a/controllers/common/constant.go b/controllers/common/constant.go index 01c42e32..990a1f58 100644 --- a/controllers/common/constant.go +++ b/controllers/common/constant.go @@ -2,13 +2,14 @@ package common // Backup Config relate keys const ( - ServiceKey = "service" - AerospikeClustersKey = "aerospike-clusters" - AerospikeClusterKey = "aerospike-cluster" - StorageKey = "storage" - BackupRoutinesKey = "backup-routines" - BackupPoliciesKey = "backup-policies" - SecretAgentsKey = "secret-agent" + ServiceKey = "service" + AerospikeClustersKey = "aerospike-clusters" + AerospikeClusterKey = "aerospike-cluster" + StorageKey = "storage" + BackupRoutinesKey = "backup-routines" + BackupPoliciesKey = "backup-policies" + SecretAgentsKey = "secret-agent" + BackupServiceConfigYAML = "aerospike-backup-service.yml" ) const ( diff --git a/test/backup/backup_test.go b/test/backup/backup_test.go index b997ef0b..55205bfc 100644 --- a/test/backup/backup_test.go +++ b/test/backup/backup_test.go @@ -248,7 +248,7 @@ var _ = Describe( ) Context("When doing Valid operations", func() { - It("Should trigger backup when correct backup config is given", func() { + It("Should trigger backup when correct backup config with local storage is given", func() { backup, err = newBackup() Expect(err).ToNot(HaveOccurred()) err = deployBackup(k8sClient, backup) @@ -259,6 +259,25 @@ var _ = Describe( }) + It("Should trigger backup when correct backup config with s3 storage is given", func() { + config := getBackupConfigInMap() + backupRoutines := config[common.BackupRoutinesKey].(map[string]interface{}) + backupRoutines["test-routine"].(map[string]interface{})[common.StorageKey] = "s3Storage" + + config[common.BackupRoutinesKey] = backupRoutines + + configBytes, mErr := json.Marshal(config) + Expect(mErr).ToNot(HaveOccurred()) + + backup = newBackupWithConfig(configBytes) + + err = deployBackup(k8sClient, backup) + Expect(err).ToNot(HaveOccurred()) + + err = validateTriggeredBackup(k8sClient, backupServiceName, backupServiceNamespace, backup) + Expect(err).ToNot(HaveOccurred()) + }) + It("Should trigger on-demand backup when given", func() { backup, err = newBackup() Expect(err).ToNot(HaveOccurred()) @@ -275,7 +294,7 @@ var _ = Describe( }, } - err = k8sClient.Update(testCtx, backup) + err = updateBackup(k8sClient, backup) Expect(err).ToNot(HaveOccurred()) err = validateTriggeredBackup(k8sClient, backupServiceName, backupServiceNamespace, backup) @@ -283,8 +302,23 @@ var _ = Describe( }) It("Should unregister backup-routines when removed from backup CR", func() { - backup, err = newBackup() + backupConfig := getBackupConfigInMap() + backupRoutines := backupConfig[common.BackupRoutinesKey].(map[string]interface{}) + backupRoutines["test-routine1"] = map[string]interface{}{ + "backup-policy": "test-policy1", + "interval-cron": "@daily", + "incr-interval-cron": "@hourly", + "namespaces": []string{"test"}, + "source-cluster": "test-cluster", + "storage": "local", + } + + backupConfig[common.BackupRoutinesKey] = backupRoutines + + configBytes, err := json.Marshal(backupConfig) Expect(err).ToNot(HaveOccurred()) + + backup = newBackupWithConfig(configBytes) err = deployBackup(k8sClient, backup) Expect(err).ToNot(HaveOccurred()) @@ -295,17 +329,14 @@ var _ = Describe( Expect(err).ToNot(HaveOccurred()) By("Removing 1 backup-routine from backup CR") - backupConfig := getBackupConfigInMap() - routines := backupConfig[common.BackupRoutinesKey].(map[string]interface{}) - delete(routines, "test-routine1") - backupConfig[common.BackupRoutinesKey] = routines + backupConfig = getBackupConfigInMap() - configBytes, mErr := json.Marshal(backupConfig) - Expect(mErr).ToNot(HaveOccurred()) + configBytes, err = json.Marshal(backupConfig) + Expect(err).ToNot(HaveOccurred()) backup.Spec.Config.Raw = configBytes - err = k8sClient.Update(testCtx, backup) + err = updateBackup(k8sClient, backup) Expect(err).ToNot(HaveOccurred()) err = validateTriggeredBackup(k8sClient, backupServiceName, backupServiceNamespace, backup) diff --git a/test/backup/test_utils.go b/test/backup/test_utils.go index 7f487784..0557105d 100644 --- a/test/backup/test_utils.go +++ b/test/backup/test_utils.go @@ -48,24 +48,26 @@ func newBackup() (*asdbv1beta1.AerospikeBackup, error) { return nil, err } - return &asdbv1beta1.AerospikeBackup{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - }, - Spec: asdbv1beta1.AerospikeBackupSpec{ - BackupService: asdbv1beta1.BackupService{ - Name: backupServiceName, - Namespace: backupServiceNamespace, - }, - Config: runtime.RawExtension{ - Raw: configBytes, - }, - }, - }, nil + backup := newBackupWithEmptyConfig() + + backup.Spec.Config = runtime.RawExtension{ + Raw: configBytes, + } + + return backup, nil } func newBackupWithConfig(conf []byte) *asdbv1beta1.AerospikeBackup { + backup := newBackupWithEmptyConfig() + + backup.Spec.Config = runtime.RawExtension{ + Raw: conf, + } + + return backup +} + +func newBackupWithEmptyConfig() *asdbv1beta1.AerospikeBackup { return &asdbv1beta1.AerospikeBackup{ ObjectMeta: metav1.ObjectMeta{ Name: name, @@ -76,9 +78,6 @@ func newBackupWithConfig(conf []byte) *asdbv1beta1.AerospikeBackup { Name: backupServiceName, Namespace: backupServiceNamespace, }, - Config: runtime.RawExtension{ - Raw: conf, - }, }, } } @@ -101,6 +100,14 @@ func deployBackup(cl client.Client, backup *asdbv1beta1.AerospikeBackup) error { return waitForBackup(cl, backup, timeout) } +func updateBackup(cl client.Client, backup *asdbv1beta1.AerospikeBackup) error { + if err := cl.Update(testCtx, backup); err != nil { + return err + } + + return waitForBackup(cl, backup, timeout) +} + func deleteBackup(cl client.Client, backup *asdbv1beta1.AerospikeBackup) error { if err := cl.Delete(testCtx, backup); err != nil && !k8serrors.IsNotFound(err) { return err @@ -175,14 +182,6 @@ func getBackupConfigInMap() map[string]interface{} { "source-cluster": "test-cluster", "storage": "local", }, - "test-routine1": map[string]interface{}{ - "backup-policy": "test-policy", - "interval-cron": "@daily", - "incr-interval-cron": "@hourly", - "namespaces": []string{"test"}, - "source-cluster": "test-cluster", - "storage": "local", - }, }, } } @@ -210,6 +209,58 @@ func validateTriggeredBackup(k8sClient client.Client, backupServiceName, backupS backup *asdbv1beta1.AerospikeBackup) error { var backupK8sService corev1.Service + validateNewEntries := func(current *model.Config, desiredConfigMap map[string]interface{}, fieldPath string) error { + newCluster := desiredConfigMap[common.AerospikeClusterKey].(map[string]interface{}) + + for clusterName := range newCluster { + if _, ok := current.AerospikeClusters[clusterName]; !ok { + return fmt.Errorf("cluster %s not found in %s backup config", clusterName, fieldPath) + } + } + + pkgLog.Info(fmt.Sprintf("Cluster info is found in %s backup config", fieldPath)) + + routines := desiredConfigMap[common.BackupRoutinesKey].(map[string]interface{}) + + for routineName := range routines { + if _, ok := current.BackupRoutines[routineName]; !ok { + return fmt.Errorf("routine %s not found in %s backup config", routineName, fieldPath) + } + } + + if len(routines) != len(current.BackupRoutines) { + return fmt.Errorf("backup routine count mismatch in %s backup config", fieldPath) + } + + pkgLog.Info(fmt.Sprintf("Backup routines info is found in %s backup config", fieldPath)) + + return nil + } + + // Validate from backup service configmap + var configmap corev1.ConfigMap + if err := k8sClient.Get(testCtx, + types.NamespacedName{Name: backupServiceName, Namespace: backupServiceNamespace}, &configmap, + ); err != nil { + return err + } + + var config model.Config + + if err := yaml.Unmarshal([]byte(configmap.Data[common.BackupServiceConfigYAML]), &config); err != nil { + return err + } + + desiredConfigMap := make(map[string]interface{}) + + if err := yaml.Unmarshal(backup.Spec.Config.Raw, &desiredConfigMap); err != nil { + return err + } + + if err := validateNewEntries(&config, desiredConfigMap, "configMap"); err != nil { + return err + } + // Wait for Service LB IP to be populated if err := wait.PollUntilContextTimeout(testCtx, interval, timeout, true, func(ctx context.Context) (bool, error) { @@ -257,49 +308,9 @@ func validateTriggeredBackup(k8sClient client.Client, backupServiceName, backupS return err } - var config model.Config - if err := yaml.Unmarshal(body, &config); err != nil { return err } - desiredConfigMap := make(map[string]interface{}) - - if err := yaml.Unmarshal(backup.Spec.Config.Raw, &desiredConfigMap); err != nil { - return err - } - - if _, ok := desiredConfigMap[common.AerospikeClusterKey]; !ok { - return fmt.Errorf("aerospike-cluster key not found in backup config") - } - - if _, ok := desiredConfigMap[common.BackupRoutinesKey]; !ok { - return fmt.Errorf("backup-routines key not found in backup config") - } - - newCluster := desiredConfigMap[common.AerospikeClusterKey].(map[string]interface{}) - - for clusterName := range newCluster { - if _, ok := config.AerospikeClusters[clusterName]; !ok { - return fmt.Errorf("cluster %s not found in backup config", clusterName) - } - } - - pkgLog.Info("Backup cluster info is found in backup service config") - - routines := desiredConfigMap[common.BackupRoutinesKey].(map[string]interface{}) - - for routineName := range routines { - if _, ok := config.BackupRoutines[routineName]; !ok { - return fmt.Errorf("routine %s not found in backup service config", routineName) - } - } - - if len(routines) != len(config.BackupRoutines) { - return fmt.Errorf("backup routine count mismatch") - } - - pkgLog.Info("Backup routines info is found in backup config") - - return nil + return validateNewEntries(&config, desiredConfigMap, "backup-service API") } diff --git a/test/backup_service/test_utils.go b/test/backup_service/test_utils.go index 0181a324..48265daf 100644 --- a/test/backup_service/test_utils.go +++ b/test/backup_service/test_utils.go @@ -6,10 +6,6 @@ import ( "fmt" "time" - "github.com/aerospike/aerospike-kubernetes-operator/controllers/common" - - asdbv1beta1 "github.com/aerospike/aerospike-kubernetes-operator/api/v1beta1" - "github.com/aerospike/aerospike-kubernetes-operator/pkg/utils" app "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" k8serrors "k8s.io/apimachinery/pkg/api/errors" @@ -20,6 +16,11 @@ import ( "k8s.io/apimachinery/pkg/util/wait" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" + + asdbv1beta1 "github.com/aerospike/aerospike-kubernetes-operator/api/v1beta1" + "github.com/aerospike/aerospike-kubernetes-operator/controllers/common" + "github.com/aerospike/aerospike-kubernetes-operator/pkg/utils" + "github.com/aerospike/aerospike-kubernetes-operator/test" ) const BackupServiceImage = "aerospike.jfrog.io/ecosystem-container-prod-local/aerospike-backup-service:1.0.0" @@ -41,21 +42,24 @@ func NewBackupService() (*asdbv1beta1.AerospikeBackupService, error) { return nil, err } - return &asdbv1beta1.AerospikeBackupService{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - }, - Spec: asdbv1beta1.AerospikeBackupServiceSpec{ - Image: BackupServiceImage, - Config: runtime.RawExtension{ - Raw: configBytes, - }, - }, - }, nil + backupService := newBackupServiceWithEmptyConfig() + backupService.Spec.Config = runtime.RawExtension{ + Raw: configBytes, + } + + return backupService, nil } func newBackupServiceWithConfig(config []byte) *asdbv1beta1.AerospikeBackupService { + backupService := newBackupServiceWithEmptyConfig() + backupService.Spec.Config = runtime.RawExtension{ + Raw: config, + } + + return backupService +} + +func newBackupServiceWithEmptyConfig() *asdbv1beta1.AerospikeBackupService { return &asdbv1beta1.AerospikeBackupService{ ObjectMeta: metav1.ObjectMeta{ Name: name, @@ -63,8 +67,15 @@ func newBackupServiceWithConfig(config []byte) *asdbv1beta1.AerospikeBackupServi }, Spec: asdbv1beta1.AerospikeBackupServiceSpec{ Image: BackupServiceImage, - Config: runtime.RawExtension{ - Raw: config, + SecretMounts: []asdbv1beta1.SecretMount{ + { + SecretName: test.AWSSecretName, + VolumeMount: corev1.VolumeMount{ + Name: test.AWSSecretName, + MountPath: "/root/.aws/credentials", + SubPath: "credentials", + }, + }, }, }, } @@ -233,6 +244,12 @@ func getBackupServiceConfMap() map[string]interface{} { "path": "/localStorage", "type": "local", }, + "s3Storage": map[string]interface{}{ + "type": "aws-s3", + "path": "s3://aerospike-kubernetes-operator-test", + "s3-region": "us-east-1", + "s3-profile": "default", + }, }, } } diff --git a/test/cleanup-test-namespace.sh b/test/cleanup-test-namespace.sh index 97a7bb07..ac964992 100755 --- a/test/cleanup-test-namespace.sh +++ b/test/cleanup-test-namespace.sh @@ -7,6 +7,9 @@ # ################################################ +echo "Cleaning up s3 bucket contents s3://aerospike-kubernetes-operator-test" +aws s3 rm s3://aerospike-kubernetes-operator-test --recursive + namespaces="test test1 test2 aerospike" for namespace in $namespaces; do diff --git a/test/cluster/cluster_helper.go b/test/cluster/cluster_helper.go index a129f541..e730d320 100644 --- a/test/cluster/cluster_helper.go +++ b/test/cluster/cluster_helper.go @@ -1521,6 +1521,7 @@ func getBasicStorageSpecObject() asdbv1.AerospikeStorageSpec { storage := asdbv1.AerospikeStorageSpec{ BlockVolumePolicy: asdbv1.AerospikePersistentVolumePolicySpec{ InputCascadeDelete: &cascadeDeleteFalse, + CascadeDelete: cascadeDeleteTrue, }, FileSystemVolumePolicy: asdbv1.AerospikePersistentVolumePolicySpec{ InputInitMethod: &aerospikeVolumeInitMethodDeleteFiles, diff --git a/test/cluster_prereq.go b/test/cluster_prereq.go index 0284dceb..c493a890 100644 --- a/test/cluster_prereq.go +++ b/test/cluster_prereq.go @@ -11,6 +11,8 @@ import ( "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/client" + + "github.com/aerospike/aerospike-kubernetes-operator/controllers/common" ) const ( @@ -26,11 +28,13 @@ var cacertSecrets map[string][]byte const secretDir = "../config/samples/secrets" //nolint:gosec // for testing const cacertSecretDir = "../config/samples/secrets/cacerts" //nolint:gosec // for testing +const awsCredentialPath = "$HOME/.aws/credentials" //nolint:gosec // for testing const AerospikeSecretName = "aerospike-secret" const TLSCacertSecretName = "aerospike-cacert-secret" //nolint:gosec // for testing const AuthSecretName = "auth-secret" const AuthSecretNameForUpdate = "auth-update" +const AWSSecretName = "aws-secret" const MultiClusterNs1 string = "test1" const MultiClusterNs2 string = "test2" @@ -282,3 +286,34 @@ func createAuthSecret( return nil } + +func setupBackupServicePreReq(k8sClient client.Client, ctx goctx.Context, namespace string) error { + // Create SA for aerospike backup service + if err := createServiceAccount(k8sClient, goctx.TODO(), common.AerospikeBackupService, namespace); err != nil { + return err + } + + awsSecret := make(map[string][]byte) + + resolvePath := os.ExpandEnv(awsCredentialPath) + data, err := os.ReadFile(resolvePath) + if err != nil { + return err + } + + awsSecret["credentials"] = data + + secret := &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: AWSSecretName, + Namespace: namespace, + }, + Type: corev1.SecretTypeOpaque, + Data: awsSecret, + } + + // Remove old object + _ = k8sClient.Delete(ctx, secret) + + return k8sClient.Create(ctx, secret) +} diff --git a/test/setup_test.go b/test/setup_test.go index b11ced83..d818c9d6 100644 --- a/test/setup_test.go +++ b/test/setup_test.go @@ -5,18 +5,12 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - - "github.com/aerospike/aerospike-kubernetes-operator/controllers/common" ) var _ = Describe( "Backup Service Test", func() { It("Should setup user RBAC", func() { - // Create SA for aerospike backup service - err := createServiceAccount(k8sClient, goctx.TODO(), common.AerospikeBackupService, namespace) - Expect(err).ToNot(HaveOccurred()) - // Setup by user function // test creating resource // IN operator namespace @@ -42,7 +36,11 @@ var _ = Describe( // ClusterRole: aerospike-cluster // ClusterRoleBinding: aerospike-cluster - err = setupByUser(k8sClient, goctx.TODO()) + err := setupByUser(k8sClient, goctx.TODO()) + Expect(err).ToNot(HaveOccurred()) + + // Set up AerospikeBackupService RBAC and AWS secret + err = setupBackupServicePreReq(k8sClient, goctx.TODO(), namespace) Expect(err).ToNot(HaveOccurred()) }) }) diff --git a/test/suite_test.go b/test/suite_test.go index bed8d7b4..58bc5b64 100644 --- a/test/suite_test.go +++ b/test/suite_test.go @@ -54,7 +54,7 @@ func TestAPIs(t *testing.T) { RunSpecs(t, "Setup Suite") } -// This is used when running tests on existing cluster +// This is used when running tests on an existing cluster // user has to install its own operator then run cleanup and then start this var _ = BeforeSuite(