blob: f40d10e543f848b720c0e0363d516e5da138ceb8 [file] [log] [blame]
William Kurkianea869482019-04-09 15:16:11 -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 */
16package kvstore
17
18import (
Scott Bakerf8424cc2019-10-18 11:26:50 -070019 "github.com/opencord/voltha-lib-go/pkg/log"
William Kurkianea869482019-04-09 15:16:11 -040020)
21
22const (
23 // Default timeout in seconds when making a kvstore request
24 defaultKVGetTimeout = 5
25 // Maximum channel buffer between publisher/subscriber goroutines
26 maxClientChannelBufferSize = 10
27)
28
29// These constants represent the event types returned by the KV client
30const (
31 PUT = iota
32 DELETE
33 CONNECTIONDOWN
34 UNKNOWN
35)
36
37// KVPair is a common wrapper for key-value pairs returned from the KV store
38type KVPair struct {
39 Key string
40 Value interface{}
Manikkaraj kb1d51442019-07-23 10:41:02 -040041 Version int64
William Kurkianea869482019-04-09 15:16:11 -040042 Session string
43 Lease int64
44}
45
46func init() {
47 log.AddPackage(log.JSON, log.WarnLevel, nil)
48}
49
50// NewKVPair creates a new KVPair object
Manikkaraj kb1d51442019-07-23 10:41:02 -040051func NewKVPair(key string, value interface{}, session string, lease int64, version int64) *KVPair {
William Kurkianea869482019-04-09 15:16:11 -040052 kv := new(KVPair)
53 kv.Key = key
54 kv.Value = value
55 kv.Session = session
56 kv.Lease = lease
Manikkaraj kb1d51442019-07-23 10:41:02 -040057 kv.Version = version
William Kurkianea869482019-04-09 15:16:11 -040058 return kv
59}
60
61// Event is generated by the KV client when a key change is detected
62type Event struct {
63 EventType int
64 Key interface{}
65 Value interface{}
Manikkaraj kb1d51442019-07-23 10:41:02 -040066 Version int64
William Kurkianea869482019-04-09 15:16:11 -040067}
68
69// NewEvent creates a new Event object
Manikkaraj kb1d51442019-07-23 10:41:02 -040070func NewEvent(eventType int, key interface{}, value interface{}, version int64) *Event {
William Kurkianea869482019-04-09 15:16:11 -040071 evnt := new(Event)
72 evnt.EventType = eventType
73 evnt.Key = key
74 evnt.Value = value
Manikkaraj kb1d51442019-07-23 10:41:02 -040075 evnt.Version = version
William Kurkianea869482019-04-09 15:16:11 -040076
77 return evnt
78}
79
Devmalya Paul495b94a2019-08-27 19:42:00 -040080// Client represents the set of APIs a KV Client must implement
William Kurkianea869482019-04-09 15:16:11 -040081type Client interface {
82 List(key string, timeout int, lock ...bool) (map[string]*KVPair, error)
83 Get(key string, timeout int, lock ...bool) (*KVPair, error)
84 Put(key string, value interface{}, timeout int, lock ...bool) error
85 Delete(key string, timeout int, lock ...bool) error
86 Reserve(key string, value interface{}, ttl int64) (interface{}, error)
87 ReleaseReservation(key string) error
88 ReleaseAllReservations() error
89 RenewReservation(key string) error
90 Watch(key string) chan *Event
91 AcquireLock(lockName string, timeout int) error
92 ReleaseLock(lockName string) error
Devmalya Paul495b94a2019-08-27 19:42:00 -040093 IsConnectionUp(timeout int) bool // timeout in second
William Kurkianea869482019-04-09 15:16:11 -040094 CloseWatch(key string, ch chan *Event)
95 Close()
96}