Skip to content
This repository was archived by the owner on Dec 11, 2023. It is now read-only.

Commit 8713c61

Browse files
author
Pablo Mercado
authored
Merge pull request #96 from odacremolbap/task/add-redis-cluster-support
Add redis cluster support
2 parents 8ab2513 + c1e8c15 commit 8713c61

File tree

5 files changed

+30
-11
lines changed

5 files changed

+30
-11
lines changed

config/300-redisbroker.yaml

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,13 @@ spec:
5656
type: object
5757
properties:
5858
url:
59-
description: URL of the Redis instance.
59+
description: URL of the Redis standalone instance.
6060
type: string
61+
clusterURLs:
62+
description: URLs for the Redis cluster instances.
63+
type: array
64+
items:
65+
type: string
6166
username:
6267
description: Redis username.
6368
type: object
@@ -88,8 +93,9 @@ spec:
8893
tlsSkipVerify:
8994
description: Skip TLS certificate verification.
9095
type: boolean
91-
required:
92-
- url
96+
oneOf:
97+
- required: [url]
98+
- required: [clusterURLs]
9399

94100
stream:
95101
description: Redis stream to be used by the broker.

docs/redis-broker.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ metadata:
1414
spec:
1515
redis:
1616
connection: <Provides a connection to an external Redis instance. Optional>
17-
url: <redis URL. Required>
17+
url: <redis URL. Required if clusterURLs not informed>
18+
clusterURLs:
19+
- <an entry for each redis URL in the cluster. Required if url not informed>
1820
username: <redis username, referenced using a Kubernetes secret>
1921
secretKeyRef:
2022
name: <Kubernetes secret name>

pkg/apis/eventing/v1alpha1/redisbroker_types.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,11 @@ var (
4343
)
4444

4545
type RedisConnection struct {
46-
// Redis URL.
47-
URL string `json:"url"`
46+
// Redis URL for standalone instances
47+
URL *string `json:"url,omitempty"`
48+
49+
// Redis URLs for cluster instances
50+
ClusterURLs []string `json:"clusterURLs,omitempty"`
4851

4952
// Redis username.
5053
Username *SecretValueFromSource `json:"username,omitempty"`

pkg/reconciler/redisbroker/controller.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import (
2020
"knative.dev/pkg/client/injection/kube/informers/core/v1/secret"
2121
"knative.dev/pkg/client/injection/kube/informers/core/v1/service"
2222
"knative.dev/pkg/client/injection/kube/informers/core/v1/serviceaccount"
23-
"knative.dev/pkg/client/injection/kube/informers/rbac/v1/rolebinding"
2423
rolebindingsinformer "knative.dev/pkg/client/injection/kube/informers/rbac/v1/rolebinding"
2524
"knative.dev/pkg/configmap"
2625
"knative.dev/pkg/controller"
@@ -64,7 +63,7 @@ func NewController(
6463
serviceAccountInformer := serviceaccount.Get(ctx)
6564
roleBindingsInformer := rolebindingsinformer.Get(ctx)
6665

67-
_ = rolebinding.Get(ctx)
66+
_ = rolebindingsinformer.Get(ctx)
6867

6968
r := &reconciler{
7069
secretReconciler: common.NewSecretReconciler(ctx, secretInformer.Lister(), trgInformer.Lister()),

pkg/reconciler/redisbroker/reconciler.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ import (
77
"context"
88
"fmt"
99
"strconv"
10+
"strings"
1011

1112
"go.uber.org/zap"
1213
appsv1 "k8s.io/api/apps/v1"
1314
corev1 "k8s.io/api/core/v1"
14-
v1 "k8s.io/api/core/v1"
1515

1616
"knative.dev/pkg/apis"
1717
"knative.dev/pkg/logging"
@@ -61,7 +61,16 @@ func redisDeploymentOption(rb *eventingv1alpha1.RedisBroker, redisSvc *corev1.Se
6161
resources.ContainerAddEnvFromValue("REDIS_STREAM_MAX_LEN", maxLen)(c)
6262

6363
if rb.IsUserProvidedRedis() {
64-
resources.ContainerAddEnvFromValue("REDIS_ADDRESS", rb.Spec.Redis.Connection.URL)(c)
64+
65+
// Standalone connections require an address, while cluster connections require an
66+
// address list of each endpoint available for the initial connection.
67+
if rb.Spec.Redis.Connection.ClusterURLs != nil &&
68+
len(rb.Spec.Redis.Connection.ClusterURLs) != 0 {
69+
resources.ContainerAddEnvFromValue("REDIS_CLUSTER_ADDRESSES",
70+
strings.Join(rb.Spec.Redis.Connection.ClusterURLs, ","))(c)
71+
} else {
72+
resources.ContainerAddEnvFromValue("REDIS_ADDRESS", *rb.Spec.Redis.Connection.URL)(c)
73+
}
6574

6675
if rb.Spec.Redis.Connection.Username != nil {
6776
resources.ContainerAddEnvVarFromSecret("REDIS_USERNAME",
@@ -123,7 +132,7 @@ func (r *reconciler) ReconcileKind(ctx context.Context, rb *eventingv1alpha1.Red
123132
return nil
124133
}
125134

126-
func getServiceAddress(svc *v1.Service) *apis.URL {
135+
func getServiceAddress(svc *corev1.Service) *apis.URL {
127136
var port string
128137
if svc.Spec.Ports[0].Port != 80 {
129138
port = ":" + strconv.Itoa(int(svc.Spec.Ports[0].Port))

0 commit comments

Comments
 (0)