Import changes for goma server
- 789ec76a29be461d2540cfffd5e7c8fd328dc5fb fix comment in client_test.go
- ebdafab25a0aa2e3288c4bac9b999dd59d2290b9 roll protobuf to 3.15.3
- 68344beac18e53d32cc3b88796183d7c93bb7ce8 roll google.golang.org/grpc v1.35.0 -> v1.36.0
- 6ce702757773f450ba4d385ba941965e256c63a9 roll go.opencensus.io v0.22.6 -> v0.23.0
- 5ecf072d5be9f06cf5058a9bd7059259fddcee7f goma: run `go mod tidy` after `go mod download`
- 167b599f0ca341f4a10cc6cf0bae01004880fb93 remoteexec: report unknown flag
- dba9fd3ea0f9246412be2a54b1fa4f5a8563f552 roll protobuf to 3.15.2
- 108b036bc2feb66c7855fd0fd5f9eea52c5b9077 roll cloud.google.com/go v0.77.0 -> v0.78.0
- 8f3dcc059e2b0130ac89d44a5e900b4ec2d58af2 remoteexec: reply bad request, not server error
- d28559ecc519b2edf9e8530af90ab0ee447ad71a removeexec: handle /winsysroot
- 2813d2f262a81a2682ad10660b2cc24095a97ba1 roll protobuf to 3.15.1
- 9c0dadc70b9b7f85a9c728734560d697e043a15a roll protobuf to 3.15.0
- d69b3fa8e8dd235627958ba368140e77ad95166b roll protobuf to 3.14.0
- db97f563d224ed1d7fb6bacb86ef112dc3e19bb7 roll github.com/gomodule/redigo v1.8.3 -> v1.8.4
- 15fef80788328268a2183510b236fbecb3bef639 use go 1.16
- 9cd4a0bf106f6d300dc4acdc5210722b701dcd49 roll cloud.google.com/go v0.76.0 -> v0.77.0
- ea1fc6c5698322bad81fde5a35ffa23ab4bcd6da remoteexec: don't disable hardening for symlink
- 6749dca7c476758e3f03bb347354b1674764405a fix nsjail seccomp filter for pnacl-clang++
- bf23cfeffe67b132c66e6114956dbf01acf67131 fix nsjail seccomp filter for x86_64-nacl-clang++
- 5d407616252431bdaa96e73cfda90db4d2df592f remoteexec: disable hardening for known commands
- e22615c908911ff94f9a035ddf9444ca78f225ba execlog: record local_*_time
- d7698c3c7b318d8a57b0defb31bb7d21114931bf roll google.golang.org/api v0.39.0 -> v0.40.0
- d71ba3ca4549a1d818c4023028869c8874ff64c6 export more stats from execlog
- 059fd8890f7b913fcb5ec38b5a4d723708e941ed roll contrib.go.opencensus.io/exporter/stackdriver v0.13....
- 81e31abf0182addfa9f518466538a12843339f5e roll cloud.google.com/go/pubsub v1.9.1 -> v1.10.0
- 2595d5118ab57cd9736c0791245507f9f1453e20 roll google.golang.org/api v0.38.0 -> v0.39.0
- f715447946a7d37f11e0ee7815e77e64429afc2f roll go.opencensus.io v0.22.5 -> v0.22.6
- 11b6fb88d1b628df1158a70060d5ff10ea988306 roll github.com/google/uuid v1.1.2 -> v1.2.0
- 1f6f030412262a5d04544a0117c5a8a850316b63 roll github.com/gomodule/redigo v1.8.2 -> v1.8.3
- 3d7be7d8969a96958db64a50b2d3dd38df3709b0 roll cloud.google.com/go/storage v1.12.0 -> v1.13.0
- 80cfbd8e8c9db4aa727c475707b6df661a652a8c roll cloud.google.com/go/pubsub v1.8.2 -> v1.9.1
- 4dfded4abf00d22dd9387140c13152126477c044 roll cloud.google.com/go v0.71.0 -> v0.76.0
- 569662a8d1f2fb97f88f36c3e36c2e69af7538cc use go 1.15.8
- 83b0d00fd1766e0302257634c3c4a6fb5bc7fa12 Allow 'cache-silo' as the platform property key
- 4954de2bcc4b9978219240e8d337b4d50fc79c1b fix nsjail seccomp filter
- 2c7855a0c8b51b0d40ef87b1615d3cfe9e9c556c distinguish runtime: nsjail-chroot and nsjail
- 7605ba494acbba5000045e36b228ddb5ce0caca3 fix nsjail.cfg
- 6b51c40324bd82420b036dd69964538f17f9ed94 Reland "inexpensive hardening by nsjail (seccomp-bpf)"
- bdfc81a2b9f88989526c29b271b346a4cc54d2bd Revert "inexpensive hardening by nsjail (seccomp-bpf)"
- d4fece1673c00514b5a8a657a68b8686e780d4d3 inexpensive hardening by nsjail (seccomp-bpf)
- c2aae6e4eb3a2b0d85d7e8fe15d9bcba7cdce271 execlog: export cache_hit tag
- 8aa77b857aca1af3280541ee4b737bbceed03b6f remoteexec: return unauthenticated of outputs
- 3b83700213039f28413bdbbc505ce0f2d2e9c774 use go 1.15.7
- ace47ad447b37d8421146bf3ed5d65b9b5699394 exec: fix api-error log
- 43a9d54d55ff9736c132f12e33ba2e9bc9df61ce exec: log api-error
- da01aab603dae90305a5a3a911ef96553d3937fa use go 1.15.6
- d98544c80efde58fde08bc311ffd96534a88602c backend: fix log message
- 5cb00c7d11a219d62716ca400563b208befd434e remoteexec: use user specified exec_root and platform pro...
- 05e41f7e583be586446b58d6893f93b905fb1e81 Expose cache hit/miss metric
- b97de93783107c45e7a682246a4621b22f888544 auth: don't cache context error of check group
- 81db8d99fff4f8a66ac35725187b8dc7cd4bde3e Add dashboard setting files
- 8e76e461279083d0a1d8bd692c529e1064b645c8 server: fix keepalive
- 9897ca742639b0bdc5734438f61ea45dc5f5600f remoteexec: ignore environment variables for clang-cl rel...
- 80bf8c20a7159c89f3654f2c202782bbf954f5a6 backend: don't specify max_concurrent_streams_low_watermark
- a0ddb057e63f9694b81df5256cc3800537388e95 Mark -Wa,--fatal-warnings as relocatable
- 49d5d5b8cf566b14fac126fec4686e6efec6c8cc backend: remote uses remote-apis-sdks grpc balancer.
- ce907cb9278c4b89a0d844d76837733a5ce90fef httprpc: increase timeout
- c46a4f8b8696944eaee23157d3fef6c13d31c196 redis: make max number of idle/active connections configu...
- 29a6b80deac9a48446dcb070f6eb00297cbf7c2f Revert "enable grpc compression"
- 2289ee211830cc1908d607f4098bb5891efdf33e cas: when failed to upload blobs, set it as missing inputs
- ae6a505cce8431662bdf44a7bfe44798450c2544 remoteexec: don't retry with FailedPrecondition
- 0679e405156fbfbeb360dc279763e3a2f61a8bb1 remoteexec: raise timeout of input
- 04552c369a1d9280998a4914d57c6d2f00b8c70b execlog: export os_family key for execlog/requests, handl...
- dcbb5c8e1b822739ed04d7abaed115968d98819b use go 1.15.5
- 1e7e0220191c19617a993ad98a53c9d3546e6f5a server: enable grpc compression inside GKE
- fdb4ebda473020b0b1f01d1d330131fadd70ff0b execlog_server emits metrics from ExecLog
- 61d2a8150c4aecc64e4a54b2cb268f3f41aa2608 fix typo in default instance name
- 1ed0a4fb213b53700deaca985dc6323e0d7470f0 enable grpc compression
- 365db0d525c4e2bc1085d40c9aefa6419d0f13a0 k8s: use east_instance in us-east1-1
- 5b9f5e2e1e2aa60a1ad9c1fa867f82a06a1e22e2 add acl in toolchain
- d74bf121a0508e242afcf5bde664e528bda6fa68 remoteexec: assume 4MB/s for output
- 50a55c467ff9014ad2d42d4e4818d8ff7ad4c449 roll google.golang.org/grpc v1.33.1 -> v1.33.2
- d507cfbfb0e40c7707f7e152a1987ca2a6842926 Add -additional-tls-certificate to add a root cert
- 788934cfc14369368a1f43114487c8c286188665 use go 1.15.4
- 3b55f37dd68a14012b3eab6a767f782368679537 roll google.golang.org/api v0.34.0 -> v0.35.0
- 4de9f623236bb1b4ca5c82e1ec8c5d04856aab2b roll cloud.google.com/go/pubsub v1.8.1 -> v1.8.2
- c6f49d0725405322534c99aa6145efdfcbfb67b4 roll cloud.google.com/go v0.69.1 -> v0.71.0
- 6d7627995fd166d0007f9a69e9330871d4ad6d2e auth: set 3 sec timeout to access authdb
- e16437249f1b50d9c1bdd93c12beaffa65247cc1 Reland "roll cloud.google.com/go v0.68.0 -> v0.69.1"
- 9e8abe8ebb7d8b91107d3b41ca3fed827831f31d Reland "roll go.opencensus.io v0.22.4 -> v0.22.5"
- c8bf7db863321ae200676ea6ec36b15fbcbef163 Revert "roll cloud.google.com/go v0.68.0 -> v0.69.1"
- 7be533cb19c2a4a98bbc2517b68f2e65380ce9b8 Revert "roll go.opencensus.io v0.22.4 -> v0.22.5"
- 6ac746102c046530c289a9a029a597d994ed3765 Revert "use one redis conn per ExecReq"
- d680a1b9184ca6542a9db4e53a173898dc4743bb use go 1.15.3
- 318622046bce4819de177f1bbd8f158a61e0c8ba use one redis conn per ExecReq
- 27837a44f763190a6205c3e14f9938a534636b66 roll github.com/golang/protobuf v1.4.2 -> v1.4.3
- 46388efb73fa6240e86d384675cb508ae6ba1455 roll cloud.google.com/go v0.68.0 -> v0.69.1
- 280e25a5ff68c6cdd507e025c6c5fcfd0e4c381c remoteexec: record client retries
- a74eb41e7ab82c27955f440e22063314270d8d16 redis stress test
- bffab0ef448876cac055d01a55c4d315dbb5eea2 roll google.golang.org/api v0.32.0 -> v0.33.0
- 2c5891031f0d77449acbf22c0d08ebb0b87793cd remoteexec: make span timeout configurable
- a0f2f1cdf4d894fec6360b15837c12be46ef2569 remoteexec: dynamically sets timeout to fetch output file
- 86130a48f3de1ae6c21d7b2ed1c3d8147c03ce2b Mark -mllvm -enable-dse-memoryssa={true,false} as relocat...
- a09ac0418d373bc48bf228c9359fc6e94f521fda roll go.opencensus.io v0.22.4 -> v0.22.5
- bd2bdb37b41b5cec97a91fc9d2f81740392eee0e roll cloud.google.com/go/pubsub v1.6.2 -> v1.8.1
- 8e2369cd47db09a74cf16d6e7862e715d2581680 roll cloud.google.com/go v0.66.0 -> v0.68.0
- 94e8e5d88b4c6b42d0dc85cff3ec86a32208d928 redis: log for long wait for pool
- e509e210bcb4eb2fdb5a5dc8cb29689bb9ac840b redis: Pool wait in client.
- d7e22538e48d83a98c342b6013a8ef1b8363b47f remotexec: log Adapter.Exec error
- b917d702a7901f5f15920f1ce3c5663f1039e950 redis: don't use Pool.Wait=true
(And 21 more changes)
TBR=yyanagisawa@google.com, yekuang@google.com
GitOrigin-RevId: 789ec76a29be461d2540cfffd5e7c8fd328dc5fb
Change-Id: Id8b1860d617100a593460e6d624598c4bbada41b
diff --git a/auth/acl/checker.go b/auth/acl/checker.go
index 6d787cf..dc48b20 100644
--- a/auth/acl/checker.go
+++ b/auth/acl/checker.go
@@ -14,6 +14,7 @@
"golang.org/x/oauth2"
"google.golang.org/grpc"
"google.golang.org/grpc/codes"
+ "google.golang.org/grpc/status"
"go.chromium.org/goma/server/auth"
"go.chromium.org/goma/server/auth/account"
@@ -119,6 +120,11 @@
logger.Debugf("group:%s use service account:%s", g.Id, g.ServiceAccount)
return g.Id, saToken, nil
}
+ if ctx.Err() != nil {
+ err := status.FromContextError(ctx.Err()).Err()
+ logger.Errorf("acl check context error: %v", err)
+ return "", nil, err
+ }
logger.Errorf("no acl match")
return "", nil, grpc.Errorf(codes.PermissionDenied, "access rejected")
}
diff --git a/auth/authdb/client.go b/auth/authdb/client.go
index 680ef22..1a58f7b 100644
--- a/auth/authdb/client.go
+++ b/auth/authdb/client.go
@@ -6,6 +6,7 @@
import (
"context"
+ "time"
"go.chromium.org/goma/server/httprpc"
"go.chromium.org/goma/server/log"
@@ -28,6 +29,8 @@
}
resp := &pb.CheckMembershipResp{}
err := rpc.Retry{}.Do(ctx, func() error {
+ ctx, cancel := context.WithTimeout(ctx, 3*time.Second)
+ defer cancel()
return c.Client.Call(ctx, req, resp)
})
if err != nil {
diff --git a/auth/service.go b/auth/service.go
index 7464a34..c629fa2 100644
--- a/auth/service.go
+++ b/auth/service.go
@@ -123,19 +123,28 @@
te.Group, te.Token, err = s.checkToken(ctx, token, te.TokenInfo)
if err != nil {
te.TokenInfo.Err = err
+ // set 30 seconds negative cache (rejected user / wrong config).
+ // more than exiryDelta (10 secs)
+ // less than client ping timeout.
+ te.TokenInfo.ExpiresAt = time.Now().Add(30 * time.Second)
}
if te.Token != nil && !te.Token.Expiry.IsZero() && te.Token.Expiry.Before(te.TokenInfo.ExpiresAt) {
te.TokenInfo.ExpiresAt = te.Token.Expiry
}
}
- go s.scheduledRun(expiryTime(te.TokenInfo.ExpiresAt), func() {
+ switch status.Code(te.TokenInfo.Err) {
+ case codes.OK, codes.PermissionDenied, codes.Internal:
+ go s.scheduledRun(expiryTime(te.TokenInfo.ExpiresAt), func() {
+ s.mu.Lock()
+ delete(s.tokenCache, k)
+ s.mu.Unlock()
+ })
s.mu.Lock()
- delete(s.tokenCache, k)
+ s.tokenCache[k] = te
s.mu.Unlock()
- })
- s.mu.Lock()
- s.tokenCache[k] = te
- s.mu.Unlock()
+ default:
+ // don't cache other error data.
+ }
return te, nil
})
if err != nil {
diff --git a/backend/mixer.go b/backend/mixer.go
index cb59991..254853c 100644
--- a/backend/mixer.go
+++ b/backend/mixer.go
@@ -28,7 +28,7 @@
case *pb.BackendMapping_Remote:
return FromRemoteBackend(ctx, be.Remote, opt)
case nil:
- return nil, func() {}, fmt.Errorf("no backend for %s", groupId)
+ return nil, func() {}, fmt.Errorf("no backend for group:%q", groupId)
default:
return nil, func() {}, fmt.Errorf("unknown type in %s: %T", groupId, cfg.Backend)
}
@@ -169,7 +169,7 @@
q := req.URL.Query()
backend, found := m.selectBackend(ctx, user.Group, q)
if !found {
- logger.Errorf("no backend config for %s %s", user.Group, q.Encode())
+ logger.Errorf("no backend config for group:%q query:%q", user.Group, q.Encode())
http.Error(w, "no backend config", http.StatusInternalServerError)
return
}
diff --git a/backend/remote.go b/backend/remote.go
index f6352f3..dc429e7 100644
--- a/backend/remote.go
+++ b/backend/remote.go
@@ -12,12 +12,16 @@
"strings"
"time"
+ "github.com/bazelbuild/remote-apis-sdks/go/pkg/balancer"
+ bpb "github.com/bazelbuild/remote-apis-sdks/go/pkg/balancer/proto"
+ "github.com/bazelbuild/remote-apis-sdks/go/pkg/client"
"go.opencensus.io/plugin/ocgrpc"
bspb "google.golang.org/genproto/googleapis/bytestream"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
"google.golang.org/grpc/keepalive"
+ "go.chromium.org/goma/server/log"
pb "go.chromium.org/goma/server/proto/backend"
execpb "go.chromium.org/goma/server/proto/exec"
execlogpb "go.chromium.org/goma/server/proto/execlog"
@@ -27,12 +31,41 @@
// FromRemoteBackend creates new GRPC from cfg.
// returned func would release resources associated with GRPC.
func FromRemoteBackend(ctx context.Context, cfg *pb.RemoteBackend, opt Option) (GRPC, func(), error) {
- conn, err := grpc.DialContext(ctx, cfg.Address,
+ logger := log.FromContext(ctx)
+ opts := []grpc.DialOption{
grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{})),
grpc.WithStatsHandler(&ocgrpc.ClientHandler{}),
grpc.WithKeepaliveParams(keepalive.ClientParameters{
Time: 10 * time.Second,
- }))
+ }),
+ }
+ // TODO: configurable?
+ // use the same default as re-client (remote-apis-sdks).
+ // but don't set MaxConcurrentStreamsLowWatermark not to
+ // open more connections to avoid "Too many open files" error
+ // in nginx. crbug.com/1151576
+ ac := &bpb.ApiConfig{
+ ChannelPool: &bpb.ChannelPoolConfig{
+ MaxSize: client.DefaultMaxConcurrentRequests,
+ },
+ Method: []*bpb.MethodConfig{
+ {
+ Name: []string{".*"},
+ Affinity: &bpb.AffinityConfig{
+ Command: bpb.AffinityConfig_BIND,
+ AffinityKey: "bind-affinity",
+ },
+ },
+ },
+ }
+ logger.Infof("api_config=%s", ac)
+ grpcInt := balancer.NewGCPInterceptor(ac)
+ opts = append(opts,
+ grpc.WithBalancerName(balancer.Name),
+ grpc.WithUnaryInterceptor(grpcInt.GCPUnaryClientInterceptor),
+ grpc.WithStreamInterceptor(grpcInt.GCPStreamClientInterceptor))
+
+ conn, err := grpc.DialContext(ctx, cfg.Address, opts...)
if err != nil {
return GRPC{}, func() {}, err
}
diff --git a/cache/redis/client.go b/cache/redis/client.go
index 40bae91..66203cc 100644
--- a/cache/redis/client.go
+++ b/cache/redis/client.go
@@ -11,10 +11,14 @@
"net"
"os"
"syscall"
+ "time"
"github.com/gomodule/redigo/redis"
"google.golang.org/grpc"
+ "google.golang.org/grpc/codes"
+ "google.golang.org/grpc/status"
+ "go.chromium.org/goma/server/log"
pb "go.chromium.org/goma/server/proto/cache"
"go.chromium.org/goma/server/rpc"
)
@@ -23,6 +27,9 @@
type Client struct {
prefix string
pool *redis.Pool
+
+ // to workaround pool.wait. maintain active conns.
+ sema chan struct{}
}
// AddrFromEnv returns redis server address from environment variables.
@@ -38,18 +45,39 @@
return fmt.Sprintf("%s:%s", host, port), nil
}
+// Opts is redis client option.
+type Opts struct {
+ // Prefix is key prefix used by the client.
+ Prefix string
+
+ // MaxIdleConns is max number of idle connections.
+ MaxIdleConns int
+
+ // MaxActiveConns is max number of active connections.
+ MaxActiveConns int
+}
+
+// default max number of connections.
+// note: in GCP, redis quota is 65,000
+const (
+ DefaultMaxIdleConns = 50
+ DefaultMaxActiveConns = 200
+)
+
// NewClient creates new cache client for redis.
-func NewClient(ctx context.Context, addr, prefix string) Client {
+func NewClient(ctx context.Context, addr string, opts Opts) Client {
return Client{
- prefix: prefix,
+ prefix: opts.Prefix,
pool: &redis.Pool{
- Dial: func() (redis.Conn, error) {
- return redis.Dial("tcp", addr)
+ DialContext: func(ctx context.Context) (redis.Conn, error) {
+ return redis.DialContext(ctx, "tcp", addr)
},
- MaxIdle: 10,
- MaxActive: 200,
- Wait: true,
+ MaxIdle: opts.MaxIdleConns,
+ MaxActive: opts.MaxActiveConns,
+ // https://github.com/gomodule/redigo/issues/520
+ Wait: false,
},
+ sema: make(chan struct{}, opts.MaxActiveConns),
}
}
@@ -79,6 +107,9 @@
// retryErr converts err to rpc.RetriableError if it is retriable error.
func retryErr(err error) error {
+ if errors.Is(err, redis.ErrNil) {
+ return status.Error(codes.NotFound, err.Error())
+ }
// retriable if temporary error.
if terr, ok := err.(temporary); ok && terr.Temporary() {
return rpc.RetriableError{
@@ -99,9 +130,47 @@
return err
}
+type activeConn struct {
+ redis.Conn
+ c Client
+}
+
+func (c activeConn) Close() error {
+ <-c.c.sema
+ return c.Conn.Close()
+}
+
+func (c Client) poolGetContext(ctx context.Context) (redis.Conn, error) {
+ t := time.Now()
+ select {
+ case c.sema <- struct{}{}:
+ d := time.Since(t)
+ if d > 100*time.Millisecond {
+ logger := log.FromContext(ctx)
+ logger.Warnf("redis pool wait %s actives=%d", d, len(c.sema))
+ }
+ conn, err := c.pool.GetContext(ctx)
+ if err != nil {
+ <-c.sema
+ return nil, err
+ }
+ return activeConn{
+ Conn: conn,
+ c: c,
+ }, nil
+ case <-ctx.Done():
+ d := time.Since(t)
+ if d > 100*time.Millisecond {
+ logger := log.FromContext(ctx)
+ logger.Warnf("redis pool timed-out wait %s actives=%d", d, len(c.sema))
+ }
+ return nil, ctx.Err()
+ }
+}
+
// Get fetches value for the key from redis.
func (c Client) Get(ctx context.Context, in *pb.GetReq, opts ...grpc.CallOption) (*pb.GetResp, error) {
- conn, err := c.pool.GetContext(ctx)
+ conn, err := c.poolGetContext(ctx)
if err != nil {
return nil, err
}
@@ -127,7 +196,7 @@
// Put stores key:value pair on redis.
func (c Client) Put(ctx context.Context, in *pb.PutReq, opts ...grpc.CallOption) (*pb.PutResp, error) {
- conn, err := c.pool.GetContext(ctx)
+ conn, err := c.poolGetContext(ctx)
if err != nil {
return nil, err
}
diff --git a/cache/redis/client_test.go b/cache/redis/client_test.go
new file mode 100644
index 0000000..e4c1d9b
--- /dev/null
+++ b/cache/redis/client_test.go
@@ -0,0 +1,69 @@
+// Copyright 2020 Google LLC. All Rights Reserved.
+
+package redis
+
+import (
+ "context"
+ "flag"
+ "sync"
+ "testing"
+ "time"
+
+ "go.uber.org/zap"
+
+ "go.chromium.org/goma/server/log"
+ pb "go.chromium.org/goma/server/proto/cache"
+)
+
+var (
+ numFilesPerExecReq = flag.Int("num_files_per_exec_req", 500, "number of files per ExecReq for BenchmarkGet")
+)
+
+func BenchmarkGet(b *testing.B) {
+ log.SetZapLogger(zap.NewNop())
+ s := NewFakeServer(b)
+
+ ctx := context.Background()
+ c := NewClient(ctx, s.Addr().String(), Opts{
+ MaxIdleConns: DefaultMaxIdleConns,
+ MaxActiveConns: DefaultMaxActiveConns,
+ })
+ defer c.Close()
+
+ b.Logf("b.N=%d", b.N)
+ var wg sync.WaitGroup
+ var (
+ mu sync.Mutex
+ nerrs int
+ )
+ wg.Add(b.N)
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ go func() {
+ defer wg.Done()
+ ctx, cancel := context.WithTimeout(ctx, 30*time.Second)
+ defer cancel()
+
+ var rg sync.WaitGroup
+ rg.Add(*numFilesPerExecReq)
+ for i := 0; i < *numFilesPerExecReq; i++ {
+ go func() {
+ defer rg.Done()
+ _, err := c.Get(ctx, &pb.GetReq{
+ Key: "key",
+ })
+ if err != nil {
+ mu.Lock()
+ nerrs++
+ mu.Unlock()
+ }
+ }()
+ }
+ rg.Wait()
+ }()
+ }
+ wg.Wait()
+ mu.Lock()
+ b.Logf("nerrs=%d", nerrs)
+ mu.Unlock()
+}
diff --git a/cache/redis/fake_redis.go b/cache/redis/fake_redis.go
new file mode 100644
index 0000000..e8b0046
--- /dev/null
+++ b/cache/redis/fake_redis.go
@@ -0,0 +1,109 @@
+// Copyright 2020 Google LLC. All Rights Reserved.
+
+package redis
+
+import (
+ "bufio"
+ "bytes"
+ "fmt"
+ "net"
+ "strconv"
+ "testing"
+)
+
+// FakeServer is a fake redis server for stress test.
+type FakeServer struct {
+ ln net.Listener
+ tb testing.TB
+}
+
+// NewFakeServer starts a new fake redis server.
+func NewFakeServer(tb testing.TB) *FakeServer {
+ ln, err := net.Listen("tcp", "")
+ if err != nil {
+ tb.Fatal(err)
+ }
+ s := &FakeServer{ln: ln, tb: tb}
+ go s.serve()
+ tb.Cleanup(func() { s.Close() })
+ return s
+}
+
+// Addr returns address of the fake redis server.
+func (s *FakeServer) Addr() net.Addr {
+ return s.ln.Addr()
+}
+
+// Close shuts down the fake redis server.
+func (s *FakeServer) Close() {
+ s.ln.Close()
+}
+
+func (s *FakeServer) serve() {
+ for {
+ conn, err := s.ln.Accept()
+ if err != nil {
+ return
+ }
+ go s.handle(conn)
+ }
+}
+
+func (s *FakeServer) handle(conn net.Conn) {
+ defer conn.Close()
+ b := bufio.NewReader(conn)
+ for {
+ _, err := s.readRequest(b)
+ if err != nil {
+ return
+ }
+ // s.tb.Logf("request: %q", line)
+ // assume GET
+ // *2\r\n$3\r\nGET\r\n$3\r\nkey\r\n
+
+ conn.Write([]byte("$10\r\n0123456789\r\n"))
+ }
+}
+
+func (s *FakeServer) readRequest(r *bufio.Reader) ([]byte, error) {
+ var line []byte
+ nline, _, err := r.ReadLine()
+ if err != nil {
+ return nil, err
+ }
+ line = append(line, nline...)
+ if !bytes.HasPrefix(nline, []byte("*")) {
+ return line, err
+ }
+ // *<n> array
+ n, err := strconv.Atoi(string(nline[1:]))
+ if err != nil {
+ return line, fmt.Errorf("wrong array %q: %v", nline, err)
+ }
+ for i := 0; i < n; i++ {
+ nline, _, err := r.ReadLine()
+ if err != nil {
+ return line, err
+ }
+ line = append(line, '\n')
+ line = append(line, nline...)
+ if !bytes.HasPrefix(nline, []byte("$")) {
+ continue
+ }
+ // $<n>\r\n<value>\r\n
+ sz, err := strconv.Atoi(string(nline[1:]))
+ if err != nil {
+ return line, fmt.Errorf("wrong bytes %q: %v", nline, err)
+ }
+ nline, _, err = r.ReadLine()
+ if err != nil {
+ return line, err
+ }
+ line = append(line, '\n')
+ line = append(line, nline...)
+ if sz != len(nline) {
+ return line, fmt.Errorf("unexpected value sz=%d v=%q", sz, nline)
+ }
+ }
+ return line, nil
+}
diff --git a/cipd_manifest.txt b/cipd_manifest.txt
index 9574385..681c246 100644
--- a/cipd_manifest.txt
+++ b/cipd_manifest.txt
@@ -13,9 +13,9 @@
# https://chrome-infra-packages.appspot.com/
# go
-infra/3pp/tools/go/${platform} version:1.15
+infra/3pp/tools/go/${platform} version:1.16
# protoc
# If the version you want is missing, please follow the instruction in:
# https://chromium.googlesource.com/infra/infra/+/refs/heads/master/bootstrap/cipd/doc/infra/tools/protoc/
-infra/tools/protoc/${platform} protobuf_version:v3.13.0
+infra/tools/protoc/${platform} protobuf_version:v3.15.3
diff --git a/cipd_manifest.versions b/cipd_manifest.versions
index c494680..1900f25 100644
--- a/cipd_manifest.versions
+++ b/cipd_manifest.versions
@@ -2,9 +2,9 @@
# Do not modify manually. All changes will be overwritten.
infra/3pp/tools/go/linux-amd64
- version:1.15
- xmu8oShY9L8zjMBvfYOOPki8xHNHphUfF1v1o4W-TyoC
+ version:1.16
+ MxMgv8pi7utBtJGyURlZNC03jAiV-hUbo0Qk7u9MNOEC
infra/tools/protoc/linux-amd64
- protobuf_version:v3.13.0
- gV4kmbFUUWoo9_71iWLRL9fB9DkQoOvyuqdKm9lu5P0C
+ protobuf_version:v3.15.3
+ iybrJKcHxYG5uY9dj6Or1-r4ifJIY270CTA5c6EJI34C
diff --git a/cmd/exec_server/main.go b/cmd/exec_server/main.go
index 2fd0d9e..3e6b08f 100644
--- a/cmd/exec_server/main.go
+++ b/cmd/exec_server/main.go
@@ -18,6 +18,7 @@
"math/rand"
"net/http"
"path"
+ "strings"
"time"
rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
@@ -66,8 +67,9 @@
pubsubProjectID = flag.String("pubsub-project-id", "", "project id for pubsub")
serviceAccountFile = flag.String("service-account-file", "", "service account json file")
- remoteexecAddr = flag.String("remoteexec-addr", "", "use remoteexec API endpoint")
- remoteInstancePrefix = flag.String("remote-instance-prefix", "", "remote instance name path prefix.")
+ remoteexecAddr = flag.String("remoteexec-addr", "", "use remoteexec API endpoint")
+ remoteInstancePrefix = flag.String("remote-instance-prefix", "", "remote instance name path prefix.")
+ remoteInstanceBaseName = flag.String("remote-instance-basename", "default_instance", "remote instance basename under remote-instance-prefix")
// http://b/141901653
execMaxRetryCount = flag.Int("exec-max-retry-count", 5, "max retry count for exec call. 0 is unlimited count, but bound to ctx timtout. Use small number for powerful clients to run local fallback quickly. Use large number for powerless clients to use remote more than local.")
@@ -84,7 +86,33 @@
// rbe-staging1 uses 2.2M keys (< 512MB memory usage in redis).
maxDigestCacheEntries = flag.Int("max-digest-cache-entries", 2e6, "maximum entries in in-memory digest cache. 0 means unimited")
+ // nsjail is applied in hardened request.
+ // note windows and chroot reqs are out of scope for the ratio.
+ // e.g.
+ // hadening-ratio=0
+ // nsjail-rario=<any>
+ // => no hardening (no runsc nor nsjail) at all
+ //
+ // hardening-ratio=1
+ // nsjail-ratio=0
+ // => hardening by runsc only
+ //
+ // hardening-ratio=1
+ // nsjail-ratio=1
+ // => hardening by nsjail only
+ //
+ // hardening-ratio=0.5
+ // nsjail-ratio=0.5
+ // => no hardeing 50%
+ // hardening 50%
+ // nsjail 25% (50% in hardening)
+ // runsc 25% (50% in hardening)
experimentHardeningRatio = flag.Float64("experiment-hardening-ratio", 0, "Ratio [0,1] to enable hardening. 0=no hardening. 1=all hardening.")
+ experimentNsjailRatio = flag.Float64("experiment-nsjail-ratio", 0, "Ratio [0,1] to use nsjail for hardening. 0=no nsjial (ie. runsc), 1=all nsjail.")
+ disableHardenings = flag.String("disable-hardenings", "", "comma separated sha256 file hashes of command to disable hardening (i.e. for ELF-32)")
+
+ redisMaxIdleConns = flag.Int("redis-max-idle-conns", redis.DefaultMaxIdleConns, "maximum number of idle connections to redis.")
+ redisMaxActiveConns = flag.Int("redis-max-active-conns", redis.DefaultMaxActiveConns, "maximum number of active connections to redis.")
)
var (
@@ -280,11 +308,24 @@
logger.Warnf("redis disabled for gomafile-digest: %v", err)
return digest.NewCache(nil, *maxDigestCacheEntries)
}
- logger.Infof("redis enabled for gomafile-digest: %v", addr)
- return digest.NewCache(redis.NewClient(ctx, addr, "gomafile-digest:"), *maxDigestCacheEntries)
+ logger.Infof("redis enabled for gomafile-digest: %v idle=%d active=%d", addr, *redisMaxIdleConns, *redisMaxActiveConns)
+ return digest.NewCache(redis.NewClient(ctx, addr, redis.Opts{
+ Prefix: "gomafile-digest:",
+ MaxIdleConns: *redisMaxIdleConns,
+ MaxActiveConns: *redisMaxActiveConns,
+ }), *maxDigestCacheEntries)
}
func main() {
+ spanTimeout := remoteexec.DefaultSpanTimeout
+ flag.DurationVar(&spanTimeout.Inventory, "exec-inventory-timeout", spanTimeout.Inventory, "timeout of exec-inventory")
+ flag.DurationVar(&spanTimeout.InputTree, "exec-input-tree-timeout", spanTimeout.InputTree, "timeout of exec-iput-tree")
+ flag.DurationVar(&spanTimeout.Setup, "exec-setup-timeout", spanTimeout.Setup, "timeout of exec-setup")
+ flag.DurationVar(&spanTimeout.CheckCache, "exec-check-cache-timeout", spanTimeout.CheckCache, "timeout of exec-check-cache")
+ flag.DurationVar(&spanTimeout.CheckMissing, "exec-check-missing-timeout", spanTimeout.CheckMissing, "timeout of exec-check-missing")
+ flag.DurationVar(&spanTimeout.UploadBlobs, "exec-upload-blobs-timeout", spanTimeout.UploadBlobs, "timeout of exec-upload-blobs")
+ flag.DurationVar(&spanTimeout.Execute, "exec-execute-timeout", spanTimeout.Execute, "timeout of exec-execute")
+ flag.DurationVar(&spanTimeout.Response, "exec-response-timeout", spanTimeout.Response, "timeout of exec-response")
flag.Parse()
rand.Seed(time.Now().UnixNano())
@@ -379,9 +420,12 @@
}
casBlobLookupConcurrency := 20
outputFileConcurrency := 20
+ logger.Infof("span timeout = %#v", spanTimeout)
re := &remoteexec.Adapter{
- InstancePrefix: *remoteInstancePrefix,
- ExecTimeout: 15 * time.Minute,
+ InstancePrefix: *remoteInstancePrefix,
+ InstanceBaseName: *remoteInstanceBaseName,
+ ExecTimeout: 15 * time.Minute,
+ SpanTimeout: spanTimeout,
Client: remoteexec.Client{
ClientConn: reConn,
Retry: rpc.Retry{
@@ -398,7 +442,10 @@
CASBlobLookupSema: make(chan struct{}, casBlobLookupConcurrency),
OutputFileSema: make(chan struct{}, outputFileConcurrency),
HardeningRatio: *experimentHardeningRatio,
+ NsjailRatio: *experimentNsjailRatio,
+ DisableHardenings: strings.Split(*disableHardenings, ","),
}
+ logger.Infof("hardeniong=%f nsjail=%f", re.HardeningRatio, re.NsjailRatio)
if *cmdFilesBucket == "" {
logger.Warnf("--cmd-files-bucket is not given. support only ARBITRARY_TOOLCHAIN_SUPPORT enabled client")
@@ -414,7 +461,7 @@
// expose bytestream proxy.
bs := &remoteexec.ByteStream{
Adapter: re,
- InstanceName: re.DefaultInstance(),
+ InstanceName: re.Instance(),
// TODO: Create bytestreams for multiple instances.
}
bspb.RegisterByteStreamServer(s.Server, bs)
diff --git a/cmd/execlog_server/main.go b/cmd/execlog_server/main.go
index 1383ee7..ab9d1ab 100644
--- a/cmd/execlog_server/main.go
+++ b/cmd/execlog_server/main.go
@@ -13,6 +13,7 @@
"flag"
"net/http"
+ "go.opencensus.io/stats/view"
"go.opencensus.io/trace"
"go.opencensus.io/zpages"
"google.golang.org/grpc"
@@ -45,6 +46,11 @@
if err != nil {
logger.Fatal(err)
}
+ err = view.Register(execlog.DefaultViews...)
+ if err != nil {
+ logger.Fatal(err)
+ }
+
trace.ApplyConfig(trace.Config{
DefaultSampler: server.NewLimitedSampler(server.DefaultTraceFraction, server.DefaultTraceQPS),
})
diff --git a/cmd/file_server/main.go b/cmd/file_server/main.go
index b4bf4ce..09d8e6f 100644
--- a/cmd/file_server/main.go
+++ b/cmd/file_server/main.go
@@ -43,6 +43,9 @@
traceProjectID = flag.String("trace-project-id", "", "project id for cloud tracing")
serviceAccountFile = flag.String("service-account-file", "", "service account json file")
+
+ redisMaxIdleConns = flag.Int("redis-max-idle-conns", redis.DefaultMaxIdleConns, "maximum number of idle connections to redis.")
+ redisMaxActiveConns = flag.Int("redis-max-active-conns", redis.DefaultMaxActiveConns, "maximum number of active connections to redis.")
)
type admissionController struct {
@@ -99,8 +102,12 @@
addr, err := redis.AddrFromEnv()
switch {
case err == nil:
- logger.Infof("redis enabled for gomafile: %s", addr)
- c := redis.NewClient(ctx, addr, "gomafile:")
+ logger.Infof("redis enabled for gomafile: %s idle=%d active=%d", addr, *redisMaxIdleConns, *redisMaxActiveConns)
+ c := redis.NewClient(ctx, addr, redis.Opts{
+ Prefix: "gomafile:",
+ MaxIdleConns: *redisMaxIdleConns,
+ MaxActiveConns: *redisMaxActiveConns,
+ })
defer c.Close()
cclient = c
diff --git a/cmd/remoteexec_proxy/main.go b/cmd/remoteexec_proxy/main.go
index 502cc10..97bd04a 100644
--- a/cmd/remoteexec_proxy/main.go
+++ b/cmd/remoteexec_proxy/main.go
@@ -81,6 +81,9 @@
traceProjectID = flag.String("trace-project-id", "", "project id for cloud tracing")
traceFraction = flag.Float64("trace-sampling-fraction", 1.0, "sampling fraction for stackdriver trace")
traceQPS = flag.Float64("trace-sampling-qps-limit", 1.0, "sampling qps limit for stackdriver trace")
+
+ redisMaxIdleConns = flag.Int("redis-max-idle-conns", redis.DefaultMaxIdleConns, "maximum number of idle connections to redis.")
+ redisMaxActiveConns = flag.Int("redis-max-active-conns", redis.DefaultMaxActiveConns, "maximum number of active connections to redis.")
)
func myEmail(ctx context.Context) string {
@@ -258,6 +261,16 @@
}
func main() {
+ spanTimeout := remoteexec.DefaultSpanTimeout
+ flag.DurationVar(&spanTimeout.Inventory, "exec-inventory-timeout", spanTimeout.Inventory, "timeout of exec-inventory")
+ flag.DurationVar(&spanTimeout.InputTree, "exec-input-tree-timeout", spanTimeout.InputTree, "timeout of exec-iput-tree")
+ flag.DurationVar(&spanTimeout.Setup, "exec-setup-timeout", spanTimeout.Setup, "timeout of exec-setup")
+ flag.DurationVar(&spanTimeout.CheckCache, "exec-check-cache-timeout", spanTimeout.CheckCache, "timeout of exec-check-cache")
+ flag.DurationVar(&spanTimeout.CheckMissing, "exec-check-missing-timeout", spanTimeout.CheckMissing, "timeout of exec-check-missing")
+ flag.DurationVar(&spanTimeout.UploadBlobs, "exec-upload-blobs-timeout", spanTimeout.UploadBlobs, "timeout of exec-upload-blobs")
+ flag.DurationVar(&spanTimeout.Execute, "exec-execute-timeout", spanTimeout.Execute, "timeout of exec-execute")
+ flag.DurationVar(&spanTimeout.Response, "exec-response-timeout", spanTimeout.Response, "timeout of exec-response")
+
flag.Parse()
ctx := context.Background()
@@ -371,7 +384,7 @@
}
tlsConfig := &tls.Config{
InsecureSkipVerify: *insecureSkipVerify,
- RootCAs: certPool,
+ RootCAs: certPool,
}
opts := []grpc.DialOption{
grpc.WithTransportCredentials(credentials.NewTLS(tlsConfig)),
@@ -394,13 +407,18 @@
logger.Warnf("redis disabled for gomafile-digest: %v", err)
digestCache = digest.NewCache(nil, *maxDigestCacheEntries)
} else {
- logger.Infof("redis enabled for gomafile-digest: %v", redisAddr)
- digestCache = digest.NewCache(redis.NewClient(ctx, redisAddr, "gomafile-digest:"), *maxDigestCacheEntries)
+ logger.Infof("redis enabled for gomafile-digest: %v idle=%d active=%d", redisAddr, *redisMaxIdleConns, *redisMaxActiveConns)
+ digestCache = digest.NewCache(redis.NewClient(ctx, redisAddr, redis.Opts{
+ Prefix: "gomafile-digest:",
+ MaxIdleConns: *redisMaxIdleConns,
+ MaxActiveConns: *redisMaxActiveConns,
+ }), *maxDigestCacheEntries)
}
re := &remoteexec.Adapter{
InstancePrefix: path.Dir(*remoteInstanceName),
ExecTimeout: 15 * time.Minute,
+ SpanTimeout: spanTimeout,
Client: remoteexec.Client{
ClientConn: reConn,
Retry: rpc.Retry{
diff --git a/command/configmap.go b/command/configmap.go
index eb3df35..1288458 100644
--- a/command/configmap.go
+++ b/command/configmap.go
@@ -516,6 +516,7 @@
confs = append(confs, &cmdpb.Config{
RemoteexecPlatform: platform,
Dimensions: rc.PlatformRuntimeConfig.Dimensions,
+ Acl: rc.Acl,
})
}
@@ -768,6 +769,7 @@
},
CmdDescriptor: d,
RemoteexecPlatform: platform,
+ Acl: rc.Acl,
}
return nil
})
diff --git a/exec/inventory.go b/exec/inventory.go
index a3d2cd8..fab04f4 100644
--- a/exec/inventory.go
+++ b/exec/inventory.go
@@ -20,6 +20,7 @@
"go.opencensus.io/tag"
"go.opencensus.io/trace"
+ "go.chromium.org/goma/server/auth/enduser"
"go.chromium.org/goma/server/command/descriptor"
"go.chromium.org/goma/server/command/normalizer"
"go.chromium.org/goma/server/log"
@@ -164,6 +165,7 @@
type platformConfig struct {
dimensionSet map[string]bool
remoteexecPlatform *cmdpb.RemoteexecPlatform
+ acl *cmdpb.ACL
}
// Configure sets config in the inventory.
@@ -186,6 +188,7 @@
newPlatformConfigs = append(newPlatformConfigs, &platformConfig{
dimensionSet: dimensionSet,
remoteexecPlatform: cfg.GetRemoteexecPlatform(),
+ acl: cfg.GetAcl(),
})
logger.Infof("configure platform config: %v", cfg)
continue
@@ -267,6 +270,35 @@
return in.versionID, resp
}
+func checkACL(ctx context.Context, acl *cmdpb.ACL) error {
+ if acl == nil {
+ return nil
+ }
+ eu, ok := enduser.FromContext(ctx)
+ if len(acl.DisallowedGroups) > 0 {
+ if !ok {
+ return errors.New("no enduser group in context")
+ }
+ for _, g := range acl.DisallowedGroups {
+ if g == eu.Group {
+ return fmt.Errorf("enduser group %q not allowed (in disallowed groups)", eu.Group)
+ }
+ }
+ }
+ if len(acl.AllowedGroups) > 0 {
+ if !ok {
+ return errors.New("no enduser group in context")
+ }
+ for _, g := range acl.AllowedGroups {
+ if g == eu.Group {
+ return nil
+ }
+ }
+ return fmt.Errorf("enduser group %q not allowed (not in allowed groups)", eu.Group)
+ }
+ return nil
+}
+
// pickCmd takes selectors of compiler and subprograms, and returns configs of
// the best cmd_server that has both compiler and subprograms.
// First, it find out cmd_server that has both selectors of compiler and
@@ -319,6 +351,10 @@
logger.Errorf("cfg for %v is not registered. possibly configs broken.", cmdSel)
continue
}
+ if err := checkACL(ctx, cfg.Acl); err != nil {
+ logger.Errorf("cfg for %v; access denied: %v", cmdSel, err)
+ continue
+ }
ccfgs = append(ccfgs, cfg)
}
if len(ccfgs) == 0 {
@@ -501,6 +537,10 @@
// select the first one.
var matchedConfig *platformConfig
for _, pCfg := range in.platformConfigs {
+ if err := checkACL(ctx, pCfg.acl); err != nil {
+ logger.Errorf("pcfg %v; access denied: %v", pCfg, err)
+ continue
+ }
if matchDimensions(dimensions, pCfg.dimensionSet) {
matchedConfig = pCfg
break
diff --git a/exec/stats.go b/exec/stats.go
index 05bc333..040005a 100644
--- a/exec/stats.go
+++ b/exec/stats.go
@@ -6,11 +6,13 @@
import (
"context"
+ "fmt"
"go.opencensus.io/stats"
"go.opencensus.io/stats/view"
"go.opencensus.io/tag"
+ "go.chromium.org/goma/server/log"
gomapb "go.chromium.org/goma/server/proto/api"
)
@@ -19,8 +21,13 @@
"go.chromium.org/goma/server/exec.api-error",
"exec request api-error",
stats.UnitDimensionless)
+ clientRetries = stats.Int64(
+ "go.chromium.org/goma/server/exec.client-retry",
+ "exec request per client retry",
+ stats.UnitDimensionless)
- apiErrorKey = tag.MustNewKey("api-error")
+ apiErrorKey = tag.MustNewKey("api-error")
+ clientRetryKey = tag.MustNewKey("client-retry")
// DefaultViews are the default views provided by this package.
// You need to register the view for data to actually be collected.
@@ -34,6 +41,14 @@
Aggregation: view.Count(),
},
{
+ Description: "exec request client retry",
+ TagKeys: []tag.Key{
+ clientRetryKey,
+ },
+ Measure: clientRetries,
+ Aggregation: view.Count(),
+ },
+ {
Description: `counts toolchain selection. result is "used", "found", "requested" or "missed"`,
TagKeys: []tag.Key{
selectorKey,
@@ -45,18 +60,22 @@
}
)
-func apiErrorValue(resp *gomapb.ExecResp) string {
+func apiErrorValue(ctx context.Context, resp *gomapb.ExecResp) string {
+ logger := log.FromContext(ctx)
if errVal := resp.GetError(); errVal != gomapb.ExecResp_OK {
// marked as BAD_REQUEST for
// - compiler/subprogram not found
// - bad path_type in command config
// - input root detection failed
+ logger.Errorf("api-error=%s error_message=%s", errVal, resp.ErrorMessage)
return errVal.String()
}
if len(resp.ErrorMessage) > 0 {
+ logger.Errorf("api-error=internal: error_messge=%s", resp.ErrorMessage)
return "internal"
}
if len(resp.MissingInput) > 0 {
+ logger.Errorf("api-error=missing-inputs: missing=%d", len(resp.MissingInput))
return "missing-inputs"
}
return "OK"
@@ -64,10 +83,17 @@
// RecordAPIError records api-error in resp.
func RecordAPIError(ctx context.Context, resp *gomapb.ExecResp) error {
- ctx, err := tag.New(ctx, tag.Upsert(apiErrorKey, apiErrorValue(resp)))
+ ctx, err := tag.New(ctx, tag.Upsert(apiErrorKey, apiErrorValue(ctx, resp)))
if err != nil {
return err
}
stats.Record(ctx, apiErrors.M(1))
return nil
}
+
+// RecordRequesterInfo records requester info.
+// e.g. client retry count.
+func RecordRequesterInfo(ctx context.Context, reqInfo *gomapb.RequesterInfo) error {
+ return stats.RecordWithTags(ctx, []tag.Mutator{tag.Upsert(clientRetryKey, fmt.Sprintf("%d", reqInfo.GetRetry()))}, clientRetries.M(1))
+ // TODO: record api version / goma revision etc?
+}
diff --git a/execlog/service.go b/execlog/service.go
index 6ee4ba1..e333f80 100644
--- a/execlog/service.go
+++ b/execlog/service.go
@@ -6,7 +6,13 @@
import (
"context"
+ "fmt"
+ "go.opencensus.io/stats"
+ "go.opencensus.io/stats/view"
+ "go.opencensus.io/tag"
+
+ "go.chromium.org/goma/server/log"
gomapb "go.chromium.org/goma/server/proto/api"
)
@@ -15,12 +21,256 @@
// grpc's default is 4MB.
const DefaultMaxReqMsgSize = 10 * 1024 * 1024
+var (
+ requests = stats.Int64(
+ "go.chromium.org/goma/execlog/requests",
+ "number of execlog entries",
+ stats.UnitDimensionless)
+
+ osFamilyKey = tag.MustNewKey("os_family")
+ gomaErrorKey = tag.MustNewKey("goma_error")
+ compilerProxyErrorKey = tag.MustNewKey("compiler_proxy_error")
+ cacheHitKey = tag.MustNewKey("cache_hit")
+ depscacheUsedKey = tag.MustNewKey("depscache_used")
+ localRunKey = tag.MustNewKey("local_run")
+ execExitStatusKey = tag.MustNewKey("exec_exit_status")
+ execRequestRetryKey = tag.MustNewKey("exec_request_retry")
+
+ handlerTime = stats.Float64(
+ "go.chromium.org/goma/execlog/handler_time",
+ "Time in compiler_proxy handler",
+ stats.UnitMilliseconds)
+
+ pendingTime = stats.Float64(
+ "go.chromium.org/goma/execlog/pending_time",
+ "Time in pending queue in compiler_proxy",
+ stats.UnitMilliseconds)
+ // need compiler_info_process_time?
+
+ includeProcessorWaitTime = stats.Float64(
+ "go.chromium.org/goma/execlog/include_processor_wait_time",
+ "Time to wait include processor",
+ stats.UnitMilliseconds)
+ includeProcessorRunTime = stats.Float64(
+ "go.chromium.org/goma/execlog/include_processor_run_time",
+ "Time to run include processor",
+ stats.UnitMilliseconds)
+ includePreprocessTotalFiles = stats.Int64(
+ "go.chromium.org/goma/execlog/include_preprocess_total_files",
+ "Number of files processed in include preprocess",
+ stats.UnitDimensionless)
+
+ includeFileloadPendingTime = stats.Float64(
+ "go.chromium.org/goma/execlog/include_fileload_pending_time",
+ "Time to wait upload input files",
+ stats.UnitMilliseconds)
+ includeFileloadRunTime = stats.Float64(
+ "go.chromium.org/goma/execlog/include_fileload_run_time",
+ "Time to upload input files",
+ stats.UnitMilliseconds)
+
+ rpcThrottleTime = stats.Float64(
+ "go.chromium.org/goma/execlog/rpc_throttle_time",
+ "Time to wait to call Exec by throttling (backoff by error)",
+ stats.UnitMilliseconds)
+ rpcPendingTime = stats.Float64(
+ "go.chromium.org/goma/execlog/rpc_pending_time",
+ "Time to wait to call Exec (too many requests)",
+ stats.UnitMilliseconds)
+ rpcWaitTime = stats.Float64(
+ "go.chromium.org/goma/execlog/rpc_wait_time",
+ "Time to wait Exec call response (i.e. server latency)",
+ stats.UnitMilliseconds)
+
+ fileResponseTime = stats.Float64(
+ "go.chromium.org/goma/execlog/file_response_time",
+ "Time to process output files",
+ stats.UnitMilliseconds)
+
+ localDelayTime = stats.Float64(
+ "go.chromium.org/goma/execlog/local_delay_time",
+ "Time delayed to start run locally",
+ stats.UnitMilliseconds)
+ localPendingTime = stats.Float64(
+ "go.chromium.org/goma/execlog/local_penging_time",
+ "Time to wait to run locally",
+ stats.UnitMilliseconds)
+ localRunTime = stats.Float64(
+ "go.chromium.org/goma/execlog/local_run_time",
+ "Time to run locally",
+ stats.UnitMilliseconds)
+
+ defaultLatencyDistribution = view.Distribution(1, 2, 3, 4, 5, 6, 8, 10, 13, 16, 20, 25, 30, 40, 50, 65, 80, 100, 130, 160, 200, 250, 300, 400, 500, 650, 800, 1000, 2000, 5000, 10000, 20000, 50000, 100000, 200000, 500000)
+
+ tagKeys = []tag.Key{
+ osFamilyKey,
+ cacheHitKey,
+ depscacheUsedKey,
+ localRunKey,
+ execExitStatusKey,
+ }
+
+ DefaultViews = []*view.View{
+ {
+ TagKeys: []tag.Key{
+ osFamilyKey,
+ gomaErrorKey,
+ compilerProxyErrorKey,
+ cacheHitKey,
+ depscacheUsedKey,
+ localRunKey,
+ execExitStatusKey,
+ execRequestRetryKey,
+ },
+ Measure: requests,
+ Aggregation: view.Sum(),
+ },
+ {
+ TagKeys: tagKeys,
+ Measure: handlerTime,
+ Aggregation: defaultLatencyDistribution,
+ },
+ {
+ TagKeys: tagKeys,
+ Measure: pendingTime,
+ Aggregation: defaultLatencyDistribution,
+ },
+ {
+ TagKeys: tagKeys,
+ Measure: includeProcessorWaitTime,
+ Aggregation: defaultLatencyDistribution,
+ },
+ {
+ TagKeys: tagKeys,
+ Measure: includeProcessorRunTime,
+ Aggregation: defaultLatencyDistribution,
+ },
+ {
+ TagKeys: tagKeys,
+ Measure: includePreprocessTotalFiles,
+ Aggregation: view.Sum(),
+ },
+ {
+ TagKeys: tagKeys,
+ Measure: includeFileloadPendingTime,
+ Aggregation: defaultLatencyDistribution,
+ },
+ {
+ TagKeys: tagKeys,
+ Measure: includeFileloadRunTime,
+ Aggregation: defaultLatencyDistribution,
+ },
+ {
+ TagKeys: tagKeys,
+ Measure: rpcThrottleTime,
+ Aggregation: defaultLatencyDistribution,
+ },
+ {
+ TagKeys: tagKeys,
+ Measure: rpcPendingTime,
+ Aggregation: defaultLatencyDistribution,
+ },
+ {
+ TagKeys: tagKeys,
+ Measure: rpcWaitTime,
+ Aggregation: defaultLatencyDistribution,
+ },
+ {
+ TagKeys: tagKeys,
+ Measure: fileResponseTime,
+ Aggregation: defaultLatencyDistribution,
+ },
+ {
+ TagKeys: tagKeys,
+ Measure: localDelayTime,
+ Aggregation: defaultLatencyDistribution,
+ },
+ {
+ TagKeys: tagKeys,
+ Measure: localPendingTime,
+ Aggregation: defaultLatencyDistribution,
+ },
+ {
+ TagKeys: tagKeys,
+ Measure: localRunTime,
+ Aggregation: defaultLatencyDistribution,
+ },
+ }
+)
+
// Service represents goma execlog service.
type Service struct {
}
-// SaveLog discards execlog.
+func osFamily(e *gomapb.ExecLog) string {
+ oi := e.GetOsInfo().GetOsInfoOneof()
+ switch oi.(type) {
+ case *gomapb.OSInfo_LinuxInfo_:
+ return "Linux"
+ case *gomapb.OSInfo_WinInfo_:
+ return "Windows"
+ case *gomapb.OSInfo_MacInfo_:
+ return "Mac"
+ default:
+ return "Unknown"
+ }
+}
+
+// SaveLog emits some metrics.
+// * go.chromium.org/goma/execlog/requests
+// {os_family, ,goma_error, compiler_proxy_error,
+// cache_hit, depscache_used, local_run,
+// exec_exit_status, exec_request_retry}
+// * go.chromium.org/goma/execlog/handler_time
// TODO: implement saving logic to GCS?
-func (s Service) SaveLog(ctx context.Context, req *gomapb.SaveLogReq) (*gomapb.SaveLogResp, error) {
+func (Service) SaveLog(ctx context.Context, req *gomapb.SaveLogReq) (*gomapb.SaveLogResp, error) {
+ logger := log.FromContext(ctx)
+ for _, e := range req.GetExecLog() {
+ os := osFamily(e)
+ localRun := e.GetLocalRunTime() > 0
+ tags := []tag.Mutator{
+ tag.Upsert(osFamilyKey, os),
+ tag.Upsert(cacheHitKey, fmt.Sprint(e.GetCacheHit())),
+ tag.Upsert(depscacheUsedKey, fmt.Sprint(e.GetDepscacheUsed())),
+ tag.Upsert(localRunKey, fmt.Sprint(localRun)),
+ tag.Upsert(execExitStatusKey, fmt.Sprint(e.GetExecExitStatus())),
+ }
+ ctx, err := tag.New(ctx, tags...)
+ if err != nil {
+ logger.Errorf("Failed to set tags for savelog: %v", err)
+ continue
+ }
+ stats.RecordWithTags(ctx, []tag.Mutator{
+ tag.Upsert(gomaErrorKey, fmt.Sprint(e.GetGomaError())),
+ tag.Upsert(compilerProxyErrorKey, fmt.Sprint(e.GetCompilerProxyError())),
+ tag.Upsert(execRequestRetryKey, fmt.Sprint(e.GetExecRequestRetry())),
+ }, requests.M(1))
+ stats.Record(ctx, handlerTime.M(float64(e.GetHandlerTime())))
+ stats.Record(ctx, pendingTime.M(float64(e.GetPendingTime())))
+ stats.Record(ctx, includeProcessorWaitTime.M(float64(e.GetIncludeProcessorWaitTime())))
+ stats.Record(ctx, includeProcessorRunTime.M(float64(e.GetIncludeProcessorRunTime())))
+ stats.Record(ctx, includePreprocessTotalFiles.M(int64(e.GetIncludePreprocessTotalFiles())))
+ for _, t := range e.GetIncludeFileloadPendingTime() {
+ stats.Record(ctx, includeFileloadPendingTime.M(float64(t)))
+ }
+ for _, t := range e.GetIncludeFileloadRunTime() {
+ stats.Record(ctx, includeFileloadRunTime.M(float64(t)))
+ }
+ for _, t := range e.GetRpcThrottleTime() {
+ stats.Record(ctx, rpcThrottleTime.M(float64(t)))
+ }
+ for _, t := range e.GetRpcPendingTime() {
+ stats.Record(ctx, rpcPendingTime.M(float64(t)))
+ }
+ for _, t := range e.GetRpcWaitTime() {
+ stats.Record(ctx, rpcWaitTime.M(float64(t)))
+ }
+ stats.Record(ctx, fileResponseTime.M(float64(e.GetFileResponseTime())))
+
+ stats.Record(ctx, localDelayTime.M(float64(e.GetLocalDelayTime())))
+ stats.Record(ctx, localPendingTime.M(float64(e.GetLocalPendingTime())))
+ stats.Record(ctx, localRunTime.M(float64(e.GetLocalRunTime())))
+ }
+
return &gomapb.SaveLogResp{}, nil
}
diff --git a/go.mod b/go.mod
index 039ccba..68ce81e 100644
--- a/go.mod
+++ b/go.mod
@@ -3,29 +3,29 @@
go 1.12
require (
- cloud.google.com/go v0.65.0
- cloud.google.com/go/pubsub v1.6.1
- cloud.google.com/go/storage v1.11.0
- contrib.go.opencensus.io/exporter/stackdriver v0.13.4
- github.com/bazelbuild/remote-apis v0.0.0-20191104140458-e77c4eb2ca48
- github.com/bazelbuild/remote-apis-sdks v0.0.0-20200717191301-6f048255943e
- github.com/fsnotify/fsnotify v1.4.7
+ cloud.google.com/go v0.78.0
+ cloud.google.com/go/pubsub v1.10.0
+ cloud.google.com/go/storage v1.13.0
+ contrib.go.opencensus.io/exporter/stackdriver v0.13.5
+ github.com/bazelbuild/remote-apis v0.0.0-20200904140912-1aeb39973178
+ github.com/bazelbuild/remote-apis-sdks v0.0.0-20201118210229-b732553f9d45
+ github.com/fsnotify/fsnotify v1.4.9
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e
- github.com/golang/protobuf v1.4.2
- github.com/gomodule/redigo v2.0.0+incompatible
- github.com/google/go-cmp v0.5.2
- github.com/google/uuid v1.1.2
+ github.com/golang/protobuf v1.4.3
+ github.com/gomodule/redigo v1.8.4
+ github.com/google/go-cmp v0.5.4
+ github.com/google/uuid v1.2.0
github.com/googleapis/gax-go/v2 v2.0.5
github.com/googleapis/google-cloud-go-testing v0.0.0-20190904031503-2d24dde44ba5
- github.com/grpc-ecosystem/go-grpc-middleware v1.2.1
- go.opencensus.io v0.22.4
- go.uber.org/zap v1.10.0
+ github.com/grpc-ecosystem/go-grpc-middleware v1.2.2
+ go.opencensus.io v0.23.0
+ go.uber.org/zap v1.16.0
golang.org/x/build v0.0.0-20191031202223-0706ea4fce0c
- golang.org/x/net v0.0.0-20200822124328-c89045814202
- golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d
- golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208
- google.golang.org/api v0.30.0
- google.golang.org/genproto v0.0.0-20200827165113-ac2560b5e952
- google.golang.org/grpc v1.31.1
+ golang.org/x/net v0.0.0-20210119194325-5f4716e94777
+ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99
+ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a
+ google.golang.org/api v0.40.0
+ google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c
+ google.golang.org/grpc v1.36.0
google.golang.org/protobuf v1.25.0
)
diff --git a/go.sum b/go.sum
index 0fbc76a..c40eb21 100644
--- a/go.sum
+++ b/go.sum
@@ -1,74 +1,47 @@
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go v0.38.0 h1:ROfEUZz+Gh5pa62DJWXSaonyu3StP6EA6lPEXPI6mCo=
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
-cloud.google.com/go v0.44.3 h1:0sMegbmn/8uTwpNkB0q9cLEpZ2W5a6kl+wtBQgPWBJQ=
cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
-cloud.google.com/go v0.45.1 h1:lRi0CHyU+ytlvylOlFKKq0af6JncuyoRh1J+QJBqQx0=
cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
-cloud.google.com/go v0.46.3 h1:AVXDdKsrtX33oR9fbCMu/+c1o8Ofjq6Ku/MInaLVg5Y=
cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
-cloud.google.com/go v0.47.0/go.mod h1:5p3Ky/7f3N10VBkhuR5LFtddroTiMyjZV/Kj5qOQFxU=
cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
-cloud.google.com/go v0.52.0 h1:GGslhk/BU052LPlnI1vpp3fcbUs+hQ3E+Doti/3/vF8=
cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
-cloud.google.com/go v0.53.0 h1:MZQCQQaRwOrAcuKjiHWHrgKykt4fZyuwF2dtiG3fGW8=
cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
-cloud.google.com/go v0.54.0 h1:3ithwDMr7/3vpAMXiH+ZQnYbuIsh+OPhUPMFC9enmn0=
cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
-cloud.google.com/go v0.56.0 h1:WRz29PgAsVEyPSDHyk+0fpEkwEFyfhHn+JbksT6gIL4=
cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
-cloud.google.com/go v0.57.0 h1:EpMNVUorLiZIELdMZbCYX/ByTFCdoYopYAGxaGVz9ms=
cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
-cloud.google.com/go v0.61.0 h1:NLQf5e1OMspfNT1RAHOB3ublr1TW3YTXO8OiWwVjK2U=
-cloud.google.com/go v0.61.0/go.mod h1:XukKJg4Y7QsUu0Hxg3qQKUWR4VuWivmyMK2+rUyxAqw=
-cloud.google.com/go v0.62.0 h1:RmDygqvj27Zf3fCQjQRtLyC7KwFcHkeJitcO0OoGOcA=
cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
-cloud.google.com/go v0.64.0/go.mod h1:xfORb36jGvE+6EexW71nMEtL025s3x6xvuYUKM4JLv4=
-cloud.google.com/go v0.65.0 h1:Dg9iHVQfrhq82rUNu9ZxUDrJLaxFUe/HlCVaLyRruq8=
cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
-cloud.google.com/go/bigquery v1.0.1 h1:hL+ycaJpVE9M7nLoiXb/Pn10ENE2u+oddxbD8uu0ZVU=
+cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=
+cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=
+cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY=
+cloud.google.com/go v0.78.0 h1:oKpsiyKMfVpwR3zSAkQixGzlVE5ovitBuO0qSmCf0bI=
+cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
-cloud.google.com/go/bigquery v1.3.0 h1:sAbMqjY1PEQKZBWfbu6Y6bsupJ9c4QdHnzg/VvYTLcE=
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
-cloud.google.com/go/bigquery v1.4.0 h1:xE3CPsOgttP4ACBePh79zTKALtXwn/Edhcr16R5hMWU=
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
-cloud.google.com/go/bigquery v1.5.0 h1:K2NyuHRuv15ku6eUpe0DQk5ZykPMnSOnvuVf6IHcjaE=
cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
-cloud.google.com/go/bigquery v1.7.0 h1:a/O/bK/vWrYGOTFtH8di4rBxMZnmkjy+Y5LxpDwo+dA=
cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
-cloud.google.com/go/bigquery v1.8.0 h1:PQcPefKFdaIzjQFbiyOgAqyx8q5djaE7x9Sqe712DPA=
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
-cloud.google.com/go/datastore v1.0.0 h1:Kt+gOPPp2LEPWp8CSfxhsM8ik9CcyE/gYu+0r+RnZvM=
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
-cloud.google.com/go/datastore v1.1.0 h1:/May9ojXjRkPBNVrq+oWLqmWCkr4OU5uRY29bu0mRyQ=
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
-cloud.google.com/go/pubsub v1.0.1 h1:W9tAK3E57P75u0XLLR82LZyw8VpAnhmyTOxW9qzmyj8=
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
-cloud.google.com/go/pubsub v1.1.0 h1:9/vpR43S4aJaROxqQHQ3nH9lfyKKV0dC3vOmnw8ebQQ=
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
-cloud.google.com/go/pubsub v1.2.0 h1:Lpy6hKgdcl7a3WGSfJIFmxmcdjSpP6OmBEfcOv1Y680=
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
-cloud.google.com/go/pubsub v1.3.1 h1:ukjixP1wl0LpnZ6LWtZJ0mX5tBmjp1f8Sqer8Z2OMUU=
cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
-cloud.google.com/go/pubsub v1.6.1 h1:lhCQrTgu7f5SjWm5yJO0geSsPORQ2OAD+Eq1AMyBW8Y=
-cloud.google.com/go/pubsub v1.6.1/go.mod h1:kvW9rcn9OLEx6eTIzMBbWbpB8YsK3vu9jxgPolVz+p4=
-cloud.google.com/go/storage v1.0.0 h1:VV2nUM3wwLLGh9lSABFgZMjInyUbJeaRSE64WuAIQ+4=
+cloud.google.com/go/pubsub v1.10.0 h1:JK22g5uNpscGPthjJE/D0siWtA6UlU4Cb6pLcyJkzyQ=
+cloud.google.com/go/pubsub v1.10.0/go.mod h1:eNpTrkOy7dCpkNyaSNetMa6udbgecJMd0ZsTJS/cuNo=
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
-cloud.google.com/go/storage v1.5.0 h1:RPUcBvDeYgQFMfQu1eBMq6piD1SXmLH+vK3qjewZPus=
cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
-cloud.google.com/go/storage v1.6.0 h1:UDpwYIwla4jHGzZJaEJYx1tOejbgSoNqsAfHAUYe2r8=
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
-cloud.google.com/go/storage v1.8.0 h1:86K1Gel7BQ9/WmNWn7dTKMvTLFzwtBe5FNqYbi9X35g=
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
-cloud.google.com/go/storage v1.10.0 h1:STgFzyU5/8miMl0//zKh2aQeTyeaUH3WN9bSUiJ09bA=
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
-cloud.google.com/go/storage v1.11.0 h1:bSLyzhbGjLMYxCratCDRSSH7+xRGpNApTBmowDUFGLk=
-cloud.google.com/go/storage v1.11.0/go.mod h1:/PAbprKS+5msVYogBmczjWalDXnQ9mr64yEq9YnyPeo=
-contrib.go.opencensus.io/exporter/stackdriver v0.13.4 h1:ksUxwH3OD5sxkjzEqGxNTl+Xjsmu3BnC/300MhSVTSc=
-contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc=
+cloud.google.com/go/storage v1.13.0 h1:amPvhCOI+Hltp6rPu+62YdwhIrjf+34PKVAL4HwgYwk=
+cloud.google.com/go/storage v1.13.0/go.mod h1:pqFyBUK3zZqMIIU5+8NaZq6/Ma3ClgUg9Hv5jfuJnvo=
+contrib.go.opencensus.io/exporter/stackdriver v0.13.5 h1:TNaexHK16gPUoc7uzELKOU7JULqccn1NDuqUxmxSqfo=
+contrib.go.opencensus.io/exporter/stackdriver v0.13.5/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
@@ -80,10 +53,10 @@
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
github.com/aws/aws-sdk-go v1.23.20 h1:2CBuL21P0yKdZN5urf2NxKa1ha8fhnY+A3pBCHFeZoA=
github.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
-github.com/bazelbuild/remote-apis v0.0.0-20191104140458-e77c4eb2ca48 h1:bgj+Oufa8F4rCHe/8omhml7cBlg3VmNhF66ed1vT2Bw=
-github.com/bazelbuild/remote-apis v0.0.0-20191104140458-e77c4eb2ca48/go.mod h1:9Y+1FnaNUGVV6wKE0Jdh+mguqDUsyd9uUqokalrC7DQ=
-github.com/bazelbuild/remote-apis-sdks v0.0.0-20200717191301-6f048255943e h1:kCcoMJvNqje+pojDUzuchtx9wmNnOwNIIo6GvbbggOA=
-github.com/bazelbuild/remote-apis-sdks v0.0.0-20200717191301-6f048255943e/go.mod h1:KwCOQXdB4NLiL6LRXP0RF78rs5uhSUiAICF/QSwUrYY=
+github.com/bazelbuild/remote-apis v0.0.0-20200904140912-1aeb39973178 h1:qDZ7lr7knlTckZgbKwWD1PHTY6WYe5V+DqILuzpMHPY=
+github.com/bazelbuild/remote-apis v0.0.0-20200904140912-1aeb39973178/go.mod h1:9Y+1FnaNUGVV6wKE0Jdh+mguqDUsyd9uUqokalrC7DQ=
+github.com/bazelbuild/remote-apis-sdks v0.0.0-20201118210229-b732553f9d45 h1:w/E5Tqx2yumJ5+wYa4Jekq3lr57DmxrSc+xD3SaY13k=
+github.com/bazelbuild/remote-apis-sdks v0.0.0-20201118210229-b732553f9d45/go.mod h1:SvHtabqK9r562BLgmQfd+s5hzd9UUS903b0OmQHvzrI=
github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g=
github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA=
@@ -94,6 +67,8 @@
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
+github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
+github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
github.com/cznic/cc v0.0.0-20181122101902-d673e9b70d4d/go.mod h1:m3fD/V+XTB35Kh9zw6dzjMY+We0Q7PMf6LLIC4vuG9k=
@@ -114,11 +89,14 @@
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
+github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
-github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
+github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
+github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
github.com/garyburd/redigo v1.6.0/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
@@ -134,49 +112,36 @@
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
-github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 h1:ZgQEtGgCBiWRM39fZuwSd1LwSqqSW0hOdXCYYDX0R3I=
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7 h1:5ZkaAPbicIKTF2I64qf5Fh8Aa83Q/dnOafMYV0OMwjA=
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY=
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
-github.com/golang/mock v1.2.0 h1:28o5sBqPkBsMGnC6b4MvE2TzSr5/AT4c/1fLqVGIwlk=
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
-github.com/golang/mock v1.3.1 h1:qGJ6qTW+x6xX/my+8YUVl4WNpX9B7+/l2tRsHGZ7f2s=
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
-github.com/golang/mock v1.4.0 h1:Rd1kQnQu0Hq3qvJppYSG0HtP+f5LPPUiDswTLiEegLg=
github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
-github.com/golang/mock v1.4.1 h1:ocYkMQY5RrXTYgXl7ICpV0IXwlEQGwKIsery4gyXa1U=
github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
-github.com/golang/mock v1.4.3 h1:GV+pQPG/EUUbkh47niozDcADz6go/dUwhVzdUQHIVRw=
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc=
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I=
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
-github.com/golang/protobuf v1.3.4 h1:87PNWwrRvUSnqS4dlcBU/ftvOIBep4sYuBLlh6rX2wk=
github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
-github.com/golang/protobuf v1.3.5 h1:F768QJ1E9tib+q5Sc8MkdJi1RxLTbRcTf8LJV56aRls=
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
-github.com/golang/protobuf v1.4.0 h1:oOuy+ugB+P/kBdUnG5QaMXSIyJ1q38wWSojYCb3z5VQ=
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
-github.com/golang/protobuf v1.4.1 h1:ZFgWrT+bLgsYPirOnRfKLYJLvssAegOj/hgyMFdJZe0=
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
-github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM=
+github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
-github.com/gomodule/redigo v2.0.0+incompatible h1:K/R+8tc58AaqLkqG2Ol3Qk+DR/TlNuhuh457pBFPtt0=
-github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
+github.com/gomodule/redigo v1.8.4 h1:Z5JUg94HMTR1XpwBaSH4vq3+PNSIykBLxMdglbw10gg=
+github.com/gomodule/redigo v1.8.4/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0=
github.com/gonum/blas v0.0.0-20181208220705-f22b278b28ac/go.mod h1:P32wAyui1PQ58Oce/KYkOqQv8cVw1zAapXOl+dRFGbc=
github.com/gonum/floats v0.0.0-20181209220543-c233463c7e82/go.mod h1:PxC8OnwL11+aosOB5+iEPoV3picfs8tUpkVd0pDo+Kg=
github.com/gonum/internal v0.0.0-20181124074243-f884aa714029/go.mod h1:Pu4dmpkhSyOzRwuXkOgAvijx4o+4YMUJJo9OvPYMkks=
@@ -184,72 +149,60 @@
github.com/gonum/matrix v0.0.0-20181209220409-c518dec07be9/go.mod h1:0EXg4mc1CNP0HCqCz+K4ts155PXIlUywf0wqN+GfPZw=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
-github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
-github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-github.com/google/go-cmp v0.3.2-0.20191028172631-481baca67f93 h1:VvBteXw2zOXEgm0o3PgONTWf+bhUGsCaiNn3pbkU9LA=
github.com/google/go-cmp v0.3.2-0.20191028172631-481baca67f93/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.4.1 h1:/exdXoGamhu5ONeUJH0deniYLWYvQwW66yvlfiiKTu0=
github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w=
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.1 h1:JFrFEBb2xKufg6XkJsJr+WbKb4FQlURi5RUcBveYu9k=
github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM=
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M=
+github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ=
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no=
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
-github.com/google/martian/v3 v3.0.0 h1:pMen7vLs8nvgEYhywH3KDWJIJTeEr2ULsVWHWYHQyBs=
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
-github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57 h1:eqyIo2HjKhKe/mJzTG8n4VqvLXIOEG+SLdDqX7xGtkY=
+github.com/google/martian/v3 v3.1.0 h1:wCKgOCHuUEVfsaQLpPSJb7VdYCdTVZQAuOdYm1yc/60=
+github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
-github.com/google/pprof v0.0.0-20190515194954-54271f7e092f h1:Jnx61latede7zDD3DiiP4gmNz33uK0U5HDUaF0a/HVQ=
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
-github.com/google/pprof v0.0.0-20191028172815-5e965273ee43/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
-github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc h1:DLpL8pWq0v4JYoRpEhDfsJhhJyGKCcQM2WPW2TJs31c=
github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12 h1:TgXhFz35pKlZuUz1pNlOKk1UCSXPpuUIc144Wd7SxCA=
github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3 h1:SRgJV+IoxM5MKyFdlSUeNy6/ycRUF2yBAKdAQswoHUk=
github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d h1:iaAPcMIY2f+gpk8tKf0BMW5sLrlhaASiYAnFmvVG5e0=
github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99 h1:Ak8CrdlwwXwAZxzS66vgPt4U8yUZX7JwLvVR58FN5jM=
github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20210122040257-d980be63207e h1:41CTEDOoUXp+FxbPYuEhth5dE/s+NT1cRuhSoqhBQ1E=
+github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
-github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs=
+github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/googleapis/gax-go v2.0.2+incompatible h1:silFMLAnr330+NRuag/VjIGF7TLp/LBrV2CJKFLWEww=
github.com/googleapis/gax-go v2.0.2+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY=
-github.com/googleapis/gax-go/v2 v2.0.4 h1:hU4mGcQI4DaAYW+IbTun+2qEZVFxK0ySjQLTbS0VQKc=
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM=
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
github.com/googleapis/google-cloud-go-testing v0.0.0-20190904031503-2d24dde44ba5 h1:xOo+ADhpvq/M2z8t7xMswzeaSa5oPDRNjSildIGfF5U=
github.com/googleapis/google-cloud-go-testing v0.0.0-20190904031503-2d24dde44ba5/go.mod h1:xRZIzjtWZ0v0RQc6ob2jLaRvHJu8rShcPkTGPCStK04=
github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
-github.com/grpc-ecosystem/go-grpc-middleware v1.2.1 h1:V59tBiPuMkySHwJkuq/OYkK0WnOLwCwD3UkTbEMr12U=
-github.com/grpc-ecosystem/go-grpc-middleware v1.2.1/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI=
-github.com/hashicorp/golang-lru v0.5.0 h1:CL2msUPvZTLb5O648aiLNJw3hnBxN2+1Jq8rCOH9wdo=
+github.com/grpc-ecosystem/go-grpc-middleware v1.2.2 h1:FlFbCRLd5Jr4iYXZufAvgWN6Ao0JrI5chLINnUXDDr0=
+github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI=
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
-github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU=
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
+github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU=
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM=
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
-github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024 h1:rBMNdlhTLzJjJSDIjNEXX1Pz3Hmwmz91v+zycvx9PJc=
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o=
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
@@ -257,7 +210,6 @@
github.com/jung-kurt/gofpdf v1.13.0/go.mod h1:1hl7y57EsiPAkLbOwzpzqgx1A30nQCk/YmFV8S2vmK0=
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
-github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
@@ -273,11 +225,10 @@
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
-github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g=
-github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
+github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw=
+github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
github.com/phpdave11/gofpdi v1.0.7/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=
-github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
@@ -288,44 +239,44 @@
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=
github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk=
-github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
-github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
-github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
-github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
+github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
+github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA=
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-go.opencensus.io v0.21.0 h1:mU6zScU4U1YAFPHEHYk+3JC4SY7JxgkqS10ZOSyksNg=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
-go.opencensus.io v0.22.0 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4=
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
-go.opencensus.io v0.22.1 h1:8dP3SGL7MPB94crU3bEPplMPe83FI4EouesJUeFHv50=
-go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA=
-go.opencensus.io v0.22.2 h1:75k/FF0Q2YM8QYo07VPddOLBslDt1MZOdEslOHvmzAs=
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
-go.opencensus.io v0.22.3 h1:8sGtKOrtQqkN1bp2AtX+misvLIlOmsEsNd+9NIcPEm8=
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
-go.opencensus.io v0.22.4 h1:LYy1Hy3MJdrCdMwwzxA/dRok4ejH+RwNGbuoD9fCjto=
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
-go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU=
+go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
+go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M=
+go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
-go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI=
+go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk=
+go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
-go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM=
+go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A=
+go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
+go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4=
+go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
+go.uber.org/zap v1.16.0 h1:uFRZXykJGK9lLY4HtgSw44DnIcAM+kRBP7x5m+NpAOM=
+go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ=
go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE=
golang.org/x/build v0.0.0-20191031202223-0706ea4fce0c h1:jjNoDZTS0vmbqBhqD5MPXauZW+kcGyflfDDFBNCPSVI=
golang.org/x/build v0.0.0-20191031202223-0706ea4fce0c/go.mod h1:Nl5grlQor/lxfX9FfGLe+g2cVSCiURG36KQgsg/ODs4=
-golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190424203555-c05e17bb3b2d/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
@@ -334,19 +285,13 @@
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522 h1:OeRHuibLsmZkFj773W4LcfAGsSxJgfPONhr8cmO+eLA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4=
golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
-golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=
-golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136 h1:A1gGSx58LAGVHUUsOf7IiR0u8Xb6W51gRwfDBhkdcaw=
golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
-golang.org/x/exp v0.0.0-20191227195350-da58074b4299 h1:zQpM52jfKHG6II1ISZY1ZcpygvuSFZpLwfluuF89XOg=
golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
-golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a h1:7Wlg8L54In96HTWOaI4sreLJ6qfyGuvSau5el3fK41Y=
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
-golang.org/x/exp v0.0.0-20200207192155-f17229e696bd h1:zkO/Lhoka23X63N9OSzpSeROEUQ5ODw47tM3YWjygbs=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw=
@@ -358,17 +303,14 @@
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/lint v0.0.0-20190409202823-959b441ac422 h1:QzoH/1pFpZguR8NrRHLcO6jKqfv2zpuSqZLgdm7ZmjI=
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs=
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f h1:J5lckAjkw6qYlOZNj90mLYNTEKDvWeuc1yieZ8qUzUE=
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
-golang.org/x/lint v0.0.0-20200130185559-910be7a94367 h1:0IiAsCRByjO2QjX7ZPkw5oU9x+n1YqRL802rjC0c3Aw=
golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
-golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k=
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 h1:2M3HP5CCK1Si9FQhwnzYhXdG6DXeebvUHFpre8QvbyI=
+golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
golang.org/x/mobile v0.0.0-20191031020345-0945064e013a/go.mod h1:p895TfNkDgPEmEQrNiOtIl3j98d/tGU95djDj7NfyjQ=
@@ -376,10 +318,11 @@
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
-golang.org/x/mod v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.4.1 h1:Kvvh58BN8Y9/lBi7hTekvtMpm07eUZ0ck5pRHpsMWrY=
+golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -391,66 +334,59 @@
golang.org/x/net v0.0.0-20190502183928-7f726cade0ab/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
-golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20191101175033-0deb6923b6d9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 h1:efeOvDhwQ29Dj3SdAV/MJf8oukgn+8D8WgaCaRMchF8=
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa h1:F+8P+gmewFQYRk6JoLQLwjBCTu3mcIURZfNkVweuRKA=
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200202094626-16171245cfb2 h1:CCH4IOTTfewWjGOlSp+zGcjutRKlBEZQ6wTn8ozI/nI=
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200301022130-244492dfa37a h1:GuSPYbZzB5/dcLNCwLQLsg3obCJtX9IJhpXkvY7kzk0=
golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e h1:3G+cUijn7XD+S4eJFddp53Pv7+slrESplyjG25HgL+k=
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5 h1:WQ8q63x+f/zpC8Ac1s9wLElVoHhm32p6tudrU72n1QA=
golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200506145744-7e3656a0809f h1:QBjCr1Fz5kw158VqdE9JfI9cJnl/ymnJWAdMuinqL7Y=
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 h1:eDrdRpKgkcCqKZQwyZRyeFZgfqt37SL7Kv3tok06cKE=
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200625001655-4c5254603344 h1:vGXIOMxbNfDTk/aXCmfdLgkrSV+Z2tcbze+pEc3v5W4=
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
-golang.org/x/net v0.0.0-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU=
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
-golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
-golang.org/x/net v0.0.0-20200822124328-c89045814202 h1:VvcQYSHwXgi7W+TpUR6A9g6Up98WAHf3f/ulnJ62IyA=
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210119194325-5f4716e94777 h1:003p0dJM77cxMSyCPFphvZf/Y5/NXf5fzg6ufd1/Oew=
+golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421 h1:Wo7BWFiOk0QRFMLYMqJGFMd9CgUAcGx7V+qEg/h5IBI=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6 h1:pE8b58s1HRDMi8RDc79m0HISf9D4TzseP40cEA6IGfs=
golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw=
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210113205817-d3ed898aa8a3/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99 h1:5vD4XjIc0X5+kHZjx4UecYdjA6mJo+XXNoaW0EjU5Os=
+golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6 h1:bjcUS9ztw9kFmmIxJInhon/0Is3p+EHBKNgquIzo1OI=
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a h1:WXEvlFVvvGxCJLG6REjsT03iWnKLEWinaScsxF2Vm2o=
golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 h1:qwRHBd0NqMbJxfbotnDhm2ByMI1Shq4Y6oRJo21SGJA=
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201207232520-09787c993a3a h1:DcqTD9SDLc+1P/r1EmRBwnVsrOwW+kk2vWf9n+1sGhs=
+golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -459,49 +395,48 @@
golang.org/x/sys v0.0.0-20190502175342-a43fa875dd82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0 h1:HyfiK1WMnHj5FXFXatD+Qs1A/xC2Run6RzeW1SyHxpc=
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191104094858-e8c54fb511f6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8 h1:JA8d3MPx/IToSyXZG/RhwYEtfrKO1Fxrqe8KrkiLXKM=
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200113162924-86b910548bc1 h1:gZpLHxUX5BdYLA08Lj4YCJNN/jk7KtquiArPoeX0WvA=
golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5 h1:LfCXLvNmTYH9kEmVgqbnsWfruoXZIrh4YBgqVHtDvw0=
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4 h1:sfkvUWPNGwSV+8/fNqctR5lS2AqCSqYwXdrjCxp/dXo=
golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527 h1:uYVVQ9WP/Ds2ROhcaGPeIdVq0RIXVLwsHlnvJ+cT1So=
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200331124033-c3d80250170d h1:nc5K6ox/4lTFbMVSL9WRR81ixkcwXThoiF6yf+R9scA=
golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200501052902-10377860bb8e h1:hq86ru83GdWTlfQFZGO4nZJTU4Bs2wfHl8oFHRaXsfc=
golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25 h1:OKbAoGs4fGM5cPLlVQLZGYkFC8OnOfgo6tt0Smf9XhM=
golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200523222454-059865788121 h1:rITEj+UZHYC927n8GT97eC3zrpzXdb/voyeOuVKS46o=
golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200803210538-64077c9b5642 h1:B6caxRw+hozq68X2MY7jEpZh/cr4/aHLv9xU8Kkadrw=
golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43 h1:SgQ6LNaYJU0JIuEHv9+s6EbhSCwYeAf5Yvj6lpYlqAE=
+golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2 h1:z99zHgr7hKfrUcX/KsoJk5FJfjTceCKIp96+biqP4To=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
-golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.5 h1:i6eZZ+zk0SOf0xgBpEpPD18qWcJda6q1sxt3S0kzyUQ=
+golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -514,203 +449,151 @@
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0 h1:Dh6fw+p6FyRl5x/FvNswO1ji0lIGzm3KP8Y9VkS9PTE=
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20190909214602-067311248421/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191010075000-0337d82405ff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191010171213-8abd42400456/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2 h1:EtTFh6h4SAKemS+CURDMTDIANuduG5zKEXShyy18bGA=
golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4 h1:Toz2IK7k8rbltAXwNAxKcn9OzqyNfMUhUNjz3sL0NMk=
golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200117161641-43d50277825c h1:2EA2K0k9bcvvEDlqD8xdlOhCOqq+O/p9Voqi4x9W1YU=
golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74 h1:KW20qMcLRWuIgjdCpHFJbVZA7zsDKtFXPNcm7/eI5ZA=
golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56 h1:DFtSed2q3HtNuVazwVDZ4nSRS/JrZEig0gz2BY4VNrg=
golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb h1:iKlO7ROJc6SttHKlxzwGytRtBUqX4VARrNTgP2YLX5M=
golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
-golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d h1:3K34ovZAOnVaUPxanr0j4ghTZTPTA0CnXvjCl+5lZqk=
golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
-golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4 h1:kDtqNkeBrZb8B+atrj50B5XLHpzXXqcCdZPP/ApQ5NY=
golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
-golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d h1:lzLdP95xJmMpwQ6LUHwrc5V7js93hTiY7gkznu0BgmY=
golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88 h1:4j84u0sokprDu3IdSYHJMmou+YSLflMz8p7yAx/QI4g=
golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2 h1:FD4wDsP+CQUqh2V12OBOt90pLHVToe58P++fUu3ggV4=
golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200713011307-fd294ab11aed h1:+qzWo37K31KxduIYaBeMqJ8MUOyTayOQKpH9aDPLMSY=
-golang.org/x/tools v0.0.0-20200713011307-fd294ab11aed/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-golang.org/x/tools v0.0.0-20200725200936-102e7d357031 h1:VtIxiVHWPhnny2ZTi4f9/2diZKqyLaq3FUTuud5+khA=
-golang.org/x/tools v0.0.0-20200725200936-102e7d357031/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7 h1:LHW24ah7B+uV/OePwNP0p/t889F3QSyLvY8Sg/bK0SY=
golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-golang.org/x/tools v0.0.0-20200817023811-d00afeaade8f/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-golang.org/x/tools v0.0.0-20200825202427-b303f430e36d h1:W07d4xkoAUSNOkOzdzXCdFGxT7o2rW4q8M34tB2i//k=
golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-golang.org/x/tools v0.0.0-20200827163409-021d7c6f1ec3 h1:OjYQxZBKJFs+sJbHkvSGIKNMkZXDJQ9JsMpebGhkafI=
-golang.org/x/tools v0.0.0-20200827163409-021d7c6f1ec3/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=
+golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.1.0 h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY=
+golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-google.golang.org/api v0.4.0 h1:KKgc1aqhV8wDPbDzlDtpvyjZFY3vjz85FP7p4wcQUyI=
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
-google.golang.org/api v0.9.0 h1:jbyannxz0XFD3zdjgrSUsaJbgpH4eTrkdhRChkHPfO8=
google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
-google.golang.org/api v0.10.0 h1:7tmAxx3oKE98VMZ+SBZzvYYWRQ9HODBxmC8mXUsraSQ=
google.golang.org/api v0.10.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
-google.golang.org/api v0.14.0 h1:uMf5uLi4eQMRrMKhCplNik4U4H8Z6C1br3zOtAa/aDE=
google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
-google.golang.org/api v0.15.0 h1:yzlyyDW/J0w8yNFJIhiAJy4kq74S+1DOLdawELNxFMA=
google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
-google.golang.org/api v0.17.0 h1:0q95w+VuFtv4PAx4PZVQdBMmYbaCHbnfKaEiDIcVyag=
google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.20.0 h1:jz2KixHX7EcCPiQrySzPdnYT7DbINAypCqKZ1Z7GM40=
google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.24.0 h1:cG03eaksBzhfSIk7JRGctfp3lanklcOM/mTGvow7BbQ=
google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
-google.golang.org/api v0.28.0 h1:jMF5hhVfMkTZwHW1SDpKq5CkgWLXOb31Foaca9Zr3oM=
google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
-google.golang.org/api v0.29.0 h1:BaiDisFir8O4IJxvAabCGGkQ6yCJegNQqSVoYUNAnbk=
google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
-google.golang.org/api v0.30.0 h1:yfrXXP61wVuLb0vBcG6qaOoIoqYEzOQS8jum51jkv2w=
google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
+google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=
+google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE=
+google.golang.org/api v0.38.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=
+google.golang.org/api v0.39.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=
+google.golang.org/api v0.40.0 h1:uWrpz12dpVPn7cojP82mk02XDgTJLDPc2KbVTxrWb4A=
+google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
-google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I=
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
-google.golang.org/appengine v1.6.2 h1:j8RI1yW0SkI+paT6uGwMlrMI/6zwYA6/CFil8rxOzGI=
google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
-google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM=
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
-google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc=
google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=
+google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
-google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19 h1:Lj2SnHtxkRGJDqnGaSjo+CCdIieEnwVazbOXILwQemk=
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7 h1:ZUjXAXmrAyrmmCPHgCA/vChHcpsX27MZ3yBonD/z1KE=
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873 h1:nfPFGzJkUDX6uBmpN/pSw7MbOAWegH5QDQuoXFHedLg=
google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64 h1:iKtrH9Y8mcbADOP0YFaEMth7OfuHY9xHOwNj4znpM1A=
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
-google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE=
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
-google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51 h1:Ex1mq5jaJof+kRnYi3SlYJ8KKa9Ao3NHyIT5XJ1gF6U=
google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
-google.golang.org/genproto v0.0.0-20191009194640-548a555dbc03/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20191028173616-919d9bdd9fe6/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9 h1:6XzpBoANz1NqMNfDXzc2QmHmbb1vyMsvRfoP5rM+K1I=
google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb h1:ADPHZzpzM4tk4V4S5cnCrr5SwzvlrPRmqqCuJDB8UTs=
google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba h1:pRj9OXZbwNtbtZtOB4dLwfK4u+EVRMvP+e9zKkg2grM=
google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90 h1:7THRSvPuzF1bql5kyFzX0JM0vpGhwuhskgJrJsbZ80Y=
google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
-google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce h1:1mbrb1tUU+Zmt5C94IGKADBTJZjZXAd+BubWi7r9EiI=
google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200305110556-506484158171 h1:xes2Q2k+d/+YNXVw0FpZkIDJiaux4OVrRKXRAzH6A0U=
google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200312145019-da6875a35672 h1:jiDSspVssiikoRPFHT6pYrL+CL6/yIc3b9AuHO/4xik=
google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940 h1:MRHtG0U6SnaUb+s+LhNE1qt1FQ1wlhqr5E4usBKC0uA=
google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84 h1:pSLkPbrjnPyLDYUO2VM9mDLqo2V6CFBY84lFSZAfoi4=
google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380 h1:xriR1EgvKfkKxIoU2uUvrMVl+H26359loFFUleSMXFo=
google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
-google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY=
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
-google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790 h1:FGjyjrQGURdc98leD1P65IdQD9Zlr4McvRcqIlV6OSs=
google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
-google.golang.org/genproto v0.0.0-20200711021454-869866162049 h1:YFTFpQhgvrLrmxtiIncJxFXeCyq84ixuKWVCaCAi9Oc=
-google.golang.org/genproto v0.0.0-20200711021454-869866162049/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20200726014623-da3ae01ef02d h1:HJaAqDnKreMkv+AQyf1Mcw0jEmL9kKBNL07RDJu1N/k=
-google.golang.org/genproto v0.0.0-20200726014623-da3ae01ef02d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f h1:ohwtWcCwB/fZUxh/vjazHorYmBnua3NmY3CAjwC7mEA=
google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20200815001618-f69a88009b70/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20200825200019-8632dd797987 h1:PDIOdWxZ8eRizhKa1AAvY53xsvLB1cWorMjslvY3VA8=
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20200827165113-ac2560b5e952 h1:y857ZwFJ60XFsJ00vOc7ouVMLOZp7C+7h03pESkILFY=
-google.golang.org/genproto v0.0.0-20200827165113-ac2560b5e952/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/grpc v1.19.0 h1:cfg4PD8YEdSFnm7qLV4++93WcmhH2nIUhMjhdCvl3j8=
+google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210203152818-3206188e46ba/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210207032614-bba0dbe2a9ea/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c h1:7A9LQhrZmuCPI79/sYSbscFqBp4XFYf6oaIQuV1xji4=
+google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
-google.golang.org/grpc v1.20.1 h1:Hz2g2wirWK7H0qIIhGIqRGTuMwTE8HEKFnDZZ7lm9NU=
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
-google.golang.org/grpc v1.21.1 h1:j6XxA85m/6txkUCHvzlV5f+HBNl/1r5cZ2A/3IEFOO8=
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
-google.golang.org/grpc v1.23.1 h1:q4XQuHFC6I28BKZpo6IYyb3mNO+l7lSOxRuYTCiDfXk=
google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
-google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg=
google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
-google.golang.org/grpc v1.27.0 h1:rRYRFMVgRv6E0D70Skyfsr28tDXIuuPZyWGMPdMcnXg=
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
-google.golang.org/grpc v1.27.1 h1:zvIju4sqAGvwKspUQOhwnpcqSbzi7/H6QomNNjTL4sk=
google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
-google.golang.org/grpc v1.28.0 h1:bO/TA4OxCOummhSf10siHuG7vJOiwh7SpRpFZDkOgl4=
google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
-google.golang.org/grpc v1.29.1 h1:EC2SB8S04d2r73uptxphDSUG+kTKVgjRPF+N3xpxRB4=
google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
-google.golang.org/grpc v1.30.0 h1:M5a8xTlYTxwMn5ZFkwhRabsygDY5G8TYLyQDBxJNAxE=
google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
-google.golang.org/grpc v1.31.0 h1:T7P4R73V3SSDPhH7WW7ATbfViLtmamH0DKrP3f9AuDI=
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
-google.golang.org/grpc v1.31.1 h1:SfXqXS5hkufcdZ/mHtYCh53P2b+92WQq/DZcKLgsFRs=
google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
+google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=
+google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
+google.golang.org/grpc v1.36.0 h1:o1bcQ6imQMIOpdrO3SWf2z5RV72WbDwdXuK0MDlc8As=
+google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
-google.golang.org/protobuf v1.21.0 h1:qdOKuR/EIArgaWNjetjgTzgVTAZ+S/WXVrq9HW9zimw=
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
-google.golang.org/protobuf v1.22.0 h1:cJv5/xdbk1NnMPR1VP9+HU6gupuG9MLBoH1r6RHZ2MY=
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM=
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.24.0 h1:UhZDfRO8JRQru4/+LlLE0BRKGF8L+PICnvYZmx/fEGA=
google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c=
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
@@ -726,15 +609,14 @@
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc h1:/hemPrYIhOhy8zYrNj+069zDB68us2sMGsfkFJO0iZs=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM=
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
-honnef.co/go/tools v0.0.1-2020.1.3 h1:sXmLre5bzIR6ypkjXCDI3jHPssRhc8KD/Ome589sc3U=
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
honnef.co/go/tools v0.0.1-2020.1.4 h1:UoveltGrhghAA7ePc+e+QYDHXrBps2PqFZiHkGR/xK8=
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
diff --git a/httprpc/server.go b/httprpc/server.go
index 6372086..87f22cd 100644
--- a/httprpc/server.go
+++ b/httprpc/server.go
@@ -341,10 +341,10 @@
// assume most call needs less than 1 minute (both exec,
// file access),
// according to API metrics, 99%ile of Execute API latency
- // was 33.225 seconds (as of May 15, 2019).
+ // was ~45 seconds (as of Nov 19, 2020).
// only a few exec call may need longer timeout.
// see below if status.Code(err) == codes.DeadlineExceeded case.
- timeouts := []time.Duration{40 * time.Second, 1 * time.Minute, 3 * time.Minute, 5 * time.Minute}
+ timeouts := []time.Duration{50 * time.Second, 90 * time.Second, 3 * time.Minute, 5 * time.Minute}
var resp proto.Message
authOK := false
err = opt.retry.Do(ctx, func() error {
diff --git a/proto/api/goma_data.pb.go b/proto/api/goma_data.pb.go
index 404d7dc..f7e857c 100644
--- a/proto/api/goma_data.pb.go
+++ b/proto/api/goma_data.pb.go
@@ -7,16 +7,16 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.25.0
-// protoc v3.13.0
+// protoc v3.15.3
// source: api/goma_data.proto
package api
import (
proto "github.com/golang/protobuf/proto"
- timestamp "github.com/golang/protobuf/ptypes/timestamp"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ timestamppb "google.golang.org/protobuf/types/known/timestamppb"
reflect "reflect"
sync "sync"
)
@@ -162,7 +162,7 @@
// Deprecated: Use RequesterInfo_GomaApiVersion.Descriptor instead.
func (RequesterInfo_GomaApiVersion) EnumDescriptor() ([]byte, []int) {
- return file_api_goma_data_proto_rawDescGZIP(), []int{5, 0}
+ return file_api_goma_data_proto_rawDescGZIP(), []int{6, 0}
}
// Implementation Note: `WINDOWS` is defined on Win, so we have to add
@@ -223,7 +223,7 @@
// Deprecated: Use RequesterInfo_PathStyle.Descriptor instead.
func (RequesterInfo_PathStyle) EnumDescriptor() ([]byte, []int) {
- return file_api_goma_data_proto_rawDescGZIP(), []int{5, 1}
+ return file_api_goma_data_proto_rawDescGZIP(), []int{6, 1}
}
type ExecReq_CachePolicy int32
@@ -286,7 +286,7 @@
// Deprecated: Use ExecReq_CachePolicy.Descriptor instead.
func (ExecReq_CachePolicy) EnumDescriptor() ([]byte, []int) {
- return file_api_goma_data_proto_rawDescGZIP(), []int{7, 0}
+ return file_api_goma_data_proto_rawDescGZIP(), []int{8, 0}
}
type ExecResp_ExecError int32
@@ -342,7 +342,7 @@
// Deprecated: Use ExecResp_ExecError.Descriptor instead.
func (ExecResp_ExecError) EnumDescriptor() ([]byte, []int) {
- return file_api_goma_data_proto_rawDescGZIP(), []int{9, 0}
+ return file_api_goma_data_proto_rawDescGZIP(), []int{10, 0}
}
// Specifies the reason of ExecError::BAD_REQUEST.
@@ -401,7 +401,7 @@
// Deprecated: Use ExecResp_BadRequestReasonCode.Descriptor instead.
func (ExecResp_BadRequestReasonCode) EnumDescriptor() ([]byte, []int) {
- return file_api_goma_data_proto_rawDescGZIP(), []int{9, 1}
+ return file_api_goma_data_proto_rawDescGZIP(), []int{10, 1}
}
type ExecResp_CacheSource int32
@@ -463,7 +463,7 @@
// Deprecated: Use ExecResp_CacheSource.Descriptor instead.
func (ExecResp_CacheSource) EnumDescriptor() ([]byte, []int) {
- return file_api_goma_data_proto_rawDescGZIP(), []int{9, 2}
+ return file_api_goma_data_proto_rawDescGZIP(), []int{10, 2}
}
// hash_key = sha256(serialized FileBlob)
@@ -977,7 +977,62 @@
return nil
}
-// NEXT ID TO USE: 12
+type PlatformProperty struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
+ Value *string `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"`
+}
+
+func (x *PlatformProperty) Reset() {
+ *x = PlatformProperty{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_api_goma_data_proto_msgTypes[5]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *PlatformProperty) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PlatformProperty) ProtoMessage() {}
+
+func (x *PlatformProperty) ProtoReflect() protoreflect.Message {
+ mi := &file_api_goma_data_proto_msgTypes[5]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use PlatformProperty.ProtoReflect.Descriptor instead.
+func (*PlatformProperty) Descriptor() ([]byte, []int) {
+ return file_api_goma_data_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *PlatformProperty) GetName() string {
+ if x != nil && x.Name != nil {
+ return *x.Name
+ }
+ return ""
+}
+
+func (x *PlatformProperty) GetValue() string {
+ if x != nil && x.Value != nil {
+ return *x.Value
+ }
+ return ""
+}
+
+// NEXT ID TO USE: 14
type RequesterInfo struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -1009,6 +1064,12 @@
Dimensions []string `protobuf:"bytes,10,rep,name=dimensions" json:"dimensions,omitempty"`
// Requester's path style.
PathStyle *RequesterInfo_PathStyle `protobuf:"varint,11,opt,name=path_style,json=pathStyle,enum=devtools_goma.RequesterInfo_PathStyle" json:"path_style,omitempty"`
+ // re-client compat flags
+ // The exec root of the command.
+ ExecRoot *string `protobuf:"bytes,12,opt,name=exec_root,json=execRoot" json:"exec_root,omitempty"`
+ // This is used to identify remote platform settings like the docker image
+ // to use to run the command.
+ PlatformProperties []*PlatformProperty `protobuf:"bytes,13,rep,name=platform_properties,json=platformProperties" json:"platform_properties,omitempty"`
}
// Default values for RequesterInfo fields.
@@ -1019,7 +1080,7 @@
func (x *RequesterInfo) Reset() {
*x = RequesterInfo{}
if protoimpl.UnsafeEnabled {
- mi := &file_api_goma_data_proto_msgTypes[5]
+ mi := &file_api_goma_data_proto_msgTypes[6]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -1032,7 +1093,7 @@
func (*RequesterInfo) ProtoMessage() {}
func (x *RequesterInfo) ProtoReflect() protoreflect.Message {
- mi := &file_api_goma_data_proto_msgTypes[5]
+ mi := &file_api_goma_data_proto_msgTypes[6]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -1045,7 +1106,7 @@
// Deprecated: Use RequesterInfo.ProtoReflect.Descriptor instead.
func (*RequesterInfo) Descriptor() ([]byte, []int) {
- return file_api_goma_data_proto_rawDescGZIP(), []int{5}
+ return file_api_goma_data_proto_rawDescGZIP(), []int{6}
}
func (x *RequesterInfo) GetAddr() string {
@@ -1118,6 +1179,20 @@
return RequesterInfo_UNKNOWN_STYLE
}
+func (x *RequesterInfo) GetExecRoot() string {
+ if x != nil && x.ExecRoot != nil {
+ return *x.ExecRoot
+ }
+ return ""
+}
+
+func (x *RequesterInfo) GetPlatformProperties() []*PlatformProperty {
+ if x != nil {
+ return x.PlatformProperties
+ }
+ return nil
+}
+
type RequesterEnv struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -1136,7 +1211,7 @@
func (x *RequesterEnv) Reset() {
*x = RequesterEnv{}
if protoimpl.UnsafeEnabled {
- mi := &file_api_goma_data_proto_msgTypes[6]
+ mi := &file_api_goma_data_proto_msgTypes[7]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -1149,7 +1224,7 @@
func (*RequesterEnv) ProtoMessage() {}
func (x *RequesterEnv) ProtoReflect() protoreflect.Message {
- mi := &file_api_goma_data_proto_msgTypes[6]
+ mi := &file_api_goma_data_proto_msgTypes[7]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -1162,7 +1237,7 @@
// Deprecated: Use RequesterEnv.ProtoReflect.Descriptor instead.
func (*RequesterEnv) Descriptor() ([]byte, []int) {
- return file_api_goma_data_proto_rawDescGZIP(), []int{6}
+ return file_api_goma_data_proto_rawDescGZIP(), []int{7}
}
func (x *RequesterEnv) GetGomaccPath() string {
@@ -1296,7 +1371,7 @@
func (x *ExecReq) Reset() {
*x = ExecReq{}
if protoimpl.UnsafeEnabled {
- mi := &file_api_goma_data_proto_msgTypes[7]
+ mi := &file_api_goma_data_proto_msgTypes[8]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -1309,7 +1384,7 @@
func (*ExecReq) ProtoMessage() {}
func (x *ExecReq) ProtoReflect() protoreflect.Message {
- mi := &file_api_goma_data_proto_msgTypes[7]
+ mi := &file_api_goma_data_proto_msgTypes[8]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -1322,7 +1397,7 @@
// Deprecated: Use ExecReq.ProtoReflect.Descriptor instead.
func (*ExecReq) Descriptor() ([]byte, []int) {
- return file_api_goma_data_proto_rawDescGZIP(), []int{7}
+ return file_api_goma_data_proto_rawDescGZIP(), []int{8}
}
func (x *ExecReq) GetCommandSpec() *CommandSpec {
@@ -1445,15 +1520,15 @@
unknownFields protoimpl.UnknownFields
// When the worker started executing the action command.
- ExecutionStartTimestamp *timestamp.Timestamp `protobuf:"bytes,1,opt,name=execution_start_timestamp,json=executionStartTimestamp" json:"execution_start_timestamp,omitempty"`
+ ExecutionStartTimestamp *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=execution_start_timestamp,json=executionStartTimestamp" json:"execution_start_timestamp,omitempty"`
// When the worker completed executing the action command.
- ExecutionCompletedTimestamp *timestamp.Timestamp `protobuf:"bytes,2,opt,name=execution_completed_timestamp,json=executionCompletedTimestamp" json:"execution_completed_timestamp,omitempty"`
+ ExecutionCompletedTimestamp *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=execution_completed_timestamp,json=executionCompletedTimestamp" json:"execution_completed_timestamp,omitempty"`
}
func (x *ExecutionStats) Reset() {
*x = ExecutionStats{}
if protoimpl.UnsafeEnabled {
- mi := &file_api_goma_data_proto_msgTypes[8]
+ mi := &file_api_goma_data_proto_msgTypes[9]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -1466,7 +1541,7 @@
func (*ExecutionStats) ProtoMessage() {}
func (x *ExecutionStats) ProtoReflect() protoreflect.Message {
- mi := &file_api_goma_data_proto_msgTypes[8]
+ mi := &file_api_goma_data_proto_msgTypes[9]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -1479,17 +1554,17 @@
// Deprecated: Use ExecutionStats.ProtoReflect.Descriptor instead.
func (*ExecutionStats) Descriptor() ([]byte, []int) {
- return file_api_goma_data_proto_rawDescGZIP(), []int{8}
+ return file_api_goma_data_proto_rawDescGZIP(), []int{9}
}
-func (x *ExecutionStats) GetExecutionStartTimestamp() *timestamp.Timestamp {
+func (x *ExecutionStats) GetExecutionStartTimestamp() *timestamppb.Timestamp {
if x != nil {
return x.ExecutionStartTimestamp
}
return nil
}
-func (x *ExecutionStats) GetExecutionCompletedTimestamp() *timestamp.Timestamp {
+func (x *ExecutionStats) GetExecutionCompletedTimestamp() *timestamppb.Timestamp {
if x != nil {
return x.ExecutionCompletedTimestamp
}
@@ -1554,7 +1629,7 @@
func (x *ExecResp) Reset() {
*x = ExecResp{}
if protoimpl.UnsafeEnabled {
- mi := &file_api_goma_data_proto_msgTypes[9]
+ mi := &file_api_goma_data_proto_msgTypes[10]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -1567,7 +1642,7 @@
func (*ExecResp) ProtoMessage() {}
func (x *ExecResp) ProtoReflect() protoreflect.Message {
- mi := &file_api_goma_data_proto_msgTypes[9]
+ mi := &file_api_goma_data_proto_msgTypes[10]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -1580,7 +1655,7 @@
// Deprecated: Use ExecResp.ProtoReflect.Descriptor instead.
func (*ExecResp) Descriptor() ([]byte, []int) {
- return file_api_goma_data_proto_rawDescGZIP(), []int{9}
+ return file_api_goma_data_proto_rawDescGZIP(), []int{10}
}
func (x *ExecResp) GetResult() *ExecResult {
@@ -1826,7 +1901,7 @@
func (x *StoreFileReq) Reset() {
*x = StoreFileReq{}
if protoimpl.UnsafeEnabled {
- mi := &file_api_goma_data_proto_msgTypes[10]
+ mi := &file_api_goma_data_proto_msgTypes[11]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -1839,7 +1914,7 @@
func (*StoreFileReq) ProtoMessage() {}
func (x *StoreFileReq) ProtoReflect() protoreflect.Message {
- mi := &file_api_goma_data_proto_msgTypes[10]
+ mi := &file_api_goma_data_proto_msgTypes[11]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -1852,7 +1927,7 @@
// Deprecated: Use StoreFileReq.ProtoReflect.Descriptor instead.
func (*StoreFileReq) Descriptor() ([]byte, []int) {
- return file_api_goma_data_proto_rawDescGZIP(), []int{10}
+ return file_api_goma_data_proto_rawDescGZIP(), []int{11}
}
func (x *StoreFileReq) GetBlob() []*FileBlob {
@@ -1880,7 +1955,7 @@
func (x *StoreFileResp) Reset() {
*x = StoreFileResp{}
if protoimpl.UnsafeEnabled {
- mi := &file_api_goma_data_proto_msgTypes[11]
+ mi := &file_api_goma_data_proto_msgTypes[12]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -1893,7 +1968,7 @@
func (*StoreFileResp) ProtoMessage() {}
func (x *StoreFileResp) ProtoReflect() protoreflect.Message {
- mi := &file_api_goma_data_proto_msgTypes[11]
+ mi := &file_api_goma_data_proto_msgTypes[12]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -1906,7 +1981,7 @@
// Deprecated: Use StoreFileResp.ProtoReflect.Descriptor instead.
func (*StoreFileResp) Descriptor() ([]byte, []int) {
- return file_api_goma_data_proto_rawDescGZIP(), []int{11}
+ return file_api_goma_data_proto_rawDescGZIP(), []int{12}
}
func (x *StoreFileResp) GetHashKey() []string {
@@ -1928,7 +2003,7 @@
func (x *LookupFileReq) Reset() {
*x = LookupFileReq{}
if protoimpl.UnsafeEnabled {
- mi := &file_api_goma_data_proto_msgTypes[12]
+ mi := &file_api_goma_data_proto_msgTypes[13]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -1941,7 +2016,7 @@
func (*LookupFileReq) ProtoMessage() {}
func (x *LookupFileReq) ProtoReflect() protoreflect.Message {
- mi := &file_api_goma_data_proto_msgTypes[12]
+ mi := &file_api_goma_data_proto_msgTypes[13]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -1954,7 +2029,7 @@
// Deprecated: Use LookupFileReq.ProtoReflect.Descriptor instead.
func (*LookupFileReq) Descriptor() ([]byte, []int) {
- return file_api_goma_data_proto_rawDescGZIP(), []int{12}
+ return file_api_goma_data_proto_rawDescGZIP(), []int{13}
}
func (x *LookupFileReq) GetHashKey() []string {
@@ -1982,7 +2057,7 @@
func (x *LookupFileResp) Reset() {
*x = LookupFileResp{}
if protoimpl.UnsafeEnabled {
- mi := &file_api_goma_data_proto_msgTypes[13]
+ mi := &file_api_goma_data_proto_msgTypes[14]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -1995,7 +2070,7 @@
func (*LookupFileResp) ProtoMessage() {}
func (x *LookupFileResp) ProtoReflect() protoreflect.Message {
- mi := &file_api_goma_data_proto_msgTypes[13]
+ mi := &file_api_goma_data_proto_msgTypes[14]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -2008,7 +2083,7 @@
// Deprecated: Use LookupFileResp.ProtoReflect.Descriptor instead.
func (*LookupFileResp) Descriptor() ([]byte, []int) {
- return file_api_goma_data_proto_rawDescGZIP(), []int{13}
+ return file_api_goma_data_proto_rawDescGZIP(), []int{14}
}
func (x *LookupFileResp) GetBlob() []*FileBlob {
@@ -2027,7 +2102,7 @@
func (x *EmptyMessage) Reset() {
*x = EmptyMessage{}
if protoimpl.UnsafeEnabled {
- mi := &file_api_goma_data_proto_msgTypes[14]
+ mi := &file_api_goma_data_proto_msgTypes[15]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -2040,7 +2115,7 @@
func (*EmptyMessage) ProtoMessage() {}
func (x *EmptyMessage) ProtoReflect() protoreflect.Message {
- mi := &file_api_goma_data_proto_msgTypes[14]
+ mi := &file_api_goma_data_proto_msgTypes[15]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -2053,7 +2128,7 @@
// Deprecated: Use EmptyMessage.ProtoReflect.Descriptor instead.
func (*EmptyMessage) Descriptor() ([]byte, []int) {
- return file_api_goma_data_proto_rawDescGZIP(), []int{14}
+ return file_api_goma_data_proto_rawDescGZIP(), []int{15}
}
type HttpPortResponse struct {
@@ -2067,7 +2142,7 @@
func (x *HttpPortResponse) Reset() {
*x = HttpPortResponse{}
if protoimpl.UnsafeEnabled {
- mi := &file_api_goma_data_proto_msgTypes[15]
+ mi := &file_api_goma_data_proto_msgTypes[16]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -2080,7 +2155,7 @@
func (*HttpPortResponse) ProtoMessage() {}
func (x *HttpPortResponse) ProtoReflect() protoreflect.Message {
- mi := &file_api_goma_data_proto_msgTypes[15]
+ mi := &file_api_goma_data_proto_msgTypes[16]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -2093,7 +2168,7 @@
// Deprecated: Use HttpPortResponse.ProtoReflect.Descriptor instead.
func (*HttpPortResponse) Descriptor() ([]byte, []int) {
- return file_api_goma_data_proto_rawDescGZIP(), []int{15}
+ return file_api_goma_data_proto_rawDescGZIP(), []int{16}
}
func (x *HttpPortResponse) GetPort() int32 {
@@ -2123,7 +2198,7 @@
func (x *ExecResult_Output) Reset() {
*x = ExecResult_Output{}
if protoimpl.UnsafeEnabled {
- mi := &file_api_goma_data_proto_msgTypes[16]
+ mi := &file_api_goma_data_proto_msgTypes[17]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -2136,7 +2211,7 @@
func (*ExecResult_Output) ProtoMessage() {}
func (x *ExecResult_Output) ProtoReflect() protoreflect.Message {
- mi := &file_api_goma_data_proto_msgTypes[16]
+ mi := &file_api_goma_data_proto_msgTypes[17]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -2186,7 +2261,7 @@
func (x *ExecReq_Input) Reset() {
*x = ExecReq_Input{}
if protoimpl.UnsafeEnabled {
- mi := &file_api_goma_data_proto_msgTypes[17]
+ mi := &file_api_goma_data_proto_msgTypes[18]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -2199,7 +2274,7 @@
func (*ExecReq_Input) ProtoMessage() {}
func (x *ExecReq_Input) ProtoReflect() protoreflect.Message {
- mi := &file_api_goma_data_proto_msgTypes[17]
+ mi := &file_api_goma_data_proto_msgTypes[18]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -2212,7 +2287,7 @@
// Deprecated: Use ExecReq_Input.ProtoReflect.Descriptor instead.
func (*ExecReq_Input) Descriptor() ([]byte, []int) {
- return file_api_goma_data_proto_rawDescGZIP(), []int{7, 0}
+ return file_api_goma_data_proto_rawDescGZIP(), []int{8, 0}
}
func (x *ExecReq_Input) GetFilename() string {
@@ -2333,309 +2408,320 @@
0x6c, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x52, 0x04, 0x62, 0x6c, 0x6f, 0x62, 0x12, 0x2a, 0x0a, 0x0d,
0x69, 0x73, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0d, 0x20,
0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0c, 0x69, 0x73, 0x45, 0x78,
- 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0xcf, 0x03, 0x0a, 0x0d, 0x52, 0x65, 0x71,
- 0x75, 0x65, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x64,
- 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x1a,
- 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
- 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x6f,
- 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x69, 0x64, 0x18,
- 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x50,
- 0x72, 0x6f, 0x78, 0x79, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65,
- 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x3a, 0x01, 0x32, 0x52, 0x0a,
- 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69,
- 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05,
- 0x72, 0x65, 0x74, 0x72, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x65, 0x74,
- 0x72, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x67, 0x6f, 0x6d, 0x61, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73,
- 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x67, 0x6f, 0x6d, 0x61, 0x52,
- 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x75, 0x69, 0x6c, 0x64,
- 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x64,
- 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73,
- 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f,
- 0x6e, 0x73, 0x12, 0x45, 0x0a, 0x0a, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x73, 0x74, 0x79, 0x6c, 0x65,
- 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x64, 0x65, 0x76, 0x74, 0x6f, 0x6f, 0x6c,
- 0x73, 0x5f, 0x67, 0x6f, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x72,
- 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x52, 0x09,
- 0x70, 0x61, 0x74, 0x68, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x22, 0x25, 0x0a, 0x0e, 0x47, 0x6f, 0x6d,
- 0x61, 0x41, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x13, 0x0a, 0x0f, 0x43,
- 0x55, 0x52, 0x52, 0x45, 0x4e, 0x54, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x02,
- 0x22, 0x42, 0x0a, 0x09, 0x50, 0x61, 0x74, 0x68, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x12, 0x11, 0x0a,
- 0x0d, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x53, 0x54, 0x59, 0x4c, 0x45, 0x10, 0x00,
- 0x12, 0x0f, 0x0a, 0x0b, 0x50, 0x4f, 0x53, 0x49, 0x58, 0x5f, 0x53, 0x54, 0x59, 0x4c, 0x45, 0x10,
- 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x53, 0x54, 0x59,
- 0x4c, 0x45, 0x10, 0x02, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x99, 0x02, 0x0a, 0x0c, 0x52,
- 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x72, 0x45, 0x6e, 0x76, 0x12, 0x1f, 0x0a, 0x0b, 0x67,
- 0x6f, 0x6d, 0x61, 0x63, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x29, 0x20, 0x01, 0x28, 0x09,
- 0x52, 0x0a, 0x67, 0x6f, 0x6d, 0x61, 0x63, 0x63, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1d, 0x0a, 0x0a,
- 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x09,
- 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x75,
- 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x75, 0x6d, 0x61, 0x73,
- 0x6b, 0x12, 0x23, 0x0a, 0x0d, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x5f, 0x6f, 0x75, 0x74, 0x70,
- 0x75, 0x74, 0x18, 0x32, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79,
- 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x5f, 0x6c, 0x6f,
- 0x63, 0x61, 0x6c, 0x18, 0x33, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x75, 0x73, 0x65, 0x4c, 0x6f,
- 0x63, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x18,
- 0x34, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12,
- 0x25, 0x0a, 0x0e, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e,
- 0x64, 0x18, 0x35, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x43,
- 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61,
- 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x3c, 0x20,
- 0x03, 0x28, 0x09, 0x52, 0x11, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x70,
- 0x75, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x22, 0xe8, 0x07, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, 0x52,
- 0x65, 0x71, 0x12, 0x3d, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x73, 0x70,
- 0x65, 0x63, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x64, 0x65, 0x76, 0x74, 0x6f,
- 0x6f, 0x6c, 0x73, 0x5f, 0x67, 0x6f, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64,
- 0x53, 0x70, 0x65, 0x63, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x53, 0x70, 0x65,
- 0x63, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x72, 0x67, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03,
- 0x61, 0x72, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09,
- 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x77, 0x64, 0x18, 0x04, 0x20, 0x01,
- 0x28, 0x09, 0x52, 0x03, 0x63, 0x77, 0x64, 0x12, 0x32, 0x0a, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74,
- 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0a, 0x32, 0x1c, 0x2e, 0x64, 0x65, 0x76, 0x74, 0x6f, 0x6f, 0x6c,
- 0x73, 0x5f, 0x67, 0x6f, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x2e, 0x49,
- 0x6e, 0x70, 0x75, 0x74, 0x52, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x65,
- 0x78, 0x70, 0x61, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x61, 0x72, 0x67, 0x18, 0x0e, 0x20, 0x03, 0x28,
- 0x09, 0x52, 0x0b, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x65, 0x64, 0x41, 0x72, 0x67, 0x12, 0x3d,
- 0x0a, 0x0a, 0x73, 0x75, 0x62, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, 0x0f, 0x20, 0x03,
- 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x64, 0x65, 0x76, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x67, 0x6f,
- 0x6d, 0x61, 0x2e, 0x53, 0x75, 0x62, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x53, 0x70, 0x65,
- 0x63, 0x52, 0x0a, 0x73, 0x75, 0x62, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x43, 0x0a,
- 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18,
- 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x64, 0x65, 0x76, 0x74, 0x6f, 0x6f, 0x6c, 0x73,
- 0x5f, 0x67, 0x6f, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x72, 0x49,
- 0x6e, 0x66, 0x6f, 0x52, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e,
- 0x66, 0x6f, 0x12, 0x57, 0x0a, 0x0c, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69,
- 0x63, 0x79, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x64, 0x65, 0x76, 0x74, 0x6f,
- 0x6f, 0x6c, 0x73, 0x5f, 0x67, 0x6f, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71,
- 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x3a, 0x10, 0x4c, 0x4f,
- 0x4f, 0x4b, 0x55, 0x50, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x45, 0x52, 0x0b,
- 0x63, 0x61, 0x63, 0x68, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x40, 0x0a, 0x0d, 0x72,
- 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x76, 0x18, 0x20, 0x20, 0x01,
- 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x64, 0x65, 0x76, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x67, 0x6f,
- 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x72, 0x45, 0x6e, 0x76, 0x52,
- 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x72, 0x45, 0x6e, 0x76, 0x12, 0x23, 0x0a,
- 0x0d, 0x68, 0x65, 0x72, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x21,
- 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x68, 0x65, 0x72, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x4d, 0x6f,
- 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x72, 0x61, 0x63, 0x65, 0x18, 0x22, 0x20, 0x01, 0x28,
- 0x08, 0x52, 0x05, 0x74, 0x72, 0x61, 0x63, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x65, 0x78, 0x70, 0x65,
- 0x63, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65,
- 0x73, 0x18, 0x23, 0x20, 0x03, 0x28, 0x09, 0x52, 0x13, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65,
- 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x14,
- 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f,
- 0x64, 0x69, 0x72, 0x73, 0x18, 0x24, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x65, 0x78, 0x70, 0x65,
- 0x63, 0x74, 0x65, 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x44, 0x69, 0x72, 0x73, 0x12, 0x2d,
- 0x0a, 0x12, 0x74, 0x6f, 0x6f, 0x6c, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x6e, 0x63, 0x6c,
- 0x75, 0x64, 0x65, 0x64, 0x18, 0x25, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x74, 0x6f, 0x6f, 0x6c,
- 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x12, 0x45, 0x0a,
- 0x0f, 0x74, 0x6f, 0x6f, 0x6c, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x73,
- 0x18, 0x26, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x64, 0x65, 0x76, 0x74, 0x6f, 0x6f, 0x6c,
- 0x73, 0x5f, 0x67, 0x6f, 0x6d, 0x61, 0x2e, 0x54, 0x6f, 0x6f, 0x6c, 0x63, 0x68, 0x61, 0x69, 0x6e,
- 0x53, 0x70, 0x65, 0x63, 0x52, 0x0e, 0x74, 0x6f, 0x6f, 0x6c, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x53,
- 0x70, 0x65, 0x63, 0x73, 0x1a, 0x71, 0x0a, 0x05, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1a, 0x0a,
- 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52,
- 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x68, 0x61, 0x73,
- 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0c, 0x20, 0x02, 0x28, 0x09, 0x52, 0x07, 0x68, 0x61, 0x73,
- 0x68, 0x4b, 0x65, 0x79, 0x12, 0x31, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18,
- 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x64, 0x65, 0x76, 0x74, 0x6f, 0x6f, 0x6c, 0x73,
- 0x5f, 0x67, 0x6f, 0x6d, 0x61, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x52, 0x07,
- 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x62, 0x0a, 0x0b, 0x43, 0x61, 0x63, 0x68, 0x65,
- 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x14, 0x0a, 0x10, 0x4c, 0x4f, 0x4f, 0x4b, 0x55, 0x50,
- 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x45, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b,
- 0x4c, 0x4f, 0x4f, 0x4b, 0x55, 0x50, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x02, 0x12, 0x0e, 0x0a,
- 0x0a, 0x53, 0x54, 0x4f, 0x52, 0x45, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x03, 0x12, 0x1c, 0x0a,
- 0x18, 0x4c, 0x4f, 0x4f, 0x4b, 0x55, 0x50, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x4f, 0x52,
- 0x45, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x04, 0x4a, 0x04, 0x08, 0x63, 0x10,
- 0x64, 0x22, 0xc8, 0x01, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x53,
- 0x74, 0x61, 0x74, 0x73, 0x12, 0x56, 0x0a, 0x19, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f,
- 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
- 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
- 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74,
- 0x61, 0x6d, 0x70, 0x52, 0x17, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74,
- 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x5e, 0x0a, 0x1d,
- 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65,
- 0x74, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20,
- 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
- 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52,
- 0x1b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65,
- 0x74, 0x65, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xfd, 0x12, 0x0a,
- 0x08, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x70, 0x12, 0x31, 0x0a, 0x06, 0x72, 0x65, 0x73,
- 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x64, 0x65, 0x76, 0x74,
- 0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x67, 0x6f, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65,
- 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x3b, 0x0a, 0x05,
- 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x64, 0x65,
- 0x76, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x67, 0x6f, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63,
- 0x52, 0x65, 0x73, 0x70, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x02,
- 0x4f, 0x4b, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x6c, 0x0a, 0x17, 0x62, 0x61, 0x64,
- 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x5f,
- 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x64, 0x65, 0x76,
- 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x67, 0x6f, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x52,
- 0x65, 0x73, 0x70, 0x2e, 0x42, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65,
- 0x61, 0x73, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x3a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57,
- 0x4e, 0x52, 0x14, 0x62, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x61,
- 0x73, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x69, 0x73, 0x73, 0x69,
- 0x6e, 0x67, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c,
- 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x25, 0x0a, 0x0e,
- 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x0f,
- 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x61,
- 0x73, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73,
- 0x73, 0x61, 0x67, 0x65, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f,
- 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x5f, 0x0a, 0x2a, 0x66, 0x6f, 0x72, 0x63,
- 0x65, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x66,
- 0x69, 0x6c, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x75, 0x6e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65,
- 0x64, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61,
- 0x6c, 0x73, 0x65, 0x52, 0x24, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x4f,
- 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x55, 0x6e, 0x6d, 0x61,
- 0x74, 0x63, 0x68, 0x65, 0x64, 0x48, 0x61, 0x73, 0x68, 0x12, 0x65, 0x0a, 0x2d, 0x66, 0x6f, 0x72,
- 0x63, 0x65, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f,
- 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x75, 0x6e, 0x6d, 0x61, 0x74, 0x63, 0x68,
- 0x65, 0x64, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08,
- 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x27, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x53, 0x74,
- 0x6f, 0x72, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72,
- 0x55, 0x6e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
- 0x12, 0x6d, 0x0a, 0x31, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f,
- 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x5f,
- 0x75, 0x6e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x73, 0x75, 0x62, 0x70, 0x72, 0x6f,
- 0x67, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c,
- 0x73, 0x65, 0x52, 0x2b, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x75,
- 0x74, 0x70, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x55, 0x6e, 0x6d, 0x61, 0x74,
- 0x63, 0x68, 0x65, 0x64, 0x53, 0x75, 0x62, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x73, 0x12,
- 0x1b, 0x0a, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x15, 0x20, 0x01,
- 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x63, 0x68, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x40, 0x0a, 0x09,
- 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x68, 0x69, 0x74, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0e, 0x32,
- 0x23, 0x2e, 0x64, 0x65, 0x76, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x67, 0x6f, 0x6d, 0x61, 0x2e,
- 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x70, 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x6f,
- 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x63, 0x61, 0x63, 0x68, 0x65, 0x48, 0x69, 0x74, 0x12, 0x3d,
- 0x0a, 0x1b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6d, 0x70,
- 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x1a, 0x20,
- 0x01, 0x28, 0x09, 0x52, 0x18, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f,
- 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x49, 0x64, 0x12, 0x2e, 0x0a,
- 0x13, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f,
- 0x74, 0x69, 0x6d, 0x65, 0x18, 0x32, 0x20, 0x01, 0x28, 0x01, 0x52, 0x11, 0x63, 0x6f, 0x6d, 0x70,
- 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x4c, 0x0a,
- 0x23, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f,
- 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x70, 0x72, 0x65, 0x70, 0x72, 0x6f, 0x63, 0x5f,
- 0x74, 0x69, 0x6d, 0x65, 0x18, 0x33, 0x20, 0x01, 0x28, 0x01, 0x52, 0x1f, 0x63, 0x6f, 0x6d, 0x70,
- 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65,
- 0x50, 0x72, 0x65, 0x70, 0x72, 0x6f, 0x63, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x4e, 0x0a, 0x24, 0x63,
- 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x69, 0x6e,
- 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x74,
- 0x69, 0x6d, 0x65, 0x18, 0x34, 0x20, 0x01, 0x28, 0x01, 0x52, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69,
- 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x46,
- 0x69, 0x6c, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x1c, 0x63,
- 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x72, 0x70,
- 0x63, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x35, 0x20, 0x01, 0x28,
- 0x01, 0x52, 0x18, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x78, 0x79,
- 0x52, 0x70, 0x63, 0x43, 0x61, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x48, 0x0a, 0x21, 0x63,
- 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x66, 0x69,
- 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65,
- 0x18, 0x36, 0x20, 0x01, 0x28, 0x01, 0x52, 0x1d, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72,
- 0x50, 0x72, 0x6f, 0x78, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
- 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x40, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65,
- 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x72, 0x70, 0x63, 0x5f, 0x62, 0x75, 0x69, 0x6c,
- 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x37, 0x20, 0x01, 0x28, 0x01, 0x52, 0x19, 0x63, 0x6f,
- 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x70, 0x63, 0x42, 0x75,
- 0x69, 0x6c, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x70, 0x69,
- 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x72, 0x70, 0x63, 0x5f, 0x73, 0x65,
- 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x38, 0x20, 0x01, 0x28, 0x01, 0x52, 0x18, 0x63,
- 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x70, 0x63, 0x53,
- 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x70, 0x69,
- 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x72, 0x70, 0x63, 0x5f, 0x77, 0x61,
- 0x69, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x39, 0x20, 0x01, 0x28, 0x01, 0x52, 0x18, 0x63,
- 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x70, 0x63, 0x57,
- 0x61, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x70, 0x69,
- 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x72, 0x70, 0x63, 0x5f, 0x72, 0x65,
- 0x63, 0x76, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x18, 0x63,
- 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x70, 0x63, 0x52,
- 0x65, 0x63, 0x76, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x40, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x70, 0x69,
- 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x72, 0x70, 0x63, 0x5f, 0x70, 0x61,
- 0x72, 0x73, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x19,
- 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x70, 0x63,
- 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x48, 0x0a, 0x21, 0x63, 0x6f, 0x6d,
- 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x6c, 0x6f, 0x63, 0x61,
- 0x6c, 0x5f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x3c,
- 0x20, 0x01, 0x28, 0x01, 0x52, 0x1d, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72,
- 0x6f, 0x78, 0x79, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x54,
- 0x69, 0x6d, 0x65, 0x12, 0x40, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f,
- 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x72, 0x75, 0x6e, 0x5f,
- 0x74, 0x69, 0x6d, 0x65, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x01, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x70,
- 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x75,
- 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65,
- 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x67, 0x6f, 0x6d, 0x61, 0x5f, 0x66, 0x69, 0x6e,
- 0x69, 0x73, 0x68, 0x65, 0x64, 0x18, 0x46, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x63, 0x6f, 0x6d,
- 0x70, 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x47, 0x6f, 0x6d, 0x61, 0x46, 0x69,
- 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x12, 0x40, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c,
- 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x67, 0x6f, 0x6d, 0x61, 0x5f, 0x63, 0x61,
- 0x63, 0x68, 0x65, 0x5f, 0x68, 0x69, 0x74, 0x18, 0x47, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x63,
- 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x47, 0x6f, 0x6d, 0x61,
- 0x43, 0x61, 0x63, 0x68, 0x65, 0x48, 0x69, 0x74, 0x12, 0x3d, 0x0a, 0x1b, 0x63, 0x6f, 0x6d, 0x70,
- 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x67, 0x6f, 0x6d, 0x61, 0x5f,
- 0x61, 0x62, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x18, 0x48, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x63,
- 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x47, 0x6f, 0x6d, 0x61,
- 0x41, 0x62, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x70, 0x69,
- 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x67, 0x6f, 0x6d, 0x61, 0x5f, 0x65,
- 0x72, 0x72, 0x6f, 0x72, 0x18, 0x49, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x63, 0x6f, 0x6d, 0x70,
- 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x47, 0x6f, 0x6d, 0x61, 0x45, 0x72, 0x72,
- 0x6f, 0x72, 0x12, 0x41, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70,
- 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x66, 0x69, 0x6e, 0x69, 0x73,
- 0x68, 0x65, 0x64, 0x18, 0x4a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, 0x63, 0x6f, 0x6d, 0x70, 0x69,
- 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x46, 0x69, 0x6e,
- 0x69, 0x73, 0x68, 0x65, 0x64, 0x12, 0x37, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65,
- 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x72, 0x75,
- 0x6e, 0x18, 0x4b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65,
- 0x72, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x75, 0x6e, 0x12, 0x3d,
- 0x0a, 0x1b, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79,
- 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x18, 0x4c, 0x20,
- 0x01, 0x28, 0x08, 0x52, 0x18, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f,
- 0x78, 0x79, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x4b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x12, 0x48, 0x0a,
- 0x21, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f,
- 0x65, 0x78, 0x65, 0x63, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x74,
- 0x72, 0x79, 0x18, 0x50, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1d, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c,
- 0x65, 0x72, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65,
- 0x73, 0x74, 0x52, 0x65, 0x74, 0x72, 0x79, 0x12, 0x46, 0x0a, 0x0f, 0x65, 0x78, 0x65, 0x63, 0x75,
- 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x51, 0x20, 0x01, 0x28, 0x0b,
- 0x32, 0x1d, 0x2e, 0x64, 0x65, 0x76, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x67, 0x6f, 0x6d, 0x61,
- 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52,
- 0x0e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x22,
- 0x2d, 0x0a, 0x09, 0x45, 0x78, 0x65, 0x63, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02,
- 0x4f, 0x4b, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x0b, 0x42, 0x41, 0x44, 0x5f, 0x52, 0x45, 0x51, 0x55,
- 0x45, 0x53, 0x54, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x22, 0x43,
- 0x0a, 0x14, 0x42, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x61, 0x73,
- 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57,
- 0x4e, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, 0x55, 0x4e, 0x53, 0x55, 0x50, 0x50, 0x4f, 0x52, 0x54,
- 0x45, 0x44, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x49, 0x4c, 0x45, 0x52, 0x5f, 0x46, 0x4c, 0x41, 0x47,
- 0x53, 0x10, 0x01, 0x22, 0x55, 0x0a, 0x0b, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x6f, 0x75, 0x72,
- 0x63, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x4e, 0x4f, 0x5f, 0x43, 0x41, 0x43, 0x48, 0x45, 0x10, 0x00,
- 0x12, 0x0d, 0x0a, 0x09, 0x4d, 0x45, 0x4d, 0x5f, 0x43, 0x41, 0x43, 0x48, 0x45, 0x10, 0x01, 0x12,
- 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x5f, 0x43, 0x41, 0x43, 0x48, 0x45,
- 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x4c, 0x4f, 0x43, 0x41, 0x4c, 0x5f, 0x4f, 0x55, 0x54, 0x50,
- 0x55, 0x54, 0x5f, 0x43, 0x41, 0x43, 0x48, 0x45, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x16, 0x10, 0x17,
- 0x4a, 0x04, 0x08, 0x17, 0x10, 0x18, 0x4a, 0x04, 0x08, 0x63, 0x10, 0x64, 0x22, 0x80, 0x01, 0x0a,
- 0x0c, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x12, 0x2b, 0x0a,
- 0x04, 0x62, 0x6c, 0x6f, 0x62, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x64, 0x65,
- 0x76, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x67, 0x6f, 0x6d, 0x61, 0x2e, 0x46, 0x69, 0x6c, 0x65,
- 0x42, 0x6c, 0x6f, 0x62, 0x52, 0x04, 0x62, 0x6c, 0x6f, 0x62, 0x12, 0x43, 0x0a, 0x0e, 0x72, 0x65,
- 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x0a, 0x20, 0x01,
+ 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x3c, 0x0a, 0x10, 0x50, 0x6c, 0x61, 0x74,
+ 0x66, 0x6f, 0x72, 0x6d, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x12, 0x12, 0x0a, 0x04,
+ 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65,
+ 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xbe, 0x04, 0x0a, 0x0d, 0x52, 0x65, 0x71, 0x75, 0x65,
+ 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72,
+ 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x1a, 0x0a, 0x08,
+ 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,
+ 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x70,
+ 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f,
+ 0x78, 0x79, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, 0x73,
+ 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x3a, 0x01, 0x32, 0x52, 0x0a, 0x61, 0x70,
+ 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18,
+ 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65,
+ 0x74, 0x72, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x65, 0x74, 0x72, 0x79,
+ 0x12, 0x23, 0x0a, 0x0d, 0x67, 0x6f, 0x6d, 0x61, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f,
+ 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x67, 0x6f, 0x6d, 0x61, 0x52, 0x65, 0x76,
+ 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69,
+ 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64,
+ 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0a,
+ 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73,
+ 0x12, 0x45, 0x0a, 0x0a, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x18, 0x0b,
+ 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x64, 0x65, 0x76, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5f,
+ 0x67, 0x6f, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e,
+ 0x66, 0x6f, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x52, 0x09, 0x70, 0x61,
+ 0x74, 0x68, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x78, 0x65, 0x63, 0x5f,
+ 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x78, 0x65, 0x63,
+ 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x50, 0x0a, 0x13, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d,
+ 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28,
+ 0x0b, 0x32, 0x1f, 0x2e, 0x64, 0x65, 0x76, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x67, 0x6f, 0x6d,
+ 0x61, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x52, 0x12, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x50, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x25, 0x0a, 0x0e, 0x47, 0x6f, 0x6d, 0x61, 0x41, 0x70,
+ 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x55, 0x52, 0x52,
+ 0x45, 0x4e, 0x54, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x02, 0x22, 0x42, 0x0a,
+ 0x09, 0x50, 0x61, 0x74, 0x68, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x55, 0x4e,
+ 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x53, 0x54, 0x59, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a,
+ 0x0b, 0x50, 0x4f, 0x53, 0x49, 0x58, 0x5f, 0x53, 0x54, 0x59, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x11,
+ 0x0a, 0x0d, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x53, 0x54, 0x59, 0x4c, 0x45, 0x10,
+ 0x02, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x99, 0x02, 0x0a, 0x0c, 0x52, 0x65, 0x71, 0x75,
+ 0x65, 0x73, 0x74, 0x65, 0x72, 0x45, 0x6e, 0x76, 0x12, 0x1f, 0x0a, 0x0b, 0x67, 0x6f, 0x6d, 0x61,
+ 0x63, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x29, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x67,
+ 0x6f, 0x6d, 0x61, 0x63, 0x63, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x6f, 0x63,
+ 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c,
+ 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x75, 0x6d, 0x61, 0x73,
+ 0x6b, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x75, 0x6d, 0x61, 0x73, 0x6b, 0x12, 0x23,
+ 0x0a, 0x0d, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18,
+ 0x32, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x4f, 0x75, 0x74,
+ 0x70, 0x75, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c,
+ 0x18, 0x33, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x75, 0x73, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c,
+ 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x34, 0x20, 0x01,
+ 0x28, 0x08, 0x52, 0x08, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x25, 0x0a, 0x0e,
+ 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x35,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x43, 0x6f, 0x6d, 0x6d,
+ 0x61, 0x6e, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x5f,
+ 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x3c, 0x20, 0x03, 0x28, 0x09,
+ 0x52, 0x11, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46,
+ 0x69, 0x6c, 0x65, 0x22, 0xe8, 0x07, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x12,
+ 0x3d, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18,
+ 0x01, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x64, 0x65, 0x76, 0x74, 0x6f, 0x6f, 0x6c, 0x73,
+ 0x5f, 0x67, 0x6f, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x53, 0x70, 0x65,
+ 0x63, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x53, 0x70, 0x65, 0x63, 0x12, 0x10,
+ 0x0a, 0x03, 0x61, 0x72, 0x67, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x61, 0x72, 0x67,
+ 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65,
+ 0x6e, 0x76, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x77, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x03, 0x63, 0x77, 0x64, 0x12, 0x32, 0x0a, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x18, 0x0a, 0x20,
+ 0x03, 0x28, 0x0a, 0x32, 0x1c, 0x2e, 0x64, 0x65, 0x76, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x67,
+ 0x6f, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x2e, 0x49, 0x6e, 0x70, 0x75,
+ 0x74, 0x52, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x65, 0x78, 0x70, 0x61,
+ 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x61, 0x72, 0x67, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b,
+ 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x65, 0x64, 0x41, 0x72, 0x67, 0x12, 0x3d, 0x0a, 0x0a, 0x73,
+ 0x75, 0x62, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32,
+ 0x1d, 0x2e, 0x64, 0x65, 0x76, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x67, 0x6f, 0x6d, 0x61, 0x2e,
+ 0x53, 0x75, 0x62, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0a,
+ 0x73, 0x75, 0x62, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x43, 0x0a, 0x0e, 0x72, 0x65,
+ 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x1e, 0x20, 0x01,
0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x64, 0x65, 0x76, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x67, 0x6f,
0x6d, 0x61, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f,
- 0x52, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22,
- 0x2a, 0x0a, 0x0d, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70,
- 0x12, 0x19, 0x0a, 0x08, 0x68, 0x61, 0x73, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x03,
- 0x28, 0x09, 0x52, 0x07, 0x68, 0x61, 0x73, 0x68, 0x4b, 0x65, 0x79, 0x22, 0x6f, 0x0a, 0x0d, 0x4c,
- 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x12, 0x19, 0x0a, 0x08,
- 0x68, 0x61, 0x73, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07,
- 0x68, 0x61, 0x73, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x43, 0x0a, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65,
+ 0x52, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12,
+ 0x57, 0x0a, 0x0c, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18,
+ 0x1f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x64, 0x65, 0x76, 0x74, 0x6f, 0x6f, 0x6c, 0x73,
+ 0x5f, 0x67, 0x6f, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x2e, 0x43, 0x61,
+ 0x63, 0x68, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x3a, 0x10, 0x4c, 0x4f, 0x4f, 0x4b, 0x55,
+ 0x50, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x45, 0x52, 0x0b, 0x63, 0x61, 0x63,
+ 0x68, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x40, 0x0a, 0x0d, 0x72, 0x65, 0x71, 0x75,
+ 0x65, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x76, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0b, 0x32,
+ 0x1b, 0x2e, 0x64, 0x65, 0x76, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x67, 0x6f, 0x6d, 0x61, 0x2e,
+ 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x72, 0x45, 0x6e, 0x76, 0x52, 0x0c, 0x72, 0x65,
+ 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x72, 0x45, 0x6e, 0x76, 0x12, 0x23, 0x0a, 0x0d, 0x68, 0x65,
+ 0x72, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x21, 0x20, 0x01, 0x28,
+ 0x08, 0x52, 0x0c, 0x68, 0x65, 0x72, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x4d, 0x6f, 0x64, 0x65, 0x12,
+ 0x14, 0x0a, 0x05, 0x74, 0x72, 0x61, 0x63, 0x65, 0x18, 0x22, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05,
+ 0x74, 0x72, 0x61, 0x63, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65,
+ 0x64, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x23,
+ 0x20, 0x03, 0x28, 0x09, 0x52, 0x13, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x4f, 0x75,
+ 0x74, 0x70, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x65, 0x78, 0x70,
+ 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x64, 0x69, 0x72,
+ 0x73, 0x18, 0x24, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65,
+ 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x44, 0x69, 0x72, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x74,
+ 0x6f, 0x6f, 0x6c, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65,
+ 0x64, 0x18, 0x25, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x74, 0x6f, 0x6f, 0x6c, 0x63, 0x68, 0x61,
+ 0x69, 0x6e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x12, 0x45, 0x0a, 0x0f, 0x74, 0x6f,
+ 0x6f, 0x6c, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x73, 0x18, 0x26, 0x20,
+ 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x64, 0x65, 0x76, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x67,
+ 0x6f, 0x6d, 0x61, 0x2e, 0x54, 0x6f, 0x6f, 0x6c, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x70, 0x65,
+ 0x63, 0x52, 0x0e, 0x74, 0x6f, 0x6f, 0x6c, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x70, 0x65, 0x63,
+ 0x73, 0x1a, 0x71, 0x0a, 0x05, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69,
+ 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69,
+ 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x68, 0x61, 0x73, 0x68, 0x5f, 0x6b,
+ 0x65, 0x79, 0x18, 0x0c, 0x20, 0x02, 0x28, 0x09, 0x52, 0x07, 0x68, 0x61, 0x73, 0x68, 0x4b, 0x65,
+ 0x79, 0x12, 0x31, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01,
+ 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x64, 0x65, 0x76, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x67, 0x6f,
+ 0x6d, 0x61, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x52, 0x07, 0x63, 0x6f, 0x6e,
+ 0x74, 0x65, 0x6e, 0x74, 0x22, 0x62, 0x0a, 0x0b, 0x43, 0x61, 0x63, 0x68, 0x65, 0x50, 0x6f, 0x6c,
+ 0x69, 0x63, 0x79, 0x12, 0x14, 0x0a, 0x10, 0x4c, 0x4f, 0x4f, 0x4b, 0x55, 0x50, 0x5f, 0x41, 0x4e,
+ 0x44, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x45, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x4c, 0x4f, 0x4f,
+ 0x4b, 0x55, 0x50, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x54,
+ 0x4f, 0x52, 0x45, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x03, 0x12, 0x1c, 0x0a, 0x18, 0x4c, 0x4f,
+ 0x4f, 0x4b, 0x55, 0x50, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x45, 0x5f, 0x53,
+ 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x04, 0x4a, 0x04, 0x08, 0x63, 0x10, 0x64, 0x22, 0xc8,
+ 0x01, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74,
+ 0x73, 0x12, 0x56, 0x0a, 0x19, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73,
+ 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01,
+ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
+ 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
+ 0x52, 0x17, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74,
+ 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x5e, 0x0a, 0x1d, 0x65, 0x78, 0x65,
+ 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64,
+ 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,
+ 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
+ 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x1b, 0x65, 0x78,
+ 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64,
+ 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xfd, 0x12, 0x0a, 0x08, 0x45, 0x78,
+ 0x65, 0x63, 0x52, 0x65, 0x73, 0x70, 0x12, 0x31, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74,
+ 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x64, 0x65, 0x76, 0x74, 0x6f, 0x6f, 0x6c,
+ 0x73, 0x5f, 0x67, 0x6f, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c,
+ 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x3b, 0x0a, 0x05, 0x65, 0x72, 0x72,
+ 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x64, 0x65, 0x76, 0x74, 0x6f,
+ 0x6f, 0x6c, 0x73, 0x5f, 0x67, 0x6f, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73,
+ 0x70, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x02, 0x4f, 0x4b, 0x52,
+ 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x6c, 0x0a, 0x17, 0x62, 0x61, 0x64, 0x5f, 0x72, 0x65,
+ 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x64,
+ 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x64, 0x65, 0x76, 0x74, 0x6f, 0x6f,
+ 0x6c, 0x73, 0x5f, 0x67, 0x6f, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x70,
+ 0x2e, 0x42, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x61, 0x73, 0x6f,
+ 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x3a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x52, 0x14,
+ 0x62, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e,
+ 0x43, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x5f,
+ 0x69, 0x6e, 0x70, 0x75, 0x74, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x69, 0x73,
+ 0x73, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x6d, 0x69, 0x73,
+ 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x03, 0x28,
+ 0x09, 0x52, 0x0d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e,
+ 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,
+ 0x65, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65,
+ 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x5f, 0x0a, 0x2a, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x73,
+ 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65,
+ 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x75, 0x6e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x68,
+ 0x61, 0x73, 0x68, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65,
+ 0x52, 0x24, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x75, 0x74, 0x70,
+ 0x75, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x55, 0x6e, 0x6d, 0x61, 0x74, 0x63, 0x68,
+ 0x65, 0x64, 0x48, 0x61, 0x73, 0x68, 0x12, 0x65, 0x0a, 0x2d, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f,
+ 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x69, 0x6c,
+ 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x75, 0x6e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x5f,
+ 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66,
+ 0x61, 0x6c, 0x73, 0x65, 0x52, 0x27, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65,
+ 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x55, 0x6e, 0x6d,
+ 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x6d, 0x0a,
+ 0x31, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6f, 0x75, 0x74,
+ 0x70, 0x75, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x75, 0x6e, 0x6d,
+ 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x73, 0x75, 0x62, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61,
+ 0x6d, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52,
+ 0x2b, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75,
+ 0x74, 0x46, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x55, 0x6e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65,
+ 0x64, 0x53, 0x75, 0x62, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x09,
+ 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x08, 0x63, 0x61, 0x63, 0x68, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x40, 0x0a, 0x09, 0x63, 0x61, 0x63,
+ 0x68, 0x65, 0x5f, 0x68, 0x69, 0x74, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x64,
+ 0x65, 0x76, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x67, 0x6f, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65,
+ 0x63, 0x52, 0x65, 0x73, 0x70, 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63,
+ 0x65, 0x52, 0x08, 0x63, 0x61, 0x63, 0x68, 0x65, 0x48, 0x69, 0x74, 0x12, 0x3d, 0x0a, 0x1b, 0x72,
+ 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65,
+ 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x18, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6d, 0x70, 0x69,
+ 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x6f,
+ 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x74, 0x69, 0x6d,
+ 0x65, 0x18, 0x32, 0x20, 0x01, 0x28, 0x01, 0x52, 0x11, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65,
+ 0x72, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x4c, 0x0a, 0x23, 0x63, 0x6f,
+ 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x69, 0x6e, 0x63,
+ 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x70, 0x72, 0x65, 0x70, 0x72, 0x6f, 0x63, 0x5f, 0x74, 0x69, 0x6d,
+ 0x65, 0x18, 0x33, 0x20, 0x01, 0x28, 0x01, 0x52, 0x1f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65,
+ 0x72, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x50, 0x72, 0x65,
+ 0x70, 0x72, 0x6f, 0x63, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x4e, 0x0a, 0x24, 0x63, 0x6f, 0x6d, 0x70,
+ 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75,
+ 0x64, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65,
+ 0x18, 0x34, 0x20, 0x01, 0x28, 0x01, 0x52, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72,
+ 0x50, 0x72, 0x6f, 0x78, 0x79, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x46, 0x69, 0x6c, 0x65,
+ 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x70,
+ 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x72, 0x70, 0x63, 0x5f, 0x63,
+ 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x35, 0x20, 0x01, 0x28, 0x01, 0x52, 0x18,
+ 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x70, 0x63,
+ 0x43, 0x61, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x48, 0x0a, 0x21, 0x63, 0x6f, 0x6d, 0x70,
+ 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f,
+ 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x36, 0x20,
+ 0x01, 0x28, 0x01, 0x52, 0x1d, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f,
+ 0x78, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x69,
+ 0x6d, 0x65, 0x12, 0x40, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70,
+ 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x72, 0x70, 0x63, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x74,
+ 0x69, 0x6d, 0x65, 0x18, 0x37, 0x20, 0x01, 0x28, 0x01, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x70, 0x69,
+ 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x70, 0x63, 0x42, 0x75, 0x69, 0x6c, 0x64,
+ 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72,
+ 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x72, 0x70, 0x63, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x5f,
+ 0x74, 0x69, 0x6d, 0x65, 0x18, 0x38, 0x20, 0x01, 0x28, 0x01, 0x52, 0x18, 0x63, 0x6f, 0x6d, 0x70,
+ 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x70, 0x63, 0x53, 0x65, 0x6e, 0x64,
+ 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72,
+ 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x72, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x69, 0x74, 0x5f,
+ 0x74, 0x69, 0x6d, 0x65, 0x18, 0x39, 0x20, 0x01, 0x28, 0x01, 0x52, 0x18, 0x63, 0x6f, 0x6d, 0x70,
+ 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x70, 0x63, 0x57, 0x61, 0x69, 0x74,
+ 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72,
+ 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x72, 0x70, 0x63, 0x5f, 0x72, 0x65, 0x63, 0x76, 0x5f,
+ 0x74, 0x69, 0x6d, 0x65, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x18, 0x63, 0x6f, 0x6d, 0x70,
+ 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x70, 0x63, 0x52, 0x65, 0x63, 0x76,
+ 0x54, 0x69, 0x6d, 0x65, 0x12, 0x40, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72,
+ 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x72, 0x70, 0x63, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x65,
+ 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x19, 0x63, 0x6f, 0x6d,
+ 0x70, 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x70, 0x63, 0x50, 0x61, 0x72,
+ 0x73, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x48, 0x0a, 0x21, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c,
+ 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x70,
+ 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x3c, 0x20, 0x01, 0x28,
+ 0x01, 0x52, 0x1d, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x78, 0x79,
+ 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65,
+ 0x12, 0x40, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f,
+ 0x78, 0x79, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x74, 0x69, 0x6d,
+ 0x65, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x01, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65,
+ 0x72, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x75, 0x6e, 0x54, 0x69,
+ 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70,
+ 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x67, 0x6f, 0x6d, 0x61, 0x5f, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68,
+ 0x65, 0x64, 0x18, 0x46, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c,
+ 0x65, 0x72, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x47, 0x6f, 0x6d, 0x61, 0x46, 0x69, 0x6e, 0x69, 0x73,
+ 0x68, 0x65, 0x64, 0x12, 0x40, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f,
+ 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x67, 0x6f, 0x6d, 0x61, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65,
+ 0x5f, 0x68, 0x69, 0x74, 0x18, 0x47, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x70,
+ 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x47, 0x6f, 0x6d, 0x61, 0x43, 0x61, 0x63,
+ 0x68, 0x65, 0x48, 0x69, 0x74, 0x12, 0x3d, 0x0a, 0x1b, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65,
+ 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x67, 0x6f, 0x6d, 0x61, 0x5f, 0x61, 0x62, 0x6f,
+ 0x72, 0x74, 0x65, 0x64, 0x18, 0x48, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x63, 0x6f, 0x6d, 0x70,
+ 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x47, 0x6f, 0x6d, 0x61, 0x41, 0x62, 0x6f,
+ 0x72, 0x74, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72,
+ 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x67, 0x6f, 0x6d, 0x61, 0x5f, 0x65, 0x72, 0x72, 0x6f,
+ 0x72, 0x18, 0x49, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65,
+ 0x72, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x47, 0x6f, 0x6d, 0x61, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12,
+ 0x41, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x78,
+ 0x79, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64,
+ 0x18, 0x4a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72,
+ 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68,
+ 0x65, 0x64, 0x12, 0x37, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70,
+ 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x4b,
+ 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72,
+ 0x6f, 0x78, 0x79, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x75, 0x6e, 0x12, 0x3d, 0x0a, 0x1b, 0x63,
+ 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x6c, 0x6f,
+ 0x63, 0x61, 0x6c, 0x5f, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x18, 0x4c, 0x20, 0x01, 0x28, 0x08,
+ 0x52, 0x18, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4c,
+ 0x6f, 0x63, 0x61, 0x6c, 0x4b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x12, 0x48, 0x0a, 0x21, 0x63, 0x6f,
+ 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x65, 0x78, 0x65,
+ 0x63, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x79, 0x18,
+ 0x50, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1d, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x50,
+ 0x72, 0x6f, 0x78, 0x79, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52,
+ 0x65, 0x74, 0x72, 0x79, 0x12, 0x46, 0x0a, 0x0f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f,
+ 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x51, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e,
+ 0x64, 0x65, 0x76, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x67, 0x6f, 0x6d, 0x61, 0x2e, 0x45, 0x78,
+ 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x0e, 0x65, 0x78,
+ 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x22, 0x2d, 0x0a, 0x09,
+ 0x45, 0x78, 0x65, 0x63, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x4f, 0x4b, 0x10,
+ 0x00, 0x12, 0x18, 0x0a, 0x0b, 0x42, 0x41, 0x44, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54,
+ 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x22, 0x43, 0x0a, 0x14, 0x42,
+ 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x43,
+ 0x6f, 0x64, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00,
+ 0x12, 0x1e, 0x0a, 0x1a, 0x55, 0x4e, 0x53, 0x55, 0x50, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x44, 0x5f,
+ 0x43, 0x4f, 0x4d, 0x50, 0x49, 0x4c, 0x45, 0x52, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x53, 0x10, 0x01,
+ 0x22, 0x55, 0x0a, 0x0b, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12,
+ 0x0c, 0x0a, 0x08, 0x4e, 0x4f, 0x5f, 0x43, 0x41, 0x43, 0x48, 0x45, 0x10, 0x00, 0x12, 0x0d, 0x0a,
+ 0x09, 0x4d, 0x45, 0x4d, 0x5f, 0x43, 0x41, 0x43, 0x48, 0x45, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d,
+ 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x5f, 0x43, 0x41, 0x43, 0x48, 0x45, 0x10, 0x02, 0x12,
+ 0x16, 0x0a, 0x12, 0x4c, 0x4f, 0x43, 0x41, 0x4c, 0x5f, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f,
+ 0x43, 0x41, 0x43, 0x48, 0x45, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x16, 0x10, 0x17, 0x4a, 0x04, 0x08,
+ 0x17, 0x10, 0x18, 0x4a, 0x04, 0x08, 0x63, 0x10, 0x64, 0x22, 0x80, 0x01, 0x0a, 0x0c, 0x53, 0x74,
+ 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x12, 0x2b, 0x0a, 0x04, 0x62, 0x6c,
+ 0x6f, 0x62, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x64, 0x65, 0x76, 0x74, 0x6f,
+ 0x6f, 0x6c, 0x73, 0x5f, 0x67, 0x6f, 0x6d, 0x61, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x42, 0x6c, 0x6f,
+ 0x62, 0x52, 0x04, 0x62, 0x6c, 0x6f, 0x62, 0x12, 0x43, 0x0a, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65,
0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32,
0x1c, 0x2e, 0x64, 0x65, 0x76, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x67, 0x6f, 0x6d, 0x61, 0x2e,
0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0d, 0x72,
- 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x3d, 0x0a, 0x0e,
- 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2b,
- 0x0a, 0x04, 0x62, 0x6c, 0x6f, 0x62, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x64,
- 0x65, 0x76, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x67, 0x6f, 0x6d, 0x61, 0x2e, 0x46, 0x69, 0x6c,
- 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x52, 0x04, 0x62, 0x6c, 0x6f, 0x62, 0x22, 0x0e, 0x0a, 0x0c, 0x45,
- 0x6d, 0x70, 0x74, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x26, 0x0a, 0x10, 0x48,
- 0x74, 0x74, 0x70, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
- 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x02, 0x28, 0x05, 0x52, 0x04, 0x70,
- 0x6f, 0x72, 0x74, 0x42, 0x27, 0x5a, 0x25, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
- 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x2f, 0x73, 0x65, 0x72, 0x76,
- 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x61, 0x70, 0x69,
+ 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x2a, 0x0a, 0x0d,
+ 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x19, 0x0a,
+ 0x08, 0x68, 0x61, 0x73, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52,
+ 0x07, 0x68, 0x61, 0x73, 0x68, 0x4b, 0x65, 0x79, 0x22, 0x6f, 0x0a, 0x0d, 0x4c, 0x6f, 0x6f, 0x6b,
+ 0x75, 0x70, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x12, 0x19, 0x0a, 0x08, 0x68, 0x61, 0x73,
+ 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x68, 0x61, 0x73,
+ 0x68, 0x4b, 0x65, 0x79, 0x12, 0x43, 0x0a, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65,
+ 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x64,
+ 0x65, 0x76, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x67, 0x6f, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x71,
+ 0x75, 0x65, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0d, 0x72, 0x65, 0x71, 0x75,
+ 0x65, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x3d, 0x0a, 0x0e, 0x4c, 0x6f, 0x6f,
+ 0x6b, 0x75, 0x70, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2b, 0x0a, 0x04, 0x62,
+ 0x6c, 0x6f, 0x62, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x64, 0x65, 0x76, 0x74,
+ 0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x67, 0x6f, 0x6d, 0x61, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x42, 0x6c,
+ 0x6f, 0x62, 0x52, 0x04, 0x62, 0x6c, 0x6f, 0x62, 0x22, 0x0e, 0x0a, 0x0c, 0x45, 0x6d, 0x70, 0x74,
+ 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x26, 0x0a, 0x10, 0x48, 0x74, 0x74, 0x70,
+ 0x50, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04,
+ 0x70, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x02, 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74,
+ 0x42, 0x27, 0x5a, 0x25, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e,
+ 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2f,
+ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x61, 0x70, 0x69,
}
var (
@@ -2651,7 +2737,7 @@
}
var file_api_goma_data_proto_enumTypes = make([]protoimpl.EnumInfo, 7)
-var file_api_goma_data_proto_msgTypes = make([]protoimpl.MessageInfo, 18)
+var file_api_goma_data_proto_msgTypes = make([]protoimpl.MessageInfo, 19)
var file_api_goma_data_proto_goTypes = []interface{}{
(FileBlob_BlobType)(0), // 0: devtools_goma.FileBlob.BlobType
(RequesterInfo_GomaApiVersion)(0), // 1: devtools_goma.RequesterInfo.GomaApiVersion
@@ -2665,52 +2751,54 @@
(*SubprogramSpec)(nil), // 9: devtools_goma.SubprogramSpec
(*ToolchainSpec)(nil), // 10: devtools_goma.ToolchainSpec
(*ExecResult)(nil), // 11: devtools_goma.ExecResult
- (*RequesterInfo)(nil), // 12: devtools_goma.RequesterInfo
- (*RequesterEnv)(nil), // 13: devtools_goma.RequesterEnv
- (*ExecReq)(nil), // 14: devtools_goma.ExecReq
- (*ExecutionStats)(nil), // 15: devtools_goma.ExecutionStats
- (*ExecResp)(nil), // 16: devtools_goma.ExecResp
- (*StoreFileReq)(nil), // 17: devtools_goma.StoreFileReq
- (*StoreFileResp)(nil), // 18: devtools_goma.StoreFileResp
- (*LookupFileReq)(nil), // 19: devtools_goma.LookupFileReq
- (*LookupFileResp)(nil), // 20: devtools_goma.LookupFileResp
- (*EmptyMessage)(nil), // 21: devtools_goma.EmptyMessage
- (*HttpPortResponse)(nil), // 22: devtools_goma.HttpPortResponse
- (*ExecResult_Output)(nil), // 23: devtools_goma.ExecResult.Output
- (*ExecReq_Input)(nil), // 24: devtools_goma.ExecReq.Input
- (*timestamp.Timestamp)(nil), // 25: google.protobuf.Timestamp
+ (*PlatformProperty)(nil), // 12: devtools_goma.PlatformProperty
+ (*RequesterInfo)(nil), // 13: devtools_goma.RequesterInfo
+ (*RequesterEnv)(nil), // 14: devtools_goma.RequesterEnv
+ (*ExecReq)(nil), // 15: devtools_goma.ExecReq
+ (*ExecutionStats)(nil), // 16: devtools_goma.ExecutionStats
+ (*ExecResp)(nil), // 17: devtools_goma.ExecResp
+ (*StoreFileReq)(nil), // 18: devtools_goma.StoreFileReq
+ (*StoreFileResp)(nil), // 19: devtools_goma.StoreFileResp
+ (*LookupFileReq)(nil), // 20: devtools_goma.LookupFileReq
+ (*LookupFileResp)(nil), // 21: devtools_goma.LookupFileResp
+ (*EmptyMessage)(nil), // 22: devtools_goma.EmptyMessage
+ (*HttpPortResponse)(nil), // 23: devtools_goma.HttpPortResponse
+ (*ExecResult_Output)(nil), // 24: devtools_goma.ExecResult.Output
+ (*ExecReq_Input)(nil), // 25: devtools_goma.ExecReq.Input
+ (*timestamppb.Timestamp)(nil), // 26: google.protobuf.Timestamp
}
var file_api_goma_data_proto_depIdxs = []int32{
0, // 0: devtools_goma.FileBlob.blob_type:type_name -> devtools_goma.FileBlob.BlobType
8, // 1: devtools_goma.ExecResult.command_spec:type_name -> devtools_goma.CommandSpec
9, // 2: devtools_goma.ExecResult.subprogram:type_name -> devtools_goma.SubprogramSpec
- 23, // 3: devtools_goma.ExecResult.output:type_name -> devtools_goma.ExecResult.Output
+ 24, // 3: devtools_goma.ExecResult.output:type_name -> devtools_goma.ExecResult.Output
2, // 4: devtools_goma.RequesterInfo.path_style:type_name -> devtools_goma.RequesterInfo.PathStyle
- 8, // 5: devtools_goma.ExecReq.command_spec:type_name -> devtools_goma.CommandSpec
- 24, // 6: devtools_goma.ExecReq.input:type_name -> devtools_goma.ExecReq.Input
- 9, // 7: devtools_goma.ExecReq.subprogram:type_name -> devtools_goma.SubprogramSpec
- 12, // 8: devtools_goma.ExecReq.requester_info:type_name -> devtools_goma.RequesterInfo
- 3, // 9: devtools_goma.ExecReq.cache_policy:type_name -> devtools_goma.ExecReq.CachePolicy
- 13, // 10: devtools_goma.ExecReq.requester_env:type_name -> devtools_goma.RequesterEnv
- 10, // 11: devtools_goma.ExecReq.toolchain_specs:type_name -> devtools_goma.ToolchainSpec
- 25, // 12: devtools_goma.ExecutionStats.execution_start_timestamp:type_name -> google.protobuf.Timestamp
- 25, // 13: devtools_goma.ExecutionStats.execution_completed_timestamp:type_name -> google.protobuf.Timestamp
- 11, // 14: devtools_goma.ExecResp.result:type_name -> devtools_goma.ExecResult
- 4, // 15: devtools_goma.ExecResp.error:type_name -> devtools_goma.ExecResp.ExecError
- 5, // 16: devtools_goma.ExecResp.bad_request_reason_code:type_name -> devtools_goma.ExecResp.BadRequestReasonCode
- 6, // 17: devtools_goma.ExecResp.cache_hit:type_name -> devtools_goma.ExecResp.CacheSource
- 15, // 18: devtools_goma.ExecResp.execution_stats:type_name -> devtools_goma.ExecutionStats
- 7, // 19: devtools_goma.StoreFileReq.blob:type_name -> devtools_goma.FileBlob
- 12, // 20: devtools_goma.StoreFileReq.requester_info:type_name -> devtools_goma.RequesterInfo
- 12, // 21: devtools_goma.LookupFileReq.requester_info:type_name -> devtools_goma.RequesterInfo
- 7, // 22: devtools_goma.LookupFileResp.blob:type_name -> devtools_goma.FileBlob
- 7, // 23: devtools_goma.ExecResult.Output.blob:type_name -> devtools_goma.FileBlob
- 7, // 24: devtools_goma.ExecReq.Input.content:type_name -> devtools_goma.FileBlob
- 25, // [25:25] is the sub-list for method output_type
- 25, // [25:25] is the sub-list for method input_type
- 25, // [25:25] is the sub-list for extension type_name
- 25, // [25:25] is the sub-list for extension extendee
- 0, // [0:25] is the sub-list for field type_name
+ 12, // 5: devtools_goma.RequesterInfo.platform_properties:type_name -> devtools_goma.PlatformProperty
+ 8, // 6: devtools_goma.ExecReq.command_spec:type_name -> devtools_goma.CommandSpec
+ 25, // 7: devtools_goma.ExecReq.input:type_name -> devtools_goma.ExecReq.Input
+ 9, // 8: devtools_goma.ExecReq.subprogram:type_name -> devtools_goma.SubprogramSpec
+ 13, // 9: devtools_goma.ExecReq.requester_info:type_name -> devtools_goma.RequesterInfo
+ 3, // 10: devtools_goma.ExecReq.cache_policy:type_name -> devtools_goma.ExecReq.CachePolicy
+ 14, // 11: devtools_goma.ExecReq.requester_env:type_name -> devtools_goma.RequesterEnv
+ 10, // 12: devtools_goma.ExecReq.toolchain_specs:type_name -> devtools_goma.ToolchainSpec
+ 26, // 13: devtools_goma.ExecutionStats.execution_start_timestamp:type_name -> google.protobuf.Timestamp
+ 26, // 14: devtools_goma.ExecutionStats.execution_completed_timestamp:type_name -> google.protobuf.Timestamp
+ 11, // 15: devtools_goma.ExecResp.result:type_name -> devtools_goma.ExecResult
+ 4, // 16: devtools_goma.ExecResp.error:type_name -> devtools_goma.ExecResp.ExecError
+ 5, // 17: devtools_goma.ExecResp.bad_request_reason_code:type_name -> devtools_goma.ExecResp.BadRequestReasonCode
+ 6, // 18: devtools_goma.ExecResp.cache_hit:type_name -> devtools_goma.ExecResp.CacheSource
+ 16, // 19: devtools_goma.ExecResp.execution_stats:type_name -> devtools_goma.ExecutionStats
+ 7, // 20: devtools_goma.StoreFileReq.blob:type_name -> devtools_goma.FileBlob
+ 13, // 21: devtools_goma.StoreFileReq.requester_info:type_name -> devtools_goma.RequesterInfo
+ 13, // 22: devtools_goma.LookupFileReq.requester_info:type_name -> devtools_goma.RequesterInfo
+ 7, // 23: devtools_goma.LookupFileResp.blob:type_name -> devtools_goma.FileBlob
+ 7, // 24: devtools_goma.ExecResult.Output.blob:type_name -> devtools_goma.FileBlob
+ 7, // 25: devtools_goma.ExecReq.Input.content:type_name -> devtools_goma.FileBlob
+ 26, // [26:26] is the sub-list for method output_type
+ 26, // [26:26] is the sub-list for method input_type
+ 26, // [26:26] is the sub-list for extension type_name
+ 26, // [26:26] is the sub-list for extension extendee
+ 0, // [0:26] is the sub-list for field type_name
}
func init() { file_api_goma_data_proto_init() }
@@ -2780,7 +2868,7 @@
}
}
file_api_goma_data_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*RequesterInfo); i {
+ switch v := v.(*PlatformProperty); i {
case 0:
return &v.state
case 1:
@@ -2792,7 +2880,7 @@
}
}
file_api_goma_data_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*RequesterEnv); i {
+ switch v := v.(*RequesterInfo); i {
case 0:
return &v.state
case 1:
@@ -2804,7 +2892,7 @@
}
}
file_api_goma_data_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*ExecReq); i {
+ switch v := v.(*RequesterEnv); i {
case 0:
return &v.state
case 1:
@@ -2816,7 +2904,7 @@
}
}
file_api_goma_data_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*ExecutionStats); i {
+ switch v := v.(*ExecReq); i {
case 0:
return &v.state
case 1:
@@ -2828,7 +2916,7 @@
}
}
file_api_goma_data_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*ExecResp); i {
+ switch v := v.(*ExecutionStats); i {
case 0:
return &v.state
case 1:
@@ -2840,7 +2928,7 @@
}
}
file_api_goma_data_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*StoreFileReq); i {
+ switch v := v.(*ExecResp); i {
case 0:
return &v.state
case 1:
@@ -2852,7 +2940,7 @@
}
}
file_api_goma_data_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*StoreFileResp); i {
+ switch v := v.(*StoreFileReq); i {
case 0:
return &v.state
case 1:
@@ -2864,7 +2952,7 @@
}
}
file_api_goma_data_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*LookupFileReq); i {
+ switch v := v.(*StoreFileResp); i {
case 0:
return &v.state
case 1:
@@ -2876,7 +2964,7 @@
}
}
file_api_goma_data_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*LookupFileResp); i {
+ switch v := v.(*LookupFileReq); i {
case 0:
return &v.state
case 1:
@@ -2888,7 +2976,7 @@
}
}
file_api_goma_data_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*EmptyMessage); i {
+ switch v := v.(*LookupFileResp); i {
case 0:
return &v.state
case 1:
@@ -2900,7 +2988,7 @@
}
}
file_api_goma_data_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*HttpPortResponse); i {
+ switch v := v.(*EmptyMessage); i {
case 0:
return &v.state
case 1:
@@ -2912,7 +3000,7 @@
}
}
file_api_goma_data_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*ExecResult_Output); i {
+ switch v := v.(*HttpPortResponse); i {
case 0:
return &v.state
case 1:
@@ -2924,6 +3012,18 @@
}
}
file_api_goma_data_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*ExecResult_Output); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_api_goma_data_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ExecReq_Input); i {
case 0:
return &v.state
@@ -2942,7 +3042,7 @@
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_api_goma_data_proto_rawDesc,
NumEnums: 7,
- NumMessages: 18,
+ NumMessages: 19,
NumExtensions: 0,
NumServices: 0,
},
diff --git a/proto/api/goma_data.proto b/proto/api/goma_data.proto
index 594fd68..d80dd00 100644
--- a/proto/api/goma_data.proto
+++ b/proto/api/goma_data.proto
@@ -144,7 +144,12 @@
// Common RPC message
-// NEXT ID TO USE: 12
+message PlatformProperty {
+ optional string name = 1;
+ optional string value = 2;
+}
+
+// NEXT ID TO USE: 14
message RequesterInfo {
optional string addr = 1; // requester's ip addr.
optional string username = 2; // requester's user name
@@ -205,6 +210,14 @@
}
// Requester's path style.
optional PathStyle path_style = 11;
+
+ // re-client compat flags
+ // The exec root of the command.
+ optional string exec_root = 12;
+ // This is used to identify remote platform settings like the docker image
+ // to use to run the command.
+ repeated PlatformProperty platform_properties = 13;
+
}
message RequesterEnv {
diff --git a/proto/api/goma_log.pb.go b/proto/api/goma_log.pb.go
index 9263527..8a4e5cd 100644
--- a/proto/api/goma_log.pb.go
+++ b/proto/api/goma_log.pb.go
@@ -8,7 +8,7 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.25.0
-// protoc v3.13.0
+// protoc v3.15.3
// source: api/goma_log.proto
package api
diff --git a/proto/auth/acl.pb.go b/proto/auth/acl.pb.go
index 73480aa..1d1f0e1 100644
--- a/proto/auth/acl.pb.go
+++ b/proto/auth/acl.pb.go
@@ -5,7 +5,7 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.25.0
-// protoc v3.13.0
+// protoc v3.15.3
// source: auth/acl.proto
package auth
diff --git a/proto/auth/auth.pb.go b/proto/auth/auth.pb.go
index 75f81c7..6e8804b 100644
--- a/proto/auth/auth.pb.go
+++ b/proto/auth/auth.pb.go
@@ -5,16 +5,16 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.25.0
-// protoc v3.13.0
+// protoc v3.15.3
// source: auth/auth.proto
package auth
import (
proto "github.com/golang/protobuf/proto"
- timestamp "github.com/golang/protobuf/ptypes/timestamp"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ timestamppb "google.golang.org/protobuf/types/known/timestamppb"
reflect "reflect"
sync "sync"
)
@@ -137,8 +137,8 @@
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
- Email string `protobuf:"bytes,1,opt,name=email,proto3" json:"email,omitempty"`
- ExpiresAt *timestamp.Timestamp `protobuf:"bytes,3,opt,name=expires_at,json=expiresAt,proto3" json:"expires_at,omitempty"`
+ Email string `protobuf:"bytes,1,opt,name=email,proto3" json:"email,omitempty"`
+ ExpiresAt *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=expires_at,json=expiresAt,proto3" json:"expires_at,omitempty"`
// number of requests allowed until expire.
// -1 means unlimited. 0 means disallow.
Quota int32 `protobuf:"varint,4,opt,name=quota,proto3" json:"quota,omitempty"` // TODO: group quota?
@@ -188,7 +188,7 @@
return ""
}
-func (x *AuthResp) GetExpiresAt() *timestamp.Timestamp {
+func (x *AuthResp) GetExpiresAt() *timestamppb.Timestamp {
if x != nil {
return x.ExpiresAt
}
@@ -271,10 +271,10 @@
var file_auth_auth_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
var file_auth_auth_proto_goTypes = []interface{}{
- (*AuthReq)(nil), // 0: auth.AuthReq
- (*Token)(nil), // 1: auth.Token
- (*AuthResp)(nil), // 2: auth.AuthResp
- (*timestamp.Timestamp)(nil), // 3: google.protobuf.Timestamp
+ (*AuthReq)(nil), // 0: auth.AuthReq
+ (*Token)(nil), // 1: auth.Token
+ (*AuthResp)(nil), // 2: auth.AuthResp
+ (*timestamppb.Timestamp)(nil), // 3: google.protobuf.Timestamp
}
var file_auth_auth_proto_depIdxs = []int32{
3, // 0: auth.AuthResp.expires_at:type_name -> google.protobuf.Timestamp
diff --git a/proto/auth/auth_service.pb.go b/proto/auth/auth_service.pb.go
index ee7fa5d..cb5dd05 100644
--- a/proto/auth/auth_service.pb.go
+++ b/proto/auth/auth_service.pb.go
@@ -5,7 +5,7 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.25.0
-// protoc v3.13.0
+// protoc v3.15.3
// source: auth/auth_service.proto
package auth
diff --git a/proto/auth/authdb.pb.go b/proto/auth/authdb.pb.go
index 4b369ea..dde45e8 100644
--- a/proto/auth/authdb.pb.go
+++ b/proto/auth/authdb.pb.go
@@ -5,7 +5,7 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.25.0
-// protoc v3.13.0
+// protoc v3.15.3
// source: auth/authdb.proto
package auth
diff --git a/proto/auth/authdb_service.pb.go b/proto/auth/authdb_service.pb.go
index a7b344c..48ac168 100644
--- a/proto/auth/authdb_service.pb.go
+++ b/proto/auth/authdb_service.pb.go
@@ -5,7 +5,7 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.25.0
-// protoc v3.13.0
+// protoc v3.15.3
// source: auth/authdb_service.proto
package auth
diff --git a/proto/backend/backend.pb.go b/proto/backend/backend.pb.go
index b97c089..25d6f4a 100644
--- a/proto/backend/backend.pb.go
+++ b/proto/backend/backend.pb.go
@@ -5,7 +5,7 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.25.0
-// protoc v3.13.0
+// protoc v3.15.3
// source: backend/backend.proto
package backend
diff --git a/proto/cache/cache.pb.go b/proto/cache/cache.pb.go
index ac23b16..8f48176 100644
--- a/proto/cache/cache.pb.go
+++ b/proto/cache/cache.pb.go
@@ -5,7 +5,7 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.25.0
-// protoc v3.13.0
+// protoc v3.15.3
// source: cache/cache.proto
package cache
diff --git a/proto/cache/cache_service.pb.go b/proto/cache/cache_service.pb.go
index 675ae8e..dc188dc 100644
--- a/proto/cache/cache_service.pb.go
+++ b/proto/cache/cache_service.pb.go
@@ -5,7 +5,7 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.25.0
-// protoc v3.13.0
+// protoc v3.15.3
// source: cache/cache_service.proto
package cache
diff --git a/proto/command/command.pb.go b/proto/command/command.pb.go
index 1254847..dd7555d 100644
--- a/proto/command/command.pb.go
+++ b/proto/command/command.pb.go
@@ -5,17 +5,17 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.25.0
-// protoc v3.13.0
+// protoc v3.15.3
// source: command/command.proto
package command
import (
proto "github.com/golang/protobuf/proto"
- timestamp "github.com/golang/protobuf/ptypes/timestamp"
api "go.chromium.org/goma/server/proto/api"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ timestamppb "google.golang.org/protobuf/types/known/timestamppb"
reflect "reflect"
sync "sync"
)
@@ -330,7 +330,7 @@
// current working directory of toolchain build.
Directory string `protobuf:"bytes,4,opt,name=directory,proto3" json:"directory,omitempty"`
// when this toolchain was built.
- Timestamp *timestamp.Timestamp `protobuf:"bytes,5,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
+ Timestamp *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
// full image name of cmd_server container.
CmdServer string `protobuf:"bytes,7,opt,name=cmd_server,json=cmdServer,proto3" json:"cmd_server,omitempty"`
// full qualified toolchain name (separated by space)
@@ -390,7 +390,7 @@
return ""
}
-func (x *BuildInfo) GetTimestamp() *timestamp.Timestamp {
+func (x *BuildInfo) GetTimestamp() *timestamppb.Timestamp {
if x != nil {
return x.Timestamp
}
@@ -565,6 +565,7 @@
// If this config is configured for arbitrary toolchain support,
// set dimensions of the config. Otherwise, this should be nil.
Dimensions []string `protobuf:"bytes,6,rep,name=dimensions,proto3" json:"dimensions,omitempty"`
+ Acl *ACL `protobuf:"bytes,7,opt,name=acl,proto3" json:"acl,omitempty"`
}
func (x *Config) Reset() {
@@ -634,6 +635,77 @@
return nil
}
+func (x *Config) GetAcl() *ACL {
+ if x != nil {
+ return x.Acl
+ }
+ return nil
+}
+
+// ACL is access control list for requester.
+type ACL struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // Groups that is allowed to use.
+ // If allowed_groups specified, only groups in allowed_groups are
+ // allowed, and other groups are disallowed.
+ // If no allowed_groups specified, any groups are allowed
+ // if it is not disallowed by disallowed_groups.
+ AllowedGroups []string `protobuf:"bytes,1,rep,name=allowed_groups,json=allowedGroups,proto3" json:"allowed_groups,omitempty"`
+ // Groups that is not allowed to use.
+ // If no disallowed_groups specified, only allowed_groups is allowed to use.
+ // If both are not specified, any groups are alllowed.
+ DisallowedGroups []string `protobuf:"bytes,2,rep,name=disallowed_groups,json=disallowedGroups,proto3" json:"disallowed_groups,omitempty"`
+}
+
+func (x *ACL) Reset() {
+ *x = ACL{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_command_command_proto_msgTypes[7]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *ACL) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ACL) ProtoMessage() {}
+
+func (x *ACL) ProtoReflect() protoreflect.Message {
+ mi := &file_command_command_proto_msgTypes[7]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use ACL.ProtoReflect.Descriptor instead.
+func (*ACL) Descriptor() ([]byte, []int) {
+ return file_command_command_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *ACL) GetAllowedGroups() []string {
+ if x != nil {
+ return x.AllowedGroups
+ }
+ return nil
+}
+
+func (x *ACL) GetDisallowedGroups() []string {
+ if x != nil {
+ return x.DisallowedGroups
+ }
+ return nil
+}
+
// Platform is a set of requirements, such as haredware, operting system
// for RBE backend.
// matched with build.bazel.remote.execution.v2.Platform.
@@ -648,7 +720,7 @@
func (x *Platform) Reset() {
*x = Platform{}
if protoimpl.UnsafeEnabled {
- mi := &file_command_command_proto_msgTypes[7]
+ mi := &file_command_command_proto_msgTypes[8]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -661,7 +733,7 @@
func (*Platform) ProtoMessage() {}
func (x *Platform) ProtoReflect() protoreflect.Message {
- mi := &file_command_command_proto_msgTypes[7]
+ mi := &file_command_command_proto_msgTypes[8]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -674,7 +746,7 @@
// Deprecated: Use Platform.ProtoReflect.Descriptor instead.
func (*Platform) Descriptor() ([]byte, []int) {
- return file_command_command_proto_rawDescGZIP(), []int{7}
+ return file_command_command_proto_rawDescGZIP(), []int{8}
}
func (x *Platform) GetProperties() []*Platform_Property {
@@ -685,7 +757,7 @@
}
// RuntimeConfig is config for runtime.
-// NEXT ID TO USE: 9
+// NEXT ID TO USE: 10
type RuntimeConfig struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -723,12 +795,13 @@
// selector field that is not specified in disallowed_commands will
// match any selector.
DisallowedCommands []*Selector `protobuf:"bytes,5,rep,name=disallowed_commands,json=disallowedCommands,proto3" json:"disallowed_commands,omitempty"`
+ Acl *ACL `protobuf:"bytes,9,opt,name=acl,proto3" json:"acl,omitempty"`
}
func (x *RuntimeConfig) Reset() {
*x = RuntimeConfig{}
if protoimpl.UnsafeEnabled {
- mi := &file_command_command_proto_msgTypes[8]
+ mi := &file_command_command_proto_msgTypes[9]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -741,7 +814,7 @@
func (*RuntimeConfig) ProtoMessage() {}
func (x *RuntimeConfig) ProtoReflect() protoreflect.Message {
- mi := &file_command_command_proto_msgTypes[8]
+ mi := &file_command_command_proto_msgTypes[9]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -754,7 +827,7 @@
// Deprecated: Use RuntimeConfig.ProtoReflect.Descriptor instead.
func (*RuntimeConfig) Descriptor() ([]byte, []int) {
- return file_command_command_proto_rawDescGZIP(), []int{8}
+ return file_command_command_proto_rawDescGZIP(), []int{9}
}
func (x *RuntimeConfig) GetName() string {
@@ -806,6 +879,13 @@
return nil
}
+func (x *RuntimeConfig) GetAcl() *ACL {
+ if x != nil {
+ return x.Acl
+ }
+ return nil
+}
+
// PlatformRuntimeConfig is a config to use the runtime.
// NEXT ID TO USE: 3
type PlatformRuntimeConfig struct {
@@ -821,7 +901,7 @@
func (x *PlatformRuntimeConfig) Reset() {
*x = PlatformRuntimeConfig{}
if protoimpl.UnsafeEnabled {
- mi := &file_command_command_proto_msgTypes[9]
+ mi := &file_command_command_proto_msgTypes[10]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -834,7 +914,7 @@
func (*PlatformRuntimeConfig) ProtoMessage() {}
func (x *PlatformRuntimeConfig) ProtoReflect() protoreflect.Message {
- mi := &file_command_command_proto_msgTypes[9]
+ mi := &file_command_command_proto_msgTypes[10]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -847,7 +927,7 @@
// Deprecated: Use PlatformRuntimeConfig.ProtoReflect.Descriptor instead.
func (*PlatformRuntimeConfig) Descriptor() ([]byte, []int) {
- return file_command_command_proto_rawDescGZIP(), []int{9}
+ return file_command_command_proto_rawDescGZIP(), []int{10}
}
func (x *PlatformRuntimeConfig) GetDimensions() []string {
@@ -878,7 +958,7 @@
func (x *ConfigMap) Reset() {
*x = ConfigMap{}
if protoimpl.UnsafeEnabled {
- mi := &file_command_command_proto_msgTypes[10]
+ mi := &file_command_command_proto_msgTypes[11]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -891,7 +971,7 @@
func (*ConfigMap) ProtoMessage() {}
func (x *ConfigMap) ProtoReflect() protoreflect.Message {
- mi := &file_command_command_proto_msgTypes[10]
+ mi := &file_command_command_proto_msgTypes[11]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -904,7 +984,7 @@
// Deprecated: Use ConfigMap.ProtoReflect.Descriptor instead.
func (*ConfigMap) Descriptor() ([]byte, []int) {
- return file_command_command_proto_rawDescGZIP(), []int{10}
+ return file_command_command_proto_rawDescGZIP(), []int{11}
}
func (x *ConfigMap) GetRuntimes() []*RuntimeConfig {
@@ -927,7 +1007,7 @@
func (x *ConfigResp) Reset() {
*x = ConfigResp{}
if protoimpl.UnsafeEnabled {
- mi := &file_command_command_proto_msgTypes[11]
+ mi := &file_command_command_proto_msgTypes[12]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -940,7 +1020,7 @@
func (*ConfigResp) ProtoMessage() {}
func (x *ConfigResp) ProtoReflect() protoreflect.Message {
- mi := &file_command_command_proto_msgTypes[11]
+ mi := &file_command_command_proto_msgTypes[12]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -953,7 +1033,7 @@
// Deprecated: Use ConfigResp.ProtoReflect.Descriptor instead.
func (*ConfigResp) Descriptor() ([]byte, []int) {
- return file_command_command_proto_rawDescGZIP(), []int{11}
+ return file_command_command_proto_rawDescGZIP(), []int{12}
}
func (x *ConfigResp) GetVersionId() string {
@@ -1000,7 +1080,7 @@
func (x *CmdDescriptor_Setup) Reset() {
*x = CmdDescriptor_Setup{}
if protoimpl.UnsafeEnabled {
- mi := &file_command_command_proto_msgTypes[12]
+ mi := &file_command_command_proto_msgTypes[13]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -1013,7 +1093,7 @@
func (*CmdDescriptor_Setup) ProtoMessage() {}
func (x *CmdDescriptor_Setup) ProtoReflect() protoreflect.Message {
- mi := &file_command_command_proto_msgTypes[12]
+ mi := &file_command_command_proto_msgTypes[13]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -1072,7 +1152,7 @@
func (x *CmdDescriptor_Cross) Reset() {
*x = CmdDescriptor_Cross{}
if protoimpl.UnsafeEnabled {
- mi := &file_command_command_proto_msgTypes[13]
+ mi := &file_command_command_proto_msgTypes[14]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -1085,7 +1165,7 @@
func (*CmdDescriptor_Cross) ProtoMessage() {}
func (x *CmdDescriptor_Cross) ProtoReflect() protoreflect.Message {
- mi := &file_command_command_proto_msgTypes[13]
+ mi := &file_command_command_proto_msgTypes[14]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -1124,7 +1204,7 @@
func (x *CmdDescriptor_EmulationOpts) Reset() {
*x = CmdDescriptor_EmulationOpts{}
if protoimpl.UnsafeEnabled {
- mi := &file_command_command_proto_msgTypes[14]
+ mi := &file_command_command_proto_msgTypes[15]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -1137,7 +1217,7 @@
func (*CmdDescriptor_EmulationOpts) ProtoMessage() {}
func (x *CmdDescriptor_EmulationOpts) ProtoReflect() protoreflect.Message {
- mi := &file_command_command_proto_msgTypes[14]
+ mi := &file_command_command_proto_msgTypes[15]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -1174,7 +1254,7 @@
func (x *RemoteexecPlatform_Property) Reset() {
*x = RemoteexecPlatform_Property{}
if protoimpl.UnsafeEnabled {
- mi := &file_command_command_proto_msgTypes[15]
+ mi := &file_command_command_proto_msgTypes[16]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -1187,7 +1267,7 @@
func (*RemoteexecPlatform_Property) ProtoMessage() {}
func (x *RemoteexecPlatform_Property) ProtoReflect() protoreflect.Message {
- mi := &file_command_command_proto_msgTypes[15]
+ mi := &file_command_command_proto_msgTypes[16]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -1229,7 +1309,7 @@
func (x *Platform_Property) Reset() {
*x = Platform_Property{}
if protoimpl.UnsafeEnabled {
- mi := &file_command_command_proto_msgTypes[16]
+ mi := &file_command_command_proto_msgTypes[17]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -1242,7 +1322,7 @@
func (*Platform_Property) ProtoMessage() {}
func (x *Platform_Property) ProtoReflect() protoreflect.Message {
- mi := &file_command_command_proto_msgTypes[16]
+ mi := &file_command_command_proto_msgTypes[17]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -1255,7 +1335,7 @@
// Deprecated: Use Platform_Property.ProtoReflect.Descriptor instead.
func (*Platform_Property) Descriptor() ([]byte, []int) {
- return file_command_command_proto_rawDescGZIP(), []int{7, 0}
+ return file_command_command_proto_rawDescGZIP(), []int{8, 0}
}
func (x *Platform_Property) GetName() string {
@@ -1373,7 +1453,7 @@
0x61, 0x73, 0x4e, 0x73, 0x6a, 0x61, 0x69, 0x6c, 0x1a, 0x34, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x70,
0x65, 0x72, 0x74, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,
0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75,
- 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x9e,
+ 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xbe,
0x02, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x27, 0x0a, 0x06, 0x74, 0x61, 0x72,
0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d,
0x61, 0x6e, 0x64, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67,
@@ -1391,59 +1471,68 @@
0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x65, 0x78, 0x65, 0x63, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f,
0x72, 0x6d, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73,
0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f,
- 0x6e, 0x73, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x22,
- 0x7c, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x3a, 0x0a, 0x0a, 0x70,
- 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,
- 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f,
- 0x72, 0x6d, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f,
- 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x34, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x70, 0x65,
- 0x72, 0x74, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
- 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
- 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x8e, 0x03,
- 0x0a, 0x0d, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12,
- 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,
- 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61,
- 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69,
- 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x56, 0x0a, 0x17, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f,
- 0x72, 0x6d, 0x5f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69,
- 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e,
- 0x64, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d,
- 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x15, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72,
- 0x6d, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2d,
- 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b,
- 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66,
- 0x6f, 0x72, 0x6d, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x2b, 0x0a,
- 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c,
- 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65,
- 0x64, 0x50, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x14, 0x64, 0x69,
- 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c,
- 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x13, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c,
- 0x6f, 0x77, 0x65, 0x64, 0x50, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x73, 0x12, 0x42, 0x0a,
- 0x13, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x6d,
- 0x61, 0x6e, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d,
- 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x12, 0x64,
- 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64,
- 0x73, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x52, 0x15, 0x72, 0x62, 0x65, 0x5f, 0x69, 0x6e, 0x73,
- 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x56,
- 0x0a, 0x15, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d,
- 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x69, 0x6d, 0x65, 0x6e,
- 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x69, 0x6d,
- 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x68, 0x61, 0x73, 0x5f, 0x6e,
- 0x73, 0x6a, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x68, 0x61, 0x73,
- 0x4e, 0x73, 0x6a, 0x61, 0x69, 0x6c, 0x22, 0x3f, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
- 0x4d, 0x61, 0x70, 0x12, 0x32, 0x0a, 0x08, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x18,
- 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e,
- 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x08, 0x72,
- 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x22, 0x56, 0x0a, 0x0a, 0x43, 0x6f, 0x6e, 0x66, 0x69,
- 0x67, 0x52, 0x65, 0x73, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
- 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69,
- 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18,
- 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e,
- 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x42,
- 0x2b, 0x5a, 0x29, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f,
- 0x72, 0x67, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2f, 0x70,
- 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x62, 0x06, 0x70, 0x72,
- 0x6f, 0x74, 0x6f, 0x33,
+ 0x6e, 0x73, 0x12, 0x1e, 0x0a, 0x03, 0x61, 0x63, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32,
+ 0x0c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x41, 0x43, 0x4c, 0x52, 0x03, 0x61,
+ 0x63, 0x6c, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x22,
+ 0x59, 0x0a, 0x03, 0x41, 0x43, 0x4c, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65,
+ 0x64, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d,
+ 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x2b, 0x0a,
+ 0x11, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x67, 0x72, 0x6f, 0x75,
+ 0x70, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c,
+ 0x6f, 0x77, 0x65, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x22, 0x7c, 0x0a, 0x08, 0x50, 0x6c,
+ 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x3a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d,
+ 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x50, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69,
+ 0x65, 0x73, 0x1a, 0x34, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x12, 0x12,
+ 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,
+ 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xae, 0x03, 0x0a, 0x0d, 0x52, 0x75, 0x6e,
+ 0x74, 0x69, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,
+ 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21,
+ 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x64, 0x64,
+ 0x72, 0x12, 0x56, 0x0a, 0x17, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x72, 0x75,
+ 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x06, 0x20, 0x01,
+ 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x50, 0x6c, 0x61,
+ 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x66,
+ 0x69, 0x67, 0x52, 0x15, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x75, 0x6e, 0x74,
+ 0x69, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2d, 0x0a, 0x08, 0x70, 0x6c, 0x61,
+ 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f,
+ 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x08,
+ 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f,
+ 0x77, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x73, 0x18, 0x03, 0x20,
+ 0x03, 0x28, 0x09, 0x52, 0x10, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x50, 0x72, 0x65, 0x62,
+ 0x75, 0x69, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x14, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f,
+ 0x77, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x73, 0x18, 0x04, 0x20,
+ 0x03, 0x28, 0x09, 0x52, 0x13, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x50,
+ 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x73, 0x12, 0x42, 0x0a, 0x13, 0x64, 0x69, 0x73, 0x61,
+ 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18,
+ 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e,
+ 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x12, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c,
+ 0x6f, 0x77, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x1e, 0x0a, 0x03,
+ 0x61, 0x63, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d,
+ 0x61, 0x6e, 0x64, 0x2e, 0x41, 0x43, 0x4c, 0x52, 0x03, 0x61, 0x63, 0x6c, 0x4a, 0x04, 0x08, 0x07,
+ 0x10, 0x08, 0x52, 0x15, 0x72, 0x62, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65,
+ 0x5f, 0x62, 0x61, 0x73, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x56, 0x0a, 0x15, 0x50, 0x6c, 0x61,
+ 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x66,
+ 0x69, 0x67, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73,
+ 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f,
+ 0x6e, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x68, 0x61, 0x73, 0x5f, 0x6e, 0x73, 0x6a, 0x61, 0x69, 0x6c,
+ 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x68, 0x61, 0x73, 0x4e, 0x73, 0x6a, 0x61, 0x69,
+ 0x6c, 0x22, 0x3f, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4d, 0x61, 0x70, 0x12, 0x32,
+ 0x0a, 0x08, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,
+ 0x32, 0x16, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x74, 0x69,
+ 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x08, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d,
+ 0x65, 0x73, 0x22, 0x56, 0x0a, 0x0a, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70,
+ 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12,
+ 0x29, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,
+ 0x32, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69,
+ 0x67, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x42, 0x2b, 0x5a, 0x29, 0x67, 0x6f,
+ 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x6f,
+ 0x6d, 0x61, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f,
+ 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (
@@ -1459,7 +1548,7 @@
}
var file_command_command_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
-var file_command_command_proto_msgTypes = make([]protoimpl.MessageInfo, 17)
+var file_command_command_proto_msgTypes = make([]protoimpl.MessageInfo, 18)
var file_command_command_proto_goTypes = []interface{}{
(CmdDescriptor_PathType)(0), // 0: command.CmdDescriptor.PathType
(*Selector)(nil), // 1: command.Selector
@@ -1469,45 +1558,48 @@
(*CmdDescriptor)(nil), // 5: command.CmdDescriptor
(*RemoteexecPlatform)(nil), // 6: command.RemoteexecPlatform
(*Config)(nil), // 7: command.Config
- (*Platform)(nil), // 8: command.Platform
- (*RuntimeConfig)(nil), // 9: command.RuntimeConfig
- (*PlatformRuntimeConfig)(nil), // 10: command.PlatformRuntimeConfig
- (*ConfigMap)(nil), // 11: command.ConfigMap
- (*ConfigResp)(nil), // 12: command.ConfigResp
- (*CmdDescriptor_Setup)(nil), // 13: command.CmdDescriptor.Setup
- (*CmdDescriptor_Cross)(nil), // 14: command.CmdDescriptor.Cross
- (*CmdDescriptor_EmulationOpts)(nil), // 15: command.CmdDescriptor.EmulationOpts
- (*RemoteexecPlatform_Property)(nil), // 16: command.RemoteexecPlatform.Property
- (*Platform_Property)(nil), // 17: command.Platform.Property
- (*api.FileBlob)(nil), // 18: devtools_goma.FileBlob
- (*timestamp.Timestamp)(nil), // 19: google.protobuf.Timestamp
+ (*ACL)(nil), // 8: command.ACL
+ (*Platform)(nil), // 9: command.Platform
+ (*RuntimeConfig)(nil), // 10: command.RuntimeConfig
+ (*PlatformRuntimeConfig)(nil), // 11: command.PlatformRuntimeConfig
+ (*ConfigMap)(nil), // 12: command.ConfigMap
+ (*ConfigResp)(nil), // 13: command.ConfigResp
+ (*CmdDescriptor_Setup)(nil), // 14: command.CmdDescriptor.Setup
+ (*CmdDescriptor_Cross)(nil), // 15: command.CmdDescriptor.Cross
+ (*CmdDescriptor_EmulationOpts)(nil), // 16: command.CmdDescriptor.EmulationOpts
+ (*RemoteexecPlatform_Property)(nil), // 17: command.RemoteexecPlatform.Property
+ (*Platform_Property)(nil), // 18: command.Platform.Property
+ (*api.FileBlob)(nil), // 19: devtools_goma.FileBlob
+ (*timestamppb.Timestamp)(nil), // 20: google.protobuf.Timestamp
}
var file_command_command_proto_depIdxs = []int32{
- 18, // 0: command.FileSpec.blob:type_name -> devtools_goma.FileBlob
- 19, // 1: command.BuildInfo.timestamp:type_name -> google.protobuf.Timestamp
+ 19, // 0: command.FileSpec.blob:type_name -> devtools_goma.FileBlob
+ 20, // 1: command.BuildInfo.timestamp:type_name -> google.protobuf.Timestamp
1, // 2: command.CmdDescriptor.selector:type_name -> command.Selector
- 13, // 3: command.CmdDescriptor.setup:type_name -> command.CmdDescriptor.Setup
- 14, // 4: command.CmdDescriptor.cross:type_name -> command.CmdDescriptor.Cross
- 15, // 5: command.CmdDescriptor.emulation_opts:type_name -> command.CmdDescriptor.EmulationOpts
- 16, // 6: command.RemoteexecPlatform.properties:type_name -> command.RemoteexecPlatform.Property
+ 14, // 3: command.CmdDescriptor.setup:type_name -> command.CmdDescriptor.Setup
+ 15, // 4: command.CmdDescriptor.cross:type_name -> command.CmdDescriptor.Cross
+ 16, // 5: command.CmdDescriptor.emulation_opts:type_name -> command.CmdDescriptor.EmulationOpts
+ 17, // 6: command.RemoteexecPlatform.properties:type_name -> command.RemoteexecPlatform.Property
3, // 7: command.Config.target:type_name -> command.Target
4, // 8: command.Config.build_info:type_name -> command.BuildInfo
5, // 9: command.Config.cmd_descriptor:type_name -> command.CmdDescriptor
6, // 10: command.Config.remoteexec_platform:type_name -> command.RemoteexecPlatform
- 17, // 11: command.Platform.properties:type_name -> command.Platform.Property
- 10, // 12: command.RuntimeConfig.platform_runtime_config:type_name -> command.PlatformRuntimeConfig
- 8, // 13: command.RuntimeConfig.platform:type_name -> command.Platform
- 1, // 14: command.RuntimeConfig.disallowed_commands:type_name -> command.Selector
- 9, // 15: command.ConfigMap.runtimes:type_name -> command.RuntimeConfig
- 7, // 16: command.ConfigResp.configs:type_name -> command.Config
- 2, // 17: command.CmdDescriptor.Setup.cmd_file:type_name -> command.FileSpec
- 2, // 18: command.CmdDescriptor.Setup.files:type_name -> command.FileSpec
- 0, // 19: command.CmdDescriptor.Setup.path_type:type_name -> command.CmdDescriptor.PathType
- 20, // [20:20] is the sub-list for method output_type
- 20, // [20:20] is the sub-list for method input_type
- 20, // [20:20] is the sub-list for extension type_name
- 20, // [20:20] is the sub-list for extension extendee
- 0, // [0:20] is the sub-list for field type_name
+ 8, // 11: command.Config.acl:type_name -> command.ACL
+ 18, // 12: command.Platform.properties:type_name -> command.Platform.Property
+ 11, // 13: command.RuntimeConfig.platform_runtime_config:type_name -> command.PlatformRuntimeConfig
+ 9, // 14: command.RuntimeConfig.platform:type_name -> command.Platform
+ 1, // 15: command.RuntimeConfig.disallowed_commands:type_name -> command.Selector
+ 8, // 16: command.RuntimeConfig.acl:type_name -> command.ACL
+ 10, // 17: command.ConfigMap.runtimes:type_name -> command.RuntimeConfig
+ 7, // 18: command.ConfigResp.configs:type_name -> command.Config
+ 2, // 19: command.CmdDescriptor.Setup.cmd_file:type_name -> command.FileSpec
+ 2, // 20: command.CmdDescriptor.Setup.files:type_name -> command.FileSpec
+ 0, // 21: command.CmdDescriptor.Setup.path_type:type_name -> command.CmdDescriptor.PathType
+ 22, // [22:22] is the sub-list for method output_type
+ 22, // [22:22] is the sub-list for method input_type
+ 22, // [22:22] is the sub-list for extension type_name
+ 22, // [22:22] is the sub-list for extension extendee
+ 0, // [0:22] is the sub-list for field type_name
}
func init() { file_command_command_proto_init() }
@@ -1601,7 +1693,7 @@
}
}
file_command_command_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*Platform); i {
+ switch v := v.(*ACL); i {
case 0:
return &v.state
case 1:
@@ -1613,7 +1705,7 @@
}
}
file_command_command_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*RuntimeConfig); i {
+ switch v := v.(*Platform); i {
case 0:
return &v.state
case 1:
@@ -1625,7 +1717,7 @@
}
}
file_command_command_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*PlatformRuntimeConfig); i {
+ switch v := v.(*RuntimeConfig); i {
case 0:
return &v.state
case 1:
@@ -1637,7 +1729,7 @@
}
}
file_command_command_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*ConfigMap); i {
+ switch v := v.(*PlatformRuntimeConfig); i {
case 0:
return &v.state
case 1:
@@ -1649,7 +1741,7 @@
}
}
file_command_command_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*ConfigResp); i {
+ switch v := v.(*ConfigMap); i {
case 0:
return &v.state
case 1:
@@ -1661,7 +1753,7 @@
}
}
file_command_command_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*CmdDescriptor_Setup); i {
+ switch v := v.(*ConfigResp); i {
case 0:
return &v.state
case 1:
@@ -1673,7 +1765,7 @@
}
}
file_command_command_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*CmdDescriptor_Cross); i {
+ switch v := v.(*CmdDescriptor_Setup); i {
case 0:
return &v.state
case 1:
@@ -1685,7 +1777,7 @@
}
}
file_command_command_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*CmdDescriptor_EmulationOpts); i {
+ switch v := v.(*CmdDescriptor_Cross); i {
case 0:
return &v.state
case 1:
@@ -1697,7 +1789,7 @@
}
}
file_command_command_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*RemoteexecPlatform_Property); i {
+ switch v := v.(*CmdDescriptor_EmulationOpts); i {
case 0:
return &v.state
case 1:
@@ -1709,6 +1801,18 @@
}
}
file_command_command_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*RemoteexecPlatform_Property); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_command_command_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*Platform_Property); i {
case 0:
return &v.state
@@ -1727,7 +1831,7 @@
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_command_command_proto_rawDesc,
NumEnums: 1,
- NumMessages: 17,
+ NumMessages: 18,
NumExtensions: 0,
NumServices: 0,
},
diff --git a/proto/command/command.proto b/proto/command/command.proto
index f343b28..20caf55 100644
--- a/proto/command/command.proto
+++ b/proto/command/command.proto
@@ -185,6 +185,23 @@
// If this config is configured for arbitrary toolchain support,
// set dimensions of the config. Otherwise, this should be nil.
repeated string dimensions = 6;
+
+ ACL acl = 7;
+}
+
+// ACL is access control list for requester.
+message ACL {
+ // Groups that is allowed to use.
+ // If allowed_groups specified, only groups in allowed_groups are
+ // allowed, and other groups are disallowed.
+ // If no allowed_groups specified, any groups are allowed
+ // if it is not disallowed by disallowed_groups.
+ repeated string allowed_groups = 1;
+
+ // Groups that is not allowed to use.
+ // If no disallowed_groups specified, only allowed_groups is allowed to use.
+ // If both are not specified, any groups are alllowed.
+ repeated string disallowed_groups = 2;
}
// Platform is a set of requirements, such as haredware, operting system
@@ -199,7 +216,7 @@
}
// RuntimeConfig is config for runtime.
-// NEXT ID TO USE: 9
+// NEXT ID TO USE: 10
message RuntimeConfig {
// name of runtime.
//
@@ -246,6 +263,8 @@
// selector field that is not specified in disallowed_commands will
// match any selector.
repeated Selector disallowed_commands = 5;
+
+ ACL acl = 9;
}
// PlatformRuntimeConfig is a config to use the runtime.
diff --git a/proto/command/command_service.pb.go b/proto/command/command_service.pb.go
index 06ea894..57d6967 100644
--- a/proto/command/command_service.pb.go
+++ b/proto/command/command_service.pb.go
@@ -5,7 +5,7 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.25.0
-// protoc v3.13.0
+// protoc v3.15.3
// source: command/command_service.proto
package command
diff --git a/proto/command/package_opts.pb.go b/proto/command/package_opts.pb.go
index 21a89aa..0e851e7 100644
--- a/proto/command/package_opts.pb.go
+++ b/proto/command/package_opts.pb.go
@@ -5,7 +5,7 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.25.0
-// protoc v3.13.0
+// protoc v3.15.3
// source: command/package_opts.proto
package command
diff --git a/proto/command/setup.pb.go b/proto/command/setup.pb.go
index 4f1384d..107ba2c 100644
--- a/proto/command/setup.pb.go
+++ b/proto/command/setup.pb.go
@@ -5,7 +5,7 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.25.0
-// protoc v3.13.0
+// protoc v3.15.3
// source: command/setup.proto
package command
diff --git a/proto/exec/exec_service.pb.go b/proto/exec/exec_service.pb.go
index 33ebeee..4655cb4 100644
--- a/proto/exec/exec_service.pb.go
+++ b/proto/exec/exec_service.pb.go
@@ -5,7 +5,7 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.25.0
-// protoc v3.13.0
+// protoc v3.15.3
// source: exec/exec_service.proto
package exec
diff --git a/proto/execlog/log_service.pb.go b/proto/execlog/log_service.pb.go
index c487a58..1edd51c 100644
--- a/proto/execlog/log_service.pb.go
+++ b/proto/execlog/log_service.pb.go
@@ -5,7 +5,7 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.25.0
-// protoc v3.13.0
+// protoc v3.15.3
// source: execlog/log_service.proto
package execlog
diff --git a/proto/file/file_service.pb.go b/proto/file/file_service.pb.go
index fd650cb..ebaab39 100644
--- a/proto/file/file_service.pb.go
+++ b/proto/file/file_service.pb.go
@@ -8,7 +8,7 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.25.0
-// protoc v3.13.0
+// protoc v3.15.3
// source: file/file_service.proto
package file
diff --git a/proto/google/protobuf/timestamp.proto b/proto/google/protobuf/timestamp.proto
index cd35786..3b2df6d 100644
--- a/proto/google/protobuf/timestamp.proto
+++ b/proto/google/protobuf/timestamp.proto
@@ -34,7 +34,7 @@
option csharp_namespace = "Google.Protobuf.WellKnownTypes";
option cc_enable_arenas = true;
-option go_package = "github.com/golang/protobuf/ptypes/timestamp";
+option go_package = "google.golang.org/protobuf/types/known/timestamppb";
option java_package = "com.google.protobuf";
option java_outer_classname = "TimestampProto";
option java_multiple_files = true;
@@ -91,7 +91,16 @@
// .setNanos((int) ((millis % 1000) * 1000000)).build();
//
//
-// Example 5: Compute Timestamp from current time in Python.
+// Example 5: Compute Timestamp from Java `Instant.now()`.
+//
+// Instant now = Instant.now();
+//
+// Timestamp timestamp =
+// Timestamp.newBuilder().setSeconds(now.getEpochSecond())
+// .setNanos(now.getNano()).build();
+//
+//
+// Example 6: Compute Timestamp from current time in Python.
//
// timestamp = Timestamp()
// timestamp.GetCurrentTime()
diff --git a/proto/nsjail/config.pb.go b/proto/nsjail/config.pb.go
index bf856be..c64e860 100644
--- a/proto/nsjail/config.pb.go
+++ b/proto/nsjail/config.pb.go
@@ -1,7 +1,7 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.25.0
-// protoc v3.13.0
+// protoc v3.15.3
// source: nsjail/config.proto
package nsjail
diff --git a/proto/settings/settings.pb.go b/proto/settings/settings.pb.go
index bba47f7..40ec4f5 100644
--- a/proto/settings/settings.pb.go
+++ b/proto/settings/settings.pb.go
@@ -5,7 +5,7 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.25.0
-// protoc v3.13.0
+// protoc v3.15.3
// source: settings/settings.proto
package settings
diff --git a/proto/settings/settings_service.pb.go b/proto/settings/settings_service.pb.go
index ff50426..e6c727e 100644
--- a/proto/settings/settings_service.pb.go
+++ b/proto/settings/settings_service.pb.go
@@ -5,7 +5,7 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.25.0
-// protoc v3.13.0
+// protoc v3.15.3
// source: settings/settings_service.proto
package settings
diff --git a/remoteexec/adapter.go b/remoteexec/adapter.go
index 4323cc9..c75d62e 100644
--- a/remoteexec/adapter.go
+++ b/remoteexec/adapter.go
@@ -41,6 +41,31 @@
Get(context.Context, string, digest.Source) (digest.Data, error)
}
+// SpanTimeout specifies Timeout for exec span.
+// 0 is no time out.
+type SpanTimeout struct {
+ Inventory time.Duration
+ InputTree time.Duration
+ Setup time.Duration
+ CheckCache time.Duration
+ CheckMissing time.Duration
+ UploadBlobs time.Duration
+ Execute time.Duration
+ Response time.Duration
+}
+
+// DefaultSpanTimeout is default timeout.
+var DefaultSpanTimeout = SpanTimeout{
+ Inventory: 1 * time.Second,
+ InputTree: 60 * time.Second,
+ Setup: 1 * time.Second,
+ CheckCache: 3 * time.Second,
+ CheckMissing: 10 * time.Second,
+ UploadBlobs: 60 * time.Second,
+ Execute: 0,
+ Response: 30 * time.Second,
+}
+
// Adapter is an adapter from goma API to remoteexec API.
type Adapter struct {
// InstancePrefix is the prefix (dirname) of the full RBE instance name.
@@ -48,8 +73,15 @@
// then InstancePrefix is "projects/$PROJECT/instances"
InstancePrefix string
- Inventory exec.Inventory
+ // InstanceBaseName is the name (basename) of the full RBE instance name.
+ // If emtpy, use "default_instance".
+ InstanceBaseName string
+
+ Inventory exec.Inventory
+ // ExecTimeout is timeout of Action in RBE.
ExecTimeout time.Duration
+ // SpanTimeout is timeout of each span in a Goma Exec request.
+ SpanTimeout SpanTimeout
// Client is remoteexec API client.
Client Client
@@ -81,6 +113,10 @@
// Ratio to enable hardening.
HardeningRatio float64
+ // Ratio to use nsjail for hardening.
+ NsjailRatio float64
+ // sha256 file hash to disable hardening.
+ DisableHardenings []string
capMu sync.Mutex
capabilities *rpb.ServerCapabilities
@@ -176,8 +212,12 @@
return client
}
-func (f *Adapter) DefaultInstance() string {
- return path.Join(f.InstancePrefix, "default_instance")
+func (f *Adapter) Instance() string {
+ name := f.InstanceBaseName
+ if name == "" {
+ name = "default_instance"
+ }
+ return path.Join(f.InstancePrefix, name)
}
func (f *Adapter) ensureCapabilities(ctx context.Context) {
@@ -190,7 +230,7 @@
logger := log.FromContext(ctx)
var err error
f.capabilities, err = f.client(ctx).GetCapabilities(ctx, &rpb.GetCapabilitiesRequest{
- InstanceName: f.DefaultInstance(),
+ InstanceName: f.Instance(),
})
if err != nil {
logger.Errorf("GetCapabilities: %v", err)
@@ -321,6 +361,10 @@
logger.Errorf("failed to record stats: %v", err)
}
}()
+ err = exec.RecordRequesterInfo(ctx, req.GetRequesterInfo())
+ if err != nil {
+ logger.Errorf("failed to record stats: %v", err)
+ }
// Use this to collect all timestamps and then print on one line,
// regardless of where this function returns.
@@ -335,7 +379,7 @@
defer r.Close()
espan.req = r
- dur := espan.Do(ctx, "inventory", 1*time.Second, func(ctx context.Context) {
+ dur := espan.Do(ctx, "inventory", f.SpanTimeout.Inventory, func(ctx context.Context) {
resp = r.getInventoryData(ctx)
})
if resp != nil {
@@ -343,7 +387,7 @@
return resp, nil
}
- dur = espan.Do(ctx, "input tree", 30*time.Second, func(ctx context.Context) {
+ dur = espan.Do(ctx, "input tree", f.SpanTimeout.InputTree, func(ctx context.Context) {
resp = r.newInputTree(ctx)
})
if resp != nil {
@@ -351,31 +395,31 @@
return resp, nil
}
- espan.Do(ctx, "setup", 1*time.Second, func(ctx context.Context) {
+ espan.Do(ctx, "setup", f.SpanTimeout.Setup, func(ctx context.Context) {
r.setupNewAction(ctx)
})
eresp := &rpb.ExecuteResponse{}
var cached bool
- espan.Do(ctx, "check cache", 3*time.Second, func(ctx context.Context) {
+ espan.Do(ctx, "check cache", f.SpanTimeout.CheckCache, func(ctx context.Context) {
eresp.Result, cached = r.checkCache(ctx)
})
if !cached {
var blobs []*rpb.Digest
var err error
- espan.Do(ctx, "check missing", 10*time.Second, func(ctx context.Context) {
+ espan.Do(ctx, "check missing", f.SpanTimeout.CheckMissing, func(ctx context.Context) {
blobs, err = r.missingBlobs(ctx)
})
if err != nil {
- logger.Errorf("error in check missing blobs: %v", err)
+ logger.Errorf("exec call: error in check missing blobs: %v", err)
return nil, err
}
- espan.Do(ctx, "upload blobs", 30*time.Second, func(ctx context.Context) {
+ espan.Do(ctx, "upload blobs", f.SpanTimeout.UploadBlobs, func(ctx context.Context) {
resp, err = r.uploadBlobs(ctx, blobs)
})
if err != nil {
- logger.Errorf("error in upload blobs: %v", err)
+ logger.Errorf("exec call: error in upload blobs: %v", err)
return nil, err
}
if resp != nil {
@@ -383,16 +427,19 @@
return resp, nil
}
- espan.Do(ctx, "execute", 0, func(ctx context.Context) {
+ espan.Do(ctx, "execute", f.SpanTimeout.Execute, func(ctx context.Context) {
eresp, err = r.executeAction(ctx)
})
if err != nil {
- logger.Infof("execute err=%v", err)
+ logger.Errorf("exec call: execute err=%v", err)
return nil, err
}
}
- espan.Do(ctx, "response", 30*time.Second, func(ctx context.Context) {
+ espan.Do(ctx, "response", f.SpanTimeout.Response, func(ctx context.Context) {
resp, err = r.newResp(ctx, eresp, cached)
})
+ if err != nil {
+ logger.Errorf("exec call: resp err=%v", err)
+ }
return resp, err
}
diff --git a/remoteexec/adapter_test.go b/remoteexec/adapter_test.go
index 8c17438..b9817c7 100644
--- a/remoteexec/adapter_test.go
+++ b/remoteexec/adapter_test.go
@@ -817,7 +817,7 @@
if action == nil {
t.Fatalf("gotAction is nil")
}
- files, err := dumpDir(ctx, t, cluster.adapter.Client, cluster.adapter.DefaultInstance(), ".", action.InputRootDigest)
+ files, err := dumpDir(ctx, t, cluster.adapter.Client, cluster.adapter.Instance(), ".", action.InputRootDigest)
if err != nil {
t.Fatalf("err %v", err)
}
@@ -929,7 +929,7 @@
if action == nil {
t.Fatalf("gotAction is nil")
}
- files, err := dumpDir(ctx, t, cluster.adapter.Client, cluster.adapter.DefaultInstance(), ".", action.InputRootDigest)
+ files, err := dumpDir(ctx, t, cluster.adapter.Client, cluster.adapter.Instance(), ".", action.InputRootDigest)
if err != nil {
t.Fatalf("err %v", err)
}
@@ -949,7 +949,7 @@
}
}
- if got, want := files["out/Release/run.sh"].digest, digest.Bytes("relocatable-wrapper-script", []byte(relocatableWrapperScript)).Digest(); !proto.Equal(got, want) {
+ if got, want := files["out/Release/run.sh"].digest, digest.Bytes("wrapper-script", []byte(wrapperScript)).Digest(); !proto.Equal(got, want) {
t.Errorf("digest of out/Release/run.sh: %s != %s", got, want)
}
}
@@ -1076,7 +1076,7 @@
if action == nil {
t.Fatalf("gotAction is nil")
}
- files, err := dumpDir(ctx, t, cluster.adapter.Client, cluster.adapter.DefaultInstance(), ".", action.InputRootDigest)
+ files, err := dumpDir(ctx, t, cluster.adapter.Client, cluster.adapter.Instance(), ".", action.InputRootDigest)
if err != nil {
t.Fatalf("err %v", err)
}
@@ -1096,7 +1096,7 @@
}
}
- if got, want := files["out/Debug/run.sh"].digest, digest.Bytes("wrapper-script", []byte(relocatableWrapperScript)).Digest(); !proto.Equal(got, want) {
+ if got, want := files["out/Debug/run.sh"].digest, digest.Bytes("wrapper-script", []byte(wrapperScript)).Digest(); !proto.Equal(got, want) {
t.Errorf("digest of out/Debug/run.sh: %s != %s", got, want)
}
}
@@ -1186,3 +1186,118 @@
})
}
}
+
+func TestAdapterNsjailHardening(t *testing.T) {
+ ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
+ defer cancel()
+
+ cluster := &fakeCluster{
+ rbe: newFakeRBE(),
+ }
+ err := cluster.setup(ctx, cluster.rbe.instancePrefix)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer cluster.teardown()
+ clang := newFakeClang(&cluster.cmdStorage, "1234", "x86-64-linux-gnu")
+ err = cluster.pushToolchains(ctx, clang)
+ if err != nil {
+ t.Fatal(err)
+ }
+ var localFiles fakeLocalFiles
+ localFiles.Add("/b/c/w/src/hello.cc", randomSize())
+
+ req := &gomapb.ExecReq{
+ CommandSpec: clang.CommandSpec("clang", "bin/clang"),
+ Arg: []string{"bin/clang", "-c", "../../src/hello.cc"},
+ Env: []string{},
+ Cwd: proto.String("/b/c/w/out/Release"),
+ Input: []*gomapb.ExecReq_Input{
+ localFiles.mustInput(ctx, t, cluster.adapter.GomaFile, "/b/c/w/src/hello.cc", "../../src/hello.cc"),
+ },
+ Subprogram: []*gomapb.SubprogramSpec{},
+ RequesterInfo: &gomapb.RequesterInfo{},
+ HermeticMode: proto.Bool(true),
+ }
+
+ cluster.adapter.HardeningRatio = 1.0
+ cluster.adapter.NsjailRatio = 1.0
+
+ resp, err := cluster.adapter.Exec(ctx, req)
+ if err != nil {
+ t.Fatalf("Exec(ctx, req)=%v; %v; want nil error", resp, err)
+ }
+ if resp.GetError() != gomapb.ExecResp_OK {
+ t.Errorf("Exec error=%v; want=%v", resp.GetError(), gomapb.ExecResp_OK)
+ }
+
+ command := cluster.rbe.gotCommand
+ if command == nil {
+ t.Fatalf("gotCommand is nil")
+ }
+ wantArgs := []string{
+ "out/Release/run.sh",
+ "bin/clang", "-c", "../../src/hello.cc",
+ }
+ if diff := cmp.Diff(wantArgs, command.Arguments); diff != "" {
+ t.Errorf("arguments diff want->got\n%s", diff)
+ }
+ if command.WorkingDirectory != "" {
+ t.Errorf(`command.WorkingDirectory=%q; want=""`, command.WorkingDirectory)
+ }
+ workDirExists := false
+ wantWorkDir := "out/Release"
+ for _, v := range command.EnvironmentVariables {
+ if v.Name == "WORK_DIR" {
+ workDirExists = true
+ if v.Value != wantWorkDir {
+ t.Errorf("WORK_DIR=%q; want=%q", v.Value, wantWorkDir)
+ }
+ }
+ }
+
+ if !workDirExists {
+ t.Errorf("WORK_DIR not found")
+ }
+
+ action := cluster.rbe.gotAction
+ if action == nil {
+ t.Fatal("gotAction is nil")
+ }
+ files, err := dumpDir(ctx, t, cluster.adapter.Client, cluster.adapter.Instance(), ".", action.InputRootDigest)
+ if err != nil {
+ t.Fatalf("dumpDir err:%v", err)
+ }
+ runsh, exists := files["out/Release/run.sh"]
+ if !exists {
+ t.Errorf("out/Release/run.sh doesn't exist")
+ } else if !runsh.isExecutable {
+ t.Errorf("out/Release/run.sh is not executable")
+ } else if want := digest.Bytes("run.sh", []byte(nsjailHardeningWrapperScript)).Digest(); !proto.Equal(runsh.digest, want) {
+ t.Errorf("out/Release/run.sh digest=%s; want=%s", runsh.digest, want)
+ }
+ nsjailCfg, exists := files["out/Release/nsjail.cfg"]
+ if !exists {
+ t.Errorf("out/Release/nsjail.cfg doesn't exist")
+ } else if want := digest.Bytes("nsjail.cfg", []byte(nsjailHardeningConfig)).Digest(); !proto.Equal(nsjailCfg.digest, want) {
+ t.Errorf("out/Release/nsjail.cfg digest=%s; want=%s", nsjailCfg.digest, want)
+ }
+
+ var wantProps []*rpb.Platform_Property
+ for _, p := range clang.RemoteexecPlatform.Properties {
+ wantProps = append(wantProps, &rpb.Platform_Property{
+ Name: p.Name,
+ Value: p.Value,
+ })
+ }
+ wantProps = append(wantProps, &rpb.Platform_Property{
+ Name: "dockerPrivileged",
+ Value: "true",
+ })
+ sort.Slice(wantProps, func(i, j int) bool {
+ return wantProps[i].Name < wantProps[j].Name
+ })
+ if diff := cmp.Diff(wantProps, command.Platform.GetProperties(), cmp.Comparer(proto.Equal)); diff != "" {
+ t.Errorf("platform.Properties diff want->got\n%s", diff)
+ }
+}
diff --git a/remoteexec/cas/cas.go b/remoteexec/cas/cas.go
index 0d0c82a..c9dcd3a 100644
--- a/remoteexec/cas/cas.go
+++ b/remoteexec/cas/cas.go
@@ -328,14 +328,18 @@
st := status.FromProto(res.GetStatus())
if st.Code() != codes.OK {
span.Annotatef(nil, "batch update blob %v: %v", res.Digest, res.Status)
- return grpc.Errorf(st.Code(), "batch update blob %v: %v", res.Digest, res.Status)
+ missing.Blobs = append(missing.Blobs, MissingBlob{
+ Digest: res.Digest,
+ Err: grpc.Errorf(st.Code(), "batch update blob: %v", res.Status),
+ })
}
}
uploaded = true
- logger.Infof("upload by batch %d blobs in %s", len(batchReq.Requests), time.Since(t))
+ logger.Infof("upload by batch %d blobs (missing:%d) in %s", len(batchReq.Requests), len(missing.Blobs), time.Since(t))
}
}
logger.Infof("upload by streaming from %d out of %d", len(largeBlobs), len(blobs))
+ t := time.Now()
for _, blob := range largeBlobs {
data, ok := c.Store.Get(blob)
if !ok {
@@ -350,10 +354,6 @@
rd, err := data.Open(ctx)
if err != nil {
span.Annotatef(nil, "upload open %v: %v", blob, err)
- missing.Blobs = append(missing.Blobs, MissingBlob{
- Digest: blob,
- Err: err,
- })
return err
}
err = UploadDigest(ctx, c.Client.ByteStream(), instance, blob, rd)
@@ -366,9 +366,14 @@
})
if err != nil {
logger.Errorf("upload streaming %s error: %v", blob, err)
+ missing.Blobs = append(missing.Blobs, MissingBlob{
+ Digest: blob,
+ Err: err,
+ })
continue
}
}
+ logger.Infof("uploaded by streaming %d (missing:%d) in %s", len(blobs), len(missing.Blobs), time.Since(t))
if len(missing.Blobs) > 0 {
return missing
}
diff --git a/remoteexec/clang-cl.go b/remoteexec/clang-cl.go
index 8cd7bef..c695bb7 100644
--- a/remoteexec/clang-cl.go
+++ b/remoteexec/clang-cl.go
@@ -5,6 +5,7 @@
package remoteexec
import (
+ "errors"
"fmt"
"strconv"
"strings"
@@ -12,20 +13,24 @@
// TODO: share exec/clangcl.go ?
+// longest first
var clangClPathFlags = []string{
- "--sysroot=",
- "-B",
- "-I",
"-fcrash-diagnostics-dir=",
- "-fprofile-instr-use=",
"-fprofile-sample-use=",
"-fsanitize-blacklist=",
+ "-fprofile-instr-use=",
+ "-resource-dir=",
+ "/vctoolsdir",
+ "/winsysroot",
+ "/winsdkdir",
+ "--sysroot=",
"-include=",
"-isystem",
- "-o",
- "-resource-dir=",
"-imsvc",
"/FA",
+ "/FI",
+ "/FR",
+ "/FU",
"/Fa",
"/Fd",
"/Fe",
@@ -33,10 +38,11 @@
"/Fm",
"/Fo",
"/Fp",
- "/FR",
"/Fr",
- "/FU",
"/Fx",
+ "-B",
+ "-I",
+ "-o",
}
func isClangclWarningFlag(arg string) bool {
@@ -223,8 +229,11 @@
case isClangclOptimizationFlag(arg): // Flags to handle optimization
continue
+ case arg == "/FC": // Display full path of source code files passed to cl.exe in diagnostic text.
+ return errors.New("need full path of soruce code for /FC")
+
case strings.HasPrefix(arg, "-"), strings.HasPrefix(arg, "/"): // unknown flag?
- return fmt.Errorf("unknown flag: %s", arg)
+ return unknownFlagError{arg: arg}
default: // input file?
if filepath.IsAbs(arg) {
@@ -252,18 +261,12 @@
}
}
- for _, env := range envs {
- e := strings.SplitN(env, "=", 2)
- if len(e) != 2 {
- return fmt.Errorf("bad environment variable: %s", env)
- }
- if e[0] == "PWD" {
- continue
- }
- if filepath.IsAbs(e[1]) {
- return fmt.Errorf("abs path in env %s=%s", e[0], e[1])
- }
- }
+ // Don't check environment variables.
+ // Typically user sets `INCLUDE=C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.16.27023\ATLMFC\include;...`
+ // so it makes always non-relocatble.
+ // in chromium build, cang-cl uses -imsvc instead of relying on
+ // %INCLUDE%, so it would be ok to ignore environment variables.
+ // http://b/173755650
return nil
}
@@ -289,7 +292,7 @@
skipFlag = true
continue
default:
- return fmt.Errorf("clang-cl unknown arg: %s", arg)
+ return unknownFlagError{arg: fmt.Sprintf("clang-cl: %s", arg)}
}
}
return nil
diff --git a/remoteexec/clang-cl_test.go b/remoteexec/clang-cl_test.go
index 890f6cf..9e409ca 100644
--- a/remoteexec/clang-cl_test.go
+++ b/remoteexec/clang-cl_test.go
@@ -12,6 +12,16 @@
"go.chromium.org/goma/server/command/descriptor/winpath"
)
+func TestCLangCLPathFlags(t *testing.T) {
+ lastP := clangClPathFlags[0]
+ for _, p := range clangClPathFlags[1:] {
+ if len(lastP) < len(p) {
+ t.Errorf("%q is longer than %q", p, lastP)
+ }
+ lastP = p
+ }
+}
+
func TestIsClangclWarningFlag(t *testing.T) {
for _, tc := range []struct {
desc string
@@ -223,6 +233,60 @@
"-mllvm", "-basic-aa-recphi=0"),
relocatable: true,
},
+ {
+ desc: "/FIcompat/msvcrt/snprintf.h",
+ args: append(append([]string{}, baseReleaseArgs...),
+ "/FIcompat/msvcrt/snprintf.h"),
+ relocatable: true,
+ },
+ {
+ desc: `/FIC:\winsdk\compat\msvcrt\snprintf.h`,
+ args: append(append([]string{}, baseReleaseArgs...),
+ `/FIC:\winsdk\compat\msvcrt\snprintf.h`),
+ relocatable: false,
+ },
+ {
+ desc: "/FC",
+ args: append(append([]string{}, baseReleaseArgs...),
+ "/FC"),
+ relocatable: false,
+ },
+ {
+ desc: "/winsysroot relative",
+ args: append(append([]string{}, baseReleaseArgs...),
+ `/winsysroot..\..\third_party\depot_tools\win_toolchain\vs_files\20d5f253f`),
+ relocatable: true,
+ },
+ {
+ desc: "/winsysroot absolute",
+ args: append(append([]string{}, baseReleaseArgs...),
+ `/winsysrootC:\src\chromium\src\third_party\depot_tools\win_toolchain\vs_files\20d5f253f`),
+ relocatable: false,
+ },
+ {
+ desc: "/vctoolsdir relative",
+ args: append(append([]string{}, baseReleaseArgs...),
+ `/vctoolsdir..\..\third_party\depot_tools\win_toolchain\vs_files\20d5f253f\VC\Tools`),
+ relocatable: true,
+ },
+ {
+ desc: "/vctoolsdir absolute",
+ args: append(append([]string{}, baseReleaseArgs...),
+ `/vctoolsdirC:\src\chromium\src\third_party\depot_tools\win_toolchain\vs_files\20d5f253f\VC\Tools`),
+ relocatable: false,
+ },
+ {
+ desc: "/winsdkdir relative",
+ args: append(append([]string{}, baseReleaseArgs...),
+ `/winsdkdir..\..\third_party\depot_tools\win_toolchain\vs_files\20d5f253f\win_sdk`),
+ relocatable: true,
+ },
+ {
+ desc: "/winsdkdir absolute",
+ args: append(append([]string{}, baseReleaseArgs...),
+ `/winsdkdirC:\src\chromium\src\third_party\depot_tools\win_toolchain\vs_files\20d5f253f\win_sdk`),
+ relocatable: false,
+ },
} {
t.Run(tc.desc, func(t *testing.T) {
err := clangclRelocatableReq(winpath.FilePath{}, tc.args, tc.envs)
diff --git a/remoteexec/client.go b/remoteexec/client.go
index a4ebf8d..ef91ba3 100644
--- a/remoteexec/client.go
+++ b/remoteexec/client.go
@@ -226,6 +226,7 @@
// requested, such as a missing input or command or
// no worker being available. The client may be able to
// fix the errors and retry.
+ // exec_server doesn't fix request, so don't retry.
// UNAVAILABLE:
// Due to transient condition, such as all workers being
// occupied (and the server does not support a queue), the
@@ -239,11 +240,11 @@
// Other error would be non retriable.
switch codes.Code(st.GetCode()) {
case codes.OK:
- case codes.ResourceExhausted:
+ case codes.ResourceExhausted, codes.FailedPrecondition:
logger.Warnf("execute response: status=%s", st)
return status.FromProto(st).Err()
- case codes.FailedPrecondition, codes.Internal:
+ case codes.Internal:
logger.Warnf("execute response: status=%s", st)
fallthrough
case codes.Unavailable:
diff --git a/remoteexec/digest/digest_cache.go b/remoteexec/digest/digest_cache.go
index 33fc156..01e90d8 100644
--- a/remoteexec/digest/digest_cache.go
+++ b/remoteexec/digest/digest_cache.go
@@ -17,6 +17,8 @@
"go.opencensus.io/stats"
"go.opencensus.io/stats/view"
"go.opencensus.io/tag"
+ "google.golang.org/grpc/codes"
+ "google.golang.org/grpc/status"
"go.chromium.org/goma/server/log"
cachepb "go.chromium.org/goma/server/proto/cache"
@@ -153,9 +155,13 @@
}
return d, nil
}
- logger.Infof("digest cache miss %s %v: %s", keystr, err, time.Since(start))
+ op := "get-error"
+ if status.Code(err) == codes.NotFound {
+ op = "miss"
+ }
+ logger.Infof("digest cache %s %s %v: %s", op, keystr, err, time.Since(start))
stats.RecordWithTags(ctx, []tag.Mutator{
- tag.Upsert(opKey, "miss"),
+ tag.Upsert(opKey, op),
tag.Upsert(fileExtKey, fileExt),
}, cacheStats.M(0))
d, err := FromSource(ctx, src)
diff --git a/remoteexec/exec.go b/remoteexec/exec.go
index 43f790d..f8bb143 100644
--- a/remoteexec/exec.go
+++ b/remoteexec/exec.go
@@ -7,6 +7,7 @@
import (
"bytes"
"context"
+ "errors"
"fmt"
"math/rand"
"path"
@@ -172,7 +173,7 @@
func (r *request) instanceName() string {
basename := r.cmdConfig.GetRemoteexecPlatform().GetRbeInstanceBasename()
if basename == "" {
- return r.f.DefaultInstance()
+ return r.f.Instance()
}
return path.Join(r.f.InstancePrefix, basename)
}
@@ -210,11 +211,36 @@
for _, prop := range cmdConfig.GetRemoteexecPlatform().GetProperties() {
r.addPlatformProperty(ctx, prop.Name, prop.Value)
}
+ if len(r.gomaReq.GetRequesterInfo().GetPlatformProperties()) > 0 {
+ for _, pp := range r.gomaReq.GetRequesterInfo().GetPlatformProperties() {
+ if !isSafePlatformProperty(pp.GetName(), pp.GetValue()) {
+ logger.Errorf("unsafe user platform property: %v", pp)
+ r.gomaResp.Error = gomapb.ExecResp_BAD_REQUEST.Enum()
+ r.gomaResp.ErrorMessage = append(r.gomaResp.ErrorMessage, fmt.Sprintf("unsafe platform property: %v", pp))
+ continue
+ }
+ logger.Infof("override by user platform property: %v", pp)
+ r.addPlatformProperty(ctx, pp.GetName(), pp.GetValue())
+ }
+ if len(r.gomaResp.ErrorMessage) > 0 {
+ return r.gomaResp
+ }
+ }
r.allowChroot = cmdConfig.GetRemoteexecPlatform().GetHasNsjail()
logger.Infof("platform: %s, allowChroot=%t", r.platform, r.allowChroot)
return nil
}
+func isSafePlatformProperty(name, value string) bool {
+ switch name {
+ case "container-image", "InputRootAbsolutePath", "cache-silo":
+ return true
+ case "dockerRuntime":
+ return value == "runsc"
+ }
+ return false
+}
+
func (r *request) addPlatformProperty(ctx context.Context, name, value string) {
for _, p := range r.platform.Properties {
if p.Name == name {
@@ -354,7 +380,7 @@
missingInput string
missingReason string
file merkletree.Entry
- uploaded bool
+ needUpload bool
err error
}
@@ -397,7 +423,7 @@
if input.Content == nil {
return
}
- result.uploaded = true
+ result.needUpload = true
}(input, &results[i])
}
wg.Wait()
@@ -408,6 +434,7 @@
// it returns non-nil ExecResp for:
// - missing inputs
// - input root detection failed
+// - non-relative and non C: drive on windows.
func (r *request) newInputTree(ctx context.Context) *gomapb.ExecResp {
if r.err != nil {
return nil
@@ -423,7 +450,8 @@
r.gomaResp.ErrorMessage = append(r.gomaResp.ErrorMessage, fmt.Sprintf("bad input: %v", err))
return r.gomaResp
}
- rootDir, needChroot, err := inputRootDir(r.filepath, inputPaths, r.allowChroot)
+ execRootDir := r.gomaReq.GetRequesterInfo().GetExecRoot()
+ rootDir, needChroot, err := inputRootDir(r.filepath, inputPaths, r.allowChroot, execRootDir)
if err != nil {
logger.Errorf("input root detection failed: %v", err)
logFileList(logger, "input paths", inputPaths)
@@ -434,7 +462,7 @@
r.tree = merkletree.New(r.filepath, rootDir, r.digestStore)
r.needChroot = needChroot
- logger.Infof("new input tree cwd:%s root:%s %s", r.gomaReq.GetCwd(), r.tree.RootDir(), r.cmdConfig.GetCmdDescriptor().GetSetup().GetPathType())
+ logger.Infof("new input tree cwd:%s root:%s execRoot:%s %s", r.gomaReq.GetCwd(), r.tree.RootDir(), execRootDir, r.cmdConfig.GetCmdDescriptor().GetSetup().GetPathType())
// If toolchain_included is true, r.gomaReq.Input and cmdFiles will contain the same files.
// To avoid dup, if it's added in r.gomaReq.Input, we don't add it as cmdFiles.
// While processing r.gomaReq.Input, we handle missing input, so the main routine is in
@@ -473,7 +501,7 @@
if r.err == nil && result.err != nil {
r.err = result.err
}
- if result.uploaded {
+ if result.needUpload {
uploads = append(uploads, input)
}
}
@@ -483,14 +511,6 @@
}
logger.Infof("inputFiles=%d uploads=%d in %s", len(r.gomaReq.Input), len(uploads), time.Since(start))
- start = time.Now()
- err = uploadInputFiles(ctx, uploads, r.input)
- if err != nil {
- r.err = err
- return nil
- }
-
- var uploaded int
var files []merkletree.Entry
var missingInputs []string
var missingReason []string
@@ -500,13 +520,15 @@
missingReason = append(missingReason, in.missingReason)
continue
}
- files = append(files, in.file)
- if in.uploaded {
- uploaded++
+ if in.file.Name == "" {
+ // ignore out of root files.
+ continue
}
+ files = append(files, in.file)
}
- logger.Infof("upload %d inputs, missing %d inputs out of %d in %s", uploaded, len(missingInputs), len(r.gomaReq.Input), time.Since(start))
if len(missingInputs) > 0 {
+ logger.Infof("missing %d inputs out of %d. need to uploads=%d", len(missingInputs), len(r.gomaReq.Input), len(uploads))
+
r.gomaResp.MissingInput = missingInputs
r.gomaResp.MissingReason = missingReason
thinOutMissing(r.gomaResp, missingInputLimit)
@@ -518,6 +540,13 @@
// create wrapper scripts
err = r.newWrapperScript(ctx, r.cmdConfig, r.cmdFiles[0].Path)
if err != nil {
+ var badReqErr badRequestError
+ if errors.As(err, &badReqErr) {
+ r.gomaResp.Error = gomapb.ExecResp_BAD_REQUEST.Enum()
+ r.gomaResp.ErrorMessage = append(r.gomaResp.ErrorMessage, badReqErr.Error())
+ return r.gomaResp
+ }
+ // otherwise, internal error.
r.err = fmt.Errorf("wrapper script: %v", err)
return nil
}
@@ -610,6 +639,15 @@
logger.Infof("input root digest: %v", root)
r.action.InputRootDigest = root
+ // uploads embedded contents to file-server
+ // for the case the file was not yet uploaded to RBE CAS.
+ // even if client sends input with embedded content,
+ // the content may be already uploaded to RBE CAS,
+ // and uploaded content may not be needed,
+ // so we could ignore error of these uploads.
+ start = time.Now()
+ err = uploadInputFiles(ctx, uploads, r.input)
+ logger.Infof("upload %d inputs out of %d in %s: %v", len(uploads), len(r.gomaReq.Input), time.Since(start), err)
return nil
}
@@ -644,7 +682,7 @@
// TODO: use working_directory in action.
// need to fix output path to be relative to working_directory.
// http://b/113370588
- relocatableWrapperScript = `#!/bin/bash
+ wrapperScript = `#!/bin/bash
set -e
if [[ "$WORK_DIR" != "" ]]; then
cd "${WORK_DIR}"
@@ -653,6 +691,14 @@
`
)
+type badRequestError struct {
+ err error
+}
+
+func (b badRequestError) Error() string {
+ return b.err.Error()
+}
+
// TODO: put wrapper script in platform container?
func (r *request) newWrapperScript(ctx context.Context, cmdConfig *cmdpb.Config, argv0 string) error {
logger := log.FromContext(ctx)
@@ -662,7 +708,7 @@
cleanRootDir := r.filepath.Clean(r.tree.RootDir())
wd, err := rootRel(r.filepath, cwd, cleanCWD, cleanRootDir)
if err != nil {
- return fmt.Errorf("bad cwd=%s: %v", cwd, err)
+ return badRequestError{err: fmt.Errorf("bad cwd=%s: %v", cwd, err)}
}
if wd == "" {
wd = "."
@@ -674,16 +720,12 @@
// However, only the first one is called in the command line.
// The other scripts should be called from the first wrapper script
// if needed.
- type fileDesc struct {
- name string
- data digest.Data
- isExecutable bool
- }
- var files []fileDesc
+ var files []merkletree.Entry
args := buildArgs(ctx, cmdConfig, argv0, r.gomaReq)
// TODO: only allow specific envs.
+ var relocatableErr error
wt := wrapperRelocatable
pathType := cmdConfig.GetCmdDescriptor().GetSetup().GetPathType()
switch pathType {
@@ -691,21 +733,22 @@
if r.needChroot {
wt = wrapperNsjailChroot
} else {
- err = relocatableReq(ctx, cmdConfig, r.filepath, r.gomaReq.Arg, r.gomaReq.Env)
- if err != nil {
+ relocatableErr = relocatableReq(ctx, cmdConfig, r.filepath, r.gomaReq.Arg, r.gomaReq.Env)
+ if relocatableErr != nil {
wt = wrapperInputRootAbsolutePath
- logger.Infof("non relocatable: %v", err)
+ logger.Infof("non relocatable: %v", relocatableErr)
}
}
case cmdpb.CmdDescriptor_WINDOWS:
- err = relocatableReq(ctx, cmdConfig, r.filepath, r.gomaReq.Arg, r.gomaReq.Env)
- if err != nil {
+ relocatableErr = relocatableReq(ctx, cmdConfig, r.filepath, r.gomaReq.Arg, r.gomaReq.Env)
+ if relocatableErr != nil {
wt = wrapperWinInputRootAbsolutePath
- logger.Infof("non relocatable: %v", err)
+ logger.Infof("non relocatable: %v", relocatableErr)
} else {
wt = wrapperWin
}
default:
+ // internal error? maybe toolchain config is broken.
return fmt.Errorf("bad path type: %v", pathType)
}
@@ -717,44 +760,36 @@
r.addPlatformProperty(ctx, "dockerPrivileged", "true")
// needed for chroot command and mount command.
r.addPlatformProperty(ctx, "dockerRunAsRoot", "true")
- nsjailCfg := nsjailConfig(cwd, r.filepath, r.gomaReq.GetToolchainSpecs(), r.gomaReq.Env)
- files = []fileDesc{
+ nsjailCfg := nsjailChrootConfig(cwd, r.filepath, r.gomaReq.GetToolchainSpecs(), r.gomaReq.Env)
+ files = []merkletree.Entry{
{
- name: posixWrapperName,
- data: digest.Bytes("nsjail-run-wrapper-script", []byte(nsjailRunWrapperScript)),
- isExecutable: true,
+ Name: posixWrapperName,
+ Data: digest.Bytes("nsjail-chroot-run-wrapper-script", []byte(nsjailChrootRunWrapperScript)),
+ IsExecutable: true,
},
{
- name: "nsjail.cfg",
- data: digest.Bytes("nsjail-config-file", []byte(nsjailCfg)),
+ Name: "nsjail.cfg",
+ Data: digest.Bytes("nsjail-config-file", []byte(nsjailCfg)),
},
}
case wrapperInputRootAbsolutePath:
- if rand.Float64() < r.f.HardeningRatio {
- logger.Infof("run with InputRootAbsolutePath + runsc")
- r.addPlatformProperty(ctx, "dockerRuntime", "runsc")
- } else {
- logger.Infof("run with InputRootAbsolutePath")
- }
+ wrapperData := digest.Bytes("wrapper-script", []byte(wrapperScript))
+ files, wrapperData = r.maybeApplyHardening(ctx, "InputRootAbsolutePath", files, wrapperData)
// https://cloud.google.com/remote-build-execution/docs/remote-execution-properties#container_properties
r.addPlatformProperty(ctx, "InputRootAbsolutePath", r.tree.RootDir())
for _, e := range r.gomaReq.Env {
envs = append(envs, e)
}
- files = []fileDesc{
+ files = append([]merkletree.Entry{
{
- name: posixWrapperName,
- data: digest.Bytes("relocatable-wrapper-script", []byte(relocatableWrapperScript)),
- isExecutable: true,
+ Name: posixWrapperName,
+ Data: wrapperData,
+ IsExecutable: true,
},
- }
+ }, files...)
case wrapperRelocatable:
- if rand.Float64() < r.f.HardeningRatio {
- logger.Infof("run with chdir + runsc: relocatable")
- r.addPlatformProperty(ctx, "dockerRuntime", "runsc")
- } else {
- logger.Infof("run with chdir: relocatable")
- }
+ wrapperData := digest.Bytes("wrapper-script", []byte(wrapperScript))
+ files, wrapperData = r.maybeApplyHardening(ctx, "chdir: relocatble", files, wrapperData)
for _, e := range r.gomaReq.Env {
if strings.HasPrefix(e, "PWD=") {
// PWD is usually absolute path.
@@ -764,32 +799,41 @@
}
envs = append(envs, e)
}
- files = []fileDesc{
+ files = append([]merkletree.Entry{
{
- name: posixWrapperName,
- data: digest.Bytes("relocatable-wrapper-script", []byte(relocatableWrapperScript)),
- isExecutable: true,
+ Name: posixWrapperName,
+ Data: wrapperData,
+ IsExecutable: true,
},
- }
+ }, files...)
case wrapperWin:
logger.Infof("run on win")
wn, data, err := wrapperForWindows(ctx)
if err != nil {
+ // missing run.exe?
return err
}
- files = []fileDesc{
+ // no need to set environment variables??
+ files = []merkletree.Entry{
{
- name: wn,
- data: data,
- isExecutable: true,
+ Name: wn,
+ Data: data,
+ IsExecutable: true,
},
}
case wrapperWinInputRootAbsolutePath:
logger.Infof("run on win with InputRootAbsolutePath")
+ if relocatableErr != nil && !strings.HasPrefix(strings.ToUpper(r.tree.RootDir()), `C:\`) {
+ // TODO Docker Internal Errors
+ // see also http://b/161274896 Catch specific case where drive letter other than C: specified for input root on Windows
+ logger.Errorf("non relocatable on windows, but absolute path is not C: drive. %s", r.tree.RootDir())
+ return badRequestError{err: fmt.Errorf("non relocatable %v, but root dir is %q. make request relocatable, or use `C:`", relocatableErr, r.tree.RootDir())}
+ }
// https://cloud.google.com/remote-build-execution/docs/remote-execution-properties#container_properties
r.addPlatformProperty(ctx, "InputRootAbsolutePath", r.tree.RootDir())
wn, data, err := wrapperForWindows(ctx)
if err != nil {
+ // missing run.exe?
return err
}
// This is necessary for Win emscripten-releases LLVM build, which uses env vars to specify e.g. include
@@ -801,14 +845,15 @@
envs = append(envs, e)
}
}
- files = []fileDesc{
+ files = []merkletree.Entry{
{
- name: wn,
- data: data,
- isExecutable: true,
+ Name: wn,
+ Data: data,
+ IsExecutable: true,
},
}
default:
+ // coding error?
return fmt.Errorf("bad wrapper type: %v", wt)
}
@@ -816,19 +861,16 @@
// `wrapperPath` in `r.args` later.
wrapperPath := ""
for i, w := range files {
- wp, err := rootRel(r.filepath, w.name, cleanCWD, cleanRootDir)
+ w.Name, err = rootRel(r.filepath, w.Name, cleanCWD, cleanRootDir)
if err != nil {
+ // rootRel should not fail with any user input at this point?
return err
}
- logger.Infof("file (%d) %s => %v", i, wp, w.data.Digest())
- r.tree.Set(merkletree.Entry{
- Name: wp,
- Data: w.data,
- IsExecutable: w.isExecutable,
- })
+ logger.Infof("file (%d) %s => %v", i, w.Name, w.Data.Digest())
+ r.tree.Set(w)
if wrapperPath == "" {
- wrapperPath = wp
+ wrapperPath = w.Name
}
}
@@ -849,6 +891,47 @@
return nil
}
+func (r *request) maybeApplyHardening(ctx context.Context, wt string, files []merkletree.Entry, wrapperData digest.Data) ([]merkletree.Entry, digest.Data) {
+ logger := log.FromContext(ctx)
+ if f, disable := disableHardening(r.f.DisableHardenings, r.cmdFiles); disable {
+ logger.Infof("run with %s (disable hardening for %v)", wt, f)
+ } else if rand.Float64() < r.f.HardeningRatio {
+ if rand.Float64() < r.f.NsjailRatio {
+ logger.Infof("run with %s + nsjail", wt)
+ wrapperData = digest.Bytes("nsjail-hardening-wrapper-scrpt", []byte(nsjailHardeningWrapperScript))
+ // needed for nsjail
+ r.addPlatformProperty(ctx, "dockerPrivileged", "true")
+ files = append(files, merkletree.Entry{
+ Name: "nsjail.cfg",
+ Data: digest.Bytes("nsjail.cfg", []byte(nsjailHardeningConfig)),
+ })
+ } else {
+ logger.Infof("run with %s + runsc", wt)
+ r.addPlatformProperty(ctx, "dockerRuntime", "runsc")
+ }
+ } else {
+ logger.Infof("run with %s", wt)
+ }
+ return files, wrapperData
+}
+
+func disableHardening(hashes []string, cmdFiles []*cmdpb.FileSpec) (*cmdpb.FileSpec, bool) {
+ for _, h := range hashes {
+ if h == "" {
+ continue
+ }
+ for _, f := range cmdFiles {
+ if f.GetSymlink() != "" {
+ continue
+ }
+ if f.GetHash() == h {
+ return f, true
+ }
+ }
+ }
+ return nil, false
+}
+
// TODO: refactor with exec/clang.go, exec/clangcl.go?
// buildArgs builds args in RBE from arg0 and req, respecting cmdConfig.
@@ -875,22 +958,42 @@
return append(args, fmt.Sprintf("--target=%s", target))
}
+type unknownFlagError struct {
+ arg string
+}
+
+func (e unknownFlagError) Error() string {
+ return fmt.Sprintf("unknown flag: %s", e.arg)
+}
+
// relocatableReq checks args, envs is relocatable, respecting cmdConfig.
func relocatableReq(ctx context.Context, cmdConfig *cmdpb.Config, filepath clientFilePath, args, envs []string) error {
- switch name := cmdConfig.GetCmdDescriptor().GetSelector().GetName(); name {
+ name := cmdConfig.GetCmdDescriptor().GetSelector().GetName()
+ var err error
+ switch name {
case "gcc", "g++", "clang", "clang++":
- return gccRelocatableReq(filepath, args, envs)
+ err = gccRelocatableReq(filepath, args, envs)
case "clang-cl":
- return clangclRelocatableReq(filepath, args, envs)
+ err = clangclRelocatableReq(filepath, args, envs)
case "javac":
// Currently, javac in Chromium is fully relocatable. Simpler just to
// support only the relocatable case and let it fail if the client passed
// in invalid absolute paths.
- return nil
+ err = nil
default:
// "cl.exe", "clang-tidy"
- return fmt.Errorf("no relocatable check for %s", name)
+ err = fmt.Errorf("no relocatable check for %s", name)
}
+ if err != nil {
+ var uerr unknownFlagError
+ if errors.As(err, &uerr) {
+ if serr := stats.RecordWithTags(ctx, []tag.Mutator{tag.Upsert(compilerNameKey, name)}, unknownFlagCount.M(1)); serr != nil {
+ logger := log.FromContext(ctx)
+ logger.Errorf("record unknown-flag %s: %v", name, serr)
+ }
+ }
+ }
+ return err
}
// outputs gets output filenames from gomaReq.
@@ -1206,7 +1309,6 @@
func (r *request) newResp(ctx context.Context, eresp *rpb.ExecuteResponse, cached bool) (*gomapb.ExecResp, error) {
logger := log.FromContext(ctx)
if r.err != nil {
- logger.Warnf("error during exec: %v", r.err)
return nil, r.Err()
}
logger.Debugf("response %v cached=%t", eresp, cached)
@@ -1251,6 +1353,7 @@
execTime,
outputTime)
tags := []tag.Mutator{
+ // exit_code=159 is seccomp violation.
tag.Upsert(rbeExitKey, fmt.Sprintf("%d", eresp.Result.GetExitCode())),
tag.Upsert(rbeCacheKey, r.gomaResp.GetCacheHit().String()),
tag.Upsert(rbePlatformOSFamilyKey, osFamily),
@@ -1272,13 +1375,20 @@
instance: r.instanceName(),
gomaFile: r.f.GomaFile,
}
- // TODO: gomaOutput should return err for codes.Unauthenticated,
+ // gomaOutput should return err for codes.Unauthenticated,
// instead of setting ErrorMessage in r.gomaResp,
// so it returns to caller (i.e. frontend), and retry with new
- // refreshed oauth2 access.
- // token.
- gout.stdoutData(ctx, eresp)
- gout.stderrData(ctx, eresp)
+ // refreshed oauth2 access token.
+ for _, f := range []func(context.Context, *rpb.ExecuteResponse) error{
+ gout.stdoutData,
+ gout.stderrData,
+ } {
+ err := f(ctx, eresp)
+ if status.Code(err) == codes.Unauthenticated && r.err == nil {
+ r.err = err
+ return r.gomaResp, r.Err()
+ }
+ }
if len(r.gomaResp.Result.StdoutBuffer) > 0 {
// docker failure would be error of goma server, not users.
@@ -1314,7 +1424,11 @@
r.gomaResp.ErrorMessage = append(r.gomaResp.ErrorMessage, fmt.Sprintf("output path %s: %v", output.Path, err))
continue
}
- gout.outputFile(ctx, fname, output)
+ err = gout.outputFile(ctx, fname, output)
+ if err != nil && r.err == nil {
+ r.err = err
+ return r.gomaResp, r.Err()
+ }
}
for _, output := range eresp.Result.OutputDirectories {
if r.err != nil {
@@ -1327,7 +1441,11 @@
r.gomaResp.ErrorMessage = append(r.gomaResp.ErrorMessage, fmt.Sprintf("output path %s: %v", output.Path, err))
continue
}
- gout.outputDirectory(ctx, r.filepath, fname, output, r.f.OutputFileSema)
+ err = gout.outputDirectory(ctx, r.filepath, fname, output, r.f.OutputFileSema)
+ if err != nil && r.err == nil {
+ r.err = err
+ return r.gomaResp, r.Err()
+ }
}
if len(r.gomaResp.ErrorMessage) == 0 {
r.gomaResp.Result.ExitStatus = proto.Int32(eresp.Result.ExitCode)
@@ -1357,16 +1475,24 @@
}
func platformDockerRuntime(p *rpb.Platform) string {
+ priv := false
+ runAsRoot := false
for _, p := range p.Properties {
switch p.Name {
case "dockerRuntime":
return p.Value
case "dockerPrivileged":
- if p.Value == "true" {
- return "nsjail"
- }
+ priv = p.Value == "true"
+ case "dockerRunAsRoot":
+ runAsRoot = p.Value == "true"
}
}
+ switch {
+ case priv && runAsRoot:
+ return "nsjail-chroot"
+ case priv:
+ return "nsjail"
+ }
return "default"
}
diff --git a/remoteexec/exec_test.go b/remoteexec/exec_test.go
index 6fec358..8f563d2 100644
--- a/remoteexec/exec_test.go
+++ b/remoteexec/exec_test.go
@@ -350,7 +350,7 @@
Data: digest.Bytes(input.GetFilename(), input.Content.GetContent()),
},
},
- uploaded: input.Content != nil,
+ needUpload: input.Content != nil,
}
}
diff --git a/remoteexec/gcc.go b/remoteexec/gcc.go
index 2c89732..10e34bd 100644
--- a/remoteexec/gcc.go
+++ b/remoteexec/gcc.go
@@ -10,21 +10,23 @@
"strings"
)
+// longest first
var pathFlags = []string{
- "--sysroot=",
- "-B",
- "-I",
"-fcrash-diagnostics-dir=",
- "-fprofile-instr-use=",
"-fprofile-sample-use=",
"-fsanitize-blacklist=",
+ "-fprofile-instr-use=",
+ "-resource-dir=",
"--include=",
+ "--sysroot=",
"--include",
"-include=",
"-include",
"-isystem",
"-o",
- "-resource-dir=",
+ "-B",
+ "-F",
+ "-I",
}
// TODO: share exec/gcc.go ?
@@ -153,6 +155,7 @@
case strings.HasPrefix(arg, "-m"):
// -m64, -march=x86-64
case arg == "-arch":
+ case arg == "-target":
case strings.HasPrefix(arg, "--target="):
case strings.HasPrefix(arg, "-no"):
@@ -172,17 +175,19 @@
case arg == "-o":
pathFlag = true
- case arg == "-I" || arg == "-B" || arg == "-isystem" || arg == "-include":
+ case arg == "-I" || arg == "-B" || arg == "-F" || arg == "-isystem" || arg == "-include":
pathFlag = true
case arg == "-MF":
pathFlag = true
case arg == "-isysroot":
pathFlag = true
+ case arg == "--sysroot":
+ pathFlag = true
case arg == "-idirafter":
pathFlag = true
case strings.HasPrefix(arg, "-"): // unknown flag?
- return fmt.Errorf("unknown flag: %s", arg)
+ return unknownFlagError{arg: arg}
default: // input file?
if filepath.IsAbs(arg) {
@@ -207,8 +212,13 @@
if err != nil {
return err
}
+ case "as":
+ err := asArgRelocatable(filepath, args)
+ if err != nil {
+ return err
+ }
default:
- return fmt.Errorf("unsupported subcommand args %s: %s", cmd, args)
+ return unknownFlagError{arg: fmt.Sprintf("unsupported subcommand %s: %s", cmd, args)}
}
}
}
@@ -250,7 +260,7 @@
pathFlag = true
case strings.HasPrefix(arg, "-debug-info-kind="):
default:
- return fmt.Errorf("clang unknown arg: %s", arg)
+ return unknownFlagError{arg: fmt.Sprintf("clang: %s", arg)}
}
}
return nil
@@ -297,7 +307,20 @@
// doesn't take a path related value.
default:
- return fmt.Errorf("llvm unknown arg: %s", arg)
+ return unknownFlagError{arg: fmt.Sprintf("llvm: %s", arg)}
+ }
+ }
+ return nil
+}
+
+func asArgRelocatable(filepath clientFilePath, args []string) error {
+ for _, arg := range args {
+ switch {
+ case arg == "--fatal-warnings":
+ // b/173641495
+ // https://github.com/llvm/llvm-project/blob/ffc5d98d2c0df5f72ce67e5dcb724b64f03f639b/llvm/lib/MC/MCTargetOptionsCommandFlags.cpp
+ default:
+ return unknownFlagError{arg: fmt.Sprintf("as: %s", arg)}
}
}
return nil
diff --git a/remoteexec/gcc_test.go b/remoteexec/gcc_test.go
index f597f2a..01e51cc 100644
--- a/remoteexec/gcc_test.go
+++ b/remoteexec/gcc_test.go
@@ -12,6 +12,16 @@
"go.chromium.org/goma/server/command/descriptor/posixpath"
)
+func TestGccPathFlags(t *testing.T) {
+ lastP := pathFlags[0]
+ for _, p := range pathFlags[1:] {
+ if len(lastP) < len(p) {
+ t.Errorf("%q is longer than %q", p, lastP)
+ }
+ lastP = p
+ }
+}
+
func TestGccRelocatableReq(t *testing.T) {
baseReleaseArgs := []string{
@@ -190,6 +200,22 @@
relocatable: false,
},
{
+ desc: "sysroot separate relative",
+ args: append(modifyArgs(baseReleaseArgs,
+ "--sysroot",
+ "--sysroot"),
+ "../../build/linux/debian_sid_amd64-sysroot"),
+ relocatable: true,
+ },
+ {
+ desc: "sysroot separate absolute",
+ args: append(modifyArgs(baseReleaseArgs,
+ "--sysroot",
+ "--sysroot"),
+ "/b/c/b/linux/build/linux/debian_sid_amd64-sysroot"),
+ relocatable: false,
+ },
+ {
desc: "llvm -asan option",
// https://b/issues/141210713#comment3
args: append(append([]string{}, baseReleaseArgs...),
@@ -360,6 +386,24 @@
relocatable: true,
},
{
+ desc: "framework include search path -F.",
+ args: append(append([]string{}, baseReleaseArgs...),
+ "-F."),
+ relocatable: true,
+ },
+ {
+ desc: "framework include search path -F/App/Framework",
+ args: append(append([]string{}, baseReleaseArgs...),
+ "-F/App/Framework"),
+ relocatable: false,
+ },
+ {
+ desc: "-target",
+ args: append(append([]string{}, baseReleaseArgs...),
+ "-target", "x86_64-linux-gnu"),
+ relocatable: true,
+ },
+ {
desc: "-mllvm -enable-dse-memoryssa=true",
args: append(append([]string{}, baseReleaseArgs...),
"-mllvm", "-enable-dse-memoryssa=true"),
@@ -371,6 +415,12 @@
"-mllvm", "-enable-dse-memoryssa=false"),
relocatable: true,
},
+ {
+ desc: "-Wa,--fatal-warnings",
+ args: append(append([]string{}, baseReleaseArgs...),
+ "-Wa,--fatal-warnings"),
+ relocatable: true,
+ },
} {
t.Run(tc.desc, func(t *testing.T) {
err := gccRelocatableReq(posixpath.FilePath{}, tc.args, tc.envs)
diff --git a/remoteexec/gomaoutput.go b/remoteexec/gomaoutput.go
index 20eced5..dd51b8a 100644
--- a/remoteexec/gomaoutput.go
+++ b/remoteexec/gomaoutput.go
@@ -41,8 +41,16 @@
gomaFile fpb.FileServiceClient
}
-func retryCAS(ctx context.Context, f func(ctx context.Context) error) error {
- timeout := 3 * time.Second
+func outputTimeout(size int64) time.Duration {
+ // assume at least 4MB/s
+ t := time.Duration(int64((float64(size) / (4 * 1024 * 1024)) * 1e9))
+ if t < 3*time.Second {
+ return 3 * time.Second
+ }
+ return t
+}
+
+func retryCAS(ctx context.Context, timeout time.Duration, f func(ctx context.Context) error) error {
n := 0
return rpc.Retry{}.Do(ctx, func() error {
n++
@@ -54,51 +62,59 @@
})
}
-func (g gomaOutput) stdoutData(ctx context.Context, eresp *rpb.ExecuteResponse) {
+func (g gomaOutput) stdoutData(ctx context.Context, eresp *rpb.ExecuteResponse) error {
if len(eresp.Result.StdoutRaw) > 0 {
g.gomaResp.Result.StdoutBuffer = eresp.Result.StdoutRaw
- return
+ return nil
}
if eresp.Result.StdoutDigest == nil {
- return
+ return nil
}
var buf bytes.Buffer
- err := retryCAS(ctx, func(ctx context.Context) error {
+ err := retryCAS(ctx, outputTimeout(eresp.Result.StdoutDigest.SizeBytes), func(ctx context.Context) error {
return cas.DownloadDigest(ctx, g.bs, &buf, g.instance, eresp.Result.StdoutDigest)
})
if err != nil {
logger := log.FromContext(ctx)
logger.Errorf("failed to fetch stdout %v: %v", eresp.Result.StdoutDigest, err)
+ if status.Code(err) == codes.Unauthenticated {
+ return err
+ }
g.gomaResp.ErrorMessage = append(g.gomaResp.ErrorMessage, fmt.Sprintf("failed to fetch stdout %v: %s", eresp.Result.StdoutDigest, status.Code(err)))
- return
+ return nil
}
g.gomaResp.Result.StdoutBuffer = buf.Bytes()
+ return nil
}
-func (g gomaOutput) stderrData(ctx context.Context, eresp *rpb.ExecuteResponse) {
+func (g gomaOutput) stderrData(ctx context.Context, eresp *rpb.ExecuteResponse) error {
if len(eresp.Result.StderrRaw) > 0 {
g.gomaResp.Result.StderrBuffer = eresp.Result.StderrRaw
- return
+ return nil
}
if eresp.Result.StderrDigest == nil {
- return
+ return nil
}
var buf bytes.Buffer
- err := retryCAS(ctx, func(ctx context.Context) error {
+ err := retryCAS(ctx, outputTimeout(eresp.Result.StderrDigest.SizeBytes), func(ctx context.Context) error {
return cas.DownloadDigest(ctx, g.bs, &buf, g.instance, eresp.Result.StderrDigest)
})
if err != nil {
logger := log.FromContext(ctx)
logger.Errorf("failed to fetch stderr %v: %v", eresp.Result.StdoutDigest, err)
+ if status.Code(err) == codes.Unauthenticated {
+ return err
+ }
g.gomaResp.ErrorMessage = append(g.gomaResp.ErrorMessage, fmt.Sprintf("failed to fetch stderr %v: %s", eresp.Result.StderrDigest, status.Code(err)))
- return
+ return nil
}
g.gomaResp.Result.StderrBuffer = buf.Bytes()
+ return nil
}
func (g gomaOutput) outputFileHelper(ctx context.Context, fname string, output *rpb.OutputFile) (*gomapb.ExecResult_Output, error) {
var blob *gomapb.FileBlob
- err := retryCAS(ctx, func(ctx context.Context) error {
+ err := retryCAS(ctx, outputTimeout(output.GetDigest().GetSizeBytes()), func(ctx context.Context) error {
var err error
blob, err = g.toFileBlob(ctx, output)
return err
@@ -111,7 +127,7 @@
default:
logger.Errorf("goma blob for %s: %v", output.Path, err)
}
- return nil, fmt.Errorf("goma blob for %s: %v", output.Path, status.Code(err))
+ return nil, status.Errorf(status.Code(err), "goma blob for %s: %v", output.Path, status.Code(err))
}
return &gomapb.ExecResult_Output{
Filename: proto.String(fname),
@@ -120,16 +136,20 @@
}, nil
}
-func (g gomaOutput) outputFile(ctx context.Context, fname string, output *rpb.OutputFile) {
+func (g gomaOutput) outputFile(ctx context.Context, fname string, output *rpb.OutputFile) error {
result, err := g.outputFileHelper(ctx, fname, output)
if err != nil {
+ if status.Code(err) == codes.Unauthenticated {
+ return err
+ }
g.gomaResp.ErrorMessage = append(g.gomaResp.ErrorMessage, err.Error())
- return
+ return nil
}
g.gomaResp.Result.Output = append(g.gomaResp.Result.Output, result)
+ return nil
}
-func (g gomaOutput) outputFilesConcurrent(ctx context.Context, outputs []*rpb.OutputFile, sema chan struct{}) {
+func (g gomaOutput) outputFilesConcurrent(ctx context.Context, outputs []*rpb.OutputFile, sema chan struct{}) error {
var wg sync.WaitGroup
results := make([]*gomapb.ExecResult_Output, len(outputs))
errs := make([]error, len(outputs))
@@ -154,11 +174,16 @@
g.gomaResp.Result.Output = append(g.gomaResp.Result.Output, result)
}
}
+ var rerr error
for _, err := range errs {
if err != nil {
+ if status.Code(err) == codes.Unauthenticated {
+ rerr = err
+ }
g.gomaResp.ErrorMessage = append(g.gomaResp.ErrorMessage, err.Error())
}
}
+ return rerr
}
func toChunkedFileBlob(ctx context.Context, rd io.Reader, size int64, fs fpb.FileServiceClient) (*gomapb.FileBlob, error) {
@@ -197,7 +222,7 @@
return err
})
if err != nil {
- return nil, fmt.Errorf("store blob failed offset=%d: %v", offset, err)
+ return nil, status.Errorf(status.Code(err), "store blob failed offset=%d: %v", offset, err)
}
for _, hashKey := range resp.HashKey {
if hashKey == "" {
@@ -217,7 +242,7 @@
return nil, fmt.Errorf("more bytes were read past end: %d", n)
}
if err != io.EOF {
- return nil, fmt.Errorf("could not confirm EOF: %v", err)
+ return nil, status.Errorf(status.Code(err), "could not confirm EOF: %v", err)
}
return blob, nil
}
@@ -264,7 +289,7 @@
blob, err := toChunkedFileBlob(ctx, rd, output.Digest.SizeBytes, g.gomaFile)
if err != nil {
- return nil, fmt.Errorf("Failed to convert %v to chunked FileBlob: %v", output, err)
+ return nil, status.Errorf(status.Code(err), "failed to convert output:{%v} to chunked FileBlob: %v", output, err)
}
if err = <-casErrCh; err != nil {
return nil, err
@@ -304,27 +329,30 @@
return result
}
-func (g gomaOutput) outputDirectory(ctx context.Context, filepath clientFilePath, dname string, output *rpb.OutputDirectory, sema chan struct{}) {
+func (g gomaOutput) outputDirectory(ctx context.Context, filepath clientFilePath, dname string, output *rpb.OutputDirectory, sema chan struct{}) error {
logger := log.FromContext(ctx)
if output.TreeDigest == nil {
logger.Warnf("no tree digest in %s", dname)
- return
+ return nil
}
var buf bytes.Buffer
- err := retryCAS(ctx, func(ctx context.Context) error {
+ err := retryCAS(ctx, outputTimeout(output.TreeDigest.SizeBytes), func(ctx context.Context) error {
return cas.DownloadDigest(ctx, g.bs, &buf, g.instance, output.TreeDigest)
})
if err != nil {
logger.Errorf("failed to download tree %s: %v", dname, err)
+ if status.Code(err) == codes.Unauthenticated {
+ return err
+ }
g.gomaResp.ErrorMessage = append(g.gomaResp.ErrorMessage, fmt.Sprintf("failed to download tree %s: %s", dname, status.Code(err)))
- return
+ return nil
}
tree := &rpb.Tree{}
err = proto.Unmarshal(buf.Bytes(), tree)
if err != nil {
logger.Errorf("failed to unmarshal tree data %s: %v", dname, err)
g.gomaResp.ErrorMessage = append(g.gomaResp.ErrorMessage, fmt.Sprintf("failed to unmarshal tree data %s: %v", dname, err))
- return
+ return nil
}
ds := digest.NewStore()
@@ -337,7 +365,7 @@
ds.Set(d)
}
outputFiles := traverseTree(ctx, filepath, dname, tree.Root, ds)
- g.outputFilesConcurrent(ctx, outputFiles, sema)
+ return g.outputFilesConcurrent(ctx, outputFiles, sema)
}
// reduceRespSize attempts to reduce the encoded size of `g.gomaResp` to under `byteLimit`.
@@ -375,7 +403,7 @@
return err
})
if err != nil {
- return nil, fmt.Errorf("store blob failed: %v", err)
+ return nil, status.Errorf(status.Code(err), "store blob failed: %v", err)
}
if len(resp.HashKey) != 1 {
return nil, fmt.Errorf("store blob got len(resp.HashKey)=%d, want=1", len(resp.HashKey))
diff --git a/remoteexec/inputroot.go b/remoteexec/inputroot.go
index 5237c10..e6a37a0 100644
--- a/remoteexec/inputroot.go
+++ b/remoteexec/inputroot.go
@@ -58,6 +58,59 @@
return true
}
+func sysrootDir(args []string) (string, bool) {
+ // https://github.com/llvm/llvm-project/blob/1d99472875100b230bac2d9ea70b5cd4b45e788b/clang/include/clang/Driver/Options.td
+ // def isysroot : JoinedOrSeparate<["-"], "isysroot">, Group<clang_i_Group>, Flags<[CC1Option]>,
+ // HelpText<"Set the system root directory (usually /)">, MetaVarName<"<dir>">;
+ // def _sysroot_EQ : Joined<["--"], "sysroot=">;
+ // def _sysroot : Separate<["--"], "sysroot">, Alias<_sysroot_EQ>;
+ var sysrootDir, isysrootDir string
+ var sysrootFlag, isysrootFlag bool
+ // https://releases.llvm.org/10.0.0/tools/clang/docs/DiagnosticsReference.html#wmissing-sysroot
+ // enabled by default
+ need := true
+ for _, arg := range args {
+ if sysrootFlag {
+ // separated, next arg of --sysroot
+ sysrootDir = arg
+ sysrootFlag = false
+ continue
+ }
+ if isysrootFlag {
+ // separated, next arg of -isysroot
+ isysrootDir = arg
+ isysrootFlag = false
+ continue
+ }
+ switch arg {
+ case "-Wall", "-Wmissing-sysroot":
+ need = true
+ case "-Wno-missing-sysroot":
+ need = false
+ case "-isysroot":
+ isysrootFlag = true
+ case "--sysroot":
+ sysrootFlag = true
+ default:
+ // handled joined.
+ switch {
+ case strings.HasPrefix(arg, "-isysroot"):
+ isysrootDir = strings.TrimPrefix(arg, "-isysroot")
+ case strings.HasPrefix(arg, "--sysroot="):
+ sysrootDir = strings.TrimPrefix(arg, "--sysroot=")
+ }
+ }
+ }
+ // https://gcc.gnu.org/onlinedocs/gcc/Directory-Options.html
+ // If you use both this option and the -isysroot option, then
+ // the --sysroot option applies to libraries, but the
+ // -isysroot option applies to header files.
+ if isysrootDir != "" {
+ return isysrootDir, need
+ }
+ return sysrootDir, need
+}
+
func inputPaths(filepath clientFilePath, req *gomapb.ExecReq, argv0 string) ([]string, error) {
cwd := filepath.Clean(req.GetCwd())
if !filepath.IsAbs(cwd) {
@@ -77,23 +130,23 @@
}
paths = append(paths, filepath.Clean(argv0))
}
- for _, dir := range req.GetCommandSpec().GetCxxSystemIncludePath() {
- if !filepath.IsAbs(dir) {
- dir = filepath.Join(cwd, dir)
+ sysrootDir, need := sysrootDir(req.Arg)
+ // if missing sysroot is allowed, no need to ensure it
+ if need && sysrootDir != "" {
+ // if request not allows missing sysroot, we
+ // need to create the directory even if no input files
+ // in dir are used. b/150421328
+
+ // allow relative path only.
+ // if dir is absolute, request would require
+ // InputRootAbsolutePath.
+ // TODO: cwdAgnosticReq should check input file path too.
+ // http://b/167342635
+ // http://crbug.com/1123938
+ if !filepath.IsAbs(sysrootDir) {
+ dir := filepath.Join(cwd, sysrootDir)
+ paths = append(paths, filepath.Clean(dir))
}
- paths = append(paths, filepath.Clean(dir))
- }
- for _, dir := range req.GetCommandSpec().GetSystemIncludePath() {
- if !filepath.IsAbs(dir) {
- dir = filepath.Join(cwd, dir)
- }
- paths = append(paths, filepath.Clean(dir))
- }
- for _, dir := range req.GetCommandSpec().GetSystemFrameworkPath() {
- if !filepath.IsAbs(dir) {
- dir = filepath.Join(cwd, dir)
- }
- paths = append(paths, filepath.Clean(dir))
}
return paths, nil
}
@@ -178,9 +231,13 @@
}
// inputRootDir returns common root of paths.
+// if execRootDir is not empty, use it as root of paths.
// If second return value is true, chroot must be used. It become true only
// if `allowChroot` is true and common input root is "/".
-func inputRootDir(filepath clientFilePath, paths []string, allowChroot bool) (string, bool, error) {
+func inputRootDir(filepath clientFilePath, paths []string, allowChroot bool, execRootDir string) (string, bool, error) {
+ if execRootDir != "" {
+ return execRootDir, execRootDir == "/" && allowChroot, nil
+ }
root := commonDir(filepath, paths)
if needChroot(filepath, root) && allowChroot {
switch filepath.(type) {
diff --git a/remoteexec/inputroot_test.go b/remoteexec/inputroot_test.go
index ec4645a..ed9f9d2 100644
--- a/remoteexec/inputroot_test.go
+++ b/remoteexec/inputroot_test.go
@@ -160,6 +160,7 @@
req *gomapb.ExecReq
argv0 string
allowChroot bool
+ execRoot string
want string
wantChroot bool
wantPathErr bool
@@ -185,6 +186,29 @@
want: "/b/c/b/linux/src",
},
{
+ desc: "execRoot",
+ req: &gomapb.ExecReq{
+ Cwd: proto.String("/b/c/b/linux/src/out/Release"),
+ Input: []*gomapb.ExecReq_Input{
+ {
+ Filename: proto.String("../../base/logging.h"),
+ },
+ {
+ Filename: proto.String("../../build/linux/debian_sid_amd64-sysroot/usr/include/stdio.h"),
+ },
+ {
+ Filename: proto.String("gen/chrome/common/buildflags.h"),
+ },
+ {
+ Filename: proto.String("/usr/include/stdio.h"),
+ },
+ },
+ },
+ argv0: "../../third_party/llvm-build/Release+Asserts/bin/clang++",
+ execRoot: "/b/c/b/linux/src",
+ want: "/b/c/b/linux/src",
+ },
+ {
desc: "abs input path",
req: &gomapb.ExecReq{
Cwd: proto.String("/b/c/b/linux/src/out/Release"),
@@ -332,6 +356,34 @@
allowChroot: true,
wantChroot: true,
},
+ {
+ desc: "--sysroot=, but ignore system include paths",
+ req: &gomapb.ExecReq{
+ Arg: []string{
+ "../../third_party/llvm-build/Release+Asserts/bin/clang++",
+ "-Wall",
+ "-Werror",
+ "--sysroot=../../build/linux/debian_sid_amd64-sysroot",
+ },
+ Cwd: proto.String("/b/c/b/chromeos/src/out/Release"),
+ Input: []*gomapb.ExecReq_Input{
+ {
+ Filename: proto.String("../../base/logging.h"),
+ },
+ {
+ Filename: proto.String("gen/chrome/common/buildflags.h"),
+ },
+ },
+ CommandSpec: &gomapb.CommandSpec{
+ SystemIncludePath: []string{
+ "../../build/linux/debian_sid_amd64-sysroot/usr/include",
+ "/usr/include",
+ },
+ },
+ },
+ argv0: "../../third_party/llvm-build/Release+Asserts/bin/clang++",
+ want: "/b/c/b/chromeos/src",
+ },
} {
t.Logf("test case: %s", tc.desc)
paths, err := inputPaths(posixpath.FilePath{}, tc.req, tc.argv0)
@@ -345,7 +397,7 @@
if err != nil {
t.Errorf("inputPaths(req, %q)=%v, %v; want nil error", tc.argv0, paths, err)
}
- got, needChroot, err := inputRootDir(posixpath.FilePath{}, paths, tc.allowChroot)
+ got, needChroot, err := inputRootDir(posixpath.FilePath{}, paths, tc.allowChroot, tc.execRoot)
if tc.wantRootErr {
if err == nil {
t.Errorf("inputRootDir(files)=%v, %t, nil; want err", got, needChroot)
diff --git a/remoteexec/nsjail.go b/remoteexec/nsjail.go
index c86532c..537c9cd 100644
--- a/remoteexec/nsjail.go
+++ b/remoteexec/nsjail.go
@@ -15,7 +15,116 @@
)
const (
- nsjailRunWrapperScript = `#!/bin/bash
+ nsjailHardeningConfig = `
+name: "hardening by nsjail (seccomp-bpf)"
+mode: ONCE
+# keep_env = true
+mount_proc: true
+# it runs in docker container, so ok to mount / as RO.
+mount <
+ src: "/"
+ dst: "/"
+ is_bind: true
+ rw: false
+ is_dir: true
+>
+mount <
+ dst: "/tmp"
+ fstype: "tmpfs"
+ options: "size=5000000"
+ rw: true
+ is_dir: true
+>
+# input root is per request, so ok to mount it as RW.
+# (does not affect to other requests).
+mount <
+ prefix_src_env: "INPUT_ROOT"
+ src: ""
+ prefix_dst_env: "INPUT_ROOT"
+ dst: ""
+ is_bind: true
+ rw: true
+ is_dir: true
+>
+# default may fail with "File too large"
+rlimit_fsize_type: INF
+rlimit_as_type: INF
+# syscalls used by clang.
+seccomp_string: "ALLOW {"
+seccomp_string: " access,"
+seccomp_string: " alarm,"
+seccomp_string: " arch_prctl,"
+seccomp_string: " brk,"
+seccomp_string: " close,"
+seccomp_string: " clone,"
+seccomp_string: " connect,"
+seccomp_string: " dup2,"
+seccomp_string: " execve,"
+seccomp_string: " exit_group,"
+seccomp_string: " fcntl,"
+seccomp_string: " futex,"
+seccomp_string: " getcwd,"
+seccomp_string: " getdents,"
+seccomp_string: " getdents64,"
+seccomp_string: " getegid,"
+seccomp_string: " geteuid,"
+seccomp_string: " getgid,"
+seccomp_string: " getpgrp,"
+seccomp_string: " getpid,"
+seccomp_string: " getppid,"
+seccomp_string: " getuid,"
+seccomp_string: " gettid,"
+seccomp_string: " getrlimit,"
+seccomp_string: " ioctl,"
+seccomp_string: " lseek,"
+seccomp_string: " mmap,"
+seccomp_string: " mprotect,"
+seccomp_string: " mremap,"
+seccomp_string: " munmap,"
+seccomp_string: " newfstat,"
+seccomp_string: " newlstat,"
+seccomp_string: " newstat,"
+seccomp_string: " newuname,"
+seccomp_string: " open,"
+seccomp_string: " openat,"
+seccomp_string: " pipe,"
+seccomp_string: " pipe2,"
+seccomp_string: " pread64,"
+seccomp_string: " prlimit64,"
+seccomp_string: " read,"
+seccomp_string: " readlink,"
+seccomp_string: " rename,"
+seccomp_string: " rt_sigaction,"
+seccomp_string: " rt_sigprocmask,"
+seccomp_string: " rt_sigreturn, "
+seccomp_string: " set_robust_list,"
+seccomp_string: " set_tid_address,"
+seccomp_string: " sigaltstack,"
+seccomp_string: " socket,"
+seccomp_string: " sysinfo,"
+seccomp_string: " unlink,"
+seccomp_string: " vfork,"
+seccomp_string: " wait4,"
+seccomp_string: " write,"
+seccomp_string: " writev"
+seccomp_string: "}"
+seccomp_string: "DEFAULT KILL"
+#seccomp_log: true
+iface_no_lo: true
+`
+ nsjailHardeningWrapperScript = `#!/bin/bash
+export INPUT_ROOT="$(pwd)"
+if [[ "$WORK_DIR" != "" ]]; then
+ cd "${WORK_DIR}"
+fi
+export PWD="$(pwd)"
+# exit 159 -> seccomp violation
+nsjail -q -C "./nsjail.cfg" --cwd "$PWD" \
+ -- \
+ "$@"
+`
+
+ nsjailChrootRunWrapperScript = `#!/bin/bash
set -e
if [[ "$WORK_DIR" == "" ]]; then
@@ -88,8 +197,8 @@
// nsjailConfig returns nsjail configuration.
// When you modify followings, please make sure it matches
-// nsjailRunWrapperScript above.
-func nsjailConfig(cwd string, cfp clientFilePath, ts []*gomapb.ToolchainSpec, envs []string) []byte {
+// nsjailChrootRunWrapperScript above.
+func nsjailChrootConfig(cwd string, cfp clientFilePath, ts []*gomapb.ToolchainSpec, envs []string) []byte {
chrootWorkdir := "/tmp/goma_chroot"
cfg := &nsjailpb.NsJailConfig{
Uidmap: []*nsjailpb.IdMap{
diff --git a/remoteexec/nsjail_test.go b/remoteexec/nsjail_test.go
index f9bc831..018d87b 100644
--- a/remoteexec/nsjail_test.go
+++ b/remoteexec/nsjail_test.go
@@ -11,6 +11,7 @@
"go.chromium.org/goma/server/command/descriptor/posixpath"
gomapb "go.chromium.org/goma/server/proto/api"
+ nsjailpb "go.chromium.org/goma/server/proto/nsjail"
)
func TestPathFromToolchainSpec(t *testing.T) {
@@ -131,3 +132,11 @@
})
}
}
+
+func TestNsjailHardeningConfig(t *testing.T) {
+ cfg := &nsjailpb.NsJailConfig{}
+ err := proto.UnmarshalText(nsjailHardeningConfig, cfg)
+ if err != nil {
+ t.Errorf("unmarshal\n%s\n => %v", nsjailHardeningConfig, err)
+ }
+}
diff --git a/remoteexec/stats.go b/remoteexec/stats.go
index b9bb3d3..9703a45 100644
--- a/remoteexec/stats.go
+++ b/remoteexec/stats.go
@@ -25,6 +25,12 @@
wrapperTypeKey = tag.MustNewKey("wrapper")
+ unknownFlagCount = stats.Int64(
+ "go.chromium.org/goma/server/remoteexec.unknown-flags",
+ "Number of requests with unknown flags",
+ stats.UnitDimensionless)
+ compilerNameKey = tag.MustNewKey("compiler")
+
inputBufferAllocSize = stats.Int64(
"go.chromium.org/goma/server/remoteexec.input-buffer-alloc",
"Size to allocate buffer for input files",
@@ -116,6 +122,13 @@
Aggregation: view.Count(),
},
{
+ Measure: unknownFlagCount,
+ TagKeys: []tag.Key{
+ compilerNameKey,
+ },
+ Aggregation: view.Count(),
+ },
+ {
Description: "Size to allocate buffer for input files",
TagKeys: []tag.Key{
allocStatusKey,
diff --git a/server/dial.go b/server/dial.go
index 890978f..39d0fac 100644
--- a/server/dial.go
+++ b/server/dial.go
@@ -10,6 +10,7 @@
"go.opencensus.io/plugin/ocgrpc"
"google.golang.org/grpc"
+ _ "google.golang.org/grpc/encoding/gzip" // also register compressor for server side
"google.golang.org/grpc/keepalive"
)
@@ -17,10 +18,12 @@
func DefaultDialOption() []grpc.DialOption {
return []grpc.DialOption{
grpc.WithInsecure(),
- grpc.WithStatsHandler(&ocgrpc.ClientHandler{}),
grpc.WithKeepaliveParams(keepalive.ClientParameters{
- Time: 10 * time.Second,
+ Time: 10 * time.Second,
+ Timeout: 5 * time.Second,
+ PermitWithoutStream: false,
}),
+ grpc.WithStatsHandler(&ocgrpc.ClientHandler{}),
}
}
diff --git a/server/server.go b/server/server.go
index 85022cd..2568709 100644
--- a/server/server.go
+++ b/server/server.go
@@ -14,9 +14,11 @@
"os/signal"
"sync"
"syscall"
+ "time"
"go.opencensus.io/plugin/ocgrpc"
"google.golang.org/grpc"
+ "google.golang.org/grpc/keepalive"
"google.golang.org/grpc/reflection"
"go.chromium.org/goma/server/log"
@@ -69,6 +71,10 @@
return GRPC{}, err
}
opts = append(opts,
+ grpc.KeepaliveEnforcementPolicy(keepalive.EnforcementPolicy{
+ MinTime: 5 * time.Second,
+ PermitWithoutStream: false,
+ }),
grpc.StatsHandler(&ocgrpc.ServerHandler{}),
grpc.UnaryInterceptor(func() func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) {
interceptor := log.GRPCUnaryServerInterceptor()