github.com/fafucoder/cilium@v1.6.11/pkg/kvstore/kvstore.go (about) 1 // Copyright 2016-2020 Authors of Cilium 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package kvstore 16 17 import ( 18 "context" 19 ) 20 21 // Value is an abstraction of the data stored in the kvstore as well as the 22 // mod revision of that data. 23 type Value struct { 24 Data []byte 25 ModRevision uint64 26 LeaseID int64 27 SessionID string 28 } 29 30 // KeyValuePairs is a map of key=value pairs 31 type KeyValuePairs map[string]Value 32 33 // Capabilities is a bitmask to indicate the capabilities of a backend 34 type Capabilities uint32 35 36 const ( 37 // CapabilityCreateIfExists is true if CreateIfExists is functional 38 CapabilityCreateIfExists Capabilities = 1 << 0 39 40 // CapabilityDeleteOnZeroCount is true if DeleteOnZeroCount is functional 41 CapabilityDeleteOnZeroCount Capabilities = 1 << 1 42 43 // BaseKeyPrefix is the base prefix that should be used for all keys 44 BaseKeyPrefix = "cilium" 45 46 // InitLockPath is the path to the init lock to test quorum 47 InitLockPath = BaseKeyPrefix + "/.initlock" 48 ) 49 50 // Get returns value of key 51 func Get(key string) ([]byte, error) { 52 v, err := Client().Get(key) 53 return v, err 54 } 55 56 // GetIfLocked returns value of key if the client is still holding the given lock. 57 func GetIfLocked(key string, lock KVLocker) ([]byte, error) { 58 v, err := Client().GetIfLocked(key, lock) 59 return v, err 60 } 61 62 // GetPrefix returns the first key which matches the prefix and its value. 63 func GetPrefix(ctx context.Context, prefix string) (k string, v []byte, err error) { 64 k, v, err = Client().GetPrefix(ctx, prefix) 65 return 66 } 67 68 // GetPrefixIfLocked returns the first key which matches the prefix and its value if the client is still holding the given lock. 69 func GetPrefixIfLocked(ctx context.Context, prefix string, lock KVLocker) (k string, v []byte, err error) { 70 k, v, err = Client().GetPrefixIfLocked(ctx, prefix, lock) 71 return 72 } 73 74 // ListPrefix returns the list of keys matching the prefix 75 func ListPrefix(prefix string) (KeyValuePairs, error) { 76 v, err := Client().ListPrefix(prefix) 77 return v, err 78 } 79 80 // ListPrefixIfLocked returns a list of keys matching the prefix only if the client is still holding the given lock. 81 func ListPrefixIfLocked(prefix string, lock KVLocker) (KeyValuePairs, error) { 82 v, err := Client().ListPrefixIfLocked(prefix, lock) 83 return v, err 84 } 85 86 // CreateOnly atomically creates a key or fails if it already exists 87 func CreateOnly(ctx context.Context, key string, value []byte, lease bool) (bool, error) { 88 success, err := Client().CreateOnly(ctx, key, value, lease) 89 return success, err 90 } 91 92 // CreateOnlyIfLocked atomically creates a key if the client is still holding the given lock or fails if it already exists 93 func CreateOnlyIfLocked(ctx context.Context, key string, value []byte, lease bool, lock KVLocker) (bool, error) { 94 success, err := Client().CreateOnlyIfLocked(ctx, key, value, lease, lock) 95 return success, err 96 } 97 98 // Update creates or updates a key value pair 99 func Update(ctx context.Context, key string, value []byte, lease bool) error { 100 err := Client().Update(ctx, key, value, lease) 101 return err 102 } 103 104 // UpdateIfDifferent updates a key if the value is different 105 func UpdateIfDifferent(ctx context.Context, key string, value []byte, lease bool) (bool, error) { 106 recreated, err := Client().UpdateIfDifferent(ctx, key, value, lease) 107 return recreated, err 108 } 109 110 // UpdateIfDifferentIfLocked updates a key if the value is different and if the client is still holding the given lock. 111 func UpdateIfDifferentIfLocked(ctx context.Context, key string, value []byte, lease bool, lock KVLocker) (bool, error) { 112 recreated, err := Client().UpdateIfDifferentIfLocked(ctx, key, value, lease, lock) 113 return recreated, err 114 } 115 116 // CreateIfExists creates a key with the value only if key condKey exists 117 func CreateIfExists(condKey, key string, value []byte, lease bool) error { 118 err := Client().CreateIfExists(condKey, key, value, lease) 119 return err 120 } 121 122 // Set sets the value of a key 123 func Set(key string, value []byte) error { 124 err := Client().Set(key, value) 125 return err 126 } 127 128 // Delete deletes a key 129 func Delete(key string) error { 130 err := Client().Delete(key) 131 return err 132 } 133 134 // DeleteIfLocked deletes a key if the client is still holding the given lock. 135 func DeleteIfLocked(key string, lock KVLocker) error { 136 err := Client().DeleteIfLocked(key, lock) 137 return err 138 } 139 140 // DeletePrefix deletes all keys matching a prefix 141 func DeletePrefix(prefix string) error { 142 err := Client().DeletePrefix(prefix) 143 return err 144 } 145 146 // GetCapabilities returns the capabilities of the backend 147 func GetCapabilities() Capabilities { 148 return Client().GetCapabilities() 149 } 150 151 // Encode encodes a binary slice into a character set that the backend supports 152 func Encode(in []byte) string { 153 out := Client().Encode(in) 154 return out 155 } 156 157 // Decode decodes a key previously encoded back into the original binary slice 158 func Decode(in string) ([]byte, error) { 159 out, err := Client().Decode(in) 160 return out, err 161 } 162 163 // Close closes the kvstore client 164 func Close() { 165 defaultClient.Close() 166 }