From 81a8ac422142d2467a84ee9a3fd9dd54856b52bf Mon Sep 17 00:00:00 2001 From: Patrick Moore Date: Mon, 5 Aug 2019 15:04:27 -0700 Subject: [PATCH] Allow use of existing Redis client for checkpoint store (#96) --- store/redis/options.go | 13 +++++++++++++ store/redis/redis.go | 34 ++++++++++++++++++++++++---------- store/redis/redis_test.go | 20 ++++++++++++++++++++ 3 files changed, 57 insertions(+), 10 deletions(-) create mode 100644 store/redis/options.go diff --git a/store/redis/options.go b/store/redis/options.go new file mode 100644 index 0000000..317f94d --- /dev/null +++ b/store/redis/options.go @@ -0,0 +1,13 @@ +package redis + +import redis "github.com/go-redis/redis" + +// Option is used to override defaults when creating a new Redis checkpoint +type Option func(*Checkpoint) + +// WithClient overrides the default client +func WithClient(client *redis.Client) Option { + return func(c *Checkpoint) { + c.client = client + } +} diff --git a/store/redis/redis.go b/store/redis/redis.go index 91790f7..9144119 100644 --- a/store/redis/redis.go +++ b/store/redis/redis.go @@ -10,24 +10,38 @@ import ( const localhost = "127.0.0.1:6379" // New returns a checkpoint that uses Redis for underlying storage -func New(appName string) (*Checkpoint, error) { - addr := os.Getenv("REDIS_URL") - if addr == "" { - addr = localhost +func New(appName string, opts ...Option) (*Checkpoint, error) { + if appName == "" { + return nil, fmt.Errorf("must provide app name") } - client := redis.NewClient(&redis.Options{Addr: addr}) + c := &Checkpoint{ + appName: appName, + } + + // override defaults + for _, opt := range opts { + opt(c) + } + + // default client if none provided + if c.client == nil { + addr := os.Getenv("REDIS_URL") + if addr == "" { + addr = localhost + } + + client := redis.NewClient(&redis.Options{Addr: addr}) + c.client = client + } // verify we can ping server - _, err := client.Ping().Result() + _, err := c.client.Ping().Result() if err != nil { return nil, err } - return &Checkpoint{ - appName: appName, - client: client, - }, nil + return c, nil } // Checkpoint stores and retreives the last evaluated key from a DDB scan diff --git a/store/redis/redis_test.go b/store/redis/redis_test.go index 0d23a70..51ab5a6 100644 --- a/store/redis/redis_test.go +++ b/store/redis/redis_test.go @@ -2,8 +2,28 @@ package redis import ( "testing" + + "github.com/alicebob/miniredis" + redis "github.com/go-redis/redis" ) +func Test_CheckpointOptions(t *testing.T) { + s, err := miniredis.Run() + if err != nil { + panic(err) + } + defer s.Close() + + client := redis.NewClient(&redis.Options{ + Addr: s.Addr(), + }) + + _, err = New("app", WithClient(client)) + if err != nil { + t.Fatalf("new checkpoint error: %v", err) + } +} + func Test_CheckpointLifecycle(t *testing.T) { // new c, err := New("app")