blob: 480d47680d05417aa68198c67a8daf567e1ffdfa [file] [log] [blame]
khenaidoobf6e7bb2018-08-14 22:27:29 -04001/*
2 * Copyright 2018-present Open Networking Foundation
3
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7
8 * http://www.apache.org/licenses/LICENSE-2.0
9
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
khenaidoocfee5f42018-07-19 22:47:38 -040016package kvstore
17
Neha Sharma7d6f3a92020-04-14 15:26:22 +000018import (
19 "context"
20 "time"
21)
npujar467fe752020-01-16 20:17:45 +053022
khenaidoocfee5f42018-07-19 22:47:38 -040023const (
24 // Default timeout in seconds when making a kvstore request
Neha Sharma7d6f3a92020-04-14 15:26:22 +000025 defaultKVGetTimeout = 5 * time.Second
khenaidoocfee5f42018-07-19 22:47:38 -040026 // Maximum channel buffer between publisher/subscriber goroutines
27 maxClientChannelBufferSize = 10
28)
29
30// These constants represent the event types returned by the KV client
31const (
32 PUT = iota
33 DELETE
34 CONNECTIONDOWN
35 UNKNOWN
36)
37
38// KVPair is a common wrapper for key-value pairs returned from the KV store
39type KVPair struct {
40 Key string
41 Value interface{}
Stephane Barbarieef6650d2019-07-18 12:15:09 -040042 Version int64
khenaidoocfee5f42018-07-19 22:47:38 -040043 Session string
44 Lease int64
45}
46
khenaidoocfee5f42018-07-19 22:47:38 -040047// NewKVPair creates a new KVPair object
Stephane Barbarieef6650d2019-07-18 12:15:09 -040048func NewKVPair(key string, value interface{}, session string, lease int64, version int64) *KVPair {
khenaidoocfee5f42018-07-19 22:47:38 -040049 kv := new(KVPair)
50 kv.Key = key
51 kv.Value = value
52 kv.Session = session
53 kv.Lease = lease
Stephane Barbarieef6650d2019-07-18 12:15:09 -040054 kv.Version = version
khenaidoocfee5f42018-07-19 22:47:38 -040055 return kv
56}
57
58// Event is generated by the KV client when a key change is detected
59type Event struct {
60 EventType int
61 Key interface{}
62 Value interface{}
Stephane Barbarieef6650d2019-07-18 12:15:09 -040063 Version int64
khenaidoocfee5f42018-07-19 22:47:38 -040064}
65
66// NewEvent creates a new Event object
Stephane Barbarieef6650d2019-07-18 12:15:09 -040067func NewEvent(eventType int, key interface{}, value interface{}, version int64) *Event {
khenaidoocfee5f42018-07-19 22:47:38 -040068 evnt := new(Event)
69 evnt.EventType = eventType
70 evnt.Key = key
71 evnt.Value = value
Stephane Barbarieef6650d2019-07-18 12:15:09 -040072 evnt.Version = version
khenaidoocfee5f42018-07-19 22:47:38 -040073
74 return evnt
75}
76
khenaidoob3244212019-08-27 14:32:27 -040077// Client represents the set of APIs a KV Client must implement
khenaidoocfee5f42018-07-19 22:47:38 -040078type Client interface {
npujar467fe752020-01-16 20:17:45 +053079 List(ctx context.Context, key string) (map[string]*KVPair, error)
80 Get(ctx context.Context, key string) (*KVPair, error)
81 Put(ctx context.Context, key string, value interface{}) error
82 Delete(ctx context.Context, key string) error
Neha Sharma7d6f3a92020-04-14 15:26:22 +000083 Reserve(ctx context.Context, key string, value interface{}, ttl time.Duration) (interface{}, error)
npujar467fe752020-01-16 20:17:45 +053084 ReleaseReservation(ctx context.Context, key string) error
85 ReleaseAllReservations(ctx context.Context) error
86 RenewReservation(ctx context.Context, key string) error
Scott Baker0e78ba22020-02-24 17:58:47 -080087 Watch(ctx context.Context, key string, withPrefix bool) chan *Event
Neha Sharma7d6f3a92020-04-14 15:26:22 +000088 AcquireLock(ctx context.Context, lockName string, timeout time.Duration) error
khenaidoobdcb8e02019-03-06 16:28:56 -050089 ReleaseLock(lockName string) error
npujar467fe752020-01-16 20:17:45 +053090 IsConnectionUp(ctx context.Context) bool // timeout in second
Rohan Agrawal31f21802020-06-12 05:38:46 +000091 CloseWatch(ctx context.Context, key string, ch chan *Event)
92 Close(ctx context.Context)
khenaidoocfee5f42018-07-19 22:47:38 -040093}