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") + }) })