From cf4e8a076bf1c14aefbe8face7d1a19667bf1e8b Mon Sep 17 00:00:00 2001 From: Rushikesh Joshi Date: Wed, 29 Jan 2025 13:22:21 -0800 Subject: [PATCH] feat: support Elasticache cluster mode by introducing IsClusterMode config param --- universal.go | 5 ++++- universal_test.go | 9 +++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/universal.go b/universal.go index f4d2d7598..8016c8ec8 100644 --- a/universal.go +++ b/universal.go @@ -69,6 +69,9 @@ type UniversalOptions struct { DisableIndentity bool IdentitySuffix string UnstableResp3 bool + + // IsClusterMode can be used when only one Addrs is provided (e.g. Elasticache supports setting up cluster mode with configuration endpoint). + IsClusterMode bool } // Cluster returns cluster options created from the universal options. @@ -243,7 +246,7 @@ var ( func NewUniversalClient(opts *UniversalOptions) UniversalClient { if opts.MasterName != "" { return NewFailoverClient(opts.Failover()) - } else if len(opts.Addrs) > 1 { + } else if len(opts.Addrs) > 1 || opts.IsClusterMode { return NewClusterClient(opts.Cluster()) } return NewClient(opts.Simple()) diff --git a/universal_test.go b/universal_test.go index 747c68acb..1c033ee90 100644 --- a/universal_test.go +++ b/universal_test.go @@ -38,4 +38,13 @@ var _ = Describe("UniversalClient", func() { }) Expect(client.Ping(ctx).Err()).NotTo(HaveOccurred()) }) + + It("should connect to clusters if IsClusterMode is set even if only a single address is provided", Label("NonRedisEnterprise"), func() { + client = redis.NewUniversalClient(&redis.UniversalOptions{ + Addrs: []string{cluster.addrs()[0]}, + IsClusterMode: true, + }) + _, ok := client.(*redis.ClusterClient) + Expect(ok).To(BeTrue(), "expected a ClusterClient") + }) })