Gopher Robot submitted this change.
2 is the latest approved patch-set.
The change was submitted with unreviewed changes in the following files:
```
The name of the file: buildlet/fakebuildletclient.go
Insertions: 3, Deletions: 1.
@@ -192,7 +192,9 @@
func (fc *FakeClient) URL() string { return "" }
// WorkDir is the working directory for the fake buildlet.
-func (fc *FakeClient) WorkDir(ctx context.Context) (string, error) { return "", errUnimplemented }
+func (fc *FakeClient) WorkDir(ctx context.Context) (string, error) {
+ return "/work", nil
+}
// RemoveAll deletes the provided paths, relative to the work directory for a fake buildlet.
func (fc *FakeClient) RemoveAll(ctx context.Context, paths ...string) error {
```
```
The name of the file: internal/iapclient/iapclient.go
Insertions: 10, Deletions: 16.
@@ -16,17 +16,14 @@
"encoding/json"
"fmt"
"io"
- "log"
"net/http"
"net/url"
"os"
"path/filepath"
"strings"
- "cloud.google.com/go/compute/metadata"
"golang.org/x/oauth2"
"golang.org/x/oauth2/google"
- "google.golang.org/api/idtoken"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
"google.golang.org/grpc/credentials/oauth"
@@ -95,19 +92,17 @@
// TokenSource returns a TokenSource that can be used to access Go's
// IAP-protected sites. It will prompt for login if necessary.
func TokenSource(ctx context.Context) (oauth2.TokenSource, error) {
+ refresh, err := cachedToken()
+ if err != nil {
+ return nil, err
+ }
+ if refresh == nil {
+ refresh, err = login(ctx)
+ if err != nil {
+ return nil, err
+ }
+ }
const audience = "872405196845-b6fu2qpi0fehdssmc8qo47h2u3cepi0e.apps.googleusercontent.com" // Go build IAP client ID.
- if metadata.OnGCE() {
- return idtoken.NewTokenSource(ctx, audience)
- }
-
- creds, err := google.FindDefaultCredentials(ctx, "openid", "https://www.googleapis.com/auth/userinfo.email", "https://www.googleapis.com/auth/cloud-platform")
- if err != nil {
- return nil, err
- }
- refresh, err := creds.TokenSource.Token()
- if err != nil {
- return nil, err
- }
tokenSource := oauth2.ReuseTokenSource(nil, &jwtTokenSource{gomoteConfig, audience, refresh})
// Eagerly request a token to verify we're good. The source will cache it.
if _, err := tokenSource.Token(); err != nil {
@@ -150,7 +145,6 @@
// Token exchanges a refresh token for a JWT that works with IAP. As of writing, there
// isn't anything to do this in the oauth2 library or google.golang.org/api/idtoken.
func (s *jwtTokenSource) Token() (*oauth2.Token, error) {
- log.Print(s.refresh.AccessToken)
resp, err := http.PostForm(s.conf.Endpoint.TokenURL, url.Values{
"client_id": []string{s.conf.ClientID},
"client_secret": []string{s.conf.ClientSecret},
```
```
The name of the file: internal/gomote/gomote.go
Insertions: 6, Deletions: 1.
@@ -168,7 +168,7 @@
}
userName, err := emailToUser(creds.Email)
if err != nil {
- status.Errorf(codes.Internal, "invalid user email format")
+ return status.Errorf(codes.Internal, "invalid user email format")
}
gomoteID := s.buildlets.AddSession(creds.ID, userName, req.GetBuilderType(), bconf.HostType, r.buildletClient)
log.Printf("created buildlet %v for %v (%s)", gomoteID, userName, r.buildletClient.String())
@@ -176,12 +176,17 @@
if err != nil {
return status.Errorf(codes.Internal, "unable to query for gomote timeout") // this should never happen
}
+ wd, err := r.buildletClient.WorkDir(stream.Context())
+ if err != nil {
+ return status.Errorf(codes.Internal, "could not read working dir: %v", err)
+ }
err = stream.Send(&protos.CreateInstanceResponse{
Instance: &protos.Instance{
GomoteId: gomoteID,
BuilderType: req.GetBuilderType(),
HostType: bconf.HostType,
Expires: session.Expires.Unix(),
+ WorkingDir: wd,
},
Status: protos.CreateInstanceResponse_COMPLETE,
WaitersAhead: 0,
```
buildlet: create gRPC client
As a first step to port relui over to the gRPC API, create a gRPC client
implementation. This should be suitable for use in the gomote command,
but I don't want to conflict with the giant stack in flight. Also add a
GRPCClient function to iapclient for convenience.
The gomote service was missing working directory information; added it.
I also did some refactoring/cleanup.
- The Client interface is used internally to the coordinator, and as
such it has a lot of internal functions. The set used by remote
clients is much more reasonable. Separate it out into a new
RemoteClient interface.
- AddCloseFn was only used in one place. Delete it.
- DestroyVM was completely unused. Delete it.
For golang/go#54344.
Change-Id: I77344a8c27076e53f565e9af56f8d365ac89b487
Reviewed-on: https://go-review.googlesource.com/c/build/+/422095
Auto-Submit: Heschi Kreinick <hes...@google.com>
Reviewed-by: Carlos Amedee <car...@golang.org>
TryBot-Result: Gopher Robot <go...@golang.org>
Run-TryBot: Heschi Kreinick <hes...@google.com>
---
M buildlet/buildletclient.go
M buildlet/fakebuildletclient.go
M buildlet/gce.go
A buildlet/grpcbuildlet.go
M buildlet/remote.go
M cmd/gomote/gomote.go
M cmd/gomote/list.go
M cmd/gomote/ping.go
M cmd/gomote/rdp.go
M cmd/perfrun/perfrun.go
M cmd/retrybuilds/retrybuilds.go
M internal/gomote/gomote.go
M internal/gomote/protos/gomote.pb.go
M internal/gomote/protos/gomote.proto
M internal/gomote/protos/gomote_grpc.pb.go
M internal/iapclient/iapclient.go
M internal/relui/buildrelease_test.go
M internal/relui/workflows.go
M internal/task/buildrelease.go
19 files changed, 515 insertions(+), 295 deletions(-)
diff --git a/buildlet/buildletclient.go b/buildlet/buildletclient.go
index 35ca11f..540bab8 100644
--- a/buildlet/buildletclient.go
+++ b/buildlet/buildletclient.go
@@ -20,8 +20,6 @@
"strings"
"sync"
"time"
-
- "golang.org/x/oauth2"
)
var _ Client = (*client)(nil)
@@ -646,51 +644,6 @@
return c.doOK(req.WithContext(ctx))
}
-// DestroyVM shuts down the buildlet and destroys the VM instance.
-func (c *client) DestroyVM(ts oauth2.TokenSource, proj, zone, instance string) error {
- // TODO(bradfitz): move GCE stuff out of this package?
- gceErrc := make(chan error, 1)
- buildletErrc := make(chan error, 1)
- go func() {
- gceErrc <- DestroyVM(ts, proj, zone, instance)
- }()
- go func() {
- buildletErrc <- c.Close()
- }()
- timeout := time.NewTimer(5 * time.Second)
- defer timeout.Stop()
-
- var retErr error
- var gceDone, buildletDone bool
- for !gceDone || !buildletDone {
- select {
- case err := <-gceErrc:
- if err != nil {
- retErr = err
- }
- gceDone = true
- case err := <-buildletErrc:
- if err != nil {
- retErr = err
- }
- buildletDone = true
- case <-timeout.C:
- e := ""
- if !buildletDone {
- e = "timeout asking buildlet to shut down"
- }
- if !gceDone {
- if e != "" {
- e += " and "
- }
- e += "timeout asking GCE to delete builder VM"
- }
- return errors.New(e)
- }
- }
- return retErr
-}
-
// Status provides status information about the buildlet.
//
// A coordinator can use the provided information to decide what, if anything,
@@ -907,11 +860,6 @@
return conn, nil
}
-// AddCloseFunc adds an optional extra code to run on close.
-func (c *client) AddCloseFunc(fn func()) {
- c.closeFuncs = append(c.closeFuncs, fn)
-}
-
func condRun(fn func()) {
if fn != nil {
fn()
diff --git a/buildlet/fakebuildletclient.go b/buildlet/fakebuildletclient.go
index 9850386..8bdc4bc 100644
--- a/buildlet/fakebuildletclient.go
+++ b/buildlet/fakebuildletclient.go
@@ -13,33 +13,37 @@
"net/http"
"os"
"strings"
-
- "golang.org/x/oauth2"
)
+// RemoteClient is a subset of methods that can be used by a gomote client.
+type RemoteClient interface {
+ Close() error
+ Exec(ctx context.Context, cmd string, opts ExecOpts) (remoteErr, execErr error)
+ GetTar(ctx context.Context, dir string) (io.ReadCloser, error)
+ ListDir(ctx context.Context, dir string, opts ListDirOpts, fn func(DirEntry)) error
+ Put(ctx context.Context, r io.Reader, path string, mode os.FileMode) error
+ PutTar(ctx context.Context, r io.Reader, dir string) error
+ PutTarFromURL(ctx context.Context, tarURL, dir string) error
+ ProxyTCP(port int) (io.ReadWriteCloser, error)
+ RemoteName() string
+ RemoveAll(ctx context.Context, paths ...string) error
+ WorkDir(ctx context.Context) (string, error)
+}
+
// Client is an interface that represent the methods exposed by client. The
// fake buildlet client should be used instead of client when testing things that
// use the client interface.
+// This includes a number of coordinator-internal details; users outside the
+// coordinator should use RemoteClient.
type Client interface {
- AddCloseFunc(fn func())
- Close() error
+ RemoteClient
ConnectSSH(user, authorizedPubKey string) (net.Conn, error)
- DestroyVM(ts oauth2.TokenSource, proj, zone, instance string) error
- Exec(ctx context.Context, cmd string, opts ExecOpts) (remoteErr, execErr error)
GCEInstanceName() string
- GetTar(ctx context.Context, dir string) (io.ReadCloser, error)
IPPort() string
IsBroken() bool
- ListDir(ctx context.Context, dir string, opts ListDirOpts, fn func(DirEntry)) error
MarkBroken()
Name() string
ProxyRoundTripper() http.RoundTripper
- ProxyTCP(port int) (io.ReadWriteCloser, error)
- Put(ctx context.Context, r io.Reader, path string, mode os.FileMode) error
- PutTar(ctx context.Context, r io.Reader, dir string) error
- PutTarFromURL(ctx context.Context, tarURL, dir string) error
- RemoteName() string
- RemoveAll(ctx context.Context, paths ...string) error
SetDescription(v string)
SetDialer(dialer func(context.Context) (net.Conn, error))
SetGCEInstanceName(v string)
@@ -49,7 +53,6 @@
Status(ctx context.Context) (Status, error)
String() string
URL() string
- WorkDir(ctx context.Context) (string, error)
}
var errUnimplemented = errors.New("unimplemented function")
@@ -63,11 +66,6 @@
name string
}
-// AddCloseFunc adds optional extra code to run on close for the fake buildlet.
-func (fc *FakeClient) AddCloseFunc(fn func()) {
- fc.closeFuncs = append(fc.closeFuncs, fn)
-}
-
// Close is a fake client closer.
func (fc *FakeClient) Close() error {
for _, f := range fc.closeFuncs {
@@ -81,11 +79,6 @@
return nil, errUnimplemented
}
-// DestroyVM destroys a fake VM.
-func (fc *FakeClient) DestroyVM(ts oauth2.TokenSource, proj, zone, instance string) error {
- return errUnimplemented
-}
-
// Exec fakes the execution.
func (fc *FakeClient) Exec(ctx context.Context, cmd string, opts ExecOpts) (remoteErr, execErr error) {
if cmd == "" {
@@ -121,7 +114,7 @@
// ListDir lists a directory on a fake buildlet.
func (fc *FakeClient) ListDir(ctx context.Context, dir string, opts ListDirOpts, fn func(DirEntry)) error {
if dir == "" || fn == nil {
- errors.New("invalid arguments")
+ return errors.New("invalid arguments")
}
var lsOutput = `drwxr-xr-x gocache/
drwxr-xr-x tmp/`
@@ -148,7 +141,7 @@
func (fc *FakeClient) Put(ctx context.Context, r io.Reader, path string, mode os.FileMode) error {
// TODO(go.dev/issue/48742) add a file system implementation which would enable proper testing.
if path == "" {
- errors.New("invalid argument")
+ return errors.New("invalid argument")
}
return nil
}
@@ -199,7 +192,9 @@
func (fc *FakeClient) URL() string { return "" }
// WorkDir is the working directory for the fake buildlet.
-func (fc *FakeClient) WorkDir(ctx context.Context) (string, error) { return "", errUnimplemented }
+func (fc *FakeClient) WorkDir(ctx context.Context) (string, error) {
+ return "/work", nil
+}
// RemoveAll deletes the provided paths, relative to the work directory for a fake buildlet.
func (fc *FakeClient) RemoveAll(ctx context.Context, paths ...string) error {
diff --git a/buildlet/gce.go b/buildlet/gce.go
index 11d98a1..760e68d 100644
--- a/buildlet/gce.go
+++ b/buildlet/gce.go
@@ -259,26 +259,37 @@
if opts.OnGotInstanceInfo != nil {
opts.OnGotInstanceInfo(inst)
}
- var closeFuncs []func()
+ var closeFunc func()
if opts.UseIAPTunnel {
- localPort, closeFunc, err := createIAPTunnel(ctx, inst)
+ var localPort string
+ var err error
+ localPort, closeFunc, err = createIAPTunnel(ctx, inst)
if err != nil {
return nil, fmt.Errorf("creating IAP tunnel: %v", err)
}
buildletURL = "http://localhost:" + localPort
ipPort = "127.0.0.1:" + localPort
- closeFuncs = append(closeFuncs, closeFunc)
}
client, err := buildletClient(ctx, buildletURL, ipPort, &opts)
if err != nil {
return nil, err
}
- for _, cf := range closeFuncs {
- client.AddCloseFunc(cf)
+ if closeFunc != nil {
+ return &extraCloseClient{client, closeFunc}, nil
}
return client, nil
}
+type extraCloseClient struct {
+ Client
+ close func()
+}
+
+func (e *extraCloseClient) Close() error {
+ defer e.close()
+ return e.Close()
+}
+
func createIAPTunnel(ctx context.Context, inst *compute.Instance) (string, func(), error) {
// Allocate a local listening port.
ln, err := net.Listen("tcp", "localhost:0")
@@ -350,16 +361,6 @@
return "", nil, fmt.Errorf("iap tunnel startup timed out")
}
-// DestroyVM sends a request to delete a VM. Actual VM description is
-// currently (2015-01-19) very slow for no good reason. This function
-// returns once it's been requested, not when it's done.
-func DestroyVM(ts oauth2.TokenSource, proj, zone, instance string) error {
- computeService, _ := compute.New(oauth2.NewClient(context.TODO(), ts))
- apiGate()
- _, err := computeService.Instances.Delete(proj, zone, instance).Do()
- return err
-}
-
type VM struct {
// Name is the name of the GCE VM instance.
// For example, it's of the form "mote-bradfitz-plan9-386-foo",
diff --git a/buildlet/grpcbuildlet.go b/buildlet/grpcbuildlet.go
new file mode 100644
index 0000000..73a148b
--- /dev/null
+++ b/buildlet/grpcbuildlet.go
@@ -0,0 +1,235 @@
+package buildlet
+
+import (
+ "bytes"
+ "context"
+ "errors"
+ "fmt"
+ "io"
+ "mime/multipart"
+ "net/http"
+ "os"
+ "strings"
+
+ "golang.org/x/build/internal/gomote/protos"
+ "golang.org/x/build/types"
+ "google.golang.org/grpc/codes"
+ "google.golang.org/grpc/status"
+)
+
+type GRPCCoordinatorClient struct {
+ Client protos.GomoteServiceClient
+}
+
+func (c *GRPCCoordinatorClient) CreateBuildlet(ctx context.Context, builderType string) (RemoteClient, error) {
+ return c.CreateBuildletWithStatus(ctx, builderType, func(types.BuildletWaitStatus) {})
+}
+
+func (c *GRPCCoordinatorClient) CreateBuildletWithStatus(ctx context.Context, builderType string, status func(types.BuildletWaitStatus)) (RemoteClient, error) {
+ stream, err := c.Client.CreateInstance(ctx, &protos.CreateInstanceRequest{BuilderType: builderType})
+ if err != nil {
+ return nil, err
+ }
+ var instance *protos.Instance
+ for {
+ update, err := stream.Recv()
+ switch {
+ case err == io.EOF:
+ return &grpcBuildlet{
+ client: c.Client,
+ id: instance.GetGomoteId(),
+ workDir: instance.GetWorkingDir(),
+ }, nil
+ case err != nil:
+ return nil, err
+ case update.GetStatus() != protos.CreateInstanceResponse_COMPLETE:
+ status(types.BuildletWaitStatus{
+ Ahead: int(update.WaitersAhead),
+ })
+
+ case update.GetStatus() == protos.CreateInstanceResponse_COMPLETE:
+ instance = update.GetInstance()
+
+ }
+ }
+}
+
+type grpcBuildlet struct {
+ client protos.GomoteServiceClient
+ id string
+ workDir string
+}
+
+var _ RemoteClient = (*grpcBuildlet)(nil)
+
+func (b *grpcBuildlet) Close() error {
+ _, err := b.client.DestroyInstance(context.TODO(), &protos.DestroyInstanceRequest{
+ GomoteId: b.id,
+ })
+ return err
+}
+
+func (b *grpcBuildlet) Exec(ctx context.Context, cmd string, opts ExecOpts) (remoteErr error, execErr error) {
+ stream, err := b.client.ExecuteCommand(ctx, &protos.ExecuteCommandRequest{
+ GomoteId: b.id,
+ Command: cmd,
+ SystemLevel: opts.SystemLevel,
+ Debug: opts.Debug,
+ AppendEnvironment: opts.ExtraEnv,
+ Path: opts.Path,
+ Directory: opts.Dir,
+ Args: opts.Args,
+ })
+ if err != nil {
+ return nil, err
+ }
+ if opts.OnStartExec != nil {
+ opts.OnStartExec()
+ }
+ for {
+ update, err := stream.Recv()
+ if errors.Is(err, io.EOF) {
+ return nil, nil
+ }
+ if err != nil {
+ // Execution error.
+ if status.Code(err) == codes.Aborted {
+ return nil, err
+ }
+ // Unknown, presumed command error.
+ return err, nil
+ }
+ if opts.Output != nil {
+ opts.Output.Write(update.Output)
+ }
+ }
+}
+
+func (b *grpcBuildlet) GetTar(ctx context.Context, dir string) (io.ReadCloser, error) {
+ resp, err := b.client.ReadTGZToURL(ctx, &protos.ReadTGZToURLRequest{
+ GomoteId: b.id,
+ Directory: dir,
+ })
+ if err != nil {
+ return nil, err
+ }
+ req, err := http.NewRequestWithContext(ctx, http.MethodGet, resp.GetUrl(), nil)
+ if err != nil {
+ return nil, fmt.Errorf("server returned invalid URL %q: %v", resp.GetUrl(), err)
+ }
+ r, err := http.DefaultClient.Do(req)
+ if err != nil {
+ return nil, fmt.Errorf("error fetching tgz: %v", err)
+ }
+ if r.StatusCode != http.StatusOK {
+ return nil, fmt.Errorf("unexpected status reading tgz: %v", r.Status)
+ }
+ return r.Body, nil
+}
+
+func (b *grpcBuildlet) ListDir(ctx context.Context, dir string, opts ListDirOpts, fn func(DirEntry)) error {
+ resp, err := b.client.ListDirectory(ctx, &protos.ListDirectoryRequest{
+ GomoteId: b.id,
+ Directory: dir,
+ Recursive: opts.Recursive,
+ SkipFiles: opts.Skip,
+ Digest: opts.Digest,
+ })
+ if err != nil {
+ return err
+ }
+ for _, ent := range resp.Entries {
+ fn(DirEntry{ent})
+ }
+ return nil
+}
+
+func (b *grpcBuildlet) Put(ctx context.Context, r io.Reader, path string, mode os.FileMode) error {
+ url, err := b.upload(ctx, r)
+ if err != nil {
+ return err
+ }
+ _, err = b.client.WriteFileFromURL(ctx, &protos.WriteFileFromURLRequest{
+ GomoteId: b.id,
+ Url: url,
+ Filename: path,
+ Mode: uint32(mode),
+ })
+ return err
+}
+
+func (b *grpcBuildlet) PutTar(ctx context.Context, r io.Reader, dir string) error {
+ url, err := b.upload(ctx, r)
+ if err != nil {
+ return err
+ }
+ _, err = b.client.WriteTGZFromURL(ctx, &protos.WriteTGZFromURLRequest{
+ GomoteId: b.id,
+ Url: url,
+ Directory: dir,
+ })
+ return err
+}
+
+func (b *grpcBuildlet) PutTarFromURL(ctx context.Context, url string, dir string) error {
+ _, err := b.client.WriteTGZFromURL(ctx, &protos.WriteTGZFromURLRequest{
+ GomoteId: b.id,
+ Url: url,
+ Directory: dir,
+ })
+ return err
+}
+
+func (b *grpcBuildlet) upload(ctx context.Context, r io.Reader) (string, error) {
+ resp, err := b.client.UploadFile(ctx, &protos.UploadFileRequest{})
+ if err != nil {
+ return "", err
+ }
+
+ buf := new(bytes.Buffer)
+ mw := multipart.NewWriter(buf)
+ for k, v := range resp.Fields {
+ if err := mw.WriteField(k, v); err != nil {
+ return "", fmt.Errorf("unable to write field: %s", err)
+ }
+ }
+ _, err = mw.CreateFormFile("file", resp.ObjectName)
+ if err != nil {
+ return "", fmt.Errorf("unable to create form file: %s", err)
+ }
+ // Write our own boundary to avoid buffering entire file into the multipart Writer
+ bound := fmt.Sprintf("\r\n--%s--\r\n", mw.Boundary())
+ req, err := http.NewRequestWithContext(ctx, "POST", resp.Url, io.NopCloser(io.MultiReader(buf, r, strings.NewReader(bound))))
+ if err != nil {
+ return "", fmt.Errorf("unable to create request: %s", err)
+ }
+ req.Header.Set("Content-Type", mw.FormDataContentType())
+ res, err := http.DefaultClient.Do(req)
+ if err != nil {
+ return "", fmt.Errorf("http request failed: %s", err)
+ }
+ if res.StatusCode != http.StatusNoContent {
+ return "", fmt.Errorf("http post failed: status code=%d", res.StatusCode)
+ }
+ return resp.Url, nil
+}
+
+func (b *grpcBuildlet) ProxyTCP(port int) (io.ReadWriteCloser, error) {
+ return nil, fmt.Errorf("TCP proxying unimplemented in grpc")
+}
+
+func (b *grpcBuildlet) RemoteName() string {
+ return b.id
+}
+
+func (b *grpcBuildlet) RemoveAll(ctx context.Context, paths ...string) error {
+ _, err := b.client.RemoveFiles(ctx, &protos.RemoveFilesRequest{
+ GomoteId: b.id,
+ Paths: paths,
+ })
+ return err
+}
+
+func (b *grpcBuildlet) WorkDir(ctx context.Context) (string, error) {
+ panic("unimplemented")
+}
diff --git a/buildlet/remote.go b/buildlet/remote.go
index 5150418..4e97e87 100644
--- a/buildlet/remote.go
+++ b/buildlet/remote.go
@@ -77,7 +77,7 @@
//
// It may expire at any time.
// To release it, call Client.Close.
-func (cc *CoordinatorClient) CreateBuildlet(builderType string) (Client, error) {
+func (cc *CoordinatorClient) CreateBuildlet(builderType string) (RemoteClient, error) {
return cc.CreateBuildletWithStatus(builderType, nil)
}
@@ -90,7 +90,7 @@
)
// CreateBuildletWithStatus is like CreateBuildlet but accepts an optional status callback.
-func (cc *CoordinatorClient) CreateBuildletWithStatus(builderType string, status func(types.BuildletWaitStatus)) (Client, error) {
+func (cc *CoordinatorClient) CreateBuildletWithStatus(builderType string, status func(types.BuildletWaitStatus)) (RemoteClient, error) {
hc, err := cc.client()
if err != nil {
return nil, err
@@ -197,7 +197,7 @@
// NamedBuildlet returns a buildlet client for the named remote buildlet.
// Names are not validated. Use Client.Status to check whether the client works.
-func (cc *CoordinatorClient) NamedBuildlet(name string) (Client, error) {
+func (cc *CoordinatorClient) NamedBuildlet(name string) (RemoteClient, error) {
hc, err := cc.client()
if err != nil {
return nil, err
diff --git a/cmd/gomote/gomote.go b/cmd/gomote/gomote.go
index faaa02e..99684e6 100644
--- a/cmd/gomote/gomote.go
+++ b/cmd/gomote/gomote.go
@@ -86,20 +86,15 @@
import (
"context"
- "crypto/tls"
"flag"
"fmt"
"os"
"sort"
- "strings"
"golang.org/x/build/buildenv"
"golang.org/x/build/buildlet"
"golang.org/x/build/internal/gomote/protos"
"golang.org/x/build/internal/iapclient"
- "google.golang.org/grpc"
- "google.golang.org/grpc/credentials"
- "google.golang.org/grpc/credentials/oauth"
"google.golang.org/grpc/status"
)
@@ -195,16 +190,7 @@
// gomoteServerClient returns a gomote server client which can be used to interact with the gomote GRPC server.
// It will either retrieve a previously created authentication token or attempt to create a new one.
func gomoteServerClient(ctx context.Context) protos.GomoteServiceClient {
- ts, err := iapclient.TokenSource(ctx)
- if err != nil {
- logAndExitf("failed to retrieve oauth token: %s", err)
- }
- opts := []grpc.DialOption{
- grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{InsecureSkipVerify: strings.HasPrefix(*serverAddr, "localhost:")})),
- grpc.WithDefaultCallOptions(grpc.PerRPCCredentials(oauth.TokenSource{TokenSource: ts})),
- grpc.WithBlock(),
- }
- grpcClient, err := grpc.DialContext(ctx, *serverAddr, opts...)
+ grpcClient, err := iapclient.GRPCClient(ctx, *serverAddr)
if err != nil {
logAndExitf("dialing the server=%s failed with: %s", *serverAddr, err)
}
diff --git a/cmd/gomote/list.go b/cmd/gomote/list.go
index 3f8460f..23d76e9 100644
--- a/cmd/gomote/list.go
+++ b/cmd/gomote/list.go
@@ -51,7 +51,7 @@
// As a special case, if name contains '@', the name is expected to be
// of the form <build-config-name>@ip[:port]. For example,
// "windows-a...@10.0.0.1".
-func remoteClient(name string) (buildlet.Client, error) {
+func remoteClient(name string) (buildlet.RemoteClient, error) {
bc, _, err := clientAndCondConf(name, false)
return bc, err
}
@@ -63,11 +63,11 @@
// As a special case, if name contains '@', the name is expected to be
// of the form <build-config-name>@ip[:port]. For example,
// "windows-a...@10.0.0.1".
-func clientAndConf(name string) (bc buildlet.Client, conf *dashboard.BuildConfig, err error) {
+func clientAndConf(name string) (bc buildlet.RemoteClient, conf *dashboard.BuildConfig, err error) {
return clientAndCondConf(name, true)
}
-func clientAndCondConf(name string, withConf bool) (bc buildlet.Client, conf *dashboard.BuildConfig, err error) {
+func clientAndCondConf(name string, withConf bool) (bc buildlet.RemoteClient, conf *dashboard.BuildConfig, err error) {
if strings.Contains(name, "@") {
f := strings.SplitN(name, "@", 2)
if len(f) != 2 {
diff --git a/cmd/gomote/ping.go b/cmd/gomote/ping.go
index b6b9c4d..6c49023 100644
--- a/cmd/gomote/ping.go
+++ b/cmd/gomote/ping.go
@@ -39,11 +39,6 @@
}
if status {
fmt.Printf("workdir: %v\n", wd)
- s, err := bc.Status(ctx)
- if err != nil {
- return err
- }
- fmt.Printf("status: %+v\n", s)
}
return nil
}
diff --git a/cmd/gomote/rdp.go b/cmd/gomote/rdp.go
index cdfa14c..84ef85b 100644
--- a/cmd/gomote/rdp.go
+++ b/cmd/gomote/rdp.go
@@ -53,7 +53,7 @@
}
}
-func handleRDPConn(bc buildlet.Client, c net.Conn) {
+func handleRDPConn(bc buildlet.RemoteClient, c net.Conn) {
const Lmsgprefix = 64 // new in Go 1.14, harmless before
log := log.New(os.Stderr, c.RemoteAddr().String()+": ", log.LstdFlags|Lmsgprefix)
log.Printf("accepted connection, dialing buildlet via coordinator proxy...")
diff --git a/cmd/perfrun/perfrun.go b/cmd/perfrun/perfrun.go
index 87540be..ab85d3d 100644
--- a/cmd/perfrun/perfrun.go
+++ b/cmd/perfrun/perfrun.go
@@ -112,7 +112,7 @@
return nil
}
-func namedClient(name string) (buildlet.Client, error) {
+func namedClient(name string) (buildlet.RemoteClient, error) {
if strings.Contains(name, ":") {
return buildlet.NewClient(name, buildlet.NoKeyPair), nil
}
diff --git a/cmd/retrybuilds/retrybuilds.go b/cmd/retrybuilds/retrybuilds.go
index e24026e..e6e632a 100644
--- a/cmd/retrybuilds/retrybuilds.go
+++ b/cmd/retrybuilds/retrybuilds.go
@@ -21,7 +21,6 @@
"context"
"crypto/hmac"
"crypto/md5"
- "crypto/tls"
"encoding/json"
"flag"
"fmt"
@@ -39,10 +38,7 @@
"golang.org/x/build/cmd/coordinator/protos"
"golang.org/x/build/internal/iapclient"
"golang.org/x/build/internal/secret"
- "google.golang.org/grpc"
"google.golang.org/grpc/codes"
- "google.golang.org/grpc/credentials"
- "google.golang.org/grpc/credentials/oauth"
"google.golang.org/grpc/metadata"
"google.golang.org/grpc/status"
)
@@ -75,16 +71,7 @@
*builderPrefix = strings.TrimSuffix(*builderPrefix, "/")
ctx := context.Background()
- ts, err := iapclient.TokenSource(ctx)
- if err != nil {
- log.Fatalf("failed to retrieve oauth token: %s", err)
- }
- opts := []grpc.DialOption{
- grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{InsecureSkipVerify: strings.HasPrefix(*grpcHost, "localhost:")})),
- grpc.WithDefaultCallOptions(grpc.PerRPCCredentials(oauth.TokenSource{TokenSource: ts})),
- grpc.WithBlock(),
- }
- cc, err := grpc.DialContext(ctx, *grpcHost, opts...)
+ cc, err := iapclient.GRPCClient(ctx, *grpcHost)
if err != nil {
log.Fatalf("grpc.DialContext(_, %q, _) = %v, wanted no error", *grpcHost, err)
}
diff --git a/internal/gomote/gomote.go b/internal/gomote/gomote.go
index 3ee94d2..142e870 100644
--- a/internal/gomote/gomote.go
+++ b/internal/gomote/gomote.go
@@ -168,7 +168,7 @@
}
userName, err := emailToUser(creds.Email)
if err != nil {
- status.Errorf(codes.Internal, "invalid user email format")
+ return status.Errorf(codes.Internal, "invalid user email format")
}
gomoteID := s.buildlets.AddSession(creds.ID, userName, req.GetBuilderType(), bconf.HostType, r.buildletClient)
log.Printf("created buildlet %v for %v (%s)", gomoteID, userName, r.buildletClient.String())
@@ -176,12 +176,17 @@
if err != nil {
return status.Errorf(codes.Internal, "unable to query for gomote timeout") // this should never happen
}
+ wd, err := r.buildletClient.WorkDir(stream.Context())
+ if err != nil {
+ return status.Errorf(codes.Internal, "could not read working dir: %v", err)
+ }
err = stream.Send(&protos.CreateInstanceResponse{
Instance: &protos.Instance{
GomoteId: gomoteID,
BuilderType: req.GetBuilderType(),
HostType: bconf.HostType,
Expires: session.Expires.Unix(),
+ WorkingDir: wd,
},
Status: protos.CreateInstanceResponse_COMPLETE,
WaitersAhead: 0,
diff --git a/internal/gomote/protos/gomote.pb.go b/internal/gomote/protos/gomote.pb.go
index 55da8e0..5a69030 100644
--- a/internal/gomote/protos/gomote.pb.go
+++ b/internal/gomote/protos/gomote.pb.go
@@ -4,8 +4,8 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
-// protoc-gen-go v1.27.1
-// protoc v3.18.1
+// protoc-gen-go v1.28.1
+// protoc v3.12.4
// source: gomote.proto
package protos
@@ -647,6 +647,8 @@
// The timestamp for when the builder instance will expire. It is
// represented in Unix epoch time format.
Expires int64 `protobuf:"varint,4,opt,name=expires,proto3" json:"expires,omitempty"`
+ // The working directory of the instance.
+ WorkingDir string `protobuf:"bytes,5,opt,name=working_dir,json=workingDir,proto3" json:"working_dir,omitempty"`
}
func (x *Instance) Reset() {
@@ -709,6 +711,13 @@
return 0
}
+func (x *Instance) GetWorkingDir() string {
+ if x != nil {
+ return x.WorkingDir
+ }
+ return ""
+}
+
// InstanceAliveRequest specifies the data needed to check the liveness of a gomote instance.
type InstanceAliveRequest struct {
state protoimpl.MessageState
@@ -1721,7 +1730,7 @@
0x79, 0x70, 0x65, 0x22, 0x30, 0x0a, 0x16, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x43, 0x6f,
0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a,
0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x6f,
- 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x81, 0x01, 0x0a, 0x08, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e,
+ 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xa2, 0x01, 0x0a, 0x08, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e,
0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18,
0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x64, 0x12,
0x21, 0x0a, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18,
@@ -1729,161 +1738,163 @@
0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18,
0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12,
0x18, 0x0a, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03,
- 0x52, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x22, 0x33, 0x0a, 0x14, 0x49, 0x6e, 0x73,
- 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+ 0x52, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x6f, 0x72,
+ 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a,
+ 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x44, 0x69, 0x72, 0x22, 0x33, 0x0a, 0x14, 0x49, 0x6e,
+ 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
+ 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18,
+ 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x64, 0x22,
+ 0x17, 0x0a, 0x15, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x6c, 0x69, 0x76, 0x65,
+ 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa6, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73,
+ 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01,
- 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x64, 0x22, 0x17,
- 0x0a, 0x15, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x52,
- 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa6, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74,
- 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
- 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,
- 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x64, 0x12, 0x1c, 0x0a,
- 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
- 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x72,
- 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09,
- 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x6b, 0x69,
- 0x70, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x73,
- 0x6b, 0x69, 0x70, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x69, 0x67, 0x65,
- 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74,
- 0x22, 0x31, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72,
- 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x74,
- 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72,
- 0x69, 0x65, 0x73, 0x22, 0x16, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61,
- 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x47, 0x0a, 0x15, 0x4c,
- 0x69, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70,
- 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65,
- 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73,
- 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61,
- 0x6e, 0x63, 0x65, 0x73, 0x22, 0x50, 0x0a, 0x13, 0x52, 0x65, 0x61, 0x64, 0x54, 0x47, 0x5a, 0x54,
- 0x6f, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67,
- 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,
- 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65,
- 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72,
- 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x28, 0x0a, 0x14, 0x52, 0x65, 0x61, 0x64, 0x54, 0x47,
- 0x5a, 0x54, 0x6f, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x64, 0x12, 0x1c,
+ 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1c, 0x0a, 0x09,
+ 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52,
+ 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x6b,
+ 0x69, 0x70, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09,
+ 0x73, 0x6b, 0x69, 0x70, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x69, 0x67,
+ 0x65, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73,
+ 0x74, 0x22, 0x31, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f,
+ 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e,
+ 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x65, 0x6e, 0x74,
+ 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x74,
+ 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x47, 0x0a, 0x15,
+ 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73,
+ 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63,
+ 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x73, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x09, 0x69, 0x6e, 0x73, 0x74,
+ 0x61, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x50, 0x0a, 0x13, 0x52, 0x65, 0x61, 0x64, 0x54, 0x47, 0x5a,
+ 0x54, 0x6f, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09,
+ 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x08, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72,
+ 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x69,
+ 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x28, 0x0a, 0x14, 0x52, 0x65, 0x61, 0x64, 0x54,
+ 0x47, 0x5a, 0x54, 0x6f, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
+ 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72,
+ 0x6c, 0x22, 0x47, 0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73,
+ 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x6f, 0x6d, 0x6f, 0x74,
+ 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x6f, 0x6d, 0x6f,
+ 0x74, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20,
+ 0x03, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x74, 0x68, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x52, 0x65,
+ 0x6d, 0x6f, 0x76, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+ 0x65, 0x22, 0x56, 0x0a, 0x11, 0x53, 0x69, 0x67, 0x6e, 0x53, 0x53, 0x48, 0x4b, 0x65, 0x79, 0x52,
+ 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65,
+ 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x6f, 0x6d, 0x6f, 0x74,
+ 0x65, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x73, 0x73,
+ 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x70, 0x75, 0x62,
+ 0x6c, 0x69, 0x63, 0x53, 0x73, 0x68, 0x4b, 0x65, 0x79, 0x22, 0x47, 0x0a, 0x12, 0x53, 0x69, 0x67,
+ 0x6e, 0x53, 0x53, 0x48, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
+ 0x31, 0x0a, 0x15, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63,
+ 0x5f, 0x73, 0x73, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12,
+ 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x53, 0x73, 0x68, 0x4b,
+ 0x65, 0x79, 0x22, 0x13, 0x0a, 0x11, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65,
+ 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xc2, 0x01, 0x0a, 0x12, 0x55, 0x70, 0x6c, 0x6f,
+ 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10,
0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c,
- 0x22, 0x47, 0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52,
- 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65,
- 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x6f, 0x6d, 0x6f, 0x74,
- 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03,
- 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x74, 0x68, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x52, 0x65, 0x6d,
- 0x6f, 0x76, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
- 0x22, 0x56, 0x0a, 0x11, 0x53, 0x69, 0x67, 0x6e, 0x53, 0x53, 0x48, 0x4b, 0x65, 0x79, 0x52, 0x65,
- 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x5f,
- 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65,
- 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x73, 0x73, 0x68,
- 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x70, 0x75, 0x62, 0x6c,
- 0x69, 0x63, 0x53, 0x73, 0x68, 0x4b, 0x65, 0x79, 0x22, 0x47, 0x0a, 0x12, 0x53, 0x69, 0x67, 0x6e,
- 0x53, 0x53, 0x48, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31,
- 0x0a, 0x15, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f,
- 0x73, 0x73, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, 0x73,
- 0x69, 0x67, 0x6e, 0x65, 0x64, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x53, 0x73, 0x68, 0x4b, 0x65,
- 0x79, 0x22, 0x13, 0x0a, 0x11, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x52,
- 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xc2, 0x01, 0x0a, 0x12, 0x55, 0x70, 0x6c, 0x6f, 0x61,
- 0x64, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a,
- 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12,
- 0x3e, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32,
- 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46,
- 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x46, 0x69, 0x65, 0x6c,
- 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12,
- 0x1f, 0x0a, 0x0b, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03,
- 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65,
- 0x1a, 0x39, 0x0a, 0x0b, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12,
- 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65,
- 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
- 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x78, 0x0a, 0x17, 0x57,
- 0x72, 0x69, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x55, 0x52, 0x4c, 0x52,
- 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65,
- 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x6f, 0x6d, 0x6f, 0x74,
- 0x65, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
- 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d,
- 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d,
- 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x07, 0x52,
- 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x57, 0x72, 0x69, 0x74, 0x65, 0x46, 0x69,
- 0x6c, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
- 0x65, 0x22, 0x65, 0x0a, 0x16, 0x57, 0x72, 0x69, 0x74, 0x65, 0x54, 0x47, 0x5a, 0x46, 0x72, 0x6f,
- 0x6d, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67,
- 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,
- 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18,
- 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69,
- 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64,
- 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x19, 0x0a, 0x17, 0x57, 0x72, 0x69, 0x74,
- 0x65, 0x54, 0x47, 0x5a, 0x46, 0x72, 0x6f, 0x6d, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f,
- 0x6e, 0x73, 0x65, 0x32, 0xed, 0x08, 0x0a, 0x0d, 0x47, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x65,
- 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4b, 0x0a, 0x0c, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74,
- 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x41,
- 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
- 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68,
- 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
- 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72,
- 0x61, 0x70, 0x12, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x42,
- 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
- 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x42, 0x6f, 0x6f, 0x74,
- 0x73, 0x74, 0x72, 0x61, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12,
- 0x53, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63,
- 0x65, 0x12, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74,
- 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
- 0x1a, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
- 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
- 0x22, 0x00, 0x30, 0x01, 0x12, 0x54, 0x0a, 0x0f, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x49,
- 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73,
- 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65,
- 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73,
- 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65,
- 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x53, 0x0a, 0x0e, 0x45, 0x78,
- 0x65, 0x63, 0x75, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x1d, 0x2e, 0x70,
+ 0x12, 0x3e, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,
+ 0x32, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64,
+ 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x46, 0x69, 0x65,
+ 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73,
+ 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18,
+ 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d,
+ 0x65, 0x1a, 0x39, 0x0a, 0x0b, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79,
+ 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b,
+ 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x78, 0x0a, 0x17,
+ 0x57, 0x72, 0x69, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x55, 0x52, 0x4c,
+ 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x6f, 0x6d, 0x6f, 0x74,
+ 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x6f, 0x6d, 0x6f,
+ 0x74, 0x65, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61,
+ 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61,
+ 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x07,
+ 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x57, 0x72, 0x69, 0x74, 0x65, 0x46,
+ 0x69, 0x6c, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+ 0x73, 0x65, 0x22, 0x65, 0x0a, 0x16, 0x57, 0x72, 0x69, 0x74, 0x65, 0x54, 0x47, 0x5a, 0x46, 0x72,
+ 0x6f, 0x6d, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09,
+ 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x08, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c,
+ 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x64,
+ 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09,
+ 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x19, 0x0a, 0x17, 0x57, 0x72, 0x69,
+ 0x74, 0x65, 0x54, 0x47, 0x5a, 0x46, 0x72, 0x6f, 0x6d, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70,
+ 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xed, 0x08, 0x0a, 0x0d, 0x47, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x53,
+ 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4b, 0x0a, 0x0c, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e,
+ 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e,
+ 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75,
+ 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x41, 0x75, 0x74,
+ 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+ 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74,
+ 0x72, 0x61, 0x70, 0x12, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64,
+ 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+ 0x1a, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x42, 0x6f, 0x6f,
+ 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00,
+ 0x12, 0x53, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e,
+ 0x63, 0x65, 0x12, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61,
+ 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+ 0x74, 0x1a, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74,
+ 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+ 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x54, 0x0a, 0x0f, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79,
+ 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x73, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63,
+ 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x73, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63,
+ 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x53, 0x0a, 0x0e, 0x45,
+ 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x1d, 0x2e,
+ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x43, 0x6f,
+ 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x70,
0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x43, 0x6f, 0x6d,
- 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x70, 0x72,
- 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d,
- 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12,
- 0x4e, 0x0a, 0x0d, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x6c, 0x69, 0x76, 0x65,
- 0x12, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e,
- 0x63, 0x65, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d,
- 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65,
- 0x41, 0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12,
- 0x4e, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79,
- 0x12, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x69,
- 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d,
- 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x69, 0x72, 0x65,
- 0x63, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12,
- 0x4e, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73,
- 0x12, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e,
- 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d,
- 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x74,
- 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12,
- 0x4b, 0x0a, 0x0c, 0x52, 0x65, 0x61, 0x64, 0x54, 0x47, 0x5a, 0x54, 0x6f, 0x55, 0x52, 0x4c, 0x12,
- 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x54, 0x47, 0x5a,
- 0x54, 0x6f, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x70,
- 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x54, 0x47, 0x5a, 0x54, 0x6f, 0x55,
- 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0b,
- 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x70, 0x72,
- 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73,
- 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73,
- 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70,
- 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0a, 0x53, 0x69, 0x67, 0x6e, 0x53, 0x53,
- 0x48, 0x4b, 0x65, 0x79, 0x12, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x53, 0x69,
- 0x67, 0x6e, 0x53, 0x53, 0x48, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
- 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x53, 0x53, 0x48,
- 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a,
- 0x0a, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x19, 0x2e, 0x70, 0x72,
- 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x52,
- 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e,
- 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
- 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x10, 0x57, 0x72, 0x69, 0x74, 0x65, 0x46, 0x69, 0x6c,
- 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x55, 0x52, 0x4c, 0x12, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
- 0x73, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x55,
- 0x52, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+ 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01,
+ 0x12, 0x4e, 0x0a, 0x0d, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x6c, 0x69, 0x76,
+ 0x65, 0x12, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61,
+ 0x6e, 0x63, 0x65, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+ 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63,
+ 0x65, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00,
+ 0x12, 0x4e, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72,
+ 0x79, 0x12, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44,
+ 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+ 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x69, 0x72,
+ 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00,
+ 0x12, 0x4e, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65,
+ 0x73, 0x12, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49,
+ 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+ 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x73,
+ 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00,
+ 0x12, 0x4b, 0x0a, 0x0c, 0x52, 0x65, 0x61, 0x64, 0x54, 0x47, 0x5a, 0x54, 0x6f, 0x55, 0x52, 0x4c,
+ 0x12, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x54, 0x47,
+ 0x5a, 0x54, 0x6f, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e,
+ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x54, 0x47, 0x5a, 0x54, 0x6f,
+ 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a,
+ 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x70,
+ 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x46, 0x69, 0x6c, 0x65,
+ 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x73, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73,
+ 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0a, 0x53, 0x69, 0x67, 0x6e, 0x53,
+ 0x53, 0x48, 0x4b, 0x65, 0x79, 0x12, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x53,
+ 0x69, 0x67, 0x6e, 0x53, 0x53, 0x48, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+ 0x1a, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x53, 0x53,
+ 0x48, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45,
+ 0x0a, 0x0a, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x19, 0x2e, 0x70,
+ 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65,
+ 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73,
+ 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f,
+ 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x10, 0x57, 0x72, 0x69, 0x74, 0x65, 0x46, 0x69,
+ 0x6c, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x55, 0x52, 0x4c, 0x12, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74,
0x6f, 0x73, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x46, 0x72, 0x6f, 0x6d,
- 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a,
- 0x0f, 0x57, 0x72, 0x69, 0x74, 0x65, 0x54, 0x47, 0x5a, 0x46, 0x72, 0x6f, 0x6d, 0x55, 0x52, 0x4c,
- 0x12, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x54,
- 0x47, 0x5a, 0x46, 0x72, 0x6f, 0x6d, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
- 0x1a, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x54,
- 0x47, 0x5a, 0x46, 0x72, 0x6f, 0x6d, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
- 0x65, 0x22, 0x00, 0x42, 0x2b, 0x5a, 0x29, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72,
- 0x67, 0x2f, 0x78, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e,
- 0x61, 0x6c, 0x2f, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73,
- 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+ 0x55, 0x52, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x73, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x46, 0x72, 0x6f,
+ 0x6d, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54,
+ 0x0a, 0x0f, 0x57, 0x72, 0x69, 0x74, 0x65, 0x54, 0x47, 0x5a, 0x46, 0x72, 0x6f, 0x6d, 0x55, 0x52,
+ 0x4c, 0x12, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65,
+ 0x54, 0x47, 0x5a, 0x46, 0x72, 0x6f, 0x6d, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+ 0x74, 0x1a, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65,
+ 0x54, 0x47, 0x5a, 0x46, 0x72, 0x6f, 0x6d, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+ 0x73, 0x65, 0x22, 0x00, 0x42, 0x2b, 0x5a, 0x29, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f,
+ 0x72, 0x67, 0x2f, 0x78, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+ 0x6e, 0x61, 0x6c, 0x2f, 0x67, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (
diff --git a/internal/gomote/protos/gomote.proto b/internal/gomote/protos/gomote.proto
index 6c864d7..ffe24d3 100644
--- a/internal/gomote/protos/gomote.proto
+++ b/internal/gomote/protos/gomote.proto
@@ -138,6 +138,8 @@
// The timestamp for when the builder instance will expire. It is
// represented in Unix epoch time format.
int64 expires = 4;
+ // The working directory of the instance.
+ string working_dir = 5;
}
// InstanceAliveRequest specifies the data needed to check the liveness of a gomote instance.
diff --git a/internal/gomote/protos/gomote_grpc.pb.go b/internal/gomote/protos/gomote_grpc.pb.go
index 423e43f..eb7ec05 100644
--- a/internal/gomote/protos/gomote_grpc.pb.go
+++ b/internal/gomote/protos/gomote_grpc.pb.go
@@ -1,4 +1,8 @@
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.2.0
+// - protoc v3.12.4
+// source: gomote.proto
package protos
diff --git a/internal/iapclient/iapclient.go b/internal/iapclient/iapclient.go
index 955f90d..1f28683 100644
--- a/internal/iapclient/iapclient.go
+++ b/internal/iapclient/iapclient.go
@@ -12,6 +12,7 @@
import (
"context"
+ "crypto/tls"
"encoding/json"
"fmt"
"io"
@@ -19,9 +20,13 @@
"net/url"
"os"
"path/filepath"
+ "strings"
"golang.org/x/oauth2"
"golang.org/x/oauth2/google"
+ "google.golang.org/grpc"
+ "google.golang.org/grpc/credentials"
+ "google.golang.org/grpc/credentials/oauth"
)
var gomoteConfig = &oauth2.Config{
@@ -116,6 +121,21 @@
return oauth2.NewClient(ctx, ts), nil
}
+// GRPCClient returns a *gprc.ClientConn that can access Go's IAP-protected
+// servers. It will prompt for login if necessary.
+func GRPCClient(ctx context.Context, addr string) (*grpc.ClientConn, error) {
+ ts, err := TokenSource(ctx)
+ if err != nil {
+ return nil, err
+ }
+ opts := []grpc.DialOption{
+ grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{InsecureSkipVerify: strings.HasPrefix(addr, "localhost:")})),
+ grpc.WithDefaultCallOptions(grpc.PerRPCCredentials(oauth.TokenSource{TokenSource: ts})),
+ grpc.WithBlock(),
+ }
+ return grpc.DialContext(ctx, addr, opts...)
+}
+
type jwtTokenSource struct {
conf *oauth2.Config
audience string
diff --git a/internal/relui/buildrelease_test.go b/internal/relui/buildrelease_test.go
index 2c6beef..68a2d17 100644
--- a/internal/relui/buildrelease_test.go
+++ b/internal/relui/buildrelease_test.go
@@ -615,7 +615,7 @@
logs map[string][]*[]string
}
-func (b *fakeBuildlets) createBuildlet(kind string) (buildlet.Client, error) {
+func (b *fakeBuildlets) createBuildlet(kind string) (buildlet.RemoteClient, error) {
b.mu.Lock()
buildletDir := filepath.Join(b.dir, kind, fmt.Sprint(b.nextID))
logs := &[]string{}
diff --git a/internal/relui/workflows.go b/internal/relui/workflows.go
index 7dadbbb..6f8f18d 100644
--- a/internal/relui/workflows.go
+++ b/internal/relui/workflows.go
@@ -611,7 +611,7 @@
ScratchURL, ServingURL string
DownloadURL string
PublishFile func(*WebsiteFile) error
- CreateBuildlet func(string) (buildlet.Client, error)
+ CreateBuildlet func(string) (buildlet.RemoteClient, error)
ApproveAction func(*wf.TaskContext) error
}
diff --git a/internal/task/buildrelease.go b/internal/task/buildrelease.go
index 0a93f12..f79a216 100644
--- a/internal/task/buildrelease.go
+++ b/internal/task/buildrelease.go
@@ -215,7 +215,7 @@
type BuildletStep struct {
Target *releasetargets.Target
- Buildlet buildlet.Client
+ Buildlet buildlet.RemoteClient
BuildConfig *dashboard.BuildConfig
LogWriter io.Writer
}
To view, visit change 422095. To unsubscribe, or for help writing mail filters, visit settings.