| Index: go/src/infra/gae/epclient/epclient.go
|
| diff --git a/go/src/infra/gae/epclient/epclient.go b/go/src/infra/gae/epclient/epclient.go
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..3475a77561571350495733d88d8080f0fb53aa37
|
| --- /dev/null
|
| +++ b/go/src/infra/gae/epclient/epclient.go
|
| @@ -0,0 +1,113 @@
|
| +// Copyright 2015 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +// The following comment allows `go generate` to correctly generate clients
|
| +// for all endpoints services located in the "infra/gae/epservice" package.
|
| +//go:generate goapp run epclient.go
|
| +
|
| +// EPClient will auto-generate endpoints clients from Google Cloud Endpoint
|
| +// service definitions. The tool assumes that:
|
| +// * all go endpoint service definitions occur in a package which has
|
| +// a public method `RegisterEndpointsService(*endpoints.Server) error`, and
|
| +// that calling this method will register the endpoints service with the
|
| +// provided server or return an error.
|
| +// * goapp exists in PATH (and understands all the import paths in the
|
| +// defined services)
|
| +// * google-api-go-generator exists in PATH.
|
| +package main
|
| +
|
| +import (
|
| + "flag"
|
| + "fmt"
|
| + "net/http"
|
| + "os"
|
| + "os/exec"
|
| + "path/filepath"
|
| + "time"
|
| +)
|
| +
|
| +var (
|
| + servicePackagesBase = flag.String("pkgs", "infra",
|
| + "base Go package to walk to find service definitions.")
|
| + outDir = flag.String("outdir", ".",
|
| + "The directory to generate the client libraries in.")
|
| +)
|
| +
|
| +const discoveryURL = "http://localhost:8080/_ah/api/discovery/v1/apis"
|
| +
|
| +func boom(err error) {
|
| + if err != nil {
|
| + panic(err)
|
| + }
|
| +}
|
| +
|
| +func parseFlags() {
|
| + var err error
|
| + flag.Parse()
|
| + if *outDir == "" {
|
| + if *outDir, err = os.Getwd(); err != nil {
|
| + panic(err)
|
| + }
|
| + }
|
| + if *outDir, err = filepath.Abs(*outDir); err != nil {
|
| + panic(err)
|
| + }
|
| +}
|
| +
|
| +func startServer() func() {
|
| + boom(exec.Command("goapp", "install", "infra/gae/epservice").Run())
|
| + server := exec.Command("epservice", "-base", *servicePackagesBase)
|
| + server.Stdout = os.Stdout
|
| + server.Stderr = os.Stderr
|
| + if err := server.Start(); err != nil {
|
| + panic(err)
|
| + }
|
| +
|
| + deadline := time.Now().Add(time.Second * 5)
|
| + for {
|
| + if time.Now().After(deadline) {
|
| + panic("waited too long for server to start!")
|
| + }
|
| + rsp, err := http.Get(discoveryURL)
|
| + if err == nil && rsp.StatusCode == 200 {
|
| + break
|
| + }
|
| + time.Sleep(time.Millisecond * 200)
|
| + }
|
| + fmt.Println("Discovery service up")
|
| +
|
| + return func() {
|
| + server.Process.Signal(os.Interrupt)
|
| + server.Wait()
|
| + }
|
| +}
|
| +
|
| +func generate() {
|
| + gencmd := exec.Command("google-api-go-generator", "-discoveryurl", discoveryURL, "-gendir", *outDir, "-cache=false")
|
| + gencmd.Stdout = os.Stdout
|
| + gencmd.Stderr = os.Stderr
|
| + if err := gencmd.Run(); err != nil {
|
| + panic(err)
|
| + }
|
| +}
|
| +
|
| +func mustHave(executable string) {
|
| + _, err := exec.LookPath(executable)
|
| + if err != nil {
|
| + panic(executable + " must be on your path")
|
| + }
|
| +}
|
| +
|
| +func main() {
|
| + mustHave("goapp")
|
| + mustHave("google-api-go-generator")
|
| +
|
| + parseFlags()
|
| +
|
| + stop := startServer()
|
| + defer stop()
|
| + generate()
|
| +
|
| + // inject DoWithRetries methods.
|
| +}
|
|
|