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  }