go.etcd.io/etcd@v3.3.27+incompatible/clientv3/example_kv_test.go (about) 1 // Copyright 2016 The etcd Authors 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 clientv3_test 16 17 import ( 18 "context" 19 "fmt" 20 "log" 21 22 "github.com/coreos/etcd/clientv3" 23 "github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes" 24 ) 25 26 func ExampleKV_put() { 27 cli, err := clientv3.New(clientv3.Config{ 28 Endpoints: endpoints, 29 DialTimeout: dialTimeout, 30 }) 31 if err != nil { 32 log.Fatal(err) 33 } 34 defer cli.Close() 35 36 ctx, cancel := context.WithTimeout(context.Background(), requestTimeout) 37 _, err = cli.Put(ctx, "sample_key", "sample_value") 38 cancel() 39 if err != nil { 40 log.Fatal(err) 41 } 42 } 43 44 func ExampleKV_putErrorHandling() { 45 cli, err := clientv3.New(clientv3.Config{ 46 Endpoints: endpoints, 47 DialTimeout: dialTimeout, 48 }) 49 if err != nil { 50 log.Fatal(err) 51 } 52 defer cli.Close() 53 54 ctx, cancel := context.WithTimeout(context.Background(), requestTimeout) 55 _, err = cli.Put(ctx, "", "sample_value") 56 cancel() 57 if err != nil { 58 switch err { 59 case context.Canceled: 60 fmt.Printf("ctx is canceled by another routine: %v\n", err) 61 case context.DeadlineExceeded: 62 fmt.Printf("ctx is attached with a deadline is exceeded: %v\n", err) 63 case rpctypes.ErrEmptyKey: 64 fmt.Printf("client-side error: %v\n", err) 65 default: 66 fmt.Printf("bad cluster endpoints, which are not etcd servers: %v\n", err) 67 } 68 } 69 // Output: client-side error: etcdserver: key is not provided 70 } 71 72 func ExampleKV_get() { 73 cli, err := clientv3.New(clientv3.Config{ 74 Endpoints: endpoints, 75 DialTimeout: dialTimeout, 76 }) 77 if err != nil { 78 log.Fatal(err) 79 } 80 defer cli.Close() 81 82 _, err = cli.Put(context.TODO(), "foo", "bar") 83 if err != nil { 84 log.Fatal(err) 85 } 86 87 ctx, cancel := context.WithTimeout(context.Background(), requestTimeout) 88 resp, err := cli.Get(ctx, "foo") 89 cancel() 90 if err != nil { 91 log.Fatal(err) 92 } 93 for _, ev := range resp.Kvs { 94 fmt.Printf("%s : %s\n", ev.Key, ev.Value) 95 } 96 // Output: foo : bar 97 } 98 99 func ExampleKV_getWithRev() { 100 cli, err := clientv3.New(clientv3.Config{ 101 Endpoints: endpoints, 102 DialTimeout: dialTimeout, 103 }) 104 if err != nil { 105 log.Fatal(err) 106 } 107 defer cli.Close() 108 109 presp, err := cli.Put(context.TODO(), "foo", "bar1") 110 if err != nil { 111 log.Fatal(err) 112 } 113 _, err = cli.Put(context.TODO(), "foo", "bar2") 114 if err != nil { 115 log.Fatal(err) 116 } 117 118 ctx, cancel := context.WithTimeout(context.Background(), requestTimeout) 119 resp, err := cli.Get(ctx, "foo", clientv3.WithRev(presp.Header.Revision)) 120 cancel() 121 if err != nil { 122 log.Fatal(err) 123 } 124 for _, ev := range resp.Kvs { 125 fmt.Printf("%s : %s\n", ev.Key, ev.Value) 126 } 127 // Output: foo : bar1 128 } 129 130 func ExampleKV_getSortedPrefix() { 131 cli, err := clientv3.New(clientv3.Config{ 132 Endpoints: endpoints, 133 DialTimeout: dialTimeout, 134 }) 135 if err != nil { 136 log.Fatal(err) 137 } 138 defer cli.Close() 139 140 for i := range make([]int, 3) { 141 ctx, cancel := context.WithTimeout(context.Background(), requestTimeout) 142 _, err = cli.Put(ctx, fmt.Sprintf("key_%d", i), "value") 143 cancel() 144 if err != nil { 145 log.Fatal(err) 146 } 147 } 148 149 ctx, cancel := context.WithTimeout(context.Background(), requestTimeout) 150 resp, err := cli.Get(ctx, "key", clientv3.WithPrefix(), clientv3.WithSort(clientv3.SortByKey, clientv3.SortDescend)) 151 cancel() 152 if err != nil { 153 log.Fatal(err) 154 } 155 for _, ev := range resp.Kvs { 156 fmt.Printf("%s : %s\n", ev.Key, ev.Value) 157 } 158 // Output: 159 // key_2 : value 160 // key_1 : value 161 // key_0 : value 162 } 163 164 func ExampleKV_delete() { 165 cli, err := clientv3.New(clientv3.Config{ 166 Endpoints: endpoints, 167 DialTimeout: dialTimeout, 168 }) 169 if err != nil { 170 log.Fatal(err) 171 } 172 defer cli.Close() 173 174 ctx, cancel := context.WithTimeout(context.Background(), requestTimeout) 175 defer cancel() 176 177 // count keys about to be deleted 178 gresp, err := cli.Get(ctx, "key", clientv3.WithPrefix()) 179 if err != nil { 180 log.Fatal(err) 181 } 182 183 // delete the keys 184 dresp, err := cli.Delete(ctx, "key", clientv3.WithPrefix()) 185 if err != nil { 186 log.Fatal(err) 187 } 188 189 fmt.Println("Deleted all keys:", int64(len(gresp.Kvs)) == dresp.Deleted) 190 // Output: 191 // Deleted all keys: true 192 } 193 194 func ExampleKV_compact() { 195 cli, err := clientv3.New(clientv3.Config{ 196 Endpoints: endpoints, 197 DialTimeout: dialTimeout, 198 }) 199 if err != nil { 200 log.Fatal(err) 201 } 202 defer cli.Close() 203 204 ctx, cancel := context.WithTimeout(context.Background(), requestTimeout) 205 resp, err := cli.Get(ctx, "foo") 206 cancel() 207 if err != nil { 208 log.Fatal(err) 209 } 210 compRev := resp.Header.Revision // specify compact revision of your choice 211 212 ctx, cancel = context.WithTimeout(context.Background(), requestTimeout) 213 _, err = cli.Compact(ctx, compRev) 214 cancel() 215 if err != nil { 216 log.Fatal(err) 217 } 218 } 219 220 func ExampleKV_txn() { 221 cli, err := clientv3.New(clientv3.Config{ 222 Endpoints: endpoints, 223 DialTimeout: dialTimeout, 224 }) 225 if err != nil { 226 log.Fatal(err) 227 } 228 defer cli.Close() 229 230 kvc := clientv3.NewKV(cli) 231 232 _, err = kvc.Put(context.TODO(), "key", "xyz") 233 if err != nil { 234 log.Fatal(err) 235 } 236 237 ctx, cancel := context.WithTimeout(context.Background(), requestTimeout) 238 _, err = kvc.Txn(ctx). 239 // txn value comparisons are lexical 240 If(clientv3.Compare(clientv3.Value("key"), ">", "abc")). 241 // the "Then" runs, since "xyz" > "abc" 242 Then(clientv3.OpPut("key", "XYZ")). 243 // the "Else" does not run 244 Else(clientv3.OpPut("key", "ABC")). 245 Commit() 246 cancel() 247 if err != nil { 248 log.Fatal(err) 249 } 250 251 gresp, err := kvc.Get(context.TODO(), "key") 252 cancel() 253 if err != nil { 254 log.Fatal(err) 255 } 256 for _, ev := range gresp.Kvs { 257 fmt.Printf("%s : %s\n", ev.Key, ev.Value) 258 } 259 // Output: key : XYZ 260 } 261 262 func ExampleKV_do() { 263 cli, err := clientv3.New(clientv3.Config{ 264 Endpoints: endpoints, 265 DialTimeout: dialTimeout, 266 }) 267 if err != nil { 268 log.Fatal(err) 269 } 270 defer cli.Close() 271 272 ops := []clientv3.Op{ 273 clientv3.OpPut("put-key", "123"), 274 clientv3.OpGet("put-key"), 275 clientv3.OpPut("put-key", "456")} 276 277 for _, op := range ops { 278 if _, err := cli.Do(context.TODO(), op); err != nil { 279 log.Fatal(err) 280 } 281 } 282 }