diff --git a/tests/helper/redis_helper.go b/tests/helper/redis_helper.go index 8a937232d07..cf010d47085 100644 --- a/tests/helper/redis_helper.go +++ b/tests/helper/redis_helper.go @@ -14,9 +14,9 @@ import ( type templateValues map[string]string type templateData struct { - Namespace string - DeploymentName string - RedisPassword string + Namespace string + RedisName string + RedisPassword string } var ( @@ -24,6 +24,15 @@ var ( "standaloneRedisTemplate": standaloneRedisTemplate, "standaloneRedisServiceTemplate": standaloneRedisServiceTemplate, } + + redisClusterTemplates = templateValues{ + "clusterRedisSecretTemplate": clusterRedisSecretTemplate, + "clusterRedisConfig1Template": clusterRedisConfig1Template, + "clusterRedisConfig2Template": clusterRedisConfig2Template, + "clusterRedisHeadlessServiceTemplate": clusterRedisHeadlessServiceTemplate, + "clusterRedisServiceTemplate": clusterRedisServiceTemplate, + "clusterRedisStatefulSetTemplate": clusterRedisStatefulSetTemplate, + } ) const ( @@ -31,17 +40,17 @@ const ( apiVersion: apps/v1 kind: Deployment metadata: - name: {{.DeploymentName}} + name: {{.RedisName}} namespace: {{.Namespace}} spec: selector: matchLabels: - app: {{.DeploymentName}} + app: {{.RedisName}} replicas: 1 template: metadata: labels: - app: {{.DeploymentName}} + app: {{.RedisName}} spec: containers: - name: master @@ -57,29 +66,368 @@ metadata: name: redis namespace: {{.Namespace}} labels: - app: {{.DeploymentName}} + app: {{.RedisName}} spec: ports: - port: 6379 targetPort: 6379 selector: - app: {{.DeploymentName}}` + app: {{.RedisName}}` + + clusterRedisSecretTemplate = `apiVersion: v1 +kind: Secret +metadata: + name: redis-cluster + namespace: {{.Namespace}} +type: Opaque +stringData: + redis-password: "{{.RedisPassword}}"` + clusterRedisConfig1Template = ` +apiVersion: v1 +kind: ConfigMap +metadata: + name: redis-cluster-default + namespace: {{.Namespace}} +data: + redis-default.conf: |- + bind 127.0.0.1 + protected-mode yes + port 6379 + tcp-backlog 511 + timeout 0 + tcp-keepalive 300 + daemonize no + supervised no + pidfile /opt/bitnami/redis/tmp/redis_6379.pid + loglevel notice + logfile "" + databases 16 + always-show-logo yes + save 900 1 + save 300 10 + save 60 10000 + stop-writes-on-bgsave-error yes + rdbcompression yes + rdbchecksum yes + dbfilename dump.rdb + rdb-del-sync-files no + dir /bitnami/redis/data + replica-serve-stale-data yes + replica-read-only yes + repl-diskless-sync no + repl-diskless-sync-delay 5 + repl-diskless-load disabled + repl-disable-tcp-nodelay no + replica-priority 100 + acllog-max-len 128 + lazyfree-lazy-eviction no + lazyfree-lazy-expire no + lazyfree-lazy-server-del no + replica-lazy-flush no + lazyfree-lazy-user-del no + appendonly no + appendfilename "appendonly.aof" + appendfsync everysec + no-appendfsync-on-rewrite no + auto-aof-rewrite-percentage 100 + auto-aof-rewrite-min-size 64mb + aof-load-truncated yes + aof-use-rdb-preamble yes + lua-time-limit 5000 + cluster-enabled yes + cluster-config-file /bitnami/redis/data/nodes.conf + slowlog-log-slower-than 10000 + slowlog-max-len 128 + latency-monitor-threshold 0 + notify-keyspace-events "" + hash-max-ziplist-entries 512 + hash-max-ziplist-value 64 + list-max-ziplist-size -2 + list-compress-depth 0 + set-max-intset-entries 512 + zset-max-ziplist-entries 128 + zset-max-ziplist-value 64 + hll-sparse-max-bytes 3000 + stream-node-max-bytes 4096 + stream-node-max-entries 100 + activerehashing yes + client-output-buffer-limit normal 0 0 0 + client-output-buffer-limit replica 256mb 64mb 60 + client-output-buffer-limit pubsub 32mb 8mb 60 + hz 10 + dynamic-hz yes + aof-rewrite-incremental-fsync yes + rdb-save-incremental-fsync yes + jemalloc-bg-thread yes` + clusterRedisConfig2Template = ` +apiVersion: v1 +kind: ConfigMap +metadata: + name: redis-cluster-scripts + namespace: {{.Namespace}} +data: + ping_readiness_local.sh: |- + #!/bin/sh + set -e + REDIS_STATUS_FILE=/tmp/.redis_cluster_check + if [ ! -z "$REDIS_PASSWORD" ]; then export REDISCLI_AUTH=$REDIS_PASSWORD; fi; + response=$( + timeout -s 3 $1 \ + redis-cli \ + -h localhost \ + -p $REDIS_PORT \ + ping + ) + if [ "$?" -eq "124" ]; then + echo "Timed out" + exit 1 + fi + if [ "$response" != "PONG" ]; then + echo "$response" + exit 1 + fi + if [ ! -f "$REDIS_STATUS_FILE" ]; then + response=$( + timeout -s 3 $1 \ + redis-cli \ + -h localhost \ + -p $REDIS_PORT \ + CLUSTER INFO | grep cluster_state | tr -d '[:space:]' + ) + if [ "$?" -eq "124" ]; then + echo "Timed out" + exit 1 + fi + if [ "$response" != "cluster_state:ok" ]; then + echo "$response" + exit 1 + else + touch "$REDIS_STATUS_FILE" + fi + fi + ping_liveness_local.sh: |- + #!/bin/sh + set -e + if [ ! -z "$REDIS_PASSWORD" ]; then export REDISCLI_AUTH=$REDIS_PASSWORD; fi; + response=$( + timeout -s 3 $1 \ + redis-cli \ + -h localhost \ + -p $REDIS_PORT \ + ping + ) + if [ "$?" -eq "124" ]; then + echo "Timed out" + exit 1 + fi + responseFirstWord=$(echo $response | head -n1 | awk '{print $1;}') + if [ "$response" != "PONG" ] && [ "$responseFirstWord" != "LOADING" ] && [ "$responseFirstWord" != "MASTERDOWN" ]; then + echo "$response" + exit 1 + fi` + clusterRedisHeadlessServiceTemplate = ` +apiVersion: v1 +kind: Service +metadata: + name: {{.RedisName}}-headless + namespace: {{.Namespace}} +spec: + type: ClusterIP + clusterIP: None + publishNotReadyAddresses: true + ports: + - name: tcp-redis + port: 6379 + targetPort: tcp-redis + - name: tcp-redis-bus + port: 16379 + targetPort: tcp-redis-bus + selector: + app.kubernetes.io/name: redis-cluster + app.kubernetes.io/instance: redis` + clusterRedisServiceTemplate = ` +apiVersion: v1 +kind: Service +metadata: + name: {{.RedisName}} + namespace: {{.Namespace}} + annotations: +spec: + type: ClusterIP + ports: + - name: tcp-redis + port: 6379 + targetPort: tcp-redis + protocol: TCP + nodePort: null + selector: + app.kubernetes.io/name: redis-cluster + app.kubernetes.io/instance: redis` + clusterRedisStatefulSetTemplate = ` +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: {{.RedisName}} + namespace: {{.Namespace}} + labels: + app.kubernetes.io/name: redis-cluster + helm.sh/chart: redis-cluster-7.5.1 + app.kubernetes.io/instance: redis + app.kubernetes.io/managed-by: Helm +spec: + updateStrategy: + rollingUpdate: + partition: 0 + type: RollingUpdate + selector: + matchLabels: + app.kubernetes.io/name: redis-cluster + app.kubernetes.io/instance: redis + replicas: 6 + serviceName: {{.RedisName}}-headless + podManagementPolicy: Parallel + template: + metadata: + labels: + app.kubernetes.io/name: redis-cluster + helm.sh/chart: redis-cluster-7.5.1 + app.kubernetes.io/instance: redis + app.kubernetes.io/managed-by: Helm + annotations: + checksum/scripts: ce1a29fc397d40685cec7ddd4275fe0bda4455d37d622ca301781996a1dc0fa1 + checksum/secret: 289df422d0e95311f552b860b794245d1372a2bd362835f6431f1ba128a90843 + checksum/config: 5c811a8da6bdb4552e50761422ae69932819fffd90a8c705455296107accc667 + spec: + hostNetwork: false + enableServiceLinks: false + securityContext: + fsGroup: 1001 + runAsUser: 1001 + sysctls: [] + serviceAccountName: default + affinity: + podAffinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + app.kubernetes.io/name: redis-cluster + app.kubernetes.io/instance: redis + namespaces: + - {{.Namespace}} + topologyKey: kubernetes.io/hostname + weight: 1 + nodeAffinity: + containers: + - name: redis-cluster + image: docker.io/bitnami/redis-cluster:6.2.7-debian-10-r0 + imagePullPolicy: "IfNotPresent" + securityContext: + runAsNonRoot: true + runAsUser: 1001 + command: ['/bin/bash', '-c'] + args: + - | + if ! [[ -f /opt/bitnami/redis/etc/redis.conf ]]; then + echo COPYING FILE + cp /opt/bitnami/redis/etc/redis-default.conf /opt/bitnami/redis/etc/redis.conf + fi + pod_index=($(echo "$POD_NAME" | tr "-" "\n")) + pod_index="${pod_index[-1]}" + if [[ "$pod_index" == "0" ]]; then + export REDIS_CLUSTER_CREATOR="yes" + export REDIS_CLUSTER_REPLICAS="1" + fi + + /opt/bitnami/scripts/redis-cluster/entrypoint.sh /opt/bitnami/scripts/redis-cluster/run.sh + env: + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: REDIS_NODES + value: "{{.RedisName}}-0.{{.RedisName}}-headless {{.RedisName}}-1.{{.RedisName}}-headless {{.RedisName}}-2.{{.RedisName}}-headless {{.RedisName}}-3.{{.RedisName}}-headless {{.RedisName}}-4.{{.RedisName}}-headless {{.RedisName}}-5.{{.RedisName}}-headless " + - name: REDISCLI_AUTH + valueFrom: + secretKeyRef: + name: redis-cluster + key: redis-password + - name: REDIS_PASSWORD + valueFrom: + secretKeyRef: + name: redis-cluster + key: redis-password + - name: REDIS_AOF_ENABLED + value: "yes" + - name: REDIS_TLS_ENABLED + value: "no" + - name: REDIS_PORT + value: "6379" + ports: + - name: tcp-redis + containerPort: 6379 + - name: tcp-redis-bus + containerPort: 16379 + livenessProbe: + initialDelaySeconds: 5 + periodSeconds: 5 + timeoutSeconds: 6 + successThreshold: 1 + failureThreshold: 5 + exec: + command: + - sh + - -c + - /scripts/ping_liveness_local.sh 5 + readinessProbe: + initialDelaySeconds: 5 + periodSeconds: 5 + timeoutSeconds: 2 + successThreshold: 1 + failureThreshold: 5 + exec: + command: + - sh + - -c + - /scripts/ping_readiness_local.sh 1 + resources: + limits: {} + requests: {} + volumeMounts: + - name: scripts + mountPath: /scripts + - name: default-config + mountPath: /opt/bitnami/redis/etc/redis-default.conf + subPath: redis-default.conf + - name: redis-tmp-conf + mountPath: /opt/bitnami/redis/etc/ + volumes: + - name: scripts + configMap: + name: redis-cluster-scripts + defaultMode: 0755 + - name: default-config + configMap: + name: redis-cluster-default + - name: redis-tmp-conf + emptyDir: {}` ) func InstallRedisStandalone(t *testing.T, kc *kubernetes.Clientset, name, namespace, password string) { CreateNamespace(t, kc, namespace) var data = templateData{ - Namespace: namespace, - DeploymentName: name, - RedisPassword: password, + Namespace: namespace, + RedisName: name, + RedisPassword: password, } KubectlApplyMultipleWithTemplate(t, data, redisStandaloneTemplates) } func RemoveRedisStandalone(t *testing.T, kc *kubernetes.Clientset, name, namespace string) { var data = templateData{ - Namespace: namespace, - DeploymentName: name, + Namespace: namespace, + RedisName: name, } KubectlApplyMultipleWithTemplate(t, data, redisStandaloneTemplates) DeleteNamespace(t, kc, namespace) @@ -105,3 +453,24 @@ func RemoveRedisSentinel(t *testing.T, kc *kubernetes.Clientset, name, namespace assert.NoErrorf(t, err, "cannot execute command - %s", err) DeleteNamespace(t, kc, namespace) } + +func InstallRedisCluster(t *testing.T, kc *kubernetes.Clientset, name, namespace, password string) { + CreateNamespace(t, kc, namespace) + var data = templateData{ + Namespace: namespace, + RedisName: name, + RedisPassword: password, + } + KubectlApplyMultipleWithTemplate(t, data, redisClusterTemplates) + assert.True(t, WaitForStatefulsetReplicaReadyCount(t, kc, name, namespace, 6, 60, 3), + "redis-cluster should be up") +} + +func RemoveRedisCluster(t *testing.T, kc *kubernetes.Clientset, name, namespace string) { + var data = templateData{ + Namespace: namespace, + RedisName: name, + } + KubectlApplyMultipleWithTemplate(t, data, redisClusterTemplates) + DeleteNamespace(t, kc, namespace) +} diff --git a/tests/scalers_go/redis_cluster_lists/redis_cluster_lists_test.go b/tests/scalers_go/redis_cluster_lists/redis_cluster_lists_test.go new file mode 100644 index 00000000000..f97fb915327 --- /dev/null +++ b/tests/scalers_go/redis_cluster_lists/redis_cluster_lists_test.go @@ -0,0 +1,230 @@ +//go:build e2e +// +build e2e + +package redis_cluster_lists_test + +import ( + "encoding/base64" + "fmt" + "testing" + + "github.com/joho/godotenv" + "github.com/stretchr/testify/assert" + "k8s.io/client-go/kubernetes" + + . "github.com/kedacore/keda/v2/tests/helper" +) + +// Load environment variables from .env file +var _ = godotenv.Load("../../.env") + +const ( + testName = "redis-cluster-lists-test" +) + +var ( + testNamespace = fmt.Sprintf("%s-ns", testName) + redisNamespace = fmt.Sprintf("%s-redis-ns", testName) + deploymentName = fmt.Sprintf("%s-deployment", testName) + redisDeploymentName = fmt.Sprintf("%s-redis", testName) + jobName = fmt.Sprintf("%s-job", testName) + scaledObjectName = fmt.Sprintf("%s-so", testName) + triggerAuthenticationName = fmt.Sprintf("%s-ta", testName) + secretName = fmt.Sprintf("%s-secret", testName) + redisPassword = "admin" + redisList = "queue" + redisHost = fmt.Sprintf("%s-headless", testName) + minReplicaCount = 0 + maxReplicaCount = 2 +) + +type templateData struct { + TestNamespace string + RedisNamespace string + DeploymentName string + JobName string + ScaledObjectName string + TriggerAuthenticationName string + SecretName string + MinReplicaCount int + MaxReplicaCount int + RedisPassword string + RedisPasswordBase64 string + RedisList string + RedisHost string + ItemsToWrite int +} + +type templateValues map[string]string + +const ( + deploymentTemplate = `apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{.DeploymentName}} + namespace: {{.TestNamespace}} +spec: + replicas: 0 + selector: + matchLabels: + app: {{.DeploymentName}} + template: + metadata: + labels: + app: {{.DeploymentName}} + spec: + containers: + - name: redis-worker + image: goku321/redis-cluster-list:v1.7 + imagePullPolicy: IfNotPresent + command: ["./main"] + args: ["read"] + env: + - name: REDIS_ADDRESSES + value: {{.RedisHost}}.{{.RedisNamespace}}:6379 + - name: LIST_NAME + value: {{.RedisList}} + - name: REDIS_PASSWORD + value: {{.RedisPassword}} + - name: REDIS_SENTINEL_PASSWORD + value: {{.RedisPassword}} + - name: REDIS_SENTINEL_MASTER + value: mymaster + - name: READ_PROCESS_TIME + value: "100" +` + + secretTemplate = `apiVersion: v1 +kind: Secret +metadata: + name: {{.SecretName}} + namespace: {{.TestNamespace}} +type: Opaque +data: + password: {{.RedisPasswordBase64}} +` + + triggerAuthenticationTemplate = `apiVersion: keda.sh/v1alpha1 +kind: TriggerAuthentication +metadata: + name: {{.TriggerAuthenticationName}} + namespace: {{.TestNamespace}} +spec: + secretTargetRef: + - parameter: password + name: {{.SecretName}} + key: password +` + + scaledObjectTemplate = `apiVersion: keda.sh/v1alpha1 +kind: ScaledObject +metadata: + name: {{.ScaledObjectName}} + namespace: {{.TestNamespace}} +spec: + scaleTargetRef: + name: {{.DeploymentName}} + pollingInterval: 5 + cooldownPeriod: 10 + minReplicaCount: {{.MinReplicaCount}} + maxReplicaCount: {{.MaxReplicaCount}} + triggers: + - type: redis-cluster + metadata: + addressesFromEnv: REDIS_ADDRESSES + listName: {{.RedisList}} + listLength: "5" + authenticationRef: + name: {{.TriggerAuthenticationName}} +` + + insertJobTemplate = `apiVersion: batch/v1 +kind: Job +metadata: + name: {{.JobName}} + namespace: {{.TestNamespace}} +spec: + ttlSecondsAfterFinished: 0 + template: + spec: + containers: + - name: redis + image: goku321/redis-cluster-list:v1.7 + imagePullPolicy: IfNotPresent + command: ["./main"] + args: ["write"] + env: + - name: REDIS_ADDRESSES + value: {{.RedisHost}}.{{.RedisNamespace}}:6379 + - name: REDIS_PASSWORD + value: {{.RedisPassword}} + - name: LIST_NAME + value: {{.RedisList}} + - name: NO_LIST_ITEMS_TO_WRITE + value: "{{.ItemsToWrite}}" + restartPolicy: Never + backoffLimit: 4 +` +) + +func TestScaler(t *testing.T) { + // Create kubernetes resources for PostgreSQL server + kc := GetKubernetesClient(t) + + // Create Redis Cluster + InstallRedisCluster(t, kc, testName, redisNamespace, redisPassword) + + // Create kubernetes resources for testing + data, templates := getTemplateData() + CreateKubernetesResources(t, kc, testNamespace, data, templates) + + testScaleUp(t, kc, data) + testScaleDown(t, kc) + + // cleanup + RemoveRedisCluster(t, kc, testName, redisNamespace) + DeleteKubernetesResources(t, kc, testNamespace, data, templates) +} + +func testScaleUp(t *testing.T, kc *kubernetes.Clientset, data templateData) { + t.Log("--- testing scale up ---") + templateTriggerJob := templateValues{"insertJobTemplate": insertJobTemplate} + data.ItemsToWrite = 200 + KubectlApplyMultipleWithTemplate(t, data, templateTriggerJob) + + assert.True(t, WaitForDeploymentReplicaReadyCount(t, kc, deploymentName, testNamespace, maxReplicaCount, 60, 3), + "replica count should be %d after 3 minutes", maxReplicaCount) +} + +func testScaleDown(t *testing.T, kc *kubernetes.Clientset) { + t.Log("--- testing scale down ---") + + assert.True(t, WaitForDeploymentReplicaReadyCount(t, kc, deploymentName, testNamespace, minReplicaCount, 60, 3), + "replica count should be %d after 3 minutes", minReplicaCount) +} + +var data = templateData{ + TestNamespace: testNamespace, + RedisNamespace: redisNamespace, + DeploymentName: deploymentName, + ScaledObjectName: scaledObjectName, + MinReplicaCount: minReplicaCount, + MaxReplicaCount: maxReplicaCount, + TriggerAuthenticationName: triggerAuthenticationName, + SecretName: secretName, + JobName: jobName, + RedisPassword: redisPassword, + RedisPasswordBase64: base64.StdEncoding.EncodeToString([]byte(redisPassword)), + RedisList: redisList, + RedisHost: redisHost, + ItemsToWrite: 0, +} + +func getTemplateData() (templateData, map[string]string) { + return data, templateValues{ + "secretTemplate": secretTemplate, + "deploymentTemplate": deploymentTemplate, + "triggerAuthenticationTemplate": triggerAuthenticationTemplate, + "scaledObjectTemplate": scaledObjectTemplate, + } +} diff --git a/tests/scalers_go/redis_cluster_streams/redis_cluster_streams_test.go b/tests/scalers_go/redis_cluster_streams/redis_cluster_streams_test.go new file mode 100644 index 00000000000..ee749d27c3d --- /dev/null +++ b/tests/scalers_go/redis_cluster_streams/redis_cluster_streams_test.go @@ -0,0 +1,233 @@ +//go:build e2e +// +build e2e + +package redis_cluster_streams_test + +import ( + "encoding/base64" + "fmt" + "testing" + + "github.com/joho/godotenv" + "github.com/stretchr/testify/assert" + "k8s.io/client-go/kubernetes" + + . "github.com/kedacore/keda/v2/tests/helper" +) + +// Load environment variables from .env file +var _ = godotenv.Load("../../.env") + +const ( + testName = "redis-cluster-streams-test" +) + +var ( + testNamespace = fmt.Sprintf("%s-ns", testName) + redisNamespace = fmt.Sprintf("%s-redis-ns", testName) + deploymentName = fmt.Sprintf("%s-deployment", testName) + redisDeploymentName = fmt.Sprintf("%s-redis", testName) + jobName = fmt.Sprintf("%s-job", testName) + scaledObjectName = fmt.Sprintf("%s-so", testName) + triggerAuthenticationName = fmt.Sprintf("%s-ta", testName) + secretName = fmt.Sprintf("%s-secret", testName) + redisPassword = "admin" + redisHost = fmt.Sprintf("%s-headless", testName) + minReplicaCount = 1 + maxReplicaCount = 4 +) + +type templateData struct { + TestNamespace string + RedisNamespace string + DeploymentName string + JobName string + ScaledObjectName string + TriggerAuthenticationName string + SecretName string + MinReplicaCount int + MaxReplicaCount int + RedisPassword string + RedisPasswordBase64 string + RedisHost string + ItemsToWrite int +} + +type templateValues map[string]string + +const ( + deploymentTemplate = `apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{.DeploymentName}} + namespace: {{.TestNamespace}} +spec: + replicas: 1 + selector: + matchLabels: + app: {{.DeploymentName}} + template: + metadata: + labels: + app: {{.DeploymentName}} + spec: + containers: + - name: redis-worker + image: goku321/redis-cluster-streams:v2.5 + imagePullPolicy: IfNotPresent + command: ["./main"] + args: ["consumer"] + env: + - name: REDIS_HOSTS + value: {{.RedisHost}}.{{.RedisNamespace}} + - name: REDIS_PORTS + value: "6379" + - name: REDIS_STREAM_NAME + value: my-stream + - name: REDIS_STREAM_CONSUMER_GROUP_NAME + value: consumer-group-1 + - name: REDIS_PASSWORD + value: {{.RedisPassword}} +` + + secretTemplate = `apiVersion: v1 +kind: Secret +metadata: + name: {{.SecretName}} + namespace: {{.TestNamespace}} +type: Opaque +data: + password: {{.RedisPasswordBase64}} +` + + triggerAuthenticationTemplate = `apiVersion: keda.sh/v1alpha1 +kind: TriggerAuthentication +metadata: + name: {{.TriggerAuthenticationName}} + namespace: {{.TestNamespace}} +spec: + secretTargetRef: + - parameter: password + name: {{.SecretName}} + key: password +` + + scaledObjectTemplate = `apiVersion: keda.sh/v1alpha1 +kind: ScaledObject +metadata: + name: {{.ScaledObjectName}} + namespace: {{.TestNamespace}} +spec: + scaleTargetRef: + name: {{.DeploymentName}} + pollingInterval: 5 + cooldownPeriod: 10 + minReplicaCount: {{.MinReplicaCount}} + maxReplicaCount: {{.MaxReplicaCount}} + advanced: + horizontalPodAutoscalerConfig: + behavior: + scaleDown: + stabilizationWindowSeconds: 15 + triggers: + - type: redis-cluster-streams + metadata: + hostsFromEnv: REDIS_HOSTS + portsFromEnv: REDIS_PORTS + stream: my-stream + consumerGroup: consumer-group-1 + pendingEntriesCount: "10" + authenticationRef: + name: {{.TriggerAuthenticationName}} +` + + insertJobTemplate = `apiVersion: batch/v1 +kind: Job +metadata: + name: {{.JobName}} + namespace: {{.TestNamespace}} +spec: + ttlSecondsAfterFinished: 0 + template: + spec: + containers: + - name: redis + image: goku321/redis-cluster-streams:v2.5 + imagePullPolicy: IfNotPresent + command: ["./main"] + args: ["producer"] + env: + - name: REDIS_HOSTS + value: {{.RedisHost}}.{{.RedisNamespace}} + - name: REDIS_PORTS + value: "6379" + - name: REDIS_STREAM_NAME + value: my-stream + - name: REDIS_PASSWORD + value: {{.RedisPassword}} + - name: NUM_MESSAGES + value: "{{.ItemsToWrite}}" + restartPolicy: Never + backoffLimit: 4 +` +) + +func TestScaler(t *testing.T) { + // Create kubernetes resources for PostgreSQL server + kc := GetKubernetesClient(t) + + // Create Redis Cluster + InstallRedisCluster(t, kc, testName, redisNamespace, redisPassword) + + // Create kubernetes resources for testing + data, templates := getTemplateData() + CreateKubernetesResources(t, kc, testNamespace, data, templates) + + testScaleUp(t, kc, data) + testScaleDown(t, kc) + + // cleanup + RemoveRedisCluster(t, kc, testName, redisNamespace) + DeleteKubernetesResources(t, kc, testNamespace, data, templates) +} + +func testScaleUp(t *testing.T, kc *kubernetes.Clientset, data templateData) { + t.Log("--- testing scale up ---") + templateTriggerJob := templateValues{"insertJobTemplate": insertJobTemplate} + KubectlApplyMultipleWithTemplate(t, data, templateTriggerJob) + + assert.True(t, WaitForDeploymentReplicaReadyCount(t, kc, deploymentName, testNamespace, maxReplicaCount, 60, 3), + "replica count should be %d after 3 minutes", maxReplicaCount) +} + +func testScaleDown(t *testing.T, kc *kubernetes.Clientset) { + t.Log("--- testing scale down ---") + + assert.True(t, WaitForDeploymentReplicaReadyCount(t, kc, deploymentName, testNamespace, minReplicaCount, 60, 3), + "replica count should be %d after 3 minutes", minReplicaCount) +} + +var data = templateData{ + TestNamespace: testNamespace, + RedisNamespace: redisNamespace, + DeploymentName: deploymentName, + ScaledObjectName: scaledObjectName, + MinReplicaCount: minReplicaCount, + MaxReplicaCount: maxReplicaCount, + TriggerAuthenticationName: triggerAuthenticationName, + SecretName: secretName, + JobName: jobName, + RedisPassword: redisPassword, + RedisPasswordBase64: base64.StdEncoding.EncodeToString([]byte(redisPassword)), + RedisHost: redisHost, + ItemsToWrite: 100, +} + +func getTemplateData() (templateData, map[string]string) { + return data, templateValues{ + "secretTemplate": secretTemplate, + "deploymentTemplate": deploymentTemplate, + "triggerAuthenticationTemplate": triggerAuthenticationTemplate, + "scaledObjectTemplate": scaledObjectTemplate, + } +} diff --git a/tests/scalers_go/redis_lists/redis_lists_test.go b/tests/scalers_go/redis_standalone_lists/redis_standalone_lists_test.go similarity index 98% rename from tests/scalers_go/redis_lists/redis_lists_test.go rename to tests/scalers_go/redis_standalone_lists/redis_standalone_lists_test.go index 6b61e4afaab..541028393f2 100644 --- a/tests/scalers_go/redis_lists/redis_lists_test.go +++ b/tests/scalers_go/redis_standalone_lists/redis_standalone_lists_test.go @@ -1,7 +1,7 @@ //go:build e2e // +build e2e -package redis_lists_test +package redis_standalone_lists_test import ( "encoding/base64" @@ -19,7 +19,7 @@ import ( var _ = godotenv.Load("../../.env") const ( - testName = "redis-lists-test" + testName = "redis-standalone-lists-test" ) var ( diff --git a/tests/scalers_go/redis_streams/redis_streams_test.go b/tests/scalers_go/redis_standalone_streams/redis_standalone_streams_test.go similarity index 98% rename from tests/scalers_go/redis_streams/redis_streams_test.go rename to tests/scalers_go/redis_standalone_streams/redis_standalone_streams_test.go index 793db538a37..934128332d8 100644 --- a/tests/scalers_go/redis_streams/redis_streams_test.go +++ b/tests/scalers_go/redis_standalone_streams/redis_standalone_streams_test.go @@ -1,7 +1,7 @@ //go:build e2e // +build e2e -package redis_streams_test +package redis_standalone_streams_test import ( "encoding/base64" @@ -19,7 +19,7 @@ import ( var _ = godotenv.Load("../../.env") const ( - testName = "redis-streams-test" + testName = "redis-standalone-streams-test" ) var (