From 1561eb612c0b1de7e8e714efc1724f22bc3616cf Mon Sep 17 00:00:00 2001 From: Anthony Romano Date: Mon, 5 Jun 2017 17:53:29 -0700 Subject: [PATCH] client: add golang examples for KeysAPI --- client/example_keys_test.go | 91 +++++++++++++++++++++++++++++++++++++ client/main_test.go | 77 +++++++++++++++++++++++++++++++ 2 files changed, 168 insertions(+) create mode 100644 client/example_keys_test.go create mode 100644 client/main_test.go diff --git a/client/example_keys_test.go b/client/example_keys_test.go new file mode 100644 index 000000000..63273a0de --- /dev/null +++ b/client/example_keys_test.go @@ -0,0 +1,91 @@ +// Copyright 2017 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package client_test + +import ( + "fmt" + "log" + + "github.com/coreos/etcd/client" + "golang.org/x/net/context" +) + +func ExampleKeysAPI_directory() { + c, err := client.New(client.Config{ + Endpoints: exampleEndpoints, + Transport: exampleTransport, + }) + if err != nil { + log.Fatal(err) + } + kapi := client.NewKeysAPI(c) + + // Setting '/myNodes' to create a directory that will hold some keys. + o := client.SetOptions{Dir: true} + resp, err := kapi.Set(context.Background(), "/myNodes", "", &o) + if err != nil { + log.Fatal(err) + } + + // Add keys to /myNodes directory. + resp, err = kapi.Set(context.Background(), "/myNodes/key1", "value1", nil) + if err != nil { + log.Fatal(err) + } + resp, err = kapi.Set(context.Background(), "/myNodes/key2", "value2", nil) + if err != nil { + log.Fatal(err) + } + + // fetch directory + resp, err = kapi.Get(context.Background(), "/myNodes", nil) + if err != nil { + log.Fatal(err) + } + // print directory keys + for _, n := range resp.Node.Nodes { + fmt.Printf("Key: %q, Value: %q\n", n.Key, n.Value) + } + + // Output: + // Key: "/myNodes/key1", Value: "value1" + // Key: "/myNodes/key2", Value: "value2" +} + +func ExampleKeysAPI_setget() { + c, err := client.New(client.Config{ + Endpoints: exampleEndpoints, + Transport: exampleTransport, + }) + if err != nil { + log.Fatal(err) + } + kapi := client.NewKeysAPI(c) + + // Set key "/foo" to value "bar". + resp, err := kapi.Set(context.Background(), "/foo", "bar", nil) + if err != nil { + log.Fatal(err) + } + // Get key "/foo" + resp, err = kapi.Get(context.Background(), "/foo", nil) + if err != nil { + log.Fatal(err) + } + + fmt.Printf("%q key has %q value\n", resp.Node.Key, resp.Node.Value) + + // Output: "/foo" key has "bar" value +} diff --git a/client/main_test.go b/client/main_test.go new file mode 100644 index 000000000..747740601 --- /dev/null +++ b/client/main_test.go @@ -0,0 +1,77 @@ +// Copyright 2017 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package client_test + +import ( + "fmt" + "net/http" + "os" + "regexp" + "strings" + "testing" + "time" + + "github.com/coreos/etcd/integration" + "github.com/coreos/etcd/pkg/testutil" + "github.com/coreos/etcd/pkg/transport" +) + +var exampleEndpoints []string +var exampleTransport *http.Transport + +// TestMain sets up an etcd cluster if running the examples. +func TestMain(m *testing.M) { + useCluster, hasRunArg := false, false // default to running only Test* + for _, arg := range os.Args { + if strings.HasPrefix(arg, "-test.run=") { + exp := strings.Split(arg, "=")[1] + match, err := regexp.MatchString(exp, "Example") + useCluster = (err == nil && match) || strings.Contains(exp, "Example") + hasRunArg = true + break + } + } + if !hasRunArg { + // force only running Test* if no args given to avoid leak false + // positives from having a long-running cluster for the examples. + os.Args = append(os.Args, "-test.run=Test") + } + + v := 0 + if useCluster { + tr, trerr := transport.NewTransport(transport.TLSInfo{}, time.Second) + if trerr != nil { + fmt.Fprintf(os.Stderr, "%v", trerr) + os.Exit(1) + } + cfg := integration.ClusterConfig{Size: 1} + clus := integration.NewClusterV3(nil, &cfg) + exampleEndpoints = []string{clus.Members[0].URL()} + exampleTransport = tr + v = m.Run() + clus.Terminate(nil) + if err := testutil.CheckAfterTest(time.Second); err != nil { + fmt.Fprintf(os.Stderr, "%v", err) + os.Exit(1) + } + } else { + v = m.Run() + } + + if v == 0 && testutil.CheckLeakedGoroutine() { + os.Exit(1) + } + os.Exit(v) +}