From 72b661903e209c85db204db6f88e299e8244e898 Mon Sep 17 00:00:00 2001 From: "Mohamed S. Mahmoud" Date: Thu, 22 Aug 2024 12:14:03 -0400 Subject: [PATCH] DNS enhancement features [BP 1.6.2] (#394) * Allow DNS tracking to use configurable port for tracking Today DNS tracking uses only port 53 which is the port defined for DNS service and it get mapped to different port at the container level to avoid root access. This change wil allow tracking at the pod level as well Signed-off-by: Mohamed Mahmoud (cherry picked from commit 45824ddde48cb5a93c47e706e4601f8468453ed8) * shrink dns port to u16 as that should be enough Signed-off-by: Mohamed Mahmoud (cherry picked from commit fa535f2c3da2271478d80525e777ab094975888f) * Allow flow filtering for L4 protocols using two ports For example allow TCP ports="80,100" with por1 always < port2 Signed-off-by: Mohamed Mahmoud (cherry picked from commit e68c3ba04e51bd8c89e94b20b50eb3abeb83774b) * Allow filtering with wildcard protocol field Signed-off-by: Mohamed Mahmoud (cherry picked from commit b53ce35e0e596bdeecc2344b4c690fb91aec66c3) * Bump grpc to v1.65.0 Signed-off-by: Mohamed Mahmoud --------- Signed-off-by: Mohamed Mahmoud --- bpf/configs.h | 1 + bpf/dns_tracker.h | 5 +- bpf/flows_filter.h | 162 +- bpf/types.h | 6 + docs/flow_filtering.md | 7 +- go.mod | 19 +- go.sum | 45 +- pkg/agent/agent.go | 7 +- pkg/agent/config.go | 12 + pkg/agent/packets_agent.go | 6 +- pkg/ebpf/bpf_arm64_bpfel.go | 6 + pkg/ebpf/bpf_arm64_bpfel.o | Bin 119640 -> 125304 bytes pkg/ebpf/bpf_powerpc_bpfel.go | 6 + pkg/ebpf/bpf_powerpc_bpfel.o | Bin 118872 -> 124544 bytes pkg/ebpf/bpf_s390_bpfeb.go | 6 + pkg/ebpf/bpf_s390_bpfeb.o | Bin 134736 -> 140400 bytes pkg/ebpf/bpf_x86_bpfel.go | 6 + pkg/ebpf/bpf_x86_bpfel.o | Bin 119440 -> 125112 bytes pkg/ebpf/flow_filter.go | 79 +- pkg/ebpf/flow_filter_test.go | 55 +- pkg/ebpf/tracer.go | 9 + pkg/pbflow/flow_grpc.pb.go | 25 +- pkg/pbpacket/packet_grpc.pb.go | 25 +- vendor/github.com/cespare/xxhash/v2/README.md | 2 + vendor/github.com/cespare/xxhash/v2/xxhash.go | 29 +- .../cespare/xxhash/v2/xxhash_asm.go | 2 +- .../cespare/xxhash/v2/xxhash_other.go | 2 +- .../cespare/xxhash/v2/xxhash_safe.go | 2 +- .../cespare/xxhash/v2/xxhash_unsafe.go | 2 +- vendor/golang.org/x/net/html/doc.go | 2 +- .../golang.org/x/net/http/httpguts/httplex.go | 13 +- vendor/golang.org/x/net/http2/frame.go | 13 +- vendor/golang.org/x/net/http2/server.go | 11 +- vendor/golang.org/x/net/http2/transport.go | 15 +- .../x/oauth2/internal/client_appengine.go | 13 - .../golang.org/x/oauth2/internal/transport.go | 5 - vendor/golang.org/x/oauth2/oauth2.go | 2 +- vendor/google.golang.org/appengine/LICENSE | 202 - .../appengine/internal/api.go | 653 --- .../appengine/internal/api_classic.go | 170 - .../appengine/internal/api_common.go | 141 - .../appengine/internal/app_id.go | 28 - .../appengine/internal/base/api_base.pb.go | 308 -- .../appengine/internal/base/api_base.proto | 33 - .../internal/datastore/datastore_v3.pb.go | 4367 ----------------- .../internal/datastore/datastore_v3.proto | 551 --- .../appengine/internal/identity.go | 54 - .../appengine/internal/identity_classic.go | 62 - .../appengine/internal/identity_flex.go | 12 - .../appengine/internal/identity_vm.go | 134 - .../appengine/internal/internal.go | 110 - .../appengine/internal/log/log_service.pb.go | 1313 ----- .../appengine/internal/log/log_service.proto | 150 - .../appengine/internal/main.go | 17 - .../appengine/internal/main_common.go | 7 - .../appengine/internal/main_vm.go | 70 - .../appengine/internal/metadata.go | 60 - .../appengine/internal/net.go | 56 - .../appengine/internal/regen.sh | 40 - .../internal/remote_api/remote_api.pb.go | 361 -- .../internal/remote_api/remote_api.proto | 44 - .../appengine/internal/transaction.go | 115 - .../internal/urlfetch/urlfetch_service.pb.go | 527 -- .../internal/urlfetch/urlfetch_service.proto | 64 - .../appengine/urlfetch/urlfetch.go | 209 - .../googleapis/api/httpbody/httpbody.pb.go | 4 +- .../rpc/errdetails/error_details.pb.go | 4 +- .../googleapis/rpc/status/status.pb.go | 4 +- vendor/google.golang.org/grpc/CONTRIBUTING.md | 2 +- vendor/google.golang.org/grpc/MAINTAINERS.md | 1 + vendor/google.golang.org/grpc/Makefile | 7 +- vendor/google.golang.org/grpc/README.md | 2 +- .../{ => balancer/pickfirst}/pickfirst.go | 70 +- .../grpc/balancer/roundrobin/roundrobin.go | 4 +- .../grpc/balancer_wrapper.go | 4 + .../grpc_binarylog_v1/binarylog.pb.go | 2 +- vendor/google.golang.org/grpc/clientconn.go | 96 +- vendor/google.golang.org/grpc/codegen.sh | 17 - vendor/google.golang.org/grpc/codes/codes.go | 2 +- .../grpc/credentials/credentials.go | 6 +- .../google.golang.org/grpc/credentials/tls.go | 34 +- vendor/google.golang.org/grpc/dialoptions.go | 82 +- .../grpc/health/grpc_health_v1/health.pb.go | 2 +- .../health/grpc_health_v1/health_grpc.pb.go | 24 +- .../grpc/internal/backoff/backoff.go | 4 +- .../balancer/gracefulswitch/config.go | 1 - .../balancer/gracefulswitch/gracefulswitch.go | 1 - .../grpc/internal/binarylog/method_logger.go | 6 +- .../grpc/internal/envconfig/envconfig.go | 9 +- .../grpc/internal/grpcrand/grpcrand.go | 100 - .../grpc/internal/grpcrand/grpcrand_go1.21.go | 73 - .../grpc/internal/grpcutil/compressor.go | 5 - .../grpc/internal/internal.go | 37 +- .../internal/resolver/dns/dns_resolver.go | 40 +- .../resolver/dns/internal/internal.go | 19 +- .../grpc/internal/transport/controlbuf.go | 33 +- .../grpc/internal/transport/http2_client.go | 68 +- .../grpc/internal/transport/http2_server.go | 16 +- .../grpc/internal/transport/transport.go | 2 +- vendor/google.golang.org/grpc/peer/peer.go | 30 + .../google.golang.org/grpc/picker_wrapper.go | 84 +- .../grpc/reflection/adapt.go | 138 +- .../grpc_reflection_v1/reflection.pb.go | 2 +- .../grpc_reflection_v1/reflection_grpc.pb.go | 13 +- .../grpc_reflection_v1alpha/reflection.pb.go | 2 +- .../reflection_grpc.pb.go | 13 +- .../grpc/reflection/internal/internal.go | 436 ++ .../grpc/reflection/serverreflection.go | 210 +- vendor/google.golang.org/grpc/regenerate.sh | 6 +- .../grpc/resolver/dns/dns_resolver.go | 12 +- .../grpc/resolver_wrapper.go | 2 +- vendor/google.golang.org/grpc/rpc_util.go | 3 +- vendor/google.golang.org/grpc/server.go | 16 +- .../google.golang.org/grpc/service_config.go | 32 +- vendor/google.golang.org/grpc/stats/stats.go | 10 +- vendor/google.golang.org/grpc/stream.go | 5 +- .../grpc/stream_interfaces.go | 152 + vendor/google.golang.org/grpc/version.go | 2 +- vendor/google.golang.org/grpc/vet.sh | 195 - vendor/modules.txt | 36 +- 120 files changed, 1515 insertions(+), 11123 deletions(-) delete mode 100644 vendor/golang.org/x/oauth2/internal/client_appengine.go delete mode 100644 vendor/google.golang.org/appengine/LICENSE delete mode 100644 vendor/google.golang.org/appengine/internal/api.go delete mode 100644 vendor/google.golang.org/appengine/internal/api_classic.go delete mode 100644 vendor/google.golang.org/appengine/internal/api_common.go delete mode 100644 vendor/google.golang.org/appengine/internal/app_id.go delete mode 100644 vendor/google.golang.org/appengine/internal/base/api_base.pb.go delete mode 100644 vendor/google.golang.org/appengine/internal/base/api_base.proto delete mode 100644 vendor/google.golang.org/appengine/internal/datastore/datastore_v3.pb.go delete mode 100644 vendor/google.golang.org/appengine/internal/datastore/datastore_v3.proto delete mode 100644 vendor/google.golang.org/appengine/internal/identity.go delete mode 100644 vendor/google.golang.org/appengine/internal/identity_classic.go delete mode 100644 vendor/google.golang.org/appengine/internal/identity_flex.go delete mode 100644 vendor/google.golang.org/appengine/internal/identity_vm.go delete mode 100644 vendor/google.golang.org/appengine/internal/internal.go delete mode 100644 vendor/google.golang.org/appengine/internal/log/log_service.pb.go delete mode 100644 vendor/google.golang.org/appengine/internal/log/log_service.proto delete mode 100644 vendor/google.golang.org/appengine/internal/main.go delete mode 100644 vendor/google.golang.org/appengine/internal/main_common.go delete mode 100644 vendor/google.golang.org/appengine/internal/main_vm.go delete mode 100644 vendor/google.golang.org/appengine/internal/metadata.go delete mode 100644 vendor/google.golang.org/appengine/internal/net.go delete mode 100644 vendor/google.golang.org/appengine/internal/regen.sh delete mode 100644 vendor/google.golang.org/appengine/internal/remote_api/remote_api.pb.go delete mode 100644 vendor/google.golang.org/appengine/internal/remote_api/remote_api.proto delete mode 100644 vendor/google.golang.org/appengine/internal/transaction.go delete mode 100644 vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.pb.go delete mode 100644 vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto delete mode 100644 vendor/google.golang.org/appengine/urlfetch/urlfetch.go rename vendor/google.golang.org/grpc/{ => balancer/pickfirst}/pickfirst.go (74%) delete mode 100644 vendor/google.golang.org/grpc/codegen.sh delete mode 100644 vendor/google.golang.org/grpc/internal/grpcrand/grpcrand.go delete mode 100644 vendor/google.golang.org/grpc/internal/grpcrand/grpcrand_go1.21.go create mode 100644 vendor/google.golang.org/grpc/reflection/internal/internal.go create mode 100644 vendor/google.golang.org/grpc/stream_interfaces.go delete mode 100644 vendor/google.golang.org/grpc/vet.sh diff --git a/bpf/configs.h b/bpf/configs.h index 397d7548f..38cb325e7 100644 --- a/bpf/configs.h +++ b/bpf/configs.h @@ -9,4 +9,5 @@ volatile const u8 enable_rtt = 0; volatile const u8 enable_pca = 0; volatile const u8 enable_dns_tracking = 0; volatile const u8 enable_flows_filtering = 0; +volatile const u16 dns_port = 0; #endif //__CONFIGS_H__ diff --git a/bpf/dns_tracker.h b/bpf/dns_tracker.h index a2253fa8c..714e12862 100644 --- a/bpf/dns_tracker.h +++ b/bpf/dns_tracker.h @@ -6,10 +6,10 @@ #define __DNS_TRACKER_H__ #include "utils.h" -#define DNS_PORT 53 #define DNS_QR_FLAG 0x8000 #define UDP_MAXMSG 512 #define EINVAL 22 +#define DNS_DEFAULT_PORT 53 struct dns_header { u16 id; @@ -67,7 +67,8 @@ static __always_inline u8 calc_dns_header_offset(pkt_info *pkt, void *data_end) static __always_inline int track_dns_packet(struct __sk_buff *skb, pkt_info *pkt) { void *data_end = (void *)(long)skb->data_end; - if (pkt->id->dst_port == DNS_PORT || pkt->id->src_port == DNS_PORT) { + if (pkt->id->dst_port == dns_port || pkt->id->src_port == dns_port || + pkt->id->dst_port == DNS_DEFAULT_PORT || pkt->id->src_port == DNS_DEFAULT_PORT) { dns_flow_id dns_req; u8 len = calc_dns_header_offset(pkt, data_end); diff --git a/bpf/flows_filter.h b/bpf/flows_filter.h index 3f4204148..2deee61e6 100644 --- a/bpf/flows_filter.h +++ b/bpf/flows_filter.h @@ -49,98 +49,96 @@ static __always_inline int do_flow_filter_lookup(flow_id *id, struct filter_key_ *action = rule->action; result++; } - - if (rule->protocol != 0) { - if (rule->protocol == id->transport_protocol) { - BPF_PRINTK("protocol matched\n"); - result++; - switch (rule->protocol) { - case IPPROTO_TCP: - case IPPROTO_UDP: - case IPPROTO_SCTP: - // dstPort matching - if (rule->dstPortStart != 0 && rule->dstPortEnd == 0) { - if (rule->dstPortStart == id->dst_port) { - BPF_PRINTK("dstPortStart matched\n"); - result++; - } else { - result = 0; - goto end; - } - } else if (rule->dstPortStart != 0 && rule->dstPortEnd != 0) { - if (rule->dstPortStart <= id->dst_port && - id->dst_port <= rule->dstPortEnd) { - BPF_PRINTK("dstPortStart and dstPortEnd matched\n"); - result++; - } else { - result = 0; - goto end; - } + // match specific rule protocol or use wildcard protocol + if (rule->protocol == id->transport_protocol || rule->protocol == 0) { + switch (id->transport_protocol) { + case IPPROTO_TCP: + case IPPROTO_UDP: + case IPPROTO_SCTP: + // dstPort matching + if ((rule->dstPortStart != 0 && rule->dstPortEnd == 0) || rule->dstPort1 != 0 || + rule->dstPort2 != 0) { + if (rule->dstPortStart == id->dst_port || rule->dstPort1 == id->dst_port || + rule->dstPort2 == id->dst_port) { + BPF_PRINTK("dstPort matched\n"); + result++; + } else { + result = 0; + goto end; } - // srcPort matching - if (rule->srcPortStart != 0 && rule->srcPortEnd == 0) { - if (rule->srcPortStart == id->src_port) { - BPF_PRINTK("srcPortStart matched\n"); - result++; - } else { - result = 0; - goto end; - } - } else if (rule->srcPortStart != 0 && rule->srcPortEnd != 0) { - if (rule->srcPortStart <= id->src_port && - id->src_port <= rule->srcPortEnd) { - BPF_PRINTK("srcPortStart and srcPortEnd matched\n"); - result++; - } else { - result = 0; - goto end; - } + } else if (rule->dstPortStart != 0 && rule->dstPortEnd != 0) { + if (rule->dstPortStart <= id->dst_port && id->dst_port <= rule->dstPortEnd) { + BPF_PRINTK("dstPortStart and dstPortEnd matched\n"); + result++; + } else { + result = 0; + goto end; } - // Generic port matching check for either src or dst port - if (rule->portStart != 0 && rule->portEnd == 0) { - if (rule->portStart == id->src_port || rule->portStart == id->dst_port) { - BPF_PRINTK("portStart matched\n"); - result++; - } else { - result = 0; - goto end; - } - } else if (rule->portStart != 0 && rule->portEnd != 0) { - if ((rule->portStart <= id->src_port && id->src_port <= rule->portEnd) || - (rule->portStart <= id->dst_port && id->dst_port <= rule->portEnd)) { - BPF_PRINTK("portStart and portEnd matched\n"); - result++; - } else { - result = 0; - goto end; - } + } + // srcPort matching + if ((rule->srcPortStart != 0 && rule->srcPortEnd == 0) || rule->srcPort1 != 0 || + rule->srcPort2 != 0) { + if (rule->srcPortStart == id->src_port || rule->srcPort1 == id->src_port || + rule->srcPort2 == id->src_port) { + BPF_PRINTK("srcPort matched\n"); + result++; + } else { + result = 0; + goto end; } - break; - case IPPROTO_ICMP: - case IPPROTO_ICMPV6: - if (rule->icmpType != 0) { - if (rule->icmpType == id->icmp_type) { - BPF_PRINTK("icmpType matched\n"); + } else if (rule->srcPortStart != 0 && rule->srcPortEnd != 0) { + if (rule->srcPortStart <= id->src_port && id->src_port <= rule->srcPortEnd) { + BPF_PRINTK("srcPortStart and srcPortEnd matched\n"); + result++; + } else { + result = 0; + goto end; + } + } + // Generic port matching check for either src or dst port + if ((rule->portStart != 0 && rule->portEnd == 0) || rule->port1 != 0 || + rule->port2 != 0) { + if (rule->portStart == id->src_port || rule->portStart == id->dst_port || + rule->port1 == id->src_port || rule->port1 == id->dst_port || + rule->port2 == id->src_port || rule->port2 == id->dst_port) { + BPF_PRINTK("port matched\n"); + result++; + } else { + result = 0; + goto end; + } + } else if (rule->portStart != 0 && rule->portEnd != 0) { + if ((rule->portStart <= id->src_port && id->src_port <= rule->portEnd) || + (rule->portStart <= id->dst_port && id->dst_port <= rule->portEnd)) { + BPF_PRINTK("portStart and portEnd matched\n"); + result++; + } else { + result = 0; + goto end; + } + } + break; + case IPPROTO_ICMP: + case IPPROTO_ICMPV6: + if (rule->icmpType != 0) { + if (rule->icmpType == id->icmp_type) { + BPF_PRINTK("icmpType matched\n"); + result++; + } else { + result = 0; + goto end; + } + if (rule->icmpCode != 0) { + if (rule->icmpCode == id->icmp_code) { + BPF_PRINTK("icmpCode matched\n"); result++; } else { result = 0; goto end; } - if (rule->icmpCode != 0) { - if (rule->icmpCode == id->icmp_code) { - BPF_PRINTK("icmpCode matched\n"); - result++; - } else { - result = 0; - goto end; - } - } } - break; } - } else { - result = 0; - goto end; + break; } } diff --git a/bpf/types.h b/bpf/types.h index c6df9b1e0..3f96244b0 100644 --- a/bpf/types.h +++ b/bpf/types.h @@ -208,10 +208,16 @@ struct filter_value_t { u8 protocol; u16 dstPortStart; u16 dstPortEnd; + u16 dstPort1; + u16 dstPort2; u16 srcPortStart; u16 srcPortEnd; + u16 srcPort1; + u16 srcPort2; u16 portStart; u16 portEnd; + u16 port1; + u16 port2; u8 icmpType; u8 icmpCode; direction direction; diff --git a/docs/flow_filtering.md b/docs/flow_filtering.md index 50ef5821d..18509efcc 100644 --- a/docs/flow_filtering.md +++ b/docs/flow_filtering.md @@ -24,10 +24,13 @@ Rule-base filtering is a method to control the flow of packets cached in the eBP - `FILTER_PROTOCOL` - Protocol of the flow filter rule. Possible values are `TCP`, `UDP`, `SCTP`, `ICMP`, `ICMPv6`. - `FILTER_SOURCE_PORT` - Single Source port of the flow filter rule. - `FILTER_SOURCE_PORT_RANGE` - Source port range of the flow filter rule. using "80-100" format. +- `FILTER_SOURCE_PORTS` - Source port two values of the flow filter rule. using "80,100" format. - `FILTER_DESTINATION_PORT` - Single Destination port of the flow filter rule. - `FILTER_DESTINATION_PORT_RANGE` - Destination port range of the flow filter rule. using "80-100" format. -- `FILTER_PORT` - Single L4 port of the flow filter rule, can be either source or destination port. -- `FILTER_PORT_RANGE` - L4 port range of the flow filter rule. using "80-100" format can be either source or destination ports range. +- `FILTER_DESTINATION_PORTS` - Destination port two values of the flow filter rule. using "80,100" format. +- `FILTER_PORT` - Single L4 port of the flow filter rule can be either source or destination port. +- `FILTER_PORT_RANGE` - L4 port range of the flow filter rule. using "80–100" format can be either a source or destination ports range. +- `FILTER_PORTS` - Two ports values of the flow filter rule. using "80,100" format can be either two ports for src or two ports for destination. - `FILTER_ICMP_TYPE` - ICMP type of the flow filter rule. - `FILTER_ICMP_CODE` - ICMP code of the flow filter rule. - `FILTER_PEER_IP` - Specific Peer IP address of the flow filter rule. diff --git a/go.mod b/go.mod index 3ac7584f3..1b7a74bca 100644 --- a/go.mod +++ b/go.mod @@ -24,7 +24,7 @@ require ( github.com/vladimirvivien/gexe v0.3.0 github.com/vmware/go-ipfix v0.9.0 golang.org/x/sys v0.21.0 - google.golang.org/grpc v1.63.2 + google.golang.org/grpc v1.65.0 google.golang.org/protobuf v1.34.2 gopkg.in/yaml.v2 v2.4.0 k8s.io/api v0.30.2 @@ -40,7 +40,7 @@ require ( github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect @@ -113,16 +113,15 @@ require ( go.opentelemetry.io/otel/trace v1.26.0 // indirect go.opentelemetry.io/proto/otlp v1.2.0 // indirect go.uber.org/atomic v1.9.0 // indirect - golang.org/x/crypto v0.22.0 // indirect + golang.org/x/crypto v0.23.0 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect - golang.org/x/net v0.24.0 // indirect - golang.org/x/oauth2 v0.18.0 // indirect - golang.org/x/term v0.19.0 // indirect - golang.org/x/text v0.14.0 // indirect + golang.org/x/net v0.25.0 // indirect + golang.org/x/oauth2 v0.20.0 // indirect + golang.org/x/term v0.20.0 // indirect + golang.org/x/text v0.15.0 // indirect golang.org/x/time v0.5.0 // indirect - google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240311132316-a219d84964c2 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240415180920-8c6c420018be // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index b14388e23..8cdd03621 100644 --- a/go.sum +++ b/go.sum @@ -129,8 +129,8 @@ github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyY github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -362,8 +362,6 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -951,8 +949,8 @@ golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1040,8 +1038,8 @@ golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= -golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1049,8 +1047,8 @@ golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4Iltr 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-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= -golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= +golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= +golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= 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= @@ -1066,8 +1064,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= -golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1152,8 +1150,8 @@ golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= -golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= +golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= 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/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1167,8 +1165,8 @@ golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 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= @@ -1281,8 +1279,6 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1317,10 +1313,10 @@ google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto/googleapis/api v0.0.0-20240311132316-a219d84964c2 h1:rIo7ocm2roD9DcFIX67Ym8icoGCKSARAiPljFhh5suQ= -google.golang.org/genproto/googleapis/api v0.0.0-20240311132316-a219d84964c2/go.mod h1:O1cOfN1Cy6QEYr7VxtjOyP5AdAuR0aJ/MYZaaof623Y= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240415180920-8c6c420018be h1:LG9vZxsWGOmUKieR8wPAUR3u3MpnYFQZROPIMaXh7/A= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240415180920-8c6c420018be/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157 h1:7whR9kGa5LUwFtpLm2ArCEejtnxlGeLbAyjFY8sGNFw= +google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157/go.mod h1:99sLkeliLXfdj2J75X3Ho+rrVCaJze0uwN7zDDkjPVU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 h1:Zy9XzmMEflZ/MAaA7vNcoebnRAld7FsPW1EeBB7V0m8= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -1340,8 +1336,8 @@ google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM= -google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= +google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= +google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= 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= @@ -1353,7 +1349,6 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/DATA-DOG/go-sqlmock.v1 v1.3.0 h1:FVCohIoYO7IJoDDVpV2pdq7SgrMH6wHnuTyrdrxJNoY= diff --git a/pkg/agent/agent.go b/pkg/agent/agent.go index d8e236711..72c4babcf 100644 --- a/pkg/agent/agent.go +++ b/pkg/agent/agent.go @@ -185,6 +185,7 @@ func FlowsAgent(cfg *Config) (*Flows, error) { CacheMaxSize: cfg.CacheMaxFlows, PktDrops: cfg.EnablePktDrops, DNSTracker: cfg.EnableDNSTracking, + DNSTrackerPort: cfg.DNSTrackingPort, EnableRTT: cfg.EnableRTT, EnableFlowFilter: cfg.EnableFlowFilter, FilterConfig: &ebpf.FilterConfig{ @@ -193,9 +194,9 @@ func FlowsAgent(cfg *Config) (*Flows, error) { FilterIPCIDR: cfg.FilterIPCIDR, FilterProtocol: cfg.FilterProtocol, FilterPeerIP: cfg.FilterPeerIP, - FilterDestinationPort: ebpf.ConvertFilterPortsToInstr(cfg.FilterDestinationPort, cfg.FilterDestinationPortRange), - FilterSourcePort: ebpf.ConvertFilterPortsToInstr(cfg.FilterSourcePort, cfg.FilterSourcePortRange), - FilterPort: ebpf.ConvertFilterPortsToInstr(cfg.FilterPort, cfg.FilterPortRange), + FilterDestinationPort: ebpf.ConvertFilterPortsToInstr(cfg.FilterDestinationPort, cfg.FilterDestinationPortRange, cfg.FilterDestinationPorts), + FilterSourcePort: ebpf.ConvertFilterPortsToInstr(cfg.FilterSourcePort, cfg.FilterSourcePortRange, cfg.FilterSourcePorts), + FilterPort: ebpf.ConvertFilterPortsToInstr(cfg.FilterPort, cfg.FilterPortRange, cfg.FilterPorts), }, } diff --git a/pkg/agent/config.go b/pkg/agent/config.go index 5793c259b..aec707a79 100644 --- a/pkg/agent/config.go +++ b/pkg/agent/config.go @@ -161,6 +161,9 @@ type Config struct { EnablePktDrops bool `env:"ENABLE_PKT_DROPS" envDefault:"false"` // EnableDNSTracking enable DNS tracking eBPF hook to track dns query/response flows EnableDNSTracking bool `env:"ENABLE_DNS_TRACKING" envDefault:"false"` + // DNSTrackingPort used to define which port the DNS service is mapped to at the pod level, + // so we can track DNS at the pod level + DNSTrackingPort uint16 `env:"DNS_TRACKING_PORT" envDefault:"53"` // StaleEntriesEvictTimeout specifies the maximum duration that stale entries are kept // before being deleted, default is 5 seconds. StaleEntriesEvictTimeout time.Duration `env:"STALE_ENTRIES_EVICT_TIMEOUT" envDefault:"5s"` @@ -199,12 +202,21 @@ type Config struct { // FilterSourcePortRange is the source port range to filter flows. // Example: 8000-8010 FilterSourcePortRange string `env:"FILTER_SOURCE_PORT_RANGE"` + // FilterSourcePorts is two source ports to filter flows. + // Example: 8000,8010 + FilterSourcePorts string `env:"FILTER_SOURCE_PORTS"` // FilterDestinationPortRange is the destination port range to filter flows. // Example: 8000-8010 FilterDestinationPortRange string `env:"FILTER_DESTINATION_PORT_RANGE"` + // FilterDestinationPorts is two destination ports to filter flows. + // Example: 8000,8010 + FilterDestinationPorts string `env:"FILTER_DESTINATION_PORTS"` // FilterPortRange is the port range to filter flows, can be used for either source or destination port. // Example: 8000-8010 FilterPortRange string `env:"FILTER_PORT_RANGE"` + // FilterPorts is two ports option to filter flows, can be used for either source or destination port. + // Example: 8000,8010 + FilterPorts string `env:"FILTER_PORTS"` // FilterICMPType is the ICMP type to filter flows. FilterICMPType int `env:"FILTER_ICMP_TYPE"` // FilterICMPCode is the ICMP code to filter flows. diff --git a/pkg/agent/packets_agent.go b/pkg/agent/packets_agent.go index 87e1ab033..1b1ad4b28 100644 --- a/pkg/agent/packets_agent.go +++ b/pkg/agent/packets_agent.go @@ -86,9 +86,9 @@ func PacketsAgent(cfg *Config) (*Packets, error) { FilterIPCIDR: cfg.FilterIPCIDR, FilterProtocol: cfg.FilterProtocol, FilterPeerIP: cfg.FilterPeerIP, - FilterDestinationPort: ebpf.ConvertFilterPortsToInstr(cfg.FilterDestinationPort, cfg.FilterDestinationPortRange), - FilterSourcePort: ebpf.ConvertFilterPortsToInstr(cfg.FilterSourcePort, cfg.FilterSourcePortRange), - FilterPort: ebpf.ConvertFilterPortsToInstr(cfg.FilterPort, cfg.FilterPortRange), + FilterDestinationPort: ebpf.ConvertFilterPortsToInstr(cfg.FilterDestinationPort, cfg.FilterDestinationPortRange, cfg.FilterDestinationPorts), + FilterSourcePort: ebpf.ConvertFilterPortsToInstr(cfg.FilterSourcePort, cfg.FilterSourcePortRange, cfg.FilterSourcePorts), + FilterPort: ebpf.ConvertFilterPortsToInstr(cfg.FilterPort, cfg.FilterPortRange, cfg.FilterPorts), }, } diff --git a/pkg/ebpf/bpf_arm64_bpfel.go b/pkg/ebpf/bpf_arm64_bpfel.go index e13c50b92..ecb509e7e 100644 --- a/pkg/ebpf/bpf_arm64_bpfel.go +++ b/pkg/ebpf/bpf_arm64_bpfel.go @@ -53,10 +53,16 @@ type BpfFilterValueT struct { Protocol uint8 DstPortStart uint16 DstPortEnd uint16 + DstPort1 uint16 + DstPort2 uint16 SrcPortStart uint16 SrcPortEnd uint16 + SrcPort1 uint16 + SrcPort2 uint16 PortStart uint16 PortEnd uint16 + Port1 uint16 + Port2 uint16 IcmpType uint8 IcmpCode uint8 Direction BpfDirectionT diff --git a/pkg/ebpf/bpf_arm64_bpfel.o b/pkg/ebpf/bpf_arm64_bpfel.o index 3141e95644865092590d028d5d562f4c2377c7ab..e188a8b9cebac2aeb66c41968c8493357cb62563 100644 GIT binary patch literal 125304 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%0D@{$34yD5S|p}J2qc44(6v&zF9s- zZ}t9{!Lj`Xlpp3_s6Wh4%0qa#M=oZr(b2sSAFjcXLw(^ITP)`q8ad=g=AE7Ltnm-A z21b=P4(5x-!Tqw>uZsP;@nc+*fodB63**dw@BdljtnpWkOITB3c?s=T(>R1@3Tqsc zhw^;ZIJ9pgShI-Rv%GOApJzmVQRIU;Z$IQm4tx^+{T$XLs7~d)|Dk>3oIY;PIH!-> zGtTMBE%)y3Y@f!ALwnQ^dE-E5dv)d>?|*2Y>c$~GrtbCW8{&J)IFzS;%+WrC@OxK|g>ATyZWA$}aQ$LYZ_dz>B|v&ZSdF*-SvuN1r<9NP12zLRst zA-&ECb4*S9p*`oAmgPUhpJP;Vh)+MpOmX|0GY)c&>Eia4W3;&a<(MmOPdUaS2m2gD z#qA}>OynT1dD_bLtPBSan5sSKc1&<7EZ0W)qr+x!{U;^_zKNhS1j=q!n=Yl~K z;%KJR&pWwk;_)%GRW#r4o^Ab?&HV!UwphK_%vV;&y7*RQ{tk*ePa_;F@E_Yas=9^i z%jSM|jn@zV{tntwhG!6MW~}}ceLVFu;_t&Q$?zRS!ufV{hx^fEwa45U6o0>O;Y>Dr z)0Hdz^E>ALDBA2;{f@blivF*{P*1YKos*;aL9?_YgkSROBW6Bl=C;_AkClmJ7W7_o zT5oda*dn9JH!S=`w7pcNxBDmm#VOr3*xUDFv&`8%I~85 zsC=nlWr6{Xs4rSLLp%#tdjk^|U!KE?)uP3h=e1(>ccx#KdciR$BZW_t9cpJt2Qhz# zxpPYNKWFAoi94r5x>>k`C%=fv>jt_?c=Ib`K3gZXf*{@&ut{oAoxVg7RcIaWBT4~6x?EwOHr{FQ}=`>bR2 zX3MYgwpbT;1BHAM^A!s}_bY#=1BMY3}51?$m!W_$&HHEgiUTGgj}k^i220y7x79Q>cjn!O8XE9%}@NnN|tp3j2;r_x{{i22EyqJH{+~NMgSZ%iS>ma zeeOex)p|>3?r)3L&zL^<#l`9^rqBIWvC4$0*UXhj870kE8yn6<+$7&(&+jj>`V$Ke zzthF)T^1gGPl?qJOg}IBvqAq*Y&uE)wS}MGkz)1dA^pYQDJ$pv4i&4XEu8$`qiQA6 zznfYatxE*?FC$;pVV)k;;Clad0gtuGRc=j~I)h$2`E8{0TDTu<0G;An+#T2rj|Mz%d_$y{Uxc?;toaRFggy$;fPG~K-66DoK@v;`>F!&puy(s6@4>=R` zKa3aZhZqF?zd?pjKQ(uQ{zIleDEcoWLNp(SIl=s>>4$O^^#8!cYh#iVcWyHMQPF?V z#do8-Ux}jNPKXcF@yqzbmJ_GQ&*QHeG3EVmhl=v&@E6uC0`tBUD)JxU&#z;6{$nuj zyP%@{EBG65?MIt=9|aZVU&0^nFQ5uM^7c0W8@!H1{CnVX#4mvB!eQNk?)?e=cs`yg zxIYy!-RJptD$418E#iL<=6QB1%4weG*QtW}h18*A#&=Pe=e4P5{?G82jreO|o`0sI z{6+ln{1;VV?spH&_!foxZG1rUl!tFjfy>svlbIge-$g}c`X|;82j>1MDl+5C{Zdq9 zrVsZ+Q3dnd4;7f^x&J9J&4+SG^DIww%m26Foq9Q24+#H!!LlHCo3lXz^Oh?T6$^BYXwEsu=I~nnxfy)uI z{d+p%uYmajYUmqyI=$qMI$^TGw;qHsyLEL;(;3fF||!VTf3Fs390&p6%X-l#h(>1;#4?{cY^tx$n(Ml;i7O!xGY=|t_s(L z>%tA;rm%~66kor-(oT<*5slLX5a}DsU>C70wBV{Q$v! zLF7f@l5knLB3u=&3D<=i!cE~YaSq|lV1CvSf8ngKUvF!tS6<`=;i7O!xGY=|t_s(L z>%tA;rf?X5x8iRD(!i;3RyZe|7cK~MZ)KdmCE>DgMYt+l6Rrz4gqy%Ar;ev2cxFlQ_t_W9!Yr=KmhHz6jED(kK&TwJ^6*v{n3g?9L!Uf@?a7nl{j$g_!d2m#a9y||+!PL5mxBKpTTcs| z3iCeEI6ZR0dEtU^QMe>r7On_ag=@lf;f8QiII;Dg5Z{b&Dx4M03Fn0i!bRbda9Ow_ zTotYf*M%FxP2sR$-HLyvGk?Q+SdeE$o)gXs7lez#CE>DgMYt+l6Rrz4gqy-xRPQLy zypNSC#5Wbr3g?7*A8TyCAY2qK373T{!d2m#a9y||+!PL%tA;rf_2Gw;{e^eLiq1@~klLpN;c7FI*5V3YUb-!WH4Fa80-_ z+z@UGhpmJmzWlwAI6kRxRyZe|7cK}Fg-gO^;fiooxF%c|ZU{Gplgm5fn-NZhv%)#y zyl_FdC|nXQ3s;1z!ZqQ#a6`B$9JY+M^8bp?^hkxX!a3o*a6z~zToNt|SA?s=HQ~B& zL%1oNyrVO|8R1koE1VO~3m1fo!X@Fda7DN(TobMfH-wwQ;lp$*|2b%f3Y-dOg>%Ar z;ev2cxFlQ_t_W9!Yr=KmhHz6jxw1398R1koE1VO~3m1fo!X@Fda7DN(TobMfH-wwQ z*!tj9$nT7BDx4M03Fn0i!bRbda9Ow_TotYf*M%FxO<^~wjLLh4lgx-y;jC~@I4@if zE((`~%fc1ms&GxXF5D1q3MZR7W6^Q#iRs;xC*EXN7aZdEtU^QMe>r7On_ag=@lf;f8Qi zI7ub`!l`gpI47JJE(jNeOTuO0if~o9CR`V82seep`O8o~Gn*5q0;j@Z|5cFZL>|sl z1$jZ_Md6ZgS-2ux6|M=_g&V?6;pE!R_-2Gt;jC~t4;JFfd!DEQ7lez#CE>DgMYt+l z6Rrz4gqy<2b)DhO2&ckX;hb<@xFB20&Bwn+SiQ{k*|PB`Z-!Uf@QZZNo45_ws; zB3u=&3D<=i!cF1i28q9LD$L(!p$g&83Fn2wdB|YCDDskUS-2ux6|M=_g&V?6;c)&k zgfDYrXZ%v(tZ+^^FI*5V3YUb-!WH4Fa80-_+z@UGhYhQ(_zz0_h57q1RKa{sI4@if z=I_PC_DjNL;fiooxF%c|ZU{GpldYZM$q1*yS>c>;UbrA!6fOyug)72U;hJz=xFOsW zPPR$>g;U|Ia85WcTo5h_mxRN4?ohreBCiV9gzLf$;ihnMlf+**oDUA+;qTp01k!_o$aBJZ;ev2cxFlQ_t_W9!Yr=KmhHz8ZT^NWY z2=UA8>`aeTI4hhJ&I=cWi^3)0vT#MXDqIt;3pa$D!pY5@@y!UQ!u)+Cs*qkeVg6oH zEH4Nbg-gO^;fiooxF%c|ZU{Gp!-298pG>wh{HbtOI47JJE(jNeOTuO0if~o9CR`V8 z2sefKdrWbDWrX?rOR+pFoD&ZBTZHs1h`cCV5-tl@gsZ|e;ks}`xG9|M>Wp7TINY}o z;*%A5PB<@I5H1Rrgv-Je;i_;=xGvlfZVD&6CH}&xa8@`coEI(#7llj0W#Ni&Rk$Wx z7j6hQg_B{4zc7DqimH|W!a3o*a6z~zToNt|SA?s=HQ~B&L%1oN?CFeOMmQDD3g?9L z!Uf@?a7nlt!g=9>a8bAB;gWD!xFTE?t_jzL8^TTDa3MhmZ@9-Ra5~Z% zpKzWy$a5mk3m1gL`Qu=}B=WLwxKD-Vx8RSzw?!4W9x<1;8p0PN=F(69Ewt_JlhcT~ zG?En_jrb18$ApU!=O8Z$pNaTR$j=JD5b+AgUlM**_%-3)TVV-`=|TJJg|`R~3m*_Z zBs?KJFMLw?wD2>+&k4UE{F3mi!mkPUzLT+!;xD{Kcv$#=@FC#|;d$Yc!l#9w5q?hi z1>u*3Ulo2$xOczAUwDh~uEPYXXA@kRvodEu8L=J$bDggy)4% z3ZE8!M)*157ldCDepUE2;a)bvP;Bp9{tIsr9u__zd`NggcwYFV@M+;^gr5_BLHH%% zSA|~_?#(gwQT%fbTj{Yycv$#=@FC#|;d$Yc!l#9w5q?hi1>u*3Ulo2$xR;$MR4f05 zw+Igl9}qqyJRv+Ud{X$d@H4`H*z?CdU+H>kl7kke4)O%_@|GwwzJ>Tegx#x<3XL^3KXW#zYllddX@!2Dfk3TYbe17(c zWasSU^v?Oog?ayW*P(lN5+;uyet3Fve0F|5nK(W-UYwboPXOc7Gc%8!D2^XKJ~4ix zIB|G>a{Q6$nUC)rhkE4Ld{TUDetcqfruatYXleY|%<-f1GqWwr^RtJKOpXU9TG~er zPaiok9lTc;e{nX1e)Q4V$wy&p!bFVd{E>z6qsJkbn{&~f zKO(p=UOaMG^txy*j8Aqr(m~#h4lU^L0trl*IG9)DyeIWjeQ z?&K*8hoQ{mJJTQEZQE%t;^yA0I4^K?Y&K-ReWvi9G z-u>d?*||w*ha~OP4awN4YiZl5*>;y1w8Yt1v*l{6860ivjZYsvGI`vE&R2-XinB8h zPbNjg4EcaUH8VTmN{O#2H;0NdIX92Gadd8K(u=*luHwlBRvZM^IaxgX#PrNzZ^>nF zapvgp`J3k+d-&$Z9+{n-9LHO-b8dbX?&JByG54IEK{Y!Z@(1B>Rn+9f@e^~C6SpJ> z@49Pf@3?>N_Rnk^gZ|#|GSqt8)6yDtZ?}x^4mz!uq4wJ@Gc@E4?Hjk3J>g}yy=3|H zp&N0b+c)l?d+oW$KZgwwXfNMAJ`!H`g_oh$+uoqH$GzM#J{&Y!FGK$AmhoLql(pv& zLgsab5NdA=p*Az70W-5a>+c@l8(xOmZ+n~`!WU$%mm&X# zgbpJAf&hCB1TRSZ3(|65a^bC~2#0$zDe>lWcaQU8@3?>NZar@a8YAIlZ+IEn(|Q{YZ@b+K(jaK~ zms`e%yap1*zaY>2%W!yMX!clWh8ddSarYRq=PpD4$QmL4yeXuTdqG~=b9WH5UUmhY zA$x=8Ev?o|cGyC(o1s7|x}@1>Pn2-4ff62G_JxhNGy=2FC2aO^BhNLlxf4cJQ z%^+<|gs0DyT|OP$1L@$OyIaqpeL-hWco}NF4Y#!X8^YprP?Nj_S+J|4Lkd0d&RypH zkc&BD99~Ak%h0~?wl};C`8TA0OUJ(<1)UB8(2}&?cA3aOS*KfO+Al-hgE?fu%vvz_ zg_oh$+uoqHC%g=`--d(UZuf$O2^vHG4aL^$AXsL^G+0>eQ;{EV{+R#rejfb4ME&QN zdz{`US9OZKZd-3XUa9w{ww8O#85e${Q_$auNd`sTrjIOygib#Q%Y1{Lg;WTYMw`-@A^BF8;HvQ~!Sey>9WJy2SMVudv^( z{Ev3=|B5dD-@Q!y%a`c?9m~Xjtc(8xUHs>LZj8S*(|GghocZ5JVWilG#_FF!&NPKH z9jZ3%ajZkPo&G`lE$07n_SHWLPV&pppq|=aH2)WaNA?W)AGE(}{s#`v@-hE*{%b+U zKQ%mGf&FgzKNZqH>i@2W6T$yb{;8*NqEAz|c-`mjB(;_LzX76d{xAGXZ$D@DuYekC34bkh&c+Y+IiRKQU2S1<7V+1zLuvX6Z*q*44vO?e{00A67ODO} D0L|rZ literal 119640 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

I1HkavXb{`Z0EM=sObbHKB0+ksquN=R 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

2VOrS0n4fAl!*TMc>9_GP`??4tlRuI|=4< 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

Xs!e)siuEsF9MO_Zw&r1; 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 auVshQ3I50{)Rgt#q%Y#n{byOE`hNl6MB^p^ literal 118872 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 diff --git a/pkg/ebpf/bpf_s390_bpfeb.go b/pkg/ebpf/bpf_s390_bpfeb.go index fef364a8c..92dd6c4ad 100644 --- a/pkg/ebpf/bpf_s390_bpfeb.go +++ b/pkg/ebpf/bpf_s390_bpfeb.go @@ -53,10 +53,16 @@ type BpfFilterValueT struct { Protocol uint8 DstPortStart uint16 DstPortEnd uint16 + DstPort1 uint16 + DstPort2 uint16 SrcPortStart uint16 SrcPortEnd uint16 + SrcPort1 uint16 + SrcPort2 uint16 PortStart uint16 PortEnd uint16 + Port1 uint16 + Port2 uint16 IcmpType uint8 IcmpCode uint8 Direction BpfDirectionT diff --git a/pkg/ebpf/bpf_s390_bpfeb.o b/pkg/ebpf/bpf_s390_bpfeb.o index ee345e6374f88487fcd8de8fa1581d7887e7282d..f116bfe59de2bb9743a6dd122357597612d9cf86 100644 GIT binary patch literal 140400 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 TN2^cmzR#gWpHFNL$G`XwrC-s= literal 134736 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ÿybM=fwHKh*&>2^qB* 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 Z-h6|&dw!JeY3%3E$3L#QD-A8b{|~q4QCt83 diff --git a/pkg/ebpf/bpf_x86_bpfel.go b/pkg/ebpf/bpf_x86_bpfel.go index 30f26cf98..cbef91b4c 100644 --- a/pkg/ebpf/bpf_x86_bpfel.go +++ b/pkg/ebpf/bpf_x86_bpfel.go @@ -53,10 +53,16 @@ type BpfFilterValueT struct { Protocol uint8 DstPortStart uint16 DstPortEnd uint16 + DstPort1 uint16 + DstPort2 uint16 SrcPortStart uint16 SrcPortEnd uint16 + SrcPort1 uint16 + SrcPort2 uint16 PortStart uint16 PortEnd uint16 + Port1 uint16 + Port2 uint16 IcmpType uint8 IcmpCode uint8 Direction BpfDirectionT diff --git a/pkg/ebpf/bpf_x86_bpfel.o b/pkg/ebpf/bpf_x86_bpfel.o index 618488d29577f13039992d61774fc2e62a3845d0..22fe778e99d008fbfef53a36938223d58aeed0a3 100644 GIT binary patch literal 125112 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

^IqTu5S>Xxd;0$ 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 QD;*T+_wnccvn*2mzuCPxiU0rr literal 119440 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 d endPort { + if sep == "-" && startPort > endPort { return 0, 0, fmt.Errorf("invalid port range. Start port is greater than end port") } if startPort == endPort { - return 0, 0, fmt.Errorf("invalid port range. Start and end port are equal. Remove the hyphen and enter a single port") + return 0, 0, fmt.Errorf("invalid port range. Start and end port are equal. Remove the %s and enter a single port", sep) } if startPort == 0 { return 0, 0, fmt.Errorf("invalid start port 0") @@ -193,9 +213,12 @@ func getPortsFromString(s string) (uint16, uint16, error) { return uint16(startPort), uint16(endPort), nil } -func ConvertFilterPortsToInstr(intPort int32, rangePorts string) intstr.IntOrString { - if rangePorts == "" { - return intstr.FromInt32(intPort) +func ConvertFilterPortsToInstr(intPort int32, rangePorts, ports string) intstr.IntOrString { + if rangePorts != "" { + return intstr.FromString(rangePorts) + } + if ports != "" { + return intstr.FromString(ports) } - return intstr.FromString(rangePorts) + return intstr.FromInt32(intPort) } diff --git a/pkg/ebpf/flow_filter_test.go b/pkg/ebpf/flow_filter_test.go index a8f673d80..dd4561d29 100644 --- a/pkg/ebpf/flow_filter_test.go +++ b/pkg/ebpf/flow_filter_test.go @@ -13,31 +13,31 @@ import ( func TestGetPortsFromString(t *testing.T) { testCases := []struct { - input string + portsRange string expectedStart uint16 expectedEnd uint16 expectedError error }{ { - input: "80-90", + portsRange: "80-90", expectedStart: 80, expectedEnd: 90, expectedError: nil, }, { - input: "90-80", + portsRange: "90-80", expectedStart: 0, expectedEnd: 0, expectedError: fmt.Errorf("invalid port range. Start port is greater than end port"), }, { - input: "80", + portsRange: "80", expectedStart: 0, expectedEnd: 0, - expectedError: fmt.Errorf("invalid ports range. Expected two integers separated by hyphen but found 80"), + expectedError: fmt.Errorf("invalid ports range. Expected two integers separated by - but found 80"), }, { - input: "80000-8080", + portsRange: "80000-8080", expectedStart: 0, expectedEnd: 0, expectedError: fmt.Errorf("invalid start port number strconv.ParseUint: parsing \"80000\": value out of range"), @@ -45,7 +45,7 @@ func TestGetPortsFromString(t *testing.T) { } for _, tc := range testCases { - start, end, err := getPortsFromString(tc.input) + start, end, err := getPortsFromString(tc.portsRange, "-") if tc.expectedError != nil { require.Error(t, err) require.Equal(t, tc.expectedError.Error(), err.Error()) @@ -79,6 +79,7 @@ func TestFilter_getFlowFilterValue(t *testing.T) { FilterProtocol: "TCP", FilterSourcePort: intstr.FromInt32(8080), FilterDestinationPort: intstr.FromString("8000-9000"), + FilterPort: intstr.FromString("3000,4000"), } value, err := f.getFilterValue(config) @@ -90,40 +91,66 @@ func TestFilter_getFlowFilterValue(t *testing.T) { assert.Equal(t, uint16(0), value.SrcPortEnd) assert.Equal(t, uint16(8000), value.DstPortStart) assert.Equal(t, uint16(9000), value.DstPortEnd) + assert.Equal(t, uint16(3000), value.Port1) + assert.Equal(t, uint16(4000), value.Port2) } -func TestGetSrcPorts(t *testing.T) { +func TestGetSrcPortsRange(t *testing.T) { config := &FilterConfig{ FilterSourcePort: intstr.FromString("8000-9000"), } - start, end := getSrcPorts(config) + start, end := getSrcPortsRange(config) assert.Equal(t, uint16(8000), start) assert.Equal(t, uint16(9000), end) } -func TestGetDstPorts(t *testing.T) { +func TestGetSrcPorts(t *testing.T) { + config := &FilterConfig{ + FilterSourcePort: intstr.FromString("8000,9000"), + } + p1, p2 := getSrcPorts(config) + + assert.Equal(t, uint16(8000), p1) + assert.Equal(t, uint16(9000), p2) +} + +func TestGetDstPortsRange(t *testing.T) { config := &FilterConfig{ FilterDestinationPort: intstr.FromInt32(8080), } - start, end := getDstPorts(config) + start, end := getDstPortsRange(config) assert.Equal(t, uint16(8080), start) assert.Equal(t, uint16(0), end) } +func TestGetDstPorts(t *testing.T) { + config := &FilterConfig{ + FilterDestinationPort: intstr.FromString("8080,9000"), + } + p1, p2 := getDstPorts(config) + + assert.Equal(t, uint16(8080), p1) + assert.Equal(t, uint16(9000), p2) +} + func TestConvertFilterPortsToInstr(t *testing.T) { t.Run("converts int port", func(t *testing.T) { port := int32(80) - result := ConvertFilterPortsToInstr(port, "") + result := ConvertFilterPortsToInstr(port, "", "") require.Equal(t, intstr.FromInt32(port), result) }) t.Run("converts string range", func(t *testing.T) { rangeStr := "80-90" - result := ConvertFilterPortsToInstr(0, rangeStr) + result := ConvertFilterPortsToInstr(0, rangeStr, "") require.Equal(t, intstr.FromString(rangeStr), result) }) - + t.Run("converts string ports", func(t *testing.T) { + portsStr := "80,90" + result := ConvertFilterPortsToInstr(0, "", portsStr) + require.Equal(t, intstr.FromString(portsStr), result) + }) } diff --git a/pkg/ebpf/tracer.go b/pkg/ebpf/tracer.go index a2598c431..6eb301ed6 100644 --- a/pkg/ebpf/tracer.go +++ b/pkg/ebpf/tracer.go @@ -39,6 +39,8 @@ const ( constTraceMessages = "trace_messages" constEnableRtt = "enable_rtt" constEnableDNSTracking = "enable_dns_tracking" + constDNSTrackingPort = "dns_port" + dnsDefaultPort = 53 constEnableFlowFiltering = "enable_flows_filtering" pktDropHook = "kfree_skb" constPcaEnable = "enable_pca" @@ -79,12 +81,14 @@ type FlowFetcherConfig struct { CacheMaxSize int PktDrops bool DNSTracker bool + DNSTrackerPort uint16 EnableRTT bool EnableFlowFilter bool EnablePCA bool FilterConfig *FilterConfig } +// nolint:cyclop func NewFlowFetcher(cfg *FlowFetcherConfig) (*FlowFetcher, error) { if err := rlimit.RemoveMemlock(); err != nil { log.WithError(err). @@ -110,8 +114,12 @@ func NewFlowFetcher(cfg *FlowFetcherConfig) (*FlowFetcher, error) { } enableDNSTracking := 0 + dnsTrackerPort := uint16(dnsDefaultPort) if cfg.DNSTracker { enableDNSTracking = 1 + if cfg.DNSTrackerPort != 0 { + dnsTrackerPort = cfg.DNSTrackerPort + } } if enableDNSTracking == 0 { @@ -128,6 +136,7 @@ func NewFlowFetcher(cfg *FlowFetcherConfig) (*FlowFetcher, error) { constTraceMessages: uint8(traceMsgs), constEnableRtt: uint8(enableRtt), constEnableDNSTracking: uint8(enableDNSTracking), + constDNSTrackingPort: dnsTrackerPort, constEnableFlowFiltering: uint8(enableFlowFiltering), }); err != nil { return nil, fmt.Errorf("rewriting BPF constants definition: %w", err) diff --git a/pkg/pbflow/flow_grpc.pb.go b/pkg/pbflow/flow_grpc.pb.go index f9a4eb466..ac00dda6d 100644 --- a/pkg/pbflow/flow_grpc.pb.go +++ b/pkg/pbflow/flow_grpc.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.4.0 +// - protoc-gen-go-grpc v1.5.1 // - protoc v3.19.4 // source: proto/flow.proto @@ -15,8 +15,8 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.62.0 or later. -const _ = grpc.SupportPackageIsVersion8 +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 const ( Collector_Send_FullMethodName = "/pbflow.Collector/Send" @@ -49,20 +49,24 @@ func (c *collectorClient) Send(ctx context.Context, in *Records, opts ...grpc.Ca // CollectorServer is the server API for Collector service. // All implementations must embed UnimplementedCollectorServer -// for forward compatibility +// for forward compatibility. type CollectorServer interface { Send(context.Context, *Records) (*CollectorReply, error) mustEmbedUnimplementedCollectorServer() } -// UnimplementedCollectorServer must be embedded to have forward compatible implementations. -type UnimplementedCollectorServer struct { -} +// UnimplementedCollectorServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedCollectorServer struct{} func (UnimplementedCollectorServer) Send(context.Context, *Records) (*CollectorReply, error) { return nil, status.Errorf(codes.Unimplemented, "method Send not implemented") } func (UnimplementedCollectorServer) mustEmbedUnimplementedCollectorServer() {} +func (UnimplementedCollectorServer) testEmbeddedByValue() {} // UnsafeCollectorServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to CollectorServer will @@ -72,6 +76,13 @@ type UnsafeCollectorServer interface { } func RegisterCollectorServer(s grpc.ServiceRegistrar, srv CollectorServer) { + // If the following call pancis, it indicates UnimplementedCollectorServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } s.RegisterService(&Collector_ServiceDesc, srv) } diff --git a/pkg/pbpacket/packet_grpc.pb.go b/pkg/pbpacket/packet_grpc.pb.go index 5aa9685d9..fce168986 100644 --- a/pkg/pbpacket/packet_grpc.pb.go +++ b/pkg/pbpacket/packet_grpc.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.4.0 +// - protoc-gen-go-grpc v1.5.1 // - protoc v3.19.4 // source: proto/packet.proto @@ -15,8 +15,8 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.62.0 or later. -const _ = grpc.SupportPackageIsVersion8 +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 const ( Collector_Send_FullMethodName = "/pbpacket.Collector/Send" @@ -49,20 +49,24 @@ func (c *collectorClient) Send(ctx context.Context, in *Packet, opts ...grpc.Cal // CollectorServer is the server API for Collector service. // All implementations must embed UnimplementedCollectorServer -// for forward compatibility +// for forward compatibility. type CollectorServer interface { Send(context.Context, *Packet) (*CollectorReply, error) mustEmbedUnimplementedCollectorServer() } -// UnimplementedCollectorServer must be embedded to have forward compatible implementations. -type UnimplementedCollectorServer struct { -} +// UnimplementedCollectorServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedCollectorServer struct{} func (UnimplementedCollectorServer) Send(context.Context, *Packet) (*CollectorReply, error) { return nil, status.Errorf(codes.Unimplemented, "method Send not implemented") } func (UnimplementedCollectorServer) mustEmbedUnimplementedCollectorServer() {} +func (UnimplementedCollectorServer) testEmbeddedByValue() {} // UnsafeCollectorServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to CollectorServer will @@ -72,6 +76,13 @@ type UnsafeCollectorServer interface { } func RegisterCollectorServer(s grpc.ServiceRegistrar, srv CollectorServer) { + // If the following call pancis, it indicates UnimplementedCollectorServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } s.RegisterService(&Collector_ServiceDesc, srv) } diff --git a/vendor/github.com/cespare/xxhash/v2/README.md b/vendor/github.com/cespare/xxhash/v2/README.md index 8bf0e5b78..33c88305c 100644 --- a/vendor/github.com/cespare/xxhash/v2/README.md +++ b/vendor/github.com/cespare/xxhash/v2/README.md @@ -70,3 +70,5 @@ benchstat <(go test -benchtime 500ms -count 15 -bench 'Sum64$') - [VictoriaMetrics](https://github.com/VictoriaMetrics/VictoriaMetrics) - [FreeCache](https://github.com/coocood/freecache) - [FastCache](https://github.com/VictoriaMetrics/fastcache) +- [Ristretto](https://github.com/dgraph-io/ristretto) +- [Badger](https://github.com/dgraph-io/badger) diff --git a/vendor/github.com/cespare/xxhash/v2/xxhash.go b/vendor/github.com/cespare/xxhash/v2/xxhash.go index a9e0d45c9..78bddf1ce 100644 --- a/vendor/github.com/cespare/xxhash/v2/xxhash.go +++ b/vendor/github.com/cespare/xxhash/v2/xxhash.go @@ -19,10 +19,13 @@ const ( // Store the primes in an array as well. // // The consts are used when possible in Go code to avoid MOVs but we need a -// contiguous array of the assembly code. +// contiguous array for the assembly code. var primes = [...]uint64{prime1, prime2, prime3, prime4, prime5} // Digest implements hash.Hash64. +// +// Note that a zero-valued Digest is not ready to receive writes. +// Call Reset or create a Digest using New before calling other methods. type Digest struct { v1 uint64 v2 uint64 @@ -33,19 +36,31 @@ type Digest struct { n int // how much of mem is used } -// New creates a new Digest that computes the 64-bit xxHash algorithm. +// New creates a new Digest with a zero seed. func New() *Digest { + return NewWithSeed(0) +} + +// NewWithSeed creates a new Digest with the given seed. +func NewWithSeed(seed uint64) *Digest { var d Digest - d.Reset() + d.ResetWithSeed(seed) return &d } // Reset clears the Digest's state so that it can be reused. +// It uses a seed value of zero. func (d *Digest) Reset() { - d.v1 = primes[0] + prime2 - d.v2 = prime2 - d.v3 = 0 - d.v4 = -primes[0] + d.ResetWithSeed(0) +} + +// ResetWithSeed clears the Digest's state so that it can be reused. +// It uses the given seed to initialize the state. +func (d *Digest) ResetWithSeed(seed uint64) { + d.v1 = seed + prime1 + prime2 + d.v2 = seed + prime2 + d.v3 = seed + d.v4 = seed - prime1 d.total = 0 d.n = 0 } diff --git a/vendor/github.com/cespare/xxhash/v2/xxhash_asm.go b/vendor/github.com/cespare/xxhash/v2/xxhash_asm.go index 9216e0a40..78f95f256 100644 --- a/vendor/github.com/cespare/xxhash/v2/xxhash_asm.go +++ b/vendor/github.com/cespare/xxhash/v2/xxhash_asm.go @@ -6,7 +6,7 @@ package xxhash -// Sum64 computes the 64-bit xxHash digest of b. +// Sum64 computes the 64-bit xxHash digest of b with a zero seed. // //go:noescape func Sum64(b []byte) uint64 diff --git a/vendor/github.com/cespare/xxhash/v2/xxhash_other.go b/vendor/github.com/cespare/xxhash/v2/xxhash_other.go index 26df13bba..118e49e81 100644 --- a/vendor/github.com/cespare/xxhash/v2/xxhash_other.go +++ b/vendor/github.com/cespare/xxhash/v2/xxhash_other.go @@ -3,7 +3,7 @@ package xxhash -// Sum64 computes the 64-bit xxHash digest of b. +// Sum64 computes the 64-bit xxHash digest of b with a zero seed. func Sum64(b []byte) uint64 { // A simpler version would be // d := New() diff --git a/vendor/github.com/cespare/xxhash/v2/xxhash_safe.go b/vendor/github.com/cespare/xxhash/v2/xxhash_safe.go index e86f1b5fd..05f5e7dfe 100644 --- a/vendor/github.com/cespare/xxhash/v2/xxhash_safe.go +++ b/vendor/github.com/cespare/xxhash/v2/xxhash_safe.go @@ -5,7 +5,7 @@ package xxhash -// Sum64String computes the 64-bit xxHash digest of s. +// Sum64String computes the 64-bit xxHash digest of s with a zero seed. func Sum64String(s string) uint64 { return Sum64([]byte(s)) } diff --git a/vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go b/vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go index 1c1638fd8..cf9d42aed 100644 --- a/vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go +++ b/vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go @@ -33,7 +33,7 @@ import ( // // See https://github.com/golang/go/issues/42739 for discussion. -// Sum64String computes the 64-bit xxHash digest of s. +// Sum64String computes the 64-bit xxHash digest of s with a zero seed. // It may be faster than Sum64([]byte(s)) by avoiding a copy. func Sum64String(s string) uint64 { b := *(*[]byte)(unsafe.Pointer(&sliceHeader{s, len(s)})) diff --git a/vendor/golang.org/x/net/html/doc.go b/vendor/golang.org/x/net/html/doc.go index 2466ae3d9..3a7e5ab17 100644 --- a/vendor/golang.org/x/net/html/doc.go +++ b/vendor/golang.org/x/net/html/doc.go @@ -104,7 +104,7 @@ tokenization, and tokenization and tree construction stages of the WHATWG HTML parsing specification respectively. While the tokenizer parses and normalizes individual HTML tokens, only the parser constructs the DOM tree from the tokenized HTML, as described in the tree construction stage of the -specification, dynamically modifying or extending the docuemnt's DOM tree. +specification, dynamically modifying or extending the document's DOM tree. If your use case requires semantically well-formed HTML documents, as defined by the WHATWG specification, the parser should be used rather than the tokenizer. diff --git a/vendor/golang.org/x/net/http/httpguts/httplex.go b/vendor/golang.org/x/net/http/httpguts/httplex.go index 6e071e852..9b4de9401 100644 --- a/vendor/golang.org/x/net/http/httpguts/httplex.go +++ b/vendor/golang.org/x/net/http/httpguts/httplex.go @@ -12,7 +12,7 @@ import ( "golang.org/x/net/idna" ) -var isTokenTable = [127]bool{ +var isTokenTable = [256]bool{ '!': true, '#': true, '$': true, @@ -93,12 +93,7 @@ var isTokenTable = [127]bool{ } func IsTokenRune(r rune) bool { - i := int(r) - return i < len(isTokenTable) && isTokenTable[i] -} - -func isNotToken(r rune) bool { - return !IsTokenRune(r) + return r < utf8.RuneSelf && isTokenTable[byte(r)] } // HeaderValuesContainsToken reports whether any string in values @@ -202,8 +197,8 @@ func ValidHeaderFieldName(v string) bool { if len(v) == 0 { return false } - for _, r := range v { - if !IsTokenRune(r) { + for i := 0; i < len(v); i++ { + if !isTokenTable[v[i]] { return false } } diff --git a/vendor/golang.org/x/net/http2/frame.go b/vendor/golang.org/x/net/http2/frame.go index 43557ab7e..105c3b279 100644 --- a/vendor/golang.org/x/net/http2/frame.go +++ b/vendor/golang.org/x/net/http2/frame.go @@ -490,6 +490,9 @@ func terminalReadFrameError(err error) bool { // returned error is ErrFrameTooLarge. Other errors may be of type // ConnectionError, StreamError, or anything else from the underlying // reader. +// +// If ReadFrame returns an error and a non-nil Frame, the Frame's StreamID +// indicates the stream responsible for the error. func (fr *Framer) ReadFrame() (Frame, error) { fr.errDetail = nil if fr.lastFrame != nil { @@ -1521,7 +1524,7 @@ func (fr *Framer) maxHeaderStringLen() int { // readMetaFrame returns 0 or more CONTINUATION frames from fr and // merge them into the provided hf and returns a MetaHeadersFrame // with the decoded hpack values. -func (fr *Framer) readMetaFrame(hf *HeadersFrame) (*MetaHeadersFrame, error) { +func (fr *Framer) readMetaFrame(hf *HeadersFrame) (Frame, error) { if fr.AllowIllegalReads { return nil, errors.New("illegal use of AllowIllegalReads with ReadMetaHeaders") } @@ -1592,7 +1595,7 @@ func (fr *Framer) readMetaFrame(hf *HeadersFrame) (*MetaHeadersFrame, error) { } // It would be nice to send a RST_STREAM before sending the GOAWAY, // but the structure of the server's frame writer makes this difficult. - return nil, ConnectionError(ErrCodeProtocol) + return mh, ConnectionError(ErrCodeProtocol) } // Also close the connection after any CONTINUATION frame following an @@ -1604,11 +1607,11 @@ func (fr *Framer) readMetaFrame(hf *HeadersFrame) (*MetaHeadersFrame, error) { } // It would be nice to send a RST_STREAM before sending the GOAWAY, // but the structure of the server's frame writer makes this difficult. - return nil, ConnectionError(ErrCodeProtocol) + return mh, ConnectionError(ErrCodeProtocol) } if _, err := hdec.Write(frag); err != nil { - return nil, ConnectionError(ErrCodeCompression) + return mh, ConnectionError(ErrCodeCompression) } if hc.HeadersEnded() { @@ -1625,7 +1628,7 @@ func (fr *Framer) readMetaFrame(hf *HeadersFrame) (*MetaHeadersFrame, error) { mh.HeadersFrame.invalidate() if err := hdec.Close(); err != nil { - return nil, ConnectionError(ErrCodeCompression) + return mh, ConnectionError(ErrCodeCompression) } if invalid != nil { fr.errDetail = invalid diff --git a/vendor/golang.org/x/net/http2/server.go b/vendor/golang.org/x/net/http2/server.go index ce2e8b40e..c5d081081 100644 --- a/vendor/golang.org/x/net/http2/server.go +++ b/vendor/golang.org/x/net/http2/server.go @@ -732,11 +732,7 @@ func isClosedConnError(err error) bool { return false } - // TODO: remove this string search and be more like the Windows - // case below. That might involve modifying the standard library - // to return better error types. - str := err.Error() - if strings.Contains(str, "use of closed network connection") { + if errors.Is(err, net.ErrClosed) { return true } @@ -1482,6 +1478,11 @@ func (sc *serverConn) processFrameFromReader(res readFrameResult) bool { sc.goAway(ErrCodeFlowControl) return true case ConnectionError: + if res.f != nil { + if id := res.f.Header().StreamID; id > sc.maxClientStreamID { + sc.maxClientStreamID = id + } + } sc.logf("http2: server connection error from %v: %v", sc.conn.RemoteAddr(), ev) sc.goAway(ErrCode(ev)) return true // goAway will handle shutdown diff --git a/vendor/golang.org/x/net/http2/transport.go b/vendor/golang.org/x/net/http2/transport.go index ce375c8c7..2fa49490c 100644 --- a/vendor/golang.org/x/net/http2/transport.go +++ b/vendor/golang.org/x/net/http2/transport.go @@ -936,7 +936,20 @@ func (cc *ClientConn) setGoAway(f *GoAwayFrame) { } last := f.LastStreamID for streamID, cs := range cc.streams { - if streamID > last { + if streamID <= last { + // The server's GOAWAY indicates that it received this stream. + // It will either finish processing it, or close the connection + // without doing so. Either way, leave the stream alone for now. + continue + } + if streamID == 1 && cc.goAway.ErrCode != ErrCodeNo { + // Don't retry the first stream on a connection if we get a non-NO error. + // If the server is sending an error on a new connection, + // retrying the request on a new one probably isn't going to work. + cs.abortStreamLocked(fmt.Errorf("http2: Transport received GOAWAY from server ErrCode:%v", cc.goAway.ErrCode)) + } else { + // Aborting the stream with errClentConnGotGoAway indicates that + // the request should be retried on a new connection. cs.abortStreamLocked(errClientConnGotGoAway) } } diff --git a/vendor/golang.org/x/oauth2/internal/client_appengine.go b/vendor/golang.org/x/oauth2/internal/client_appengine.go deleted file mode 100644 index d28140f78..000000000 --- a/vendor/golang.org/x/oauth2/internal/client_appengine.go +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build appengine - -package internal - -import "google.golang.org/appengine/urlfetch" - -func init() { - appengineClientHook = urlfetch.Client -} diff --git a/vendor/golang.org/x/oauth2/internal/transport.go b/vendor/golang.org/x/oauth2/internal/transport.go index 572074a63..b9db01ddf 100644 --- a/vendor/golang.org/x/oauth2/internal/transport.go +++ b/vendor/golang.org/x/oauth2/internal/transport.go @@ -18,16 +18,11 @@ var HTTPClient ContextKey // because nobody else can create a ContextKey, being unexported. type ContextKey struct{} -var appengineClientHook func(context.Context) *http.Client - func ContextClient(ctx context.Context) *http.Client { if ctx != nil { if hc, ok := ctx.Value(HTTPClient).(*http.Client); ok { return hc } } - if appengineClientHook != nil { - return appengineClientHook(ctx) - } return http.DefaultClient } diff --git a/vendor/golang.org/x/oauth2/oauth2.go b/vendor/golang.org/x/oauth2/oauth2.go index 90a2c3d6d..09f6a49b8 100644 --- a/vendor/golang.org/x/oauth2/oauth2.go +++ b/vendor/golang.org/x/oauth2/oauth2.go @@ -393,7 +393,7 @@ func ReuseTokenSource(t *Token, src TokenSource) TokenSource { } } -// ReuseTokenSource returns a TokenSource that acts in the same manner as the +// ReuseTokenSourceWithExpiry returns a TokenSource that acts in the same manner as the // TokenSource returned by ReuseTokenSource, except the expiry buffer is // configurable. The expiration time of a token is calculated as // t.Expiry.Add(-earlyExpiry). diff --git a/vendor/google.golang.org/appengine/LICENSE b/vendor/google.golang.org/appengine/LICENSE deleted file mode 100644 index d64569567..000000000 --- a/vendor/google.golang.org/appengine/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/google.golang.org/appengine/internal/api.go b/vendor/google.golang.org/appengine/internal/api.go deleted file mode 100644 index 0569f5dd4..000000000 --- a/vendor/google.golang.org/appengine/internal/api.go +++ /dev/null @@ -1,653 +0,0 @@ -// Copyright 2011 Google Inc. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -//go:build !appengine -// +build !appengine - -package internal - -import ( - "bytes" - "context" - "errors" - "fmt" - "io/ioutil" - "log" - "net" - "net/http" - "net/url" - "os" - "runtime" - "strconv" - "strings" - "sync" - "sync/atomic" - "time" - - "github.com/golang/protobuf/proto" - - basepb "google.golang.org/appengine/internal/base" - logpb "google.golang.org/appengine/internal/log" - remotepb "google.golang.org/appengine/internal/remote_api" -) - -const ( - apiPath = "/rpc_http" -) - -var ( - // Incoming headers. - ticketHeader = http.CanonicalHeaderKey("X-AppEngine-API-Ticket") - dapperHeader = http.CanonicalHeaderKey("X-Google-DapperTraceInfo") - traceHeader = http.CanonicalHeaderKey("X-Cloud-Trace-Context") - curNamespaceHeader = http.CanonicalHeaderKey("X-AppEngine-Current-Namespace") - userIPHeader = http.CanonicalHeaderKey("X-AppEngine-User-IP") - remoteAddrHeader = http.CanonicalHeaderKey("X-AppEngine-Remote-Addr") - devRequestIdHeader = http.CanonicalHeaderKey("X-Appengine-Dev-Request-Id") - - // Outgoing headers. - apiEndpointHeader = http.CanonicalHeaderKey("X-Google-RPC-Service-Endpoint") - apiEndpointHeaderValue = []string{"app-engine-apis"} - apiMethodHeader = http.CanonicalHeaderKey("X-Google-RPC-Service-Method") - apiMethodHeaderValue = []string{"/VMRemoteAPI.CallRemoteAPI"} - apiDeadlineHeader = http.CanonicalHeaderKey("X-Google-RPC-Service-Deadline") - apiContentType = http.CanonicalHeaderKey("Content-Type") - apiContentTypeValue = []string{"application/octet-stream"} - logFlushHeader = http.CanonicalHeaderKey("X-AppEngine-Log-Flush-Count") - - apiHTTPClient = &http.Client{ - Transport: &http.Transport{ - Proxy: http.ProxyFromEnvironment, - Dial: limitDial, - MaxIdleConns: 1000, - MaxIdleConnsPerHost: 10000, - IdleConnTimeout: 90 * time.Second, - }, - } -) - -func apiURL(ctx context.Context) *url.URL { - host, port := "appengine.googleapis.internal", "10001" - if h := os.Getenv("API_HOST"); h != "" { - host = h - } - if hostOverride := ctx.Value(apiHostOverrideKey); hostOverride != nil { - host = hostOverride.(string) - } - if p := os.Getenv("API_PORT"); p != "" { - port = p - } - if portOverride := ctx.Value(apiPortOverrideKey); portOverride != nil { - port = portOverride.(string) - } - return &url.URL{ - Scheme: "http", - Host: host + ":" + port, - Path: apiPath, - } -} - -// Middleware wraps an http handler so that it can make GAE API calls -func Middleware(next http.Handler) http.Handler { - return handleHTTPMiddleware(executeRequestSafelyMiddleware(next)) -} - -func handleHTTPMiddleware(next http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - c := &aeContext{ - req: r, - outHeader: w.Header(), - } - r = r.WithContext(withContext(r.Context(), c)) - c.req = r - - stopFlushing := make(chan int) - - // Patch up RemoteAddr so it looks reasonable. - if addr := r.Header.Get(userIPHeader); addr != "" { - r.RemoteAddr = addr - } else if addr = r.Header.Get(remoteAddrHeader); addr != "" { - r.RemoteAddr = addr - } else { - // Should not normally reach here, but pick a sensible default anyway. - r.RemoteAddr = "127.0.0.1" - } - // The address in the headers will most likely be of these forms: - // 123.123.123.123 - // 2001:db8::1 - // net/http.Request.RemoteAddr is specified to be in "IP:port" form. - if _, _, err := net.SplitHostPort(r.RemoteAddr); err != nil { - // Assume the remote address is only a host; add a default port. - r.RemoteAddr = net.JoinHostPort(r.RemoteAddr, "80") - } - - if logToLogservice() { - // Start goroutine responsible for flushing app logs. - // This is done after adding c to ctx.m (and stopped before removing it) - // because flushing logs requires making an API call. - go c.logFlusher(stopFlushing) - } - - next.ServeHTTP(c, r) - c.outHeader = nil // make sure header changes aren't respected any more - - flushed := make(chan struct{}) - if logToLogservice() { - stopFlushing <- 1 // any logging beyond this point will be dropped - - // Flush any pending logs asynchronously. - c.pendingLogs.Lock() - flushes := c.pendingLogs.flushes - if len(c.pendingLogs.lines) > 0 { - flushes++ - } - c.pendingLogs.Unlock() - go func() { - defer close(flushed) - // Force a log flush, because with very short requests we - // may not ever flush logs. - c.flushLog(true) - }() - w.Header().Set(logFlushHeader, strconv.Itoa(flushes)) - } - - // Avoid nil Write call if c.Write is never called. - if c.outCode != 0 { - w.WriteHeader(c.outCode) - } - if c.outBody != nil { - w.Write(c.outBody) - } - if logToLogservice() { - // Wait for the last flush to complete before returning, - // otherwise the security ticket will not be valid. - <-flushed - } - }) -} - -func executeRequestSafelyMiddleware(next http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - defer func() { - if x := recover(); x != nil { - c := w.(*aeContext) - logf(c, 4, "%s", renderPanic(x)) // 4 == critical - c.outCode = 500 - } - }() - - next.ServeHTTP(w, r) - }) -} - -func renderPanic(x interface{}) string { - buf := make([]byte, 16<<10) // 16 KB should be plenty - buf = buf[:runtime.Stack(buf, false)] - - // Remove the first few stack frames: - // this func - // the recover closure in the caller - // That will root the stack trace at the site of the panic. - const ( - skipStart = "internal.renderPanic" - skipFrames = 2 - ) - start := bytes.Index(buf, []byte(skipStart)) - p := start - for i := 0; i < skipFrames*2 && p+1 < len(buf); i++ { - p = bytes.IndexByte(buf[p+1:], '\n') + p + 1 - if p < 0 { - break - } - } - if p >= 0 { - // buf[start:p+1] is the block to remove. - // Copy buf[p+1:] over buf[start:] and shrink buf. - copy(buf[start:], buf[p+1:]) - buf = buf[:len(buf)-(p+1-start)] - } - - // Add panic heading. - head := fmt.Sprintf("panic: %v\n\n", x) - if len(head) > len(buf) { - // Extremely unlikely to happen. - return head - } - copy(buf[len(head):], buf) - copy(buf, head) - - return string(buf) -} - -// aeContext represents the aeContext of an in-flight HTTP request. -// It implements the appengine.Context and http.ResponseWriter interfaces. -type aeContext struct { - req *http.Request - - outCode int - outHeader http.Header - outBody []byte - - pendingLogs struct { - sync.Mutex - lines []*logpb.UserAppLogLine - flushes int - } -} - -var contextKey = "holds a *context" - -// jointContext joins two contexts in a superficial way. -// It takes values and timeouts from a base context, and only values from another context. -type jointContext struct { - base context.Context - valuesOnly context.Context -} - -func (c jointContext) Deadline() (time.Time, bool) { - return c.base.Deadline() -} - -func (c jointContext) Done() <-chan struct{} { - return c.base.Done() -} - -func (c jointContext) Err() error { - return c.base.Err() -} - -func (c jointContext) Value(key interface{}) interface{} { - if val := c.base.Value(key); val != nil { - return val - } - return c.valuesOnly.Value(key) -} - -// fromContext returns the App Engine context or nil if ctx is not -// derived from an App Engine context. -func fromContext(ctx context.Context) *aeContext { - c, _ := ctx.Value(&contextKey).(*aeContext) - return c -} - -func withContext(parent context.Context, c *aeContext) context.Context { - ctx := context.WithValue(parent, &contextKey, c) - if ns := c.req.Header.Get(curNamespaceHeader); ns != "" { - ctx = withNamespace(ctx, ns) - } - return ctx -} - -func toContext(c *aeContext) context.Context { - return withContext(context.Background(), c) -} - -func IncomingHeaders(ctx context.Context) http.Header { - if c := fromContext(ctx); c != nil { - return c.req.Header - } - return nil -} - -func ReqContext(req *http.Request) context.Context { - return req.Context() -} - -func WithContext(parent context.Context, req *http.Request) context.Context { - return jointContext{ - base: parent, - valuesOnly: req.Context(), - } -} - -// RegisterTestRequest registers the HTTP request req for testing, such that -// any API calls are sent to the provided URL. -// It should only be used by aetest package. -func RegisterTestRequest(req *http.Request, apiURL *url.URL, appID string) *http.Request { - ctx := req.Context() - ctx = withAPIHostOverride(ctx, apiURL.Hostname()) - ctx = withAPIPortOverride(ctx, apiURL.Port()) - ctx = WithAppIDOverride(ctx, appID) - - // use the unregistered request as a placeholder so that withContext can read the headers - c := &aeContext{req: req} - c.req = req.WithContext(withContext(ctx, c)) - return c.req -} - -var errTimeout = &CallError{ - Detail: "Deadline exceeded", - Code: int32(remotepb.RpcError_CANCELLED), - Timeout: true, -} - -func (c *aeContext) Header() http.Header { return c.outHeader } - -// Copied from $GOROOT/src/pkg/net/http/transfer.go. Some response status -// codes do not permit a response body (nor response entity headers such as -// Content-Length, Content-Type, etc). -func bodyAllowedForStatus(status int) bool { - switch { - case status >= 100 && status <= 199: - return false - case status == 204: - return false - case status == 304: - return false - } - return true -} - -func (c *aeContext) Write(b []byte) (int, error) { - if c.outCode == 0 { - c.WriteHeader(http.StatusOK) - } - if len(b) > 0 && !bodyAllowedForStatus(c.outCode) { - return 0, http.ErrBodyNotAllowed - } - c.outBody = append(c.outBody, b...) - return len(b), nil -} - -func (c *aeContext) WriteHeader(code int) { - if c.outCode != 0 { - logf(c, 3, "WriteHeader called multiple times on request.") // error level - return - } - c.outCode = code -} - -func post(ctx context.Context, body []byte, timeout time.Duration) (b []byte, err error) { - apiURL := apiURL(ctx) - hreq := &http.Request{ - Method: "POST", - URL: apiURL, - Header: http.Header{ - apiEndpointHeader: apiEndpointHeaderValue, - apiMethodHeader: apiMethodHeaderValue, - apiContentType: apiContentTypeValue, - apiDeadlineHeader: []string{strconv.FormatFloat(timeout.Seconds(), 'f', -1, 64)}, - }, - Body: ioutil.NopCloser(bytes.NewReader(body)), - ContentLength: int64(len(body)), - Host: apiURL.Host, - } - c := fromContext(ctx) - if c != nil { - if info := c.req.Header.Get(dapperHeader); info != "" { - hreq.Header.Set(dapperHeader, info) - } - if info := c.req.Header.Get(traceHeader); info != "" { - hreq.Header.Set(traceHeader, info) - } - } - - tr := apiHTTPClient.Transport.(*http.Transport) - - var timedOut int32 // atomic; set to 1 if timed out - t := time.AfterFunc(timeout, func() { - atomic.StoreInt32(&timedOut, 1) - tr.CancelRequest(hreq) - }) - defer t.Stop() - defer func() { - // Check if timeout was exceeded. - if atomic.LoadInt32(&timedOut) != 0 { - err = errTimeout - } - }() - - hresp, err := apiHTTPClient.Do(hreq) - if err != nil { - return nil, &CallError{ - Detail: fmt.Sprintf("service bridge HTTP failed: %v", err), - Code: int32(remotepb.RpcError_UNKNOWN), - } - } - defer hresp.Body.Close() - hrespBody, err := ioutil.ReadAll(hresp.Body) - if hresp.StatusCode != 200 { - return nil, &CallError{ - Detail: fmt.Sprintf("service bridge returned HTTP %d (%q)", hresp.StatusCode, hrespBody), - Code: int32(remotepb.RpcError_UNKNOWN), - } - } - if err != nil { - return nil, &CallError{ - Detail: fmt.Sprintf("service bridge response bad: %v", err), - Code: int32(remotepb.RpcError_UNKNOWN), - } - } - return hrespBody, nil -} - -func Call(ctx context.Context, service, method string, in, out proto.Message) error { - if ns := NamespaceFromContext(ctx); ns != "" { - if fn, ok := NamespaceMods[service]; ok { - fn(in, ns) - } - } - - if f, ctx, ok := callOverrideFromContext(ctx); ok { - return f(ctx, service, method, in, out) - } - - // Handle already-done contexts quickly. - select { - case <-ctx.Done(): - return ctx.Err() - default: - } - - c := fromContext(ctx) - - // Apply transaction modifications if we're in a transaction. - if t := transactionFromContext(ctx); t != nil { - if t.finished { - return errors.New("transaction aeContext has expired") - } - applyTransaction(in, &t.transaction) - } - - // Default RPC timeout is 60s. - timeout := 60 * time.Second - if deadline, ok := ctx.Deadline(); ok { - timeout = deadline.Sub(time.Now()) - } - - data, err := proto.Marshal(in) - if err != nil { - return err - } - - ticket := "" - if c != nil { - ticket = c.req.Header.Get(ticketHeader) - if dri := c.req.Header.Get(devRequestIdHeader); IsDevAppServer() && dri != "" { - ticket = dri - } - } - req := &remotepb.Request{ - ServiceName: &service, - Method: &method, - Request: data, - RequestId: &ticket, - } - hreqBody, err := proto.Marshal(req) - if err != nil { - return err - } - - hrespBody, err := post(ctx, hreqBody, timeout) - if err != nil { - return err - } - - res := &remotepb.Response{} - if err := proto.Unmarshal(hrespBody, res); err != nil { - return err - } - if res.RpcError != nil { - ce := &CallError{ - Detail: res.RpcError.GetDetail(), - Code: *res.RpcError.Code, - } - switch remotepb.RpcError_ErrorCode(ce.Code) { - case remotepb.RpcError_CANCELLED, remotepb.RpcError_DEADLINE_EXCEEDED: - ce.Timeout = true - } - return ce - } - if res.ApplicationError != nil { - return &APIError{ - Service: *req.ServiceName, - Detail: res.ApplicationError.GetDetail(), - Code: *res.ApplicationError.Code, - } - } - if res.Exception != nil || res.JavaException != nil { - // This shouldn't happen, but let's be defensive. - return &CallError{ - Detail: "service bridge returned exception", - Code: int32(remotepb.RpcError_UNKNOWN), - } - } - return proto.Unmarshal(res.Response, out) -} - -func (c *aeContext) Request() *http.Request { - return c.req -} - -func (c *aeContext) addLogLine(ll *logpb.UserAppLogLine) { - // Truncate long log lines. - // TODO(dsymonds): Check if this is still necessary. - const lim = 8 << 10 - if len(*ll.Message) > lim { - suffix := fmt.Sprintf("...(length %d)", len(*ll.Message)) - ll.Message = proto.String((*ll.Message)[:lim-len(suffix)] + suffix) - } - - c.pendingLogs.Lock() - c.pendingLogs.lines = append(c.pendingLogs.lines, ll) - c.pendingLogs.Unlock() -} - -var logLevelName = map[int64]string{ - 0: "DEBUG", - 1: "INFO", - 2: "WARNING", - 3: "ERROR", - 4: "CRITICAL", -} - -func logf(c *aeContext, level int64, format string, args ...interface{}) { - if c == nil { - panic("not an App Engine aeContext") - } - s := fmt.Sprintf(format, args...) - s = strings.TrimRight(s, "\n") // Remove any trailing newline characters. - if logToLogservice() { - c.addLogLine(&logpb.UserAppLogLine{ - TimestampUsec: proto.Int64(time.Now().UnixNano() / 1e3), - Level: &level, - Message: &s, - }) - } - // Log to stdout if not deployed - if !IsSecondGen() { - log.Print(logLevelName[level] + ": " + s) - } -} - -// flushLog attempts to flush any pending logs to the appserver. -// It should not be called concurrently. -func (c *aeContext) flushLog(force bool) (flushed bool) { - c.pendingLogs.Lock() - // Grab up to 30 MB. We can get away with up to 32 MB, but let's be cautious. - n, rem := 0, 30<<20 - for ; n < len(c.pendingLogs.lines); n++ { - ll := c.pendingLogs.lines[n] - // Each log line will require about 3 bytes of overhead. - nb := proto.Size(ll) + 3 - if nb > rem { - break - } - rem -= nb - } - lines := c.pendingLogs.lines[:n] - c.pendingLogs.lines = c.pendingLogs.lines[n:] - c.pendingLogs.Unlock() - - if len(lines) == 0 && !force { - // Nothing to flush. - return false - } - - rescueLogs := false - defer func() { - if rescueLogs { - c.pendingLogs.Lock() - c.pendingLogs.lines = append(lines, c.pendingLogs.lines...) - c.pendingLogs.Unlock() - } - }() - - buf, err := proto.Marshal(&logpb.UserAppLogGroup{ - LogLine: lines, - }) - if err != nil { - log.Printf("internal.flushLog: marshaling UserAppLogGroup: %v", err) - rescueLogs = true - return false - } - - req := &logpb.FlushRequest{ - Logs: buf, - } - res := &basepb.VoidProto{} - c.pendingLogs.Lock() - c.pendingLogs.flushes++ - c.pendingLogs.Unlock() - if err := Call(toContext(c), "logservice", "Flush", req, res); err != nil { - log.Printf("internal.flushLog: Flush RPC: %v", err) - rescueLogs = true - return false - } - return true -} - -const ( - // Log flushing parameters. - flushInterval = 1 * time.Second - forceFlushInterval = 60 * time.Second -) - -func (c *aeContext) logFlusher(stop <-chan int) { - lastFlush := time.Now() - tick := time.NewTicker(flushInterval) - for { - select { - case <-stop: - // Request finished. - tick.Stop() - return - case <-tick.C: - force := time.Now().Sub(lastFlush) > forceFlushInterval - if c.flushLog(force) { - lastFlush = time.Now() - } - } - } -} - -func ContextForTesting(req *http.Request) context.Context { - return toContext(&aeContext{req: req}) -} - -func logToLogservice() bool { - // TODO: replace logservice with json structured logs to $LOG_DIR/app.log.json - // where $LOG_DIR is /var/log in prod and some tmpdir in dev - return os.Getenv("LOG_TO_LOGSERVICE") != "0" -} diff --git a/vendor/google.golang.org/appengine/internal/api_classic.go b/vendor/google.golang.org/appengine/internal/api_classic.go deleted file mode 100644 index 87c33c798..000000000 --- a/vendor/google.golang.org/appengine/internal/api_classic.go +++ /dev/null @@ -1,170 +0,0 @@ -// Copyright 2015 Google Inc. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -//go:build appengine -// +build appengine - -package internal - -import ( - "context" - "errors" - "fmt" - "net/http" - "time" - - "appengine" - "appengine_internal" - basepb "appengine_internal/base" - - "github.com/golang/protobuf/proto" -) - -var contextKey = "holds an appengine.Context" - -// fromContext returns the App Engine context or nil if ctx is not -// derived from an App Engine context. -func fromContext(ctx context.Context) appengine.Context { - c, _ := ctx.Value(&contextKey).(appengine.Context) - return c -} - -// This is only for classic App Engine adapters. -func ClassicContextFromContext(ctx context.Context) (appengine.Context, error) { - c := fromContext(ctx) - if c == nil { - return nil, errNotAppEngineContext - } - return c, nil -} - -func withContext(parent context.Context, c appengine.Context) context.Context { - ctx := context.WithValue(parent, &contextKey, c) - - s := &basepb.StringProto{} - c.Call("__go__", "GetNamespace", &basepb.VoidProto{}, s, nil) - if ns := s.GetValue(); ns != "" { - ctx = NamespacedContext(ctx, ns) - } - - return ctx -} - -func IncomingHeaders(ctx context.Context) http.Header { - if c := fromContext(ctx); c != nil { - if req, ok := c.Request().(*http.Request); ok { - return req.Header - } - } - return nil -} - -func ReqContext(req *http.Request) context.Context { - return WithContext(context.Background(), req) -} - -func WithContext(parent context.Context, req *http.Request) context.Context { - c := appengine.NewContext(req) - return withContext(parent, c) -} - -type testingContext struct { - appengine.Context - - req *http.Request -} - -func (t *testingContext) FullyQualifiedAppID() string { return "dev~testcontext" } -func (t *testingContext) Call(service, method string, _, _ appengine_internal.ProtoMessage, _ *appengine_internal.CallOptions) error { - if service == "__go__" && method == "GetNamespace" { - return nil - } - return fmt.Errorf("testingContext: unsupported Call") -} -func (t *testingContext) Request() interface{} { return t.req } - -func ContextForTesting(req *http.Request) context.Context { - return withContext(context.Background(), &testingContext{req: req}) -} - -func Call(ctx context.Context, service, method string, in, out proto.Message) error { - if ns := NamespaceFromContext(ctx); ns != "" { - if fn, ok := NamespaceMods[service]; ok { - fn(in, ns) - } - } - - if f, ctx, ok := callOverrideFromContext(ctx); ok { - return f(ctx, service, method, in, out) - } - - // Handle already-done contexts quickly. - select { - case <-ctx.Done(): - return ctx.Err() - default: - } - - c := fromContext(ctx) - if c == nil { - // Give a good error message rather than a panic lower down. - return errNotAppEngineContext - } - - // Apply transaction modifications if we're in a transaction. - if t := transactionFromContext(ctx); t != nil { - if t.finished { - return errors.New("transaction context has expired") - } - applyTransaction(in, &t.transaction) - } - - var opts *appengine_internal.CallOptions - if d, ok := ctx.Deadline(); ok { - opts = &appengine_internal.CallOptions{ - Timeout: d.Sub(time.Now()), - } - } - - err := c.Call(service, method, in, out, opts) - switch v := err.(type) { - case *appengine_internal.APIError: - return &APIError{ - Service: v.Service, - Detail: v.Detail, - Code: v.Code, - } - case *appengine_internal.CallError: - return &CallError{ - Detail: v.Detail, - Code: v.Code, - Timeout: v.Timeout, - } - } - return err -} - -func Middleware(next http.Handler) http.Handler { - panic("Middleware called; this should be impossible") -} - -func logf(c appengine.Context, level int64, format string, args ...interface{}) { - var fn func(format string, args ...interface{}) - switch level { - case 0: - fn = c.Debugf - case 1: - fn = c.Infof - case 2: - fn = c.Warningf - case 3: - fn = c.Errorf - case 4: - fn = c.Criticalf - default: - // This shouldn't happen. - fn = c.Criticalf - } - fn(format, args...) -} diff --git a/vendor/google.golang.org/appengine/internal/api_common.go b/vendor/google.golang.org/appengine/internal/api_common.go deleted file mode 100644 index 5b95c13d9..000000000 --- a/vendor/google.golang.org/appengine/internal/api_common.go +++ /dev/null @@ -1,141 +0,0 @@ -// Copyright 2015 Google Inc. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -package internal - -import ( - "context" - "errors" - "os" - - "github.com/golang/protobuf/proto" -) - -type ctxKey string - -func (c ctxKey) String() string { - return "appengine context key: " + string(c) -} - -var errNotAppEngineContext = errors.New("not an App Engine context") - -type CallOverrideFunc func(ctx context.Context, service, method string, in, out proto.Message) error - -var callOverrideKey = "holds []CallOverrideFunc" - -func WithCallOverride(ctx context.Context, f CallOverrideFunc) context.Context { - // We avoid appending to any existing call override - // so we don't risk overwriting a popped stack below. - var cofs []CallOverrideFunc - if uf, ok := ctx.Value(&callOverrideKey).([]CallOverrideFunc); ok { - cofs = append(cofs, uf...) - } - cofs = append(cofs, f) - return context.WithValue(ctx, &callOverrideKey, cofs) -} - -func callOverrideFromContext(ctx context.Context) (CallOverrideFunc, context.Context, bool) { - cofs, _ := ctx.Value(&callOverrideKey).([]CallOverrideFunc) - if len(cofs) == 0 { - return nil, nil, false - } - // We found a list of overrides; grab the last, and reconstitute a - // context that will hide it. - f := cofs[len(cofs)-1] - ctx = context.WithValue(ctx, &callOverrideKey, cofs[:len(cofs)-1]) - return f, ctx, true -} - -type logOverrideFunc func(level int64, format string, args ...interface{}) - -var logOverrideKey = "holds a logOverrideFunc" - -func WithLogOverride(ctx context.Context, f logOverrideFunc) context.Context { - return context.WithValue(ctx, &logOverrideKey, f) -} - -var appIDOverrideKey = "holds a string, being the full app ID" - -func WithAppIDOverride(ctx context.Context, appID string) context.Context { - return context.WithValue(ctx, &appIDOverrideKey, appID) -} - -var apiHostOverrideKey = ctxKey("holds a string, being the alternate API_HOST") - -func withAPIHostOverride(ctx context.Context, apiHost string) context.Context { - return context.WithValue(ctx, apiHostOverrideKey, apiHost) -} - -var apiPortOverrideKey = ctxKey("holds a string, being the alternate API_PORT") - -func withAPIPortOverride(ctx context.Context, apiPort string) context.Context { - return context.WithValue(ctx, apiPortOverrideKey, apiPort) -} - -var namespaceKey = "holds the namespace string" - -func withNamespace(ctx context.Context, ns string) context.Context { - return context.WithValue(ctx, &namespaceKey, ns) -} - -func NamespaceFromContext(ctx context.Context) string { - // If there's no namespace, return the empty string. - ns, _ := ctx.Value(&namespaceKey).(string) - return ns -} - -// FullyQualifiedAppID returns the fully-qualified application ID. -// This may contain a partition prefix (e.g. "s~" for High Replication apps), -// or a domain prefix (e.g. "example.com:"). -func FullyQualifiedAppID(ctx context.Context) string { - if id, ok := ctx.Value(&appIDOverrideKey).(string); ok { - return id - } - return fullyQualifiedAppID(ctx) -} - -func Logf(ctx context.Context, level int64, format string, args ...interface{}) { - if f, ok := ctx.Value(&logOverrideKey).(logOverrideFunc); ok { - f(level, format, args...) - return - } - c := fromContext(ctx) - if c == nil { - panic(errNotAppEngineContext) - } - logf(c, level, format, args...) -} - -// NamespacedContext wraps a Context to support namespaces. -func NamespacedContext(ctx context.Context, namespace string) context.Context { - return withNamespace(ctx, namespace) -} - -// SetTestEnv sets the env variables for testing background ticket in Flex. -func SetTestEnv() func() { - var environ = []struct { - key, value string - }{ - {"GAE_LONG_APP_ID", "my-app-id"}, - {"GAE_MINOR_VERSION", "067924799508853122"}, - {"GAE_MODULE_INSTANCE", "0"}, - {"GAE_MODULE_NAME", "default"}, - {"GAE_MODULE_VERSION", "20150612t184001"}, - } - - for _, v := range environ { - old := os.Getenv(v.key) - os.Setenv(v.key, v.value) - v.value = old - } - return func() { // Restore old environment after the test completes. - for _, v := range environ { - if v.value == "" { - os.Unsetenv(v.key) - continue - } - os.Setenv(v.key, v.value) - } - } -} diff --git a/vendor/google.golang.org/appengine/internal/app_id.go b/vendor/google.golang.org/appengine/internal/app_id.go deleted file mode 100644 index 11df8c07b..000000000 --- a/vendor/google.golang.org/appengine/internal/app_id.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2011 Google Inc. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -package internal - -import ( - "strings" -) - -func parseFullAppID(appid string) (partition, domain, displayID string) { - if i := strings.Index(appid, "~"); i != -1 { - partition, appid = appid[:i], appid[i+1:] - } - if i := strings.Index(appid, ":"); i != -1 { - domain, appid = appid[:i], appid[i+1:] - } - return partition, domain, appid -} - -// appID returns "appid" or "domain.com:appid". -func appID(fullAppID string) string { - _, dom, dis := parseFullAppID(fullAppID) - if dom != "" { - return dom + ":" + dis - } - return dis -} diff --git a/vendor/google.golang.org/appengine/internal/base/api_base.pb.go b/vendor/google.golang.org/appengine/internal/base/api_base.pb.go deleted file mode 100644 index db4777e68..000000000 --- a/vendor/google.golang.org/appengine/internal/base/api_base.pb.go +++ /dev/null @@ -1,308 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google.golang.org/appengine/internal/base/api_base.proto - -package base - -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package - -type StringProto struct { - Value *string `protobuf:"bytes,1,req,name=value" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *StringProto) Reset() { *m = StringProto{} } -func (m *StringProto) String() string { return proto.CompactTextString(m) } -func (*StringProto) ProtoMessage() {} -func (*StringProto) Descriptor() ([]byte, []int) { - return fileDescriptor_api_base_9d49f8792e0c1140, []int{0} -} -func (m *StringProto) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_StringProto.Unmarshal(m, b) -} -func (m *StringProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_StringProto.Marshal(b, m, deterministic) -} -func (dst *StringProto) XXX_Merge(src proto.Message) { - xxx_messageInfo_StringProto.Merge(dst, src) -} -func (m *StringProto) XXX_Size() int { - return xxx_messageInfo_StringProto.Size(m) -} -func (m *StringProto) XXX_DiscardUnknown() { - xxx_messageInfo_StringProto.DiscardUnknown(m) -} - -var xxx_messageInfo_StringProto proto.InternalMessageInfo - -func (m *StringProto) GetValue() string { - if m != nil && m.Value != nil { - return *m.Value - } - return "" -} - -type Integer32Proto struct { - Value *int32 `protobuf:"varint,1,req,name=value" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Integer32Proto) Reset() { *m = Integer32Proto{} } -func (m *Integer32Proto) String() string { return proto.CompactTextString(m) } -func (*Integer32Proto) ProtoMessage() {} -func (*Integer32Proto) Descriptor() ([]byte, []int) { - return fileDescriptor_api_base_9d49f8792e0c1140, []int{1} -} -func (m *Integer32Proto) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Integer32Proto.Unmarshal(m, b) -} -func (m *Integer32Proto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Integer32Proto.Marshal(b, m, deterministic) -} -func (dst *Integer32Proto) XXX_Merge(src proto.Message) { - xxx_messageInfo_Integer32Proto.Merge(dst, src) -} -func (m *Integer32Proto) XXX_Size() int { - return xxx_messageInfo_Integer32Proto.Size(m) -} -func (m *Integer32Proto) XXX_DiscardUnknown() { - xxx_messageInfo_Integer32Proto.DiscardUnknown(m) -} - -var xxx_messageInfo_Integer32Proto proto.InternalMessageInfo - -func (m *Integer32Proto) GetValue() int32 { - if m != nil && m.Value != nil { - return *m.Value - } - return 0 -} - -type Integer64Proto struct { - Value *int64 `protobuf:"varint,1,req,name=value" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Integer64Proto) Reset() { *m = Integer64Proto{} } -func (m *Integer64Proto) String() string { return proto.CompactTextString(m) } -func (*Integer64Proto) ProtoMessage() {} -func (*Integer64Proto) Descriptor() ([]byte, []int) { - return fileDescriptor_api_base_9d49f8792e0c1140, []int{2} -} -func (m *Integer64Proto) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Integer64Proto.Unmarshal(m, b) -} -func (m *Integer64Proto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Integer64Proto.Marshal(b, m, deterministic) -} -func (dst *Integer64Proto) XXX_Merge(src proto.Message) { - xxx_messageInfo_Integer64Proto.Merge(dst, src) -} -func (m *Integer64Proto) XXX_Size() int { - return xxx_messageInfo_Integer64Proto.Size(m) -} -func (m *Integer64Proto) XXX_DiscardUnknown() { - xxx_messageInfo_Integer64Proto.DiscardUnknown(m) -} - -var xxx_messageInfo_Integer64Proto proto.InternalMessageInfo - -func (m *Integer64Proto) GetValue() int64 { - if m != nil && m.Value != nil { - return *m.Value - } - return 0 -} - -type BoolProto struct { - Value *bool `protobuf:"varint,1,req,name=value" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *BoolProto) Reset() { *m = BoolProto{} } -func (m *BoolProto) String() string { return proto.CompactTextString(m) } -func (*BoolProto) ProtoMessage() {} -func (*BoolProto) Descriptor() ([]byte, []int) { - return fileDescriptor_api_base_9d49f8792e0c1140, []int{3} -} -func (m *BoolProto) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_BoolProto.Unmarshal(m, b) -} -func (m *BoolProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_BoolProto.Marshal(b, m, deterministic) -} -func (dst *BoolProto) XXX_Merge(src proto.Message) { - xxx_messageInfo_BoolProto.Merge(dst, src) -} -func (m *BoolProto) XXX_Size() int { - return xxx_messageInfo_BoolProto.Size(m) -} -func (m *BoolProto) XXX_DiscardUnknown() { - xxx_messageInfo_BoolProto.DiscardUnknown(m) -} - -var xxx_messageInfo_BoolProto proto.InternalMessageInfo - -func (m *BoolProto) GetValue() bool { - if m != nil && m.Value != nil { - return *m.Value - } - return false -} - -type DoubleProto struct { - Value *float64 `protobuf:"fixed64,1,req,name=value" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *DoubleProto) Reset() { *m = DoubleProto{} } -func (m *DoubleProto) String() string { return proto.CompactTextString(m) } -func (*DoubleProto) ProtoMessage() {} -func (*DoubleProto) Descriptor() ([]byte, []int) { - return fileDescriptor_api_base_9d49f8792e0c1140, []int{4} -} -func (m *DoubleProto) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_DoubleProto.Unmarshal(m, b) -} -func (m *DoubleProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_DoubleProto.Marshal(b, m, deterministic) -} -func (dst *DoubleProto) XXX_Merge(src proto.Message) { - xxx_messageInfo_DoubleProto.Merge(dst, src) -} -func (m *DoubleProto) XXX_Size() int { - return xxx_messageInfo_DoubleProto.Size(m) -} -func (m *DoubleProto) XXX_DiscardUnknown() { - xxx_messageInfo_DoubleProto.DiscardUnknown(m) -} - -var xxx_messageInfo_DoubleProto proto.InternalMessageInfo - -func (m *DoubleProto) GetValue() float64 { - if m != nil && m.Value != nil { - return *m.Value - } - return 0 -} - -type BytesProto struct { - Value []byte `protobuf:"bytes,1,req,name=value" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *BytesProto) Reset() { *m = BytesProto{} } -func (m *BytesProto) String() string { return proto.CompactTextString(m) } -func (*BytesProto) ProtoMessage() {} -func (*BytesProto) Descriptor() ([]byte, []int) { - return fileDescriptor_api_base_9d49f8792e0c1140, []int{5} -} -func (m *BytesProto) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_BytesProto.Unmarshal(m, b) -} -func (m *BytesProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_BytesProto.Marshal(b, m, deterministic) -} -func (dst *BytesProto) XXX_Merge(src proto.Message) { - xxx_messageInfo_BytesProto.Merge(dst, src) -} -func (m *BytesProto) XXX_Size() int { - return xxx_messageInfo_BytesProto.Size(m) -} -func (m *BytesProto) XXX_DiscardUnknown() { - xxx_messageInfo_BytesProto.DiscardUnknown(m) -} - -var xxx_messageInfo_BytesProto proto.InternalMessageInfo - -func (m *BytesProto) GetValue() []byte { - if m != nil { - return m.Value - } - return nil -} - -type VoidProto struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *VoidProto) Reset() { *m = VoidProto{} } -func (m *VoidProto) String() string { return proto.CompactTextString(m) } -func (*VoidProto) ProtoMessage() {} -func (*VoidProto) Descriptor() ([]byte, []int) { - return fileDescriptor_api_base_9d49f8792e0c1140, []int{6} -} -func (m *VoidProto) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_VoidProto.Unmarshal(m, b) -} -func (m *VoidProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_VoidProto.Marshal(b, m, deterministic) -} -func (dst *VoidProto) XXX_Merge(src proto.Message) { - xxx_messageInfo_VoidProto.Merge(dst, src) -} -func (m *VoidProto) XXX_Size() int { - return xxx_messageInfo_VoidProto.Size(m) -} -func (m *VoidProto) XXX_DiscardUnknown() { - xxx_messageInfo_VoidProto.DiscardUnknown(m) -} - -var xxx_messageInfo_VoidProto proto.InternalMessageInfo - -func init() { - proto.RegisterType((*StringProto)(nil), "appengine.base.StringProto") - proto.RegisterType((*Integer32Proto)(nil), "appengine.base.Integer32Proto") - proto.RegisterType((*Integer64Proto)(nil), "appengine.base.Integer64Proto") - proto.RegisterType((*BoolProto)(nil), "appengine.base.BoolProto") - proto.RegisterType((*DoubleProto)(nil), "appengine.base.DoubleProto") - proto.RegisterType((*BytesProto)(nil), "appengine.base.BytesProto") - proto.RegisterType((*VoidProto)(nil), "appengine.base.VoidProto") -} - -func init() { - proto.RegisterFile("google.golang.org/appengine/internal/base/api_base.proto", fileDescriptor_api_base_9d49f8792e0c1140) -} - -var fileDescriptor_api_base_9d49f8792e0c1140 = []byte{ - // 199 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0xcf, 0x3f, 0x4b, 0xc6, 0x30, - 0x10, 0x06, 0x70, 0x5a, 0xad, 0xb4, 0x57, 0xe9, 0x20, 0x0e, 0x1d, 0xb5, 0x05, 0x71, 0x4a, 0x40, - 0x45, 0x9c, 0x83, 0x8b, 0x9b, 0x28, 0x38, 0xb8, 0x48, 0x8a, 0xc7, 0x11, 0x08, 0xb9, 0x90, 0xa6, - 0x82, 0xdf, 0x5e, 0xda, 0xd2, 0xfa, 0xc2, 0x9b, 0xed, 0xfe, 0xfc, 0xe0, 0xe1, 0x81, 0x27, 0x62, - 0x26, 0x8b, 0x82, 0xd8, 0x6a, 0x47, 0x82, 0x03, 0x49, 0xed, 0x3d, 0x3a, 0x32, 0x0e, 0xa5, 0x71, - 0x11, 0x83, 0xd3, 0x56, 0x0e, 0x7a, 0x44, 0xa9, 0xbd, 0xf9, 0x9a, 0x07, 0xe1, 0x03, 0x47, 0xbe, - 0x68, 0x76, 0x27, 0xe6, 0x6b, 0xd7, 0x43, 0xfd, 0x1e, 0x83, 0x71, 0xf4, 0xba, 0xbc, 0x2f, 0xa1, - 0xf8, 0xd1, 0x76, 0xc2, 0x36, 0xbb, 0xca, 0x6f, 0xab, 0xb7, 0x75, 0xe9, 0x6e, 0xa0, 0x79, 0x71, - 0x11, 0x09, 0xc3, 0xfd, 0x5d, 0xc2, 0x15, 0xc7, 0xee, 0xf1, 0x21, 0xe1, 0x4e, 0x36, 0x77, 0x0d, - 0x95, 0x62, 0xb6, 0x09, 0x52, 0x6e, 0xa4, 0x87, 0xfa, 0x99, 0xa7, 0xc1, 0x62, 0x02, 0x65, 0xff, - 0x79, 0xa0, 0x7e, 0x23, 0x8e, 0xab, 0x69, 0x0f, 0xcd, 0xb9, 0xca, 0xcb, 0xdd, 0xd5, 0x50, 0x7d, - 0xb0, 0xf9, 0x5e, 0x98, 0x3a, 0xfb, 0x3c, 0x9d, 0x9b, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0xba, - 0x37, 0x25, 0xea, 0x44, 0x01, 0x00, 0x00, -} diff --git a/vendor/google.golang.org/appengine/internal/base/api_base.proto b/vendor/google.golang.org/appengine/internal/base/api_base.proto deleted file mode 100644 index 56cd7a3ca..000000000 --- a/vendor/google.golang.org/appengine/internal/base/api_base.proto +++ /dev/null @@ -1,33 +0,0 @@ -// Built-in base types for API calls. Primarily useful as return types. - -syntax = "proto2"; -option go_package = "base"; - -package appengine.base; - -message StringProto { - required string value = 1; -} - -message Integer32Proto { - required int32 value = 1; -} - -message Integer64Proto { - required int64 value = 1; -} - -message BoolProto { - required bool value = 1; -} - -message DoubleProto { - required double value = 1; -} - -message BytesProto { - required bytes value = 1 [ctype=CORD]; -} - -message VoidProto { -} diff --git a/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.pb.go b/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.pb.go deleted file mode 100644 index 2fb748289..000000000 --- a/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.pb.go +++ /dev/null @@ -1,4367 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google.golang.org/appengine/internal/datastore/datastore_v3.proto - -package datastore - -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package - -type Property_Meaning int32 - -const ( - Property_NO_MEANING Property_Meaning = 0 - Property_BLOB Property_Meaning = 14 - Property_TEXT Property_Meaning = 15 - Property_BYTESTRING Property_Meaning = 16 - Property_ATOM_CATEGORY Property_Meaning = 1 - Property_ATOM_LINK Property_Meaning = 2 - Property_ATOM_TITLE Property_Meaning = 3 - Property_ATOM_CONTENT Property_Meaning = 4 - Property_ATOM_SUMMARY Property_Meaning = 5 - Property_ATOM_AUTHOR Property_Meaning = 6 - Property_GD_WHEN Property_Meaning = 7 - Property_GD_EMAIL Property_Meaning = 8 - Property_GEORSS_POINT Property_Meaning = 9 - Property_GD_IM Property_Meaning = 10 - Property_GD_PHONENUMBER Property_Meaning = 11 - Property_GD_POSTALADDRESS Property_Meaning = 12 - Property_GD_RATING Property_Meaning = 13 - Property_BLOBKEY Property_Meaning = 17 - Property_ENTITY_PROTO Property_Meaning = 19 - Property_INDEX_VALUE Property_Meaning = 18 -) - -var Property_Meaning_name = map[int32]string{ - 0: "NO_MEANING", - 14: "BLOB", - 15: "TEXT", - 16: "BYTESTRING", - 1: "ATOM_CATEGORY", - 2: "ATOM_LINK", - 3: "ATOM_TITLE", - 4: "ATOM_CONTENT", - 5: "ATOM_SUMMARY", - 6: "ATOM_AUTHOR", - 7: "GD_WHEN", - 8: "GD_EMAIL", - 9: "GEORSS_POINT", - 10: "GD_IM", - 11: "GD_PHONENUMBER", - 12: "GD_POSTALADDRESS", - 13: "GD_RATING", - 17: "BLOBKEY", - 19: "ENTITY_PROTO", - 18: "INDEX_VALUE", -} -var Property_Meaning_value = map[string]int32{ - "NO_MEANING": 0, - "BLOB": 14, - "TEXT": 15, - "BYTESTRING": 16, - "ATOM_CATEGORY": 1, - "ATOM_LINK": 2, - "ATOM_TITLE": 3, - "ATOM_CONTENT": 4, - "ATOM_SUMMARY": 5, - "ATOM_AUTHOR": 6, - "GD_WHEN": 7, - "GD_EMAIL": 8, - "GEORSS_POINT": 9, - "GD_IM": 10, - "GD_PHONENUMBER": 11, - "GD_POSTALADDRESS": 12, - "GD_RATING": 13, - "BLOBKEY": 17, - "ENTITY_PROTO": 19, - "INDEX_VALUE": 18, -} - -func (x Property_Meaning) Enum() *Property_Meaning { - p := new(Property_Meaning) - *p = x - return p -} -func (x Property_Meaning) String() string { - return proto.EnumName(Property_Meaning_name, int32(x)) -} -func (x *Property_Meaning) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(Property_Meaning_value, data, "Property_Meaning") - if err != nil { - return err - } - *x = Property_Meaning(value) - return nil -} -func (Property_Meaning) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{2, 0} -} - -type Property_FtsTokenizationOption int32 - -const ( - Property_HTML Property_FtsTokenizationOption = 1 - Property_ATOM Property_FtsTokenizationOption = 2 -) - -var Property_FtsTokenizationOption_name = map[int32]string{ - 1: "HTML", - 2: "ATOM", -} -var Property_FtsTokenizationOption_value = map[string]int32{ - "HTML": 1, - "ATOM": 2, -} - -func (x Property_FtsTokenizationOption) Enum() *Property_FtsTokenizationOption { - p := new(Property_FtsTokenizationOption) - *p = x - return p -} -func (x Property_FtsTokenizationOption) String() string { - return proto.EnumName(Property_FtsTokenizationOption_name, int32(x)) -} -func (x *Property_FtsTokenizationOption) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(Property_FtsTokenizationOption_value, data, "Property_FtsTokenizationOption") - if err != nil { - return err - } - *x = Property_FtsTokenizationOption(value) - return nil -} -func (Property_FtsTokenizationOption) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{2, 1} -} - -type EntityProto_Kind int32 - -const ( - EntityProto_GD_CONTACT EntityProto_Kind = 1 - EntityProto_GD_EVENT EntityProto_Kind = 2 - EntityProto_GD_MESSAGE EntityProto_Kind = 3 -) - -var EntityProto_Kind_name = map[int32]string{ - 1: "GD_CONTACT", - 2: "GD_EVENT", - 3: "GD_MESSAGE", -} -var EntityProto_Kind_value = map[string]int32{ - "GD_CONTACT": 1, - "GD_EVENT": 2, - "GD_MESSAGE": 3, -} - -func (x EntityProto_Kind) Enum() *EntityProto_Kind { - p := new(EntityProto_Kind) - *p = x - return p -} -func (x EntityProto_Kind) String() string { - return proto.EnumName(EntityProto_Kind_name, int32(x)) -} -func (x *EntityProto_Kind) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(EntityProto_Kind_value, data, "EntityProto_Kind") - if err != nil { - return err - } - *x = EntityProto_Kind(value) - return nil -} -func (EntityProto_Kind) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{6, 0} -} - -type Index_Property_Direction int32 - -const ( - Index_Property_ASCENDING Index_Property_Direction = 1 - Index_Property_DESCENDING Index_Property_Direction = 2 -) - -var Index_Property_Direction_name = map[int32]string{ - 1: "ASCENDING", - 2: "DESCENDING", -} -var Index_Property_Direction_value = map[string]int32{ - "ASCENDING": 1, - "DESCENDING": 2, -} - -func (x Index_Property_Direction) Enum() *Index_Property_Direction { - p := new(Index_Property_Direction) - *p = x - return p -} -func (x Index_Property_Direction) String() string { - return proto.EnumName(Index_Property_Direction_name, int32(x)) -} -func (x *Index_Property_Direction) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(Index_Property_Direction_value, data, "Index_Property_Direction") - if err != nil { - return err - } - *x = Index_Property_Direction(value) - return nil -} -func (Index_Property_Direction) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{8, 0, 0} -} - -type CompositeIndex_State int32 - -const ( - CompositeIndex_WRITE_ONLY CompositeIndex_State = 1 - CompositeIndex_READ_WRITE CompositeIndex_State = 2 - CompositeIndex_DELETED CompositeIndex_State = 3 - CompositeIndex_ERROR CompositeIndex_State = 4 -) - -var CompositeIndex_State_name = map[int32]string{ - 1: "WRITE_ONLY", - 2: "READ_WRITE", - 3: "DELETED", - 4: "ERROR", -} -var CompositeIndex_State_value = map[string]int32{ - "WRITE_ONLY": 1, - "READ_WRITE": 2, - "DELETED": 3, - "ERROR": 4, -} - -func (x CompositeIndex_State) Enum() *CompositeIndex_State { - p := new(CompositeIndex_State) - *p = x - return p -} -func (x CompositeIndex_State) String() string { - return proto.EnumName(CompositeIndex_State_name, int32(x)) -} -func (x *CompositeIndex_State) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(CompositeIndex_State_value, data, "CompositeIndex_State") - if err != nil { - return err - } - *x = CompositeIndex_State(value) - return nil -} -func (CompositeIndex_State) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{9, 0} -} - -type Snapshot_Status int32 - -const ( - Snapshot_INACTIVE Snapshot_Status = 0 - Snapshot_ACTIVE Snapshot_Status = 1 -) - -var Snapshot_Status_name = map[int32]string{ - 0: "INACTIVE", - 1: "ACTIVE", -} -var Snapshot_Status_value = map[string]int32{ - "INACTIVE": 0, - "ACTIVE": 1, -} - -func (x Snapshot_Status) Enum() *Snapshot_Status { - p := new(Snapshot_Status) - *p = x - return p -} -func (x Snapshot_Status) String() string { - return proto.EnumName(Snapshot_Status_name, int32(x)) -} -func (x *Snapshot_Status) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(Snapshot_Status_value, data, "Snapshot_Status") - if err != nil { - return err - } - *x = Snapshot_Status(value) - return nil -} -func (Snapshot_Status) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{12, 0} -} - -type Query_Hint int32 - -const ( - Query_ORDER_FIRST Query_Hint = 1 - Query_ANCESTOR_FIRST Query_Hint = 2 - Query_FILTER_FIRST Query_Hint = 3 -) - -var Query_Hint_name = map[int32]string{ - 1: "ORDER_FIRST", - 2: "ANCESTOR_FIRST", - 3: "FILTER_FIRST", -} -var Query_Hint_value = map[string]int32{ - "ORDER_FIRST": 1, - "ANCESTOR_FIRST": 2, - "FILTER_FIRST": 3, -} - -func (x Query_Hint) Enum() *Query_Hint { - p := new(Query_Hint) - *p = x - return p -} -func (x Query_Hint) String() string { - return proto.EnumName(Query_Hint_name, int32(x)) -} -func (x *Query_Hint) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(Query_Hint_value, data, "Query_Hint") - if err != nil { - return err - } - *x = Query_Hint(value) - return nil -} -func (Query_Hint) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{15, 0} -} - -type Query_Filter_Operator int32 - -const ( - Query_Filter_LESS_THAN Query_Filter_Operator = 1 - Query_Filter_LESS_THAN_OR_EQUAL Query_Filter_Operator = 2 - Query_Filter_GREATER_THAN Query_Filter_Operator = 3 - Query_Filter_GREATER_THAN_OR_EQUAL Query_Filter_Operator = 4 - Query_Filter_EQUAL Query_Filter_Operator = 5 - Query_Filter_IN Query_Filter_Operator = 6 - Query_Filter_EXISTS Query_Filter_Operator = 7 -) - -var Query_Filter_Operator_name = map[int32]string{ - 1: "LESS_THAN", - 2: "LESS_THAN_OR_EQUAL", - 3: "GREATER_THAN", - 4: "GREATER_THAN_OR_EQUAL", - 5: "EQUAL", - 6: "IN", - 7: "EXISTS", -} -var Query_Filter_Operator_value = map[string]int32{ - "LESS_THAN": 1, - "LESS_THAN_OR_EQUAL": 2, - "GREATER_THAN": 3, - "GREATER_THAN_OR_EQUAL": 4, - "EQUAL": 5, - "IN": 6, - "EXISTS": 7, -} - -func (x Query_Filter_Operator) Enum() *Query_Filter_Operator { - p := new(Query_Filter_Operator) - *p = x - return p -} -func (x Query_Filter_Operator) String() string { - return proto.EnumName(Query_Filter_Operator_name, int32(x)) -} -func (x *Query_Filter_Operator) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(Query_Filter_Operator_value, data, "Query_Filter_Operator") - if err != nil { - return err - } - *x = Query_Filter_Operator(value) - return nil -} -func (Query_Filter_Operator) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{15, 0, 0} -} - -type Query_Order_Direction int32 - -const ( - Query_Order_ASCENDING Query_Order_Direction = 1 - Query_Order_DESCENDING Query_Order_Direction = 2 -) - -var Query_Order_Direction_name = map[int32]string{ - 1: "ASCENDING", - 2: "DESCENDING", -} -var Query_Order_Direction_value = map[string]int32{ - "ASCENDING": 1, - "DESCENDING": 2, -} - -func (x Query_Order_Direction) Enum() *Query_Order_Direction { - p := new(Query_Order_Direction) - *p = x - return p -} -func (x Query_Order_Direction) String() string { - return proto.EnumName(Query_Order_Direction_name, int32(x)) -} -func (x *Query_Order_Direction) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(Query_Order_Direction_value, data, "Query_Order_Direction") - if err != nil { - return err - } - *x = Query_Order_Direction(value) - return nil -} -func (Query_Order_Direction) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{15, 1, 0} -} - -type Error_ErrorCode int32 - -const ( - Error_BAD_REQUEST Error_ErrorCode = 1 - Error_CONCURRENT_TRANSACTION Error_ErrorCode = 2 - Error_INTERNAL_ERROR Error_ErrorCode = 3 - Error_NEED_INDEX Error_ErrorCode = 4 - Error_TIMEOUT Error_ErrorCode = 5 - Error_PERMISSION_DENIED Error_ErrorCode = 6 - Error_BIGTABLE_ERROR Error_ErrorCode = 7 - Error_COMMITTED_BUT_STILL_APPLYING Error_ErrorCode = 8 - Error_CAPABILITY_DISABLED Error_ErrorCode = 9 - Error_TRY_ALTERNATE_BACKEND Error_ErrorCode = 10 - Error_SAFE_TIME_TOO_OLD Error_ErrorCode = 11 -) - -var Error_ErrorCode_name = map[int32]string{ - 1: "BAD_REQUEST", - 2: "CONCURRENT_TRANSACTION", - 3: "INTERNAL_ERROR", - 4: "NEED_INDEX", - 5: "TIMEOUT", - 6: "PERMISSION_DENIED", - 7: "BIGTABLE_ERROR", - 8: "COMMITTED_BUT_STILL_APPLYING", - 9: "CAPABILITY_DISABLED", - 10: "TRY_ALTERNATE_BACKEND", - 11: "SAFE_TIME_TOO_OLD", -} -var Error_ErrorCode_value = map[string]int32{ - "BAD_REQUEST": 1, - "CONCURRENT_TRANSACTION": 2, - "INTERNAL_ERROR": 3, - "NEED_INDEX": 4, - "TIMEOUT": 5, - "PERMISSION_DENIED": 6, - "BIGTABLE_ERROR": 7, - "COMMITTED_BUT_STILL_APPLYING": 8, - "CAPABILITY_DISABLED": 9, - "TRY_ALTERNATE_BACKEND": 10, - "SAFE_TIME_TOO_OLD": 11, -} - -func (x Error_ErrorCode) Enum() *Error_ErrorCode { - p := new(Error_ErrorCode) - *p = x - return p -} -func (x Error_ErrorCode) String() string { - return proto.EnumName(Error_ErrorCode_name, int32(x)) -} -func (x *Error_ErrorCode) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(Error_ErrorCode_value, data, "Error_ErrorCode") - if err != nil { - return err - } - *x = Error_ErrorCode(value) - return nil -} -func (Error_ErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{19, 0} -} - -type PutRequest_AutoIdPolicy int32 - -const ( - PutRequest_CURRENT PutRequest_AutoIdPolicy = 0 - PutRequest_SEQUENTIAL PutRequest_AutoIdPolicy = 1 -) - -var PutRequest_AutoIdPolicy_name = map[int32]string{ - 0: "CURRENT", - 1: "SEQUENTIAL", -} -var PutRequest_AutoIdPolicy_value = map[string]int32{ - "CURRENT": 0, - "SEQUENTIAL": 1, -} - -func (x PutRequest_AutoIdPolicy) Enum() *PutRequest_AutoIdPolicy { - p := new(PutRequest_AutoIdPolicy) - *p = x - return p -} -func (x PutRequest_AutoIdPolicy) String() string { - return proto.EnumName(PutRequest_AutoIdPolicy_name, int32(x)) -} -func (x *PutRequest_AutoIdPolicy) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(PutRequest_AutoIdPolicy_value, data, "PutRequest_AutoIdPolicy") - if err != nil { - return err - } - *x = PutRequest_AutoIdPolicy(value) - return nil -} -func (PutRequest_AutoIdPolicy) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{23, 0} -} - -type BeginTransactionRequest_TransactionMode int32 - -const ( - BeginTransactionRequest_UNKNOWN BeginTransactionRequest_TransactionMode = 0 - BeginTransactionRequest_READ_ONLY BeginTransactionRequest_TransactionMode = 1 - BeginTransactionRequest_READ_WRITE BeginTransactionRequest_TransactionMode = 2 -) - -var BeginTransactionRequest_TransactionMode_name = map[int32]string{ - 0: "UNKNOWN", - 1: "READ_ONLY", - 2: "READ_WRITE", -} -var BeginTransactionRequest_TransactionMode_value = map[string]int32{ - "UNKNOWN": 0, - "READ_ONLY": 1, - "READ_WRITE": 2, -} - -func (x BeginTransactionRequest_TransactionMode) Enum() *BeginTransactionRequest_TransactionMode { - p := new(BeginTransactionRequest_TransactionMode) - *p = x - return p -} -func (x BeginTransactionRequest_TransactionMode) String() string { - return proto.EnumName(BeginTransactionRequest_TransactionMode_name, int32(x)) -} -func (x *BeginTransactionRequest_TransactionMode) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(BeginTransactionRequest_TransactionMode_value, data, "BeginTransactionRequest_TransactionMode") - if err != nil { - return err - } - *x = BeginTransactionRequest_TransactionMode(value) - return nil -} -func (BeginTransactionRequest_TransactionMode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{36, 0} -} - -type Action struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Action) Reset() { *m = Action{} } -func (m *Action) String() string { return proto.CompactTextString(m) } -func (*Action) ProtoMessage() {} -func (*Action) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{0} -} -func (m *Action) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Action.Unmarshal(m, b) -} -func (m *Action) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Action.Marshal(b, m, deterministic) -} -func (dst *Action) XXX_Merge(src proto.Message) { - xxx_messageInfo_Action.Merge(dst, src) -} -func (m *Action) XXX_Size() int { - return xxx_messageInfo_Action.Size(m) -} -func (m *Action) XXX_DiscardUnknown() { - xxx_messageInfo_Action.DiscardUnknown(m) -} - -var xxx_messageInfo_Action proto.InternalMessageInfo - -type PropertyValue struct { - Int64Value *int64 `protobuf:"varint,1,opt,name=int64Value" json:"int64Value,omitempty"` - BooleanValue *bool `protobuf:"varint,2,opt,name=booleanValue" json:"booleanValue,omitempty"` - StringValue *string `protobuf:"bytes,3,opt,name=stringValue" json:"stringValue,omitempty"` - DoubleValue *float64 `protobuf:"fixed64,4,opt,name=doubleValue" json:"doubleValue,omitempty"` - Pointvalue *PropertyValue_PointValue `protobuf:"group,5,opt,name=PointValue,json=pointvalue" json:"pointvalue,omitempty"` - Uservalue *PropertyValue_UserValue `protobuf:"group,8,opt,name=UserValue,json=uservalue" json:"uservalue,omitempty"` - Referencevalue *PropertyValue_ReferenceValue `protobuf:"group,12,opt,name=ReferenceValue,json=referencevalue" json:"referencevalue,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *PropertyValue) Reset() { *m = PropertyValue{} } -func (m *PropertyValue) String() string { return proto.CompactTextString(m) } -func (*PropertyValue) ProtoMessage() {} -func (*PropertyValue) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{1} -} -func (m *PropertyValue) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_PropertyValue.Unmarshal(m, b) -} -func (m *PropertyValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_PropertyValue.Marshal(b, m, deterministic) -} -func (dst *PropertyValue) XXX_Merge(src proto.Message) { - xxx_messageInfo_PropertyValue.Merge(dst, src) -} -func (m *PropertyValue) XXX_Size() int { - return xxx_messageInfo_PropertyValue.Size(m) -} -func (m *PropertyValue) XXX_DiscardUnknown() { - xxx_messageInfo_PropertyValue.DiscardUnknown(m) -} - -var xxx_messageInfo_PropertyValue proto.InternalMessageInfo - -func (m *PropertyValue) GetInt64Value() int64 { - if m != nil && m.Int64Value != nil { - return *m.Int64Value - } - return 0 -} - -func (m *PropertyValue) GetBooleanValue() bool { - if m != nil && m.BooleanValue != nil { - return *m.BooleanValue - } - return false -} - -func (m *PropertyValue) GetStringValue() string { - if m != nil && m.StringValue != nil { - return *m.StringValue - } - return "" -} - -func (m *PropertyValue) GetDoubleValue() float64 { - if m != nil && m.DoubleValue != nil { - return *m.DoubleValue - } - return 0 -} - -func (m *PropertyValue) GetPointvalue() *PropertyValue_PointValue { - if m != nil { - return m.Pointvalue - } - return nil -} - -func (m *PropertyValue) GetUservalue() *PropertyValue_UserValue { - if m != nil { - return m.Uservalue - } - return nil -} - -func (m *PropertyValue) GetReferencevalue() *PropertyValue_ReferenceValue { - if m != nil { - return m.Referencevalue - } - return nil -} - -type PropertyValue_PointValue struct { - X *float64 `protobuf:"fixed64,6,req,name=x" json:"x,omitempty"` - Y *float64 `protobuf:"fixed64,7,req,name=y" json:"y,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *PropertyValue_PointValue) Reset() { *m = PropertyValue_PointValue{} } -func (m *PropertyValue_PointValue) String() string { return proto.CompactTextString(m) } -func (*PropertyValue_PointValue) ProtoMessage() {} -func (*PropertyValue_PointValue) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{1, 0} -} -func (m *PropertyValue_PointValue) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_PropertyValue_PointValue.Unmarshal(m, b) -} -func (m *PropertyValue_PointValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_PropertyValue_PointValue.Marshal(b, m, deterministic) -} -func (dst *PropertyValue_PointValue) XXX_Merge(src proto.Message) { - xxx_messageInfo_PropertyValue_PointValue.Merge(dst, src) -} -func (m *PropertyValue_PointValue) XXX_Size() int { - return xxx_messageInfo_PropertyValue_PointValue.Size(m) -} -func (m *PropertyValue_PointValue) XXX_DiscardUnknown() { - xxx_messageInfo_PropertyValue_PointValue.DiscardUnknown(m) -} - -var xxx_messageInfo_PropertyValue_PointValue proto.InternalMessageInfo - -func (m *PropertyValue_PointValue) GetX() float64 { - if m != nil && m.X != nil { - return *m.X - } - return 0 -} - -func (m *PropertyValue_PointValue) GetY() float64 { - if m != nil && m.Y != nil { - return *m.Y - } - return 0 -} - -type PropertyValue_UserValue struct { - Email *string `protobuf:"bytes,9,req,name=email" json:"email,omitempty"` - AuthDomain *string `protobuf:"bytes,10,req,name=auth_domain,json=authDomain" json:"auth_domain,omitempty"` - Nickname *string `protobuf:"bytes,11,opt,name=nickname" json:"nickname,omitempty"` - FederatedIdentity *string `protobuf:"bytes,21,opt,name=federated_identity,json=federatedIdentity" json:"federated_identity,omitempty"` - FederatedProvider *string `protobuf:"bytes,22,opt,name=federated_provider,json=federatedProvider" json:"federated_provider,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *PropertyValue_UserValue) Reset() { *m = PropertyValue_UserValue{} } -func (m *PropertyValue_UserValue) String() string { return proto.CompactTextString(m) } -func (*PropertyValue_UserValue) ProtoMessage() {} -func (*PropertyValue_UserValue) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{1, 1} -} -func (m *PropertyValue_UserValue) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_PropertyValue_UserValue.Unmarshal(m, b) -} -func (m *PropertyValue_UserValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_PropertyValue_UserValue.Marshal(b, m, deterministic) -} -func (dst *PropertyValue_UserValue) XXX_Merge(src proto.Message) { - xxx_messageInfo_PropertyValue_UserValue.Merge(dst, src) -} -func (m *PropertyValue_UserValue) XXX_Size() int { - return xxx_messageInfo_PropertyValue_UserValue.Size(m) -} -func (m *PropertyValue_UserValue) XXX_DiscardUnknown() { - xxx_messageInfo_PropertyValue_UserValue.DiscardUnknown(m) -} - -var xxx_messageInfo_PropertyValue_UserValue proto.InternalMessageInfo - -func (m *PropertyValue_UserValue) GetEmail() string { - if m != nil && m.Email != nil { - return *m.Email - } - return "" -} - -func (m *PropertyValue_UserValue) GetAuthDomain() string { - if m != nil && m.AuthDomain != nil { - return *m.AuthDomain - } - return "" -} - -func (m *PropertyValue_UserValue) GetNickname() string { - if m != nil && m.Nickname != nil { - return *m.Nickname - } - return "" -} - -func (m *PropertyValue_UserValue) GetFederatedIdentity() string { - if m != nil && m.FederatedIdentity != nil { - return *m.FederatedIdentity - } - return "" -} - -func (m *PropertyValue_UserValue) GetFederatedProvider() string { - if m != nil && m.FederatedProvider != nil { - return *m.FederatedProvider - } - return "" -} - -type PropertyValue_ReferenceValue struct { - App *string `protobuf:"bytes,13,req,name=app" json:"app,omitempty"` - NameSpace *string `protobuf:"bytes,20,opt,name=name_space,json=nameSpace" json:"name_space,omitempty"` - Pathelement []*PropertyValue_ReferenceValue_PathElement `protobuf:"group,14,rep,name=PathElement,json=pathelement" json:"pathelement,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *PropertyValue_ReferenceValue) Reset() { *m = PropertyValue_ReferenceValue{} } -func (m *PropertyValue_ReferenceValue) String() string { return proto.CompactTextString(m) } -func (*PropertyValue_ReferenceValue) ProtoMessage() {} -func (*PropertyValue_ReferenceValue) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{1, 2} -} -func (m *PropertyValue_ReferenceValue) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_PropertyValue_ReferenceValue.Unmarshal(m, b) -} -func (m *PropertyValue_ReferenceValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_PropertyValue_ReferenceValue.Marshal(b, m, deterministic) -} -func (dst *PropertyValue_ReferenceValue) XXX_Merge(src proto.Message) { - xxx_messageInfo_PropertyValue_ReferenceValue.Merge(dst, src) -} -func (m *PropertyValue_ReferenceValue) XXX_Size() int { - return xxx_messageInfo_PropertyValue_ReferenceValue.Size(m) -} -func (m *PropertyValue_ReferenceValue) XXX_DiscardUnknown() { - xxx_messageInfo_PropertyValue_ReferenceValue.DiscardUnknown(m) -} - -var xxx_messageInfo_PropertyValue_ReferenceValue proto.InternalMessageInfo - -func (m *PropertyValue_ReferenceValue) GetApp() string { - if m != nil && m.App != nil { - return *m.App - } - return "" -} - -func (m *PropertyValue_ReferenceValue) GetNameSpace() string { - if m != nil && m.NameSpace != nil { - return *m.NameSpace - } - return "" -} - -func (m *PropertyValue_ReferenceValue) GetPathelement() []*PropertyValue_ReferenceValue_PathElement { - if m != nil { - return m.Pathelement - } - return nil -} - -type PropertyValue_ReferenceValue_PathElement struct { - Type *string `protobuf:"bytes,15,req,name=type" json:"type,omitempty"` - Id *int64 `protobuf:"varint,16,opt,name=id" json:"id,omitempty"` - Name *string `protobuf:"bytes,17,opt,name=name" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *PropertyValue_ReferenceValue_PathElement) Reset() { - *m = PropertyValue_ReferenceValue_PathElement{} -} -func (m *PropertyValue_ReferenceValue_PathElement) String() string { return proto.CompactTextString(m) } -func (*PropertyValue_ReferenceValue_PathElement) ProtoMessage() {} -func (*PropertyValue_ReferenceValue_PathElement) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{1, 2, 0} -} -func (m *PropertyValue_ReferenceValue_PathElement) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_PropertyValue_ReferenceValue_PathElement.Unmarshal(m, b) -} -func (m *PropertyValue_ReferenceValue_PathElement) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_PropertyValue_ReferenceValue_PathElement.Marshal(b, m, deterministic) -} -func (dst *PropertyValue_ReferenceValue_PathElement) XXX_Merge(src proto.Message) { - xxx_messageInfo_PropertyValue_ReferenceValue_PathElement.Merge(dst, src) -} -func (m *PropertyValue_ReferenceValue_PathElement) XXX_Size() int { - return xxx_messageInfo_PropertyValue_ReferenceValue_PathElement.Size(m) -} -func (m *PropertyValue_ReferenceValue_PathElement) XXX_DiscardUnknown() { - xxx_messageInfo_PropertyValue_ReferenceValue_PathElement.DiscardUnknown(m) -} - -var xxx_messageInfo_PropertyValue_ReferenceValue_PathElement proto.InternalMessageInfo - -func (m *PropertyValue_ReferenceValue_PathElement) GetType() string { - if m != nil && m.Type != nil { - return *m.Type - } - return "" -} - -func (m *PropertyValue_ReferenceValue_PathElement) GetId() int64 { - if m != nil && m.Id != nil { - return *m.Id - } - return 0 -} - -func (m *PropertyValue_ReferenceValue_PathElement) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -type Property struct { - Meaning *Property_Meaning `protobuf:"varint,1,opt,name=meaning,enum=appengine.Property_Meaning,def=0" json:"meaning,omitempty"` - MeaningUri *string `protobuf:"bytes,2,opt,name=meaning_uri,json=meaningUri" json:"meaning_uri,omitempty"` - Name *string `protobuf:"bytes,3,req,name=name" json:"name,omitempty"` - Value *PropertyValue `protobuf:"bytes,5,req,name=value" json:"value,omitempty"` - Multiple *bool `protobuf:"varint,4,req,name=multiple" json:"multiple,omitempty"` - Searchable *bool `protobuf:"varint,6,opt,name=searchable,def=0" json:"searchable,omitempty"` - FtsTokenizationOption *Property_FtsTokenizationOption `protobuf:"varint,8,opt,name=fts_tokenization_option,json=ftsTokenizationOption,enum=appengine.Property_FtsTokenizationOption" json:"fts_tokenization_option,omitempty"` - Locale *string `protobuf:"bytes,9,opt,name=locale,def=en" json:"locale,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Property) Reset() { *m = Property{} } -func (m *Property) String() string { return proto.CompactTextString(m) } -func (*Property) ProtoMessage() {} -func (*Property) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{2} -} -func (m *Property) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Property.Unmarshal(m, b) -} -func (m *Property) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Property.Marshal(b, m, deterministic) -} -func (dst *Property) XXX_Merge(src proto.Message) { - xxx_messageInfo_Property.Merge(dst, src) -} -func (m *Property) XXX_Size() int { - return xxx_messageInfo_Property.Size(m) -} -func (m *Property) XXX_DiscardUnknown() { - xxx_messageInfo_Property.DiscardUnknown(m) -} - -var xxx_messageInfo_Property proto.InternalMessageInfo - -const Default_Property_Meaning Property_Meaning = Property_NO_MEANING -const Default_Property_Searchable bool = false -const Default_Property_Locale string = "en" - -func (m *Property) GetMeaning() Property_Meaning { - if m != nil && m.Meaning != nil { - return *m.Meaning - } - return Default_Property_Meaning -} - -func (m *Property) GetMeaningUri() string { - if m != nil && m.MeaningUri != nil { - return *m.MeaningUri - } - return "" -} - -func (m *Property) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *Property) GetValue() *PropertyValue { - if m != nil { - return m.Value - } - return nil -} - -func (m *Property) GetMultiple() bool { - if m != nil && m.Multiple != nil { - return *m.Multiple - } - return false -} - -func (m *Property) GetSearchable() bool { - if m != nil && m.Searchable != nil { - return *m.Searchable - } - return Default_Property_Searchable -} - -func (m *Property) GetFtsTokenizationOption() Property_FtsTokenizationOption { - if m != nil && m.FtsTokenizationOption != nil { - return *m.FtsTokenizationOption - } - return Property_HTML -} - -func (m *Property) GetLocale() string { - if m != nil && m.Locale != nil { - return *m.Locale - } - return Default_Property_Locale -} - -type Path struct { - Element []*Path_Element `protobuf:"group,1,rep,name=Element,json=element" json:"element,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Path) Reset() { *m = Path{} } -func (m *Path) String() string { return proto.CompactTextString(m) } -func (*Path) ProtoMessage() {} -func (*Path) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{3} -} -func (m *Path) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Path.Unmarshal(m, b) -} -func (m *Path) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Path.Marshal(b, m, deterministic) -} -func (dst *Path) XXX_Merge(src proto.Message) { - xxx_messageInfo_Path.Merge(dst, src) -} -func (m *Path) XXX_Size() int { - return xxx_messageInfo_Path.Size(m) -} -func (m *Path) XXX_DiscardUnknown() { - xxx_messageInfo_Path.DiscardUnknown(m) -} - -var xxx_messageInfo_Path proto.InternalMessageInfo - -func (m *Path) GetElement() []*Path_Element { - if m != nil { - return m.Element - } - return nil -} - -type Path_Element struct { - Type *string `protobuf:"bytes,2,req,name=type" json:"type,omitempty"` - Id *int64 `protobuf:"varint,3,opt,name=id" json:"id,omitempty"` - Name *string `protobuf:"bytes,4,opt,name=name" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Path_Element) Reset() { *m = Path_Element{} } -func (m *Path_Element) String() string { return proto.CompactTextString(m) } -func (*Path_Element) ProtoMessage() {} -func (*Path_Element) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{3, 0} -} -func (m *Path_Element) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Path_Element.Unmarshal(m, b) -} -func (m *Path_Element) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Path_Element.Marshal(b, m, deterministic) -} -func (dst *Path_Element) XXX_Merge(src proto.Message) { - xxx_messageInfo_Path_Element.Merge(dst, src) -} -func (m *Path_Element) XXX_Size() int { - return xxx_messageInfo_Path_Element.Size(m) -} -func (m *Path_Element) XXX_DiscardUnknown() { - xxx_messageInfo_Path_Element.DiscardUnknown(m) -} - -var xxx_messageInfo_Path_Element proto.InternalMessageInfo - -func (m *Path_Element) GetType() string { - if m != nil && m.Type != nil { - return *m.Type - } - return "" -} - -func (m *Path_Element) GetId() int64 { - if m != nil && m.Id != nil { - return *m.Id - } - return 0 -} - -func (m *Path_Element) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -type Reference struct { - App *string `protobuf:"bytes,13,req,name=app" json:"app,omitempty"` - NameSpace *string `protobuf:"bytes,20,opt,name=name_space,json=nameSpace" json:"name_space,omitempty"` - Path *Path `protobuf:"bytes,14,req,name=path" json:"path,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Reference) Reset() { *m = Reference{} } -func (m *Reference) String() string { return proto.CompactTextString(m) } -func (*Reference) ProtoMessage() {} -func (*Reference) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{4} -} -func (m *Reference) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Reference.Unmarshal(m, b) -} -func (m *Reference) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Reference.Marshal(b, m, deterministic) -} -func (dst *Reference) XXX_Merge(src proto.Message) { - xxx_messageInfo_Reference.Merge(dst, src) -} -func (m *Reference) XXX_Size() int { - return xxx_messageInfo_Reference.Size(m) -} -func (m *Reference) XXX_DiscardUnknown() { - xxx_messageInfo_Reference.DiscardUnknown(m) -} - -var xxx_messageInfo_Reference proto.InternalMessageInfo - -func (m *Reference) GetApp() string { - if m != nil && m.App != nil { - return *m.App - } - return "" -} - -func (m *Reference) GetNameSpace() string { - if m != nil && m.NameSpace != nil { - return *m.NameSpace - } - return "" -} - -func (m *Reference) GetPath() *Path { - if m != nil { - return m.Path - } - return nil -} - -type User struct { - Email *string `protobuf:"bytes,1,req,name=email" json:"email,omitempty"` - AuthDomain *string `protobuf:"bytes,2,req,name=auth_domain,json=authDomain" json:"auth_domain,omitempty"` - Nickname *string `protobuf:"bytes,3,opt,name=nickname" json:"nickname,omitempty"` - FederatedIdentity *string `protobuf:"bytes,6,opt,name=federated_identity,json=federatedIdentity" json:"federated_identity,omitempty"` - FederatedProvider *string `protobuf:"bytes,7,opt,name=federated_provider,json=federatedProvider" json:"federated_provider,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *User) Reset() { *m = User{} } -func (m *User) String() string { return proto.CompactTextString(m) } -func (*User) ProtoMessage() {} -func (*User) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{5} -} -func (m *User) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_User.Unmarshal(m, b) -} -func (m *User) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_User.Marshal(b, m, deterministic) -} -func (dst *User) XXX_Merge(src proto.Message) { - xxx_messageInfo_User.Merge(dst, src) -} -func (m *User) XXX_Size() int { - return xxx_messageInfo_User.Size(m) -} -func (m *User) XXX_DiscardUnknown() { - xxx_messageInfo_User.DiscardUnknown(m) -} - -var xxx_messageInfo_User proto.InternalMessageInfo - -func (m *User) GetEmail() string { - if m != nil && m.Email != nil { - return *m.Email - } - return "" -} - -func (m *User) GetAuthDomain() string { - if m != nil && m.AuthDomain != nil { - return *m.AuthDomain - } - return "" -} - -func (m *User) GetNickname() string { - if m != nil && m.Nickname != nil { - return *m.Nickname - } - return "" -} - -func (m *User) GetFederatedIdentity() string { - if m != nil && m.FederatedIdentity != nil { - return *m.FederatedIdentity - } - return "" -} - -func (m *User) GetFederatedProvider() string { - if m != nil && m.FederatedProvider != nil { - return *m.FederatedProvider - } - return "" -} - -type EntityProto struct { - Key *Reference `protobuf:"bytes,13,req,name=key" json:"key,omitempty"` - EntityGroup *Path `protobuf:"bytes,16,req,name=entity_group,json=entityGroup" json:"entity_group,omitempty"` - Owner *User `protobuf:"bytes,17,opt,name=owner" json:"owner,omitempty"` - Kind *EntityProto_Kind `protobuf:"varint,4,opt,name=kind,enum=appengine.EntityProto_Kind" json:"kind,omitempty"` - KindUri *string `protobuf:"bytes,5,opt,name=kind_uri,json=kindUri" json:"kind_uri,omitempty"` - Property []*Property `protobuf:"bytes,14,rep,name=property" json:"property,omitempty"` - RawProperty []*Property `protobuf:"bytes,15,rep,name=raw_property,json=rawProperty" json:"raw_property,omitempty"` - Rank *int32 `protobuf:"varint,18,opt,name=rank" json:"rank,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *EntityProto) Reset() { *m = EntityProto{} } -func (m *EntityProto) String() string { return proto.CompactTextString(m) } -func (*EntityProto) ProtoMessage() {} -func (*EntityProto) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{6} -} -func (m *EntityProto) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_EntityProto.Unmarshal(m, b) -} -func (m *EntityProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_EntityProto.Marshal(b, m, deterministic) -} -func (dst *EntityProto) XXX_Merge(src proto.Message) { - xxx_messageInfo_EntityProto.Merge(dst, src) -} -func (m *EntityProto) XXX_Size() int { - return xxx_messageInfo_EntityProto.Size(m) -} -func (m *EntityProto) XXX_DiscardUnknown() { - xxx_messageInfo_EntityProto.DiscardUnknown(m) -} - -var xxx_messageInfo_EntityProto proto.InternalMessageInfo - -func (m *EntityProto) GetKey() *Reference { - if m != nil { - return m.Key - } - return nil -} - -func (m *EntityProto) GetEntityGroup() *Path { - if m != nil { - return m.EntityGroup - } - return nil -} - -func (m *EntityProto) GetOwner() *User { - if m != nil { - return m.Owner - } - return nil -} - -func (m *EntityProto) GetKind() EntityProto_Kind { - if m != nil && m.Kind != nil { - return *m.Kind - } - return EntityProto_GD_CONTACT -} - -func (m *EntityProto) GetKindUri() string { - if m != nil && m.KindUri != nil { - return *m.KindUri - } - return "" -} - -func (m *EntityProto) GetProperty() []*Property { - if m != nil { - return m.Property - } - return nil -} - -func (m *EntityProto) GetRawProperty() []*Property { - if m != nil { - return m.RawProperty - } - return nil -} - -func (m *EntityProto) GetRank() int32 { - if m != nil && m.Rank != nil { - return *m.Rank - } - return 0 -} - -type CompositeProperty struct { - IndexId *int64 `protobuf:"varint,1,req,name=index_id,json=indexId" json:"index_id,omitempty"` - Value []string `protobuf:"bytes,2,rep,name=value" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CompositeProperty) Reset() { *m = CompositeProperty{} } -func (m *CompositeProperty) String() string { return proto.CompactTextString(m) } -func (*CompositeProperty) ProtoMessage() {} -func (*CompositeProperty) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{7} -} -func (m *CompositeProperty) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CompositeProperty.Unmarshal(m, b) -} -func (m *CompositeProperty) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CompositeProperty.Marshal(b, m, deterministic) -} -func (dst *CompositeProperty) XXX_Merge(src proto.Message) { - xxx_messageInfo_CompositeProperty.Merge(dst, src) -} -func (m *CompositeProperty) XXX_Size() int { - return xxx_messageInfo_CompositeProperty.Size(m) -} -func (m *CompositeProperty) XXX_DiscardUnknown() { - xxx_messageInfo_CompositeProperty.DiscardUnknown(m) -} - -var xxx_messageInfo_CompositeProperty proto.InternalMessageInfo - -func (m *CompositeProperty) GetIndexId() int64 { - if m != nil && m.IndexId != nil { - return *m.IndexId - } - return 0 -} - -func (m *CompositeProperty) GetValue() []string { - if m != nil { - return m.Value - } - return nil -} - -type Index struct { - EntityType *string `protobuf:"bytes,1,req,name=entity_type,json=entityType" json:"entity_type,omitempty"` - Ancestor *bool `protobuf:"varint,5,req,name=ancestor" json:"ancestor,omitempty"` - Property []*Index_Property `protobuf:"group,2,rep,name=Property,json=property" json:"property,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Index) Reset() { *m = Index{} } -func (m *Index) String() string { return proto.CompactTextString(m) } -func (*Index) ProtoMessage() {} -func (*Index) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{8} -} -func (m *Index) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Index.Unmarshal(m, b) -} -func (m *Index) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Index.Marshal(b, m, deterministic) -} -func (dst *Index) XXX_Merge(src proto.Message) { - xxx_messageInfo_Index.Merge(dst, src) -} -func (m *Index) XXX_Size() int { - return xxx_messageInfo_Index.Size(m) -} -func (m *Index) XXX_DiscardUnknown() { - xxx_messageInfo_Index.DiscardUnknown(m) -} - -var xxx_messageInfo_Index proto.InternalMessageInfo - -func (m *Index) GetEntityType() string { - if m != nil && m.EntityType != nil { - return *m.EntityType - } - return "" -} - -func (m *Index) GetAncestor() bool { - if m != nil && m.Ancestor != nil { - return *m.Ancestor - } - return false -} - -func (m *Index) GetProperty() []*Index_Property { - if m != nil { - return m.Property - } - return nil -} - -type Index_Property struct { - Name *string `protobuf:"bytes,3,req,name=name" json:"name,omitempty"` - Direction *Index_Property_Direction `protobuf:"varint,4,opt,name=direction,enum=appengine.Index_Property_Direction,def=1" json:"direction,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Index_Property) Reset() { *m = Index_Property{} } -func (m *Index_Property) String() string { return proto.CompactTextString(m) } -func (*Index_Property) ProtoMessage() {} -func (*Index_Property) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{8, 0} -} -func (m *Index_Property) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Index_Property.Unmarshal(m, b) -} -func (m *Index_Property) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Index_Property.Marshal(b, m, deterministic) -} -func (dst *Index_Property) XXX_Merge(src proto.Message) { - xxx_messageInfo_Index_Property.Merge(dst, src) -} -func (m *Index_Property) XXX_Size() int { - return xxx_messageInfo_Index_Property.Size(m) -} -func (m *Index_Property) XXX_DiscardUnknown() { - xxx_messageInfo_Index_Property.DiscardUnknown(m) -} - -var xxx_messageInfo_Index_Property proto.InternalMessageInfo - -const Default_Index_Property_Direction Index_Property_Direction = Index_Property_ASCENDING - -func (m *Index_Property) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *Index_Property) GetDirection() Index_Property_Direction { - if m != nil && m.Direction != nil { - return *m.Direction - } - return Default_Index_Property_Direction -} - -type CompositeIndex struct { - AppId *string `protobuf:"bytes,1,req,name=app_id,json=appId" json:"app_id,omitempty"` - Id *int64 `protobuf:"varint,2,req,name=id" json:"id,omitempty"` - Definition *Index `protobuf:"bytes,3,req,name=definition" json:"definition,omitempty"` - State *CompositeIndex_State `protobuf:"varint,4,req,name=state,enum=appengine.CompositeIndex_State" json:"state,omitempty"` - OnlyUseIfRequired *bool `protobuf:"varint,6,opt,name=only_use_if_required,json=onlyUseIfRequired,def=0" json:"only_use_if_required,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CompositeIndex) Reset() { *m = CompositeIndex{} } -func (m *CompositeIndex) String() string { return proto.CompactTextString(m) } -func (*CompositeIndex) ProtoMessage() {} -func (*CompositeIndex) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{9} -} -func (m *CompositeIndex) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CompositeIndex.Unmarshal(m, b) -} -func (m *CompositeIndex) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CompositeIndex.Marshal(b, m, deterministic) -} -func (dst *CompositeIndex) XXX_Merge(src proto.Message) { - xxx_messageInfo_CompositeIndex.Merge(dst, src) -} -func (m *CompositeIndex) XXX_Size() int { - return xxx_messageInfo_CompositeIndex.Size(m) -} -func (m *CompositeIndex) XXX_DiscardUnknown() { - xxx_messageInfo_CompositeIndex.DiscardUnknown(m) -} - -var xxx_messageInfo_CompositeIndex proto.InternalMessageInfo - -const Default_CompositeIndex_OnlyUseIfRequired bool = false - -func (m *CompositeIndex) GetAppId() string { - if m != nil && m.AppId != nil { - return *m.AppId - } - return "" -} - -func (m *CompositeIndex) GetId() int64 { - if m != nil && m.Id != nil { - return *m.Id - } - return 0 -} - -func (m *CompositeIndex) GetDefinition() *Index { - if m != nil { - return m.Definition - } - return nil -} - -func (m *CompositeIndex) GetState() CompositeIndex_State { - if m != nil && m.State != nil { - return *m.State - } - return CompositeIndex_WRITE_ONLY -} - -func (m *CompositeIndex) GetOnlyUseIfRequired() bool { - if m != nil && m.OnlyUseIfRequired != nil { - return *m.OnlyUseIfRequired - } - return Default_CompositeIndex_OnlyUseIfRequired -} - -type IndexPostfix struct { - IndexValue []*IndexPostfix_IndexValue `protobuf:"bytes,1,rep,name=index_value,json=indexValue" json:"index_value,omitempty"` - Key *Reference `protobuf:"bytes,2,opt,name=key" json:"key,omitempty"` - Before *bool `protobuf:"varint,3,opt,name=before,def=1" json:"before,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *IndexPostfix) Reset() { *m = IndexPostfix{} } -func (m *IndexPostfix) String() string { return proto.CompactTextString(m) } -func (*IndexPostfix) ProtoMessage() {} -func (*IndexPostfix) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{10} -} -func (m *IndexPostfix) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_IndexPostfix.Unmarshal(m, b) -} -func (m *IndexPostfix) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_IndexPostfix.Marshal(b, m, deterministic) -} -func (dst *IndexPostfix) XXX_Merge(src proto.Message) { - xxx_messageInfo_IndexPostfix.Merge(dst, src) -} -func (m *IndexPostfix) XXX_Size() int { - return xxx_messageInfo_IndexPostfix.Size(m) -} -func (m *IndexPostfix) XXX_DiscardUnknown() { - xxx_messageInfo_IndexPostfix.DiscardUnknown(m) -} - -var xxx_messageInfo_IndexPostfix proto.InternalMessageInfo - -const Default_IndexPostfix_Before bool = true - -func (m *IndexPostfix) GetIndexValue() []*IndexPostfix_IndexValue { - if m != nil { - return m.IndexValue - } - return nil -} - -func (m *IndexPostfix) GetKey() *Reference { - if m != nil { - return m.Key - } - return nil -} - -func (m *IndexPostfix) GetBefore() bool { - if m != nil && m.Before != nil { - return *m.Before - } - return Default_IndexPostfix_Before -} - -type IndexPostfix_IndexValue struct { - PropertyName *string `protobuf:"bytes,1,req,name=property_name,json=propertyName" json:"property_name,omitempty"` - Value *PropertyValue `protobuf:"bytes,2,req,name=value" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *IndexPostfix_IndexValue) Reset() { *m = IndexPostfix_IndexValue{} } -func (m *IndexPostfix_IndexValue) String() string { return proto.CompactTextString(m) } -func (*IndexPostfix_IndexValue) ProtoMessage() {} -func (*IndexPostfix_IndexValue) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{10, 0} -} -func (m *IndexPostfix_IndexValue) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_IndexPostfix_IndexValue.Unmarshal(m, b) -} -func (m *IndexPostfix_IndexValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_IndexPostfix_IndexValue.Marshal(b, m, deterministic) -} -func (dst *IndexPostfix_IndexValue) XXX_Merge(src proto.Message) { - xxx_messageInfo_IndexPostfix_IndexValue.Merge(dst, src) -} -func (m *IndexPostfix_IndexValue) XXX_Size() int { - return xxx_messageInfo_IndexPostfix_IndexValue.Size(m) -} -func (m *IndexPostfix_IndexValue) XXX_DiscardUnknown() { - xxx_messageInfo_IndexPostfix_IndexValue.DiscardUnknown(m) -} - -var xxx_messageInfo_IndexPostfix_IndexValue proto.InternalMessageInfo - -func (m *IndexPostfix_IndexValue) GetPropertyName() string { - if m != nil && m.PropertyName != nil { - return *m.PropertyName - } - return "" -} - -func (m *IndexPostfix_IndexValue) GetValue() *PropertyValue { - if m != nil { - return m.Value - } - return nil -} - -type IndexPosition struct { - Key *string `protobuf:"bytes,1,opt,name=key" json:"key,omitempty"` - Before *bool `protobuf:"varint,2,opt,name=before,def=1" json:"before,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *IndexPosition) Reset() { *m = IndexPosition{} } -func (m *IndexPosition) String() string { return proto.CompactTextString(m) } -func (*IndexPosition) ProtoMessage() {} -func (*IndexPosition) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{11} -} -func (m *IndexPosition) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_IndexPosition.Unmarshal(m, b) -} -func (m *IndexPosition) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_IndexPosition.Marshal(b, m, deterministic) -} -func (dst *IndexPosition) XXX_Merge(src proto.Message) { - xxx_messageInfo_IndexPosition.Merge(dst, src) -} -func (m *IndexPosition) XXX_Size() int { - return xxx_messageInfo_IndexPosition.Size(m) -} -func (m *IndexPosition) XXX_DiscardUnknown() { - xxx_messageInfo_IndexPosition.DiscardUnknown(m) -} - -var xxx_messageInfo_IndexPosition proto.InternalMessageInfo - -const Default_IndexPosition_Before bool = true - -func (m *IndexPosition) GetKey() string { - if m != nil && m.Key != nil { - return *m.Key - } - return "" -} - -func (m *IndexPosition) GetBefore() bool { - if m != nil && m.Before != nil { - return *m.Before - } - return Default_IndexPosition_Before -} - -type Snapshot struct { - Ts *int64 `protobuf:"varint,1,req,name=ts" json:"ts,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Snapshot) Reset() { *m = Snapshot{} } -func (m *Snapshot) String() string { return proto.CompactTextString(m) } -func (*Snapshot) ProtoMessage() {} -func (*Snapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{12} -} -func (m *Snapshot) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Snapshot.Unmarshal(m, b) -} -func (m *Snapshot) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Snapshot.Marshal(b, m, deterministic) -} -func (dst *Snapshot) XXX_Merge(src proto.Message) { - xxx_messageInfo_Snapshot.Merge(dst, src) -} -func (m *Snapshot) XXX_Size() int { - return xxx_messageInfo_Snapshot.Size(m) -} -func (m *Snapshot) XXX_DiscardUnknown() { - xxx_messageInfo_Snapshot.DiscardUnknown(m) -} - -var xxx_messageInfo_Snapshot proto.InternalMessageInfo - -func (m *Snapshot) GetTs() int64 { - if m != nil && m.Ts != nil { - return *m.Ts - } - return 0 -} - -type InternalHeader struct { - Qos *string `protobuf:"bytes,1,opt,name=qos" json:"qos,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *InternalHeader) Reset() { *m = InternalHeader{} } -func (m *InternalHeader) String() string { return proto.CompactTextString(m) } -func (*InternalHeader) ProtoMessage() {} -func (*InternalHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{13} -} -func (m *InternalHeader) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_InternalHeader.Unmarshal(m, b) -} -func (m *InternalHeader) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_InternalHeader.Marshal(b, m, deterministic) -} -func (dst *InternalHeader) XXX_Merge(src proto.Message) { - xxx_messageInfo_InternalHeader.Merge(dst, src) -} -func (m *InternalHeader) XXX_Size() int { - return xxx_messageInfo_InternalHeader.Size(m) -} -func (m *InternalHeader) XXX_DiscardUnknown() { - xxx_messageInfo_InternalHeader.DiscardUnknown(m) -} - -var xxx_messageInfo_InternalHeader proto.InternalMessageInfo - -func (m *InternalHeader) GetQos() string { - if m != nil && m.Qos != nil { - return *m.Qos - } - return "" -} - -type Transaction struct { - Header *InternalHeader `protobuf:"bytes,4,opt,name=header" json:"header,omitempty"` - Handle *uint64 `protobuf:"fixed64,1,req,name=handle" json:"handle,omitempty"` - App *string `protobuf:"bytes,2,req,name=app" json:"app,omitempty"` - MarkChanges *bool `protobuf:"varint,3,opt,name=mark_changes,json=markChanges,def=0" json:"mark_changes,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Transaction) Reset() { *m = Transaction{} } -func (m *Transaction) String() string { return proto.CompactTextString(m) } -func (*Transaction) ProtoMessage() {} -func (*Transaction) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{14} -} -func (m *Transaction) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Transaction.Unmarshal(m, b) -} -func (m *Transaction) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Transaction.Marshal(b, m, deterministic) -} -func (dst *Transaction) XXX_Merge(src proto.Message) { - xxx_messageInfo_Transaction.Merge(dst, src) -} -func (m *Transaction) XXX_Size() int { - return xxx_messageInfo_Transaction.Size(m) -} -func (m *Transaction) XXX_DiscardUnknown() { - xxx_messageInfo_Transaction.DiscardUnknown(m) -} - -var xxx_messageInfo_Transaction proto.InternalMessageInfo - -const Default_Transaction_MarkChanges bool = false - -func (m *Transaction) GetHeader() *InternalHeader { - if m != nil { - return m.Header - } - return nil -} - -func (m *Transaction) GetHandle() uint64 { - if m != nil && m.Handle != nil { - return *m.Handle - } - return 0 -} - -func (m *Transaction) GetApp() string { - if m != nil && m.App != nil { - return *m.App - } - return "" -} - -func (m *Transaction) GetMarkChanges() bool { - if m != nil && m.MarkChanges != nil { - return *m.MarkChanges - } - return Default_Transaction_MarkChanges -} - -type Query struct { - Header *InternalHeader `protobuf:"bytes,39,opt,name=header" json:"header,omitempty"` - App *string `protobuf:"bytes,1,req,name=app" json:"app,omitempty"` - NameSpace *string `protobuf:"bytes,29,opt,name=name_space,json=nameSpace" json:"name_space,omitempty"` - Kind *string `protobuf:"bytes,3,opt,name=kind" json:"kind,omitempty"` - Ancestor *Reference `protobuf:"bytes,17,opt,name=ancestor" json:"ancestor,omitempty"` - Filter []*Query_Filter `protobuf:"group,4,rep,name=Filter,json=filter" json:"filter,omitempty"` - SearchQuery *string `protobuf:"bytes,8,opt,name=search_query,json=searchQuery" json:"search_query,omitempty"` - Order []*Query_Order `protobuf:"group,9,rep,name=Order,json=order" json:"order,omitempty"` - Hint *Query_Hint `protobuf:"varint,18,opt,name=hint,enum=appengine.Query_Hint" json:"hint,omitempty"` - Count *int32 `protobuf:"varint,23,opt,name=count" json:"count,omitempty"` - Offset *int32 `protobuf:"varint,12,opt,name=offset,def=0" json:"offset,omitempty"` - Limit *int32 `protobuf:"varint,16,opt,name=limit" json:"limit,omitempty"` - CompiledCursor *CompiledCursor `protobuf:"bytes,30,opt,name=compiled_cursor,json=compiledCursor" json:"compiled_cursor,omitempty"` - EndCompiledCursor *CompiledCursor `protobuf:"bytes,31,opt,name=end_compiled_cursor,json=endCompiledCursor" json:"end_compiled_cursor,omitempty"` - CompositeIndex []*CompositeIndex `protobuf:"bytes,19,rep,name=composite_index,json=compositeIndex" json:"composite_index,omitempty"` - RequirePerfectPlan *bool `protobuf:"varint,20,opt,name=require_perfect_plan,json=requirePerfectPlan,def=0" json:"require_perfect_plan,omitempty"` - KeysOnly *bool `protobuf:"varint,21,opt,name=keys_only,json=keysOnly,def=0" json:"keys_only,omitempty"` - Transaction *Transaction `protobuf:"bytes,22,opt,name=transaction" json:"transaction,omitempty"` - Compile *bool `protobuf:"varint,25,opt,name=compile,def=0" json:"compile,omitempty"` - FailoverMs *int64 `protobuf:"varint,26,opt,name=failover_ms,json=failoverMs" json:"failover_ms,omitempty"` - Strong *bool `protobuf:"varint,32,opt,name=strong" json:"strong,omitempty"` - PropertyName []string `protobuf:"bytes,33,rep,name=property_name,json=propertyName" json:"property_name,omitempty"` - GroupByPropertyName []string `protobuf:"bytes,34,rep,name=group_by_property_name,json=groupByPropertyName" json:"group_by_property_name,omitempty"` - Distinct *bool `protobuf:"varint,24,opt,name=distinct" json:"distinct,omitempty"` - MinSafeTimeSeconds *int64 `protobuf:"varint,35,opt,name=min_safe_time_seconds,json=minSafeTimeSeconds" json:"min_safe_time_seconds,omitempty"` - SafeReplicaName []string `protobuf:"bytes,36,rep,name=safe_replica_name,json=safeReplicaName" json:"safe_replica_name,omitempty"` - PersistOffset *bool `protobuf:"varint,37,opt,name=persist_offset,json=persistOffset,def=0" json:"persist_offset,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Query) Reset() { *m = Query{} } -func (m *Query) String() string { return proto.CompactTextString(m) } -func (*Query) ProtoMessage() {} -func (*Query) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{15} -} -func (m *Query) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Query.Unmarshal(m, b) -} -func (m *Query) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Query.Marshal(b, m, deterministic) -} -func (dst *Query) XXX_Merge(src proto.Message) { - xxx_messageInfo_Query.Merge(dst, src) -} -func (m *Query) XXX_Size() int { - return xxx_messageInfo_Query.Size(m) -} -func (m *Query) XXX_DiscardUnknown() { - xxx_messageInfo_Query.DiscardUnknown(m) -} - -var xxx_messageInfo_Query proto.InternalMessageInfo - -const Default_Query_Offset int32 = 0 -const Default_Query_RequirePerfectPlan bool = false -const Default_Query_KeysOnly bool = false -const Default_Query_Compile bool = false -const Default_Query_PersistOffset bool = false - -func (m *Query) GetHeader() *InternalHeader { - if m != nil { - return m.Header - } - return nil -} - -func (m *Query) GetApp() string { - if m != nil && m.App != nil { - return *m.App - } - return "" -} - -func (m *Query) GetNameSpace() string { - if m != nil && m.NameSpace != nil { - return *m.NameSpace - } - return "" -} - -func (m *Query) GetKind() string { - if m != nil && m.Kind != nil { - return *m.Kind - } - return "" -} - -func (m *Query) GetAncestor() *Reference { - if m != nil { - return m.Ancestor - } - return nil -} - -func (m *Query) GetFilter() []*Query_Filter { - if m != nil { - return m.Filter - } - return nil -} - -func (m *Query) GetSearchQuery() string { - if m != nil && m.SearchQuery != nil { - return *m.SearchQuery - } - return "" -} - -func (m *Query) GetOrder() []*Query_Order { - if m != nil { - return m.Order - } - return nil -} - -func (m *Query) GetHint() Query_Hint { - if m != nil && m.Hint != nil { - return *m.Hint - } - return Query_ORDER_FIRST -} - -func (m *Query) GetCount() int32 { - if m != nil && m.Count != nil { - return *m.Count - } - return 0 -} - -func (m *Query) GetOffset() int32 { - if m != nil && m.Offset != nil { - return *m.Offset - } - return Default_Query_Offset -} - -func (m *Query) GetLimit() int32 { - if m != nil && m.Limit != nil { - return *m.Limit - } - return 0 -} - -func (m *Query) GetCompiledCursor() *CompiledCursor { - if m != nil { - return m.CompiledCursor - } - return nil -} - -func (m *Query) GetEndCompiledCursor() *CompiledCursor { - if m != nil { - return m.EndCompiledCursor - } - return nil -} - -func (m *Query) GetCompositeIndex() []*CompositeIndex { - if m != nil { - return m.CompositeIndex - } - return nil -} - -func (m *Query) GetRequirePerfectPlan() bool { - if m != nil && m.RequirePerfectPlan != nil { - return *m.RequirePerfectPlan - } - return Default_Query_RequirePerfectPlan -} - -func (m *Query) GetKeysOnly() bool { - if m != nil && m.KeysOnly != nil { - return *m.KeysOnly - } - return Default_Query_KeysOnly -} - -func (m *Query) GetTransaction() *Transaction { - if m != nil { - return m.Transaction - } - return nil -} - -func (m *Query) GetCompile() bool { - if m != nil && m.Compile != nil { - return *m.Compile - } - return Default_Query_Compile -} - -func (m *Query) GetFailoverMs() int64 { - if m != nil && m.FailoverMs != nil { - return *m.FailoverMs - } - return 0 -} - -func (m *Query) GetStrong() bool { - if m != nil && m.Strong != nil { - return *m.Strong - } - return false -} - -func (m *Query) GetPropertyName() []string { - if m != nil { - return m.PropertyName - } - return nil -} - -func (m *Query) GetGroupByPropertyName() []string { - if m != nil { - return m.GroupByPropertyName - } - return nil -} - -func (m *Query) GetDistinct() bool { - if m != nil && m.Distinct != nil { - return *m.Distinct - } - return false -} - -func (m *Query) GetMinSafeTimeSeconds() int64 { - if m != nil && m.MinSafeTimeSeconds != nil { - return *m.MinSafeTimeSeconds - } - return 0 -} - -func (m *Query) GetSafeReplicaName() []string { - if m != nil { - return m.SafeReplicaName - } - return nil -} - -func (m *Query) GetPersistOffset() bool { - if m != nil && m.PersistOffset != nil { - return *m.PersistOffset - } - return Default_Query_PersistOffset -} - -type Query_Filter struct { - Op *Query_Filter_Operator `protobuf:"varint,6,req,name=op,enum=appengine.Query_Filter_Operator" json:"op,omitempty"` - Property []*Property `protobuf:"bytes,14,rep,name=property" json:"property,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Query_Filter) Reset() { *m = Query_Filter{} } -func (m *Query_Filter) String() string { return proto.CompactTextString(m) } -func (*Query_Filter) ProtoMessage() {} -func (*Query_Filter) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{15, 0} -} -func (m *Query_Filter) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Query_Filter.Unmarshal(m, b) -} -func (m *Query_Filter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Query_Filter.Marshal(b, m, deterministic) -} -func (dst *Query_Filter) XXX_Merge(src proto.Message) { - xxx_messageInfo_Query_Filter.Merge(dst, src) -} -func (m *Query_Filter) XXX_Size() int { - return xxx_messageInfo_Query_Filter.Size(m) -} -func (m *Query_Filter) XXX_DiscardUnknown() { - xxx_messageInfo_Query_Filter.DiscardUnknown(m) -} - -var xxx_messageInfo_Query_Filter proto.InternalMessageInfo - -func (m *Query_Filter) GetOp() Query_Filter_Operator { - if m != nil && m.Op != nil { - return *m.Op - } - return Query_Filter_LESS_THAN -} - -func (m *Query_Filter) GetProperty() []*Property { - if m != nil { - return m.Property - } - return nil -} - -type Query_Order struct { - Property *string `protobuf:"bytes,10,req,name=property" json:"property,omitempty"` - Direction *Query_Order_Direction `protobuf:"varint,11,opt,name=direction,enum=appengine.Query_Order_Direction,def=1" json:"direction,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Query_Order) Reset() { *m = Query_Order{} } -func (m *Query_Order) String() string { return proto.CompactTextString(m) } -func (*Query_Order) ProtoMessage() {} -func (*Query_Order) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{15, 1} -} -func (m *Query_Order) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Query_Order.Unmarshal(m, b) -} -func (m *Query_Order) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Query_Order.Marshal(b, m, deterministic) -} -func (dst *Query_Order) XXX_Merge(src proto.Message) { - xxx_messageInfo_Query_Order.Merge(dst, src) -} -func (m *Query_Order) XXX_Size() int { - return xxx_messageInfo_Query_Order.Size(m) -} -func (m *Query_Order) XXX_DiscardUnknown() { - xxx_messageInfo_Query_Order.DiscardUnknown(m) -} - -var xxx_messageInfo_Query_Order proto.InternalMessageInfo - -const Default_Query_Order_Direction Query_Order_Direction = Query_Order_ASCENDING - -func (m *Query_Order) GetProperty() string { - if m != nil && m.Property != nil { - return *m.Property - } - return "" -} - -func (m *Query_Order) GetDirection() Query_Order_Direction { - if m != nil && m.Direction != nil { - return *m.Direction - } - return Default_Query_Order_Direction -} - -type CompiledQuery struct { - Primaryscan *CompiledQuery_PrimaryScan `protobuf:"group,1,req,name=PrimaryScan,json=primaryscan" json:"primaryscan,omitempty"` - Mergejoinscan []*CompiledQuery_MergeJoinScan `protobuf:"group,7,rep,name=MergeJoinScan,json=mergejoinscan" json:"mergejoinscan,omitempty"` - IndexDef *Index `protobuf:"bytes,21,opt,name=index_def,json=indexDef" json:"index_def,omitempty"` - Offset *int32 `protobuf:"varint,10,opt,name=offset,def=0" json:"offset,omitempty"` - Limit *int32 `protobuf:"varint,11,opt,name=limit" json:"limit,omitempty"` - KeysOnly *bool `protobuf:"varint,12,req,name=keys_only,json=keysOnly" json:"keys_only,omitempty"` - PropertyName []string `protobuf:"bytes,24,rep,name=property_name,json=propertyName" json:"property_name,omitempty"` - DistinctInfixSize *int32 `protobuf:"varint,25,opt,name=distinct_infix_size,json=distinctInfixSize" json:"distinct_infix_size,omitempty"` - Entityfilter *CompiledQuery_EntityFilter `protobuf:"group,13,opt,name=EntityFilter,json=entityfilter" json:"entityfilter,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CompiledQuery) Reset() { *m = CompiledQuery{} } -func (m *CompiledQuery) String() string { return proto.CompactTextString(m) } -func (*CompiledQuery) ProtoMessage() {} -func (*CompiledQuery) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{16} -} -func (m *CompiledQuery) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CompiledQuery.Unmarshal(m, b) -} -func (m *CompiledQuery) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CompiledQuery.Marshal(b, m, deterministic) -} -func (dst *CompiledQuery) XXX_Merge(src proto.Message) { - xxx_messageInfo_CompiledQuery.Merge(dst, src) -} -func (m *CompiledQuery) XXX_Size() int { - return xxx_messageInfo_CompiledQuery.Size(m) -} -func (m *CompiledQuery) XXX_DiscardUnknown() { - xxx_messageInfo_CompiledQuery.DiscardUnknown(m) -} - -var xxx_messageInfo_CompiledQuery proto.InternalMessageInfo - -const Default_CompiledQuery_Offset int32 = 0 - -func (m *CompiledQuery) GetPrimaryscan() *CompiledQuery_PrimaryScan { - if m != nil { - return m.Primaryscan - } - return nil -} - -func (m *CompiledQuery) GetMergejoinscan() []*CompiledQuery_MergeJoinScan { - if m != nil { - return m.Mergejoinscan - } - return nil -} - -func (m *CompiledQuery) GetIndexDef() *Index { - if m != nil { - return m.IndexDef - } - return nil -} - -func (m *CompiledQuery) GetOffset() int32 { - if m != nil && m.Offset != nil { - return *m.Offset - } - return Default_CompiledQuery_Offset -} - -func (m *CompiledQuery) GetLimit() int32 { - if m != nil && m.Limit != nil { - return *m.Limit - } - return 0 -} - -func (m *CompiledQuery) GetKeysOnly() bool { - if m != nil && m.KeysOnly != nil { - return *m.KeysOnly - } - return false -} - -func (m *CompiledQuery) GetPropertyName() []string { - if m != nil { - return m.PropertyName - } - return nil -} - -func (m *CompiledQuery) GetDistinctInfixSize() int32 { - if m != nil && m.DistinctInfixSize != nil { - return *m.DistinctInfixSize - } - return 0 -} - -func (m *CompiledQuery) GetEntityfilter() *CompiledQuery_EntityFilter { - if m != nil { - return m.Entityfilter - } - return nil -} - -type CompiledQuery_PrimaryScan struct { - IndexName *string `protobuf:"bytes,2,opt,name=index_name,json=indexName" json:"index_name,omitempty"` - StartKey *string `protobuf:"bytes,3,opt,name=start_key,json=startKey" json:"start_key,omitempty"` - StartInclusive *bool `protobuf:"varint,4,opt,name=start_inclusive,json=startInclusive" json:"start_inclusive,omitempty"` - EndKey *string `protobuf:"bytes,5,opt,name=end_key,json=endKey" json:"end_key,omitempty"` - EndInclusive *bool `protobuf:"varint,6,opt,name=end_inclusive,json=endInclusive" json:"end_inclusive,omitempty"` - StartPostfixValue []string `protobuf:"bytes,22,rep,name=start_postfix_value,json=startPostfixValue" json:"start_postfix_value,omitempty"` - EndPostfixValue []string `protobuf:"bytes,23,rep,name=end_postfix_value,json=endPostfixValue" json:"end_postfix_value,omitempty"` - EndUnappliedLogTimestampUs *int64 `protobuf:"varint,19,opt,name=end_unapplied_log_timestamp_us,json=endUnappliedLogTimestampUs" json:"end_unapplied_log_timestamp_us,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CompiledQuery_PrimaryScan) Reset() { *m = CompiledQuery_PrimaryScan{} } -func (m *CompiledQuery_PrimaryScan) String() string { return proto.CompactTextString(m) } -func (*CompiledQuery_PrimaryScan) ProtoMessage() {} -func (*CompiledQuery_PrimaryScan) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{16, 0} -} -func (m *CompiledQuery_PrimaryScan) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CompiledQuery_PrimaryScan.Unmarshal(m, b) -} -func (m *CompiledQuery_PrimaryScan) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CompiledQuery_PrimaryScan.Marshal(b, m, deterministic) -} -func (dst *CompiledQuery_PrimaryScan) XXX_Merge(src proto.Message) { - xxx_messageInfo_CompiledQuery_PrimaryScan.Merge(dst, src) -} -func (m *CompiledQuery_PrimaryScan) XXX_Size() int { - return xxx_messageInfo_CompiledQuery_PrimaryScan.Size(m) -} -func (m *CompiledQuery_PrimaryScan) XXX_DiscardUnknown() { - xxx_messageInfo_CompiledQuery_PrimaryScan.DiscardUnknown(m) -} - -var xxx_messageInfo_CompiledQuery_PrimaryScan proto.InternalMessageInfo - -func (m *CompiledQuery_PrimaryScan) GetIndexName() string { - if m != nil && m.IndexName != nil { - return *m.IndexName - } - return "" -} - -func (m *CompiledQuery_PrimaryScan) GetStartKey() string { - if m != nil && m.StartKey != nil { - return *m.StartKey - } - return "" -} - -func (m *CompiledQuery_PrimaryScan) GetStartInclusive() bool { - if m != nil && m.StartInclusive != nil { - return *m.StartInclusive - } - return false -} - -func (m *CompiledQuery_PrimaryScan) GetEndKey() string { - if m != nil && m.EndKey != nil { - return *m.EndKey - } - return "" -} - -func (m *CompiledQuery_PrimaryScan) GetEndInclusive() bool { - if m != nil && m.EndInclusive != nil { - return *m.EndInclusive - } - return false -} - -func (m *CompiledQuery_PrimaryScan) GetStartPostfixValue() []string { - if m != nil { - return m.StartPostfixValue - } - return nil -} - -func (m *CompiledQuery_PrimaryScan) GetEndPostfixValue() []string { - if m != nil { - return m.EndPostfixValue - } - return nil -} - -func (m *CompiledQuery_PrimaryScan) GetEndUnappliedLogTimestampUs() int64 { - if m != nil && m.EndUnappliedLogTimestampUs != nil { - return *m.EndUnappliedLogTimestampUs - } - return 0 -} - -type CompiledQuery_MergeJoinScan struct { - IndexName *string `protobuf:"bytes,8,req,name=index_name,json=indexName" json:"index_name,omitempty"` - PrefixValue []string `protobuf:"bytes,9,rep,name=prefix_value,json=prefixValue" json:"prefix_value,omitempty"` - ValuePrefix *bool `protobuf:"varint,20,opt,name=value_prefix,json=valuePrefix,def=0" json:"value_prefix,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CompiledQuery_MergeJoinScan) Reset() { *m = CompiledQuery_MergeJoinScan{} } -func (m *CompiledQuery_MergeJoinScan) String() string { return proto.CompactTextString(m) } -func (*CompiledQuery_MergeJoinScan) ProtoMessage() {} -func (*CompiledQuery_MergeJoinScan) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{16, 1} -} -func (m *CompiledQuery_MergeJoinScan) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CompiledQuery_MergeJoinScan.Unmarshal(m, b) -} -func (m *CompiledQuery_MergeJoinScan) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CompiledQuery_MergeJoinScan.Marshal(b, m, deterministic) -} -func (dst *CompiledQuery_MergeJoinScan) XXX_Merge(src proto.Message) { - xxx_messageInfo_CompiledQuery_MergeJoinScan.Merge(dst, src) -} -func (m *CompiledQuery_MergeJoinScan) XXX_Size() int { - return xxx_messageInfo_CompiledQuery_MergeJoinScan.Size(m) -} -func (m *CompiledQuery_MergeJoinScan) XXX_DiscardUnknown() { - xxx_messageInfo_CompiledQuery_MergeJoinScan.DiscardUnknown(m) -} - -var xxx_messageInfo_CompiledQuery_MergeJoinScan proto.InternalMessageInfo - -const Default_CompiledQuery_MergeJoinScan_ValuePrefix bool = false - -func (m *CompiledQuery_MergeJoinScan) GetIndexName() string { - if m != nil && m.IndexName != nil { - return *m.IndexName - } - return "" -} - -func (m *CompiledQuery_MergeJoinScan) GetPrefixValue() []string { - if m != nil { - return m.PrefixValue - } - return nil -} - -func (m *CompiledQuery_MergeJoinScan) GetValuePrefix() bool { - if m != nil && m.ValuePrefix != nil { - return *m.ValuePrefix - } - return Default_CompiledQuery_MergeJoinScan_ValuePrefix -} - -type CompiledQuery_EntityFilter struct { - Distinct *bool `protobuf:"varint,14,opt,name=distinct,def=0" json:"distinct,omitempty"` - Kind *string `protobuf:"bytes,17,opt,name=kind" json:"kind,omitempty"` - Ancestor *Reference `protobuf:"bytes,18,opt,name=ancestor" json:"ancestor,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CompiledQuery_EntityFilter) Reset() { *m = CompiledQuery_EntityFilter{} } -func (m *CompiledQuery_EntityFilter) String() string { return proto.CompactTextString(m) } -func (*CompiledQuery_EntityFilter) ProtoMessage() {} -func (*CompiledQuery_EntityFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{16, 2} -} -func (m *CompiledQuery_EntityFilter) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CompiledQuery_EntityFilter.Unmarshal(m, b) -} -func (m *CompiledQuery_EntityFilter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CompiledQuery_EntityFilter.Marshal(b, m, deterministic) -} -func (dst *CompiledQuery_EntityFilter) XXX_Merge(src proto.Message) { - xxx_messageInfo_CompiledQuery_EntityFilter.Merge(dst, src) -} -func (m *CompiledQuery_EntityFilter) XXX_Size() int { - return xxx_messageInfo_CompiledQuery_EntityFilter.Size(m) -} -func (m *CompiledQuery_EntityFilter) XXX_DiscardUnknown() { - xxx_messageInfo_CompiledQuery_EntityFilter.DiscardUnknown(m) -} - -var xxx_messageInfo_CompiledQuery_EntityFilter proto.InternalMessageInfo - -const Default_CompiledQuery_EntityFilter_Distinct bool = false - -func (m *CompiledQuery_EntityFilter) GetDistinct() bool { - if m != nil && m.Distinct != nil { - return *m.Distinct - } - return Default_CompiledQuery_EntityFilter_Distinct -} - -func (m *CompiledQuery_EntityFilter) GetKind() string { - if m != nil && m.Kind != nil { - return *m.Kind - } - return "" -} - -func (m *CompiledQuery_EntityFilter) GetAncestor() *Reference { - if m != nil { - return m.Ancestor - } - return nil -} - -type CompiledCursor struct { - Position *CompiledCursor_Position `protobuf:"group,2,opt,name=Position,json=position" json:"position,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CompiledCursor) Reset() { *m = CompiledCursor{} } -func (m *CompiledCursor) String() string { return proto.CompactTextString(m) } -func (*CompiledCursor) ProtoMessage() {} -func (*CompiledCursor) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{17} -} -func (m *CompiledCursor) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CompiledCursor.Unmarshal(m, b) -} -func (m *CompiledCursor) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CompiledCursor.Marshal(b, m, deterministic) -} -func (dst *CompiledCursor) XXX_Merge(src proto.Message) { - xxx_messageInfo_CompiledCursor.Merge(dst, src) -} -func (m *CompiledCursor) XXX_Size() int { - return xxx_messageInfo_CompiledCursor.Size(m) -} -func (m *CompiledCursor) XXX_DiscardUnknown() { - xxx_messageInfo_CompiledCursor.DiscardUnknown(m) -} - -var xxx_messageInfo_CompiledCursor proto.InternalMessageInfo - -func (m *CompiledCursor) GetPosition() *CompiledCursor_Position { - if m != nil { - return m.Position - } - return nil -} - -type CompiledCursor_Position struct { - StartKey *string `protobuf:"bytes,27,opt,name=start_key,json=startKey" json:"start_key,omitempty"` - Indexvalue []*CompiledCursor_Position_IndexValue `protobuf:"group,29,rep,name=IndexValue,json=indexvalue" json:"indexvalue,omitempty"` - Key *Reference `protobuf:"bytes,32,opt,name=key" json:"key,omitempty"` - StartInclusive *bool `protobuf:"varint,28,opt,name=start_inclusive,json=startInclusive,def=1" json:"start_inclusive,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CompiledCursor_Position) Reset() { *m = CompiledCursor_Position{} } -func (m *CompiledCursor_Position) String() string { return proto.CompactTextString(m) } -func (*CompiledCursor_Position) ProtoMessage() {} -func (*CompiledCursor_Position) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{17, 0} -} -func (m *CompiledCursor_Position) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CompiledCursor_Position.Unmarshal(m, b) -} -func (m *CompiledCursor_Position) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CompiledCursor_Position.Marshal(b, m, deterministic) -} -func (dst *CompiledCursor_Position) XXX_Merge(src proto.Message) { - xxx_messageInfo_CompiledCursor_Position.Merge(dst, src) -} -func (m *CompiledCursor_Position) XXX_Size() int { - return xxx_messageInfo_CompiledCursor_Position.Size(m) -} -func (m *CompiledCursor_Position) XXX_DiscardUnknown() { - xxx_messageInfo_CompiledCursor_Position.DiscardUnknown(m) -} - -var xxx_messageInfo_CompiledCursor_Position proto.InternalMessageInfo - -const Default_CompiledCursor_Position_StartInclusive bool = true - -func (m *CompiledCursor_Position) GetStartKey() string { - if m != nil && m.StartKey != nil { - return *m.StartKey - } - return "" -} - -func (m *CompiledCursor_Position) GetIndexvalue() []*CompiledCursor_Position_IndexValue { - if m != nil { - return m.Indexvalue - } - return nil -} - -func (m *CompiledCursor_Position) GetKey() *Reference { - if m != nil { - return m.Key - } - return nil -} - -func (m *CompiledCursor_Position) GetStartInclusive() bool { - if m != nil && m.StartInclusive != nil { - return *m.StartInclusive - } - return Default_CompiledCursor_Position_StartInclusive -} - -type CompiledCursor_Position_IndexValue struct { - Property *string `protobuf:"bytes,30,opt,name=property" json:"property,omitempty"` - Value *PropertyValue `protobuf:"bytes,31,req,name=value" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CompiledCursor_Position_IndexValue) Reset() { *m = CompiledCursor_Position_IndexValue{} } -func (m *CompiledCursor_Position_IndexValue) String() string { return proto.CompactTextString(m) } -func (*CompiledCursor_Position_IndexValue) ProtoMessage() {} -func (*CompiledCursor_Position_IndexValue) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{17, 0, 0} -} -func (m *CompiledCursor_Position_IndexValue) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CompiledCursor_Position_IndexValue.Unmarshal(m, b) -} -func (m *CompiledCursor_Position_IndexValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CompiledCursor_Position_IndexValue.Marshal(b, m, deterministic) -} -func (dst *CompiledCursor_Position_IndexValue) XXX_Merge(src proto.Message) { - xxx_messageInfo_CompiledCursor_Position_IndexValue.Merge(dst, src) -} -func (m *CompiledCursor_Position_IndexValue) XXX_Size() int { - return xxx_messageInfo_CompiledCursor_Position_IndexValue.Size(m) -} -func (m *CompiledCursor_Position_IndexValue) XXX_DiscardUnknown() { - xxx_messageInfo_CompiledCursor_Position_IndexValue.DiscardUnknown(m) -} - -var xxx_messageInfo_CompiledCursor_Position_IndexValue proto.InternalMessageInfo - -func (m *CompiledCursor_Position_IndexValue) GetProperty() string { - if m != nil && m.Property != nil { - return *m.Property - } - return "" -} - -func (m *CompiledCursor_Position_IndexValue) GetValue() *PropertyValue { - if m != nil { - return m.Value - } - return nil -} - -type Cursor struct { - Cursor *uint64 `protobuf:"fixed64,1,req,name=cursor" json:"cursor,omitempty"` - App *string `protobuf:"bytes,2,opt,name=app" json:"app,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Cursor) Reset() { *m = Cursor{} } -func (m *Cursor) String() string { return proto.CompactTextString(m) } -func (*Cursor) ProtoMessage() {} -func (*Cursor) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{18} -} -func (m *Cursor) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Cursor.Unmarshal(m, b) -} -func (m *Cursor) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Cursor.Marshal(b, m, deterministic) -} -func (dst *Cursor) XXX_Merge(src proto.Message) { - xxx_messageInfo_Cursor.Merge(dst, src) -} -func (m *Cursor) XXX_Size() int { - return xxx_messageInfo_Cursor.Size(m) -} -func (m *Cursor) XXX_DiscardUnknown() { - xxx_messageInfo_Cursor.DiscardUnknown(m) -} - -var xxx_messageInfo_Cursor proto.InternalMessageInfo - -func (m *Cursor) GetCursor() uint64 { - if m != nil && m.Cursor != nil { - return *m.Cursor - } - return 0 -} - -func (m *Cursor) GetApp() string { - if m != nil && m.App != nil { - return *m.App - } - return "" -} - -type Error struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Error) Reset() { *m = Error{} } -func (m *Error) String() string { return proto.CompactTextString(m) } -func (*Error) ProtoMessage() {} -func (*Error) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{19} -} -func (m *Error) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Error.Unmarshal(m, b) -} -func (m *Error) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Error.Marshal(b, m, deterministic) -} -func (dst *Error) XXX_Merge(src proto.Message) { - xxx_messageInfo_Error.Merge(dst, src) -} -func (m *Error) XXX_Size() int { - return xxx_messageInfo_Error.Size(m) -} -func (m *Error) XXX_DiscardUnknown() { - xxx_messageInfo_Error.DiscardUnknown(m) -} - -var xxx_messageInfo_Error proto.InternalMessageInfo - -type Cost struct { - IndexWrites *int32 `protobuf:"varint,1,opt,name=index_writes,json=indexWrites" json:"index_writes,omitempty"` - IndexWriteBytes *int32 `protobuf:"varint,2,opt,name=index_write_bytes,json=indexWriteBytes" json:"index_write_bytes,omitempty"` - EntityWrites *int32 `protobuf:"varint,3,opt,name=entity_writes,json=entityWrites" json:"entity_writes,omitempty"` - EntityWriteBytes *int32 `protobuf:"varint,4,opt,name=entity_write_bytes,json=entityWriteBytes" json:"entity_write_bytes,omitempty"` - Commitcost *Cost_CommitCost `protobuf:"group,5,opt,name=CommitCost,json=commitcost" json:"commitcost,omitempty"` - ApproximateStorageDelta *int32 `protobuf:"varint,8,opt,name=approximate_storage_delta,json=approximateStorageDelta" json:"approximate_storage_delta,omitempty"` - IdSequenceUpdates *int32 `protobuf:"varint,9,opt,name=id_sequence_updates,json=idSequenceUpdates" json:"id_sequence_updates,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Cost) Reset() { *m = Cost{} } -func (m *Cost) String() string { return proto.CompactTextString(m) } -func (*Cost) ProtoMessage() {} -func (*Cost) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{20} -} -func (m *Cost) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Cost.Unmarshal(m, b) -} -func (m *Cost) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Cost.Marshal(b, m, deterministic) -} -func (dst *Cost) XXX_Merge(src proto.Message) { - xxx_messageInfo_Cost.Merge(dst, src) -} -func (m *Cost) XXX_Size() int { - return xxx_messageInfo_Cost.Size(m) -} -func (m *Cost) XXX_DiscardUnknown() { - xxx_messageInfo_Cost.DiscardUnknown(m) -} - -var xxx_messageInfo_Cost proto.InternalMessageInfo - -func (m *Cost) GetIndexWrites() int32 { - if m != nil && m.IndexWrites != nil { - return *m.IndexWrites - } - return 0 -} - -func (m *Cost) GetIndexWriteBytes() int32 { - if m != nil && m.IndexWriteBytes != nil { - return *m.IndexWriteBytes - } - return 0 -} - -func (m *Cost) GetEntityWrites() int32 { - if m != nil && m.EntityWrites != nil { - return *m.EntityWrites - } - return 0 -} - -func (m *Cost) GetEntityWriteBytes() int32 { - if m != nil && m.EntityWriteBytes != nil { - return *m.EntityWriteBytes - } - return 0 -} - -func (m *Cost) GetCommitcost() *Cost_CommitCost { - if m != nil { - return m.Commitcost - } - return nil -} - -func (m *Cost) GetApproximateStorageDelta() int32 { - if m != nil && m.ApproximateStorageDelta != nil { - return *m.ApproximateStorageDelta - } - return 0 -} - -func (m *Cost) GetIdSequenceUpdates() int32 { - if m != nil && m.IdSequenceUpdates != nil { - return *m.IdSequenceUpdates - } - return 0 -} - -type Cost_CommitCost struct { - RequestedEntityPuts *int32 `protobuf:"varint,6,opt,name=requested_entity_puts,json=requestedEntityPuts" json:"requested_entity_puts,omitempty"` - RequestedEntityDeletes *int32 `protobuf:"varint,7,opt,name=requested_entity_deletes,json=requestedEntityDeletes" json:"requested_entity_deletes,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Cost_CommitCost) Reset() { *m = Cost_CommitCost{} } -func (m *Cost_CommitCost) String() string { return proto.CompactTextString(m) } -func (*Cost_CommitCost) ProtoMessage() {} -func (*Cost_CommitCost) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{20, 0} -} -func (m *Cost_CommitCost) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Cost_CommitCost.Unmarshal(m, b) -} -func (m *Cost_CommitCost) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Cost_CommitCost.Marshal(b, m, deterministic) -} -func (dst *Cost_CommitCost) XXX_Merge(src proto.Message) { - xxx_messageInfo_Cost_CommitCost.Merge(dst, src) -} -func (m *Cost_CommitCost) XXX_Size() int { - return xxx_messageInfo_Cost_CommitCost.Size(m) -} -func (m *Cost_CommitCost) XXX_DiscardUnknown() { - xxx_messageInfo_Cost_CommitCost.DiscardUnknown(m) -} - -var xxx_messageInfo_Cost_CommitCost proto.InternalMessageInfo - -func (m *Cost_CommitCost) GetRequestedEntityPuts() int32 { - if m != nil && m.RequestedEntityPuts != nil { - return *m.RequestedEntityPuts - } - return 0 -} - -func (m *Cost_CommitCost) GetRequestedEntityDeletes() int32 { - if m != nil && m.RequestedEntityDeletes != nil { - return *m.RequestedEntityDeletes - } - return 0 -} - -type GetRequest struct { - Header *InternalHeader `protobuf:"bytes,6,opt,name=header" json:"header,omitempty"` - Key []*Reference `protobuf:"bytes,1,rep,name=key" json:"key,omitempty"` - Transaction *Transaction `protobuf:"bytes,2,opt,name=transaction" json:"transaction,omitempty"` - FailoverMs *int64 `protobuf:"varint,3,opt,name=failover_ms,json=failoverMs" json:"failover_ms,omitempty"` - Strong *bool `protobuf:"varint,4,opt,name=strong" json:"strong,omitempty"` - AllowDeferred *bool `protobuf:"varint,5,opt,name=allow_deferred,json=allowDeferred,def=0" json:"allow_deferred,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetRequest) Reset() { *m = GetRequest{} } -func (m *GetRequest) String() string { return proto.CompactTextString(m) } -func (*GetRequest) ProtoMessage() {} -func (*GetRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{21} -} -func (m *GetRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetRequest.Unmarshal(m, b) -} -func (m *GetRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetRequest.Marshal(b, m, deterministic) -} -func (dst *GetRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetRequest.Merge(dst, src) -} -func (m *GetRequest) XXX_Size() int { - return xxx_messageInfo_GetRequest.Size(m) -} -func (m *GetRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_GetRequest proto.InternalMessageInfo - -const Default_GetRequest_AllowDeferred bool = false - -func (m *GetRequest) GetHeader() *InternalHeader { - if m != nil { - return m.Header - } - return nil -} - -func (m *GetRequest) GetKey() []*Reference { - if m != nil { - return m.Key - } - return nil -} - -func (m *GetRequest) GetTransaction() *Transaction { - if m != nil { - return m.Transaction - } - return nil -} - -func (m *GetRequest) GetFailoverMs() int64 { - if m != nil && m.FailoverMs != nil { - return *m.FailoverMs - } - return 0 -} - -func (m *GetRequest) GetStrong() bool { - if m != nil && m.Strong != nil { - return *m.Strong - } - return false -} - -func (m *GetRequest) GetAllowDeferred() bool { - if m != nil && m.AllowDeferred != nil { - return *m.AllowDeferred - } - return Default_GetRequest_AllowDeferred -} - -type GetResponse struct { - Entity []*GetResponse_Entity `protobuf:"group,1,rep,name=Entity,json=entity" json:"entity,omitempty"` - Deferred []*Reference `protobuf:"bytes,5,rep,name=deferred" json:"deferred,omitempty"` - InOrder *bool `protobuf:"varint,6,opt,name=in_order,json=inOrder,def=1" json:"in_order,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetResponse) Reset() { *m = GetResponse{} } -func (m *GetResponse) String() string { return proto.CompactTextString(m) } -func (*GetResponse) ProtoMessage() {} -func (*GetResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{22} -} -func (m *GetResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetResponse.Unmarshal(m, b) -} -func (m *GetResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetResponse.Marshal(b, m, deterministic) -} -func (dst *GetResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetResponse.Merge(dst, src) -} -func (m *GetResponse) XXX_Size() int { - return xxx_messageInfo_GetResponse.Size(m) -} -func (m *GetResponse) XXX_DiscardUnknown() { - xxx_messageInfo_GetResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_GetResponse proto.InternalMessageInfo - -const Default_GetResponse_InOrder bool = true - -func (m *GetResponse) GetEntity() []*GetResponse_Entity { - if m != nil { - return m.Entity - } - return nil -} - -func (m *GetResponse) GetDeferred() []*Reference { - if m != nil { - return m.Deferred - } - return nil -} - -func (m *GetResponse) GetInOrder() bool { - if m != nil && m.InOrder != nil { - return *m.InOrder - } - return Default_GetResponse_InOrder -} - -type GetResponse_Entity struct { - Entity *EntityProto `protobuf:"bytes,2,opt,name=entity" json:"entity,omitempty"` - Key *Reference `protobuf:"bytes,4,opt,name=key" json:"key,omitempty"` - Version *int64 `protobuf:"varint,3,opt,name=version" json:"version,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetResponse_Entity) Reset() { *m = GetResponse_Entity{} } -func (m *GetResponse_Entity) String() string { return proto.CompactTextString(m) } -func (*GetResponse_Entity) ProtoMessage() {} -func (*GetResponse_Entity) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{22, 0} -} -func (m *GetResponse_Entity) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetResponse_Entity.Unmarshal(m, b) -} -func (m *GetResponse_Entity) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetResponse_Entity.Marshal(b, m, deterministic) -} -func (dst *GetResponse_Entity) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetResponse_Entity.Merge(dst, src) -} -func (m *GetResponse_Entity) XXX_Size() int { - return xxx_messageInfo_GetResponse_Entity.Size(m) -} -func (m *GetResponse_Entity) XXX_DiscardUnknown() { - xxx_messageInfo_GetResponse_Entity.DiscardUnknown(m) -} - -var xxx_messageInfo_GetResponse_Entity proto.InternalMessageInfo - -func (m *GetResponse_Entity) GetEntity() *EntityProto { - if m != nil { - return m.Entity - } - return nil -} - -func (m *GetResponse_Entity) GetKey() *Reference { - if m != nil { - return m.Key - } - return nil -} - -func (m *GetResponse_Entity) GetVersion() int64 { - if m != nil && m.Version != nil { - return *m.Version - } - return 0 -} - -type PutRequest struct { - Header *InternalHeader `protobuf:"bytes,11,opt,name=header" json:"header,omitempty"` - Entity []*EntityProto `protobuf:"bytes,1,rep,name=entity" json:"entity,omitempty"` - Transaction *Transaction `protobuf:"bytes,2,opt,name=transaction" json:"transaction,omitempty"` - CompositeIndex []*CompositeIndex `protobuf:"bytes,3,rep,name=composite_index,json=compositeIndex" json:"composite_index,omitempty"` - Trusted *bool `protobuf:"varint,4,opt,name=trusted,def=0" json:"trusted,omitempty"` - Force *bool `protobuf:"varint,7,opt,name=force,def=0" json:"force,omitempty"` - MarkChanges *bool `protobuf:"varint,8,opt,name=mark_changes,json=markChanges,def=0" json:"mark_changes,omitempty"` - Snapshot []*Snapshot `protobuf:"bytes,9,rep,name=snapshot" json:"snapshot,omitempty"` - AutoIdPolicy *PutRequest_AutoIdPolicy `protobuf:"varint,10,opt,name=auto_id_policy,json=autoIdPolicy,enum=appengine.PutRequest_AutoIdPolicy,def=0" json:"auto_id_policy,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *PutRequest) Reset() { *m = PutRequest{} } -func (m *PutRequest) String() string { return proto.CompactTextString(m) } -func (*PutRequest) ProtoMessage() {} -func (*PutRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{23} -} -func (m *PutRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_PutRequest.Unmarshal(m, b) -} -func (m *PutRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_PutRequest.Marshal(b, m, deterministic) -} -func (dst *PutRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_PutRequest.Merge(dst, src) -} -func (m *PutRequest) XXX_Size() int { - return xxx_messageInfo_PutRequest.Size(m) -} -func (m *PutRequest) XXX_DiscardUnknown() { - xxx_messageInfo_PutRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_PutRequest proto.InternalMessageInfo - -const Default_PutRequest_Trusted bool = false -const Default_PutRequest_Force bool = false -const Default_PutRequest_MarkChanges bool = false -const Default_PutRequest_AutoIdPolicy PutRequest_AutoIdPolicy = PutRequest_CURRENT - -func (m *PutRequest) GetHeader() *InternalHeader { - if m != nil { - return m.Header - } - return nil -} - -func (m *PutRequest) GetEntity() []*EntityProto { - if m != nil { - return m.Entity - } - return nil -} - -func (m *PutRequest) GetTransaction() *Transaction { - if m != nil { - return m.Transaction - } - return nil -} - -func (m *PutRequest) GetCompositeIndex() []*CompositeIndex { - if m != nil { - return m.CompositeIndex - } - return nil -} - -func (m *PutRequest) GetTrusted() bool { - if m != nil && m.Trusted != nil { - return *m.Trusted - } - return Default_PutRequest_Trusted -} - -func (m *PutRequest) GetForce() bool { - if m != nil && m.Force != nil { - return *m.Force - } - return Default_PutRequest_Force -} - -func (m *PutRequest) GetMarkChanges() bool { - if m != nil && m.MarkChanges != nil { - return *m.MarkChanges - } - return Default_PutRequest_MarkChanges -} - -func (m *PutRequest) GetSnapshot() []*Snapshot { - if m != nil { - return m.Snapshot - } - return nil -} - -func (m *PutRequest) GetAutoIdPolicy() PutRequest_AutoIdPolicy { - if m != nil && m.AutoIdPolicy != nil { - return *m.AutoIdPolicy - } - return Default_PutRequest_AutoIdPolicy -} - -type PutResponse struct { - Key []*Reference `protobuf:"bytes,1,rep,name=key" json:"key,omitempty"` - Cost *Cost `protobuf:"bytes,2,opt,name=cost" json:"cost,omitempty"` - Version []int64 `protobuf:"varint,3,rep,name=version" json:"version,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *PutResponse) Reset() { *m = PutResponse{} } -func (m *PutResponse) String() string { return proto.CompactTextString(m) } -func (*PutResponse) ProtoMessage() {} -func (*PutResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{24} -} -func (m *PutResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_PutResponse.Unmarshal(m, b) -} -func (m *PutResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_PutResponse.Marshal(b, m, deterministic) -} -func (dst *PutResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_PutResponse.Merge(dst, src) -} -func (m *PutResponse) XXX_Size() int { - return xxx_messageInfo_PutResponse.Size(m) -} -func (m *PutResponse) XXX_DiscardUnknown() { - xxx_messageInfo_PutResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_PutResponse proto.InternalMessageInfo - -func (m *PutResponse) GetKey() []*Reference { - if m != nil { - return m.Key - } - return nil -} - -func (m *PutResponse) GetCost() *Cost { - if m != nil { - return m.Cost - } - return nil -} - -func (m *PutResponse) GetVersion() []int64 { - if m != nil { - return m.Version - } - return nil -} - -type TouchRequest struct { - Header *InternalHeader `protobuf:"bytes,10,opt,name=header" json:"header,omitempty"` - Key []*Reference `protobuf:"bytes,1,rep,name=key" json:"key,omitempty"` - CompositeIndex []*CompositeIndex `protobuf:"bytes,2,rep,name=composite_index,json=compositeIndex" json:"composite_index,omitempty"` - Force *bool `protobuf:"varint,3,opt,name=force,def=0" json:"force,omitempty"` - Snapshot []*Snapshot `protobuf:"bytes,9,rep,name=snapshot" json:"snapshot,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *TouchRequest) Reset() { *m = TouchRequest{} } -func (m *TouchRequest) String() string { return proto.CompactTextString(m) } -func (*TouchRequest) ProtoMessage() {} -func (*TouchRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{25} -} -func (m *TouchRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_TouchRequest.Unmarshal(m, b) -} -func (m *TouchRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_TouchRequest.Marshal(b, m, deterministic) -} -func (dst *TouchRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_TouchRequest.Merge(dst, src) -} -func (m *TouchRequest) XXX_Size() int { - return xxx_messageInfo_TouchRequest.Size(m) -} -func (m *TouchRequest) XXX_DiscardUnknown() { - xxx_messageInfo_TouchRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_TouchRequest proto.InternalMessageInfo - -const Default_TouchRequest_Force bool = false - -func (m *TouchRequest) GetHeader() *InternalHeader { - if m != nil { - return m.Header - } - return nil -} - -func (m *TouchRequest) GetKey() []*Reference { - if m != nil { - return m.Key - } - return nil -} - -func (m *TouchRequest) GetCompositeIndex() []*CompositeIndex { - if m != nil { - return m.CompositeIndex - } - return nil -} - -func (m *TouchRequest) GetForce() bool { - if m != nil && m.Force != nil { - return *m.Force - } - return Default_TouchRequest_Force -} - -func (m *TouchRequest) GetSnapshot() []*Snapshot { - if m != nil { - return m.Snapshot - } - return nil -} - -type TouchResponse struct { - Cost *Cost `protobuf:"bytes,1,opt,name=cost" json:"cost,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *TouchResponse) Reset() { *m = TouchResponse{} } -func (m *TouchResponse) String() string { return proto.CompactTextString(m) } -func (*TouchResponse) ProtoMessage() {} -func (*TouchResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{26} -} -func (m *TouchResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_TouchResponse.Unmarshal(m, b) -} -func (m *TouchResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_TouchResponse.Marshal(b, m, deterministic) -} -func (dst *TouchResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_TouchResponse.Merge(dst, src) -} -func (m *TouchResponse) XXX_Size() int { - return xxx_messageInfo_TouchResponse.Size(m) -} -func (m *TouchResponse) XXX_DiscardUnknown() { - xxx_messageInfo_TouchResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_TouchResponse proto.InternalMessageInfo - -func (m *TouchResponse) GetCost() *Cost { - if m != nil { - return m.Cost - } - return nil -} - -type DeleteRequest struct { - Header *InternalHeader `protobuf:"bytes,10,opt,name=header" json:"header,omitempty"` - Key []*Reference `protobuf:"bytes,6,rep,name=key" json:"key,omitempty"` - Transaction *Transaction `protobuf:"bytes,5,opt,name=transaction" json:"transaction,omitempty"` - Trusted *bool `protobuf:"varint,4,opt,name=trusted,def=0" json:"trusted,omitempty"` - Force *bool `protobuf:"varint,7,opt,name=force,def=0" json:"force,omitempty"` - MarkChanges *bool `protobuf:"varint,8,opt,name=mark_changes,json=markChanges,def=0" json:"mark_changes,omitempty"` - Snapshot []*Snapshot `protobuf:"bytes,9,rep,name=snapshot" json:"snapshot,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *DeleteRequest) Reset() { *m = DeleteRequest{} } -func (m *DeleteRequest) String() string { return proto.CompactTextString(m) } -func (*DeleteRequest) ProtoMessage() {} -func (*DeleteRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{27} -} -func (m *DeleteRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_DeleteRequest.Unmarshal(m, b) -} -func (m *DeleteRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_DeleteRequest.Marshal(b, m, deterministic) -} -func (dst *DeleteRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_DeleteRequest.Merge(dst, src) -} -func (m *DeleteRequest) XXX_Size() int { - return xxx_messageInfo_DeleteRequest.Size(m) -} -func (m *DeleteRequest) XXX_DiscardUnknown() { - xxx_messageInfo_DeleteRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_DeleteRequest proto.InternalMessageInfo - -const Default_DeleteRequest_Trusted bool = false -const Default_DeleteRequest_Force bool = false -const Default_DeleteRequest_MarkChanges bool = false - -func (m *DeleteRequest) GetHeader() *InternalHeader { - if m != nil { - return m.Header - } - return nil -} - -func (m *DeleteRequest) GetKey() []*Reference { - if m != nil { - return m.Key - } - return nil -} - -func (m *DeleteRequest) GetTransaction() *Transaction { - if m != nil { - return m.Transaction - } - return nil -} - -func (m *DeleteRequest) GetTrusted() bool { - if m != nil && m.Trusted != nil { - return *m.Trusted - } - return Default_DeleteRequest_Trusted -} - -func (m *DeleteRequest) GetForce() bool { - if m != nil && m.Force != nil { - return *m.Force - } - return Default_DeleteRequest_Force -} - -func (m *DeleteRequest) GetMarkChanges() bool { - if m != nil && m.MarkChanges != nil { - return *m.MarkChanges - } - return Default_DeleteRequest_MarkChanges -} - -func (m *DeleteRequest) GetSnapshot() []*Snapshot { - if m != nil { - return m.Snapshot - } - return nil -} - -type DeleteResponse struct { - Cost *Cost `protobuf:"bytes,1,opt,name=cost" json:"cost,omitempty"` - Version []int64 `protobuf:"varint,3,rep,name=version" json:"version,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *DeleteResponse) Reset() { *m = DeleteResponse{} } -func (m *DeleteResponse) String() string { return proto.CompactTextString(m) } -func (*DeleteResponse) ProtoMessage() {} -func (*DeleteResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{28} -} -func (m *DeleteResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_DeleteResponse.Unmarshal(m, b) -} -func (m *DeleteResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_DeleteResponse.Marshal(b, m, deterministic) -} -func (dst *DeleteResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_DeleteResponse.Merge(dst, src) -} -func (m *DeleteResponse) XXX_Size() int { - return xxx_messageInfo_DeleteResponse.Size(m) -} -func (m *DeleteResponse) XXX_DiscardUnknown() { - xxx_messageInfo_DeleteResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_DeleteResponse proto.InternalMessageInfo - -func (m *DeleteResponse) GetCost() *Cost { - if m != nil { - return m.Cost - } - return nil -} - -func (m *DeleteResponse) GetVersion() []int64 { - if m != nil { - return m.Version - } - return nil -} - -type NextRequest struct { - Header *InternalHeader `protobuf:"bytes,5,opt,name=header" json:"header,omitempty"` - Cursor *Cursor `protobuf:"bytes,1,req,name=cursor" json:"cursor,omitempty"` - Count *int32 `protobuf:"varint,2,opt,name=count" json:"count,omitempty"` - Offset *int32 `protobuf:"varint,4,opt,name=offset,def=0" json:"offset,omitempty"` - Compile *bool `protobuf:"varint,3,opt,name=compile,def=0" json:"compile,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NextRequest) Reset() { *m = NextRequest{} } -func (m *NextRequest) String() string { return proto.CompactTextString(m) } -func (*NextRequest) ProtoMessage() {} -func (*NextRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{29} -} -func (m *NextRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NextRequest.Unmarshal(m, b) -} -func (m *NextRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NextRequest.Marshal(b, m, deterministic) -} -func (dst *NextRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_NextRequest.Merge(dst, src) -} -func (m *NextRequest) XXX_Size() int { - return xxx_messageInfo_NextRequest.Size(m) -} -func (m *NextRequest) XXX_DiscardUnknown() { - xxx_messageInfo_NextRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_NextRequest proto.InternalMessageInfo - -const Default_NextRequest_Offset int32 = 0 -const Default_NextRequest_Compile bool = false - -func (m *NextRequest) GetHeader() *InternalHeader { - if m != nil { - return m.Header - } - return nil -} - -func (m *NextRequest) GetCursor() *Cursor { - if m != nil { - return m.Cursor - } - return nil -} - -func (m *NextRequest) GetCount() int32 { - if m != nil && m.Count != nil { - return *m.Count - } - return 0 -} - -func (m *NextRequest) GetOffset() int32 { - if m != nil && m.Offset != nil { - return *m.Offset - } - return Default_NextRequest_Offset -} - -func (m *NextRequest) GetCompile() bool { - if m != nil && m.Compile != nil { - return *m.Compile - } - return Default_NextRequest_Compile -} - -type QueryResult struct { - Cursor *Cursor `protobuf:"bytes,1,opt,name=cursor" json:"cursor,omitempty"` - Result []*EntityProto `protobuf:"bytes,2,rep,name=result" json:"result,omitempty"` - SkippedResults *int32 `protobuf:"varint,7,opt,name=skipped_results,json=skippedResults" json:"skipped_results,omitempty"` - MoreResults *bool `protobuf:"varint,3,req,name=more_results,json=moreResults" json:"more_results,omitempty"` - KeysOnly *bool `protobuf:"varint,4,opt,name=keys_only,json=keysOnly" json:"keys_only,omitempty"` - IndexOnly *bool `protobuf:"varint,9,opt,name=index_only,json=indexOnly" json:"index_only,omitempty"` - SmallOps *bool `protobuf:"varint,10,opt,name=small_ops,json=smallOps" json:"small_ops,omitempty"` - CompiledQuery *CompiledQuery `protobuf:"bytes,5,opt,name=compiled_query,json=compiledQuery" json:"compiled_query,omitempty"` - CompiledCursor *CompiledCursor `protobuf:"bytes,6,opt,name=compiled_cursor,json=compiledCursor" json:"compiled_cursor,omitempty"` - Index []*CompositeIndex `protobuf:"bytes,8,rep,name=index" json:"index,omitempty"` - Version []int64 `protobuf:"varint,11,rep,name=version" json:"version,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *QueryResult) Reset() { *m = QueryResult{} } -func (m *QueryResult) String() string { return proto.CompactTextString(m) } -func (*QueryResult) ProtoMessage() {} -func (*QueryResult) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{30} -} -func (m *QueryResult) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_QueryResult.Unmarshal(m, b) -} -func (m *QueryResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_QueryResult.Marshal(b, m, deterministic) -} -func (dst *QueryResult) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryResult.Merge(dst, src) -} -func (m *QueryResult) XXX_Size() int { - return xxx_messageInfo_QueryResult.Size(m) -} -func (m *QueryResult) XXX_DiscardUnknown() { - xxx_messageInfo_QueryResult.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryResult proto.InternalMessageInfo - -func (m *QueryResult) GetCursor() *Cursor { - if m != nil { - return m.Cursor - } - return nil -} - -func (m *QueryResult) GetResult() []*EntityProto { - if m != nil { - return m.Result - } - return nil -} - -func (m *QueryResult) GetSkippedResults() int32 { - if m != nil && m.SkippedResults != nil { - return *m.SkippedResults - } - return 0 -} - -func (m *QueryResult) GetMoreResults() bool { - if m != nil && m.MoreResults != nil { - return *m.MoreResults - } - return false -} - -func (m *QueryResult) GetKeysOnly() bool { - if m != nil && m.KeysOnly != nil { - return *m.KeysOnly - } - return false -} - -func (m *QueryResult) GetIndexOnly() bool { - if m != nil && m.IndexOnly != nil { - return *m.IndexOnly - } - return false -} - -func (m *QueryResult) GetSmallOps() bool { - if m != nil && m.SmallOps != nil { - return *m.SmallOps - } - return false -} - -func (m *QueryResult) GetCompiledQuery() *CompiledQuery { - if m != nil { - return m.CompiledQuery - } - return nil -} - -func (m *QueryResult) GetCompiledCursor() *CompiledCursor { - if m != nil { - return m.CompiledCursor - } - return nil -} - -func (m *QueryResult) GetIndex() []*CompositeIndex { - if m != nil { - return m.Index - } - return nil -} - -func (m *QueryResult) GetVersion() []int64 { - if m != nil { - return m.Version - } - return nil -} - -type AllocateIdsRequest struct { - Header *InternalHeader `protobuf:"bytes,4,opt,name=header" json:"header,omitempty"` - ModelKey *Reference `protobuf:"bytes,1,opt,name=model_key,json=modelKey" json:"model_key,omitempty"` - Size *int64 `protobuf:"varint,2,opt,name=size" json:"size,omitempty"` - Max *int64 `protobuf:"varint,3,opt,name=max" json:"max,omitempty"` - Reserve []*Reference `protobuf:"bytes,5,rep,name=reserve" json:"reserve,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *AllocateIdsRequest) Reset() { *m = AllocateIdsRequest{} } -func (m *AllocateIdsRequest) String() string { return proto.CompactTextString(m) } -func (*AllocateIdsRequest) ProtoMessage() {} -func (*AllocateIdsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{31} -} -func (m *AllocateIdsRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_AllocateIdsRequest.Unmarshal(m, b) -} -func (m *AllocateIdsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_AllocateIdsRequest.Marshal(b, m, deterministic) -} -func (dst *AllocateIdsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_AllocateIdsRequest.Merge(dst, src) -} -func (m *AllocateIdsRequest) XXX_Size() int { - return xxx_messageInfo_AllocateIdsRequest.Size(m) -} -func (m *AllocateIdsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_AllocateIdsRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_AllocateIdsRequest proto.InternalMessageInfo - -func (m *AllocateIdsRequest) GetHeader() *InternalHeader { - if m != nil { - return m.Header - } - return nil -} - -func (m *AllocateIdsRequest) GetModelKey() *Reference { - if m != nil { - return m.ModelKey - } - return nil -} - -func (m *AllocateIdsRequest) GetSize() int64 { - if m != nil && m.Size != nil { - return *m.Size - } - return 0 -} - -func (m *AllocateIdsRequest) GetMax() int64 { - if m != nil && m.Max != nil { - return *m.Max - } - return 0 -} - -func (m *AllocateIdsRequest) GetReserve() []*Reference { - if m != nil { - return m.Reserve - } - return nil -} - -type AllocateIdsResponse struct { - Start *int64 `protobuf:"varint,1,req,name=start" json:"start,omitempty"` - End *int64 `protobuf:"varint,2,req,name=end" json:"end,omitempty"` - Cost *Cost `protobuf:"bytes,3,opt,name=cost" json:"cost,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *AllocateIdsResponse) Reset() { *m = AllocateIdsResponse{} } -func (m *AllocateIdsResponse) String() string { return proto.CompactTextString(m) } -func (*AllocateIdsResponse) ProtoMessage() {} -func (*AllocateIdsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{32} -} -func (m *AllocateIdsResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_AllocateIdsResponse.Unmarshal(m, b) -} -func (m *AllocateIdsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_AllocateIdsResponse.Marshal(b, m, deterministic) -} -func (dst *AllocateIdsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_AllocateIdsResponse.Merge(dst, src) -} -func (m *AllocateIdsResponse) XXX_Size() int { - return xxx_messageInfo_AllocateIdsResponse.Size(m) -} -func (m *AllocateIdsResponse) XXX_DiscardUnknown() { - xxx_messageInfo_AllocateIdsResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_AllocateIdsResponse proto.InternalMessageInfo - -func (m *AllocateIdsResponse) GetStart() int64 { - if m != nil && m.Start != nil { - return *m.Start - } - return 0 -} - -func (m *AllocateIdsResponse) GetEnd() int64 { - if m != nil && m.End != nil { - return *m.End - } - return 0 -} - -func (m *AllocateIdsResponse) GetCost() *Cost { - if m != nil { - return m.Cost - } - return nil -} - -type CompositeIndices struct { - Index []*CompositeIndex `protobuf:"bytes,1,rep,name=index" json:"index,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CompositeIndices) Reset() { *m = CompositeIndices{} } -func (m *CompositeIndices) String() string { return proto.CompactTextString(m) } -func (*CompositeIndices) ProtoMessage() {} -func (*CompositeIndices) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{33} -} -func (m *CompositeIndices) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CompositeIndices.Unmarshal(m, b) -} -func (m *CompositeIndices) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CompositeIndices.Marshal(b, m, deterministic) -} -func (dst *CompositeIndices) XXX_Merge(src proto.Message) { - xxx_messageInfo_CompositeIndices.Merge(dst, src) -} -func (m *CompositeIndices) XXX_Size() int { - return xxx_messageInfo_CompositeIndices.Size(m) -} -func (m *CompositeIndices) XXX_DiscardUnknown() { - xxx_messageInfo_CompositeIndices.DiscardUnknown(m) -} - -var xxx_messageInfo_CompositeIndices proto.InternalMessageInfo - -func (m *CompositeIndices) GetIndex() []*CompositeIndex { - if m != nil { - return m.Index - } - return nil -} - -type AddActionsRequest struct { - Header *InternalHeader `protobuf:"bytes,3,opt,name=header" json:"header,omitempty"` - Transaction *Transaction `protobuf:"bytes,1,req,name=transaction" json:"transaction,omitempty"` - Action []*Action `protobuf:"bytes,2,rep,name=action" json:"action,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *AddActionsRequest) Reset() { *m = AddActionsRequest{} } -func (m *AddActionsRequest) String() string { return proto.CompactTextString(m) } -func (*AddActionsRequest) ProtoMessage() {} -func (*AddActionsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{34} -} -func (m *AddActionsRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_AddActionsRequest.Unmarshal(m, b) -} -func (m *AddActionsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_AddActionsRequest.Marshal(b, m, deterministic) -} -func (dst *AddActionsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_AddActionsRequest.Merge(dst, src) -} -func (m *AddActionsRequest) XXX_Size() int { - return xxx_messageInfo_AddActionsRequest.Size(m) -} -func (m *AddActionsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_AddActionsRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_AddActionsRequest proto.InternalMessageInfo - -func (m *AddActionsRequest) GetHeader() *InternalHeader { - if m != nil { - return m.Header - } - return nil -} - -func (m *AddActionsRequest) GetTransaction() *Transaction { - if m != nil { - return m.Transaction - } - return nil -} - -func (m *AddActionsRequest) GetAction() []*Action { - if m != nil { - return m.Action - } - return nil -} - -type AddActionsResponse struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *AddActionsResponse) Reset() { *m = AddActionsResponse{} } -func (m *AddActionsResponse) String() string { return proto.CompactTextString(m) } -func (*AddActionsResponse) ProtoMessage() {} -func (*AddActionsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{35} -} -func (m *AddActionsResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_AddActionsResponse.Unmarshal(m, b) -} -func (m *AddActionsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_AddActionsResponse.Marshal(b, m, deterministic) -} -func (dst *AddActionsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_AddActionsResponse.Merge(dst, src) -} -func (m *AddActionsResponse) XXX_Size() int { - return xxx_messageInfo_AddActionsResponse.Size(m) -} -func (m *AddActionsResponse) XXX_DiscardUnknown() { - xxx_messageInfo_AddActionsResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_AddActionsResponse proto.InternalMessageInfo - -type BeginTransactionRequest struct { - Header *InternalHeader `protobuf:"bytes,3,opt,name=header" json:"header,omitempty"` - App *string `protobuf:"bytes,1,req,name=app" json:"app,omitempty"` - AllowMultipleEg *bool `protobuf:"varint,2,opt,name=allow_multiple_eg,json=allowMultipleEg,def=0" json:"allow_multiple_eg,omitempty"` - DatabaseId *string `protobuf:"bytes,4,opt,name=database_id,json=databaseId" json:"database_id,omitempty"` - Mode *BeginTransactionRequest_TransactionMode `protobuf:"varint,5,opt,name=mode,enum=appengine.BeginTransactionRequest_TransactionMode,def=0" json:"mode,omitempty"` - PreviousTransaction *Transaction `protobuf:"bytes,7,opt,name=previous_transaction,json=previousTransaction" json:"previous_transaction,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *BeginTransactionRequest) Reset() { *m = BeginTransactionRequest{} } -func (m *BeginTransactionRequest) String() string { return proto.CompactTextString(m) } -func (*BeginTransactionRequest) ProtoMessage() {} -func (*BeginTransactionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{36} -} -func (m *BeginTransactionRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_BeginTransactionRequest.Unmarshal(m, b) -} -func (m *BeginTransactionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_BeginTransactionRequest.Marshal(b, m, deterministic) -} -func (dst *BeginTransactionRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_BeginTransactionRequest.Merge(dst, src) -} -func (m *BeginTransactionRequest) XXX_Size() int { - return xxx_messageInfo_BeginTransactionRequest.Size(m) -} -func (m *BeginTransactionRequest) XXX_DiscardUnknown() { - xxx_messageInfo_BeginTransactionRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_BeginTransactionRequest proto.InternalMessageInfo - -const Default_BeginTransactionRequest_AllowMultipleEg bool = false -const Default_BeginTransactionRequest_Mode BeginTransactionRequest_TransactionMode = BeginTransactionRequest_UNKNOWN - -func (m *BeginTransactionRequest) GetHeader() *InternalHeader { - if m != nil { - return m.Header - } - return nil -} - -func (m *BeginTransactionRequest) GetApp() string { - if m != nil && m.App != nil { - return *m.App - } - return "" -} - -func (m *BeginTransactionRequest) GetAllowMultipleEg() bool { - if m != nil && m.AllowMultipleEg != nil { - return *m.AllowMultipleEg - } - return Default_BeginTransactionRequest_AllowMultipleEg -} - -func (m *BeginTransactionRequest) GetDatabaseId() string { - if m != nil && m.DatabaseId != nil { - return *m.DatabaseId - } - return "" -} - -func (m *BeginTransactionRequest) GetMode() BeginTransactionRequest_TransactionMode { - if m != nil && m.Mode != nil { - return *m.Mode - } - return Default_BeginTransactionRequest_Mode -} - -func (m *BeginTransactionRequest) GetPreviousTransaction() *Transaction { - if m != nil { - return m.PreviousTransaction - } - return nil -} - -type CommitResponse struct { - Cost *Cost `protobuf:"bytes,1,opt,name=cost" json:"cost,omitempty"` - Version []*CommitResponse_Version `protobuf:"group,3,rep,name=Version,json=version" json:"version,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CommitResponse) Reset() { *m = CommitResponse{} } -func (m *CommitResponse) String() string { return proto.CompactTextString(m) } -func (*CommitResponse) ProtoMessage() {} -func (*CommitResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{37} -} -func (m *CommitResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CommitResponse.Unmarshal(m, b) -} -func (m *CommitResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CommitResponse.Marshal(b, m, deterministic) -} -func (dst *CommitResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_CommitResponse.Merge(dst, src) -} -func (m *CommitResponse) XXX_Size() int { - return xxx_messageInfo_CommitResponse.Size(m) -} -func (m *CommitResponse) XXX_DiscardUnknown() { - xxx_messageInfo_CommitResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_CommitResponse proto.InternalMessageInfo - -func (m *CommitResponse) GetCost() *Cost { - if m != nil { - return m.Cost - } - return nil -} - -func (m *CommitResponse) GetVersion() []*CommitResponse_Version { - if m != nil { - return m.Version - } - return nil -} - -type CommitResponse_Version struct { - RootEntityKey *Reference `protobuf:"bytes,4,req,name=root_entity_key,json=rootEntityKey" json:"root_entity_key,omitempty"` - Version *int64 `protobuf:"varint,5,req,name=version" json:"version,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CommitResponse_Version) Reset() { *m = CommitResponse_Version{} } -func (m *CommitResponse_Version) String() string { return proto.CompactTextString(m) } -func (*CommitResponse_Version) ProtoMessage() {} -func (*CommitResponse_Version) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{37, 0} -} -func (m *CommitResponse_Version) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CommitResponse_Version.Unmarshal(m, b) -} -func (m *CommitResponse_Version) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CommitResponse_Version.Marshal(b, m, deterministic) -} -func (dst *CommitResponse_Version) XXX_Merge(src proto.Message) { - xxx_messageInfo_CommitResponse_Version.Merge(dst, src) -} -func (m *CommitResponse_Version) XXX_Size() int { - return xxx_messageInfo_CommitResponse_Version.Size(m) -} -func (m *CommitResponse_Version) XXX_DiscardUnknown() { - xxx_messageInfo_CommitResponse_Version.DiscardUnknown(m) -} - -var xxx_messageInfo_CommitResponse_Version proto.InternalMessageInfo - -func (m *CommitResponse_Version) GetRootEntityKey() *Reference { - if m != nil { - return m.RootEntityKey - } - return nil -} - -func (m *CommitResponse_Version) GetVersion() int64 { - if m != nil && m.Version != nil { - return *m.Version - } - return 0 -} - -func init() { - proto.RegisterType((*Action)(nil), "appengine.Action") - proto.RegisterType((*PropertyValue)(nil), "appengine.PropertyValue") - proto.RegisterType((*PropertyValue_PointValue)(nil), "appengine.PropertyValue.PointValue") - proto.RegisterType((*PropertyValue_UserValue)(nil), "appengine.PropertyValue.UserValue") - proto.RegisterType((*PropertyValue_ReferenceValue)(nil), "appengine.PropertyValue.ReferenceValue") - proto.RegisterType((*PropertyValue_ReferenceValue_PathElement)(nil), "appengine.PropertyValue.ReferenceValue.PathElement") - proto.RegisterType((*Property)(nil), "appengine.Property") - proto.RegisterType((*Path)(nil), "appengine.Path") - proto.RegisterType((*Path_Element)(nil), "appengine.Path.Element") - proto.RegisterType((*Reference)(nil), "appengine.Reference") - proto.RegisterType((*User)(nil), "appengine.User") - proto.RegisterType((*EntityProto)(nil), "appengine.EntityProto") - proto.RegisterType((*CompositeProperty)(nil), "appengine.CompositeProperty") - proto.RegisterType((*Index)(nil), "appengine.Index") - proto.RegisterType((*Index_Property)(nil), "appengine.Index.Property") - proto.RegisterType((*CompositeIndex)(nil), "appengine.CompositeIndex") - proto.RegisterType((*IndexPostfix)(nil), "appengine.IndexPostfix") - proto.RegisterType((*IndexPostfix_IndexValue)(nil), "appengine.IndexPostfix.IndexValue") - proto.RegisterType((*IndexPosition)(nil), "appengine.IndexPosition") - proto.RegisterType((*Snapshot)(nil), "appengine.Snapshot") - proto.RegisterType((*InternalHeader)(nil), "appengine.InternalHeader") - proto.RegisterType((*Transaction)(nil), "appengine.Transaction") - proto.RegisterType((*Query)(nil), "appengine.Query") - proto.RegisterType((*Query_Filter)(nil), "appengine.Query.Filter") - proto.RegisterType((*Query_Order)(nil), "appengine.Query.Order") - proto.RegisterType((*CompiledQuery)(nil), "appengine.CompiledQuery") - proto.RegisterType((*CompiledQuery_PrimaryScan)(nil), "appengine.CompiledQuery.PrimaryScan") - proto.RegisterType((*CompiledQuery_MergeJoinScan)(nil), "appengine.CompiledQuery.MergeJoinScan") - proto.RegisterType((*CompiledQuery_EntityFilter)(nil), "appengine.CompiledQuery.EntityFilter") - proto.RegisterType((*CompiledCursor)(nil), "appengine.CompiledCursor") - proto.RegisterType((*CompiledCursor_Position)(nil), "appengine.CompiledCursor.Position") - proto.RegisterType((*CompiledCursor_Position_IndexValue)(nil), "appengine.CompiledCursor.Position.IndexValue") - proto.RegisterType((*Cursor)(nil), "appengine.Cursor") - proto.RegisterType((*Error)(nil), "appengine.Error") - proto.RegisterType((*Cost)(nil), "appengine.Cost") - proto.RegisterType((*Cost_CommitCost)(nil), "appengine.Cost.CommitCost") - proto.RegisterType((*GetRequest)(nil), "appengine.GetRequest") - proto.RegisterType((*GetResponse)(nil), "appengine.GetResponse") - proto.RegisterType((*GetResponse_Entity)(nil), "appengine.GetResponse.Entity") - proto.RegisterType((*PutRequest)(nil), "appengine.PutRequest") - proto.RegisterType((*PutResponse)(nil), "appengine.PutResponse") - proto.RegisterType((*TouchRequest)(nil), "appengine.TouchRequest") - proto.RegisterType((*TouchResponse)(nil), "appengine.TouchResponse") - proto.RegisterType((*DeleteRequest)(nil), "appengine.DeleteRequest") - proto.RegisterType((*DeleteResponse)(nil), "appengine.DeleteResponse") - proto.RegisterType((*NextRequest)(nil), "appengine.NextRequest") - proto.RegisterType((*QueryResult)(nil), "appengine.QueryResult") - proto.RegisterType((*AllocateIdsRequest)(nil), "appengine.AllocateIdsRequest") - proto.RegisterType((*AllocateIdsResponse)(nil), "appengine.AllocateIdsResponse") - proto.RegisterType((*CompositeIndices)(nil), "appengine.CompositeIndices") - proto.RegisterType((*AddActionsRequest)(nil), "appengine.AddActionsRequest") - proto.RegisterType((*AddActionsResponse)(nil), "appengine.AddActionsResponse") - proto.RegisterType((*BeginTransactionRequest)(nil), "appengine.BeginTransactionRequest") - proto.RegisterType((*CommitResponse)(nil), "appengine.CommitResponse") - proto.RegisterType((*CommitResponse_Version)(nil), "appengine.CommitResponse.Version") -} - -func init() { - proto.RegisterFile("google.golang.org/appengine/internal/datastore/datastore_v3.proto", fileDescriptor_datastore_v3_83b17b80c34f6179) -} - -var fileDescriptor_datastore_v3_83b17b80c34f6179 = []byte{ - // 4156 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x5a, 0xcd, 0x73, 0xe3, 0x46, - 0x76, 0x37, 0xc1, 0xef, 0x47, 0x89, 0x82, 0x5a, 0xf3, 0xc1, 0xa1, 0x3f, 0x46, 0xc6, 0xac, 0x6d, - 0xd9, 0x6b, 0x73, 0x6c, 0xf9, 0x23, 0x5b, 0x4a, 0x76, 0x1d, 0x4a, 0xc4, 0x68, 0x90, 0xa1, 0x48, - 0xb9, 0x09, 0xd9, 0x9e, 0x5c, 0x50, 0x18, 0xa2, 0x29, 0x21, 0x43, 0x02, 0x30, 0x00, 0x6a, 0x46, - 0x93, 0xe4, 0x90, 0x4b, 0x2a, 0x55, 0x5b, 0xa9, 0x1c, 0x92, 0x4a, 0x25, 0xf9, 0x07, 0x72, 0xc8, - 0x39, 0x95, 0xaa, 0x54, 0xf6, 0x98, 0x5b, 0x0e, 0x7b, 0xc9, 0x31, 0x95, 0x73, 0xf2, 0x27, 0x24, - 0x39, 0xa4, 0xfa, 0x75, 0x03, 0x02, 0x28, 0x4a, 0x23, 0x6d, 0xf6, 0x90, 0x13, 0xd1, 0xef, 0xfd, - 0xba, 0xf1, 0xfa, 0xf5, 0xfb, 0x6c, 0x10, 0xba, 0xc7, 0xbe, 0x7f, 0x3c, 0x65, 0x9d, 0x63, 0x7f, - 0x6a, 0x7b, 0xc7, 0x1d, 0x3f, 0x3c, 0x7e, 0x68, 0x07, 0x01, 0xf3, 0x8e, 0x5d, 0x8f, 0x3d, 0x74, - 0xbd, 0x98, 0x85, 0x9e, 0x3d, 0x7d, 0xe8, 0xd8, 0xb1, 0x1d, 0xc5, 0x7e, 0xc8, 0xce, 0x9f, 0xac, - 0xd3, 0xcf, 0x3b, 0x41, 0xe8, 0xc7, 0x3e, 0xa9, 0xa7, 0x13, 0xb4, 0x1a, 0x54, 0xba, 0xe3, 0xd8, - 0xf5, 0x3d, 0xed, 0x1f, 0x2b, 0xb0, 0x7a, 0x18, 0xfa, 0x01, 0x0b, 0xe3, 0xb3, 0x6f, 0xed, 0xe9, - 0x9c, 0x91, 0x77, 0x00, 0x5c, 0x2f, 0xfe, 0xea, 0x0b, 0x1c, 0xb5, 0x0a, 0x9b, 0x85, 0xad, 0x22, - 0xcd, 0x50, 0x88, 0x06, 0x2b, 0xcf, 0x7c, 0x7f, 0xca, 0x6c, 0x4f, 0x20, 0x94, 0xcd, 0xc2, 0x56, - 0x8d, 0xe6, 0x68, 0x64, 0x13, 0x1a, 0x51, 0x1c, 0xba, 0xde, 0xb1, 0x80, 0x14, 0x37, 0x0b, 0x5b, - 0x75, 0x9a, 0x25, 0x71, 0x84, 0xe3, 0xcf, 0x9f, 0x4d, 0x99, 0x40, 0x94, 0x36, 0x0b, 0x5b, 0x05, - 0x9a, 0x25, 0x91, 0x3d, 0x80, 0xc0, 0x77, 0xbd, 0xf8, 0x14, 0x01, 0xe5, 0xcd, 0xc2, 0x16, 0x6c, - 0x3f, 0xe8, 0xa4, 0x7b, 0xe8, 0xe4, 0xa4, 0xee, 0x1c, 0x72, 0x28, 0x3e, 0xd2, 0xcc, 0x34, 0xf2, - 0xdb, 0x50, 0x9f, 0x47, 0x2c, 0x14, 0x6b, 0xd4, 0x70, 0x0d, 0xed, 0xd2, 0x35, 0x8e, 0x22, 0x16, - 0x8a, 0x25, 0xce, 0x27, 0x91, 0x21, 0x34, 0x43, 0x36, 0x61, 0x21, 0xf3, 0xc6, 0x4c, 0x2c, 0xb3, - 0x82, 0xcb, 0x7c, 0x70, 0xe9, 0x32, 0x34, 0x81, 0x8b, 0xb5, 0x16, 0xa6, 0xb7, 0xb7, 0x00, 0xce, - 0x85, 0x25, 0x2b, 0x50, 0x78, 0xd9, 0xaa, 0x6c, 0x2a, 0x5b, 0x05, 0x5a, 0x78, 0xc9, 0x47, 0x67, - 0xad, 0xaa, 0x18, 0x9d, 0xb5, 0xff, 0xa9, 0x00, 0xf5, 0x54, 0x26, 0x72, 0x0b, 0xca, 0x6c, 0x66, - 0xbb, 0xd3, 0x56, 0x7d, 0x53, 0xd9, 0xaa, 0x53, 0x31, 0x20, 0xf7, 0xa1, 0x61, 0xcf, 0xe3, 0x13, - 0xcb, 0xf1, 0x67, 0xb6, 0xeb, 0xb5, 0x00, 0x79, 0xc0, 0x49, 0x3d, 0xa4, 0x90, 0x36, 0xd4, 0x3c, - 0x77, 0xfc, 0xdc, 0xb3, 0x67, 0xac, 0xd5, 0xc0, 0x73, 0x48, 0xc7, 0xe4, 0x13, 0x20, 0x13, 0xe6, - 0xb0, 0xd0, 0x8e, 0x99, 0x63, 0xb9, 0x0e, 0xf3, 0x62, 0x37, 0x3e, 0x6b, 0xdd, 0x46, 0xd4, 0x7a, - 0xca, 0x31, 0x24, 0x23, 0x0f, 0x0f, 0x42, 0xff, 0xd4, 0x75, 0x58, 0xd8, 0xba, 0xb3, 0x00, 0x3f, - 0x94, 0x8c, 0xf6, 0xbf, 0x17, 0xa0, 0x99, 0xd7, 0x05, 0x51, 0xa1, 0x68, 0x07, 0x41, 0x6b, 0x15, - 0xa5, 0xe4, 0x8f, 0xe4, 0x6d, 0x00, 0x2e, 0x8a, 0x15, 0x05, 0xf6, 0x98, 0xb5, 0x6e, 0xe1, 0x5a, - 0x75, 0x4e, 0x19, 0x71, 0x02, 0x39, 0x82, 0x46, 0x60, 0xc7, 0x27, 0x6c, 0xca, 0x66, 0xcc, 0x8b, - 0x5b, 0xcd, 0xcd, 0xe2, 0x16, 0x6c, 0x7f, 0x7e, 0x4d, 0xd5, 0x77, 0x0e, 0xed, 0xf8, 0x44, 0x17, - 0x53, 0x69, 0x76, 0x9d, 0xb6, 0x0e, 0x8d, 0x0c, 0x8f, 0x10, 0x28, 0xc5, 0x67, 0x01, 0x6b, 0xad, - 0xa1, 0x5c, 0xf8, 0x4c, 0x9a, 0xa0, 0xb8, 0x4e, 0x4b, 0x45, 0xf3, 0x57, 0x5c, 0x87, 0x63, 0x50, - 0x87, 0xeb, 0x28, 0x22, 0x3e, 0x6b, 0xff, 0x51, 0x86, 0x5a, 0x22, 0x00, 0xe9, 0x42, 0x75, 0xc6, - 0x6c, 0xcf, 0xf5, 0x8e, 0xd1, 0x69, 0x9a, 0xdb, 0x6f, 0x2e, 0x11, 0xb3, 0x73, 0x20, 0x20, 0x3b, - 0x30, 0x18, 0x5a, 0x07, 0x7a, 0x77, 0x60, 0x0c, 0xf6, 0x69, 0x32, 0x8f, 0x1f, 0xa6, 0x7c, 0xb4, - 0xe6, 0xa1, 0x8b, 0x9e, 0x55, 0xa7, 0x20, 0x49, 0x47, 0xa1, 0x9b, 0x0a, 0x51, 0x14, 0x82, 0xe2, - 0x21, 0x76, 0xa0, 0x9c, 0xb8, 0x88, 0xb2, 0xd5, 0xd8, 0x6e, 0x5d, 0xa6, 0x1c, 0x2a, 0x60, 0xdc, - 0x20, 0x66, 0xf3, 0x69, 0xec, 0x06, 0x53, 0xee, 0x76, 0xca, 0x56, 0x8d, 0xa6, 0x63, 0xf2, 0x1e, - 0x40, 0xc4, 0xec, 0x70, 0x7c, 0x62, 0x3f, 0x9b, 0xb2, 0x56, 0x85, 0x7b, 0xf6, 0x4e, 0x79, 0x62, - 0x4f, 0x23, 0x46, 0x33, 0x0c, 0x62, 0xc3, 0xdd, 0x49, 0x1c, 0x59, 0xb1, 0xff, 0x9c, 0x79, 0xee, - 0x2b, 0x9b, 0x07, 0x12, 0xcb, 0x0f, 0xf8, 0x0f, 0xfa, 0x58, 0x73, 0xfb, 0xc3, 0x65, 0x5b, 0x7f, - 0x14, 0x47, 0x66, 0x66, 0xc6, 0x10, 0x27, 0xd0, 0xdb, 0x93, 0x65, 0x64, 0xd2, 0x86, 0xca, 0xd4, - 0x1f, 0xdb, 0x53, 0xd6, 0xaa, 0x73, 0x2d, 0xec, 0x28, 0xcc, 0xa3, 0x92, 0xa2, 0xfd, 0xb3, 0x02, - 0x55, 0xa9, 0x47, 0xd2, 0x84, 0x8c, 0x26, 0xd5, 0x37, 0x48, 0x0d, 0x4a, 0xbb, 0xfd, 0xe1, 0xae, - 0xda, 0xe4, 0x4f, 0xa6, 0xfe, 0xbd, 0xa9, 0xae, 0x71, 0xcc, 0xee, 0x53, 0x53, 0x1f, 0x99, 0x94, - 0x63, 0x54, 0xb2, 0x0e, 0xab, 0x5d, 0x73, 0x78, 0x60, 0xed, 0x75, 0x4d, 0x7d, 0x7f, 0x48, 0x9f, - 0xaa, 0x05, 0xb2, 0x0a, 0x75, 0x24, 0xf5, 0x8d, 0xc1, 0x13, 0x55, 0xe1, 0x33, 0x70, 0x68, 0x1a, - 0x66, 0x5f, 0x57, 0x8b, 0x44, 0x85, 0x15, 0x31, 0x63, 0x38, 0x30, 0xf5, 0x81, 0xa9, 0x96, 0x52, - 0xca, 0xe8, 0xe8, 0xe0, 0xa0, 0x4b, 0x9f, 0xaa, 0x65, 0xb2, 0x06, 0x0d, 0xa4, 0x74, 0x8f, 0xcc, - 0xc7, 0x43, 0xaa, 0x56, 0x48, 0x03, 0xaa, 0xfb, 0x3d, 0xeb, 0xbb, 0xc7, 0xfa, 0x40, 0xad, 0x92, - 0x15, 0xa8, 0xed, 0xf7, 0x2c, 0xfd, 0xa0, 0x6b, 0xf4, 0xd5, 0x1a, 0x9f, 0xbd, 0xaf, 0x0f, 0xe9, - 0x68, 0x64, 0x1d, 0x0e, 0x8d, 0x81, 0xa9, 0xd6, 0x49, 0x1d, 0xca, 0xfb, 0x3d, 0xcb, 0x38, 0x50, - 0x81, 0x10, 0x68, 0xee, 0xf7, 0xac, 0xc3, 0xc7, 0xc3, 0x81, 0x3e, 0x38, 0x3a, 0xd8, 0xd5, 0xa9, - 0xda, 0x20, 0xb7, 0x40, 0xe5, 0xb4, 0xe1, 0xc8, 0xec, 0xf6, 0xbb, 0xbd, 0x1e, 0xd5, 0x47, 0x23, - 0x75, 0x85, 0x4b, 0xbd, 0xdf, 0xb3, 0x68, 0xd7, 0xe4, 0xfb, 0x5a, 0xe5, 0x2f, 0xe4, 0x7b, 0x7f, - 0xa2, 0x3f, 0x55, 0xd7, 0xf9, 0x2b, 0xf4, 0x81, 0x69, 0x98, 0x4f, 0xad, 0x43, 0x3a, 0x34, 0x87, - 0xea, 0x06, 0x17, 0xd0, 0x18, 0xf4, 0xf4, 0xef, 0xad, 0x6f, 0xbb, 0xfd, 0x23, 0x5d, 0x25, 0xda, - 0x8f, 0xe1, 0xf6, 0xd2, 0x33, 0xe1, 0xaa, 0x7b, 0x6c, 0x1e, 0xf4, 0xd5, 0x02, 0x7f, 0xe2, 0x9b, - 0x52, 0x15, 0xed, 0x0f, 0xa0, 0xc4, 0x5d, 0x86, 0x7c, 0x06, 0xd5, 0xc4, 0x1b, 0x0b, 0xe8, 0x8d, - 0x77, 0xb3, 0x67, 0x6d, 0xc7, 0x27, 0x9d, 0xc4, 0xe3, 0x12, 0x5c, 0xbb, 0x0b, 0xd5, 0x45, 0x4f, - 0x53, 0x2e, 0x78, 0x5a, 0xf1, 0x82, 0xa7, 0x95, 0x32, 0x9e, 0x66, 0x43, 0x3d, 0xf5, 0xed, 0x9b, - 0x47, 0x91, 0x07, 0x50, 0xe2, 0xde, 0xdf, 0x6a, 0xa2, 0x87, 0xac, 0x2d, 0x08, 0x4c, 0x91, 0xa9, - 0xfd, 0x43, 0x01, 0x4a, 0x3c, 0xda, 0x9e, 0x07, 0xda, 0xc2, 0x15, 0x81, 0x56, 0xb9, 0x32, 0xd0, - 0x16, 0xaf, 0x15, 0x68, 0x2b, 0x37, 0x0b, 0xb4, 0xd5, 0x4b, 0x02, 0xad, 0xf6, 0x67, 0x45, 0x68, - 0xe8, 0x38, 0xf3, 0x10, 0x13, 0xfd, 0xfb, 0x50, 0x7c, 0xce, 0xce, 0x50, 0x3f, 0x8d, 0xed, 0x5b, - 0x99, 0xdd, 0xa6, 0x2a, 0xa4, 0x1c, 0x40, 0xb6, 0x61, 0x45, 0xbc, 0xd0, 0x3a, 0x0e, 0xfd, 0x79, - 0xd0, 0x52, 0x97, 0xab, 0xa7, 0x21, 0x40, 0xfb, 0x1c, 0x43, 0xde, 0x83, 0xb2, 0xff, 0xc2, 0x63, - 0x21, 0xc6, 0xc1, 0x3c, 0x98, 0x2b, 0x8f, 0x0a, 0x2e, 0x79, 0x08, 0xa5, 0xe7, 0xae, 0xe7, 0xe0, - 0x19, 0xe6, 0x23, 0x61, 0x46, 0xd0, 0xce, 0x13, 0xd7, 0x73, 0x28, 0x02, 0xc9, 0x3d, 0xa8, 0xf1, - 0x5f, 0x8c, 0x7b, 0x65, 0xdc, 0x68, 0x95, 0x8f, 0x79, 0xd0, 0x7b, 0x08, 0xb5, 0x40, 0xc6, 0x10, - 0x4c, 0x00, 0x8d, 0xed, 0x8d, 0x25, 0xe1, 0x85, 0xa6, 0x20, 0xf2, 0x15, 0xac, 0x84, 0xf6, 0x0b, - 0x2b, 0x9d, 0xb4, 0x76, 0xf9, 0xa4, 0x46, 0x68, 0xbf, 0x48, 0x23, 0x38, 0x81, 0x52, 0x68, 0x7b, - 0xcf, 0x5b, 0x64, 0xb3, 0xb0, 0x55, 0xa6, 0xf8, 0xac, 0x7d, 0x01, 0x25, 0x2e, 0x25, 0x8f, 0x08, - 0xfb, 0x3d, 0xf4, 0xff, 0xee, 0x9e, 0xa9, 0x16, 0x12, 0x7f, 0xfe, 0x96, 0x47, 0x03, 0x45, 0x72, - 0x0f, 0xf4, 0xd1, 0xa8, 0xbb, 0xaf, 0xab, 0x45, 0xad, 0x07, 0xeb, 0x7b, 0xfe, 0x2c, 0xf0, 0x23, - 0x37, 0x66, 0xe9, 0xf2, 0xf7, 0xa0, 0xe6, 0x7a, 0x0e, 0x7b, 0x69, 0xb9, 0x0e, 0x9a, 0x56, 0x91, - 0x56, 0x71, 0x6c, 0x38, 0xdc, 0xe4, 0x4e, 0x65, 0x31, 0x55, 0xe4, 0x26, 0x87, 0x03, 0xed, 0x2f, - 0x15, 0x28, 0x1b, 0x1c, 0xc1, 0x8d, 0x4f, 0x9e, 0x14, 0x7a, 0x8f, 0x30, 0x4c, 0x10, 0x24, 0x93, - 0xfb, 0x50, 0x1b, 0x6a, 0xb6, 0x37, 0x66, 0xbc, 0xe2, 0xc3, 0x3c, 0x50, 0xa3, 0xe9, 0x98, 0x7c, - 0x99, 0xd1, 0x9f, 0x82, 0x2e, 0x7b, 0x2f, 0xa3, 0x0a, 0x7c, 0xc1, 0x12, 0x2d, 0xb6, 0xff, 0xaa, - 0x90, 0x49, 0x6e, 0xcb, 0x12, 0x4f, 0x1f, 0xea, 0x8e, 0x1b, 0x32, 0xac, 0x23, 0xe5, 0x41, 0x3f, - 0xb8, 0x74, 0xe1, 0x4e, 0x2f, 0x81, 0xee, 0xd4, 0xbb, 0xa3, 0x3d, 0x7d, 0xd0, 0xe3, 0x99, 0xef, - 0x7c, 0x01, 0xed, 0x23, 0xa8, 0xa7, 0x10, 0x0c, 0xc7, 0x09, 0x48, 0x2d, 0x70, 0xf5, 0xf6, 0xf4, - 0x74, 0xac, 0x68, 0x7f, 0xad, 0x40, 0x33, 0xd5, 0xaf, 0xd0, 0xd0, 0x6d, 0xa8, 0xd8, 0x41, 0x90, - 0xa8, 0xb6, 0x4e, 0xcb, 0x76, 0x10, 0x18, 0x8e, 0x8c, 0x2d, 0x0a, 0x6a, 0x9b, 0xc7, 0x96, 0x4f, - 0x01, 0x1c, 0x36, 0x71, 0x3d, 0x17, 0x85, 0x2e, 0xa2, 0xc1, 0xab, 0x8b, 0x42, 0xd3, 0x0c, 0x86, - 0x7c, 0x09, 0xe5, 0x28, 0xb6, 0x63, 0x91, 0x2b, 0x9b, 0xdb, 0xf7, 0x33, 0xe0, 0xbc, 0x08, 0x9d, - 0x11, 0x87, 0x51, 0x81, 0x26, 0x5f, 0xc1, 0x2d, 0xdf, 0x9b, 0x9e, 0x59, 0xf3, 0x88, 0x59, 0xee, - 0xc4, 0x0a, 0xd9, 0x0f, 0x73, 0x37, 0x64, 0x4e, 0x3e, 0xa7, 0xae, 0x73, 0xc8, 0x51, 0xc4, 0x8c, - 0x09, 0x95, 0x7c, 0xed, 0x6b, 0x28, 0xe3, 0x3a, 0x7c, 0xcf, 0xdf, 0x51, 0xc3, 0xd4, 0xad, 0xe1, - 0xa0, 0xff, 0x54, 0xe8, 0x80, 0xea, 0xdd, 0x9e, 0x85, 0x44, 0x55, 0xe1, 0xc1, 0xbe, 0xa7, 0xf7, - 0x75, 0x53, 0xef, 0xa9, 0x45, 0x9e, 0x3d, 0x74, 0x4a, 0x87, 0x54, 0x2d, 0x69, 0xff, 0x53, 0x80, - 0x15, 0x94, 0xe7, 0xd0, 0x8f, 0xe2, 0x89, 0xfb, 0x92, 0xec, 0x41, 0x43, 0x98, 0xdd, 0xa9, 0x2c, - 0xe8, 0xb9, 0x33, 0x68, 0x8b, 0x7b, 0x96, 0x68, 0x31, 0x90, 0x75, 0xb4, 0x9b, 0x3e, 0x27, 0x21, - 0x45, 0x41, 0xa7, 0xbf, 0x22, 0xa4, 0xbc, 0x05, 0x95, 0x67, 0x6c, 0xe2, 0x87, 0x22, 0x04, 0xd6, - 0x76, 0x4a, 0x71, 0x38, 0x67, 0x54, 0xd2, 0xda, 0x36, 0xc0, 0xf9, 0xfa, 0xe4, 0x01, 0xac, 0x26, - 0xc6, 0x66, 0xa1, 0x71, 0x89, 0x93, 0x5b, 0x49, 0x88, 0x83, 0x5c, 0x75, 0xa3, 0x5c, 0xab, 0xba, - 0xd1, 0xbe, 0x86, 0xd5, 0x64, 0x3f, 0xe2, 0xfc, 0x54, 0x21, 0x79, 0x01, 0x63, 0xca, 0x82, 0x8c, - 0xca, 0x45, 0x19, 0xb5, 0x9f, 0x41, 0x6d, 0xe4, 0xd9, 0x41, 0x74, 0xe2, 0xc7, 0xdc, 0x7a, 0xe2, - 0x48, 0xfa, 0xaa, 0x12, 0x47, 0x9a, 0x06, 0x15, 0x7e, 0x38, 0xf3, 0x88, 0xbb, 0xbf, 0x31, 0xe8, - 0xee, 0x99, 0xc6, 0xb7, 0xba, 0xfa, 0x06, 0x01, 0xa8, 0xc8, 0xe7, 0x82, 0xa6, 0x41, 0xd3, 0x90, - 0xed, 0xd8, 0x63, 0x66, 0x3b, 0x2c, 0xe4, 0x12, 0xfc, 0xe0, 0x47, 0x89, 0x04, 0x3f, 0xf8, 0x91, - 0xf6, 0x17, 0x05, 0x68, 0x98, 0xa1, 0xed, 0x45, 0xb6, 0x30, 0xf7, 0xcf, 0xa0, 0x72, 0x82, 0x58, - 0x74, 0xa3, 0xc6, 0x82, 0x7f, 0x66, 0x17, 0xa3, 0x12, 0x48, 0xee, 0x40, 0xe5, 0xc4, 0xf6, 0x9c, - 0xa9, 0xd0, 0x5a, 0x85, 0xca, 0x51, 0x92, 0x1b, 0x95, 0xf3, 0xdc, 0xb8, 0x05, 0x2b, 0x33, 0x3b, - 0x7c, 0x6e, 0x8d, 0x4f, 0x6c, 0xef, 0x98, 0x45, 0xf2, 0x60, 0xa4, 0x05, 0x36, 0x38, 0x6b, 0x4f, - 0x70, 0xb4, 0xbf, 0x5f, 0x81, 0xf2, 0x37, 0x73, 0x16, 0x9e, 0x65, 0x04, 0xfa, 0xe0, 0xba, 0x02, - 0xc9, 0x17, 0x17, 0x2e, 0x4b, 0xca, 0x6f, 0x2f, 0x26, 0x65, 0x22, 0x53, 0x84, 0xc8, 0x95, 0x22, - 0x0b, 0x7c, 0x9a, 0x09, 0x63, 0xeb, 0x57, 0xd8, 0xda, 0x79, 0x70, 0x7b, 0x08, 0x95, 0x89, 0x3b, - 0x8d, 0x51, 0x75, 0x8b, 0xd5, 0x08, 0xee, 0xa5, 0xf3, 0x08, 0xd9, 0x54, 0xc2, 0xc8, 0xbb, 0xb0, - 0x22, 0x2a, 0x59, 0xeb, 0x07, 0xce, 0xc6, 0x82, 0x95, 0xf7, 0xa6, 0x48, 0x13, 0xbb, 0xff, 0x18, - 0xca, 0x7e, 0xc8, 0x37, 0x5f, 0xc7, 0x25, 0xef, 0x5c, 0x58, 0x72, 0xc8, 0xb9, 0x54, 0x80, 0xc8, - 0x87, 0x50, 0x3a, 0x71, 0xbd, 0x18, 0xb3, 0x46, 0x73, 0xfb, 0xf6, 0x05, 0xf0, 0x63, 0xd7, 0x8b, - 0x29, 0x42, 0x78, 0x98, 0x1f, 0xfb, 0x73, 0x2f, 0x6e, 0xdd, 0xc5, 0x0c, 0x23, 0x06, 0xe4, 0x1e, - 0x54, 0xfc, 0xc9, 0x24, 0x62, 0x31, 0x76, 0x96, 0xe5, 0x9d, 0xc2, 0xa7, 0x54, 0x12, 0xf8, 0x84, - 0xa9, 0x3b, 0x73, 0x63, 0xec, 0x43, 0xca, 0x54, 0x0c, 0xc8, 0x2e, 0xac, 0x8d, 0xfd, 0x59, 0xe0, - 0x4e, 0x99, 0x63, 0x8d, 0xe7, 0x61, 0xe4, 0x87, 0xad, 0x77, 0x2e, 0x1c, 0xd3, 0x9e, 0x44, 0xec, - 0x21, 0x80, 0x36, 0xc7, 0xb9, 0x31, 0x31, 0x60, 0x83, 0x79, 0x8e, 0xb5, 0xb8, 0xce, 0xfd, 0xd7, - 0xad, 0xb3, 0xce, 0x3c, 0x27, 0x4f, 0x4a, 0xc4, 0xc1, 0x48, 0x68, 0x61, 0xcc, 0x68, 0x6d, 0x60, - 0x90, 0xb9, 0x77, 0x69, 0xac, 0x14, 0xe2, 0x64, 0xc2, 0xf7, 0x6f, 0xc0, 0x2d, 0x19, 0x22, 0xad, - 0x80, 0x85, 0x13, 0x36, 0x8e, 0xad, 0x60, 0x6a, 0x7b, 0x58, 0xca, 0xa5, 0xc6, 0x4a, 0x24, 0xe4, - 0x50, 0x20, 0x0e, 0xa7, 0xb6, 0x47, 0x34, 0xa8, 0x3f, 0x67, 0x67, 0x91, 0xc5, 0x23, 0x29, 0x76, - 0xae, 0x29, 0xba, 0xc6, 0xe9, 0x43, 0x6f, 0x7a, 0x46, 0x7e, 0x02, 0x8d, 0xf8, 0xdc, 0xdb, 0xb0, - 0x61, 0x6d, 0xe4, 0x4e, 0x35, 0xe3, 0x8b, 0x34, 0x0b, 0x25, 0xf7, 0xa1, 0x2a, 0x35, 0xd4, 0xba, - 0x97, 0x5d, 0x3b, 0xa1, 0xf2, 0xc4, 0x3c, 0xb1, 0xdd, 0xa9, 0x7f, 0xca, 0x42, 0x6b, 0x16, 0xb5, - 0xda, 0xe2, 0xb6, 0x24, 0x21, 0x1d, 0x44, 0xdc, 0x4f, 0xa3, 0x38, 0xf4, 0xbd, 0xe3, 0xd6, 0x26, - 0xde, 0x93, 0xc8, 0xd1, 0xc5, 0xe0, 0xf7, 0x2e, 0x66, 0xfe, 0x7c, 0xf0, 0xfb, 0x1c, 0xee, 0x60, - 0x65, 0x66, 0x3d, 0x3b, 0xb3, 0xf2, 0x68, 0x0d, 0xd1, 0x1b, 0xc8, 0xdd, 0x3d, 0x3b, 0xcc, 0x4e, - 0x6a, 0x43, 0xcd, 0x71, 0xa3, 0xd8, 0xf5, 0xc6, 0x71, 0xab, 0x85, 0xef, 0x4c, 0xc7, 0xe4, 0x33, - 0xb8, 0x3d, 0x73, 0x3d, 0x2b, 0xb2, 0x27, 0xcc, 0x8a, 0x5d, 0xee, 0x9b, 0x6c, 0xec, 0x7b, 0x4e, - 0xd4, 0x7a, 0x80, 0x82, 0x93, 0x99, 0xeb, 0x8d, 0xec, 0x09, 0x33, 0xdd, 0x19, 0x1b, 0x09, 0x0e, - 0xf9, 0x08, 0xd6, 0x11, 0x1e, 0xb2, 0x60, 0xea, 0x8e, 0x6d, 0xf1, 0xfa, 0x1f, 0xe1, 0xeb, 0xd7, - 0x38, 0x83, 0x0a, 0x3a, 0xbe, 0xfa, 0x63, 0x68, 0x06, 0x2c, 0x8c, 0xdc, 0x28, 0xb6, 0xa4, 0x45, - 0xbf, 0x97, 0xd5, 0xda, 0xaa, 0x64, 0x0e, 0x91, 0xd7, 0xfe, 0xcf, 0x02, 0x54, 0x84, 0x73, 0x92, - 0x4f, 0x41, 0xf1, 0x03, 0xbc, 0x06, 0x69, 0x6e, 0x6f, 0x5e, 0xe2, 0xc1, 0x9d, 0x61, 0xc0, 0xeb, - 0x5e, 0x3f, 0xa4, 0x8a, 0x1f, 0xdc, 0xb8, 0x28, 0xd4, 0xfe, 0x10, 0x6a, 0xc9, 0x02, 0xbc, 0xbc, - 0xe8, 0xeb, 0xa3, 0x91, 0x65, 0x3e, 0xee, 0x0e, 0xd4, 0x02, 0xb9, 0x03, 0x24, 0x1d, 0x5a, 0x43, - 0x6a, 0xe9, 0xdf, 0x1c, 0x75, 0xfb, 0xaa, 0x82, 0x5d, 0x1a, 0xd5, 0xbb, 0xa6, 0x4e, 0x05, 0xb2, - 0x48, 0xee, 0xc1, 0xed, 0x2c, 0xe5, 0x1c, 0x5c, 0xc2, 0x14, 0x8c, 0x8f, 0x65, 0x52, 0x01, 0xc5, - 0x18, 0xa8, 0x15, 0x9e, 0x16, 0xf4, 0xef, 0x8d, 0x91, 0x39, 0x52, 0xab, 0xed, 0xbf, 0x29, 0x40, - 0x19, 0xc3, 0x06, 0x3f, 0x9f, 0x54, 0x72, 0x71, 0x5d, 0x73, 0x5e, 0xb9, 0x1a, 0xd9, 0x92, 0xaa, - 0x81, 0x01, 0x65, 0x73, 0x79, 0xf4, 0xf9, 0xb5, 0xd6, 0x53, 0x3f, 0x85, 0x12, 0x8f, 0x52, 0xbc, - 0x43, 0x1c, 0xd2, 0x9e, 0x4e, 0xad, 0x47, 0x06, 0x1d, 0xf1, 0x2a, 0x97, 0x40, 0xb3, 0x3b, 0xd8, - 0xd3, 0x47, 0xe6, 0x30, 0xa1, 0xa1, 0x56, 0x1e, 0x19, 0x7d, 0x33, 0x45, 0x15, 0xb5, 0x9f, 0xd7, - 0x60, 0x35, 0x89, 0x09, 0x22, 0x82, 0x3e, 0x82, 0x46, 0x10, 0xba, 0x33, 0x3b, 0x3c, 0x8b, 0xc6, - 0xb6, 0x87, 0x49, 0x01, 0xb6, 0x7f, 0xb4, 0x24, 0xaa, 0x88, 0x1d, 0x1d, 0x0a, 0xec, 0x68, 0x6c, - 0x7b, 0x34, 0x3b, 0x91, 0xf4, 0x61, 0x75, 0xc6, 0xc2, 0x63, 0xf6, 0x7b, 0xbe, 0xeb, 0xe1, 0x4a, - 0x55, 0x8c, 0xc8, 0xef, 0x5f, 0xba, 0xd2, 0x01, 0x47, 0xff, 0x8e, 0xef, 0x7a, 0xb8, 0x56, 0x7e, - 0x32, 0xf9, 0x04, 0xea, 0xa2, 0x12, 0x72, 0xd8, 0x04, 0x63, 0xc5, 0xb2, 0xda, 0x4f, 0xd4, 0xe8, - 0x3d, 0x36, 0xc9, 0xc4, 0x65, 0xb8, 0x34, 0x2e, 0x37, 0xb2, 0x71, 0xf9, 0xcd, 0x6c, 0x2c, 0x5a, - 0x11, 0x55, 0x78, 0x1a, 0x84, 0x2e, 0x38, 0x7c, 0x6b, 0x89, 0xc3, 0x77, 0x60, 0x23, 0xf1, 0x55, - 0xcb, 0xf5, 0x26, 0xee, 0x4b, 0x2b, 0x72, 0x5f, 0x89, 0xd8, 0x53, 0xa6, 0xeb, 0x09, 0xcb, 0xe0, - 0x9c, 0x91, 0xfb, 0x8a, 0x11, 0x23, 0xe9, 0xe0, 0x64, 0x0e, 0x5c, 0xc5, 0xab, 0xc9, 0xf7, 0x2e, - 0x55, 0x8f, 0x68, 0xbe, 0x64, 0x46, 0xcc, 0x4d, 0x6d, 0xff, 0x52, 0x81, 0x46, 0xe6, 0x1c, 0x78, - 0xf6, 0x16, 0xca, 0x42, 0x61, 0xc5, 0x55, 0x94, 0x50, 0x1f, 0x4a, 0xfa, 0x26, 0xd4, 0xa3, 0xd8, - 0x0e, 0x63, 0x8b, 0x17, 0x57, 0xb2, 0xdd, 0x45, 0xc2, 0x13, 0x76, 0x46, 0x3e, 0x80, 0x35, 0xc1, - 0x74, 0xbd, 0xf1, 0x74, 0x1e, 0xb9, 0xa7, 0xa2, 0x99, 0xaf, 0xd1, 0x26, 0x92, 0x8d, 0x84, 0x4a, - 0xee, 0x42, 0x95, 0x67, 0x21, 0xbe, 0x86, 0x68, 0xfa, 0x2a, 0xcc, 0x73, 0xf8, 0x0a, 0x0f, 0x60, - 0x95, 0x33, 0xce, 0xe7, 0x57, 0xc4, 0x2d, 0x33, 0xf3, 0x9c, 0xf3, 0xd9, 0x1d, 0xd8, 0x10, 0xaf, - 0x09, 0x44, 0xf1, 0x2a, 0x2b, 0xdc, 0x3b, 0xa8, 0xd8, 0x75, 0x64, 0xc9, 0xb2, 0x56, 0x14, 0x9c, - 0x1f, 0x01, 0xcf, 0x5e, 0x0b, 0xe8, 0xbb, 0x22, 0x94, 0x31, 0xcf, 0xc9, 0x61, 0x77, 0xe1, 0x1d, - 0x8e, 0x9d, 0x7b, 0x76, 0x10, 0x4c, 0x5d, 0xe6, 0x58, 0x53, 0xff, 0x18, 0x43, 0x66, 0x14, 0xdb, - 0xb3, 0xc0, 0x9a, 0x47, 0xad, 0x0d, 0x0c, 0x99, 0x6d, 0xe6, 0x39, 0x47, 0x09, 0xa8, 0xef, 0x1f, - 0x9b, 0x09, 0xe4, 0x28, 0x6a, 0xff, 0x3e, 0xac, 0xe6, 0xec, 0x71, 0x41, 0xa7, 0x35, 0x74, 0xfe, - 0x8c, 0x4e, 0xdf, 0x85, 0x95, 0x20, 0x64, 0xe7, 0xa2, 0xd5, 0x51, 0xb4, 0x86, 0xa0, 0x09, 0xb1, - 0xb6, 0x60, 0x05, 0x79, 0x96, 0x20, 0xe6, 0xf3, 0x63, 0x03, 0x59, 0x87, 0xc8, 0x69, 0xbf, 0x80, - 0x95, 0xec, 0x69, 0x93, 0x77, 0x33, 0x69, 0xa1, 0x99, 0xcb, 0x93, 0x69, 0x76, 0x48, 0x2a, 0xb2, - 0xf5, 0x4b, 0x2a, 0x32, 0x72, 0x9d, 0x8a, 0x4c, 0xfb, 0x2f, 0xd9, 0x9c, 0x65, 0x2a, 0x84, 0x9f, - 0x41, 0x2d, 0x90, 0xf5, 0x38, 0x5a, 0x52, 0xfe, 0x12, 0x3e, 0x0f, 0xee, 0x24, 0x95, 0x3b, 0x4d, - 0xe7, 0xb4, 0xff, 0x56, 0x81, 0x5a, 0x5a, 0xd0, 0xe7, 0x2c, 0xef, 0xcd, 0x05, 0xcb, 0x3b, 0x90, - 0x1a, 0x16, 0x0a, 0x7c, 0x1b, 0xa3, 0xc5, 0x27, 0xaf, 0x7f, 0xd7, 0xc5, 0xb6, 0xe7, 0x34, 0xdb, - 0xf6, 0x6c, 0xbe, 0xae, 0xed, 0xf9, 0xe4, 0xa2, 0xc1, 0xbf, 0x95, 0xe9, 0x2d, 0x16, 0xcc, 0xbe, - 0xfd, 0x7d, 0xae, 0x0f, 0xca, 0x26, 0x84, 0x77, 0xc4, 0x7e, 0xd2, 0x84, 0x90, 0xb6, 0x3f, 0xf7, - 0xaf, 0xd7, 0xfe, 0x6c, 0x43, 0x45, 0xea, 0xfc, 0x0e, 0x54, 0x64, 0x4d, 0x27, 0x1b, 0x04, 0x31, - 0x3a, 0x6f, 0x10, 0x0a, 0xb2, 0x4e, 0xd7, 0x7e, 0xae, 0x40, 0x59, 0x0f, 0x43, 0x3f, 0xd4, 0xfe, - 0x48, 0x81, 0x3a, 0x3e, 0xed, 0xf9, 0x0e, 0xe3, 0xd9, 0x60, 0xb7, 0xdb, 0xb3, 0xa8, 0xfe, 0xcd, - 0x91, 0x8e, 0xd9, 0xa0, 0x0d, 0x77, 0xf6, 0x86, 0x83, 0xbd, 0x23, 0x4a, 0xf5, 0x81, 0x69, 0x99, - 0xb4, 0x3b, 0x18, 0xf1, 0xb6, 0x67, 0x38, 0x50, 0x15, 0x9e, 0x29, 0x8c, 0x81, 0xa9, 0xd3, 0x41, - 0xb7, 0x6f, 0x89, 0x56, 0xb4, 0x88, 0x77, 0xb3, 0xba, 0xde, 0xb3, 0xf0, 0xd6, 0x51, 0x2d, 0xf1, - 0x96, 0xd5, 0x34, 0x0e, 0xf4, 0xe1, 0x91, 0xa9, 0x96, 0xc9, 0x6d, 0x58, 0x3f, 0xd4, 0xe9, 0x81, - 0x31, 0x1a, 0x19, 0xc3, 0x81, 0xd5, 0xd3, 0x07, 0x86, 0xde, 0x53, 0x2b, 0x7c, 0x9d, 0x5d, 0x63, - 0xdf, 0xec, 0xee, 0xf6, 0x75, 0xb9, 0x4e, 0x95, 0x6c, 0xc2, 0x5b, 0x7b, 0xc3, 0x83, 0x03, 0xc3, - 0x34, 0xf5, 0x9e, 0xb5, 0x7b, 0x64, 0x5a, 0x23, 0xd3, 0xe8, 0xf7, 0xad, 0xee, 0xe1, 0x61, 0xff, - 0x29, 0x4f, 0x60, 0x35, 0x72, 0x17, 0x36, 0xf6, 0xba, 0x87, 0xdd, 0x5d, 0xa3, 0x6f, 0x98, 0x4f, - 0xad, 0x9e, 0x31, 0xe2, 0xf3, 0x7b, 0x6a, 0x9d, 0x27, 0x6c, 0x93, 0x3e, 0xb5, 0xba, 0x7d, 0x14, - 0xcd, 0xd4, 0xad, 0xdd, 0xee, 0xde, 0x13, 0x7d, 0xd0, 0x53, 0x81, 0x0b, 0x30, 0xea, 0x3e, 0xd2, - 0x2d, 0x2e, 0x92, 0x65, 0x0e, 0x87, 0xd6, 0xb0, 0xdf, 0x53, 0x1b, 0xda, 0xbf, 0x14, 0xa1, 0xb4, - 0xe7, 0x47, 0x31, 0xf7, 0x46, 0xe1, 0xac, 0x2f, 0x42, 0x37, 0x66, 0xa2, 0x7f, 0x2b, 0x53, 0xd1, - 0x4b, 0x7f, 0x87, 0x24, 0x1e, 0x50, 0x32, 0x10, 0xeb, 0xd9, 0x19, 0xc7, 0x29, 0x88, 0x5b, 0x3b, - 0xc7, 0xed, 0x72, 0xb2, 0x88, 0x68, 0x78, 0x85, 0x23, 0xd7, 0x2b, 0x22, 0x4e, 0x06, 0x61, 0xb9, - 0xe0, 0xc7, 0x40, 0xb2, 0x20, 0xb9, 0x62, 0x09, 0x91, 0x6a, 0x06, 0x29, 0x96, 0xdc, 0x01, 0x18, - 0xfb, 0xb3, 0x99, 0x1b, 0x8f, 0xfd, 0x28, 0x96, 0x5f, 0xc8, 0xda, 0x39, 0x63, 0x8f, 0x62, 0x6e, - 0xf1, 0x33, 0x37, 0xe6, 0x8f, 0x34, 0x83, 0x26, 0x3b, 0x70, 0xcf, 0x0e, 0x82, 0xd0, 0x7f, 0xe9, - 0xce, 0xec, 0x98, 0x59, 0xdc, 0x73, 0xed, 0x63, 0x66, 0x39, 0x6c, 0x1a, 0xdb, 0xd8, 0x13, 0x95, - 0xe9, 0xdd, 0x0c, 0x60, 0x24, 0xf8, 0x3d, 0xce, 0xe6, 0x71, 0xd7, 0x75, 0xac, 0x88, 0xfd, 0x30, - 0xe7, 0x1e, 0x60, 0xcd, 0x03, 0xc7, 0xe6, 0x62, 0xd6, 0x45, 0x96, 0x72, 0x9d, 0x91, 0xe4, 0x1c, - 0x09, 0x46, 0xfb, 0x15, 0xc0, 0xb9, 0x14, 0x64, 0x1b, 0x6e, 0xf3, 0x3a, 0x9e, 0x45, 0x31, 0x73, - 0x2c, 0xb9, 0xdb, 0x60, 0x1e, 0x47, 0x18, 0xe2, 0xcb, 0x74, 0x23, 0x65, 0xca, 0x9b, 0xc2, 0x79, - 0x1c, 0x91, 0x9f, 0x40, 0xeb, 0xc2, 0x1c, 0x87, 0x4d, 0x19, 0x7f, 0x6d, 0x15, 0xa7, 0xdd, 0x59, - 0x98, 0xd6, 0x13, 0x5c, 0xed, 0x4f, 0x14, 0x80, 0x7d, 0x16, 0x53, 0xc1, 0xcd, 0x34, 0xb6, 0x95, - 0xeb, 0x36, 0xb6, 0xef, 0x27, 0x17, 0x08, 0xc5, 0xab, 0x63, 0xc0, 0x42, 0x97, 0xa1, 0xdc, 0xa4, - 0xcb, 0xc8, 0x35, 0x11, 0xc5, 0x2b, 0x9a, 0x88, 0x52, 0xae, 0x89, 0xf8, 0x18, 0x9a, 0xf6, 0x74, - 0xea, 0xbf, 0xe0, 0x05, 0x0d, 0x0b, 0x43, 0xe6, 0xa0, 0x11, 0x9c, 0xd7, 0xdb, 0xc8, 0xec, 0x49, - 0x9e, 0xf6, 0xe7, 0x0a, 0x34, 0x50, 0x15, 0x51, 0xe0, 0x7b, 0x11, 0x23, 0x5f, 0x42, 0x45, 0x5e, - 0x44, 0x8b, 0x8b, 0xfc, 0xb7, 0x33, 0xb2, 0x66, 0x70, 0xb2, 0x68, 0xa0, 0x12, 0xcc, 0x33, 0x42, - 0xe6, 0x75, 0x97, 0x2b, 0x25, 0x45, 0x91, 0xfb, 0x50, 0x73, 0x3d, 0x4b, 0xb4, 0xd4, 0x95, 0x4c, - 0x58, 0xac, 0xba, 0x1e, 0xd6, 0xb2, 0xed, 0x57, 0x50, 0x11, 0x2f, 0x21, 0x9d, 0x54, 0xa6, 0x8b, - 0xfa, 0xcb, 0xdc, 0x1c, 0xa7, 0xc2, 0xc8, 0xc3, 0x29, 0xbd, 0x2e, 0x40, 0xb7, 0xa0, 0x7a, 0xca, - 0x9b, 0x0f, 0xbc, 0xf4, 0xe3, 0xea, 0x4d, 0x86, 0xda, 0x1f, 0x97, 0x00, 0x0e, 0xe7, 0x4b, 0x0c, - 0xa4, 0x71, 0x5d, 0x03, 0xe9, 0xe4, 0xf4, 0xf8, 0x7a, 0x99, 0x7f, 0x75, 0x43, 0x59, 0xd2, 0x69, - 0x17, 0x6f, 0xda, 0x69, 0xdf, 0x87, 0x6a, 0x1c, 0xce, 0xb9, 0xa3, 0x08, 0x63, 0x4a, 0x5b, 0x5a, - 0x49, 0x25, 0x6f, 0x42, 0x79, 0xe2, 0x87, 0x63, 0x86, 0x8e, 0x95, 0xb2, 0x05, 0xed, 0xc2, 0x65, - 0x52, 0xed, 0xb2, 0xcb, 0x24, 0xde, 0xa0, 0x45, 0xf2, 0x1e, 0x0d, 0x0b, 0x99, 0x7c, 0x83, 0x96, - 0x5c, 0xb1, 0xd1, 0x14, 0x44, 0xbe, 0x81, 0xa6, 0x3d, 0x8f, 0x7d, 0xcb, 0xe5, 0x15, 0xda, 0xd4, - 0x1d, 0x9f, 0x61, 0xd9, 0xdd, 0xcc, 0x7f, 0xaf, 0x4f, 0x0f, 0xaa, 0xd3, 0x9d, 0xc7, 0xbe, 0xe1, - 0x1c, 0x22, 0x72, 0xa7, 0x2a, 0x93, 0x12, 0x5d, 0xb1, 0x33, 0x64, 0xed, 0xc7, 0xb0, 0x92, 0x85, - 0xf1, 0x04, 0x24, 0x81, 0xea, 0x1b, 0x3c, 0x3b, 0x8d, 0x78, 0x6a, 0x1b, 0x98, 0x46, 0xb7, 0xaf, - 0x16, 0xb4, 0x18, 0x1a, 0xb8, 0xbc, 0xf4, 0x8e, 0xeb, 0xba, 0xfd, 0x03, 0x28, 0x61, 0xf8, 0x55, - 0x2e, 0x7c, 0x0f, 0xc1, 0x98, 0x8b, 0xcc, 0xbc, 0xf9, 0x15, 0xb3, 0xe6, 0xf7, 0xdf, 0x05, 0x58, - 0x31, 0xfd, 0xf9, 0xf8, 0xe4, 0xa2, 0x01, 0xc2, 0xaf, 0x3b, 0x42, 0x2d, 0x31, 0x1f, 0xe5, 0xa6, - 0xe6, 0x93, 0x5a, 0x47, 0x71, 0x89, 0x75, 0xdc, 0xf4, 0xcc, 0xb5, 0x2f, 0x60, 0x55, 0x6e, 0x5e, - 0x6a, 0x3d, 0xd1, 0x66, 0xe1, 0x0a, 0x6d, 0x6a, 0xbf, 0x50, 0x60, 0x55, 0xc4, 0xf7, 0xff, 0xbb, - 0xd2, 0x2a, 0x37, 0x0c, 0xeb, 0xe5, 0x1b, 0x5d, 0x1e, 0xfd, 0xbf, 0xf4, 0x34, 0x6d, 0x08, 0xcd, - 0x44, 0x7d, 0x37, 0x50, 0xfb, 0x15, 0x46, 0xfc, 0x8b, 0x02, 0x34, 0x06, 0xec, 0xe5, 0x92, 0x20, - 0x5a, 0xbe, 0xee, 0x71, 0x7c, 0x98, 0x2b, 0x57, 0x1b, 0xdb, 0xeb, 0x59, 0x19, 0xc4, 0xd5, 0x63, - 0x52, 0xc1, 0xa6, 0xb7, 0xa8, 0xca, 0xf2, 0x5b, 0xd4, 0xd2, 0x62, 0xb7, 0x9e, 0xb9, 0xc5, 0x2b, - 0x2e, 0xbb, 0xc5, 0xd3, 0xfe, 0xad, 0x08, 0x0d, 0x6c, 0x90, 0x29, 0x8b, 0xe6, 0xd3, 0x38, 0x27, - 0x4c, 0xe1, 0x6a, 0x61, 0x3a, 0x50, 0x09, 0x71, 0x92, 0x74, 0xa5, 0x4b, 0x83, 0xbf, 0x40, 0x61, - 0x6b, 0xfc, 0xdc, 0x0d, 0x02, 0xe6, 0x58, 0x82, 0x92, 0x14, 0x30, 0x4d, 0x49, 0x16, 0x22, 0x44, - 0xbc, 0xfc, 0x9c, 0xf9, 0x21, 0x4b, 0x51, 0x45, 0xbc, 0x4f, 0x68, 0x70, 0x5a, 0x02, 0xc9, 0xdd, - 0x37, 0x88, 0xca, 0xe0, 0xfc, 0xbe, 0x21, 0xed, 0x35, 0x91, 0x5b, 0x47, 0xae, 0xe8, 0x35, 0x91, - 0xcd, 0xbb, 0xa8, 0x99, 0x3d, 0x9d, 0x5a, 0x7e, 0x10, 0xa1, 0xd3, 0xd4, 0x68, 0x0d, 0x09, 0xc3, - 0x20, 0x22, 0x5f, 0x43, 0x7a, 0x5d, 0x2c, 0x6f, 0xc9, 0xc5, 0x39, 0xb6, 0x2e, 0xbb, 0x58, 0xa0, - 0xab, 0xe3, 0xdc, 0xfd, 0xcf, 0x92, 0x1b, 0xea, 0xca, 0x4d, 0x6f, 0xa8, 0x1f, 0x42, 0x59, 0xc4, - 0xa8, 0xda, 0xeb, 0x62, 0x94, 0xc0, 0x65, 0xed, 0xb3, 0x91, 0xb7, 0xcf, 0x5f, 0x16, 0x80, 0x74, - 0xa7, 0x53, 0x7f, 0x6c, 0xc7, 0xcc, 0x70, 0xa2, 0x8b, 0x66, 0x7a, 0xed, 0xcf, 0x2e, 0x9f, 0x41, - 0x7d, 0xe6, 0x3b, 0x6c, 0x6a, 0x25, 0xdf, 0x94, 0x2e, 0xad, 0x7e, 0x10, 0xc6, 0x5b, 0x52, 0x02, - 0x25, 0xbc, 0xc4, 0x51, 0xb0, 0xee, 0xc0, 0x67, 0xde, 0x84, 0xcd, 0xec, 0x97, 0xb2, 0x14, 0xe1, - 0x8f, 0xa4, 0x03, 0xd5, 0x90, 0x45, 0x2c, 0x3c, 0x65, 0x57, 0x16, 0x55, 0x09, 0x48, 0x7b, 0x06, - 0x1b, 0xb9, 0x1d, 0x49, 0x47, 0xbe, 0x85, 0x5f, 0x2b, 0xc3, 0x58, 0x7e, 0xb4, 0x12, 0x03, 0xfe, - 0x3a, 0xe6, 0x25, 0x9f, 0x41, 0xf9, 0x63, 0xea, 0xf0, 0xc5, 0xab, 0xe2, 0xec, 0x1e, 0xa8, 0x59, - 0x4d, 0xbb, 0x63, 0x0c, 0x36, 0xf2, 0x54, 0x0a, 0xd7, 0x3b, 0x15, 0xed, 0xef, 0x0a, 0xb0, 0xde, - 0x75, 0x1c, 0xf1, 0x77, 0xc3, 0x25, 0xaa, 0x2f, 0x5e, 0x57, 0xf5, 0x0b, 0x81, 0x58, 0x84, 0x89, - 0x6b, 0x05, 0xe2, 0x0f, 0xa1, 0x92, 0xd6, 0x5a, 0xc5, 0x05, 0x77, 0x16, 0x72, 0x51, 0x09, 0xd0, - 0x6e, 0x01, 0xc9, 0x0a, 0x2b, 0xb4, 0xaa, 0xfd, 0x69, 0x11, 0xee, 0xee, 0xb2, 0x63, 0xd7, 0xcb, - 0xbe, 0xe2, 0x57, 0xdf, 0xc9, 0xc5, 0x4f, 0x65, 0x9f, 0xc1, 0xba, 0x28, 0xe4, 0x93, 0x7f, 0x62, - 0x59, 0xec, 0x58, 0x7e, 0x9d, 0x94, 0xb1, 0x6a, 0x0d, 0xf9, 0x07, 0x92, 0xad, 0xe3, 0x7f, 0xc5, - 0x1c, 0x3b, 0xb6, 0x9f, 0xd9, 0x11, 0xb3, 0x5c, 0x47, 0xfe, 0x59, 0x06, 0x12, 0x92, 0xe1, 0x90, - 0x21, 0x94, 0xb8, 0x0d, 0xa2, 0xeb, 0x36, 0xb7, 0xb7, 0x33, 0x62, 0x5d, 0xb2, 0x95, 0xac, 0x02, - 0x0f, 0x7c, 0x87, 0xed, 0x54, 0x8f, 0x06, 0x4f, 0x06, 0xc3, 0xef, 0x06, 0x14, 0x17, 0x22, 0x06, - 0xdc, 0x0a, 0x42, 0x76, 0xea, 0xfa, 0xf3, 0xc8, 0xca, 0x9e, 0x44, 0xf5, 0xca, 0x94, 0xb8, 0x91, - 0xcc, 0xc9, 0x10, 0xb5, 0x9f, 0xc2, 0xda, 0xc2, 0xcb, 0x78, 0x6d, 0x26, 0x5f, 0xa7, 0xbe, 0x41, - 0x56, 0xa1, 0x8e, 0x1f, 0xbb, 0x97, 0x7f, 0xfb, 0xd6, 0xfe, 0xb5, 0x80, 0x57, 0x4c, 0x33, 0x37, - 0xbe, 0x59, 0x06, 0xfb, 0xcd, 0x7c, 0x06, 0x83, 0xed, 0x77, 0xf3, 0xe6, 0x9b, 0x59, 0xb0, 0xf3, - 0xad, 0x00, 0xa6, 0x41, 0xa4, 0x6d, 0x43, 0x55, 0xd2, 0xc8, 0x6f, 0xc1, 0x5a, 0xe8, 0xfb, 0x71, - 0xd2, 0x89, 0x8a, 0x0e, 0xe4, 0xf2, 0x3f, 0xdb, 0xac, 0x72, 0xb0, 0x48, 0x06, 0x4f, 0xf2, 0xbd, - 0x48, 0x59, 0xfc, 0x0d, 0x44, 0x0e, 0x77, 0x1b, 0xbf, 0x5b, 0x4f, 0xff, 0xb7, 0xfb, 0xbf, 0x01, - 0x00, 0x00, 0xff, 0xff, 0x35, 0x9f, 0x30, 0x98, 0xf2, 0x2b, 0x00, 0x00, -} diff --git a/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.proto b/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.proto deleted file mode 100644 index 497b4d9a9..000000000 --- a/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.proto +++ /dev/null @@ -1,551 +0,0 @@ -syntax = "proto2"; -option go_package = "datastore"; - -package appengine; - -message Action{} - -message PropertyValue { - optional int64 int64Value = 1; - optional bool booleanValue = 2; - optional string stringValue = 3; - optional double doubleValue = 4; - - optional group PointValue = 5 { - required double x = 6; - required double y = 7; - } - - optional group UserValue = 8 { - required string email = 9; - required string auth_domain = 10; - optional string nickname = 11; - optional string federated_identity = 21; - optional string federated_provider = 22; - } - - optional group ReferenceValue = 12 { - required string app = 13; - optional string name_space = 20; - repeated group PathElement = 14 { - required string type = 15; - optional int64 id = 16; - optional string name = 17; - } - } -} - -message Property { - enum Meaning { - NO_MEANING = 0; - BLOB = 14; - TEXT = 15; - BYTESTRING = 16; - - ATOM_CATEGORY = 1; - ATOM_LINK = 2; - ATOM_TITLE = 3; - ATOM_CONTENT = 4; - ATOM_SUMMARY = 5; - ATOM_AUTHOR = 6; - - GD_WHEN = 7; - GD_EMAIL = 8; - GEORSS_POINT = 9; - GD_IM = 10; - - GD_PHONENUMBER = 11; - GD_POSTALADDRESS = 12; - - GD_RATING = 13; - - BLOBKEY = 17; - ENTITY_PROTO = 19; - - INDEX_VALUE = 18; - }; - - optional Meaning meaning = 1 [default = NO_MEANING]; - optional string meaning_uri = 2; - - required string name = 3; - - required PropertyValue value = 5; - - required bool multiple = 4; - - optional bool searchable = 6 [default=false]; - - enum FtsTokenizationOption { - HTML = 1; - ATOM = 2; - } - - optional FtsTokenizationOption fts_tokenization_option = 8; - - optional string locale = 9 [default = "en"]; -} - -message Path { - repeated group Element = 1 { - required string type = 2; - optional int64 id = 3; - optional string name = 4; - } -} - -message Reference { - required string app = 13; - optional string name_space = 20; - required Path path = 14; -} - -message User { - required string email = 1; - required string auth_domain = 2; - optional string nickname = 3; - optional string federated_identity = 6; - optional string federated_provider = 7; -} - -message EntityProto { - required Reference key = 13; - required Path entity_group = 16; - optional User owner = 17; - - enum Kind { - GD_CONTACT = 1; - GD_EVENT = 2; - GD_MESSAGE = 3; - } - optional Kind kind = 4; - optional string kind_uri = 5; - - repeated Property property = 14; - repeated Property raw_property = 15; - - optional int32 rank = 18; -} - -message CompositeProperty { - required int64 index_id = 1; - repeated string value = 2; -} - -message Index { - required string entity_type = 1; - required bool ancestor = 5; - repeated group Property = 2 { - required string name = 3; - enum Direction { - ASCENDING = 1; - DESCENDING = 2; - } - optional Direction direction = 4 [default = ASCENDING]; - } -} - -message CompositeIndex { - required string app_id = 1; - required int64 id = 2; - required Index definition = 3; - - enum State { - WRITE_ONLY = 1; - READ_WRITE = 2; - DELETED = 3; - ERROR = 4; - } - required State state = 4; - - optional bool only_use_if_required = 6 [default = false]; -} - -message IndexPostfix { - message IndexValue { - required string property_name = 1; - required PropertyValue value = 2; - } - - repeated IndexValue index_value = 1; - - optional Reference key = 2; - - optional bool before = 3 [default=true]; -} - -message IndexPosition { - optional string key = 1; - - optional bool before = 2 [default=true]; -} - -message Snapshot { - enum Status { - INACTIVE = 0; - ACTIVE = 1; - } - - required int64 ts = 1; -} - -message InternalHeader { - optional string qos = 1; -} - -message Transaction { - optional InternalHeader header = 4; - required fixed64 handle = 1; - required string app = 2; - optional bool mark_changes = 3 [default = false]; -} - -message Query { - optional InternalHeader header = 39; - - required string app = 1; - optional string name_space = 29; - - optional string kind = 3; - optional Reference ancestor = 17; - - repeated group Filter = 4 { - enum Operator { - LESS_THAN = 1; - LESS_THAN_OR_EQUAL = 2; - GREATER_THAN = 3; - GREATER_THAN_OR_EQUAL = 4; - EQUAL = 5; - IN = 6; - EXISTS = 7; - } - - required Operator op = 6; - repeated Property property = 14; - } - - optional string search_query = 8; - - repeated group Order = 9 { - enum Direction { - ASCENDING = 1; - DESCENDING = 2; - } - - required string property = 10; - optional Direction direction = 11 [default = ASCENDING]; - } - - enum Hint { - ORDER_FIRST = 1; - ANCESTOR_FIRST = 2; - FILTER_FIRST = 3; - } - optional Hint hint = 18; - - optional int32 count = 23; - - optional int32 offset = 12 [default = 0]; - - optional int32 limit = 16; - - optional CompiledCursor compiled_cursor = 30; - optional CompiledCursor end_compiled_cursor = 31; - - repeated CompositeIndex composite_index = 19; - - optional bool require_perfect_plan = 20 [default = false]; - - optional bool keys_only = 21 [default = false]; - - optional Transaction transaction = 22; - - optional bool compile = 25 [default = false]; - - optional int64 failover_ms = 26; - - optional bool strong = 32; - - repeated string property_name = 33; - - repeated string group_by_property_name = 34; - - optional bool distinct = 24; - - optional int64 min_safe_time_seconds = 35; - - repeated string safe_replica_name = 36; - - optional bool persist_offset = 37 [default=false]; -} - -message CompiledQuery { - required group PrimaryScan = 1 { - optional string index_name = 2; - - optional string start_key = 3; - optional bool start_inclusive = 4; - optional string end_key = 5; - optional bool end_inclusive = 6; - - repeated string start_postfix_value = 22; - repeated string end_postfix_value = 23; - - optional int64 end_unapplied_log_timestamp_us = 19; - } - - repeated group MergeJoinScan = 7 { - required string index_name = 8; - - repeated string prefix_value = 9; - - optional bool value_prefix = 20 [default=false]; - } - - optional Index index_def = 21; - - optional int32 offset = 10 [default = 0]; - - optional int32 limit = 11; - - required bool keys_only = 12; - - repeated string property_name = 24; - - optional int32 distinct_infix_size = 25; - - optional group EntityFilter = 13 { - optional bool distinct = 14 [default=false]; - - optional string kind = 17; - optional Reference ancestor = 18; - } -} - -message CompiledCursor { - optional group Position = 2 { - optional string start_key = 27; - - repeated group IndexValue = 29 { - optional string property = 30; - required PropertyValue value = 31; - } - - optional Reference key = 32; - - optional bool start_inclusive = 28 [default=true]; - } -} - -message Cursor { - required fixed64 cursor = 1; - - optional string app = 2; -} - -message Error { - enum ErrorCode { - BAD_REQUEST = 1; - CONCURRENT_TRANSACTION = 2; - INTERNAL_ERROR = 3; - NEED_INDEX = 4; - TIMEOUT = 5; - PERMISSION_DENIED = 6; - BIGTABLE_ERROR = 7; - COMMITTED_BUT_STILL_APPLYING = 8; - CAPABILITY_DISABLED = 9; - TRY_ALTERNATE_BACKEND = 10; - SAFE_TIME_TOO_OLD = 11; - } -} - -message Cost { - optional int32 index_writes = 1; - optional int32 index_write_bytes = 2; - optional int32 entity_writes = 3; - optional int32 entity_write_bytes = 4; - optional group CommitCost = 5 { - optional int32 requested_entity_puts = 6; - optional int32 requested_entity_deletes = 7; - }; - optional int32 approximate_storage_delta = 8; - optional int32 id_sequence_updates = 9; -} - -message GetRequest { - optional InternalHeader header = 6; - - repeated Reference key = 1; - optional Transaction transaction = 2; - - optional int64 failover_ms = 3; - - optional bool strong = 4; - - optional bool allow_deferred = 5 [default=false]; -} - -message GetResponse { - repeated group Entity = 1 { - optional EntityProto entity = 2; - optional Reference key = 4; - - optional int64 version = 3; - } - - repeated Reference deferred = 5; - - optional bool in_order = 6 [default=true]; -} - -message PutRequest { - optional InternalHeader header = 11; - - repeated EntityProto entity = 1; - optional Transaction transaction = 2; - repeated CompositeIndex composite_index = 3; - - optional bool trusted = 4 [default = false]; - - optional bool force = 7 [default = false]; - - optional bool mark_changes = 8 [default = false]; - repeated Snapshot snapshot = 9; - - enum AutoIdPolicy { - CURRENT = 0; - SEQUENTIAL = 1; - } - optional AutoIdPolicy auto_id_policy = 10 [default = CURRENT]; -} - -message PutResponse { - repeated Reference key = 1; - optional Cost cost = 2; - repeated int64 version = 3; -} - -message TouchRequest { - optional InternalHeader header = 10; - - repeated Reference key = 1; - repeated CompositeIndex composite_index = 2; - optional bool force = 3 [default = false]; - repeated Snapshot snapshot = 9; -} - -message TouchResponse { - optional Cost cost = 1; -} - -message DeleteRequest { - optional InternalHeader header = 10; - - repeated Reference key = 6; - optional Transaction transaction = 5; - - optional bool trusted = 4 [default = false]; - - optional bool force = 7 [default = false]; - - optional bool mark_changes = 8 [default = false]; - repeated Snapshot snapshot = 9; -} - -message DeleteResponse { - optional Cost cost = 1; - repeated int64 version = 3; -} - -message NextRequest { - optional InternalHeader header = 5; - - required Cursor cursor = 1; - optional int32 count = 2; - - optional int32 offset = 4 [default = 0]; - - optional bool compile = 3 [default = false]; -} - -message QueryResult { - optional Cursor cursor = 1; - - repeated EntityProto result = 2; - - optional int32 skipped_results = 7; - - required bool more_results = 3; - - optional bool keys_only = 4; - - optional bool index_only = 9; - - optional bool small_ops = 10; - - optional CompiledQuery compiled_query = 5; - - optional CompiledCursor compiled_cursor = 6; - - repeated CompositeIndex index = 8; - - repeated int64 version = 11; -} - -message AllocateIdsRequest { - optional InternalHeader header = 4; - - optional Reference model_key = 1; - - optional int64 size = 2; - - optional int64 max = 3; - - repeated Reference reserve = 5; -} - -message AllocateIdsResponse { - required int64 start = 1; - required int64 end = 2; - optional Cost cost = 3; -} - -message CompositeIndices { - repeated CompositeIndex index = 1; -} - -message AddActionsRequest { - optional InternalHeader header = 3; - - required Transaction transaction = 1; - repeated Action action = 2; -} - -message AddActionsResponse { -} - -message BeginTransactionRequest { - optional InternalHeader header = 3; - - required string app = 1; - optional bool allow_multiple_eg = 2 [default = false]; - optional string database_id = 4; - - enum TransactionMode { - UNKNOWN = 0; - READ_ONLY = 1; - READ_WRITE = 2; - } - optional TransactionMode mode = 5 [default = UNKNOWN]; - - optional Transaction previous_transaction = 7; -} - -message CommitResponse { - optional Cost cost = 1; - - repeated group Version = 3 { - required Reference root_entity_key = 4; - required int64 version = 5; - } -} diff --git a/vendor/google.golang.org/appengine/internal/identity.go b/vendor/google.golang.org/appengine/internal/identity.go deleted file mode 100644 index 0f95aa91d..000000000 --- a/vendor/google.golang.org/appengine/internal/identity.go +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2011 Google Inc. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -package internal - -import ( - "context" - "os" -) - -var ( - // This is set to true in identity_classic.go, which is behind the appengine build tag. - // The appengine build tag is set for the first generation runtimes (<= Go 1.9) but not - // the second generation runtimes (>= Go 1.11), so this indicates whether we're on a - // first-gen runtime. See IsStandard below for the second-gen check. - appengineStandard bool - - // This is set to true in identity_flex.go, which is behind the appenginevm build tag. - appengineFlex bool -) - -// AppID is the implementation of the wrapper function of the same name in -// ../identity.go. See that file for commentary. -func AppID(c context.Context) string { - return appID(FullyQualifiedAppID(c)) -} - -// IsStandard is the implementation of the wrapper function of the same name in -// ../appengine.go. See that file for commentary. -func IsStandard() bool { - // appengineStandard will be true for first-gen runtimes (<= Go 1.9) but not - // second-gen (>= Go 1.11). - return appengineStandard || IsSecondGen() -} - -// IsSecondGen is the implementation of the wrapper function of the same name in -// ../appengine.go. See that file for commentary. -func IsSecondGen() bool { - // Second-gen runtimes set $GAE_ENV so we use that to check if we're on a second-gen runtime. - return os.Getenv("GAE_ENV") == "standard" -} - -// IsFlex is the implementation of the wrapper function of the same name in -// ../appengine.go. See that file for commentary. -func IsFlex() bool { - return appengineFlex -} - -// IsAppEngine is the implementation of the wrapper function of the same name in -// ../appengine.go. See that file for commentary. -func IsAppEngine() bool { - return IsStandard() || IsFlex() -} diff --git a/vendor/google.golang.org/appengine/internal/identity_classic.go b/vendor/google.golang.org/appengine/internal/identity_classic.go deleted file mode 100644 index 5ad3548bf..000000000 --- a/vendor/google.golang.org/appengine/internal/identity_classic.go +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2015 Google Inc. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -//go:build appengine -// +build appengine - -package internal - -import ( - "context" - - "appengine" -) - -func init() { - appengineStandard = true -} - -func DefaultVersionHostname(ctx context.Context) string { - c := fromContext(ctx) - if c == nil { - panic(errNotAppEngineContext) - } - return appengine.DefaultVersionHostname(c) -} - -func Datacenter(_ context.Context) string { return appengine.Datacenter() } -func ServerSoftware() string { return appengine.ServerSoftware() } -func InstanceID() string { return appengine.InstanceID() } -func IsDevAppServer() bool { return appengine.IsDevAppServer() } - -func RequestID(ctx context.Context) string { - c := fromContext(ctx) - if c == nil { - panic(errNotAppEngineContext) - } - return appengine.RequestID(c) -} - -func ModuleName(ctx context.Context) string { - c := fromContext(ctx) - if c == nil { - panic(errNotAppEngineContext) - } - return appengine.ModuleName(c) -} -func VersionID(ctx context.Context) string { - c := fromContext(ctx) - if c == nil { - panic(errNotAppEngineContext) - } - return appengine.VersionID(c) -} - -func fullyQualifiedAppID(ctx context.Context) string { - c := fromContext(ctx) - if c == nil { - panic(errNotAppEngineContext) - } - return c.FullyQualifiedAppID() -} diff --git a/vendor/google.golang.org/appengine/internal/identity_flex.go b/vendor/google.golang.org/appengine/internal/identity_flex.go deleted file mode 100644 index 4201b6b58..000000000 --- a/vendor/google.golang.org/appengine/internal/identity_flex.go +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2018 Google LLC. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -//go:build appenginevm -// +build appenginevm - -package internal - -func init() { - appengineFlex = true -} diff --git a/vendor/google.golang.org/appengine/internal/identity_vm.go b/vendor/google.golang.org/appengine/internal/identity_vm.go deleted file mode 100644 index 18ddda3a4..000000000 --- a/vendor/google.golang.org/appengine/internal/identity_vm.go +++ /dev/null @@ -1,134 +0,0 @@ -// Copyright 2011 Google Inc. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -//go:build !appengine -// +build !appengine - -package internal - -import ( - "context" - "log" - "net/http" - "os" - "strings" -) - -// These functions are implementations of the wrapper functions -// in ../appengine/identity.go. See that file for commentary. - -const ( - hDefaultVersionHostname = "X-AppEngine-Default-Version-Hostname" - hRequestLogId = "X-AppEngine-Request-Log-Id" - hDatacenter = "X-AppEngine-Datacenter" -) - -func ctxHeaders(ctx context.Context) http.Header { - c := fromContext(ctx) - if c == nil { - return nil - } - return c.Request().Header -} - -func DefaultVersionHostname(ctx context.Context) string { - return ctxHeaders(ctx).Get(hDefaultVersionHostname) -} - -func RequestID(ctx context.Context) string { - return ctxHeaders(ctx).Get(hRequestLogId) -} - -func Datacenter(ctx context.Context) string { - if dc := ctxHeaders(ctx).Get(hDatacenter); dc != "" { - return dc - } - // If the header isn't set, read zone from the metadata service. - // It has the format projects/[NUMERIC_PROJECT_ID]/zones/[ZONE] - zone, err := getMetadata("instance/zone") - if err != nil { - log.Printf("Datacenter: %v", err) - return "" - } - parts := strings.Split(string(zone), "/") - if len(parts) == 0 { - return "" - } - return parts[len(parts)-1] -} - -func ServerSoftware() string { - // TODO(dsymonds): Remove fallback when we've verified this. - if s := os.Getenv("SERVER_SOFTWARE"); s != "" { - return s - } - if s := os.Getenv("GAE_ENV"); s != "" { - return s - } - return "Google App Engine/1.x.x" -} - -// TODO(dsymonds): Remove the metadata fetches. - -func ModuleName(_ context.Context) string { - if s := os.Getenv("GAE_MODULE_NAME"); s != "" { - return s - } - if s := os.Getenv("GAE_SERVICE"); s != "" { - return s - } - return string(mustGetMetadata("instance/attributes/gae_backend_name")) -} - -func VersionID(_ context.Context) string { - if s1, s2 := os.Getenv("GAE_MODULE_VERSION"), os.Getenv("GAE_MINOR_VERSION"); s1 != "" && s2 != "" { - return s1 + "." + s2 - } - if s1, s2 := os.Getenv("GAE_VERSION"), os.Getenv("GAE_DEPLOYMENT_ID"); s1 != "" && s2 != "" { - return s1 + "." + s2 - } - return string(mustGetMetadata("instance/attributes/gae_backend_version")) + "." + string(mustGetMetadata("instance/attributes/gae_backend_minor_version")) -} - -func InstanceID() string { - if s := os.Getenv("GAE_MODULE_INSTANCE"); s != "" { - return s - } - if s := os.Getenv("GAE_INSTANCE"); s != "" { - return s - } - return string(mustGetMetadata("instance/attributes/gae_backend_instance")) -} - -func partitionlessAppID() string { - // gae_project has everything except the partition prefix. - if appID := os.Getenv("GAE_LONG_APP_ID"); appID != "" { - return appID - } - if project := os.Getenv("GOOGLE_CLOUD_PROJECT"); project != "" { - return project - } - return string(mustGetMetadata("instance/attributes/gae_project")) -} - -func fullyQualifiedAppID(_ context.Context) string { - if s := os.Getenv("GAE_APPLICATION"); s != "" { - return s - } - appID := partitionlessAppID() - - part := os.Getenv("GAE_PARTITION") - if part == "" { - part = string(mustGetMetadata("instance/attributes/gae_partition")) - } - - if part != "" { - appID = part + "~" + appID - } - return appID -} - -func IsDevAppServer() bool { - return os.Getenv("RUN_WITH_DEVAPPSERVER") != "" || os.Getenv("GAE_ENV") == "localdev" -} diff --git a/vendor/google.golang.org/appengine/internal/internal.go b/vendor/google.golang.org/appengine/internal/internal.go deleted file mode 100644 index 051ea3980..000000000 --- a/vendor/google.golang.org/appengine/internal/internal.go +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright 2011 Google Inc. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -// Package internal provides support for package appengine. -// -// Programs should not use this package directly. Its API is not stable. -// Use packages appengine and appengine/* instead. -package internal - -import ( - "fmt" - - "github.com/golang/protobuf/proto" - - remotepb "google.golang.org/appengine/internal/remote_api" -) - -// errorCodeMaps is a map of service name to the error code map for the service. -var errorCodeMaps = make(map[string]map[int32]string) - -// RegisterErrorCodeMap is called from API implementations to register their -// error code map. This should only be called from init functions. -func RegisterErrorCodeMap(service string, m map[int32]string) { - errorCodeMaps[service] = m -} - -type timeoutCodeKey struct { - service string - code int32 -} - -// timeoutCodes is the set of service+code pairs that represent timeouts. -var timeoutCodes = make(map[timeoutCodeKey]bool) - -func RegisterTimeoutErrorCode(service string, code int32) { - timeoutCodes[timeoutCodeKey{service, code}] = true -} - -// APIError is the type returned by appengine.Context's Call method -// when an API call fails in an API-specific way. This may be, for instance, -// a taskqueue API call failing with TaskQueueServiceError::UNKNOWN_QUEUE. -type APIError struct { - Service string - Detail string - Code int32 // API-specific error code -} - -func (e *APIError) Error() string { - if e.Code == 0 { - if e.Detail == "" { - return "APIError " - } - return e.Detail - } - s := fmt.Sprintf("API error %d", e.Code) - if m, ok := errorCodeMaps[e.Service]; ok { - s += " (" + e.Service + ": " + m[e.Code] + ")" - } else { - // Shouldn't happen, but provide a bit more detail if it does. - s = e.Service + " " + s - } - if e.Detail != "" { - s += ": " + e.Detail - } - return s -} - -func (e *APIError) IsTimeout() bool { - return timeoutCodes[timeoutCodeKey{e.Service, e.Code}] -} - -// CallError is the type returned by appengine.Context's Call method when an -// API call fails in a generic way, such as RpcError::CAPABILITY_DISABLED. -type CallError struct { - Detail string - Code int32 - // TODO: Remove this if we get a distinguishable error code. - Timeout bool -} - -func (e *CallError) Error() string { - var msg string - switch remotepb.RpcError_ErrorCode(e.Code) { - case remotepb.RpcError_UNKNOWN: - return e.Detail - case remotepb.RpcError_OVER_QUOTA: - msg = "Over quota" - case remotepb.RpcError_CAPABILITY_DISABLED: - msg = "Capability disabled" - case remotepb.RpcError_CANCELLED: - msg = "Canceled" - default: - msg = fmt.Sprintf("Call error %d", e.Code) - } - s := msg + ": " + e.Detail - if e.Timeout { - s += " (timeout)" - } - return s -} - -func (e *CallError) IsTimeout() bool { - return e.Timeout -} - -// NamespaceMods is a map from API service to a function that will mutate an RPC request to attach a namespace. -// The function should be prepared to be called on the same message more than once; it should only modify the -// RPC request the first time. -var NamespaceMods = make(map[string]func(m proto.Message, namespace string)) diff --git a/vendor/google.golang.org/appengine/internal/log/log_service.pb.go b/vendor/google.golang.org/appengine/internal/log/log_service.pb.go deleted file mode 100644 index 8545ac4ad..000000000 --- a/vendor/google.golang.org/appengine/internal/log/log_service.pb.go +++ /dev/null @@ -1,1313 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google.golang.org/appengine/internal/log/log_service.proto - -package log - -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package - -type LogServiceError_ErrorCode int32 - -const ( - LogServiceError_OK LogServiceError_ErrorCode = 0 - LogServiceError_INVALID_REQUEST LogServiceError_ErrorCode = 1 - LogServiceError_STORAGE_ERROR LogServiceError_ErrorCode = 2 -) - -var LogServiceError_ErrorCode_name = map[int32]string{ - 0: "OK", - 1: "INVALID_REQUEST", - 2: "STORAGE_ERROR", -} -var LogServiceError_ErrorCode_value = map[string]int32{ - "OK": 0, - "INVALID_REQUEST": 1, - "STORAGE_ERROR": 2, -} - -func (x LogServiceError_ErrorCode) Enum() *LogServiceError_ErrorCode { - p := new(LogServiceError_ErrorCode) - *p = x - return p -} -func (x LogServiceError_ErrorCode) String() string { - return proto.EnumName(LogServiceError_ErrorCode_name, int32(x)) -} -func (x *LogServiceError_ErrorCode) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(LogServiceError_ErrorCode_value, data, "LogServiceError_ErrorCode") - if err != nil { - return err - } - *x = LogServiceError_ErrorCode(value) - return nil -} -func (LogServiceError_ErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_log_service_f054fd4b5012319d, []int{0, 0} -} - -type LogServiceError struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *LogServiceError) Reset() { *m = LogServiceError{} } -func (m *LogServiceError) String() string { return proto.CompactTextString(m) } -func (*LogServiceError) ProtoMessage() {} -func (*LogServiceError) Descriptor() ([]byte, []int) { - return fileDescriptor_log_service_f054fd4b5012319d, []int{0} -} -func (m *LogServiceError) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_LogServiceError.Unmarshal(m, b) -} -func (m *LogServiceError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_LogServiceError.Marshal(b, m, deterministic) -} -func (dst *LogServiceError) XXX_Merge(src proto.Message) { - xxx_messageInfo_LogServiceError.Merge(dst, src) -} -func (m *LogServiceError) XXX_Size() int { - return xxx_messageInfo_LogServiceError.Size(m) -} -func (m *LogServiceError) XXX_DiscardUnknown() { - xxx_messageInfo_LogServiceError.DiscardUnknown(m) -} - -var xxx_messageInfo_LogServiceError proto.InternalMessageInfo - -type UserAppLogLine struct { - TimestampUsec *int64 `protobuf:"varint,1,req,name=timestamp_usec,json=timestampUsec" json:"timestamp_usec,omitempty"` - Level *int64 `protobuf:"varint,2,req,name=level" json:"level,omitempty"` - Message *string `protobuf:"bytes,3,req,name=message" json:"message,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *UserAppLogLine) Reset() { *m = UserAppLogLine{} } -func (m *UserAppLogLine) String() string { return proto.CompactTextString(m) } -func (*UserAppLogLine) ProtoMessage() {} -func (*UserAppLogLine) Descriptor() ([]byte, []int) { - return fileDescriptor_log_service_f054fd4b5012319d, []int{1} -} -func (m *UserAppLogLine) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_UserAppLogLine.Unmarshal(m, b) -} -func (m *UserAppLogLine) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_UserAppLogLine.Marshal(b, m, deterministic) -} -func (dst *UserAppLogLine) XXX_Merge(src proto.Message) { - xxx_messageInfo_UserAppLogLine.Merge(dst, src) -} -func (m *UserAppLogLine) XXX_Size() int { - return xxx_messageInfo_UserAppLogLine.Size(m) -} -func (m *UserAppLogLine) XXX_DiscardUnknown() { - xxx_messageInfo_UserAppLogLine.DiscardUnknown(m) -} - -var xxx_messageInfo_UserAppLogLine proto.InternalMessageInfo - -func (m *UserAppLogLine) GetTimestampUsec() int64 { - if m != nil && m.TimestampUsec != nil { - return *m.TimestampUsec - } - return 0 -} - -func (m *UserAppLogLine) GetLevel() int64 { - if m != nil && m.Level != nil { - return *m.Level - } - return 0 -} - -func (m *UserAppLogLine) GetMessage() string { - if m != nil && m.Message != nil { - return *m.Message - } - return "" -} - -type UserAppLogGroup struct { - LogLine []*UserAppLogLine `protobuf:"bytes,2,rep,name=log_line,json=logLine" json:"log_line,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *UserAppLogGroup) Reset() { *m = UserAppLogGroup{} } -func (m *UserAppLogGroup) String() string { return proto.CompactTextString(m) } -func (*UserAppLogGroup) ProtoMessage() {} -func (*UserAppLogGroup) Descriptor() ([]byte, []int) { - return fileDescriptor_log_service_f054fd4b5012319d, []int{2} -} -func (m *UserAppLogGroup) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_UserAppLogGroup.Unmarshal(m, b) -} -func (m *UserAppLogGroup) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_UserAppLogGroup.Marshal(b, m, deterministic) -} -func (dst *UserAppLogGroup) XXX_Merge(src proto.Message) { - xxx_messageInfo_UserAppLogGroup.Merge(dst, src) -} -func (m *UserAppLogGroup) XXX_Size() int { - return xxx_messageInfo_UserAppLogGroup.Size(m) -} -func (m *UserAppLogGroup) XXX_DiscardUnknown() { - xxx_messageInfo_UserAppLogGroup.DiscardUnknown(m) -} - -var xxx_messageInfo_UserAppLogGroup proto.InternalMessageInfo - -func (m *UserAppLogGroup) GetLogLine() []*UserAppLogLine { - if m != nil { - return m.LogLine - } - return nil -} - -type FlushRequest struct { - Logs []byte `protobuf:"bytes,1,opt,name=logs" json:"logs,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *FlushRequest) Reset() { *m = FlushRequest{} } -func (m *FlushRequest) String() string { return proto.CompactTextString(m) } -func (*FlushRequest) ProtoMessage() {} -func (*FlushRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_log_service_f054fd4b5012319d, []int{3} -} -func (m *FlushRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_FlushRequest.Unmarshal(m, b) -} -func (m *FlushRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_FlushRequest.Marshal(b, m, deterministic) -} -func (dst *FlushRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_FlushRequest.Merge(dst, src) -} -func (m *FlushRequest) XXX_Size() int { - return xxx_messageInfo_FlushRequest.Size(m) -} -func (m *FlushRequest) XXX_DiscardUnknown() { - xxx_messageInfo_FlushRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_FlushRequest proto.InternalMessageInfo - -func (m *FlushRequest) GetLogs() []byte { - if m != nil { - return m.Logs - } - return nil -} - -type SetStatusRequest struct { - Status *string `protobuf:"bytes,1,req,name=status" json:"status,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *SetStatusRequest) Reset() { *m = SetStatusRequest{} } -func (m *SetStatusRequest) String() string { return proto.CompactTextString(m) } -func (*SetStatusRequest) ProtoMessage() {} -func (*SetStatusRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_log_service_f054fd4b5012319d, []int{4} -} -func (m *SetStatusRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SetStatusRequest.Unmarshal(m, b) -} -func (m *SetStatusRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SetStatusRequest.Marshal(b, m, deterministic) -} -func (dst *SetStatusRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetStatusRequest.Merge(dst, src) -} -func (m *SetStatusRequest) XXX_Size() int { - return xxx_messageInfo_SetStatusRequest.Size(m) -} -func (m *SetStatusRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetStatusRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_SetStatusRequest proto.InternalMessageInfo - -func (m *SetStatusRequest) GetStatus() string { - if m != nil && m.Status != nil { - return *m.Status - } - return "" -} - -type LogOffset struct { - RequestId []byte `protobuf:"bytes,1,opt,name=request_id,json=requestId" json:"request_id,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *LogOffset) Reset() { *m = LogOffset{} } -func (m *LogOffset) String() string { return proto.CompactTextString(m) } -func (*LogOffset) ProtoMessage() {} -func (*LogOffset) Descriptor() ([]byte, []int) { - return fileDescriptor_log_service_f054fd4b5012319d, []int{5} -} -func (m *LogOffset) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_LogOffset.Unmarshal(m, b) -} -func (m *LogOffset) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_LogOffset.Marshal(b, m, deterministic) -} -func (dst *LogOffset) XXX_Merge(src proto.Message) { - xxx_messageInfo_LogOffset.Merge(dst, src) -} -func (m *LogOffset) XXX_Size() int { - return xxx_messageInfo_LogOffset.Size(m) -} -func (m *LogOffset) XXX_DiscardUnknown() { - xxx_messageInfo_LogOffset.DiscardUnknown(m) -} - -var xxx_messageInfo_LogOffset proto.InternalMessageInfo - -func (m *LogOffset) GetRequestId() []byte { - if m != nil { - return m.RequestId - } - return nil -} - -type LogLine struct { - Time *int64 `protobuf:"varint,1,req,name=time" json:"time,omitempty"` - Level *int32 `protobuf:"varint,2,req,name=level" json:"level,omitempty"` - LogMessage *string `protobuf:"bytes,3,req,name=log_message,json=logMessage" json:"log_message,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *LogLine) Reset() { *m = LogLine{} } -func (m *LogLine) String() string { return proto.CompactTextString(m) } -func (*LogLine) ProtoMessage() {} -func (*LogLine) Descriptor() ([]byte, []int) { - return fileDescriptor_log_service_f054fd4b5012319d, []int{6} -} -func (m *LogLine) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_LogLine.Unmarshal(m, b) -} -func (m *LogLine) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_LogLine.Marshal(b, m, deterministic) -} -func (dst *LogLine) XXX_Merge(src proto.Message) { - xxx_messageInfo_LogLine.Merge(dst, src) -} -func (m *LogLine) XXX_Size() int { - return xxx_messageInfo_LogLine.Size(m) -} -func (m *LogLine) XXX_DiscardUnknown() { - xxx_messageInfo_LogLine.DiscardUnknown(m) -} - -var xxx_messageInfo_LogLine proto.InternalMessageInfo - -func (m *LogLine) GetTime() int64 { - if m != nil && m.Time != nil { - return *m.Time - } - return 0 -} - -func (m *LogLine) GetLevel() int32 { - if m != nil && m.Level != nil { - return *m.Level - } - return 0 -} - -func (m *LogLine) GetLogMessage() string { - if m != nil && m.LogMessage != nil { - return *m.LogMessage - } - return "" -} - -type RequestLog struct { - AppId *string `protobuf:"bytes,1,req,name=app_id,json=appId" json:"app_id,omitempty"` - ModuleId *string `protobuf:"bytes,37,opt,name=module_id,json=moduleId,def=default" json:"module_id,omitempty"` - VersionId *string `protobuf:"bytes,2,req,name=version_id,json=versionId" json:"version_id,omitempty"` - RequestId []byte `protobuf:"bytes,3,req,name=request_id,json=requestId" json:"request_id,omitempty"` - Offset *LogOffset `protobuf:"bytes,35,opt,name=offset" json:"offset,omitempty"` - Ip *string `protobuf:"bytes,4,req,name=ip" json:"ip,omitempty"` - Nickname *string `protobuf:"bytes,5,opt,name=nickname" json:"nickname,omitempty"` - StartTime *int64 `protobuf:"varint,6,req,name=start_time,json=startTime" json:"start_time,omitempty"` - EndTime *int64 `protobuf:"varint,7,req,name=end_time,json=endTime" json:"end_time,omitempty"` - Latency *int64 `protobuf:"varint,8,req,name=latency" json:"latency,omitempty"` - Mcycles *int64 `protobuf:"varint,9,req,name=mcycles" json:"mcycles,omitempty"` - Method *string `protobuf:"bytes,10,req,name=method" json:"method,omitempty"` - Resource *string `protobuf:"bytes,11,req,name=resource" json:"resource,omitempty"` - HttpVersion *string `protobuf:"bytes,12,req,name=http_version,json=httpVersion" json:"http_version,omitempty"` - Status *int32 `protobuf:"varint,13,req,name=status" json:"status,omitempty"` - ResponseSize *int64 `protobuf:"varint,14,req,name=response_size,json=responseSize" json:"response_size,omitempty"` - Referrer *string `protobuf:"bytes,15,opt,name=referrer" json:"referrer,omitempty"` - UserAgent *string `protobuf:"bytes,16,opt,name=user_agent,json=userAgent" json:"user_agent,omitempty"` - UrlMapEntry *string `protobuf:"bytes,17,req,name=url_map_entry,json=urlMapEntry" json:"url_map_entry,omitempty"` - Combined *string `protobuf:"bytes,18,req,name=combined" json:"combined,omitempty"` - ApiMcycles *int64 `protobuf:"varint,19,opt,name=api_mcycles,json=apiMcycles" json:"api_mcycles,omitempty"` - Host *string `protobuf:"bytes,20,opt,name=host" json:"host,omitempty"` - Cost *float64 `protobuf:"fixed64,21,opt,name=cost" json:"cost,omitempty"` - TaskQueueName *string `protobuf:"bytes,22,opt,name=task_queue_name,json=taskQueueName" json:"task_queue_name,omitempty"` - TaskName *string `protobuf:"bytes,23,opt,name=task_name,json=taskName" json:"task_name,omitempty"` - WasLoadingRequest *bool `protobuf:"varint,24,opt,name=was_loading_request,json=wasLoadingRequest" json:"was_loading_request,omitempty"` - PendingTime *int64 `protobuf:"varint,25,opt,name=pending_time,json=pendingTime" json:"pending_time,omitempty"` - ReplicaIndex *int32 `protobuf:"varint,26,opt,name=replica_index,json=replicaIndex,def=-1" json:"replica_index,omitempty"` - Finished *bool `protobuf:"varint,27,opt,name=finished,def=1" json:"finished,omitempty"` - CloneKey []byte `protobuf:"bytes,28,opt,name=clone_key,json=cloneKey" json:"clone_key,omitempty"` - Line []*LogLine `protobuf:"bytes,29,rep,name=line" json:"line,omitempty"` - LinesIncomplete *bool `protobuf:"varint,36,opt,name=lines_incomplete,json=linesIncomplete" json:"lines_incomplete,omitempty"` - AppEngineRelease []byte `protobuf:"bytes,38,opt,name=app_engine_release,json=appEngineRelease" json:"app_engine_release,omitempty"` - ExitReason *int32 `protobuf:"varint,30,opt,name=exit_reason,json=exitReason" json:"exit_reason,omitempty"` - WasThrottledForTime *bool `protobuf:"varint,31,opt,name=was_throttled_for_time,json=wasThrottledForTime" json:"was_throttled_for_time,omitempty"` - WasThrottledForRequests *bool `protobuf:"varint,32,opt,name=was_throttled_for_requests,json=wasThrottledForRequests" json:"was_throttled_for_requests,omitempty"` - ThrottledTime *int64 `protobuf:"varint,33,opt,name=throttled_time,json=throttledTime" json:"throttled_time,omitempty"` - ServerName []byte `protobuf:"bytes,34,opt,name=server_name,json=serverName" json:"server_name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *RequestLog) Reset() { *m = RequestLog{} } -func (m *RequestLog) String() string { return proto.CompactTextString(m) } -func (*RequestLog) ProtoMessage() {} -func (*RequestLog) Descriptor() ([]byte, []int) { - return fileDescriptor_log_service_f054fd4b5012319d, []int{7} -} -func (m *RequestLog) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_RequestLog.Unmarshal(m, b) -} -func (m *RequestLog) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_RequestLog.Marshal(b, m, deterministic) -} -func (dst *RequestLog) XXX_Merge(src proto.Message) { - xxx_messageInfo_RequestLog.Merge(dst, src) -} -func (m *RequestLog) XXX_Size() int { - return xxx_messageInfo_RequestLog.Size(m) -} -func (m *RequestLog) XXX_DiscardUnknown() { - xxx_messageInfo_RequestLog.DiscardUnknown(m) -} - -var xxx_messageInfo_RequestLog proto.InternalMessageInfo - -const Default_RequestLog_ModuleId string = "default" -const Default_RequestLog_ReplicaIndex int32 = -1 -const Default_RequestLog_Finished bool = true - -func (m *RequestLog) GetAppId() string { - if m != nil && m.AppId != nil { - return *m.AppId - } - return "" -} - -func (m *RequestLog) GetModuleId() string { - if m != nil && m.ModuleId != nil { - return *m.ModuleId - } - return Default_RequestLog_ModuleId -} - -func (m *RequestLog) GetVersionId() string { - if m != nil && m.VersionId != nil { - return *m.VersionId - } - return "" -} - -func (m *RequestLog) GetRequestId() []byte { - if m != nil { - return m.RequestId - } - return nil -} - -func (m *RequestLog) GetOffset() *LogOffset { - if m != nil { - return m.Offset - } - return nil -} - -func (m *RequestLog) GetIp() string { - if m != nil && m.Ip != nil { - return *m.Ip - } - return "" -} - -func (m *RequestLog) GetNickname() string { - if m != nil && m.Nickname != nil { - return *m.Nickname - } - return "" -} - -func (m *RequestLog) GetStartTime() int64 { - if m != nil && m.StartTime != nil { - return *m.StartTime - } - return 0 -} - -func (m *RequestLog) GetEndTime() int64 { - if m != nil && m.EndTime != nil { - return *m.EndTime - } - return 0 -} - -func (m *RequestLog) GetLatency() int64 { - if m != nil && m.Latency != nil { - return *m.Latency - } - return 0 -} - -func (m *RequestLog) GetMcycles() int64 { - if m != nil && m.Mcycles != nil { - return *m.Mcycles - } - return 0 -} - -func (m *RequestLog) GetMethod() string { - if m != nil && m.Method != nil { - return *m.Method - } - return "" -} - -func (m *RequestLog) GetResource() string { - if m != nil && m.Resource != nil { - return *m.Resource - } - return "" -} - -func (m *RequestLog) GetHttpVersion() string { - if m != nil && m.HttpVersion != nil { - return *m.HttpVersion - } - return "" -} - -func (m *RequestLog) GetStatus() int32 { - if m != nil && m.Status != nil { - return *m.Status - } - return 0 -} - -func (m *RequestLog) GetResponseSize() int64 { - if m != nil && m.ResponseSize != nil { - return *m.ResponseSize - } - return 0 -} - -func (m *RequestLog) GetReferrer() string { - if m != nil && m.Referrer != nil { - return *m.Referrer - } - return "" -} - -func (m *RequestLog) GetUserAgent() string { - if m != nil && m.UserAgent != nil { - return *m.UserAgent - } - return "" -} - -func (m *RequestLog) GetUrlMapEntry() string { - if m != nil && m.UrlMapEntry != nil { - return *m.UrlMapEntry - } - return "" -} - -func (m *RequestLog) GetCombined() string { - if m != nil && m.Combined != nil { - return *m.Combined - } - return "" -} - -func (m *RequestLog) GetApiMcycles() int64 { - if m != nil && m.ApiMcycles != nil { - return *m.ApiMcycles - } - return 0 -} - -func (m *RequestLog) GetHost() string { - if m != nil && m.Host != nil { - return *m.Host - } - return "" -} - -func (m *RequestLog) GetCost() float64 { - if m != nil && m.Cost != nil { - return *m.Cost - } - return 0 -} - -func (m *RequestLog) GetTaskQueueName() string { - if m != nil && m.TaskQueueName != nil { - return *m.TaskQueueName - } - return "" -} - -func (m *RequestLog) GetTaskName() string { - if m != nil && m.TaskName != nil { - return *m.TaskName - } - return "" -} - -func (m *RequestLog) GetWasLoadingRequest() bool { - if m != nil && m.WasLoadingRequest != nil { - return *m.WasLoadingRequest - } - return false -} - -func (m *RequestLog) GetPendingTime() int64 { - if m != nil && m.PendingTime != nil { - return *m.PendingTime - } - return 0 -} - -func (m *RequestLog) GetReplicaIndex() int32 { - if m != nil && m.ReplicaIndex != nil { - return *m.ReplicaIndex - } - return Default_RequestLog_ReplicaIndex -} - -func (m *RequestLog) GetFinished() bool { - if m != nil && m.Finished != nil { - return *m.Finished - } - return Default_RequestLog_Finished -} - -func (m *RequestLog) GetCloneKey() []byte { - if m != nil { - return m.CloneKey - } - return nil -} - -func (m *RequestLog) GetLine() []*LogLine { - if m != nil { - return m.Line - } - return nil -} - -func (m *RequestLog) GetLinesIncomplete() bool { - if m != nil && m.LinesIncomplete != nil { - return *m.LinesIncomplete - } - return false -} - -func (m *RequestLog) GetAppEngineRelease() []byte { - if m != nil { - return m.AppEngineRelease - } - return nil -} - -func (m *RequestLog) GetExitReason() int32 { - if m != nil && m.ExitReason != nil { - return *m.ExitReason - } - return 0 -} - -func (m *RequestLog) GetWasThrottledForTime() bool { - if m != nil && m.WasThrottledForTime != nil { - return *m.WasThrottledForTime - } - return false -} - -func (m *RequestLog) GetWasThrottledForRequests() bool { - if m != nil && m.WasThrottledForRequests != nil { - return *m.WasThrottledForRequests - } - return false -} - -func (m *RequestLog) GetThrottledTime() int64 { - if m != nil && m.ThrottledTime != nil { - return *m.ThrottledTime - } - return 0 -} - -func (m *RequestLog) GetServerName() []byte { - if m != nil { - return m.ServerName - } - return nil -} - -type LogModuleVersion struct { - ModuleId *string `protobuf:"bytes,1,opt,name=module_id,json=moduleId,def=default" json:"module_id,omitempty"` - VersionId *string `protobuf:"bytes,2,opt,name=version_id,json=versionId" json:"version_id,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *LogModuleVersion) Reset() { *m = LogModuleVersion{} } -func (m *LogModuleVersion) String() string { return proto.CompactTextString(m) } -func (*LogModuleVersion) ProtoMessage() {} -func (*LogModuleVersion) Descriptor() ([]byte, []int) { - return fileDescriptor_log_service_f054fd4b5012319d, []int{8} -} -func (m *LogModuleVersion) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_LogModuleVersion.Unmarshal(m, b) -} -func (m *LogModuleVersion) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_LogModuleVersion.Marshal(b, m, deterministic) -} -func (dst *LogModuleVersion) XXX_Merge(src proto.Message) { - xxx_messageInfo_LogModuleVersion.Merge(dst, src) -} -func (m *LogModuleVersion) XXX_Size() int { - return xxx_messageInfo_LogModuleVersion.Size(m) -} -func (m *LogModuleVersion) XXX_DiscardUnknown() { - xxx_messageInfo_LogModuleVersion.DiscardUnknown(m) -} - -var xxx_messageInfo_LogModuleVersion proto.InternalMessageInfo - -const Default_LogModuleVersion_ModuleId string = "default" - -func (m *LogModuleVersion) GetModuleId() string { - if m != nil && m.ModuleId != nil { - return *m.ModuleId - } - return Default_LogModuleVersion_ModuleId -} - -func (m *LogModuleVersion) GetVersionId() string { - if m != nil && m.VersionId != nil { - return *m.VersionId - } - return "" -} - -type LogReadRequest struct { - AppId *string `protobuf:"bytes,1,req,name=app_id,json=appId" json:"app_id,omitempty"` - VersionId []string `protobuf:"bytes,2,rep,name=version_id,json=versionId" json:"version_id,omitempty"` - ModuleVersion []*LogModuleVersion `protobuf:"bytes,19,rep,name=module_version,json=moduleVersion" json:"module_version,omitempty"` - StartTime *int64 `protobuf:"varint,3,opt,name=start_time,json=startTime" json:"start_time,omitempty"` - EndTime *int64 `protobuf:"varint,4,opt,name=end_time,json=endTime" json:"end_time,omitempty"` - Offset *LogOffset `protobuf:"bytes,5,opt,name=offset" json:"offset,omitempty"` - RequestId [][]byte `protobuf:"bytes,6,rep,name=request_id,json=requestId" json:"request_id,omitempty"` - MinimumLogLevel *int32 `protobuf:"varint,7,opt,name=minimum_log_level,json=minimumLogLevel" json:"minimum_log_level,omitempty"` - IncludeIncomplete *bool `protobuf:"varint,8,opt,name=include_incomplete,json=includeIncomplete" json:"include_incomplete,omitempty"` - Count *int64 `protobuf:"varint,9,opt,name=count" json:"count,omitempty"` - CombinedLogRegex *string `protobuf:"bytes,14,opt,name=combined_log_regex,json=combinedLogRegex" json:"combined_log_regex,omitempty"` - HostRegex *string `protobuf:"bytes,15,opt,name=host_regex,json=hostRegex" json:"host_regex,omitempty"` - ReplicaIndex *int32 `protobuf:"varint,16,opt,name=replica_index,json=replicaIndex" json:"replica_index,omitempty"` - IncludeAppLogs *bool `protobuf:"varint,10,opt,name=include_app_logs,json=includeAppLogs" json:"include_app_logs,omitempty"` - AppLogsPerRequest *int32 `protobuf:"varint,17,opt,name=app_logs_per_request,json=appLogsPerRequest" json:"app_logs_per_request,omitempty"` - IncludeHost *bool `protobuf:"varint,11,opt,name=include_host,json=includeHost" json:"include_host,omitempty"` - IncludeAll *bool `protobuf:"varint,12,opt,name=include_all,json=includeAll" json:"include_all,omitempty"` - CacheIterator *bool `protobuf:"varint,13,opt,name=cache_iterator,json=cacheIterator" json:"cache_iterator,omitempty"` - NumShards *int32 `protobuf:"varint,18,opt,name=num_shards,json=numShards" json:"num_shards,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *LogReadRequest) Reset() { *m = LogReadRequest{} } -func (m *LogReadRequest) String() string { return proto.CompactTextString(m) } -func (*LogReadRequest) ProtoMessage() {} -func (*LogReadRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_log_service_f054fd4b5012319d, []int{9} -} -func (m *LogReadRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_LogReadRequest.Unmarshal(m, b) -} -func (m *LogReadRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_LogReadRequest.Marshal(b, m, deterministic) -} -func (dst *LogReadRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_LogReadRequest.Merge(dst, src) -} -func (m *LogReadRequest) XXX_Size() int { - return xxx_messageInfo_LogReadRequest.Size(m) -} -func (m *LogReadRequest) XXX_DiscardUnknown() { - xxx_messageInfo_LogReadRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_LogReadRequest proto.InternalMessageInfo - -func (m *LogReadRequest) GetAppId() string { - if m != nil && m.AppId != nil { - return *m.AppId - } - return "" -} - -func (m *LogReadRequest) GetVersionId() []string { - if m != nil { - return m.VersionId - } - return nil -} - -func (m *LogReadRequest) GetModuleVersion() []*LogModuleVersion { - if m != nil { - return m.ModuleVersion - } - return nil -} - -func (m *LogReadRequest) GetStartTime() int64 { - if m != nil && m.StartTime != nil { - return *m.StartTime - } - return 0 -} - -func (m *LogReadRequest) GetEndTime() int64 { - if m != nil && m.EndTime != nil { - return *m.EndTime - } - return 0 -} - -func (m *LogReadRequest) GetOffset() *LogOffset { - if m != nil { - return m.Offset - } - return nil -} - -func (m *LogReadRequest) GetRequestId() [][]byte { - if m != nil { - return m.RequestId - } - return nil -} - -func (m *LogReadRequest) GetMinimumLogLevel() int32 { - if m != nil && m.MinimumLogLevel != nil { - return *m.MinimumLogLevel - } - return 0 -} - -func (m *LogReadRequest) GetIncludeIncomplete() bool { - if m != nil && m.IncludeIncomplete != nil { - return *m.IncludeIncomplete - } - return false -} - -func (m *LogReadRequest) GetCount() int64 { - if m != nil && m.Count != nil { - return *m.Count - } - return 0 -} - -func (m *LogReadRequest) GetCombinedLogRegex() string { - if m != nil && m.CombinedLogRegex != nil { - return *m.CombinedLogRegex - } - return "" -} - -func (m *LogReadRequest) GetHostRegex() string { - if m != nil && m.HostRegex != nil { - return *m.HostRegex - } - return "" -} - -func (m *LogReadRequest) GetReplicaIndex() int32 { - if m != nil && m.ReplicaIndex != nil { - return *m.ReplicaIndex - } - return 0 -} - -func (m *LogReadRequest) GetIncludeAppLogs() bool { - if m != nil && m.IncludeAppLogs != nil { - return *m.IncludeAppLogs - } - return false -} - -func (m *LogReadRequest) GetAppLogsPerRequest() int32 { - if m != nil && m.AppLogsPerRequest != nil { - return *m.AppLogsPerRequest - } - return 0 -} - -func (m *LogReadRequest) GetIncludeHost() bool { - if m != nil && m.IncludeHost != nil { - return *m.IncludeHost - } - return false -} - -func (m *LogReadRequest) GetIncludeAll() bool { - if m != nil && m.IncludeAll != nil { - return *m.IncludeAll - } - return false -} - -func (m *LogReadRequest) GetCacheIterator() bool { - if m != nil && m.CacheIterator != nil { - return *m.CacheIterator - } - return false -} - -func (m *LogReadRequest) GetNumShards() int32 { - if m != nil && m.NumShards != nil { - return *m.NumShards - } - return 0 -} - -type LogReadResponse struct { - Log []*RequestLog `protobuf:"bytes,1,rep,name=log" json:"log,omitempty"` - Offset *LogOffset `protobuf:"bytes,2,opt,name=offset" json:"offset,omitempty"` - LastEndTime *int64 `protobuf:"varint,3,opt,name=last_end_time,json=lastEndTime" json:"last_end_time,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *LogReadResponse) Reset() { *m = LogReadResponse{} } -func (m *LogReadResponse) String() string { return proto.CompactTextString(m) } -func (*LogReadResponse) ProtoMessage() {} -func (*LogReadResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_log_service_f054fd4b5012319d, []int{10} -} -func (m *LogReadResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_LogReadResponse.Unmarshal(m, b) -} -func (m *LogReadResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_LogReadResponse.Marshal(b, m, deterministic) -} -func (dst *LogReadResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_LogReadResponse.Merge(dst, src) -} -func (m *LogReadResponse) XXX_Size() int { - return xxx_messageInfo_LogReadResponse.Size(m) -} -func (m *LogReadResponse) XXX_DiscardUnknown() { - xxx_messageInfo_LogReadResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_LogReadResponse proto.InternalMessageInfo - -func (m *LogReadResponse) GetLog() []*RequestLog { - if m != nil { - return m.Log - } - return nil -} - -func (m *LogReadResponse) GetOffset() *LogOffset { - if m != nil { - return m.Offset - } - return nil -} - -func (m *LogReadResponse) GetLastEndTime() int64 { - if m != nil && m.LastEndTime != nil { - return *m.LastEndTime - } - return 0 -} - -type LogUsageRecord struct { - VersionId *string `protobuf:"bytes,1,opt,name=version_id,json=versionId" json:"version_id,omitempty"` - StartTime *int32 `protobuf:"varint,2,opt,name=start_time,json=startTime" json:"start_time,omitempty"` - EndTime *int32 `protobuf:"varint,3,opt,name=end_time,json=endTime" json:"end_time,omitempty"` - Count *int64 `protobuf:"varint,4,opt,name=count" json:"count,omitempty"` - TotalSize *int64 `protobuf:"varint,5,opt,name=total_size,json=totalSize" json:"total_size,omitempty"` - Records *int32 `protobuf:"varint,6,opt,name=records" json:"records,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *LogUsageRecord) Reset() { *m = LogUsageRecord{} } -func (m *LogUsageRecord) String() string { return proto.CompactTextString(m) } -func (*LogUsageRecord) ProtoMessage() {} -func (*LogUsageRecord) Descriptor() ([]byte, []int) { - return fileDescriptor_log_service_f054fd4b5012319d, []int{11} -} -func (m *LogUsageRecord) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_LogUsageRecord.Unmarshal(m, b) -} -func (m *LogUsageRecord) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_LogUsageRecord.Marshal(b, m, deterministic) -} -func (dst *LogUsageRecord) XXX_Merge(src proto.Message) { - xxx_messageInfo_LogUsageRecord.Merge(dst, src) -} -func (m *LogUsageRecord) XXX_Size() int { - return xxx_messageInfo_LogUsageRecord.Size(m) -} -func (m *LogUsageRecord) XXX_DiscardUnknown() { - xxx_messageInfo_LogUsageRecord.DiscardUnknown(m) -} - -var xxx_messageInfo_LogUsageRecord proto.InternalMessageInfo - -func (m *LogUsageRecord) GetVersionId() string { - if m != nil && m.VersionId != nil { - return *m.VersionId - } - return "" -} - -func (m *LogUsageRecord) GetStartTime() int32 { - if m != nil && m.StartTime != nil { - return *m.StartTime - } - return 0 -} - -func (m *LogUsageRecord) GetEndTime() int32 { - if m != nil && m.EndTime != nil { - return *m.EndTime - } - return 0 -} - -func (m *LogUsageRecord) GetCount() int64 { - if m != nil && m.Count != nil { - return *m.Count - } - return 0 -} - -func (m *LogUsageRecord) GetTotalSize() int64 { - if m != nil && m.TotalSize != nil { - return *m.TotalSize - } - return 0 -} - -func (m *LogUsageRecord) GetRecords() int32 { - if m != nil && m.Records != nil { - return *m.Records - } - return 0 -} - -type LogUsageRequest struct { - AppId *string `protobuf:"bytes,1,req,name=app_id,json=appId" json:"app_id,omitempty"` - VersionId []string `protobuf:"bytes,2,rep,name=version_id,json=versionId" json:"version_id,omitempty"` - StartTime *int32 `protobuf:"varint,3,opt,name=start_time,json=startTime" json:"start_time,omitempty"` - EndTime *int32 `protobuf:"varint,4,opt,name=end_time,json=endTime" json:"end_time,omitempty"` - ResolutionHours *uint32 `protobuf:"varint,5,opt,name=resolution_hours,json=resolutionHours,def=1" json:"resolution_hours,omitempty"` - CombineVersions *bool `protobuf:"varint,6,opt,name=combine_versions,json=combineVersions" json:"combine_versions,omitempty"` - UsageVersion *int32 `protobuf:"varint,7,opt,name=usage_version,json=usageVersion" json:"usage_version,omitempty"` - VersionsOnly *bool `protobuf:"varint,8,opt,name=versions_only,json=versionsOnly" json:"versions_only,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *LogUsageRequest) Reset() { *m = LogUsageRequest{} } -func (m *LogUsageRequest) String() string { return proto.CompactTextString(m) } -func (*LogUsageRequest) ProtoMessage() {} -func (*LogUsageRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_log_service_f054fd4b5012319d, []int{12} -} -func (m *LogUsageRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_LogUsageRequest.Unmarshal(m, b) -} -func (m *LogUsageRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_LogUsageRequest.Marshal(b, m, deterministic) -} -func (dst *LogUsageRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_LogUsageRequest.Merge(dst, src) -} -func (m *LogUsageRequest) XXX_Size() int { - return xxx_messageInfo_LogUsageRequest.Size(m) -} -func (m *LogUsageRequest) XXX_DiscardUnknown() { - xxx_messageInfo_LogUsageRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_LogUsageRequest proto.InternalMessageInfo - -const Default_LogUsageRequest_ResolutionHours uint32 = 1 - -func (m *LogUsageRequest) GetAppId() string { - if m != nil && m.AppId != nil { - return *m.AppId - } - return "" -} - -func (m *LogUsageRequest) GetVersionId() []string { - if m != nil { - return m.VersionId - } - return nil -} - -func (m *LogUsageRequest) GetStartTime() int32 { - if m != nil && m.StartTime != nil { - return *m.StartTime - } - return 0 -} - -func (m *LogUsageRequest) GetEndTime() int32 { - if m != nil && m.EndTime != nil { - return *m.EndTime - } - return 0 -} - -func (m *LogUsageRequest) GetResolutionHours() uint32 { - if m != nil && m.ResolutionHours != nil { - return *m.ResolutionHours - } - return Default_LogUsageRequest_ResolutionHours -} - -func (m *LogUsageRequest) GetCombineVersions() bool { - if m != nil && m.CombineVersions != nil { - return *m.CombineVersions - } - return false -} - -func (m *LogUsageRequest) GetUsageVersion() int32 { - if m != nil && m.UsageVersion != nil { - return *m.UsageVersion - } - return 0 -} - -func (m *LogUsageRequest) GetVersionsOnly() bool { - if m != nil && m.VersionsOnly != nil { - return *m.VersionsOnly - } - return false -} - -type LogUsageResponse struct { - Usage []*LogUsageRecord `protobuf:"bytes,1,rep,name=usage" json:"usage,omitempty"` - Summary *LogUsageRecord `protobuf:"bytes,2,opt,name=summary" json:"summary,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *LogUsageResponse) Reset() { *m = LogUsageResponse{} } -func (m *LogUsageResponse) String() string { return proto.CompactTextString(m) } -func (*LogUsageResponse) ProtoMessage() {} -func (*LogUsageResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_log_service_f054fd4b5012319d, []int{13} -} -func (m *LogUsageResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_LogUsageResponse.Unmarshal(m, b) -} -func (m *LogUsageResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_LogUsageResponse.Marshal(b, m, deterministic) -} -func (dst *LogUsageResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_LogUsageResponse.Merge(dst, src) -} -func (m *LogUsageResponse) XXX_Size() int { - return xxx_messageInfo_LogUsageResponse.Size(m) -} -func (m *LogUsageResponse) XXX_DiscardUnknown() { - xxx_messageInfo_LogUsageResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_LogUsageResponse proto.InternalMessageInfo - -func (m *LogUsageResponse) GetUsage() []*LogUsageRecord { - if m != nil { - return m.Usage - } - return nil -} - -func (m *LogUsageResponse) GetSummary() *LogUsageRecord { - if m != nil { - return m.Summary - } - return nil -} - -func init() { - proto.RegisterType((*LogServiceError)(nil), "appengine.LogServiceError") - proto.RegisterType((*UserAppLogLine)(nil), "appengine.UserAppLogLine") - proto.RegisterType((*UserAppLogGroup)(nil), "appengine.UserAppLogGroup") - proto.RegisterType((*FlushRequest)(nil), "appengine.FlushRequest") - proto.RegisterType((*SetStatusRequest)(nil), "appengine.SetStatusRequest") - proto.RegisterType((*LogOffset)(nil), "appengine.LogOffset") - proto.RegisterType((*LogLine)(nil), "appengine.LogLine") - proto.RegisterType((*RequestLog)(nil), "appengine.RequestLog") - proto.RegisterType((*LogModuleVersion)(nil), "appengine.LogModuleVersion") - proto.RegisterType((*LogReadRequest)(nil), "appengine.LogReadRequest") - proto.RegisterType((*LogReadResponse)(nil), "appengine.LogReadResponse") - proto.RegisterType((*LogUsageRecord)(nil), "appengine.LogUsageRecord") - proto.RegisterType((*LogUsageRequest)(nil), "appengine.LogUsageRequest") - proto.RegisterType((*LogUsageResponse)(nil), "appengine.LogUsageResponse") -} - -func init() { - proto.RegisterFile("google.golang.org/appengine/internal/log/log_service.proto", fileDescriptor_log_service_f054fd4b5012319d) -} - -var fileDescriptor_log_service_f054fd4b5012319d = []byte{ - // 1553 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x56, 0xdd, 0x72, 0xdb, 0xc6, - 0x15, 0x2e, 0x48, 0x51, 0x24, 0x0f, 0x49, 0x91, 0x5a, 0xcb, 0xce, 0xda, 0xae, 0x6b, 0x1a, 0x4e, - 0x1c, 0xd6, 0x93, 0x48, 0x93, 0xa4, 0x57, 0xca, 0x95, 0xd3, 0x2a, 0x8e, 0x26, 0xb4, 0xd5, 0x40, - 0x72, 0x3a, 0xd3, 0x1b, 0x0c, 0x0a, 0x1c, 0x81, 0x18, 0x2f, 0xb1, 0xc8, 0xee, 0xc2, 0x91, 0x72, - 0xdb, 0xdb, 0x3e, 0x46, 0x1f, 0xa2, 0xaf, 0xd2, 0xb7, 0xe9, 0xec, 0xd9, 0x05, 0x44, 0x2a, 0x4d, - 0xc6, 0x33, 0xb9, 0xe0, 0x10, 0xfb, 0x9d, 0x83, 0xdd, 0xf3, 0xf3, 0x9d, 0x6f, 0x01, 0xc7, 0xb9, - 0x94, 0xb9, 0xc0, 0xc3, 0x5c, 0x8a, 0xa4, 0xcc, 0x0f, 0xa5, 0xca, 0x8f, 0x92, 0xaa, 0xc2, 0x32, - 0x2f, 0x4a, 0x3c, 0x2a, 0x4a, 0x83, 0xaa, 0x4c, 0xc4, 0x91, 0x90, 0xb9, 0xfd, 0xc5, 0x1a, 0xd5, - 0xbb, 0x22, 0xc5, 0xc3, 0x4a, 0x49, 0x23, 0xd9, 0xb0, 0xf5, 0x0c, 0x5f, 0xc3, 0x74, 0x29, 0xf3, - 0x73, 0x67, 0x3e, 0x51, 0x4a, 0xaa, 0xf0, 0x4b, 0x18, 0xd2, 0xc3, 0x9f, 0x65, 0x86, 0x6c, 0x17, - 0x3a, 0x67, 0xdf, 0xce, 0x7e, 0xc7, 0xee, 0xc0, 0xf4, 0xf4, 0xf5, 0xf7, 0x2f, 0x96, 0xa7, 0x7f, - 0x89, 0xa3, 0x93, 0xef, 0xde, 0x9c, 0x9c, 0x5f, 0xcc, 0x02, 0xb6, 0x0f, 0x93, 0xf3, 0x8b, 0xb3, - 0xe8, 0xc5, 0xcb, 0x93, 0xf8, 0x24, 0x8a, 0xce, 0xa2, 0x59, 0x27, 0xcc, 0x61, 0xef, 0x8d, 0x46, - 0xf5, 0xa2, 0xaa, 0x96, 0x32, 0x5f, 0x16, 0x25, 0xb2, 0x8f, 0x60, 0xcf, 0x14, 0x6b, 0xd4, 0x26, - 0x59, 0x57, 0x71, 0xad, 0x31, 0xe5, 0xc1, 0xbc, 0xb3, 0xe8, 0x46, 0x93, 0x16, 0x7d, 0xa3, 0x31, - 0x65, 0x07, 0xd0, 0x13, 0xf8, 0x0e, 0x05, 0xef, 0x90, 0xd5, 0x2d, 0x18, 0x87, 0xfe, 0x1a, 0xb5, - 0x4e, 0x72, 0xe4, 0xdd, 0x79, 0x67, 0x31, 0x8c, 0x9a, 0x65, 0xf8, 0x12, 0xa6, 0x37, 0x07, 0xbd, - 0x54, 0xb2, 0xae, 0xd8, 0x9f, 0x60, 0x60, 0x73, 0x15, 0x45, 0x89, 0xbc, 0x33, 0xef, 0x2e, 0x46, - 0x9f, 0xdf, 0x3f, 0x6c, 0x33, 0x3d, 0xdc, 0x0e, 0x2b, 0xea, 0x0b, 0xf7, 0x10, 0x86, 0x30, 0xfe, - 0x5a, 0xd4, 0x7a, 0x15, 0xe1, 0x0f, 0x35, 0x6a, 0xc3, 0x18, 0xec, 0x08, 0x99, 0x6b, 0x1e, 0xcc, - 0x83, 0xc5, 0x38, 0xa2, 0xe7, 0xf0, 0x39, 0xcc, 0xce, 0xd1, 0x9c, 0x9b, 0xc4, 0xd4, 0xba, 0xf1, - 0xbb, 0x07, 0xbb, 0x9a, 0x00, 0xca, 0x67, 0x18, 0xf9, 0x55, 0xf8, 0x1c, 0x86, 0x4b, 0x99, 0x9f, - 0x5d, 0x5e, 0x6a, 0x34, 0xec, 0x11, 0x80, 0x72, 0xfe, 0x71, 0x91, 0xf9, 0x2d, 0x87, 0x1e, 0x39, - 0xcd, 0xc2, 0x0b, 0xe8, 0x37, 0x65, 0x62, 0xb0, 0x63, 0x0b, 0xe2, 0x8b, 0x43, 0xcf, 0xdb, 0x35, - 0xe9, 0x35, 0x35, 0x79, 0x0c, 0x23, 0x9b, 0xe6, 0x76, 0x5d, 0x40, 0xc8, 0xfc, 0x95, 0x2f, 0xcd, - 0x3f, 0x01, 0xc0, 0x47, 0xb9, 0x94, 0x39, 0xbb, 0x0b, 0xbb, 0x49, 0x55, 0xb9, 0xf3, 0xad, 0x6b, - 0x2f, 0xa9, 0xaa, 0xd3, 0x8c, 0x7d, 0x08, 0xc3, 0xb5, 0xcc, 0x6a, 0x81, 0xd6, 0xf2, 0xd1, 0x3c, - 0x58, 0x0c, 0x8f, 0xfb, 0x19, 0x5e, 0x26, 0xb5, 0x30, 0xd1, 0xc0, 0x59, 0x4e, 0x33, 0x9b, 0xc0, - 0x3b, 0x54, 0xba, 0x90, 0xa5, 0x75, 0xeb, 0xd0, 0x06, 0x43, 0x8f, 0x38, 0xf3, 0x46, 0x7e, 0x36, - 0x94, 0xcd, 0xfc, 0xd8, 0x27, 0xb0, 0x2b, 0xa9, 0x10, 0xfc, 0xe9, 0x3c, 0x58, 0x8c, 0x3e, 0x3f, - 0xd8, 0xe8, 0x47, 0x5b, 0xa4, 0xc8, 0xfb, 0xb0, 0x3d, 0xe8, 0x14, 0x15, 0xdf, 0xa1, 0x33, 0x3a, - 0x45, 0xc5, 0x1e, 0xc0, 0xa0, 0x2c, 0xd2, 0xb7, 0x65, 0xb2, 0x46, 0xde, 0xb3, 0x01, 0x46, 0xed, - 0xda, 0x1e, 0xac, 0x4d, 0xa2, 0x4c, 0x4c, 0x45, 0xdb, 0xa5, 0xa2, 0x0d, 0x09, 0xb9, 0xb0, 0x95, - 0xbb, 0x0f, 0x03, 0x2c, 0x33, 0x67, 0xec, 0x93, 0xb1, 0x8f, 0x65, 0x46, 0x26, 0x0e, 0x7d, 0x91, - 0x18, 0x2c, 0xd3, 0x6b, 0x3e, 0x70, 0x16, 0xbf, 0x24, 0xb2, 0xa5, 0xd7, 0xa9, 0x40, 0xcd, 0x87, - 0xce, 0xe2, 0x97, 0xb6, 0xd7, 0x6b, 0x34, 0x2b, 0x99, 0x71, 0x70, 0xbd, 0x76, 0x2b, 0x1b, 0xa1, - 0x42, 0x2d, 0x6b, 0x95, 0x22, 0x1f, 0x91, 0xa5, 0x5d, 0xb3, 0x27, 0x30, 0x5e, 0x19, 0x53, 0xc5, - 0xbe, 0x58, 0x7c, 0x4c, 0xf6, 0x91, 0xc5, 0xbe, 0x77, 0xd0, 0x06, 0x85, 0x26, 0xd4, 0x60, 0xbf, - 0x62, 0x4f, 0x61, 0xa2, 0x50, 0x57, 0xb2, 0xd4, 0x18, 0xeb, 0xe2, 0x27, 0xe4, 0x7b, 0x14, 0xce, - 0xb8, 0x01, 0xcf, 0x8b, 0x9f, 0xd0, 0x9d, 0x7d, 0x89, 0x4a, 0xa1, 0xe2, 0x53, 0x57, 0x9d, 0x66, - 0x6d, 0xab, 0x53, 0x6b, 0x54, 0x71, 0x92, 0x63, 0x69, 0xf8, 0x8c, 0xac, 0x43, 0x8b, 0xbc, 0xb0, - 0x00, 0x0b, 0x61, 0x52, 0x2b, 0x11, 0xaf, 0x93, 0x2a, 0xc6, 0xd2, 0xa8, 0x6b, 0xbe, 0xef, 0x62, - 0xab, 0x95, 0x78, 0x95, 0x54, 0x27, 0x16, 0xb2, 0xdb, 0xa7, 0x72, 0xfd, 0x8f, 0xa2, 0xc4, 0x8c, - 0x33, 0x97, 0x5a, 0xb3, 0xb6, 0x0c, 0x4c, 0xaa, 0x22, 0x6e, 0x8a, 0x75, 0x67, 0x1e, 0x2c, 0xba, - 0x11, 0x24, 0x55, 0xf1, 0xca, 0xd7, 0x8b, 0xc1, 0xce, 0x4a, 0x6a, 0xc3, 0x0f, 0xe8, 0x64, 0x7a, - 0xb6, 0x58, 0x6a, 0xb1, 0xbb, 0xf3, 0x60, 0x11, 0x44, 0xf4, 0xcc, 0x9e, 0xc1, 0xd4, 0x24, 0xfa, - 0x6d, 0xfc, 0x43, 0x8d, 0x35, 0xc6, 0xd4, 0xe8, 0x7b, 0xf4, 0xca, 0xc4, 0xc2, 0xdf, 0x59, 0xf4, - 0xb5, 0xed, 0xf6, 0x43, 0x18, 0x92, 0x1f, 0x79, 0x7c, 0xe0, 0x92, 0xb5, 0x00, 0x19, 0x0f, 0xe1, - 0xce, 0x8f, 0x89, 0x8e, 0x85, 0x4c, 0xb2, 0xa2, 0xcc, 0x63, 0xcf, 0x3e, 0xce, 0xe7, 0xc1, 0x62, - 0x10, 0xed, 0xff, 0x98, 0xe8, 0xa5, 0xb3, 0x34, 0x83, 0xfb, 0x04, 0xc6, 0x15, 0x96, 0xe4, 0x4b, - 0xfc, 0xb8, 0x4f, 0xe1, 0x8f, 0x3c, 0x46, 0x1c, 0xf9, 0xd8, 0x36, 0xa0, 0x12, 0x45, 0x9a, 0xc4, - 0x45, 0x99, 0xe1, 0x15, 0x7f, 0x30, 0x0f, 0x16, 0xbd, 0xe3, 0xce, 0xa7, 0x9f, 0xd9, 0x26, 0x90, - 0xe1, 0xd4, 0xe2, 0x6c, 0x0e, 0x83, 0xcb, 0xa2, 0x2c, 0xf4, 0x0a, 0x33, 0xfe, 0xd0, 0x1e, 0x78, - 0xbc, 0x63, 0x54, 0x8d, 0x51, 0x8b, 0xda, 0xd0, 0x53, 0x21, 0x4b, 0x8c, 0xdf, 0xe2, 0x35, 0xff, - 0x3d, 0x09, 0xc0, 0x80, 0x80, 0x6f, 0xf1, 0x9a, 0x3d, 0x83, 0x1d, 0x52, 0xab, 0x47, 0xa4, 0x56, - 0x6c, 0x7b, 0x3a, 0x48, 0xa6, 0xc8, 0xce, 0xfe, 0x08, 0x33, 0xfb, 0xaf, 0xe3, 0xa2, 0x4c, 0xe5, - 0xba, 0x12, 0x68, 0x90, 0x7f, 0x48, 0xf9, 0x4d, 0x09, 0x3f, 0x6d, 0x61, 0xf6, 0x09, 0x30, 0x3b, - 0xed, 0x6e, 0x9b, 0x58, 0xa1, 0xc0, 0x44, 0x23, 0x7f, 0x46, 0x07, 0xcf, 0x92, 0xaa, 0x3a, 0x21, - 0x43, 0xe4, 0x70, 0xdb, 0x49, 0xbc, 0x2a, 0x4c, 0xac, 0x30, 0xd1, 0xb2, 0xe4, 0x7f, 0xb0, 0x69, - 0x46, 0x60, 0xa1, 0x88, 0x10, 0xf6, 0x05, 0xdc, 0xb3, 0xc5, 0x35, 0x2b, 0x25, 0x8d, 0x11, 0x98, - 0xc5, 0x97, 0x52, 0xb9, 0xb2, 0x3d, 0xa6, 0xf3, 0x6d, 0xe9, 0x2f, 0x1a, 0xe3, 0xd7, 0x52, 0x51, - 0xf9, 0xbe, 0x84, 0x07, 0x3f, 0x7f, 0xc9, 0xf7, 0x45, 0xf3, 0x39, 0xbd, 0xf8, 0xc1, 0xad, 0x17, - 0x7d, 0x77, 0x34, 0xdd, 0x17, 0xed, 0x8b, 0x74, 0xd2, 0x13, 0x6a, 0xd0, 0xa4, 0x45, 0xe9, 0x8c, - 0xc7, 0x30, 0xb2, 0x97, 0x1a, 0x2a, 0x47, 0x8a, 0x90, 0x12, 0x04, 0x07, 0x59, 0x5a, 0x84, 0x7f, - 0x83, 0xd9, 0x52, 0xe6, 0xaf, 0x48, 0xc8, 0x9a, 0x81, 0xdb, 0xd2, 0xbc, 0xe0, 0x7d, 0x35, 0x2f, - 0xd8, 0xd2, 0xbc, 0xf0, 0xbf, 0x3d, 0xd8, 0x5b, 0xca, 0x3c, 0xc2, 0x24, 0x6b, 0x28, 0xf5, 0x0b, - 0x12, 0x7b, 0x7b, 0xa3, 0xee, 0xb6, 0x78, 0x7e, 0x05, 0x7b, 0x3e, 0x9a, 0x46, 0x23, 0xee, 0x10, - 0x0f, 0x1e, 0x6e, 0xf3, 0x60, 0x2b, 0x85, 0x68, 0xb2, 0xde, 0xca, 0x68, 0x5b, 0x07, 0xbb, 0x54, - 0xa9, 0x5f, 0xd0, 0xc1, 0x1d, 0x32, 0xb6, 0x3a, 0x78, 0xa3, 0xcd, 0xbd, 0xf7, 0xd0, 0xe6, 0x6d, - 0xa1, 0xdf, 0x9d, 0x77, 0xb7, 0x85, 0xfe, 0x39, 0xec, 0xaf, 0x8b, 0xb2, 0x58, 0xd7, 0xeb, 0x98, - 0xae, 0x60, 0xba, 0xb5, 0xfa, 0xc4, 0xa6, 0xa9, 0x37, 0x58, 0x46, 0xd3, 0xfd, 0xf5, 0x29, 0xb0, - 0xa2, 0x4c, 0x45, 0x9d, 0xe1, 0x26, 0x9d, 0x07, 0x6e, 0x5c, 0xbd, 0x65, 0x83, 0xd0, 0x07, 0xd0, - 0x4b, 0x65, 0x5d, 0x1a, 0x3e, 0xa4, 0xf8, 0xdd, 0xc2, 0xd2, 0xbc, 0x91, 0x23, 0x3a, 0x51, 0x61, - 0x8e, 0x57, 0x7c, 0x8f, 0x7a, 0x35, 0x6b, 0x2c, 0xd4, 0xa5, 0x1c, 0xaf, 0x6c, 0xf4, 0x56, 0x83, - 0xbc, 0x97, 0x53, 0xcb, 0xa1, 0x45, 0x9c, 0xf9, 0xe9, 0xed, 0x71, 0x9f, 0x51, 0xe4, 0xdb, 0xa3, - 0xbe, 0x80, 0x59, 0x13, 0xb6, 0xed, 0x35, 0x7d, 0x23, 0x00, 0x05, 0xbd, 0xe7, 0x71, 0xf7, 0x75, - 0xa1, 0xd9, 0x11, 0x1c, 0x34, 0x1e, 0x71, 0x85, 0x2d, 0xf3, 0xf9, 0x3e, 0xed, 0xba, 0x9f, 0x38, - 0xb7, 0xbf, 0xa2, 0xda, 0x50, 0xa4, 0x66, 0x6b, 0x92, 0xcd, 0x11, 0x6d, 0x3b, 0xf2, 0xd8, 0x37, - 0x56, 0x29, 0x1f, 0xc3, 0xa8, 0x3d, 0x5d, 0x08, 0x3e, 0x26, 0x0f, 0x68, 0x0e, 0x16, 0xc2, 0x8e, - 0x4d, 0x9a, 0xa4, 0x2b, 0x8c, 0x0b, 0x83, 0x2a, 0x31, 0x52, 0xf1, 0x09, 0xf9, 0x4c, 0x08, 0x3d, - 0xf5, 0xa0, 0xad, 0x44, 0x59, 0xaf, 0x63, 0xbd, 0x4a, 0x54, 0xa6, 0x39, 0xa3, 0x88, 0x86, 0x65, - 0xbd, 0x3e, 0x27, 0x20, 0xfc, 0x57, 0x40, 0xdf, 0x83, 0x8e, 0xdb, 0xee, 0xb2, 0x61, 0x1f, 0x43, - 0x57, 0xc8, 0x9c, 0x07, 0xc4, 0xcd, 0xbb, 0x1b, 0x2c, 0xb9, 0xf9, 0xc6, 0x88, 0xac, 0xc7, 0x06, - 0xa3, 0x3a, 0xef, 0xc1, 0xa8, 0x10, 0x26, 0x22, 0xd1, 0x26, 0x6e, 0xf9, 0xe9, 0xc8, 0x3b, 0xb2, - 0xe0, 0x89, 0xe3, 0x68, 0xf8, 0x9f, 0x80, 0x46, 0xed, 0x8d, 0xfd, 0xac, 0x89, 0x30, 0x95, 0xea, - 0xf6, 0x4c, 0x05, 0xb7, 0x86, 0xf3, 0xd6, 0x3c, 0x74, 0x5c, 0x7e, 0xff, 0x7f, 0x1e, 0xba, 0x64, - 0x6c, 0xe7, 0xa1, 0xe5, 0xd9, 0xce, 0x26, 0xcf, 0x1e, 0x01, 0x18, 0x69, 0x12, 0xe1, 0xee, 0xe1, - 0x9e, 0x9b, 0x2f, 0x42, 0xe8, 0x12, 0xe6, 0xd0, 0x57, 0x14, 0x97, 0xe6, 0xbb, 0x6e, 0x3b, 0xbf, - 0x0c, 0xff, 0xdd, 0xa1, 0x4a, 0xfa, 0xd0, 0x7f, 0x8b, 0x4c, 0xfc, 0x7c, 0xc4, 0x7b, 0xbf, 0x36, - 0xe2, 0xbd, 0xcd, 0x11, 0x9f, 0xd9, 0xcf, 0x11, 0x51, 0x1b, 0xbb, 0xf7, 0x4a, 0xd6, 0x4a, 0x53, - 0x0a, 0x93, 0xe3, 0xe0, 0xb3, 0x68, 0x7a, 0x63, 0xfa, 0xc6, 0x5a, 0xec, 0x25, 0xe3, 0x07, 0xa7, - 0xd1, 0x23, 0x97, 0xd4, 0x20, 0x9a, 0x7a, 0xdc, 0x8b, 0x0e, 0x7d, 0xa0, 0xd4, 0x36, 0xb1, 0x56, - 0xb8, 0xdc, 0xa8, 0x8f, 0x09, 0x6c, 0xa4, 0xe9, 0x29, 0x4c, 0x9a, 0x7d, 0x62, 0x59, 0x8a, 0x6b, - 0x3f, 0xe2, 0xe3, 0x06, 0x3c, 0x2b, 0xc5, 0x75, 0x78, 0x45, 0x2a, 0xed, 0xab, 0xe4, 0x09, 0x77, - 0x04, 0x3d, 0xda, 0xc8, 0x53, 0xee, 0xfe, 0x36, 0x8d, 0x36, 0xc8, 0x10, 0x39, 0x3f, 0xf6, 0x05, - 0xf4, 0x75, 0xbd, 0x5e, 0x27, 0xea, 0xda, 0x33, 0xef, 0x57, 0x5e, 0x69, 0x3c, 0xbf, 0xea, 0xfd, - 0xdd, 0x92, 0xf6, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x70, 0xd9, 0xa0, 0xf8, 0x48, 0x0d, 0x00, - 0x00, -} diff --git a/vendor/google.golang.org/appengine/internal/log/log_service.proto b/vendor/google.golang.org/appengine/internal/log/log_service.proto deleted file mode 100644 index 8981dc475..000000000 --- a/vendor/google.golang.org/appengine/internal/log/log_service.proto +++ /dev/null @@ -1,150 +0,0 @@ -syntax = "proto2"; -option go_package = "log"; - -package appengine; - -message LogServiceError { - enum ErrorCode { - OK = 0; - INVALID_REQUEST = 1; - STORAGE_ERROR = 2; - } -} - -message UserAppLogLine { - required int64 timestamp_usec = 1; - required int64 level = 2; - required string message = 3; -} - -message UserAppLogGroup { - repeated UserAppLogLine log_line = 2; -} - -message FlushRequest { - optional bytes logs = 1; -} - -message SetStatusRequest { - required string status = 1; -} - - -message LogOffset { - optional bytes request_id = 1; -} - -message LogLine { - required int64 time = 1; - required int32 level = 2; - required string log_message = 3; -} - -message RequestLog { - required string app_id = 1; - optional string module_id = 37 [default="default"]; - required string version_id = 2; - required bytes request_id = 3; - optional LogOffset offset = 35; - required string ip = 4; - optional string nickname = 5; - required int64 start_time = 6; - required int64 end_time = 7; - required int64 latency = 8; - required int64 mcycles = 9; - required string method = 10; - required string resource = 11; - required string http_version = 12; - required int32 status = 13; - required int64 response_size = 14; - optional string referrer = 15; - optional string user_agent = 16; - required string url_map_entry = 17; - required string combined = 18; - optional int64 api_mcycles = 19; - optional string host = 20; - optional double cost = 21; - - optional string task_queue_name = 22; - optional string task_name = 23; - - optional bool was_loading_request = 24; - optional int64 pending_time = 25; - optional int32 replica_index = 26 [default = -1]; - optional bool finished = 27 [default = true]; - optional bytes clone_key = 28; - - repeated LogLine line = 29; - - optional bool lines_incomplete = 36; - optional bytes app_engine_release = 38; - - optional int32 exit_reason = 30; - optional bool was_throttled_for_time = 31; - optional bool was_throttled_for_requests = 32; - optional int64 throttled_time = 33; - - optional bytes server_name = 34; -} - -message LogModuleVersion { - optional string module_id = 1 [default="default"]; - optional string version_id = 2; -} - -message LogReadRequest { - required string app_id = 1; - repeated string version_id = 2; - repeated LogModuleVersion module_version = 19; - - optional int64 start_time = 3; - optional int64 end_time = 4; - optional LogOffset offset = 5; - repeated bytes request_id = 6; - - optional int32 minimum_log_level = 7; - optional bool include_incomplete = 8; - optional int64 count = 9; - - optional string combined_log_regex = 14; - optional string host_regex = 15; - optional int32 replica_index = 16; - - optional bool include_app_logs = 10; - optional int32 app_logs_per_request = 17; - optional bool include_host = 11; - optional bool include_all = 12; - optional bool cache_iterator = 13; - optional int32 num_shards = 18; -} - -message LogReadResponse { - repeated RequestLog log = 1; - optional LogOffset offset = 2; - optional int64 last_end_time = 3; -} - -message LogUsageRecord { - optional string version_id = 1; - optional int32 start_time = 2; - optional int32 end_time = 3; - optional int64 count = 4; - optional int64 total_size = 5; - optional int32 records = 6; -} - -message LogUsageRequest { - required string app_id = 1; - repeated string version_id = 2; - optional int32 start_time = 3; - optional int32 end_time = 4; - optional uint32 resolution_hours = 5 [default = 1]; - optional bool combine_versions = 6; - optional int32 usage_version = 7; - optional bool versions_only = 8; -} - -message LogUsageResponse { - repeated LogUsageRecord usage = 1; - optional LogUsageRecord summary = 2; -} diff --git a/vendor/google.golang.org/appengine/internal/main.go b/vendor/google.golang.org/appengine/internal/main.go deleted file mode 100644 index afd0ae84f..000000000 --- a/vendor/google.golang.org/appengine/internal/main.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2011 Google Inc. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -//go:build appengine -// +build appengine - -package internal - -import ( - "appengine_internal" -) - -func Main() { - MainPath = "" - appengine_internal.Main() -} diff --git a/vendor/google.golang.org/appengine/internal/main_common.go b/vendor/google.golang.org/appengine/internal/main_common.go deleted file mode 100644 index 357dce4dd..000000000 --- a/vendor/google.golang.org/appengine/internal/main_common.go +++ /dev/null @@ -1,7 +0,0 @@ -package internal - -// MainPath stores the file path of the main package. On App Engine Standard -// using Go version 1.9 and below, this will be unset. On App Engine Flex and -// App Engine Standard second-gen (Go 1.11 and above), this will be the -// filepath to package main. -var MainPath string diff --git a/vendor/google.golang.org/appengine/internal/main_vm.go b/vendor/google.golang.org/appengine/internal/main_vm.go deleted file mode 100644 index 86a8caf06..000000000 --- a/vendor/google.golang.org/appengine/internal/main_vm.go +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2011 Google Inc. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -//go:build !appengine -// +build !appengine - -package internal - -import ( - "io" - "log" - "net/http" - "net/url" - "os" - "path/filepath" - "runtime" -) - -func Main() { - MainPath = filepath.Dir(findMainPath()) - installHealthChecker(http.DefaultServeMux) - - port := "8080" - if s := os.Getenv("PORT"); s != "" { - port = s - } - - host := "" - if IsDevAppServer() { - host = "127.0.0.1" - } - if err := http.ListenAndServe(host+":"+port, Middleware(http.DefaultServeMux)); err != nil { - log.Fatalf("http.ListenAndServe: %v", err) - } -} - -// Find the path to package main by looking at the root Caller. -func findMainPath() string { - pc := make([]uintptr, 100) - n := runtime.Callers(2, pc) - frames := runtime.CallersFrames(pc[:n]) - for { - frame, more := frames.Next() - // Tests won't have package main, instead they have testing.tRunner - if frame.Function == "main.main" || frame.Function == "testing.tRunner" { - return frame.File - } - if !more { - break - } - } - return "" -} - -func installHealthChecker(mux *http.ServeMux) { - // If no health check handler has been installed by this point, add a trivial one. - const healthPath = "/_ah/health" - hreq := &http.Request{ - Method: "GET", - URL: &url.URL{ - Path: healthPath, - }, - } - if _, pat := mux.Handler(hreq); pat != healthPath { - mux.HandleFunc(healthPath, func(w http.ResponseWriter, r *http.Request) { - io.WriteString(w, "ok") - }) - } -} diff --git a/vendor/google.golang.org/appengine/internal/metadata.go b/vendor/google.golang.org/appengine/internal/metadata.go deleted file mode 100644 index c4ba63bb4..000000000 --- a/vendor/google.golang.org/appengine/internal/metadata.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2014 Google Inc. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -package internal - -// This file has code for accessing metadata. -// -// References: -// https://cloud.google.com/compute/docs/metadata - -import ( - "fmt" - "io/ioutil" - "net/http" - "net/url" -) - -const ( - metadataHost = "metadata" - metadataPath = "/computeMetadata/v1/" -) - -var ( - metadataRequestHeaders = http.Header{ - "Metadata-Flavor": []string{"Google"}, - } -) - -// TODO(dsymonds): Do we need to support default values, like Python? -func mustGetMetadata(key string) []byte { - b, err := getMetadata(key) - if err != nil { - panic(fmt.Sprintf("Metadata fetch failed for '%s': %v", key, err)) - } - return b -} - -func getMetadata(key string) ([]byte, error) { - // TODO(dsymonds): May need to use url.Parse to support keys with query args. - req := &http.Request{ - Method: "GET", - URL: &url.URL{ - Scheme: "http", - Host: metadataHost, - Path: metadataPath + key, - }, - Header: metadataRequestHeaders, - Host: metadataHost, - } - resp, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - if resp.StatusCode != 200 { - return nil, fmt.Errorf("metadata server returned HTTP %d", resp.StatusCode) - } - return ioutil.ReadAll(resp.Body) -} diff --git a/vendor/google.golang.org/appengine/internal/net.go b/vendor/google.golang.org/appengine/internal/net.go deleted file mode 100644 index fe429720e..000000000 --- a/vendor/google.golang.org/appengine/internal/net.go +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2014 Google Inc. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -package internal - -// This file implements a network dialer that limits the number of concurrent connections. -// It is only used for API calls. - -import ( - "log" - "net" - "runtime" - "sync" - "time" -) - -var limitSem = make(chan int, 100) // TODO(dsymonds): Use environment variable. - -func limitRelease() { - // non-blocking - select { - case <-limitSem: - default: - // This should not normally happen. - log.Print("appengine: unbalanced limitSem release!") - } -} - -func limitDial(network, addr string) (net.Conn, error) { - limitSem <- 1 - - // Dial with a timeout in case the API host is MIA. - // The connection should normally be very fast. - conn, err := net.DialTimeout(network, addr, 10*time.Second) - if err != nil { - limitRelease() - return nil, err - } - lc := &limitConn{Conn: conn} - runtime.SetFinalizer(lc, (*limitConn).Close) // shouldn't usually be required - return lc, nil -} - -type limitConn struct { - close sync.Once - net.Conn -} - -func (lc *limitConn) Close() error { - defer lc.close.Do(func() { - limitRelease() - runtime.SetFinalizer(lc, nil) - }) - return lc.Conn.Close() -} diff --git a/vendor/google.golang.org/appengine/internal/regen.sh b/vendor/google.golang.org/appengine/internal/regen.sh deleted file mode 100644 index 2fdb546a6..000000000 --- a/vendor/google.golang.org/appengine/internal/regen.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/bash -e -# -# This script rebuilds the generated code for the protocol buffers. -# To run this you will need protoc and goprotobuf installed; -# see https://github.com/golang/protobuf for instructions. - -PKG=google.golang.org/appengine - -function die() { - echo 1>&2 $* - exit 1 -} - -# Sanity check that the right tools are accessible. -for tool in go protoc protoc-gen-go; do - q=$(which $tool) || die "didn't find $tool" - echo 1>&2 "$tool: $q" -done - -echo -n 1>&2 "finding package dir... " -pkgdir=$(go list -f '{{.Dir}}' $PKG) -echo 1>&2 $pkgdir -base=$(echo $pkgdir | sed "s,/$PKG\$,,") -echo 1>&2 "base: $base" -cd $base - -# Run protoc once per package. -for dir in $(find $PKG/internal -name '*.proto' | xargs dirname | sort | uniq); do - echo 1>&2 "* $dir" - protoc --go_out=. $dir/*.proto -done - -for f in $(find $PKG/internal -name '*.pb.go'); do - # Remove proto.RegisterEnum calls. - # These cause duplicate registration panics when these packages - # are used on classic App Engine. proto.RegisterEnum only affects - # parsing the text format; we don't care about that. - # https://code.google.com/p/googleappengine/issues/detail?id=11670#c17 - sed -i '/proto.RegisterEnum/d' $f -done diff --git a/vendor/google.golang.org/appengine/internal/remote_api/remote_api.pb.go b/vendor/google.golang.org/appengine/internal/remote_api/remote_api.pb.go deleted file mode 100644 index 8d782a38e..000000000 --- a/vendor/google.golang.org/appengine/internal/remote_api/remote_api.pb.go +++ /dev/null @@ -1,361 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google.golang.org/appengine/internal/remote_api/remote_api.proto - -package remote_api - -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package - -type RpcError_ErrorCode int32 - -const ( - RpcError_UNKNOWN RpcError_ErrorCode = 0 - RpcError_CALL_NOT_FOUND RpcError_ErrorCode = 1 - RpcError_PARSE_ERROR RpcError_ErrorCode = 2 - RpcError_SECURITY_VIOLATION RpcError_ErrorCode = 3 - RpcError_OVER_QUOTA RpcError_ErrorCode = 4 - RpcError_REQUEST_TOO_LARGE RpcError_ErrorCode = 5 - RpcError_CAPABILITY_DISABLED RpcError_ErrorCode = 6 - RpcError_FEATURE_DISABLED RpcError_ErrorCode = 7 - RpcError_BAD_REQUEST RpcError_ErrorCode = 8 - RpcError_RESPONSE_TOO_LARGE RpcError_ErrorCode = 9 - RpcError_CANCELLED RpcError_ErrorCode = 10 - RpcError_REPLAY_ERROR RpcError_ErrorCode = 11 - RpcError_DEADLINE_EXCEEDED RpcError_ErrorCode = 12 -) - -var RpcError_ErrorCode_name = map[int32]string{ - 0: "UNKNOWN", - 1: "CALL_NOT_FOUND", - 2: "PARSE_ERROR", - 3: "SECURITY_VIOLATION", - 4: "OVER_QUOTA", - 5: "REQUEST_TOO_LARGE", - 6: "CAPABILITY_DISABLED", - 7: "FEATURE_DISABLED", - 8: "BAD_REQUEST", - 9: "RESPONSE_TOO_LARGE", - 10: "CANCELLED", - 11: "REPLAY_ERROR", - 12: "DEADLINE_EXCEEDED", -} -var RpcError_ErrorCode_value = map[string]int32{ - "UNKNOWN": 0, - "CALL_NOT_FOUND": 1, - "PARSE_ERROR": 2, - "SECURITY_VIOLATION": 3, - "OVER_QUOTA": 4, - "REQUEST_TOO_LARGE": 5, - "CAPABILITY_DISABLED": 6, - "FEATURE_DISABLED": 7, - "BAD_REQUEST": 8, - "RESPONSE_TOO_LARGE": 9, - "CANCELLED": 10, - "REPLAY_ERROR": 11, - "DEADLINE_EXCEEDED": 12, -} - -func (x RpcError_ErrorCode) Enum() *RpcError_ErrorCode { - p := new(RpcError_ErrorCode) - *p = x - return p -} -func (x RpcError_ErrorCode) String() string { - return proto.EnumName(RpcError_ErrorCode_name, int32(x)) -} -func (x *RpcError_ErrorCode) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(RpcError_ErrorCode_value, data, "RpcError_ErrorCode") - if err != nil { - return err - } - *x = RpcError_ErrorCode(value) - return nil -} -func (RpcError_ErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_remote_api_1978114ec33a273d, []int{2, 0} -} - -type Request struct { - ServiceName *string `protobuf:"bytes,2,req,name=service_name,json=serviceName" json:"service_name,omitempty"` - Method *string `protobuf:"bytes,3,req,name=method" json:"method,omitempty"` - Request []byte `protobuf:"bytes,4,req,name=request" json:"request,omitempty"` - RequestId *string `protobuf:"bytes,5,opt,name=request_id,json=requestId" json:"request_id,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Request) Reset() { *m = Request{} } -func (m *Request) String() string { return proto.CompactTextString(m) } -func (*Request) ProtoMessage() {} -func (*Request) Descriptor() ([]byte, []int) { - return fileDescriptor_remote_api_1978114ec33a273d, []int{0} -} -func (m *Request) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Request.Unmarshal(m, b) -} -func (m *Request) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Request.Marshal(b, m, deterministic) -} -func (dst *Request) XXX_Merge(src proto.Message) { - xxx_messageInfo_Request.Merge(dst, src) -} -func (m *Request) XXX_Size() int { - return xxx_messageInfo_Request.Size(m) -} -func (m *Request) XXX_DiscardUnknown() { - xxx_messageInfo_Request.DiscardUnknown(m) -} - -var xxx_messageInfo_Request proto.InternalMessageInfo - -func (m *Request) GetServiceName() string { - if m != nil && m.ServiceName != nil { - return *m.ServiceName - } - return "" -} - -func (m *Request) GetMethod() string { - if m != nil && m.Method != nil { - return *m.Method - } - return "" -} - -func (m *Request) GetRequest() []byte { - if m != nil { - return m.Request - } - return nil -} - -func (m *Request) GetRequestId() string { - if m != nil && m.RequestId != nil { - return *m.RequestId - } - return "" -} - -type ApplicationError struct { - Code *int32 `protobuf:"varint,1,req,name=code" json:"code,omitempty"` - Detail *string `protobuf:"bytes,2,req,name=detail" json:"detail,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ApplicationError) Reset() { *m = ApplicationError{} } -func (m *ApplicationError) String() string { return proto.CompactTextString(m) } -func (*ApplicationError) ProtoMessage() {} -func (*ApplicationError) Descriptor() ([]byte, []int) { - return fileDescriptor_remote_api_1978114ec33a273d, []int{1} -} -func (m *ApplicationError) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ApplicationError.Unmarshal(m, b) -} -func (m *ApplicationError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ApplicationError.Marshal(b, m, deterministic) -} -func (dst *ApplicationError) XXX_Merge(src proto.Message) { - xxx_messageInfo_ApplicationError.Merge(dst, src) -} -func (m *ApplicationError) XXX_Size() int { - return xxx_messageInfo_ApplicationError.Size(m) -} -func (m *ApplicationError) XXX_DiscardUnknown() { - xxx_messageInfo_ApplicationError.DiscardUnknown(m) -} - -var xxx_messageInfo_ApplicationError proto.InternalMessageInfo - -func (m *ApplicationError) GetCode() int32 { - if m != nil && m.Code != nil { - return *m.Code - } - return 0 -} - -func (m *ApplicationError) GetDetail() string { - if m != nil && m.Detail != nil { - return *m.Detail - } - return "" -} - -type RpcError struct { - Code *int32 `protobuf:"varint,1,req,name=code" json:"code,omitempty"` - Detail *string `protobuf:"bytes,2,opt,name=detail" json:"detail,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *RpcError) Reset() { *m = RpcError{} } -func (m *RpcError) String() string { return proto.CompactTextString(m) } -func (*RpcError) ProtoMessage() {} -func (*RpcError) Descriptor() ([]byte, []int) { - return fileDescriptor_remote_api_1978114ec33a273d, []int{2} -} -func (m *RpcError) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_RpcError.Unmarshal(m, b) -} -func (m *RpcError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_RpcError.Marshal(b, m, deterministic) -} -func (dst *RpcError) XXX_Merge(src proto.Message) { - xxx_messageInfo_RpcError.Merge(dst, src) -} -func (m *RpcError) XXX_Size() int { - return xxx_messageInfo_RpcError.Size(m) -} -func (m *RpcError) XXX_DiscardUnknown() { - xxx_messageInfo_RpcError.DiscardUnknown(m) -} - -var xxx_messageInfo_RpcError proto.InternalMessageInfo - -func (m *RpcError) GetCode() int32 { - if m != nil && m.Code != nil { - return *m.Code - } - return 0 -} - -func (m *RpcError) GetDetail() string { - if m != nil && m.Detail != nil { - return *m.Detail - } - return "" -} - -type Response struct { - Response []byte `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"` - Exception []byte `protobuf:"bytes,2,opt,name=exception" json:"exception,omitempty"` - ApplicationError *ApplicationError `protobuf:"bytes,3,opt,name=application_error,json=applicationError" json:"application_error,omitempty"` - JavaException []byte `protobuf:"bytes,4,opt,name=java_exception,json=javaException" json:"java_exception,omitempty"` - RpcError *RpcError `protobuf:"bytes,5,opt,name=rpc_error,json=rpcError" json:"rpc_error,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Response) Reset() { *m = Response{} } -func (m *Response) String() string { return proto.CompactTextString(m) } -func (*Response) ProtoMessage() {} -func (*Response) Descriptor() ([]byte, []int) { - return fileDescriptor_remote_api_1978114ec33a273d, []int{3} -} -func (m *Response) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Response.Unmarshal(m, b) -} -func (m *Response) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Response.Marshal(b, m, deterministic) -} -func (dst *Response) XXX_Merge(src proto.Message) { - xxx_messageInfo_Response.Merge(dst, src) -} -func (m *Response) XXX_Size() int { - return xxx_messageInfo_Response.Size(m) -} -func (m *Response) XXX_DiscardUnknown() { - xxx_messageInfo_Response.DiscardUnknown(m) -} - -var xxx_messageInfo_Response proto.InternalMessageInfo - -func (m *Response) GetResponse() []byte { - if m != nil { - return m.Response - } - return nil -} - -func (m *Response) GetException() []byte { - if m != nil { - return m.Exception - } - return nil -} - -func (m *Response) GetApplicationError() *ApplicationError { - if m != nil { - return m.ApplicationError - } - return nil -} - -func (m *Response) GetJavaException() []byte { - if m != nil { - return m.JavaException - } - return nil -} - -func (m *Response) GetRpcError() *RpcError { - if m != nil { - return m.RpcError - } - return nil -} - -func init() { - proto.RegisterType((*Request)(nil), "remote_api.Request") - proto.RegisterType((*ApplicationError)(nil), "remote_api.ApplicationError") - proto.RegisterType((*RpcError)(nil), "remote_api.RpcError") - proto.RegisterType((*Response)(nil), "remote_api.Response") -} - -func init() { - proto.RegisterFile("google.golang.org/appengine/internal/remote_api/remote_api.proto", fileDescriptor_remote_api_1978114ec33a273d) -} - -var fileDescriptor_remote_api_1978114ec33a273d = []byte{ - // 531 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x93, 0x51, 0x6e, 0xd3, 0x40, - 0x10, 0x86, 0xb1, 0x9b, 0x34, 0xf1, 0xc4, 0x2d, 0xdb, 0xa5, 0x14, 0x0b, 0x15, 0x29, 0x44, 0x42, - 0xca, 0x53, 0x2a, 0x38, 0x00, 0x62, 0x63, 0x6f, 0x91, 0x85, 0x65, 0xa7, 0x6b, 0xbb, 0x50, 0x5e, - 0x56, 0x2b, 0x67, 0x65, 0x8c, 0x12, 0xaf, 0xd9, 0x98, 0x8a, 0x17, 0x6e, 0xc0, 0xb5, 0x38, 0x0c, - 0xb7, 0x40, 0x36, 0x6e, 0x63, 0xf5, 0x89, 0xb7, 0x7f, 0x7e, 0x7b, 0xe6, 0x1b, 0xcd, 0xcc, 0xc2, - 0xbb, 0x5c, 0xa9, 0x7c, 0x23, 0x17, 0xb9, 0xda, 0x88, 0x32, 0x5f, 0x28, 0x9d, 0x5f, 0x88, 0xaa, - 0x92, 0x65, 0x5e, 0x94, 0xf2, 0xa2, 0x28, 0x6b, 0xa9, 0x4b, 0xb1, 0xb9, 0xd0, 0x72, 0xab, 0x6a, - 0xc9, 0x45, 0x55, 0xf4, 0xe4, 0xa2, 0xd2, 0xaa, 0x56, 0x18, 0xf6, 0xce, 0xec, 0x27, 0x8c, 0x98, - 0xfc, 0xf6, 0x5d, 0xee, 0x6a, 0xfc, 0x12, 0xec, 0x9d, 0xd4, 0xb7, 0x45, 0x26, 0x79, 0x29, 0xb6, - 0xd2, 0x31, 0xa7, 0xe6, 0xdc, 0x62, 0x93, 0xce, 0x0b, 0xc5, 0x56, 0xe2, 0x33, 0x38, 0xdc, 0xca, - 0xfa, 0x8b, 0x5a, 0x3b, 0x07, 0xed, 0xc7, 0x2e, 0xc2, 0x0e, 0x8c, 0xf4, 0xbf, 0x2a, 0xce, 0x60, - 0x6a, 0xce, 0x6d, 0x76, 0x17, 0xe2, 0x17, 0x00, 0x9d, 0xe4, 0xc5, 0xda, 0x19, 0x4e, 0x8d, 0xb9, - 0xc5, 0xac, 0xce, 0xf1, 0xd7, 0xb3, 0xb7, 0x80, 0x48, 0x55, 0x6d, 0x8a, 0x4c, 0xd4, 0x85, 0x2a, - 0xa9, 0xd6, 0x4a, 0x63, 0x0c, 0x83, 0x4c, 0xad, 0xa5, 0x63, 0x4c, 0xcd, 0xf9, 0x90, 0xb5, 0xba, - 0x01, 0xaf, 0x65, 0x2d, 0x8a, 0x4d, 0xd7, 0x55, 0x17, 0xcd, 0x7e, 0x9b, 0x30, 0x66, 0x55, 0xf6, - 0x7f, 0x89, 0x46, 0x2f, 0xf1, 0x97, 0x09, 0x56, 0x9b, 0xe5, 0x36, 0x7f, 0x4d, 0x60, 0x94, 0x86, - 0x1f, 0xc2, 0xe8, 0x63, 0x88, 0x1e, 0x61, 0x0c, 0xc7, 0x2e, 0x09, 0x02, 0x1e, 0x46, 0x09, 0xbf, - 0x8c, 0xd2, 0xd0, 0x43, 0x06, 0x7e, 0x0c, 0x93, 0x15, 0x61, 0x31, 0xe5, 0x94, 0xb1, 0x88, 0x21, - 0x13, 0x9f, 0x01, 0x8e, 0xa9, 0x9b, 0x32, 0x3f, 0xb9, 0xe1, 0xd7, 0x7e, 0x14, 0x90, 0xc4, 0x8f, - 0x42, 0x74, 0x80, 0x8f, 0x01, 0xa2, 0x6b, 0xca, 0xf8, 0x55, 0x1a, 0x25, 0x04, 0x0d, 0xf0, 0x53, - 0x38, 0x61, 0xf4, 0x2a, 0xa5, 0x71, 0xc2, 0x93, 0x28, 0xe2, 0x01, 0x61, 0xef, 0x29, 0x1a, 0xe2, - 0x67, 0xf0, 0xc4, 0x25, 0x2b, 0xb2, 0xf4, 0x83, 0xa6, 0x80, 0xe7, 0xc7, 0x64, 0x19, 0x50, 0x0f, - 0x1d, 0xe2, 0x53, 0x40, 0x97, 0x94, 0x24, 0x29, 0xa3, 0x7b, 0x77, 0xd4, 0xe0, 0x97, 0xc4, 0xe3, - 0x5d, 0x25, 0x34, 0x6e, 0xf0, 0x8c, 0xc6, 0xab, 0x28, 0x8c, 0x69, 0xaf, 0xae, 0x85, 0x8f, 0xc0, - 0x72, 0x49, 0xe8, 0xd2, 0xa0, 0xc9, 0x03, 0x8c, 0xc0, 0x66, 0x74, 0x15, 0x90, 0x9b, 0xae, 0xef, - 0x49, 0xd3, 0x8f, 0x47, 0x89, 0x17, 0xf8, 0x21, 0xe5, 0xf4, 0x93, 0x4b, 0xa9, 0x47, 0x3d, 0x64, - 0xcf, 0xfe, 0x18, 0x30, 0x66, 0x72, 0x57, 0xa9, 0x72, 0x27, 0xf1, 0x73, 0x18, 0xeb, 0x4e, 0x3b, - 0xc6, 0xd4, 0x98, 0xdb, 0xec, 0x3e, 0xc6, 0xe7, 0x60, 0xc9, 0x1f, 0x99, 0xac, 0x9a, 0x75, 0xb5, - 0x23, 0xb5, 0xd9, 0xde, 0xc0, 0x3e, 0x9c, 0x88, 0xfd, 0x3a, 0xb9, 0x6c, 0x06, 0xec, 0x1c, 0x4c, - 0x8d, 0xf9, 0xe4, 0xcd, 0xf9, 0xa2, 0x77, 0x87, 0x0f, 0x77, 0xce, 0x90, 0x78, 0x78, 0x05, 0xaf, - 0xe0, 0xf8, 0xab, 0xb8, 0x15, 0x7c, 0x4f, 0x1b, 0xb4, 0xb4, 0xa3, 0xc6, 0xa5, 0xf7, 0xc4, 0xd7, - 0x60, 0xe9, 0x2a, 0xeb, 0x48, 0xc3, 0x96, 0x74, 0xda, 0x27, 0xdd, 0x1d, 0x07, 0x1b, 0xeb, 0x4e, - 0x2d, 0xed, 0xcf, 0xbd, 0x07, 0xf0, 0x37, 0x00, 0x00, 0xff, 0xff, 0x38, 0xd1, 0x0f, 0x22, 0x4f, - 0x03, 0x00, 0x00, -} diff --git a/vendor/google.golang.org/appengine/internal/remote_api/remote_api.proto b/vendor/google.golang.org/appengine/internal/remote_api/remote_api.proto deleted file mode 100644 index f21763a4e..000000000 --- a/vendor/google.golang.org/appengine/internal/remote_api/remote_api.proto +++ /dev/null @@ -1,44 +0,0 @@ -syntax = "proto2"; -option go_package = "remote_api"; - -package remote_api; - -message Request { - required string service_name = 2; - required string method = 3; - required bytes request = 4; - optional string request_id = 5; -} - -message ApplicationError { - required int32 code = 1; - required string detail = 2; -} - -message RpcError { - enum ErrorCode { - UNKNOWN = 0; - CALL_NOT_FOUND = 1; - PARSE_ERROR = 2; - SECURITY_VIOLATION = 3; - OVER_QUOTA = 4; - REQUEST_TOO_LARGE = 5; - CAPABILITY_DISABLED = 6; - FEATURE_DISABLED = 7; - BAD_REQUEST = 8; - RESPONSE_TOO_LARGE = 9; - CANCELLED = 10; - REPLAY_ERROR = 11; - DEADLINE_EXCEEDED = 12; - } - required int32 code = 1; - optional string detail = 2; -} - -message Response { - optional bytes response = 1; - optional bytes exception = 2; - optional ApplicationError application_error = 3; - optional bytes java_exception = 4; - optional RpcError rpc_error = 5; -} diff --git a/vendor/google.golang.org/appengine/internal/transaction.go b/vendor/google.golang.org/appengine/internal/transaction.go deleted file mode 100644 index 2ae8ab9fa..000000000 --- a/vendor/google.golang.org/appengine/internal/transaction.go +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright 2014 Google Inc. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -package internal - -// This file implements hooks for applying datastore transactions. - -import ( - "context" - "errors" - "reflect" - - "github.com/golang/protobuf/proto" - - basepb "google.golang.org/appengine/internal/base" - pb "google.golang.org/appengine/internal/datastore" -) - -var transactionSetters = make(map[reflect.Type]reflect.Value) - -// RegisterTransactionSetter registers a function that sets transaction information -// in a protocol buffer message. f should be a function with two arguments, -// the first being a protocol buffer type, and the second being *datastore.Transaction. -func RegisterTransactionSetter(f interface{}) { - v := reflect.ValueOf(f) - transactionSetters[v.Type().In(0)] = v -} - -// applyTransaction applies the transaction t to message pb -// by using the relevant setter passed to RegisterTransactionSetter. -func applyTransaction(pb proto.Message, t *pb.Transaction) { - v := reflect.ValueOf(pb) - if f, ok := transactionSetters[v.Type()]; ok { - f.Call([]reflect.Value{v, reflect.ValueOf(t)}) - } -} - -var transactionKey = "used for *Transaction" - -func transactionFromContext(ctx context.Context) *transaction { - t, _ := ctx.Value(&transactionKey).(*transaction) - return t -} - -func withTransaction(ctx context.Context, t *transaction) context.Context { - return context.WithValue(ctx, &transactionKey, t) -} - -type transaction struct { - transaction pb.Transaction - finished bool -} - -var ErrConcurrentTransaction = errors.New("internal: concurrent transaction") - -func RunTransactionOnce(c context.Context, f func(context.Context) error, xg bool, readOnly bool, previousTransaction *pb.Transaction) (*pb.Transaction, error) { - if transactionFromContext(c) != nil { - return nil, errors.New("nested transactions are not supported") - } - - // Begin the transaction. - t := &transaction{} - req := &pb.BeginTransactionRequest{ - App: proto.String(FullyQualifiedAppID(c)), - } - if xg { - req.AllowMultipleEg = proto.Bool(true) - } - if previousTransaction != nil { - req.PreviousTransaction = previousTransaction - } - if readOnly { - req.Mode = pb.BeginTransactionRequest_READ_ONLY.Enum() - } else { - req.Mode = pb.BeginTransactionRequest_READ_WRITE.Enum() - } - if err := Call(c, "datastore_v3", "BeginTransaction", req, &t.transaction); err != nil { - return nil, err - } - - // Call f, rolling back the transaction if f returns a non-nil error, or panics. - // The panic is not recovered. - defer func() { - if t.finished { - return - } - t.finished = true - // Ignore the error return value, since we are already returning a non-nil - // error (or we're panicking). - Call(c, "datastore_v3", "Rollback", &t.transaction, &basepb.VoidProto{}) - }() - if err := f(withTransaction(c, t)); err != nil { - return &t.transaction, err - } - t.finished = true - - // Commit the transaction. - res := &pb.CommitResponse{} - err := Call(c, "datastore_v3", "Commit", &t.transaction, res) - if ae, ok := err.(*APIError); ok { - /* TODO: restore this conditional - if appengine.IsDevAppServer() { - */ - // The Python Dev AppServer raises an ApplicationError with error code 2 (which is - // Error.CONCURRENT_TRANSACTION) and message "Concurrency exception.". - if ae.Code == int32(pb.Error_BAD_REQUEST) && ae.Detail == "ApplicationError: 2 Concurrency exception." { - return &t.transaction, ErrConcurrentTransaction - } - if ae.Code == int32(pb.Error_CONCURRENT_TRANSACTION) { - return &t.transaction, ErrConcurrentTransaction - } - } - return &t.transaction, err -} diff --git a/vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.pb.go b/vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.pb.go deleted file mode 100644 index 5f727750a..000000000 --- a/vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.pb.go +++ /dev/null @@ -1,527 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto - -package urlfetch - -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package - -type URLFetchServiceError_ErrorCode int32 - -const ( - URLFetchServiceError_OK URLFetchServiceError_ErrorCode = 0 - URLFetchServiceError_INVALID_URL URLFetchServiceError_ErrorCode = 1 - URLFetchServiceError_FETCH_ERROR URLFetchServiceError_ErrorCode = 2 - URLFetchServiceError_UNSPECIFIED_ERROR URLFetchServiceError_ErrorCode = 3 - URLFetchServiceError_RESPONSE_TOO_LARGE URLFetchServiceError_ErrorCode = 4 - URLFetchServiceError_DEADLINE_EXCEEDED URLFetchServiceError_ErrorCode = 5 - URLFetchServiceError_SSL_CERTIFICATE_ERROR URLFetchServiceError_ErrorCode = 6 - URLFetchServiceError_DNS_ERROR URLFetchServiceError_ErrorCode = 7 - URLFetchServiceError_CLOSED URLFetchServiceError_ErrorCode = 8 - URLFetchServiceError_INTERNAL_TRANSIENT_ERROR URLFetchServiceError_ErrorCode = 9 - URLFetchServiceError_TOO_MANY_REDIRECTS URLFetchServiceError_ErrorCode = 10 - URLFetchServiceError_MALFORMED_REPLY URLFetchServiceError_ErrorCode = 11 - URLFetchServiceError_CONNECTION_ERROR URLFetchServiceError_ErrorCode = 12 -) - -var URLFetchServiceError_ErrorCode_name = map[int32]string{ - 0: "OK", - 1: "INVALID_URL", - 2: "FETCH_ERROR", - 3: "UNSPECIFIED_ERROR", - 4: "RESPONSE_TOO_LARGE", - 5: "DEADLINE_EXCEEDED", - 6: "SSL_CERTIFICATE_ERROR", - 7: "DNS_ERROR", - 8: "CLOSED", - 9: "INTERNAL_TRANSIENT_ERROR", - 10: "TOO_MANY_REDIRECTS", - 11: "MALFORMED_REPLY", - 12: "CONNECTION_ERROR", -} -var URLFetchServiceError_ErrorCode_value = map[string]int32{ - "OK": 0, - "INVALID_URL": 1, - "FETCH_ERROR": 2, - "UNSPECIFIED_ERROR": 3, - "RESPONSE_TOO_LARGE": 4, - "DEADLINE_EXCEEDED": 5, - "SSL_CERTIFICATE_ERROR": 6, - "DNS_ERROR": 7, - "CLOSED": 8, - "INTERNAL_TRANSIENT_ERROR": 9, - "TOO_MANY_REDIRECTS": 10, - "MALFORMED_REPLY": 11, - "CONNECTION_ERROR": 12, -} - -func (x URLFetchServiceError_ErrorCode) Enum() *URLFetchServiceError_ErrorCode { - p := new(URLFetchServiceError_ErrorCode) - *p = x - return p -} -func (x URLFetchServiceError_ErrorCode) String() string { - return proto.EnumName(URLFetchServiceError_ErrorCode_name, int32(x)) -} -func (x *URLFetchServiceError_ErrorCode) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(URLFetchServiceError_ErrorCode_value, data, "URLFetchServiceError_ErrorCode") - if err != nil { - return err - } - *x = URLFetchServiceError_ErrorCode(value) - return nil -} -func (URLFetchServiceError_ErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_urlfetch_service_b245a7065f33bced, []int{0, 0} -} - -type URLFetchRequest_RequestMethod int32 - -const ( - URLFetchRequest_GET URLFetchRequest_RequestMethod = 1 - URLFetchRequest_POST URLFetchRequest_RequestMethod = 2 - URLFetchRequest_HEAD URLFetchRequest_RequestMethod = 3 - URLFetchRequest_PUT URLFetchRequest_RequestMethod = 4 - URLFetchRequest_DELETE URLFetchRequest_RequestMethod = 5 - URLFetchRequest_PATCH URLFetchRequest_RequestMethod = 6 -) - -var URLFetchRequest_RequestMethod_name = map[int32]string{ - 1: "GET", - 2: "POST", - 3: "HEAD", - 4: "PUT", - 5: "DELETE", - 6: "PATCH", -} -var URLFetchRequest_RequestMethod_value = map[string]int32{ - "GET": 1, - "POST": 2, - "HEAD": 3, - "PUT": 4, - "DELETE": 5, - "PATCH": 6, -} - -func (x URLFetchRequest_RequestMethod) Enum() *URLFetchRequest_RequestMethod { - p := new(URLFetchRequest_RequestMethod) - *p = x - return p -} -func (x URLFetchRequest_RequestMethod) String() string { - return proto.EnumName(URLFetchRequest_RequestMethod_name, int32(x)) -} -func (x *URLFetchRequest_RequestMethod) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(URLFetchRequest_RequestMethod_value, data, "URLFetchRequest_RequestMethod") - if err != nil { - return err - } - *x = URLFetchRequest_RequestMethod(value) - return nil -} -func (URLFetchRequest_RequestMethod) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_urlfetch_service_b245a7065f33bced, []int{1, 0} -} - -type URLFetchServiceError struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *URLFetchServiceError) Reset() { *m = URLFetchServiceError{} } -func (m *URLFetchServiceError) String() string { return proto.CompactTextString(m) } -func (*URLFetchServiceError) ProtoMessage() {} -func (*URLFetchServiceError) Descriptor() ([]byte, []int) { - return fileDescriptor_urlfetch_service_b245a7065f33bced, []int{0} -} -func (m *URLFetchServiceError) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_URLFetchServiceError.Unmarshal(m, b) -} -func (m *URLFetchServiceError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_URLFetchServiceError.Marshal(b, m, deterministic) -} -func (dst *URLFetchServiceError) XXX_Merge(src proto.Message) { - xxx_messageInfo_URLFetchServiceError.Merge(dst, src) -} -func (m *URLFetchServiceError) XXX_Size() int { - return xxx_messageInfo_URLFetchServiceError.Size(m) -} -func (m *URLFetchServiceError) XXX_DiscardUnknown() { - xxx_messageInfo_URLFetchServiceError.DiscardUnknown(m) -} - -var xxx_messageInfo_URLFetchServiceError proto.InternalMessageInfo - -type URLFetchRequest struct { - Method *URLFetchRequest_RequestMethod `protobuf:"varint,1,req,name=Method,enum=appengine.URLFetchRequest_RequestMethod" json:"Method,omitempty"` - Url *string `protobuf:"bytes,2,req,name=Url" json:"Url,omitempty"` - Header []*URLFetchRequest_Header `protobuf:"group,3,rep,name=Header,json=header" json:"header,omitempty"` - Payload []byte `protobuf:"bytes,6,opt,name=Payload" json:"Payload,omitempty"` - FollowRedirects *bool `protobuf:"varint,7,opt,name=FollowRedirects,def=1" json:"FollowRedirects,omitempty"` - Deadline *float64 `protobuf:"fixed64,8,opt,name=Deadline" json:"Deadline,omitempty"` - MustValidateServerCertificate *bool `protobuf:"varint,9,opt,name=MustValidateServerCertificate,def=1" json:"MustValidateServerCertificate,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *URLFetchRequest) Reset() { *m = URLFetchRequest{} } -func (m *URLFetchRequest) String() string { return proto.CompactTextString(m) } -func (*URLFetchRequest) ProtoMessage() {} -func (*URLFetchRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_urlfetch_service_b245a7065f33bced, []int{1} -} -func (m *URLFetchRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_URLFetchRequest.Unmarshal(m, b) -} -func (m *URLFetchRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_URLFetchRequest.Marshal(b, m, deterministic) -} -func (dst *URLFetchRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_URLFetchRequest.Merge(dst, src) -} -func (m *URLFetchRequest) XXX_Size() int { - return xxx_messageInfo_URLFetchRequest.Size(m) -} -func (m *URLFetchRequest) XXX_DiscardUnknown() { - xxx_messageInfo_URLFetchRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_URLFetchRequest proto.InternalMessageInfo - -const Default_URLFetchRequest_FollowRedirects bool = true -const Default_URLFetchRequest_MustValidateServerCertificate bool = true - -func (m *URLFetchRequest) GetMethod() URLFetchRequest_RequestMethod { - if m != nil && m.Method != nil { - return *m.Method - } - return URLFetchRequest_GET -} - -func (m *URLFetchRequest) GetUrl() string { - if m != nil && m.Url != nil { - return *m.Url - } - return "" -} - -func (m *URLFetchRequest) GetHeader() []*URLFetchRequest_Header { - if m != nil { - return m.Header - } - return nil -} - -func (m *URLFetchRequest) GetPayload() []byte { - if m != nil { - return m.Payload - } - return nil -} - -func (m *URLFetchRequest) GetFollowRedirects() bool { - if m != nil && m.FollowRedirects != nil { - return *m.FollowRedirects - } - return Default_URLFetchRequest_FollowRedirects -} - -func (m *URLFetchRequest) GetDeadline() float64 { - if m != nil && m.Deadline != nil { - return *m.Deadline - } - return 0 -} - -func (m *URLFetchRequest) GetMustValidateServerCertificate() bool { - if m != nil && m.MustValidateServerCertificate != nil { - return *m.MustValidateServerCertificate - } - return Default_URLFetchRequest_MustValidateServerCertificate -} - -type URLFetchRequest_Header struct { - Key *string `protobuf:"bytes,4,req,name=Key" json:"Key,omitempty"` - Value *string `protobuf:"bytes,5,req,name=Value" json:"Value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *URLFetchRequest_Header) Reset() { *m = URLFetchRequest_Header{} } -func (m *URLFetchRequest_Header) String() string { return proto.CompactTextString(m) } -func (*URLFetchRequest_Header) ProtoMessage() {} -func (*URLFetchRequest_Header) Descriptor() ([]byte, []int) { - return fileDescriptor_urlfetch_service_b245a7065f33bced, []int{1, 0} -} -func (m *URLFetchRequest_Header) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_URLFetchRequest_Header.Unmarshal(m, b) -} -func (m *URLFetchRequest_Header) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_URLFetchRequest_Header.Marshal(b, m, deterministic) -} -func (dst *URLFetchRequest_Header) XXX_Merge(src proto.Message) { - xxx_messageInfo_URLFetchRequest_Header.Merge(dst, src) -} -func (m *URLFetchRequest_Header) XXX_Size() int { - return xxx_messageInfo_URLFetchRequest_Header.Size(m) -} -func (m *URLFetchRequest_Header) XXX_DiscardUnknown() { - xxx_messageInfo_URLFetchRequest_Header.DiscardUnknown(m) -} - -var xxx_messageInfo_URLFetchRequest_Header proto.InternalMessageInfo - -func (m *URLFetchRequest_Header) GetKey() string { - if m != nil && m.Key != nil { - return *m.Key - } - return "" -} - -func (m *URLFetchRequest_Header) GetValue() string { - if m != nil && m.Value != nil { - return *m.Value - } - return "" -} - -type URLFetchResponse struct { - Content []byte `protobuf:"bytes,1,opt,name=Content" json:"Content,omitempty"` - StatusCode *int32 `protobuf:"varint,2,req,name=StatusCode" json:"StatusCode,omitempty"` - Header []*URLFetchResponse_Header `protobuf:"group,3,rep,name=Header,json=header" json:"header,omitempty"` - ContentWasTruncated *bool `protobuf:"varint,6,opt,name=ContentWasTruncated,def=0" json:"ContentWasTruncated,omitempty"` - ExternalBytesSent *int64 `protobuf:"varint,7,opt,name=ExternalBytesSent" json:"ExternalBytesSent,omitempty"` - ExternalBytesReceived *int64 `protobuf:"varint,8,opt,name=ExternalBytesReceived" json:"ExternalBytesReceived,omitempty"` - FinalUrl *string `protobuf:"bytes,9,opt,name=FinalUrl" json:"FinalUrl,omitempty"` - ApiCpuMilliseconds *int64 `protobuf:"varint,10,opt,name=ApiCpuMilliseconds,def=0" json:"ApiCpuMilliseconds,omitempty"` - ApiBytesSent *int64 `protobuf:"varint,11,opt,name=ApiBytesSent,def=0" json:"ApiBytesSent,omitempty"` - ApiBytesReceived *int64 `protobuf:"varint,12,opt,name=ApiBytesReceived,def=0" json:"ApiBytesReceived,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *URLFetchResponse) Reset() { *m = URLFetchResponse{} } -func (m *URLFetchResponse) String() string { return proto.CompactTextString(m) } -func (*URLFetchResponse) ProtoMessage() {} -func (*URLFetchResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_urlfetch_service_b245a7065f33bced, []int{2} -} -func (m *URLFetchResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_URLFetchResponse.Unmarshal(m, b) -} -func (m *URLFetchResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_URLFetchResponse.Marshal(b, m, deterministic) -} -func (dst *URLFetchResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_URLFetchResponse.Merge(dst, src) -} -func (m *URLFetchResponse) XXX_Size() int { - return xxx_messageInfo_URLFetchResponse.Size(m) -} -func (m *URLFetchResponse) XXX_DiscardUnknown() { - xxx_messageInfo_URLFetchResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_URLFetchResponse proto.InternalMessageInfo - -const Default_URLFetchResponse_ContentWasTruncated bool = false -const Default_URLFetchResponse_ApiCpuMilliseconds int64 = 0 -const Default_URLFetchResponse_ApiBytesSent int64 = 0 -const Default_URLFetchResponse_ApiBytesReceived int64 = 0 - -func (m *URLFetchResponse) GetContent() []byte { - if m != nil { - return m.Content - } - return nil -} - -func (m *URLFetchResponse) GetStatusCode() int32 { - if m != nil && m.StatusCode != nil { - return *m.StatusCode - } - return 0 -} - -func (m *URLFetchResponse) GetHeader() []*URLFetchResponse_Header { - if m != nil { - return m.Header - } - return nil -} - -func (m *URLFetchResponse) GetContentWasTruncated() bool { - if m != nil && m.ContentWasTruncated != nil { - return *m.ContentWasTruncated - } - return Default_URLFetchResponse_ContentWasTruncated -} - -func (m *URLFetchResponse) GetExternalBytesSent() int64 { - if m != nil && m.ExternalBytesSent != nil { - return *m.ExternalBytesSent - } - return 0 -} - -func (m *URLFetchResponse) GetExternalBytesReceived() int64 { - if m != nil && m.ExternalBytesReceived != nil { - return *m.ExternalBytesReceived - } - return 0 -} - -func (m *URLFetchResponse) GetFinalUrl() string { - if m != nil && m.FinalUrl != nil { - return *m.FinalUrl - } - return "" -} - -func (m *URLFetchResponse) GetApiCpuMilliseconds() int64 { - if m != nil && m.ApiCpuMilliseconds != nil { - return *m.ApiCpuMilliseconds - } - return Default_URLFetchResponse_ApiCpuMilliseconds -} - -func (m *URLFetchResponse) GetApiBytesSent() int64 { - if m != nil && m.ApiBytesSent != nil { - return *m.ApiBytesSent - } - return Default_URLFetchResponse_ApiBytesSent -} - -func (m *URLFetchResponse) GetApiBytesReceived() int64 { - if m != nil && m.ApiBytesReceived != nil { - return *m.ApiBytesReceived - } - return Default_URLFetchResponse_ApiBytesReceived -} - -type URLFetchResponse_Header struct { - Key *string `protobuf:"bytes,4,req,name=Key" json:"Key,omitempty"` - Value *string `protobuf:"bytes,5,req,name=Value" json:"Value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *URLFetchResponse_Header) Reset() { *m = URLFetchResponse_Header{} } -func (m *URLFetchResponse_Header) String() string { return proto.CompactTextString(m) } -func (*URLFetchResponse_Header) ProtoMessage() {} -func (*URLFetchResponse_Header) Descriptor() ([]byte, []int) { - return fileDescriptor_urlfetch_service_b245a7065f33bced, []int{2, 0} -} -func (m *URLFetchResponse_Header) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_URLFetchResponse_Header.Unmarshal(m, b) -} -func (m *URLFetchResponse_Header) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_URLFetchResponse_Header.Marshal(b, m, deterministic) -} -func (dst *URLFetchResponse_Header) XXX_Merge(src proto.Message) { - xxx_messageInfo_URLFetchResponse_Header.Merge(dst, src) -} -func (m *URLFetchResponse_Header) XXX_Size() int { - return xxx_messageInfo_URLFetchResponse_Header.Size(m) -} -func (m *URLFetchResponse_Header) XXX_DiscardUnknown() { - xxx_messageInfo_URLFetchResponse_Header.DiscardUnknown(m) -} - -var xxx_messageInfo_URLFetchResponse_Header proto.InternalMessageInfo - -func (m *URLFetchResponse_Header) GetKey() string { - if m != nil && m.Key != nil { - return *m.Key - } - return "" -} - -func (m *URLFetchResponse_Header) GetValue() string { - if m != nil && m.Value != nil { - return *m.Value - } - return "" -} - -func init() { - proto.RegisterType((*URLFetchServiceError)(nil), "appengine.URLFetchServiceError") - proto.RegisterType((*URLFetchRequest)(nil), "appengine.URLFetchRequest") - proto.RegisterType((*URLFetchRequest_Header)(nil), "appengine.URLFetchRequest.Header") - proto.RegisterType((*URLFetchResponse)(nil), "appengine.URLFetchResponse") - proto.RegisterType((*URLFetchResponse_Header)(nil), "appengine.URLFetchResponse.Header") -} - -func init() { - proto.RegisterFile("google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto", fileDescriptor_urlfetch_service_b245a7065f33bced) -} - -var fileDescriptor_urlfetch_service_b245a7065f33bced = []byte{ - // 770 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0xdd, 0x6e, 0xe3, 0x54, - 0x10, 0xc6, 0x76, 0x7e, 0xa7, 0x5d, 0x7a, 0x76, 0xb6, 0x45, 0x66, 0xb5, 0xa0, 0x10, 0x09, 0x29, - 0x17, 0x90, 0x2e, 0x2b, 0x24, 0x44, 0xaf, 0x70, 0xed, 0x93, 0xad, 0xa9, 0x63, 0x47, 0xc7, 0x4e, - 0x61, 0xb9, 0xb1, 0xac, 0x78, 0x9a, 0x5a, 0xb2, 0xec, 0x60, 0x9f, 0x2c, 0xf4, 0x35, 0x78, 0x0d, - 0xde, 0x87, 0xa7, 0xe1, 0x02, 0x9d, 0xc4, 0xc9, 0x6e, 0xbb, 0xd1, 0x4a, 0x5c, 0x65, 0xe6, 0x9b, - 0xef, 0xcc, 0x99, 0x7c, 0xdf, 0xf8, 0x80, 0xb3, 0x2c, 0xcb, 0x65, 0x4e, 0xe3, 0x65, 0x99, 0x27, - 0xc5, 0x72, 0x5c, 0x56, 0xcb, 0xf3, 0x64, 0xb5, 0xa2, 0x62, 0x99, 0x15, 0x74, 0x9e, 0x15, 0x92, - 0xaa, 0x22, 0xc9, 0xcf, 0xd7, 0x55, 0x7e, 0x4b, 0x72, 0x71, 0xb7, 0x0f, 0xe2, 0x9a, 0xaa, 0xb7, - 0xd9, 0x82, 0xc6, 0xab, 0xaa, 0x94, 0x25, 0xf6, 0xf7, 0x67, 0x86, 0x7f, 0xeb, 0x70, 0x3a, 0x17, - 0xde, 0x44, 0xb1, 0xc2, 0x2d, 0x89, 0x57, 0x55, 0x59, 0x0d, 0xff, 0xd2, 0xa1, 0xbf, 0x89, 0xec, - 0x32, 0x25, 0xec, 0x80, 0x1e, 0x5c, 0xb3, 0x4f, 0xf0, 0x04, 0x8e, 0x5c, 0xff, 0xc6, 0xf2, 0x5c, - 0x27, 0x9e, 0x0b, 0x8f, 0x69, 0x0a, 0x98, 0xf0, 0xc8, 0xbe, 0x8a, 0xb9, 0x10, 0x81, 0x60, 0x3a, - 0x9e, 0xc1, 0xd3, 0xb9, 0x1f, 0xce, 0xb8, 0xed, 0x4e, 0x5c, 0xee, 0x34, 0xb0, 0x81, 0x9f, 0x01, - 0x0a, 0x1e, 0xce, 0x02, 0x3f, 0xe4, 0x71, 0x14, 0x04, 0xb1, 0x67, 0x89, 0xd7, 0x9c, 0xb5, 0x14, - 0xdd, 0xe1, 0x96, 0xe3, 0xb9, 0x3e, 0x8f, 0xf9, 0xaf, 0x36, 0xe7, 0x0e, 0x77, 0x58, 0x1b, 0x3f, - 0x87, 0xb3, 0x30, 0xf4, 0x62, 0x9b, 0x8b, 0xc8, 0x9d, 0xb8, 0xb6, 0x15, 0xf1, 0xa6, 0x53, 0x07, - 0x9f, 0x40, 0xdf, 0xf1, 0xc3, 0x26, 0xed, 0x22, 0x40, 0xc7, 0xf6, 0x82, 0x90, 0x3b, 0xac, 0x87, - 0x2f, 0xc0, 0x74, 0xfd, 0x88, 0x0b, 0xdf, 0xf2, 0xe2, 0x48, 0x58, 0x7e, 0xe8, 0x72, 0x3f, 0x6a, - 0x98, 0x7d, 0x35, 0x82, 0xba, 0x79, 0x6a, 0xf9, 0x6f, 0x62, 0xc1, 0x1d, 0x57, 0x70, 0x3b, 0x0a, - 0x19, 0xe0, 0x33, 0x38, 0x99, 0x5a, 0xde, 0x24, 0x10, 0x53, 0xee, 0xc4, 0x82, 0xcf, 0xbc, 0x37, - 0xec, 0x08, 0x4f, 0x81, 0xd9, 0x81, 0xef, 0x73, 0x3b, 0x72, 0x03, 0xbf, 0x69, 0x71, 0x3c, 0xfc, - 0xc7, 0x80, 0x93, 0x9d, 0x5a, 0x82, 0x7e, 0x5f, 0x53, 0x2d, 0xf1, 0x27, 0xe8, 0x4c, 0x49, 0xde, - 0x95, 0xa9, 0xa9, 0x0d, 0xf4, 0xd1, 0xa7, 0xaf, 0x46, 0xe3, 0xbd, 0xba, 0xe3, 0x47, 0xdc, 0x71, - 0xf3, 0xbb, 0xe5, 0x8b, 0xe6, 0x1c, 0x32, 0x30, 0xe6, 0x55, 0x6e, 0xea, 0x03, 0x7d, 0xd4, 0x17, - 0x2a, 0xc4, 0x1f, 0xa1, 0x73, 0x47, 0x49, 0x4a, 0x95, 0x69, 0x0c, 0x8c, 0x11, 0xbc, 0xfa, 0xea, - 0x23, 0x3d, 0xaf, 0x36, 0x44, 0xd1, 0x1c, 0xc0, 0x17, 0xd0, 0x9d, 0x25, 0xf7, 0x79, 0x99, 0xa4, - 0x66, 0x67, 0xa0, 0x8d, 0x8e, 0x2f, 0xf5, 0x9e, 0x26, 0x76, 0x10, 0x8e, 0xe1, 0x64, 0x52, 0xe6, - 0x79, 0xf9, 0x87, 0xa0, 0x34, 0xab, 0x68, 0x21, 0x6b, 0xb3, 0x3b, 0xd0, 0x46, 0xbd, 0x8b, 0x96, - 0xac, 0xd6, 0x24, 0x1e, 0x17, 0xf1, 0x39, 0xf4, 0x1c, 0x4a, 0xd2, 0x3c, 0x2b, 0xc8, 0xec, 0x0d, - 0xb4, 0x91, 0x26, 0xf6, 0x39, 0xfe, 0x0c, 0x5f, 0x4c, 0xd7, 0xb5, 0xbc, 0x49, 0xf2, 0x2c, 0x4d, - 0x24, 0xa9, 0xed, 0xa1, 0xca, 0xa6, 0x4a, 0x66, 0xb7, 0xd9, 0x22, 0x91, 0x64, 0xf6, 0xdf, 0xeb, - 0xfc, 0x71, 0xea, 0xf3, 0x97, 0xd0, 0xd9, 0xfe, 0x0f, 0x25, 0xc6, 0x35, 0xdd, 0x9b, 0xad, 0xad, - 0x18, 0xd7, 0x74, 0x8f, 0xa7, 0xd0, 0xbe, 0x49, 0xf2, 0x35, 0x99, 0xed, 0x0d, 0xb6, 0x4d, 0x86, - 0x1e, 0x3c, 0x79, 0xa0, 0x26, 0x76, 0xc1, 0x78, 0xcd, 0x23, 0xa6, 0x61, 0x0f, 0x5a, 0xb3, 0x20, - 0x8c, 0x98, 0xae, 0xa2, 0x2b, 0x6e, 0x39, 0xcc, 0x50, 0xc5, 0xd9, 0x3c, 0x62, 0x2d, 0xb5, 0x2e, - 0x0e, 0xf7, 0x78, 0xc4, 0x59, 0x1b, 0xfb, 0xd0, 0x9e, 0x59, 0x91, 0x7d, 0xc5, 0x3a, 0xc3, 0x7f, - 0x0d, 0x60, 0xef, 0x84, 0xad, 0x57, 0x65, 0x51, 0x13, 0x9a, 0xd0, 0xb5, 0xcb, 0x42, 0x52, 0x21, - 0x4d, 0x4d, 0x49, 0x29, 0x76, 0x29, 0x7e, 0x09, 0x10, 0xca, 0x44, 0xae, 0x6b, 0xf5, 0x71, 0x6c, - 0x8c, 0x6b, 0x8b, 0xf7, 0x10, 0xbc, 0x78, 0xe4, 0xdf, 0xf0, 0xa0, 0x7f, 0xdb, 0x6b, 0x1e, 0x1b, - 0xf8, 0x03, 0x3c, 0x6b, 0xae, 0xf9, 0x25, 0xa9, 0xa3, 0x6a, 0x5d, 0x28, 0x81, 0xb6, 0x66, 0xf6, - 0x2e, 0xda, 0xb7, 0x49, 0x5e, 0x93, 0x38, 0xc4, 0xc0, 0x6f, 0xe0, 0x29, 0xff, 0x73, 0xfb, 0x02, - 0x5c, 0xde, 0x4b, 0xaa, 0x43, 0x35, 0xb8, 0x72, 0xd7, 0x10, 0x1f, 0x16, 0xf0, 0x7b, 0x38, 0x7b, - 0x00, 0x0a, 0x5a, 0x50, 0xf6, 0x96, 0xd2, 0x8d, 0xcd, 0x86, 0x38, 0x5c, 0x54, 0xfb, 0x30, 0xc9, - 0x8a, 0x24, 0x57, 0xfb, 0xaa, 0xec, 0xed, 0x8b, 0x7d, 0x8e, 0xdf, 0x01, 0x5a, 0xab, 0xcc, 0x5e, - 0xad, 0xa7, 0x59, 0x9e, 0x67, 0x35, 0x2d, 0xca, 0x22, 0xad, 0x4d, 0x50, 0xed, 0x2e, 0xb4, 0x97, - 0xe2, 0x40, 0x11, 0xbf, 0x86, 0x63, 0x6b, 0x95, 0xbd, 0x9b, 0xf6, 0x68, 0x47, 0x7e, 0x00, 0xe3, - 0xb7, 0xc0, 0x76, 0xf9, 0x7e, 0xcc, 0xe3, 0x1d, 0xf5, 0x83, 0xd2, 0xff, 0x5f, 0xa6, 0x4b, 0xf8, - 0xad, 0xb7, 0x7b, 0x2a, 0xff, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x1d, 0x9f, 0x6d, 0x24, 0x63, 0x05, - 0x00, 0x00, -} diff --git a/vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto b/vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto deleted file mode 100644 index f695edf6a..000000000 --- a/vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto +++ /dev/null @@ -1,64 +0,0 @@ -syntax = "proto2"; -option go_package = "urlfetch"; - -package appengine; - -message URLFetchServiceError { - enum ErrorCode { - OK = 0; - INVALID_URL = 1; - FETCH_ERROR = 2; - UNSPECIFIED_ERROR = 3; - RESPONSE_TOO_LARGE = 4; - DEADLINE_EXCEEDED = 5; - SSL_CERTIFICATE_ERROR = 6; - DNS_ERROR = 7; - CLOSED = 8; - INTERNAL_TRANSIENT_ERROR = 9; - TOO_MANY_REDIRECTS = 10; - MALFORMED_REPLY = 11; - CONNECTION_ERROR = 12; - } -} - -message URLFetchRequest { - enum RequestMethod { - GET = 1; - POST = 2; - HEAD = 3; - PUT = 4; - DELETE = 5; - PATCH = 6; - } - required RequestMethod Method = 1; - required string Url = 2; - repeated group Header = 3 { - required string Key = 4; - required string Value = 5; - } - optional bytes Payload = 6 [ctype=CORD]; - - optional bool FollowRedirects = 7 [default=true]; - - optional double Deadline = 8; - - optional bool MustValidateServerCertificate = 9 [default=true]; -} - -message URLFetchResponse { - optional bytes Content = 1; - required int32 StatusCode = 2; - repeated group Header = 3 { - required string Key = 4; - required string Value = 5; - } - optional bool ContentWasTruncated = 6 [default=false]; - optional int64 ExternalBytesSent = 7; - optional int64 ExternalBytesReceived = 8; - - optional string FinalUrl = 9; - - optional int64 ApiCpuMilliseconds = 10 [default=0]; - optional int64 ApiBytesSent = 11 [default=0]; - optional int64 ApiBytesReceived = 12 [default=0]; -} diff --git a/vendor/google.golang.org/appengine/urlfetch/urlfetch.go b/vendor/google.golang.org/appengine/urlfetch/urlfetch.go deleted file mode 100644 index 6c0d72418..000000000 --- a/vendor/google.golang.org/appengine/urlfetch/urlfetch.go +++ /dev/null @@ -1,209 +0,0 @@ -// Copyright 2011 Google Inc. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -// Package urlfetch provides an http.RoundTripper implementation -// for fetching URLs via App Engine's urlfetch service. -package urlfetch // import "google.golang.org/appengine/urlfetch" - -import ( - "context" - "errors" - "fmt" - "io" - "io/ioutil" - "net/http" - "net/url" - "strconv" - "strings" - "time" - - "github.com/golang/protobuf/proto" - - "google.golang.org/appengine/internal" - pb "google.golang.org/appengine/internal/urlfetch" -) - -// Transport is an implementation of http.RoundTripper for -// App Engine. Users should generally create an http.Client using -// this transport and use the Client rather than using this transport -// directly. -type Transport struct { - Context context.Context - - // Controls whether the application checks the validity of SSL certificates - // over HTTPS connections. A value of false (the default) instructs the - // application to send a request to the server only if the certificate is - // valid and signed by a trusted certificate authority (CA), and also - // includes a hostname that matches the certificate. A value of true - // instructs the application to perform no certificate validation. - AllowInvalidServerCertificate bool -} - -// Verify statically that *Transport implements http.RoundTripper. -var _ http.RoundTripper = (*Transport)(nil) - -// Client returns an *http.Client using a default urlfetch Transport. This -// client will check the validity of SSL certificates. -// -// Any deadline of the provided context will be used for requests through this client. -// If the client does not have a deadline, then an App Engine default of 60 second is used. -func Client(ctx context.Context) *http.Client { - return &http.Client{ - Transport: &Transport{ - Context: ctx, - }, - } -} - -type bodyReader struct { - content []byte - truncated bool - closed bool -} - -// ErrTruncatedBody is the error returned after the final Read() from a -// response's Body if the body has been truncated by App Engine's proxy. -var ErrTruncatedBody = errors.New("urlfetch: truncated body") - -func statusCodeToText(code int) string { - if t := http.StatusText(code); t != "" { - return t - } - return strconv.Itoa(code) -} - -func (br *bodyReader) Read(p []byte) (n int, err error) { - if br.closed { - if br.truncated { - return 0, ErrTruncatedBody - } - return 0, io.EOF - } - n = copy(p, br.content) - if n > 0 { - br.content = br.content[n:] - return - } - if br.truncated { - br.closed = true - return 0, ErrTruncatedBody - } - return 0, io.EOF -} - -func (br *bodyReader) Close() error { - br.closed = true - br.content = nil - return nil -} - -// A map of the URL Fetch-accepted methods that take a request body. -var methodAcceptsRequestBody = map[string]bool{ - "POST": true, - "PUT": true, - "PATCH": true, -} - -// urlString returns a valid string given a URL. This function is necessary because -// the String method of URL doesn't correctly handle URLs with non-empty Opaque values. -// See http://code.google.com/p/go/issues/detail?id=4860. -func urlString(u *url.URL) string { - if u.Opaque == "" || strings.HasPrefix(u.Opaque, "//") { - return u.String() - } - aux := *u - aux.Opaque = "//" + aux.Host + aux.Opaque - return aux.String() -} - -// RoundTrip issues a single HTTP request and returns its response. Per the -// http.RoundTripper interface, RoundTrip only returns an error if there -// was an unsupported request or the URL Fetch proxy fails. -// Note that HTTP response codes such as 5xx, 403, 404, etc are not -// errors as far as the transport is concerned and will be returned -// with err set to nil. -func (t *Transport) RoundTrip(req *http.Request) (res *http.Response, err error) { - methNum, ok := pb.URLFetchRequest_RequestMethod_value[req.Method] - if !ok { - return nil, fmt.Errorf("urlfetch: unsupported HTTP method %q", req.Method) - } - - method := pb.URLFetchRequest_RequestMethod(methNum) - - freq := &pb.URLFetchRequest{ - Method: &method, - Url: proto.String(urlString(req.URL)), - FollowRedirects: proto.Bool(false), // http.Client's responsibility - MustValidateServerCertificate: proto.Bool(!t.AllowInvalidServerCertificate), - } - if deadline, ok := t.Context.Deadline(); ok { - freq.Deadline = proto.Float64(deadline.Sub(time.Now()).Seconds()) - } - - for k, vals := range req.Header { - for _, val := range vals { - freq.Header = append(freq.Header, &pb.URLFetchRequest_Header{ - Key: proto.String(k), - Value: proto.String(val), - }) - } - } - if methodAcceptsRequestBody[req.Method] && req.Body != nil { - // Avoid a []byte copy if req.Body has a Bytes method. - switch b := req.Body.(type) { - case interface { - Bytes() []byte - }: - freq.Payload = b.Bytes() - default: - freq.Payload, err = ioutil.ReadAll(req.Body) - if err != nil { - return nil, err - } - } - } - - fres := &pb.URLFetchResponse{} - if err := internal.Call(t.Context, "urlfetch", "Fetch", freq, fres); err != nil { - return nil, err - } - - res = &http.Response{} - res.StatusCode = int(*fres.StatusCode) - res.Status = fmt.Sprintf("%d %s", res.StatusCode, statusCodeToText(res.StatusCode)) - res.Header = make(http.Header) - res.Request = req - - // Faked: - res.ProtoMajor = 1 - res.ProtoMinor = 1 - res.Proto = "HTTP/1.1" - res.Close = true - - for _, h := range fres.Header { - hkey := http.CanonicalHeaderKey(*h.Key) - hval := *h.Value - if hkey == "Content-Length" { - // Will get filled in below for all but HEAD requests. - if req.Method == "HEAD" { - res.ContentLength, _ = strconv.ParseInt(hval, 10, 64) - } - continue - } - res.Header.Add(hkey, hval) - } - - if req.Method != "HEAD" { - res.ContentLength = int64(len(fres.Content)) - } - - truncated := fres.GetContentWasTruncated() - res.Body = &bodyReader{content: fres.Content, truncated: truncated} - return -} - -func init() { - internal.RegisterErrorCodeMap("urlfetch", pb.URLFetchServiceError_ErrorCode_name) - internal.RegisterTimeoutErrorCode("urlfetch", int32(pb.URLFetchServiceError_DEADLINE_EXCEEDED)) -} diff --git a/vendor/google.golang.org/genproto/googleapis/api/httpbody/httpbody.pb.go b/vendor/google.golang.org/genproto/googleapis/api/httpbody/httpbody.pb.go index 3543268f8..e7d3805e3 100644 --- a/vendor/google.golang.org/genproto/googleapis/api/httpbody/httpbody.pb.go +++ b/vendor/google.golang.org/genproto/googleapis/api/httpbody/httpbody.pb.go @@ -1,4 +1,4 @@ -// Copyright 2023 Google LLC +// Copyright 2024 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -15,7 +15,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.26.0 -// protoc v3.21.9 +// protoc v4.24.4 // source: google/api/httpbody.proto package httpbody diff --git a/vendor/google.golang.org/genproto/googleapis/rpc/errdetails/error_details.pb.go b/vendor/google.golang.org/genproto/googleapis/rpc/errdetails/error_details.pb.go index 7bd161e48..3e5621827 100644 --- a/vendor/google.golang.org/genproto/googleapis/rpc/errdetails/error_details.pb.go +++ b/vendor/google.golang.org/genproto/googleapis/rpc/errdetails/error_details.pb.go @@ -1,4 +1,4 @@ -// Copyright 2022 Google LLC +// Copyright 2024 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -15,7 +15,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.26.0 -// protoc v3.21.9 +// protoc v4.24.4 // source: google/rpc/error_details.proto package errdetails diff --git a/vendor/google.golang.org/genproto/googleapis/rpc/status/status.pb.go b/vendor/google.golang.org/genproto/googleapis/rpc/status/status.pb.go index a6b508188..6ad1b1c1d 100644 --- a/vendor/google.golang.org/genproto/googleapis/rpc/status/status.pb.go +++ b/vendor/google.golang.org/genproto/googleapis/rpc/status/status.pb.go @@ -1,4 +1,4 @@ -// Copyright 2022 Google LLC +// Copyright 2024 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -15,7 +15,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.26.0 -// protoc v3.21.9 +// protoc v4.24.4 // source: google/rpc/status.proto package status diff --git a/vendor/google.golang.org/grpc/CONTRIBUTING.md b/vendor/google.golang.org/grpc/CONTRIBUTING.md index 608aa6e1a..0854d298e 100644 --- a/vendor/google.golang.org/grpc/CONTRIBUTING.md +++ b/vendor/google.golang.org/grpc/CONTRIBUTING.md @@ -66,7 +66,7 @@ How to get your contributions merged smoothly and quickly. - **All tests need to be passing** before your change can be merged. We recommend you **run tests locally** before creating your PR to catch breakages early on. - - `VET_SKIP_PROTO=1 ./vet.sh` to catch vet errors + - `./scripts/vet.sh` to catch vet errors - `go test -cpu 1,4 -timeout 7m ./...` to run the tests - `go test -race -cpu 1,4 -timeout 7m ./...` to run tests in race mode diff --git a/vendor/google.golang.org/grpc/MAINTAINERS.md b/vendor/google.golang.org/grpc/MAINTAINERS.md index c6672c0a3..6a8a07781 100644 --- a/vendor/google.golang.org/grpc/MAINTAINERS.md +++ b/vendor/google.golang.org/grpc/MAINTAINERS.md @@ -9,6 +9,7 @@ for general contribution guidelines. ## Maintainers (in alphabetical order) +- [atollena](https://github.com/atollena), Datadog, Inc. - [cesarghali](https://github.com/cesarghali), Google LLC - [dfawley](https://github.com/dfawley), Google LLC - [easwars](https://github.com/easwars), Google LLC diff --git a/vendor/google.golang.org/grpc/Makefile b/vendor/google.golang.org/grpc/Makefile index 1f8960922..be38384ff 100644 --- a/vendor/google.golang.org/grpc/Makefile +++ b/vendor/google.golang.org/grpc/Makefile @@ -30,17 +30,20 @@ testdeps: GO111MODULE=on go get -d -v -t google.golang.org/grpc/... vet: vetdeps - ./vet.sh + ./scripts/vet.sh vetdeps: - ./vet.sh -install + ./scripts/vet.sh -install .PHONY: \ all \ build \ clean \ + deps \ proto \ test \ + testsubmodule \ testrace \ + testdeps \ vet \ vetdeps diff --git a/vendor/google.golang.org/grpc/README.md b/vendor/google.golang.org/grpc/README.md index ab0fbb79b..b572707c6 100644 --- a/vendor/google.golang.org/grpc/README.md +++ b/vendor/google.golang.org/grpc/README.md @@ -10,7 +10,7 @@ RPC framework that puts mobile and HTTP/2 first. For more information see the ## Prerequisites -- **[Go][]**: any one of the **three latest major** [releases][go-releases]. +- **[Go][]**: any one of the **two latest major** [releases][go-releases]. ## Installation diff --git a/vendor/google.golang.org/grpc/pickfirst.go b/vendor/google.golang.org/grpc/balancer/pickfirst/pickfirst.go similarity index 74% rename from vendor/google.golang.org/grpc/pickfirst.go rename to vendor/google.golang.org/grpc/balancer/pickfirst/pickfirst.go index e3ea42ba9..07527603f 100644 --- a/vendor/google.golang.org/grpc/pickfirst.go +++ b/vendor/google.golang.org/grpc/balancer/pickfirst/pickfirst.go @@ -16,26 +16,36 @@ * */ -package grpc +// Package pickfirst contains the pick_first load balancing policy. +package pickfirst import ( "encoding/json" "errors" "fmt" + "math/rand" "google.golang.org/grpc/balancer" "google.golang.org/grpc/connectivity" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/internal" internalgrpclog "google.golang.org/grpc/internal/grpclog" - "google.golang.org/grpc/internal/grpcrand" "google.golang.org/grpc/internal/pretty" "google.golang.org/grpc/resolver" "google.golang.org/grpc/serviceconfig" ) +func init() { + balancer.Register(pickfirstBuilder{}) + internal.ShuffleAddressListForTesting = func(n int, swap func(i, j int)) { rand.Shuffle(n, swap) } +} + +var logger = grpclog.Component("pick-first-lb") + const ( - // PickFirstBalancerName is the name of the pick_first balancer. - PickFirstBalancerName = "pick_first" - logPrefix = "[pick-first-lb %p] " + // Name is the name of the pick_first balancer. + Name = "pick_first" + logPrefix = "[pick-first-lb %p] " ) type pickfirstBuilder struct{} @@ -47,14 +57,14 @@ func (pickfirstBuilder) Build(cc balancer.ClientConn, opt balancer.BuildOptions) } func (pickfirstBuilder) Name() string { - return PickFirstBalancerName + return Name } type pfConfig struct { serviceconfig.LoadBalancingConfig `json:"-"` // If set to true, instructs the LB policy to shuffle the order of the list - // of addresses received from the name resolver before attempting to + // of endpoints received from the name resolver before attempting to // connect to them. ShuffleAddressList bool `json:"shuffleAddressList"` } @@ -93,9 +103,14 @@ func (b *pickfirstBalancer) ResolverError(err error) { }) } +type Shuffler interface { + ShuffleAddressListForTesting(n int, swap func(i, j int)) +} + +func ShuffleAddressListForTesting(n int, swap func(i, j int)) { rand.Shuffle(n, swap) } + func (b *pickfirstBalancer) UpdateClientConnState(state balancer.ClientConnState) error { - addrs := state.ResolverState.Addresses - if len(addrs) == 0 { + if len(state.ResolverState.Addresses) == 0 && len(state.ResolverState.Endpoints) == 0 { // The resolver reported an empty address list. Treat it like an error by // calling b.ResolverError. if b.subConn != nil { @@ -107,22 +122,49 @@ func (b *pickfirstBalancer) UpdateClientConnState(state balancer.ClientConnState b.ResolverError(errors.New("produced zero addresses")) return balancer.ErrBadResolverState } - // We don't have to guard this block with the env var because ParseConfig // already does so. cfg, ok := state.BalancerConfig.(pfConfig) if state.BalancerConfig != nil && !ok { return fmt.Errorf("pickfirst: received illegal BalancerConfig (type %T): %v", state.BalancerConfig, state.BalancerConfig) } - if cfg.ShuffleAddressList { - addrs = append([]resolver.Address{}, addrs...) - grpcrand.Shuffle(len(addrs), func(i, j int) { addrs[i], addrs[j] = addrs[j], addrs[i] }) - } if b.logger.V(2) { b.logger.Infof("Received new config %s, resolver state %s", pretty.ToJSON(cfg), pretty.ToJSON(state.ResolverState)) } + var addrs []resolver.Address + if endpoints := state.ResolverState.Endpoints; len(endpoints) != 0 { + // Perform the optional shuffling described in gRFC A62. The shuffling will + // change the order of endpoints but not touch the order of the addresses + // within each endpoint. - A61 + if cfg.ShuffleAddressList { + endpoints = append([]resolver.Endpoint{}, endpoints...) + internal.ShuffleAddressListForTesting.(func(int, func(int, int)))(len(endpoints), func(i, j int) { endpoints[i], endpoints[j] = endpoints[j], endpoints[i] }) + } + + // "Flatten the list by concatenating the ordered list of addresses for each + // of the endpoints, in order." - A61 + for _, endpoint := range endpoints { + // "In the flattened list, interleave addresses from the two address + // families, as per RFC-8304 section 4." - A61 + // TODO: support the above language. + addrs = append(addrs, endpoint.Addresses...) + } + } else { + // Endpoints not set, process addresses until we migrate resolver + // emissions fully to Endpoints. The top channel does wrap emitted + // addresses with endpoints, however some balancers such as weighted + // target do not forwarrd the corresponding correct endpoints down/split + // endpoints properly. Once all balancers correctly forward endpoints + // down, can delete this else conditional. + addrs = state.ResolverState.Addresses + if cfg.ShuffleAddressList { + addrs = append([]resolver.Address{}, addrs...) + rand.Shuffle(len(addrs), func(i, j int) { addrs[i], addrs[j] = addrs[j], addrs[i] }) + } + } + if b.subConn != nil { b.cc.UpdateAddresses(b.subConn, addrs) return nil diff --git a/vendor/google.golang.org/grpc/balancer/roundrobin/roundrobin.go b/vendor/google.golang.org/grpc/balancer/roundrobin/roundrobin.go index f7031ad22..260255d31 100644 --- a/vendor/google.golang.org/grpc/balancer/roundrobin/roundrobin.go +++ b/vendor/google.golang.org/grpc/balancer/roundrobin/roundrobin.go @@ -22,12 +22,12 @@ package roundrobin import ( + "math/rand" "sync/atomic" "google.golang.org/grpc/balancer" "google.golang.org/grpc/balancer/base" "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/internal/grpcrand" ) // Name is the name of round_robin balancer. @@ -60,7 +60,7 @@ func (*rrPickerBuilder) Build(info base.PickerBuildInfo) balancer.Picker { // Start at a random index, as the same RR balancer rebuilds a new // picker when SubConn states change, and we don't want to apply excess // load to the first server in the list. - next: uint32(grpcrand.Intn(len(scs))), + next: uint32(rand.Intn(len(scs))), } } diff --git a/vendor/google.golang.org/grpc/balancer_wrapper.go b/vendor/google.golang.org/grpc/balancer_wrapper.go index af39b8a4c..4161fdf47 100644 --- a/vendor/google.golang.org/grpc/balancer_wrapper.go +++ b/vendor/google.golang.org/grpc/balancer_wrapper.go @@ -198,6 +198,10 @@ func (ccb *ccBalancerWrapper) UpdateAddresses(sc balancer.SubConn, addrs []resol func (ccb *ccBalancerWrapper) UpdateState(s balancer.State) { ccb.cc.mu.Lock() defer ccb.cc.mu.Unlock() + if ccb.cc.conns == nil { + // The CC has been closed; ignore this update. + return + } ccb.mu.Lock() if ccb.closed { diff --git a/vendor/google.golang.org/grpc/binarylog/grpc_binarylog_v1/binarylog.pb.go b/vendor/google.golang.org/grpc/binarylog/grpc_binarylog_v1/binarylog.pb.go index 856c75dd4..63c639e4f 100644 --- a/vendor/google.golang.org/grpc/binarylog/grpc_binarylog_v1/binarylog.pb.go +++ b/vendor/google.golang.org/grpc/binarylog/grpc_binarylog_v1/binarylog.pb.go @@ -18,7 +18,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.32.0 +// protoc-gen-go v1.34.1 // protoc v4.25.2 // source: grpc/binlog/v1/binarylog.proto diff --git a/vendor/google.golang.org/grpc/clientconn.go b/vendor/google.golang.org/grpc/clientconn.go index c7f260711..423be7b43 100644 --- a/vendor/google.golang.org/grpc/clientconn.go +++ b/vendor/google.golang.org/grpc/clientconn.go @@ -31,13 +31,13 @@ import ( "google.golang.org/grpc/balancer" "google.golang.org/grpc/balancer/base" + "google.golang.org/grpc/balancer/pickfirst" "google.golang.org/grpc/codes" "google.golang.org/grpc/connectivity" "google.golang.org/grpc/internal" "google.golang.org/grpc/internal/channelz" "google.golang.org/grpc/internal/grpcsync" "google.golang.org/grpc/internal/idle" - "google.golang.org/grpc/internal/pretty" iresolver "google.golang.org/grpc/internal/resolver" "google.golang.org/grpc/internal/transport" "google.golang.org/grpc/keepalive" @@ -73,6 +73,8 @@ var ( // invalidDefaultServiceConfigErrPrefix is used to prefix the json parsing error for the default // service config. invalidDefaultServiceConfigErrPrefix = "grpc: the provided default service config is invalid" + // PickFirstBalancerName is the name of the pick_first balancer. + PickFirstBalancerName = pickfirst.Name ) // The following errors are returned from Dial and DialContext @@ -121,8 +123,9 @@ func (dcs *defaultConfigSelector) SelectConfig(rpcInfo iresolver.RPCInfo) (*ires // https://github.com/grpc/grpc/blob/master/doc/naming.md. e.g. to use dns // resolver, a "dns:///" prefix should be applied to the target. // -// The DialOptions returned by WithBlock, WithTimeout, and -// WithReturnConnectionError are ignored by this function. +// The DialOptions returned by WithBlock, WithTimeout, +// WithReturnConnectionError, and FailOnNonTempDialError are ignored by this +// function. func NewClient(target string, opts ...DialOption) (conn *ClientConn, err error) { cc := &ClientConn{ target: target, @@ -152,6 +155,16 @@ func NewClient(target string, opts ...DialOption) (conn *ClientConn, err error) for _, opt := range opts { opt.apply(&cc.dopts) } + + // Determine the resolver to use. + if err := cc.initParsedTargetAndResolverBuilder(); err != nil { + return nil, err + } + + for _, opt := range globalPerTargetDialOptions { + opt.DialOptionForTarget(cc.parsedTarget.URL).apply(&cc.dopts) + } + chainUnaryClientInterceptors(cc) chainStreamClientInterceptors(cc) @@ -160,7 +173,7 @@ func NewClient(target string, opts ...DialOption) (conn *ClientConn, err error) } if cc.dopts.defaultServiceConfigRawJSON != nil { - scpr := parseServiceConfig(*cc.dopts.defaultServiceConfigRawJSON) + scpr := parseServiceConfig(*cc.dopts.defaultServiceConfigRawJSON, cc.dopts.maxCallAttempts) if scpr.Err != nil { return nil, fmt.Errorf("%s: %v", invalidDefaultServiceConfigErrPrefix, scpr.Err) } @@ -168,25 +181,16 @@ func NewClient(target string, opts ...DialOption) (conn *ClientConn, err error) } cc.mkp = cc.dopts.copts.KeepaliveParams - // Register ClientConn with channelz. - cc.channelzRegistration(target) - - // TODO: Ideally it should be impossible to error from this function after - // channelz registration. This will require removing some channelz logs - // from the following functions that can error. Errors can be returned to - // the user, and successful logs can be emitted here, after the checks have - // passed and channelz is subsequently registered. - - // Determine the resolver to use. - if err := cc.parseTargetAndFindResolver(); err != nil { - channelz.RemoveEntry(cc.channelz.ID) - return nil, err - } - if err = cc.determineAuthority(); err != nil { - channelz.RemoveEntry(cc.channelz.ID) + if err = cc.initAuthority(); err != nil { return nil, err } + // Register ClientConn with channelz. Note that this is only done after + // channel creation cannot fail. + cc.channelzRegistration(target) + channelz.Infof(logger, cc.channelz, "parsed dial target is: %#v", cc.parsedTarget) + channelz.Infof(logger, cc.channelz, "Channel authority set to %q", cc.authority) + cc.csMgr = newConnectivityStateManager(cc.ctx, cc.channelz) cc.pickerWrapper = newPickerWrapper(cc.dopts.copts.StatsHandlers) @@ -196,6 +200,8 @@ func NewClient(target string, opts ...DialOption) (conn *ClientConn, err error) } // Dial calls DialContext(context.Background(), target, opts...). +// +// Deprecated: use NewClient instead. Will be supported throughout 1.x. func Dial(target string, opts ...DialOption) (*ClientConn, error) { return DialContext(context.Background(), target, opts...) } @@ -209,6 +215,8 @@ func Dial(target string, opts ...DialOption) (*ClientConn, error) { // "passthrough" for backward compatibility. This distinction should not matter // to most users, but could matter to legacy users that specify a custom dialer // and expect it to receive the target string directly. +// +// Deprecated: use NewClient instead. Will be supported throughout 1.x. func DialContext(ctx context.Context, target string, opts ...DialOption) (conn *ClientConn, err error) { // At the end of this method, we kick the channel out of idle, rather than // waiting for the first rpc. @@ -583,11 +591,11 @@ type ClientConn struct { // The following are initialized at dial time, and are read-only after that. target string // User's dial target. - parsedTarget resolver.Target // See parseTargetAndFindResolver(). - authority string // See determineAuthority(). + parsedTarget resolver.Target // See initParsedTargetAndResolverBuilder(). + authority string // See initAuthority(). dopts dialOptions // Default and user specified dial options. channelz *channelz.Channel // Channelz object. - resolverBuilder resolver.Builder // See parseTargetAndFindResolver(). + resolverBuilder resolver.Builder // See initParsedTargetAndResolverBuilder(). idlenessMgr *idle.Manager // The following provide their own synchronization, and therefore don't @@ -688,8 +696,7 @@ func (cc *ClientConn) waitForResolvedAddrs(ctx context.Context) error { var emptyServiceConfig *ServiceConfig func init() { - balancer.Register(pickfirstBuilder{}) - cfg := parseServiceConfig("{}") + cfg := parseServiceConfig("{}", defaultMaxCallAttempts) if cfg.Err != nil { panic(fmt.Sprintf("impossible error parsing empty service config: %v", cfg.Err)) } @@ -838,6 +845,9 @@ func (cc *ClientConn) newAddrConnLocked(addrs []resolver.Address, opts balancer. stateChan: make(chan struct{}), } ac.ctx, ac.cancel = context.WithCancel(cc.ctx) + // Start with our address set to the first address; this may be updated if + // we connect to different addresses. + ac.channelz.ChannelMetrics.Target.Store(&addrs[0].Addr) channelz.AddTraceEvent(logger, ac.channelz, 0, &channelz.TraceEvent{ Desc: "Subchannel created", @@ -929,10 +939,14 @@ func equalAddresses(a, b []resolver.Address) bool { // updateAddrs updates ac.addrs with the new addresses list and handles active // connections or connection attempts. func (ac *addrConn) updateAddrs(addrs []resolver.Address) { - ac.mu.Lock() - channelz.Infof(logger, ac.channelz, "addrConn: updateAddrs curAddr: %v, addrs: %v", pretty.ToJSON(ac.curAddr), pretty.ToJSON(addrs)) - addrs = copyAddressesWithoutBalancerAttributes(addrs) + limit := len(addrs) + if limit > 5 { + limit = 5 + } + channelz.Infof(logger, ac.channelz, "addrConn: updateAddrs addrs (%d of %d): %v", limit, len(addrs), addrs[:limit]) + + ac.mu.Lock() if equalAddresses(ac.addrs, addrs) { ac.mu.Unlock() return @@ -1167,6 +1181,10 @@ type addrConn struct { // is received, transport is closed, ac has been torn down). transport transport.ClientTransport // The current transport. + // This mutex is used on the RPC path, so its usage should be minimized as + // much as possible. + // TODO: Find a lock-free way to retrieve the transport and state from the + // addrConn. mu sync.Mutex curAddr resolver.Address // The current address. addrs []resolver.Address // All addresses that the resolver resolved to. @@ -1292,6 +1310,7 @@ func (ac *addrConn) resetTransport() { func (ac *addrConn) tryAllAddrs(ctx context.Context, addrs []resolver.Address, connectDeadline time.Time) error { var firstConnErr error for _, addr := range addrs { + ac.channelz.ChannelMetrics.Target.Store(&addr.Addr) if ctx.Err() != nil { return errConnClosing } @@ -1657,22 +1676,19 @@ func (cc *ClientConn) connectionError() error { return cc.lastConnectionError } -// parseTargetAndFindResolver parses the user's dial target and stores the -// parsed target in `cc.parsedTarget`. +// initParsedTargetAndResolverBuilder parses the user's dial target and stores +// the parsed target in `cc.parsedTarget`. // // The resolver to use is determined based on the scheme in the parsed target // and the same is stored in `cc.resolverBuilder`. // // Doesn't grab cc.mu as this method is expected to be called only at Dial time. -func (cc *ClientConn) parseTargetAndFindResolver() error { - channelz.Infof(logger, cc.channelz, "original dial target is: %q", cc.target) +func (cc *ClientConn) initParsedTargetAndResolverBuilder() error { + logger.Infof("original dial target is: %q", cc.target) var rb resolver.Builder parsedTarget, err := parseTarget(cc.target) - if err != nil { - channelz.Infof(logger, cc.channelz, "dial target %q parse failed: %v", cc.target, err) - } else { - channelz.Infof(logger, cc.channelz, "parsed dial target is: %#v", parsedTarget) + if err == nil { rb = cc.getResolver(parsedTarget.URL.Scheme) if rb != nil { cc.parsedTarget = parsedTarget @@ -1691,15 +1707,12 @@ func (cc *ClientConn) parseTargetAndFindResolver() error { defScheme = resolver.GetDefaultScheme() } - channelz.Infof(logger, cc.channelz, "fallback to scheme %q", defScheme) canonicalTarget := defScheme + ":///" + cc.target parsedTarget, err = parseTarget(canonicalTarget) if err != nil { - channelz.Infof(logger, cc.channelz, "dial target %q parse failed: %v", canonicalTarget, err) return err } - channelz.Infof(logger, cc.channelz, "parsed dial target is: %+v", parsedTarget) rb = cc.getResolver(parsedTarget.URL.Scheme) if rb == nil { return fmt.Errorf("could not get resolver for default scheme: %q", parsedTarget.URL.Scheme) @@ -1739,7 +1752,7 @@ func encodeAuthority(authority string) string { return false case '!', '$', '&', '\'', '(', ')', '*', '+', ',', ';', '=': // Subdelim characters return false - case ':', '[', ']', '@': // Authority related delimeters + case ':', '[', ']', '@': // Authority related delimiters return false } // Everything else must be escaped. @@ -1789,7 +1802,7 @@ func encodeAuthority(authority string) string { // credentials do not match the authority configured through the dial option. // // Doesn't grab cc.mu as this method is expected to be called only at Dial time. -func (cc *ClientConn) determineAuthority() error { +func (cc *ClientConn) initAuthority() error { dopts := cc.dopts // Historically, we had two options for users to specify the serverName or // authority for a channel. One was through the transport credentials @@ -1822,6 +1835,5 @@ func (cc *ClientConn) determineAuthority() error { } else { cc.authority = encodeAuthority(endpoint) } - channelz.Infof(logger, cc.channelz, "Channel authority set to %q", cc.authority) return nil } diff --git a/vendor/google.golang.org/grpc/codegen.sh b/vendor/google.golang.org/grpc/codegen.sh deleted file mode 100644 index 4cdc6ba7c..000000000 --- a/vendor/google.golang.org/grpc/codegen.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env bash - -# This script serves as an example to demonstrate how to generate the gRPC-Go -# interface and the related messages from .proto file. -# -# It assumes the installation of i) Google proto buffer compiler at -# https://github.com/google/protobuf (after v2.6.1) and ii) the Go codegen -# plugin at https://github.com/golang/protobuf (after 2015-02-20). If you have -# not, please install them first. -# -# We recommend running this script at $GOPATH/src. -# -# If this is not what you need, feel free to make your own scripts. Again, this -# script is for demonstration purpose. -# -proto=$1 -protoc --go_out=plugins=grpc:. $proto diff --git a/vendor/google.golang.org/grpc/codes/codes.go b/vendor/google.golang.org/grpc/codes/codes.go index 08476ad1f..0b42c302b 100644 --- a/vendor/google.golang.org/grpc/codes/codes.go +++ b/vendor/google.golang.org/grpc/codes/codes.go @@ -235,7 +235,7 @@ func (c *Code) UnmarshalJSON(b []byte) error { if ci, err := strconv.ParseUint(string(b), 10, 32); err == nil { if ci >= _maxCode { - return fmt.Errorf("invalid code: %q", ci) + return fmt.Errorf("invalid code: %d", ci) } *c = Code(ci) diff --git a/vendor/google.golang.org/grpc/credentials/credentials.go b/vendor/google.golang.org/grpc/credentials/credentials.go index f6b55c68b..665e790bb 100644 --- a/vendor/google.golang.org/grpc/credentials/credentials.go +++ b/vendor/google.golang.org/grpc/credentials/credentials.go @@ -30,7 +30,7 @@ import ( "google.golang.org/grpc/attributes" icredentials "google.golang.org/grpc/internal/credentials" - "google.golang.org/protobuf/protoadapt" + "google.golang.org/protobuf/proto" ) // PerRPCCredentials defines the common interface for the credentials which need to @@ -237,7 +237,7 @@ func ClientHandshakeInfoFromContext(ctx context.Context) ClientHandshakeInfo { } // CheckSecurityLevel checks if a connection's security level is greater than or equal to the specified one. -// It returns success if 1) the condition is satisified or 2) AuthInfo struct does not implement GetCommonAuthInfo() method +// It returns success if 1) the condition is satisfied or 2) AuthInfo struct does not implement GetCommonAuthInfo() method // or 3) CommonAuthInfo.SecurityLevel has an invalid zero value. For 2) and 3), it is for the purpose of backward-compatibility. // // This API is experimental. @@ -287,5 +287,5 @@ type ChannelzSecurityValue interface { type OtherChannelzSecurityValue struct { ChannelzSecurityValue Name string - Value protoadapt.MessageV1 + Value proto.Message } diff --git a/vendor/google.golang.org/grpc/credentials/tls.go b/vendor/google.golang.org/grpc/credentials/tls.go index 5dafd34ed..411435854 100644 --- a/vendor/google.golang.org/grpc/credentials/tls.go +++ b/vendor/google.golang.org/grpc/credentials/tls.go @@ -27,9 +27,13 @@ import ( "net/url" "os" + "google.golang.org/grpc/grpclog" credinternal "google.golang.org/grpc/internal/credentials" + "google.golang.org/grpc/internal/envconfig" ) +var logger = grpclog.Component("credentials") + // TLSInfo contains the auth information for a TLS authenticated connection. // It implements the AuthInfo interface. type TLSInfo struct { @@ -112,6 +116,22 @@ func (c *tlsCreds) ClientHandshake(ctx context.Context, authority string, rawCon conn.Close() return nil, nil, ctx.Err() } + + // The negotiated protocol can be either of the following: + // 1. h2: When the server supports ALPN. Only HTTP/2 can be negotiated since + // it is the only protocol advertised by the client during the handshake. + // The tls library ensures that the server chooses a protocol advertised + // by the client. + // 2. "" (empty string): If the server doesn't support ALPN. ALPN is a requirement + // for using HTTP/2 over TLS. We can terminate the connection immediately. + np := conn.ConnectionState().NegotiatedProtocol + if np == "" { + if envconfig.EnforceALPNEnabled { + conn.Close() + return nil, nil, fmt.Errorf("credentials: cannot check peer: missing selected ALPN property") + } + logger.Warningf("Allowing TLS connection to server %q with ALPN disabled. TLS connections to servers with ALPN disabled will be disallowed in future grpc-go releases", cfg.ServerName) + } tlsInfo := TLSInfo{ State: conn.ConnectionState(), CommonAuthInfo: CommonAuthInfo{ @@ -131,8 +151,20 @@ func (c *tlsCreds) ServerHandshake(rawConn net.Conn) (net.Conn, AuthInfo, error) conn.Close() return nil, nil, err } + cs := conn.ConnectionState() + // The negotiated application protocol can be empty only if the client doesn't + // support ALPN. In such cases, we can close the connection since ALPN is required + // for using HTTP/2 over TLS. + if cs.NegotiatedProtocol == "" { + if envconfig.EnforceALPNEnabled { + conn.Close() + return nil, nil, fmt.Errorf("credentials: cannot check peer: missing selected ALPN property") + } else if logger.V(2) { + logger.Info("Allowing TLS connection from client with ALPN disabled. TLS connections with ALPN disabled will be disallowed in future grpc-go releases") + } + } tlsInfo := TLSInfo{ - State: conn.ConnectionState(), + State: cs, CommonAuthInfo: CommonAuthInfo{ SecurityLevel: PrivacyAndIntegrity, }, diff --git a/vendor/google.golang.org/grpc/dialoptions.go b/vendor/google.golang.org/grpc/dialoptions.go index 402493224..f5453d48a 100644 --- a/vendor/google.golang.org/grpc/dialoptions.go +++ b/vendor/google.golang.org/grpc/dialoptions.go @@ -21,6 +21,7 @@ package grpc import ( "context" "net" + "net/url" "time" "google.golang.org/grpc/backoff" @@ -36,6 +37,11 @@ import ( "google.golang.org/grpc/stats" ) +const ( + // https://github.com/grpc/proposal/blob/master/A6-client-retries.md#limits-on-retries-and-hedges + defaultMaxCallAttempts = 5 +) + func init() { internal.AddGlobalDialOptions = func(opt ...DialOption) { globalDialOptions = append(globalDialOptions, opt...) @@ -43,6 +49,14 @@ func init() { internal.ClearGlobalDialOptions = func() { globalDialOptions = nil } + internal.AddGlobalPerTargetDialOptions = func(opt any) { + if ptdo, ok := opt.(perTargetDialOption); ok { + globalPerTargetDialOptions = append(globalPerTargetDialOptions, ptdo) + } + } + internal.ClearGlobalPerTargetDialOptions = func() { + globalPerTargetDialOptions = nil + } internal.WithBinaryLogger = withBinaryLogger internal.JoinDialOptions = newJoinDialOption internal.DisableGlobalDialOptions = newDisableGlobalDialOptions @@ -80,6 +94,7 @@ type dialOptions struct { idleTimeout time.Duration recvBufferPool SharedBufferPool defaultScheme string + maxCallAttempts int } // DialOption configures how we set up the connection. @@ -89,6 +104,19 @@ type DialOption interface { var globalDialOptions []DialOption +// perTargetDialOption takes a parsed target and returns a dial option to apply. +// +// This gets called after NewClient() parses the target, and allows per target +// configuration set through a returned DialOption. The DialOption will not take +// effect if specifies a resolver builder, as that Dial Option is factored in +// while parsing target. +type perTargetDialOption interface { + // DialOption returns a Dial Option to apply. + DialOptionForTarget(parsedTarget url.URL) DialOption +} + +var globalPerTargetDialOptions []perTargetDialOption + // EmptyDialOption does not alter the dial configuration. It can be embedded in // another structure to build custom dial options. // @@ -300,6 +328,9 @@ func withBackoff(bs internalbackoff.Strategy) DialOption { // // Use of this feature is not recommended. For more information, please see: // https://github.com/grpc/grpc-go/blob/master/Documentation/anti-patterns.md +// +// Deprecated: this DialOption is not supported by NewClient. +// Will be supported throughout 1.x. func WithBlock() DialOption { return newFuncDialOption(func(o *dialOptions) { o.block = true @@ -314,10 +345,8 @@ func WithBlock() DialOption { // Use of this feature is not recommended. For more information, please see: // https://github.com/grpc/grpc-go/blob/master/Documentation/anti-patterns.md // -// # Experimental -// -// Notice: This API is EXPERIMENTAL and may be changed or removed in a -// later release. +// Deprecated: this DialOption is not supported by NewClient. +// Will be supported throughout 1.x. func WithReturnConnectionError() DialOption { return newFuncDialOption(func(o *dialOptions) { o.block = true @@ -387,8 +416,8 @@ func WithCredentialsBundle(b credentials.Bundle) DialOption { // WithTimeout returns a DialOption that configures a timeout for dialing a // ClientConn initially. This is valid if and only if WithBlock() is present. // -// Deprecated: use DialContext instead of Dial and context.WithTimeout -// instead. Will be supported throughout 1.x. +// Deprecated: this DialOption is not supported by NewClient. +// Will be supported throughout 1.x. func WithTimeout(d time.Duration) DialOption { return newFuncDialOption(func(o *dialOptions) { o.timeout = d @@ -470,9 +499,8 @@ func withBinaryLogger(bl binarylog.Logger) DialOption { // Use of this feature is not recommended. For more information, please see: // https://github.com/grpc/grpc-go/blob/master/Documentation/anti-patterns.md // -// # Experimental -// -// Notice: This API is EXPERIMENTAL and may be changed or removed in a +// Deprecated: this DialOption is not supported by NewClient. +// This API may be changed or removed in a // later release. func FailOnNonTempDialError(f bool) DialOption { return newFuncDialOption(func(o *dialOptions) { @@ -601,12 +629,22 @@ func WithDisableRetry() DialOption { }) } +// MaxHeaderListSizeDialOption is a DialOption that specifies the maximum +// (uncompressed) size of header list that the client is prepared to accept. +type MaxHeaderListSizeDialOption struct { + MaxHeaderListSize uint32 +} + +func (o MaxHeaderListSizeDialOption) apply(do *dialOptions) { + do.copts.MaxHeaderListSize = &o.MaxHeaderListSize +} + // WithMaxHeaderListSize returns a DialOption that specifies the maximum // (uncompressed) size of header list that the client is prepared to accept. func WithMaxHeaderListSize(s uint32) DialOption { - return newFuncDialOption(func(o *dialOptions) { - o.copts.MaxHeaderListSize = &s - }) + return MaxHeaderListSizeDialOption{ + MaxHeaderListSize: s, + } } // WithDisableHealthCheck disables the LB channel health checking for all @@ -645,10 +683,11 @@ func defaultDialOptions() dialOptions { idleTimeout: 30 * time.Minute, recvBufferPool: nopBufferPool{}, defaultScheme: "dns", + maxCallAttempts: defaultMaxCallAttempts, } } -// withGetMinConnectDeadline specifies the function that clientconn uses to +// withMinConnectDeadline specifies the function that clientconn uses to // get minConnectDeadline. This can be used to make connection attempts happen // faster/slower. // @@ -702,6 +741,23 @@ func WithIdleTimeout(d time.Duration) DialOption { }) } +// WithMaxCallAttempts returns a DialOption that configures the maximum number +// of attempts per call (including retries and hedging) using the channel. +// Service owners may specify a higher value for these parameters, but higher +// values will be treated as equal to the maximum value by the client +// implementation. This mitigates security concerns related to the service +// config being transferred to the client via DNS. +// +// A value of 5 will be used if this dial option is not set or n < 2. +func WithMaxCallAttempts(n int) DialOption { + return newFuncDialOption(func(o *dialOptions) { + if n < 2 { + n = defaultMaxCallAttempts + } + o.maxCallAttempts = n + }) +} + // WithRecvBufferPool returns a DialOption that configures the ClientConn // to use the provided shared buffer pool for parsing incoming messages. Depending // on the application's workload, this could result in reduced memory allocation. diff --git a/vendor/google.golang.org/grpc/health/grpc_health_v1/health.pb.go b/vendor/google.golang.org/grpc/health/grpc_health_v1/health.pb.go index 5bf880d41..38b883507 100644 --- a/vendor/google.golang.org/grpc/health/grpc_health_v1/health.pb.go +++ b/vendor/google.golang.org/grpc/health/grpc_health_v1/health.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.32.0 +// protoc-gen-go v1.34.1 // protoc v4.25.2 // source: grpc/health/v1/health.proto diff --git a/vendor/google.golang.org/grpc/health/grpc_health_v1/health_grpc.pb.go b/vendor/google.golang.org/grpc/health/grpc_health_v1/health_grpc.pb.go index 4c46c098d..51b736ba0 100644 --- a/vendor/google.golang.org/grpc/health/grpc_health_v1/health_grpc.pb.go +++ b/vendor/google.golang.org/grpc/health/grpc_health_v1/health_grpc.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.3.0 +// - protoc-gen-go-grpc v1.4.0 // - protoc v4.25.2 // source: grpc/health/v1/health.proto @@ -32,8 +32,8 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 +// Requires gRPC-Go v1.62.0 or later. +const _ = grpc.SupportPackageIsVersion8 const ( Health_Check_FullMethodName = "/grpc.health.v1.Health/Check" @@ -43,6 +43,10 @@ const ( // HealthClient is the client API for Health service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// Health is gRPC's mechanism for checking whether a server is able to handle +// RPCs. Its semantics are documented in +// https://github.com/grpc/grpc/blob/master/doc/health-checking.md. type HealthClient interface { // Check gets the health of the specified service. If the requested service // is unknown, the call will fail with status NOT_FOUND. If the caller does @@ -81,8 +85,9 @@ func NewHealthClient(cc grpc.ClientConnInterface) HealthClient { } func (c *healthClient) Check(ctx context.Context, in *HealthCheckRequest, opts ...grpc.CallOption) (*HealthCheckResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(HealthCheckResponse) - err := c.cc.Invoke(ctx, Health_Check_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Health_Check_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -90,11 +95,12 @@ func (c *healthClient) Check(ctx context.Context, in *HealthCheckRequest, opts . } func (c *healthClient) Watch(ctx context.Context, in *HealthCheckRequest, opts ...grpc.CallOption) (Health_WatchClient, error) { - stream, err := c.cc.NewStream(ctx, &Health_ServiceDesc.Streams[0], Health_Watch_FullMethodName, opts...) + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + stream, err := c.cc.NewStream(ctx, &Health_ServiceDesc.Streams[0], Health_Watch_FullMethodName, cOpts...) if err != nil { return nil, err } - x := &healthWatchClient{stream} + x := &healthWatchClient{ClientStream: stream} if err := x.ClientStream.SendMsg(in); err != nil { return nil, err } @@ -124,6 +130,10 @@ func (x *healthWatchClient) Recv() (*HealthCheckResponse, error) { // HealthServer is the server API for Health service. // All implementations should embed UnimplementedHealthServer // for forward compatibility +// +// Health is gRPC's mechanism for checking whether a server is able to handle +// RPCs. Its semantics are documented in +// https://github.com/grpc/grpc/blob/master/doc/health-checking.md. type HealthServer interface { // Check gets the health of the specified service. If the requested service // is unknown, the call will fail with status NOT_FOUND. If the caller does @@ -198,7 +208,7 @@ func _Health_Watch_Handler(srv interface{}, stream grpc.ServerStream) error { if err := stream.RecvMsg(m); err != nil { return err } - return srv.(HealthServer).Watch(m, &healthWatchServer{stream}) + return srv.(HealthServer).Watch(m, &healthWatchServer{ServerStream: stream}) } type Health_WatchServer interface { diff --git a/vendor/google.golang.org/grpc/internal/backoff/backoff.go b/vendor/google.golang.org/grpc/internal/backoff/backoff.go index fed1c011a..b15cf482d 100644 --- a/vendor/google.golang.org/grpc/internal/backoff/backoff.go +++ b/vendor/google.golang.org/grpc/internal/backoff/backoff.go @@ -25,10 +25,10 @@ package backoff import ( "context" "errors" + "math/rand" "time" grpcbackoff "google.golang.org/grpc/backoff" - "google.golang.org/grpc/internal/grpcrand" ) // Strategy defines the methodology for backing off after a grpc connection @@ -67,7 +67,7 @@ func (bc Exponential) Backoff(retries int) time.Duration { } // Randomize backoff delays so that if a cluster of requests start at // the same time, they won't operate in lockstep. - backoff *= 1 + bc.Config.Jitter*(grpcrand.Float64()*2-1) + backoff *= 1 + bc.Config.Jitter*(rand.Float64()*2-1) if backoff < 0 { return 0 } diff --git a/vendor/google.golang.org/grpc/internal/balancer/gracefulswitch/config.go b/vendor/google.golang.org/grpc/internal/balancer/gracefulswitch/config.go index 6bf7f8739..13821a926 100644 --- a/vendor/google.golang.org/grpc/internal/balancer/gracefulswitch/config.go +++ b/vendor/google.golang.org/grpc/internal/balancer/gracefulswitch/config.go @@ -75,7 +75,6 @@ func ParseConfig(cfg json.RawMessage) (serviceconfig.LoadBalancingConfig, error) if err != nil { return nil, fmt.Errorf("error parsing config for policy %q: %v", name, err) } - return &lbConfig{childBuilder: builder, childConfig: cfg}, nil } diff --git a/vendor/google.golang.org/grpc/internal/balancer/gracefulswitch/gracefulswitch.go b/vendor/google.golang.org/grpc/internal/balancer/gracefulswitch/gracefulswitch.go index 45d5e50ea..73bb4c4ee 100644 --- a/vendor/google.golang.org/grpc/internal/balancer/gracefulswitch/gracefulswitch.go +++ b/vendor/google.golang.org/grpc/internal/balancer/gracefulswitch/gracefulswitch.go @@ -169,7 +169,6 @@ func (gsb *Balancer) latestBalancer() *balancerWrapper { func (gsb *Balancer) UpdateClientConnState(state balancer.ClientConnState) error { // The resolver data is only relevant to the most recent LB Policy. balToUpdate := gsb.latestBalancer() - gsbCfg, ok := state.BalancerConfig.(*lbConfig) if ok { // Switch to the child in the config unless it is already active. diff --git a/vendor/google.golang.org/grpc/internal/binarylog/method_logger.go b/vendor/google.golang.org/grpc/internal/binarylog/method_logger.go index e8456a77c..aa4505a87 100644 --- a/vendor/google.golang.org/grpc/internal/binarylog/method_logger.go +++ b/vendor/google.golang.org/grpc/internal/binarylog/method_logger.go @@ -65,7 +65,7 @@ type TruncatingMethodLogger struct { callID uint64 idWithinCallGen *callIDGenerator - sink Sink // TODO(blog): make this plugable. + sink Sink // TODO(blog): make this pluggable. } // NewTruncatingMethodLogger returns a new truncating method logger. @@ -80,7 +80,7 @@ func NewTruncatingMethodLogger(h, m uint64) *TruncatingMethodLogger { callID: idGen.next(), idWithinCallGen: &callIDGenerator{}, - sink: DefaultSink, // TODO(blog): make it plugable. + sink: DefaultSink, // TODO(blog): make it pluggable. } } @@ -397,7 +397,7 @@ func metadataKeyOmit(key string) bool { switch key { case "lb-token", ":path", ":authority", "content-encoding", "content-type", "user-agent", "te": return true - case "grpc-trace-bin": // grpc-trace-bin is special because it's visiable to users. + case "grpc-trace-bin": // grpc-trace-bin is special because it's visible to users. return false } return strings.HasPrefix(key, "grpc-") diff --git a/vendor/google.golang.org/grpc/internal/envconfig/envconfig.go b/vendor/google.golang.org/grpc/internal/envconfig/envconfig.go index 685a3cb41..d90648713 100644 --- a/vendor/google.golang.org/grpc/internal/envconfig/envconfig.go +++ b/vendor/google.golang.org/grpc/internal/envconfig/envconfig.go @@ -28,9 +28,6 @@ import ( var ( // TXTErrIgnore is set if TXT errors should be ignored ("GRPC_GO_IGNORE_TXT_ERRORS" is not "false"). TXTErrIgnore = boolFromEnv("GRPC_GO_IGNORE_TXT_ERRORS", true) - // AdvertiseCompressors is set if registered compressor should be advertised - // ("GRPC_GO_ADVERTISE_COMPRESSORS" is not "false"). - AdvertiseCompressors = boolFromEnv("GRPC_GO_ADVERTISE_COMPRESSORS", true) // RingHashCap indicates the maximum ring size which defaults to 4096 // entries but may be overridden by setting the environment variable // "GRPC_RING_HASH_CAP". This does not override the default bounds @@ -43,6 +40,12 @@ var ( // ALTSMaxConcurrentHandshakes is the maximum number of concurrent ALTS // handshakes that can be performed. ALTSMaxConcurrentHandshakes = uint64FromEnv("GRPC_ALTS_MAX_CONCURRENT_HANDSHAKES", 100, 1, 100) + // EnforceALPNEnabled is set if TLS connections to servers with ALPN disabled + // should be rejected. The HTTP/2 protocol requires ALPN to be enabled, this + // option is present for backward compatibility. This option may be overridden + // by setting the environment variable "GRPC_ENFORCE_ALPN_ENABLED" to "true" + // or "false". + EnforceALPNEnabled = boolFromEnv("GRPC_ENFORCE_ALPN_ENABLED", false) ) func boolFromEnv(envVar string, def bool) bool { diff --git a/vendor/google.golang.org/grpc/internal/grpcrand/grpcrand.go b/vendor/google.golang.org/grpc/internal/grpcrand/grpcrand.go deleted file mode 100644 index 0126d6b51..000000000 --- a/vendor/google.golang.org/grpc/internal/grpcrand/grpcrand.go +++ /dev/null @@ -1,100 +0,0 @@ -//go:build !go1.21 - -// TODO: when this file is deleted (after Go 1.20 support is dropped), delete -// all of grpcrand and call the rand package directly. - -/* - * - * Copyright 2018 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -// Package grpcrand implements math/rand functions in a concurrent-safe way -// with a global random source, independent of math/rand's global source. -package grpcrand - -import ( - "math/rand" - "sync" - "time" -) - -var ( - r = rand.New(rand.NewSource(time.Now().UnixNano())) - mu sync.Mutex -) - -// Int implements rand.Int on the grpcrand global source. -func Int() int { - mu.Lock() - defer mu.Unlock() - return r.Int() -} - -// Int63n implements rand.Int63n on the grpcrand global source. -func Int63n(n int64) int64 { - mu.Lock() - defer mu.Unlock() - return r.Int63n(n) -} - -// Intn implements rand.Intn on the grpcrand global source. -func Intn(n int) int { - mu.Lock() - defer mu.Unlock() - return r.Intn(n) -} - -// Int31n implements rand.Int31n on the grpcrand global source. -func Int31n(n int32) int32 { - mu.Lock() - defer mu.Unlock() - return r.Int31n(n) -} - -// Float64 implements rand.Float64 on the grpcrand global source. -func Float64() float64 { - mu.Lock() - defer mu.Unlock() - return r.Float64() -} - -// Uint64 implements rand.Uint64 on the grpcrand global source. -func Uint64() uint64 { - mu.Lock() - defer mu.Unlock() - return r.Uint64() -} - -// Uint32 implements rand.Uint32 on the grpcrand global source. -func Uint32() uint32 { - mu.Lock() - defer mu.Unlock() - return r.Uint32() -} - -// ExpFloat64 implements rand.ExpFloat64 on the grpcrand global source. -func ExpFloat64() float64 { - mu.Lock() - defer mu.Unlock() - return r.ExpFloat64() -} - -// Shuffle implements rand.Shuffle on the grpcrand global source. -var Shuffle = func(n int, f func(int, int)) { - mu.Lock() - defer mu.Unlock() - r.Shuffle(n, f) -} diff --git a/vendor/google.golang.org/grpc/internal/grpcrand/grpcrand_go1.21.go b/vendor/google.golang.org/grpc/internal/grpcrand/grpcrand_go1.21.go deleted file mode 100644 index c37299af1..000000000 --- a/vendor/google.golang.org/grpc/internal/grpcrand/grpcrand_go1.21.go +++ /dev/null @@ -1,73 +0,0 @@ -//go:build go1.21 - -/* - * - * Copyright 2024 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -// Package grpcrand implements math/rand functions in a concurrent-safe way -// with a global random source, independent of math/rand's global source. -package grpcrand - -import "math/rand" - -// This implementation will be used for Go version 1.21 or newer. -// For older versions, the original implementation with mutex will be used. - -// Int implements rand.Int on the grpcrand global source. -func Int() int { - return rand.Int() -} - -// Int63n implements rand.Int63n on the grpcrand global source. -func Int63n(n int64) int64 { - return rand.Int63n(n) -} - -// Intn implements rand.Intn on the grpcrand global source. -func Intn(n int) int { - return rand.Intn(n) -} - -// Int31n implements rand.Int31n on the grpcrand global source. -func Int31n(n int32) int32 { - return rand.Int31n(n) -} - -// Float64 implements rand.Float64 on the grpcrand global source. -func Float64() float64 { - return rand.Float64() -} - -// Uint64 implements rand.Uint64 on the grpcrand global source. -func Uint64() uint64 { - return rand.Uint64() -} - -// Uint32 implements rand.Uint32 on the grpcrand global source. -func Uint32() uint32 { - return rand.Uint32() -} - -// ExpFloat64 implements rand.ExpFloat64 on the grpcrand global source. -func ExpFloat64() float64 { - return rand.ExpFloat64() -} - -// Shuffle implements rand.Shuffle on the grpcrand global source. -var Shuffle = func(n int, f func(int, int)) { - rand.Shuffle(n, f) -} diff --git a/vendor/google.golang.org/grpc/internal/grpcutil/compressor.go b/vendor/google.golang.org/grpc/internal/grpcutil/compressor.go index 9f4090967..e8d866984 100644 --- a/vendor/google.golang.org/grpc/internal/grpcutil/compressor.go +++ b/vendor/google.golang.org/grpc/internal/grpcutil/compressor.go @@ -20,8 +20,6 @@ package grpcutil import ( "strings" - - "google.golang.org/grpc/internal/envconfig" ) // RegisteredCompressorNames holds names of the registered compressors. @@ -40,8 +38,5 @@ func IsCompressorNameRegistered(name string) bool { // RegisteredCompressors returns a string of registered compressor names // separated by comma. func RegisteredCompressors() string { - if !envconfig.AdvertiseCompressors { - return "" - } return strings.Join(RegisteredCompressorNames, ",") } diff --git a/vendor/google.golang.org/grpc/internal/internal.go b/vendor/google.golang.org/grpc/internal/internal.go index 48d24bdb4..5d6653986 100644 --- a/vendor/google.golang.org/grpc/internal/internal.go +++ b/vendor/google.golang.org/grpc/internal/internal.go @@ -106,6 +106,14 @@ var ( // This is used in the 1.0 release of gcp/observability, and thus must not be // deleted or changed. ClearGlobalDialOptions func() + + // AddGlobalPerTargetDialOptions adds a PerTargetDialOption that will be + // configured for newly created ClientConns. + AddGlobalPerTargetDialOptions any // func (opt any) + // ClearGlobalPerTargetDialOptions clears the slice of global late apply + // dial options. + ClearGlobalPerTargetDialOptions func() + // JoinDialOptions combines the dial options passed as arguments into a // single dial option. JoinDialOptions any // func(...grpc.DialOption) grpc.DialOption @@ -126,7 +134,8 @@ var ( // deleted or changed. BinaryLogger any // func(binarylog.Logger) grpc.ServerOption - // SubscribeToConnectivityStateChanges adds a grpcsync.Subscriber to a provided grpc.ClientConn + // SubscribeToConnectivityStateChanges adds a grpcsync.Subscriber to a + // provided grpc.ClientConn. SubscribeToConnectivityStateChanges any // func(*grpc.ClientConn, grpcsync.Subscriber) // NewXDSResolverWithConfigForTesting creates a new xds resolver builder using @@ -184,25 +193,25 @@ var ( ChannelzTurnOffForTesting func() - // TriggerXDSResourceNameNotFoundForTesting triggers the resource-not-found - // error for a given resource type and name. This is usually triggered when - // the associated watch timer fires. For testing purposes, having this - // function makes events more predictable than relying on timer events. - TriggerXDSResourceNameNotFoundForTesting any // func(func(xdsresource.Type, string), string, string) error + // TriggerXDSResourceNotFoundForTesting causes the provided xDS Client to + // invoke resource-not-found error for the given resource type and name. + TriggerXDSResourceNotFoundForTesting any // func(xdsclient.XDSClient, xdsresource.Type, string) error - // TriggerXDSResourceNameNotFoundClient invokes the testing xDS Client - // singleton to invoke resource not found for a resource type name and - // resource name. - TriggerXDSResourceNameNotFoundClient any // func(string, string) error - - // FromOutgoingContextRaw returns the un-merged, intermediary contents of metadata.rawMD. + // FromOutgoingContextRaw returns the un-merged, intermediary contents of + // metadata.rawMD. FromOutgoingContextRaw any // func(context.Context) (metadata.MD, [][]string, bool) - // UserSetDefaultScheme is set to true if the user has overridden the default resolver scheme. + // UserSetDefaultScheme is set to true if the user has overridden the + // default resolver scheme. UserSetDefaultScheme bool = false + + // ShuffleAddressListForTesting pseudo-randomizes the order of addresses. n + // is the number of elements. swap swaps the elements with indexes i and j. + ShuffleAddressListForTesting any // func(n int, swap func(i, j int)) ) -// HealthChecker defines the signature of the client-side LB channel health checking function. +// HealthChecker defines the signature of the client-side LB channel health +// checking function. // // The implementation is expected to create a health checking RPC stream by // calling newStream(), watch for the health status of serviceName, and report diff --git a/vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.go b/vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.go index abab35e25..4552db16b 100644 --- a/vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.go +++ b/vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.go @@ -24,6 +24,7 @@ import ( "context" "encoding/json" "fmt" + "math/rand" "net" "os" "strconv" @@ -35,28 +36,35 @@ import ( "google.golang.org/grpc/grpclog" "google.golang.org/grpc/internal/backoff" "google.golang.org/grpc/internal/envconfig" - "google.golang.org/grpc/internal/grpcrand" "google.golang.org/grpc/internal/resolver/dns/internal" "google.golang.org/grpc/resolver" "google.golang.org/grpc/serviceconfig" ) -// EnableSRVLookups controls whether the DNS resolver attempts to fetch gRPCLB -// addresses from SRV records. Must not be changed after init time. -var EnableSRVLookups = false +var ( + // EnableSRVLookups controls whether the DNS resolver attempts to fetch gRPCLB + // addresses from SRV records. Must not be changed after init time. + EnableSRVLookups = false -// ResolvingTimeout specifies the maximum duration for a DNS resolution request. -// If the timeout expires before a response is received, the request will be canceled. -// -// It is recommended to set this value at application startup. Avoid modifying this variable -// after initialization as it's not thread-safe for concurrent modification. -var ResolvingTimeout = 30 * time.Second + // MinResolutionInterval is the minimum interval at which re-resolutions are + // allowed. This helps to prevent excessive re-resolution. + MinResolutionInterval = 30 * time.Second -var logger = grpclog.Component("dns") + // ResolvingTimeout specifies the maximum duration for a DNS resolution request. + // If the timeout expires before a response is received, the request will be canceled. + // + // It is recommended to set this value at application startup. Avoid modifying this variable + // after initialization as it's not thread-safe for concurrent modification. + ResolvingTimeout = 30 * time.Second + + logger = grpclog.Component("dns") +) func init() { resolver.Register(NewBuilder()) internal.TimeAfterFunc = time.After + internal.TimeNowFunc = time.Now + internal.TimeUntilFunc = time.Until internal.NewNetResolver = newNetResolver internal.AddressDialer = addressDialer } @@ -203,12 +211,12 @@ func (d *dnsResolver) watcher() { err = d.cc.UpdateState(*state) } - var waitTime time.Duration + var nextResolutionTime time.Time if err == nil { // Success resolving, wait for the next ResolveNow. However, also wait 30 // seconds at the very least to prevent constantly re-resolving. backoffIndex = 1 - waitTime = internal.MinResolutionRate + nextResolutionTime = internal.TimeNowFunc().Add(MinResolutionInterval) select { case <-d.ctx.Done(): return @@ -217,13 +225,13 @@ func (d *dnsResolver) watcher() { } else { // Poll on an error found in DNS Resolver or an error received from // ClientConn. - waitTime = backoff.DefaultExponential.Backoff(backoffIndex) + nextResolutionTime = internal.TimeNowFunc().Add(backoff.DefaultExponential.Backoff(backoffIndex)) backoffIndex++ } select { case <-d.ctx.Done(): return - case <-internal.TimeAfterFunc(waitTime): + case <-internal.TimeAfterFunc(internal.TimeUntilFunc(nextResolutionTime)): } } } @@ -417,7 +425,7 @@ func chosenByPercentage(a *int) bool { if a == nil { return true } - return grpcrand.Intn(100)+1 <= *a + return rand.Intn(100)+1 <= *a } func canaryingSC(js string) string { diff --git a/vendor/google.golang.org/grpc/internal/resolver/dns/internal/internal.go b/vendor/google.golang.org/grpc/internal/resolver/dns/internal/internal.go index c7fc557d0..c0eae4f5f 100644 --- a/vendor/google.golang.org/grpc/internal/resolver/dns/internal/internal.go +++ b/vendor/google.golang.org/grpc/internal/resolver/dns/internal/internal.go @@ -28,7 +28,7 @@ import ( // NetResolver groups the methods on net.Resolver that are used by the DNS // resolver implementation. This allows the default net.Resolver instance to be -// overidden from tests. +// overridden from tests. type NetResolver interface { LookupHost(ctx context.Context, host string) (addrs []string, err error) LookupSRV(ctx context.Context, service, proto, name string) (cname string, addrs []*net.SRV, err error) @@ -50,16 +50,23 @@ var ( // The following vars are overridden from tests. var ( - // MinResolutionRate is the minimum rate at which re-resolutions are - // allowed. This helps to prevent excessive re-resolution. - MinResolutionRate = 30 * time.Second - // TimeAfterFunc is used by the DNS resolver to wait for the given duration - // to elapse. In non-test code, this is implemented by time.After. In test + // to elapse. In non-test code, this is implemented by time.After. In test // code, this can be used to control the amount of time the resolver is // blocked waiting for the duration to elapse. TimeAfterFunc func(time.Duration) <-chan time.Time + // TimeNowFunc is used by the DNS resolver to get the current time. + // In non-test code, this is implemented by time.Now. In test code, + // this can be used to control the current time for the resolver. + TimeNowFunc func() time.Time + + // TimeUntilFunc is used by the DNS resolver to calculate the remaining + // wait time for re-resolution. In non-test code, this is implemented by + // time.Until. In test code, this can be used to control the remaining + // time for resolver to wait for re-resolution. + TimeUntilFunc func(time.Time) time.Duration + // NewNetResolver returns the net.Resolver instance for the given target. NewNetResolver func(string) (NetResolver, error) diff --git a/vendor/google.golang.org/grpc/internal/transport/controlbuf.go b/vendor/google.golang.org/grpc/internal/transport/controlbuf.go index 83c382982..3deadfb4a 100644 --- a/vendor/google.golang.org/grpc/internal/transport/controlbuf.go +++ b/vendor/google.golang.org/grpc/internal/transport/controlbuf.go @@ -193,7 +193,7 @@ type goAway struct { code http2.ErrCode debugData []byte headsUp bool - closeConn error // if set, loopyWriter will exit, resulting in conn closure + closeConn error // if set, loopyWriter will exit with this error } func (*goAway) isTransportResponseFrame() bool { return false } @@ -336,7 +336,7 @@ func (c *controlBuffer) put(it cbItem) error { return err } -func (c *controlBuffer) executeAndPut(f func(it any) bool, it cbItem) (bool, error) { +func (c *controlBuffer) executeAndPut(f func() bool, it cbItem) (bool, error) { var wakeUp bool c.mu.Lock() if c.err != nil { @@ -344,7 +344,7 @@ func (c *controlBuffer) executeAndPut(f func(it any) bool, it cbItem) (bool, err return false, c.err } if f != nil { - if !f(it) { // f wasn't successful + if !f() { // f wasn't successful c.mu.Unlock() return false, nil } @@ -495,21 +495,22 @@ type loopyWriter struct { ssGoAwayHandler func(*goAway) (bool, error) } -func newLoopyWriter(s side, fr *framer, cbuf *controlBuffer, bdpEst *bdpEstimator, conn net.Conn, logger *grpclog.PrefixLogger) *loopyWriter { +func newLoopyWriter(s side, fr *framer, cbuf *controlBuffer, bdpEst *bdpEstimator, conn net.Conn, logger *grpclog.PrefixLogger, goAwayHandler func(*goAway) (bool, error)) *loopyWriter { var buf bytes.Buffer l := &loopyWriter{ - side: s, - cbuf: cbuf, - sendQuota: defaultWindowSize, - oiws: defaultWindowSize, - estdStreams: make(map[uint32]*outStream), - activeStreams: newOutStreamList(), - framer: fr, - hBuf: &buf, - hEnc: hpack.NewEncoder(&buf), - bdpEst: bdpEst, - conn: conn, - logger: logger, + side: s, + cbuf: cbuf, + sendQuota: defaultWindowSize, + oiws: defaultWindowSize, + estdStreams: make(map[uint32]*outStream), + activeStreams: newOutStreamList(), + framer: fr, + hBuf: &buf, + hEnc: hpack.NewEncoder(&buf), + bdpEst: bdpEst, + conn: conn, + logger: logger, + ssGoAwayHandler: goAwayHandler, } return l } diff --git a/vendor/google.golang.org/grpc/internal/transport/http2_client.go b/vendor/google.golang.org/grpc/internal/transport/http2_client.go index deba0c4d9..3c63c7069 100644 --- a/vendor/google.golang.org/grpc/internal/transport/http2_client.go +++ b/vendor/google.golang.org/grpc/internal/transport/http2_client.go @@ -114,11 +114,11 @@ type http2Client struct { streamQuota int64 streamsQuotaAvailable chan struct{} waitingStreams uint32 - nextID uint32 registeredCompressors string // Do not access controlBuf with mu held. mu sync.Mutex // guard the following variables + nextID uint32 state transportState activeStreams map[uint32]*Stream // prevGoAway ID records the Last-Stream-ID in the previous GOAway frame. @@ -408,10 +408,10 @@ func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts readerErrCh := make(chan error, 1) go t.reader(readerErrCh) defer func() { - if err == nil { - err = <-readerErrCh - } if err != nil { + // writerDone should be closed since the loopy goroutine + // wouldn't have started in the case this function returns an error. + close(t.writerDone) t.Close(err) } }() @@ -458,8 +458,12 @@ func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts if err := t.framer.writer.Flush(); err != nil { return nil, err } + // Block until the server preface is received successfully or an error occurs. + if err = <-readerErrCh; err != nil { + return nil, err + } go func() { - t.loopy = newLoopyWriter(clientSide, t.framer, t.controlBuf, t.bdpEst, t.conn, t.logger) + t.loopy = newLoopyWriter(clientSide, t.framer, t.controlBuf, t.bdpEst, t.conn, t.logger, t.outgoingGoAwayHandler) if err := t.loopy.run(); !isIOError(err) { // Immediately close the connection, as the loopy writer returns // when there are no more active streams and we were draining (the @@ -517,6 +521,17 @@ func (t *http2Client) getPeer() *peer.Peer { } } +// OutgoingGoAwayHandler writes a GOAWAY to the connection. Always returns (false, err) as we want the GoAway +// to be the last frame loopy writes to the transport. +func (t *http2Client) outgoingGoAwayHandler(g *goAway) (bool, error) { + t.mu.Lock() + defer t.mu.Unlock() + if err := t.framer.fr.WriteGoAway(t.nextID-2, http2.ErrCodeNo, g.debugData); err != nil { + return false, err + } + return false, g.closeConn +} + func (t *http2Client) createHeaderFields(ctx context.Context, callHdr *CallHdr) ([]hpack.HeaderField, error) { aud := t.createAudience(callHdr) ri := credentials.RequestInfo{ @@ -781,7 +796,7 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (*Stream, firstTry := true var ch chan struct{} transportDrainRequired := false - checkForStreamQuota := func(it any) bool { + checkForStreamQuota := func() bool { if t.streamQuota <= 0 { // Can go negative if server decreases it. if firstTry { t.waitingStreams++ @@ -793,23 +808,24 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (*Stream, t.waitingStreams-- } t.streamQuota-- - h := it.(*headerFrame) - h.streamID = t.nextID - t.nextID += 2 - - // Drain client transport if nextID > MaxStreamID which signals gRPC that - // the connection is closed and a new one must be created for subsequent RPCs. - transportDrainRequired = t.nextID > MaxStreamID - s.id = h.streamID - s.fc = &inFlow{limit: uint32(t.initialWindowSize)} t.mu.Lock() if t.state == draining || t.activeStreams == nil { // Can be niled from Close(). t.mu.Unlock() return false // Don't create a stream if the transport is already closed. } + + hdr.streamID = t.nextID + t.nextID += 2 + // Drain client transport if nextID > MaxStreamID which signals gRPC that + // the connection is closed and a new one must be created for subsequent RPCs. + transportDrainRequired = t.nextID > MaxStreamID + + s.id = hdr.streamID + s.fc = &inFlow{limit: uint32(t.initialWindowSize)} t.activeStreams[s.id] = s t.mu.Unlock() + if t.streamQuota > 0 && t.waitingStreams > 0 { select { case t.streamsQuotaAvailable <- struct{}{}: @@ -819,13 +835,12 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (*Stream, return true } var hdrListSizeErr error - checkForHeaderListSize := func(it any) bool { + checkForHeaderListSize := func() bool { if t.maxSendHeaderListSize == nil { return true } - hdrFrame := it.(*headerFrame) var sz int64 - for _, f := range hdrFrame.hf { + for _, f := range hdr.hf { if sz += int64(f.Size()); sz > int64(*t.maxSendHeaderListSize) { hdrListSizeErr = status.Errorf(codes.Internal, "header list size to send violates the maximum size (%d bytes) set by server", *t.maxSendHeaderListSize) return false @@ -834,8 +849,8 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (*Stream, return true } for { - success, err := t.controlBuf.executeAndPut(func(it any) bool { - return checkForHeaderListSize(it) && checkForStreamQuota(it) + success, err := t.controlBuf.executeAndPut(func() bool { + return checkForHeaderListSize() && checkForStreamQuota() }, hdr) if err != nil { // Connection closed. @@ -946,7 +961,7 @@ func (t *http2Client) closeStream(s *Stream, err error, rst bool, rstCode http2. rst: rst, rstCode: rstCode, } - addBackStreamQuota := func(any) bool { + addBackStreamQuota := func() bool { t.streamQuota++ if t.streamQuota > 0 && t.waitingStreams > 0 { select { @@ -966,7 +981,7 @@ func (t *http2Client) closeStream(s *Stream, err error, rst bool, rstCode http2. // Close kicks off the shutdown process of the transport. This should be called // only once on a transport. Once it is called, the transport should not be -// accessed any more. +// accessed anymore. func (t *http2Client) Close(err error) { t.mu.Lock() // Make sure we only close once. @@ -991,7 +1006,10 @@ func (t *http2Client) Close(err error) { t.kpDormancyCond.Signal() } t.mu.Unlock() - t.controlBuf.finish() + // Per HTTP/2 spec, a GOAWAY frame must be sent before closing the + // connection. See https://httpwg.org/specs/rfc7540.html#GOAWAY. + t.controlBuf.put(&goAway{code: http2.ErrCodeNo, debugData: []byte("client transport shutdown"), closeConn: err}) + <-t.writerDone t.cancel() t.conn.Close() channelz.RemoveEntry(t.channelz.ID) @@ -1099,7 +1117,7 @@ func (t *http2Client) updateWindow(s *Stream, n uint32) { // for the transport and the stream based on the current bdp // estimation. func (t *http2Client) updateFlowControl(n uint32) { - updateIWS := func(any) bool { + updateIWS := func() bool { t.initialWindowSize = int32(n) t.mu.Lock() for _, s := range t.activeStreams { @@ -1252,7 +1270,7 @@ func (t *http2Client) handleSettings(f *http2.SettingsFrame, isFirst bool) { } updateFuncs = append(updateFuncs, updateStreamQuota) } - t.controlBuf.executeAndPut(func(any) bool { + t.controlBuf.executeAndPut(func() bool { for _, f := range updateFuncs { f() } diff --git a/vendor/google.golang.org/grpc/internal/transport/http2_server.go b/vendor/google.golang.org/grpc/internal/transport/http2_server.go index d582e0471..b7091165b 100644 --- a/vendor/google.golang.org/grpc/internal/transport/http2_server.go +++ b/vendor/google.golang.org/grpc/internal/transport/http2_server.go @@ -25,6 +25,7 @@ import ( "fmt" "io" "math" + "math/rand" "net" "net/http" "strconv" @@ -43,7 +44,6 @@ import ( "google.golang.org/grpc/codes" "google.golang.org/grpc/credentials" "google.golang.org/grpc/internal/channelz" - "google.golang.org/grpc/internal/grpcrand" "google.golang.org/grpc/internal/grpcsync" "google.golang.org/grpc/keepalive" "google.golang.org/grpc/metadata" @@ -330,8 +330,7 @@ func NewServerTransport(conn net.Conn, config *ServerConfig) (_ ServerTransport, t.handleSettings(sf) go func() { - t.loopy = newLoopyWriter(serverSide, t.framer, t.controlBuf, t.bdpEst, t.conn, t.logger) - t.loopy.ssGoAwayHandler = t.outgoingGoAwayHandler + t.loopy = newLoopyWriter(serverSide, t.framer, t.controlBuf, t.bdpEst, t.conn, t.logger, t.outgoingGoAwayHandler) err := t.loopy.run() close(t.loopyWriterDone) if !isIOError(err) { @@ -860,7 +859,7 @@ func (t *http2Server) handleSettings(f *http2.SettingsFrame) { } return nil }) - t.controlBuf.executeAndPut(func(any) bool { + t.controlBuf.executeAndPut(func() bool { for _, f := range updateFuncs { f() } @@ -1014,12 +1013,13 @@ func (t *http2Server) writeHeaderLocked(s *Stream) error { headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-encoding", Value: s.sendCompress}) } headerFields = appendHeaderFieldsFromMD(headerFields, s.header) - success, err := t.controlBuf.executeAndPut(t.checkForHeaderListSize, &headerFrame{ + hf := &headerFrame{ streamID: s.id, hf: headerFields, endStream: false, onWrite: t.setResetPingStrikes, - }) + } + success, err := t.controlBuf.executeAndPut(func() bool { return t.checkForHeaderListSize(hf) }, hf) if !success { if err != nil { return err @@ -1208,7 +1208,7 @@ func (t *http2Server) keepalive() { continue } if outstandingPing && kpTimeoutLeft <= 0 { - t.Close(fmt.Errorf("keepalive ping not acked within timeout %s", t.kp.Time)) + t.Close(fmt.Errorf("keepalive ping not acked within timeout %s", t.kp.Timeout)) return } if !outstandingPing { @@ -1440,7 +1440,7 @@ func getJitter(v time.Duration) time.Duration { } // Generate a jitter between +/- 10% of the value. r := int64(v / 10) - j := grpcrand.Int63n(2*r) - r + j := rand.Int63n(2*r) - r return time.Duration(j) } diff --git a/vendor/google.golang.org/grpc/internal/transport/transport.go b/vendor/google.golang.org/grpc/internal/transport/transport.go index 0d2a6e47f..4b39c0ade 100644 --- a/vendor/google.golang.org/grpc/internal/transport/transport.go +++ b/vendor/google.golang.org/grpc/internal/transport/transport.go @@ -304,7 +304,7 @@ func (s *Stream) isHeaderSent() bool { } // updateHeaderSent updates headerSent and returns true -// if it was alreay set. It is valid only on server-side. +// if it was already set. It is valid only on server-side. func (s *Stream) updateHeaderSent() bool { return atomic.SwapUint32(&s.headerSent, 1) == 1 } diff --git a/vendor/google.golang.org/grpc/peer/peer.go b/vendor/google.golang.org/grpc/peer/peer.go index a821ff9b2..499a49c8c 100644 --- a/vendor/google.golang.org/grpc/peer/peer.go +++ b/vendor/google.golang.org/grpc/peer/peer.go @@ -22,7 +22,9 @@ package peer import ( "context" + "fmt" "net" + "strings" "google.golang.org/grpc/credentials" ) @@ -39,6 +41,34 @@ type Peer struct { AuthInfo credentials.AuthInfo } +// String ensures the Peer types implements the Stringer interface in order to +// allow to print a context with a peerKey value effectively. +func (p *Peer) String() string { + if p == nil { + return "Peer" + } + sb := &strings.Builder{} + sb.WriteString("Peer{") + if p.Addr != nil { + fmt.Fprintf(sb, "Addr: '%s', ", p.Addr.String()) + } else { + fmt.Fprintf(sb, "Addr: , ") + } + if p.LocalAddr != nil { + fmt.Fprintf(sb, "LocalAddr: '%s', ", p.LocalAddr.String()) + } else { + fmt.Fprintf(sb, "LocalAddr: , ") + } + if p.AuthInfo != nil { + fmt.Fprintf(sb, "AuthInfo: '%s'", p.AuthInfo.AuthType()) + } else { + fmt.Fprintf(sb, "AuthInfo: ") + } + sb.WriteString("}") + + return sb.String() +} + type peerKey struct{} // NewContext creates a new context with peer information attached. diff --git a/vendor/google.golang.org/grpc/picker_wrapper.go b/vendor/google.golang.org/grpc/picker_wrapper.go index bf56faa76..bdaa2130e 100644 --- a/vendor/google.golang.org/grpc/picker_wrapper.go +++ b/vendor/google.golang.org/grpc/picker_wrapper.go @@ -20,8 +20,9 @@ package grpc import ( "context" + "fmt" "io" - "sync" + "sync/atomic" "google.golang.org/grpc/balancer" "google.golang.org/grpc/codes" @@ -32,35 +33,43 @@ import ( "google.golang.org/grpc/status" ) +// pickerGeneration stores a picker and a channel used to signal that a picker +// newer than this one is available. +type pickerGeneration struct { + // picker is the picker produced by the LB policy. May be nil if a picker + // has never been produced. + picker balancer.Picker + // blockingCh is closed when the picker has been invalidated because there + // is a new one available. + blockingCh chan struct{} +} + // pickerWrapper is a wrapper of balancer.Picker. It blocks on certain pick // actions and unblock when there's a picker update. type pickerWrapper struct { - mu sync.Mutex - done bool - blockingCh chan struct{} - picker balancer.Picker + // If pickerGen holds a nil pointer, the pickerWrapper is closed. + pickerGen atomic.Pointer[pickerGeneration] statsHandlers []stats.Handler // to record blocking picker calls } func newPickerWrapper(statsHandlers []stats.Handler) *pickerWrapper { - return &pickerWrapper{ - blockingCh: make(chan struct{}), + pw := &pickerWrapper{ statsHandlers: statsHandlers, } + pw.pickerGen.Store(&pickerGeneration{ + blockingCh: make(chan struct{}), + }) + return pw } -// updatePicker is called by UpdateBalancerState. It unblocks all blocked pick. +// updatePicker is called by UpdateState calls from the LB policy. It +// unblocks all blocked pick. func (pw *pickerWrapper) updatePicker(p balancer.Picker) { - pw.mu.Lock() - if pw.done { - pw.mu.Unlock() - return - } - pw.picker = p - // pw.blockingCh should never be nil. - close(pw.blockingCh) - pw.blockingCh = make(chan struct{}) - pw.mu.Unlock() + old := pw.pickerGen.Swap(&pickerGeneration{ + picker: p, + blockingCh: make(chan struct{}), + }) + close(old.blockingCh) } // doneChannelzWrapper performs the following: @@ -97,27 +106,24 @@ func (pw *pickerWrapper) pick(ctx context.Context, failfast bool, info balancer. var lastPickErr error for { - pw.mu.Lock() - if pw.done { - pw.mu.Unlock() + pg := pw.pickerGen.Load() + if pg == nil { return nil, balancer.PickResult{}, ErrClientConnClosing } - - if pw.picker == nil { - ch = pw.blockingCh + if pg.picker == nil { + ch = pg.blockingCh } - if ch == pw.blockingCh { + if ch == pg.blockingCh { // This could happen when either: // - pw.picker is nil (the previous if condition), or - // - has called pick on the current picker. - pw.mu.Unlock() + // - we have already called pick on the current picker. select { case <-ctx.Done(): var errStr string if lastPickErr != nil { errStr = "latest balancer error: " + lastPickErr.Error() } else { - errStr = ctx.Err().Error() + errStr = fmt.Sprintf("received context error while waiting for new LB policy update: %s", ctx.Err().Error()) } switch ctx.Err() { case context.DeadlineExceeded: @@ -144,9 +150,8 @@ func (pw *pickerWrapper) pick(ctx context.Context, failfast bool, info balancer. } } - ch = pw.blockingCh - p := pw.picker - pw.mu.Unlock() + ch = pg.blockingCh + p := pg.picker pickResult, err := p.Pick(info) if err != nil { @@ -196,24 +201,15 @@ func (pw *pickerWrapper) pick(ctx context.Context, failfast bool, info balancer. } func (pw *pickerWrapper) close() { - pw.mu.Lock() - defer pw.mu.Unlock() - if pw.done { - return - } - pw.done = true - close(pw.blockingCh) + old := pw.pickerGen.Swap(nil) + close(old.blockingCh) } // reset clears the pickerWrapper and prepares it for being used again when idle // mode is exited. func (pw *pickerWrapper) reset() { - pw.mu.Lock() - defer pw.mu.Unlock() - if pw.done { - return - } - pw.blockingCh = make(chan struct{}) + old := pw.pickerGen.Swap(&pickerGeneration{blockingCh: make(chan struct{})}) + close(old.blockingCh) } // dropError is a wrapper error that indicates the LB policy wishes to drop the diff --git a/vendor/google.golang.org/grpc/reflection/adapt.go b/vendor/google.golang.org/grpc/reflection/adapt.go index 33b907a36..6997e4740 100644 --- a/vendor/google.golang.org/grpc/reflection/adapt.go +++ b/vendor/google.golang.org/grpc/reflection/adapt.go @@ -19,10 +19,11 @@ package reflection import ( + "google.golang.org/grpc/reflection/internal" + v1reflectiongrpc "google.golang.org/grpc/reflection/grpc_reflection_v1" v1reflectionpb "google.golang.org/grpc/reflection/grpc_reflection_v1" v1alphareflectiongrpc "google.golang.org/grpc/reflection/grpc_reflection_v1alpha" - v1alphareflectionpb "google.golang.org/grpc/reflection/grpc_reflection_v1alpha" ) // asV1Alpha returns an implementation of the v1alpha version of the reflection @@ -44,7 +45,7 @@ type v1AlphaServerStreamAdapter struct { } func (s v1AlphaServerStreamAdapter) Send(response *v1reflectionpb.ServerReflectionResponse) error { - return s.ServerReflection_ServerReflectionInfoServer.Send(v1ToV1AlphaResponse(response)) + return s.ServerReflection_ServerReflectionInfoServer.Send(internal.V1ToV1AlphaResponse(response)) } func (s v1AlphaServerStreamAdapter) Recv() (*v1reflectionpb.ServerReflectionRequest, error) { @@ -52,136 +53,5 @@ func (s v1AlphaServerStreamAdapter) Recv() (*v1reflectionpb.ServerReflectionRequ if err != nil { return nil, err } - return v1AlphaToV1Request(resp), nil -} - -func v1ToV1AlphaResponse(v1 *v1reflectionpb.ServerReflectionResponse) *v1alphareflectionpb.ServerReflectionResponse { - var v1alpha v1alphareflectionpb.ServerReflectionResponse - v1alpha.ValidHost = v1.ValidHost - if v1.OriginalRequest != nil { - v1alpha.OriginalRequest = v1ToV1AlphaRequest(v1.OriginalRequest) - } - switch mr := v1.MessageResponse.(type) { - case *v1reflectionpb.ServerReflectionResponse_FileDescriptorResponse: - if mr != nil { - v1alpha.MessageResponse = &v1alphareflectionpb.ServerReflectionResponse_FileDescriptorResponse{ - FileDescriptorResponse: &v1alphareflectionpb.FileDescriptorResponse{ - FileDescriptorProto: mr.FileDescriptorResponse.GetFileDescriptorProto(), - }, - } - } - case *v1reflectionpb.ServerReflectionResponse_AllExtensionNumbersResponse: - if mr != nil { - v1alpha.MessageResponse = &v1alphareflectionpb.ServerReflectionResponse_AllExtensionNumbersResponse{ - AllExtensionNumbersResponse: &v1alphareflectionpb.ExtensionNumberResponse{ - BaseTypeName: mr.AllExtensionNumbersResponse.GetBaseTypeName(), - ExtensionNumber: mr.AllExtensionNumbersResponse.GetExtensionNumber(), - }, - } - } - case *v1reflectionpb.ServerReflectionResponse_ListServicesResponse: - if mr != nil { - svcs := make([]*v1alphareflectionpb.ServiceResponse, len(mr.ListServicesResponse.GetService())) - for i, svc := range mr.ListServicesResponse.GetService() { - svcs[i] = &v1alphareflectionpb.ServiceResponse{ - Name: svc.GetName(), - } - } - v1alpha.MessageResponse = &v1alphareflectionpb.ServerReflectionResponse_ListServicesResponse{ - ListServicesResponse: &v1alphareflectionpb.ListServiceResponse{ - Service: svcs, - }, - } - } - case *v1reflectionpb.ServerReflectionResponse_ErrorResponse: - if mr != nil { - v1alpha.MessageResponse = &v1alphareflectionpb.ServerReflectionResponse_ErrorResponse{ - ErrorResponse: &v1alphareflectionpb.ErrorResponse{ - ErrorCode: mr.ErrorResponse.GetErrorCode(), - ErrorMessage: mr.ErrorResponse.GetErrorMessage(), - }, - } - } - default: - // no value set - } - return &v1alpha -} - -func v1AlphaToV1Request(v1alpha *v1alphareflectionpb.ServerReflectionRequest) *v1reflectionpb.ServerReflectionRequest { - var v1 v1reflectionpb.ServerReflectionRequest - v1.Host = v1alpha.Host - switch mr := v1alpha.MessageRequest.(type) { - case *v1alphareflectionpb.ServerReflectionRequest_FileByFilename: - v1.MessageRequest = &v1reflectionpb.ServerReflectionRequest_FileByFilename{ - FileByFilename: mr.FileByFilename, - } - case *v1alphareflectionpb.ServerReflectionRequest_FileContainingSymbol: - v1.MessageRequest = &v1reflectionpb.ServerReflectionRequest_FileContainingSymbol{ - FileContainingSymbol: mr.FileContainingSymbol, - } - case *v1alphareflectionpb.ServerReflectionRequest_FileContainingExtension: - if mr.FileContainingExtension != nil { - v1.MessageRequest = &v1reflectionpb.ServerReflectionRequest_FileContainingExtension{ - FileContainingExtension: &v1reflectionpb.ExtensionRequest{ - ContainingType: mr.FileContainingExtension.GetContainingType(), - ExtensionNumber: mr.FileContainingExtension.GetExtensionNumber(), - }, - } - } - case *v1alphareflectionpb.ServerReflectionRequest_AllExtensionNumbersOfType: - v1.MessageRequest = &v1reflectionpb.ServerReflectionRequest_AllExtensionNumbersOfType{ - AllExtensionNumbersOfType: mr.AllExtensionNumbersOfType, - } - case *v1alphareflectionpb.ServerReflectionRequest_ListServices: - v1.MessageRequest = &v1reflectionpb.ServerReflectionRequest_ListServices{ - ListServices: mr.ListServices, - } - default: - // no value set - } - return &v1 -} - -func v1ToV1AlphaRequest(v1 *v1reflectionpb.ServerReflectionRequest) *v1alphareflectionpb.ServerReflectionRequest { - var v1alpha v1alphareflectionpb.ServerReflectionRequest - v1alpha.Host = v1.Host - switch mr := v1.MessageRequest.(type) { - case *v1reflectionpb.ServerReflectionRequest_FileByFilename: - if mr != nil { - v1alpha.MessageRequest = &v1alphareflectionpb.ServerReflectionRequest_FileByFilename{ - FileByFilename: mr.FileByFilename, - } - } - case *v1reflectionpb.ServerReflectionRequest_FileContainingSymbol: - if mr != nil { - v1alpha.MessageRequest = &v1alphareflectionpb.ServerReflectionRequest_FileContainingSymbol{ - FileContainingSymbol: mr.FileContainingSymbol, - } - } - case *v1reflectionpb.ServerReflectionRequest_FileContainingExtension: - if mr != nil { - v1alpha.MessageRequest = &v1alphareflectionpb.ServerReflectionRequest_FileContainingExtension{ - FileContainingExtension: &v1alphareflectionpb.ExtensionRequest{ - ContainingType: mr.FileContainingExtension.GetContainingType(), - ExtensionNumber: mr.FileContainingExtension.GetExtensionNumber(), - }, - } - } - case *v1reflectionpb.ServerReflectionRequest_AllExtensionNumbersOfType: - if mr != nil { - v1alpha.MessageRequest = &v1alphareflectionpb.ServerReflectionRequest_AllExtensionNumbersOfType{ - AllExtensionNumbersOfType: mr.AllExtensionNumbersOfType, - } - } - case *v1reflectionpb.ServerReflectionRequest_ListServices: - if mr != nil { - v1alpha.MessageRequest = &v1alphareflectionpb.ServerReflectionRequest_ListServices{ - ListServices: mr.ListServices, - } - } - default: - // no value set - } - return &v1alpha + return internal.V1AlphaToV1Request(resp), nil } diff --git a/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1/reflection.pb.go b/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1/reflection.pb.go index 8953c9d8d..666eda8e5 100644 --- a/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1/reflection.pb.go +++ b/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1/reflection.pb.go @@ -21,7 +21,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.32.0 +// protoc-gen-go v1.34.1 // protoc v4.25.2 // source: grpc/reflection/v1/reflection.proto diff --git a/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1/reflection_grpc.pb.go b/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1/reflection_grpc.pb.go index d6cdd5b54..17d21fde2 100644 --- a/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1/reflection_grpc.pb.go +++ b/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1/reflection_grpc.pb.go @@ -21,7 +21,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.3.0 +// - protoc-gen-go-grpc v1.4.0 // - protoc v4.25.2 // source: grpc/reflection/v1/reflection.proto @@ -36,8 +36,8 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 +// Requires gRPC-Go v1.62.0 or later. +const _ = grpc.SupportPackageIsVersion8 const ( ServerReflection_ServerReflectionInfo_FullMethodName = "/grpc.reflection.v1.ServerReflection/ServerReflectionInfo" @@ -61,11 +61,12 @@ func NewServerReflectionClient(cc grpc.ClientConnInterface) ServerReflectionClie } func (c *serverReflectionClient) ServerReflectionInfo(ctx context.Context, opts ...grpc.CallOption) (ServerReflection_ServerReflectionInfoClient, error) { - stream, err := c.cc.NewStream(ctx, &ServerReflection_ServiceDesc.Streams[0], ServerReflection_ServerReflectionInfo_FullMethodName, opts...) + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + stream, err := c.cc.NewStream(ctx, &ServerReflection_ServiceDesc.Streams[0], ServerReflection_ServerReflectionInfo_FullMethodName, cOpts...) if err != nil { return nil, err } - x := &serverReflectionServerReflectionInfoClient{stream} + x := &serverReflectionServerReflectionInfoClient{ClientStream: stream} return x, nil } @@ -120,7 +121,7 @@ func RegisterServerReflectionServer(s grpc.ServiceRegistrar, srv ServerReflectio } func _ServerReflection_ServerReflectionInfo_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(ServerReflectionServer).ServerReflectionInfo(&serverReflectionServerReflectionInfoServer{stream}) + return srv.(ServerReflectionServer).ServerReflectionInfo(&serverReflectionServerReflectionInfoServer{ServerStream: stream}) } type ServerReflection_ServerReflectionInfoServer interface { diff --git a/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1alpha/reflection.pb.go b/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1alpha/reflection.pb.go index 929733e7b..cd032acef 100644 --- a/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1alpha/reflection.pb.go +++ b/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1alpha/reflection.pb.go @@ -18,7 +18,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.32.0 +// protoc-gen-go v1.34.1 // protoc v4.25.2 // grpc/reflection/v1alpha/reflection.proto is a deprecated file. diff --git a/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1alpha/reflection_grpc.pb.go b/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1alpha/reflection_grpc.pb.go index ef6914063..93886e382 100644 --- a/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1alpha/reflection_grpc.pb.go +++ b/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1alpha/reflection_grpc.pb.go @@ -18,7 +18,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.3.0 +// - protoc-gen-go-grpc v1.4.0 // - protoc v4.25.2 // grpc/reflection/v1alpha/reflection.proto is a deprecated file. @@ -33,8 +33,8 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 +// Requires gRPC-Go v1.62.0 or later. +const _ = grpc.SupportPackageIsVersion8 const ( ServerReflection_ServerReflectionInfo_FullMethodName = "/grpc.reflection.v1alpha.ServerReflection/ServerReflectionInfo" @@ -58,11 +58,12 @@ func NewServerReflectionClient(cc grpc.ClientConnInterface) ServerReflectionClie } func (c *serverReflectionClient) ServerReflectionInfo(ctx context.Context, opts ...grpc.CallOption) (ServerReflection_ServerReflectionInfoClient, error) { - stream, err := c.cc.NewStream(ctx, &ServerReflection_ServiceDesc.Streams[0], ServerReflection_ServerReflectionInfo_FullMethodName, opts...) + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + stream, err := c.cc.NewStream(ctx, &ServerReflection_ServiceDesc.Streams[0], ServerReflection_ServerReflectionInfo_FullMethodName, cOpts...) if err != nil { return nil, err } - x := &serverReflectionServerReflectionInfoClient{stream} + x := &serverReflectionServerReflectionInfoClient{ClientStream: stream} return x, nil } @@ -117,7 +118,7 @@ func RegisterServerReflectionServer(s grpc.ServiceRegistrar, srv ServerReflectio } func _ServerReflection_ServerReflectionInfo_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(ServerReflectionServer).ServerReflectionInfo(&serverReflectionServerReflectionInfoServer{stream}) + return srv.(ServerReflectionServer).ServerReflectionInfo(&serverReflectionServerReflectionInfoServer{ServerStream: stream}) } type ServerReflection_ServerReflectionInfoServer interface { diff --git a/vendor/google.golang.org/grpc/reflection/internal/internal.go b/vendor/google.golang.org/grpc/reflection/internal/internal.go new file mode 100644 index 000000000..36ee65075 --- /dev/null +++ b/vendor/google.golang.org/grpc/reflection/internal/internal.go @@ -0,0 +1,436 @@ +/* + * + * Copyright 2024 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package internal contains code that is shared by both reflection package and +// the test package. The packages are split in this way inorder to avoid +// depenedency to deprecated package github.com/golang/protobuf. +package internal + +import ( + "io" + "sort" + + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/reflect/protodesc" + "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoregistry" + + v1reflectiongrpc "google.golang.org/grpc/reflection/grpc_reflection_v1" + v1reflectionpb "google.golang.org/grpc/reflection/grpc_reflection_v1" + v1alphareflectiongrpc "google.golang.org/grpc/reflection/grpc_reflection_v1alpha" + v1alphareflectionpb "google.golang.org/grpc/reflection/grpc_reflection_v1alpha" +) + +// ServiceInfoProvider is an interface used to retrieve metadata about the +// services to expose. +type ServiceInfoProvider interface { + GetServiceInfo() map[string]grpc.ServiceInfo +} + +// ExtensionResolver is the interface used to query details about extensions. +// This interface is satisfied by protoregistry.GlobalTypes. +type ExtensionResolver interface { + protoregistry.ExtensionTypeResolver + RangeExtensionsByMessage(message protoreflect.FullName, f func(protoreflect.ExtensionType) bool) +} + +// ServerReflectionServer is the server API for ServerReflection service. +type ServerReflectionServer struct { + v1alphareflectiongrpc.UnimplementedServerReflectionServer + S ServiceInfoProvider + DescResolver protodesc.Resolver + ExtResolver ExtensionResolver +} + +// FileDescWithDependencies returns a slice of serialized fileDescriptors in +// wire format ([]byte). The fileDescriptors will include fd and all the +// transitive dependencies of fd with names not in sentFileDescriptors. +func (s *ServerReflectionServer) FileDescWithDependencies(fd protoreflect.FileDescriptor, sentFileDescriptors map[string]bool) ([][]byte, error) { + if fd.IsPlaceholder() { + // If the given root file is a placeholder, treat it + // as missing instead of serializing it. + return nil, protoregistry.NotFound + } + var r [][]byte + queue := []protoreflect.FileDescriptor{fd} + for len(queue) > 0 { + currentfd := queue[0] + queue = queue[1:] + if currentfd.IsPlaceholder() { + // Skip any missing files in the dependency graph. + continue + } + if sent := sentFileDescriptors[currentfd.Path()]; len(r) == 0 || !sent { + sentFileDescriptors[currentfd.Path()] = true + fdProto := protodesc.ToFileDescriptorProto(currentfd) + currentfdEncoded, err := proto.Marshal(fdProto) + if err != nil { + return nil, err + } + r = append(r, currentfdEncoded) + } + for i := 0; i < currentfd.Imports().Len(); i++ { + queue = append(queue, currentfd.Imports().Get(i)) + } + } + return r, nil +} + +// FileDescEncodingContainingSymbol finds the file descriptor containing the +// given symbol, finds all of its previously unsent transitive dependencies, +// does marshalling on them, and returns the marshalled result. The given symbol +// can be a type, a service or a method. +func (s *ServerReflectionServer) FileDescEncodingContainingSymbol(name string, sentFileDescriptors map[string]bool) ([][]byte, error) { + d, err := s.DescResolver.FindDescriptorByName(protoreflect.FullName(name)) + if err != nil { + return nil, err + } + return s.FileDescWithDependencies(d.ParentFile(), sentFileDescriptors) +} + +// FileDescEncodingContainingExtension finds the file descriptor containing +// given extension, finds all of its previously unsent transitive dependencies, +// does marshalling on them, and returns the marshalled result. +func (s *ServerReflectionServer) FileDescEncodingContainingExtension(typeName string, extNum int32, sentFileDescriptors map[string]bool) ([][]byte, error) { + xt, err := s.ExtResolver.FindExtensionByNumber(protoreflect.FullName(typeName), protoreflect.FieldNumber(extNum)) + if err != nil { + return nil, err + } + return s.FileDescWithDependencies(xt.TypeDescriptor().ParentFile(), sentFileDescriptors) +} + +// AllExtensionNumbersForTypeName returns all extension numbers for the given type. +func (s *ServerReflectionServer) AllExtensionNumbersForTypeName(name string) ([]int32, error) { + var numbers []int32 + s.ExtResolver.RangeExtensionsByMessage(protoreflect.FullName(name), func(xt protoreflect.ExtensionType) bool { + numbers = append(numbers, int32(xt.TypeDescriptor().Number())) + return true + }) + sort.Slice(numbers, func(i, j int) bool { + return numbers[i] < numbers[j] + }) + if len(numbers) == 0 { + // maybe return an error if given type name is not known + if _, err := s.DescResolver.FindDescriptorByName(protoreflect.FullName(name)); err != nil { + return nil, err + } + } + return numbers, nil +} + +// ListServices returns the names of services this server exposes. +func (s *ServerReflectionServer) ListServices() []*v1reflectionpb.ServiceResponse { + serviceInfo := s.S.GetServiceInfo() + resp := make([]*v1reflectionpb.ServiceResponse, 0, len(serviceInfo)) + for svc := range serviceInfo { + resp = append(resp, &v1reflectionpb.ServiceResponse{Name: svc}) + } + sort.Slice(resp, func(i, j int) bool { + return resp[i].Name < resp[j].Name + }) + return resp +} + +// ServerReflectionInfo is the reflection service handler. +func (s *ServerReflectionServer) ServerReflectionInfo(stream v1reflectiongrpc.ServerReflection_ServerReflectionInfoServer) error { + sentFileDescriptors := make(map[string]bool) + for { + in, err := stream.Recv() + if err == io.EOF { + return nil + } + if err != nil { + return err + } + + out := &v1reflectionpb.ServerReflectionResponse{ + ValidHost: in.Host, + OriginalRequest: in, + } + switch req := in.MessageRequest.(type) { + case *v1reflectionpb.ServerReflectionRequest_FileByFilename: + var b [][]byte + fd, err := s.DescResolver.FindFileByPath(req.FileByFilename) + if err == nil { + b, err = s.FileDescWithDependencies(fd, sentFileDescriptors) + } + if err != nil { + out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_ErrorResponse{ + ErrorResponse: &v1reflectionpb.ErrorResponse{ + ErrorCode: int32(codes.NotFound), + ErrorMessage: err.Error(), + }, + } + } else { + out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_FileDescriptorResponse{ + FileDescriptorResponse: &v1reflectionpb.FileDescriptorResponse{FileDescriptorProto: b}, + } + } + case *v1reflectionpb.ServerReflectionRequest_FileContainingSymbol: + b, err := s.FileDescEncodingContainingSymbol(req.FileContainingSymbol, sentFileDescriptors) + if err != nil { + out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_ErrorResponse{ + ErrorResponse: &v1reflectionpb.ErrorResponse{ + ErrorCode: int32(codes.NotFound), + ErrorMessage: err.Error(), + }, + } + } else { + out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_FileDescriptorResponse{ + FileDescriptorResponse: &v1reflectionpb.FileDescriptorResponse{FileDescriptorProto: b}, + } + } + case *v1reflectionpb.ServerReflectionRequest_FileContainingExtension: + typeName := req.FileContainingExtension.ContainingType + extNum := req.FileContainingExtension.ExtensionNumber + b, err := s.FileDescEncodingContainingExtension(typeName, extNum, sentFileDescriptors) + if err != nil { + out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_ErrorResponse{ + ErrorResponse: &v1reflectionpb.ErrorResponse{ + ErrorCode: int32(codes.NotFound), + ErrorMessage: err.Error(), + }, + } + } else { + out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_FileDescriptorResponse{ + FileDescriptorResponse: &v1reflectionpb.FileDescriptorResponse{FileDescriptorProto: b}, + } + } + case *v1reflectionpb.ServerReflectionRequest_AllExtensionNumbersOfType: + extNums, err := s.AllExtensionNumbersForTypeName(req.AllExtensionNumbersOfType) + if err != nil { + out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_ErrorResponse{ + ErrorResponse: &v1reflectionpb.ErrorResponse{ + ErrorCode: int32(codes.NotFound), + ErrorMessage: err.Error(), + }, + } + } else { + out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_AllExtensionNumbersResponse{ + AllExtensionNumbersResponse: &v1reflectionpb.ExtensionNumberResponse{ + BaseTypeName: req.AllExtensionNumbersOfType, + ExtensionNumber: extNums, + }, + } + } + case *v1reflectionpb.ServerReflectionRequest_ListServices: + out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_ListServicesResponse{ + ListServicesResponse: &v1reflectionpb.ListServiceResponse{ + Service: s.ListServices(), + }, + } + default: + return status.Errorf(codes.InvalidArgument, "invalid MessageRequest: %v", in.MessageRequest) + } + + if err := stream.Send(out); err != nil { + return err + } + } +} + +// V1ToV1AlphaResponse converts a v1 ServerReflectionResponse to a v1alpha. +func V1ToV1AlphaResponse(v1 *v1reflectionpb.ServerReflectionResponse) *v1alphareflectionpb.ServerReflectionResponse { + var v1alpha v1alphareflectionpb.ServerReflectionResponse + v1alpha.ValidHost = v1.ValidHost + if v1.OriginalRequest != nil { + v1alpha.OriginalRequest = V1ToV1AlphaRequest(v1.OriginalRequest) + } + switch mr := v1.MessageResponse.(type) { + case *v1reflectionpb.ServerReflectionResponse_FileDescriptorResponse: + if mr != nil { + v1alpha.MessageResponse = &v1alphareflectionpb.ServerReflectionResponse_FileDescriptorResponse{ + FileDescriptorResponse: &v1alphareflectionpb.FileDescriptorResponse{ + FileDescriptorProto: mr.FileDescriptorResponse.GetFileDescriptorProto(), + }, + } + } + case *v1reflectionpb.ServerReflectionResponse_AllExtensionNumbersResponse: + if mr != nil { + v1alpha.MessageResponse = &v1alphareflectionpb.ServerReflectionResponse_AllExtensionNumbersResponse{ + AllExtensionNumbersResponse: &v1alphareflectionpb.ExtensionNumberResponse{ + BaseTypeName: mr.AllExtensionNumbersResponse.GetBaseTypeName(), + ExtensionNumber: mr.AllExtensionNumbersResponse.GetExtensionNumber(), + }, + } + } + case *v1reflectionpb.ServerReflectionResponse_ListServicesResponse: + if mr != nil { + svcs := make([]*v1alphareflectionpb.ServiceResponse, len(mr.ListServicesResponse.GetService())) + for i, svc := range mr.ListServicesResponse.GetService() { + svcs[i] = &v1alphareflectionpb.ServiceResponse{ + Name: svc.GetName(), + } + } + v1alpha.MessageResponse = &v1alphareflectionpb.ServerReflectionResponse_ListServicesResponse{ + ListServicesResponse: &v1alphareflectionpb.ListServiceResponse{ + Service: svcs, + }, + } + } + case *v1reflectionpb.ServerReflectionResponse_ErrorResponse: + if mr != nil { + v1alpha.MessageResponse = &v1alphareflectionpb.ServerReflectionResponse_ErrorResponse{ + ErrorResponse: &v1alphareflectionpb.ErrorResponse{ + ErrorCode: mr.ErrorResponse.GetErrorCode(), + ErrorMessage: mr.ErrorResponse.GetErrorMessage(), + }, + } + } + default: + // no value set + } + return &v1alpha +} + +// V1AlphaToV1Request converts a v1alpha ServerReflectionRequest to a v1. +func V1AlphaToV1Request(v1alpha *v1alphareflectionpb.ServerReflectionRequest) *v1reflectionpb.ServerReflectionRequest { + var v1 v1reflectionpb.ServerReflectionRequest + v1.Host = v1alpha.Host + switch mr := v1alpha.MessageRequest.(type) { + case *v1alphareflectionpb.ServerReflectionRequest_FileByFilename: + v1.MessageRequest = &v1reflectionpb.ServerReflectionRequest_FileByFilename{ + FileByFilename: mr.FileByFilename, + } + case *v1alphareflectionpb.ServerReflectionRequest_FileContainingSymbol: + v1.MessageRequest = &v1reflectionpb.ServerReflectionRequest_FileContainingSymbol{ + FileContainingSymbol: mr.FileContainingSymbol, + } + case *v1alphareflectionpb.ServerReflectionRequest_FileContainingExtension: + if mr.FileContainingExtension != nil { + v1.MessageRequest = &v1reflectionpb.ServerReflectionRequest_FileContainingExtension{ + FileContainingExtension: &v1reflectionpb.ExtensionRequest{ + ContainingType: mr.FileContainingExtension.GetContainingType(), + ExtensionNumber: mr.FileContainingExtension.GetExtensionNumber(), + }, + } + } + case *v1alphareflectionpb.ServerReflectionRequest_AllExtensionNumbersOfType: + v1.MessageRequest = &v1reflectionpb.ServerReflectionRequest_AllExtensionNumbersOfType{ + AllExtensionNumbersOfType: mr.AllExtensionNumbersOfType, + } + case *v1alphareflectionpb.ServerReflectionRequest_ListServices: + v1.MessageRequest = &v1reflectionpb.ServerReflectionRequest_ListServices{ + ListServices: mr.ListServices, + } + default: + // no value set + } + return &v1 +} + +// V1ToV1AlphaRequest converts a v1 ServerReflectionRequest to a v1alpha. +func V1ToV1AlphaRequest(v1 *v1reflectionpb.ServerReflectionRequest) *v1alphareflectionpb.ServerReflectionRequest { + var v1alpha v1alphareflectionpb.ServerReflectionRequest + v1alpha.Host = v1.Host + switch mr := v1.MessageRequest.(type) { + case *v1reflectionpb.ServerReflectionRequest_FileByFilename: + if mr != nil { + v1alpha.MessageRequest = &v1alphareflectionpb.ServerReflectionRequest_FileByFilename{ + FileByFilename: mr.FileByFilename, + } + } + case *v1reflectionpb.ServerReflectionRequest_FileContainingSymbol: + if mr != nil { + v1alpha.MessageRequest = &v1alphareflectionpb.ServerReflectionRequest_FileContainingSymbol{ + FileContainingSymbol: mr.FileContainingSymbol, + } + } + case *v1reflectionpb.ServerReflectionRequest_FileContainingExtension: + if mr != nil { + v1alpha.MessageRequest = &v1alphareflectionpb.ServerReflectionRequest_FileContainingExtension{ + FileContainingExtension: &v1alphareflectionpb.ExtensionRequest{ + ContainingType: mr.FileContainingExtension.GetContainingType(), + ExtensionNumber: mr.FileContainingExtension.GetExtensionNumber(), + }, + } + } + case *v1reflectionpb.ServerReflectionRequest_AllExtensionNumbersOfType: + if mr != nil { + v1alpha.MessageRequest = &v1alphareflectionpb.ServerReflectionRequest_AllExtensionNumbersOfType{ + AllExtensionNumbersOfType: mr.AllExtensionNumbersOfType, + } + } + case *v1reflectionpb.ServerReflectionRequest_ListServices: + if mr != nil { + v1alpha.MessageRequest = &v1alphareflectionpb.ServerReflectionRequest_ListServices{ + ListServices: mr.ListServices, + } + } + default: + // no value set + } + return &v1alpha +} + +// V1AlphaToV1Response converts a v1alpha ServerReflectionResponse to a v1. +func V1AlphaToV1Response(v1alpha *v1alphareflectionpb.ServerReflectionResponse) *v1reflectionpb.ServerReflectionResponse { + var v1 v1reflectionpb.ServerReflectionResponse + v1.ValidHost = v1alpha.ValidHost + if v1alpha.OriginalRequest != nil { + v1.OriginalRequest = V1AlphaToV1Request(v1alpha.OriginalRequest) + } + switch mr := v1alpha.MessageResponse.(type) { + case *v1alphareflectionpb.ServerReflectionResponse_FileDescriptorResponse: + if mr != nil { + v1.MessageResponse = &v1reflectionpb.ServerReflectionResponse_FileDescriptorResponse{ + FileDescriptorResponse: &v1reflectionpb.FileDescriptorResponse{ + FileDescriptorProto: mr.FileDescriptorResponse.GetFileDescriptorProto(), + }, + } + } + case *v1alphareflectionpb.ServerReflectionResponse_AllExtensionNumbersResponse: + if mr != nil { + v1.MessageResponse = &v1reflectionpb.ServerReflectionResponse_AllExtensionNumbersResponse{ + AllExtensionNumbersResponse: &v1reflectionpb.ExtensionNumberResponse{ + BaseTypeName: mr.AllExtensionNumbersResponse.GetBaseTypeName(), + ExtensionNumber: mr.AllExtensionNumbersResponse.GetExtensionNumber(), + }, + } + } + case *v1alphareflectionpb.ServerReflectionResponse_ListServicesResponse: + if mr != nil { + svcs := make([]*v1reflectionpb.ServiceResponse, len(mr.ListServicesResponse.GetService())) + for i, svc := range mr.ListServicesResponse.GetService() { + svcs[i] = &v1reflectionpb.ServiceResponse{ + Name: svc.GetName(), + } + } + v1.MessageResponse = &v1reflectionpb.ServerReflectionResponse_ListServicesResponse{ + ListServicesResponse: &v1reflectionpb.ListServiceResponse{ + Service: svcs, + }, + } + } + case *v1alphareflectionpb.ServerReflectionResponse_ErrorResponse: + if mr != nil { + v1.MessageResponse = &v1reflectionpb.ServerReflectionResponse_ErrorResponse{ + ErrorResponse: &v1reflectionpb.ErrorResponse{ + ErrorCode: mr.ErrorResponse.GetErrorCode(), + ErrorMessage: mr.ErrorResponse.GetErrorMessage(), + }, + } + } + default: + // no value set + } + return &v1 +} diff --git a/vendor/google.golang.org/grpc/reflection/serverreflection.go b/vendor/google.golang.org/grpc/reflection/serverreflection.go index c3b408392..13a94e2dd 100644 --- a/vendor/google.golang.org/grpc/reflection/serverreflection.go +++ b/vendor/google.golang.org/grpc/reflection/serverreflection.go @@ -37,19 +37,13 @@ To register server reflection on a gRPC server: package reflection // import "google.golang.org/grpc/reflection" import ( - "io" - "sort" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" - "google.golang.org/protobuf/proto" + "google.golang.org/grpc/reflection/internal" "google.golang.org/protobuf/reflect/protodesc" "google.golang.org/protobuf/reflect/protoreflect" "google.golang.org/protobuf/reflect/protoregistry" v1reflectiongrpc "google.golang.org/grpc/reflection/grpc_reflection_v1" - v1reflectionpb "google.golang.org/grpc/reflection/grpc_reflection_v1" v1alphareflectiongrpc "google.golang.org/grpc/reflection/grpc_reflection_v1alpha" ) @@ -158,203 +152,9 @@ func NewServerV1(opts ServerOptions) v1reflectiongrpc.ServerReflectionServer { if opts.ExtensionResolver == nil { opts.ExtensionResolver = protoregistry.GlobalTypes } - return &serverReflectionServer{ - s: opts.Services, - descResolver: opts.DescriptorResolver, - extResolver: opts.ExtensionResolver, - } -} - -type serverReflectionServer struct { - v1alphareflectiongrpc.UnimplementedServerReflectionServer - s ServiceInfoProvider - descResolver protodesc.Resolver - extResolver ExtensionResolver -} - -// fileDescWithDependencies returns a slice of serialized fileDescriptors in -// wire format ([]byte). The fileDescriptors will include fd and all the -// transitive dependencies of fd with names not in sentFileDescriptors. -func (s *serverReflectionServer) fileDescWithDependencies(fd protoreflect.FileDescriptor, sentFileDescriptors map[string]bool) ([][]byte, error) { - if fd.IsPlaceholder() { - // If the given root file is a placeholder, treat it - // as missing instead of serializing it. - return nil, protoregistry.NotFound - } - var r [][]byte - queue := []protoreflect.FileDescriptor{fd} - for len(queue) > 0 { - currentfd := queue[0] - queue = queue[1:] - if currentfd.IsPlaceholder() { - // Skip any missing files in the dependency graph. - continue - } - if sent := sentFileDescriptors[currentfd.Path()]; len(r) == 0 || !sent { - sentFileDescriptors[currentfd.Path()] = true - fdProto := protodesc.ToFileDescriptorProto(currentfd) - currentfdEncoded, err := proto.Marshal(fdProto) - if err != nil { - return nil, err - } - r = append(r, currentfdEncoded) - } - for i := 0; i < currentfd.Imports().Len(); i++ { - queue = append(queue, currentfd.Imports().Get(i)) - } - } - return r, nil -} - -// fileDescEncodingContainingSymbol finds the file descriptor containing the -// given symbol, finds all of its previously unsent transitive dependencies, -// does marshalling on them, and returns the marshalled result. The given symbol -// can be a type, a service or a method. -func (s *serverReflectionServer) fileDescEncodingContainingSymbol(name string, sentFileDescriptors map[string]bool) ([][]byte, error) { - d, err := s.descResolver.FindDescriptorByName(protoreflect.FullName(name)) - if err != nil { - return nil, err - } - return s.fileDescWithDependencies(d.ParentFile(), sentFileDescriptors) -} - -// fileDescEncodingContainingExtension finds the file descriptor containing -// given extension, finds all of its previously unsent transitive dependencies, -// does marshalling on them, and returns the marshalled result. -func (s *serverReflectionServer) fileDescEncodingContainingExtension(typeName string, extNum int32, sentFileDescriptors map[string]bool) ([][]byte, error) { - xt, err := s.extResolver.FindExtensionByNumber(protoreflect.FullName(typeName), protoreflect.FieldNumber(extNum)) - if err != nil { - return nil, err - } - return s.fileDescWithDependencies(xt.TypeDescriptor().ParentFile(), sentFileDescriptors) -} - -// allExtensionNumbersForTypeName returns all extension numbers for the given type. -func (s *serverReflectionServer) allExtensionNumbersForTypeName(name string) ([]int32, error) { - var numbers []int32 - s.extResolver.RangeExtensionsByMessage(protoreflect.FullName(name), func(xt protoreflect.ExtensionType) bool { - numbers = append(numbers, int32(xt.TypeDescriptor().Number())) - return true - }) - sort.Slice(numbers, func(i, j int) bool { - return numbers[i] < numbers[j] - }) - if len(numbers) == 0 { - // maybe return an error if given type name is not known - if _, err := s.descResolver.FindDescriptorByName(protoreflect.FullName(name)); err != nil { - return nil, err - } - } - return numbers, nil -} - -// listServices returns the names of services this server exposes. -func (s *serverReflectionServer) listServices() []*v1reflectionpb.ServiceResponse { - serviceInfo := s.s.GetServiceInfo() - resp := make([]*v1reflectionpb.ServiceResponse, 0, len(serviceInfo)) - for svc := range serviceInfo { - resp = append(resp, &v1reflectionpb.ServiceResponse{Name: svc}) - } - sort.Slice(resp, func(i, j int) bool { - return resp[i].Name < resp[j].Name - }) - return resp -} - -// ServerReflectionInfo is the reflection service handler. -func (s *serverReflectionServer) ServerReflectionInfo(stream v1reflectiongrpc.ServerReflection_ServerReflectionInfoServer) error { - sentFileDescriptors := make(map[string]bool) - for { - in, err := stream.Recv() - if err == io.EOF { - return nil - } - if err != nil { - return err - } - - out := &v1reflectionpb.ServerReflectionResponse{ - ValidHost: in.Host, - OriginalRequest: in, - } - switch req := in.MessageRequest.(type) { - case *v1reflectionpb.ServerReflectionRequest_FileByFilename: - var b [][]byte - fd, err := s.descResolver.FindFileByPath(req.FileByFilename) - if err == nil { - b, err = s.fileDescWithDependencies(fd, sentFileDescriptors) - } - if err != nil { - out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_ErrorResponse{ - ErrorResponse: &v1reflectionpb.ErrorResponse{ - ErrorCode: int32(codes.NotFound), - ErrorMessage: err.Error(), - }, - } - } else { - out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_FileDescriptorResponse{ - FileDescriptorResponse: &v1reflectionpb.FileDescriptorResponse{FileDescriptorProto: b}, - } - } - case *v1reflectionpb.ServerReflectionRequest_FileContainingSymbol: - b, err := s.fileDescEncodingContainingSymbol(req.FileContainingSymbol, sentFileDescriptors) - if err != nil { - out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_ErrorResponse{ - ErrorResponse: &v1reflectionpb.ErrorResponse{ - ErrorCode: int32(codes.NotFound), - ErrorMessage: err.Error(), - }, - } - } else { - out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_FileDescriptorResponse{ - FileDescriptorResponse: &v1reflectionpb.FileDescriptorResponse{FileDescriptorProto: b}, - } - } - case *v1reflectionpb.ServerReflectionRequest_FileContainingExtension: - typeName := req.FileContainingExtension.ContainingType - extNum := req.FileContainingExtension.ExtensionNumber - b, err := s.fileDescEncodingContainingExtension(typeName, extNum, sentFileDescriptors) - if err != nil { - out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_ErrorResponse{ - ErrorResponse: &v1reflectionpb.ErrorResponse{ - ErrorCode: int32(codes.NotFound), - ErrorMessage: err.Error(), - }, - } - } else { - out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_FileDescriptorResponse{ - FileDescriptorResponse: &v1reflectionpb.FileDescriptorResponse{FileDescriptorProto: b}, - } - } - case *v1reflectionpb.ServerReflectionRequest_AllExtensionNumbersOfType: - extNums, err := s.allExtensionNumbersForTypeName(req.AllExtensionNumbersOfType) - if err != nil { - out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_ErrorResponse{ - ErrorResponse: &v1reflectionpb.ErrorResponse{ - ErrorCode: int32(codes.NotFound), - ErrorMessage: err.Error(), - }, - } - } else { - out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_AllExtensionNumbersResponse{ - AllExtensionNumbersResponse: &v1reflectionpb.ExtensionNumberResponse{ - BaseTypeName: req.AllExtensionNumbersOfType, - ExtensionNumber: extNums, - }, - } - } - case *v1reflectionpb.ServerReflectionRequest_ListServices: - out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_ListServicesResponse{ - ListServicesResponse: &v1reflectionpb.ListServiceResponse{ - Service: s.listServices(), - }, - } - default: - return status.Errorf(codes.InvalidArgument, "invalid MessageRequest: %v", in.MessageRequest) - } - - if err := stream.Send(out); err != nil { - return err - } + return &internal.ServerReflectionServer{ + S: opts.Services, + DescResolver: opts.DescriptorResolver, + ExtResolver: opts.ExtensionResolver, } } diff --git a/vendor/google.golang.org/grpc/regenerate.sh b/vendor/google.golang.org/grpc/regenerate.sh index a6f26c8ab..3edca296c 100644 --- a/vendor/google.golang.org/grpc/regenerate.sh +++ b/vendor/google.golang.org/grpc/regenerate.sh @@ -63,7 +63,7 @@ LEGACY_SOURCES=( # Generates only the new gRPC Service symbols SOURCES=( - $(git ls-files --exclude-standard --cached --others "*.proto" | grep -v '^\(profiling/proto/service.proto\|reflection/grpc_reflection_v1alpha/reflection.proto\)$') + $(git ls-files --exclude-standard --cached --others "*.proto" | grep -v '^profiling/proto/service.proto$') ${WORKDIR}/grpc-proto/grpc/gcp/altscontext.proto ${WORKDIR}/grpc-proto/grpc/gcp/handshaker.proto ${WORKDIR}/grpc-proto/grpc/gcp/transport_security_common.proto @@ -93,7 +93,7 @@ Mgrpc/testing/empty.proto=google.golang.org/grpc/interop/grpc_testing for src in ${SOURCES[@]}; do echo "protoc ${src}" - protoc --go_out=${OPTS}:${WORKDIR}/out --go-grpc_out=${OPTS}:${WORKDIR}/out \ + protoc --go_out=${OPTS}:${WORKDIR}/out --go-grpc_out=${OPTS},use_generic_streams_experimental=true:${WORKDIR}/out \ -I"." \ -I${WORKDIR}/grpc-proto \ -I${WORKDIR}/googleapis \ @@ -118,6 +118,6 @@ mv ${WORKDIR}/out/google.golang.org/grpc/lookup/grpc_lookup_v1/* ${WORKDIR}/out/ # grpc_testing_not_regenerate/*.pb.go are not re-generated, # see grpc_testing_not_regenerate/README.md for details. -rm ${WORKDIR}/out/google.golang.org/grpc/reflection/grpc_testing_not_regenerate/*.pb.go +rm ${WORKDIR}/out/google.golang.org/grpc/reflection/test/grpc_testing_not_regenerate/*.pb.go cp -R ${WORKDIR}/out/google.golang.org/grpc/* . diff --git a/vendor/google.golang.org/grpc/resolver/dns/dns_resolver.go b/vendor/google.golang.org/grpc/resolver/dns/dns_resolver.go index b54a3a322..ef3d6ed6c 100644 --- a/vendor/google.golang.org/grpc/resolver/dns/dns_resolver.go +++ b/vendor/google.golang.org/grpc/resolver/dns/dns_resolver.go @@ -18,9 +18,6 @@ // Package dns implements a dns resolver to be installed as the default resolver // in grpc. -// -// Deprecated: this package is imported by grpc and should not need to be -// imported directly by users. package dns import ( @@ -52,3 +49,12 @@ func SetResolvingTimeout(timeout time.Duration) { func NewBuilder() resolver.Builder { return dns.NewBuilder() } + +// SetMinResolutionInterval sets the default minimum interval at which DNS +// re-resolutions are allowed. This helps to prevent excessive re-resolution. +// +// It must be called only at application startup, before any gRPC calls are +// made. Modifying this value after initialization is not thread-safe. +func SetMinResolutionInterval(d time.Duration) { + dns.MinResolutionInterval = d +} diff --git a/vendor/google.golang.org/grpc/resolver_wrapper.go b/vendor/google.golang.org/grpc/resolver_wrapper.go index 9dcc9780f..c5fb45236 100644 --- a/vendor/google.golang.org/grpc/resolver_wrapper.go +++ b/vendor/google.golang.org/grpc/resolver_wrapper.go @@ -171,7 +171,7 @@ func (ccr *ccResolverWrapper) NewAddress(addrs []resolver.Address) { // ParseServiceConfig is called by resolver implementations to parse a JSON // representation of the service config. func (ccr *ccResolverWrapper) ParseServiceConfig(scJSON string) *serviceconfig.ParseResult { - return parseServiceConfig(scJSON) + return parseServiceConfig(scJSON, ccr.cc.dopts.maxCallAttempts) } // addChannelzTraceEvent adds a channelz trace event containing the new diff --git a/vendor/google.golang.org/grpc/rpc_util.go b/vendor/google.golang.org/grpc/rpc_util.go index 998e251dd..fdd49e6e9 100644 --- a/vendor/google.golang.org/grpc/rpc_util.go +++ b/vendor/google.golang.org/grpc/rpc_util.go @@ -964,7 +964,7 @@ func setCallInfoCodec(c *callInfo) error { // The SupportPackageIsVersion variables are referenced from generated protocol // buffer files to ensure compatibility with the gRPC version used. The latest -// support package version is 7. +// support package version is 9. // // Older versions are kept for compatibility. // @@ -976,6 +976,7 @@ const ( SupportPackageIsVersion6 = true SupportPackageIsVersion7 = true SupportPackageIsVersion8 = true + SupportPackageIsVersion9 = true ) const grpcUA = "grpc-go/" + Version diff --git a/vendor/google.golang.org/grpc/server.go b/vendor/google.golang.org/grpc/server.go index fd4558daa..89f8e4792 100644 --- a/vendor/google.golang.org/grpc/server.go +++ b/vendor/google.golang.org/grpc/server.go @@ -527,12 +527,22 @@ func ConnectionTimeout(d time.Duration) ServerOption { }) } +// MaxHeaderListSizeServerOption is a ServerOption that sets the max +// (uncompressed) size of header list that the server is prepared to accept. +type MaxHeaderListSizeServerOption struct { + MaxHeaderListSize uint32 +} + +func (o MaxHeaderListSizeServerOption) apply(so *serverOptions) { + so.maxHeaderListSize = &o.MaxHeaderListSize +} + // MaxHeaderListSize returns a ServerOption that sets the max (uncompressed) size // of header list that the server is prepared to accept. func MaxHeaderListSize(s uint32) ServerOption { - return newFuncServerOption(func(o *serverOptions) { - o.maxHeaderListSize = &s - }) + return MaxHeaderListSizeServerOption{ + MaxHeaderListSize: s, + } } // HeaderTableSize returns a ServerOption that sets the size of dynamic diff --git a/vendor/google.golang.org/grpc/service_config.go b/vendor/google.golang.org/grpc/service_config.go index 2b35c5d21..2671c5ef6 100644 --- a/vendor/google.golang.org/grpc/service_config.go +++ b/vendor/google.golang.org/grpc/service_config.go @@ -26,6 +26,7 @@ import ( "time" "google.golang.org/grpc/balancer" + "google.golang.org/grpc/balancer/pickfirst" "google.golang.org/grpc/codes" "google.golang.org/grpc/internal" "google.golang.org/grpc/internal/balancer/gracefulswitch" @@ -163,16 +164,18 @@ type jsonSC struct { } func init() { - internal.ParseServiceConfig = parseServiceConfig + internal.ParseServiceConfig = func(js string) *serviceconfig.ParseResult { + return parseServiceConfig(js, defaultMaxCallAttempts) + } } -func parseServiceConfig(js string) *serviceconfig.ParseResult { +func parseServiceConfig(js string, maxAttempts int) *serviceconfig.ParseResult { if len(js) == 0 { return &serviceconfig.ParseResult{Err: fmt.Errorf("no JSON service config provided")} } var rsc jsonSC err := json.Unmarshal([]byte(js), &rsc) if err != nil { - logger.Warningf("grpc: unmarshaling service config %s: %v", js, err) + logger.Warningf("grpc: unmarshalling service config %s: %v", js, err) return &serviceconfig.ParseResult{Err: err} } sc := ServiceConfig{ @@ -183,12 +186,12 @@ func parseServiceConfig(js string) *serviceconfig.ParseResult { } c := rsc.LoadBalancingConfig if c == nil { - name := PickFirstBalancerName + name := pickfirst.Name if rsc.LoadBalancingPolicy != nil { name = *rsc.LoadBalancingPolicy } if balancer.Get(name) == nil { - name = PickFirstBalancerName + name = pickfirst.Name } cfg := []map[string]any{{name: struct{}{}}} strCfg, err := json.Marshal(cfg) @@ -218,8 +221,8 @@ func parseServiceConfig(js string) *serviceconfig.ParseResult { WaitForReady: m.WaitForReady, Timeout: (*time.Duration)(m.Timeout), } - if mc.RetryPolicy, err = convertRetryPolicy(m.RetryPolicy); err != nil { - logger.Warningf("grpc: unmarshaling service config %s: %v", js, err) + if mc.RetryPolicy, err = convertRetryPolicy(m.RetryPolicy, maxAttempts); err != nil { + logger.Warningf("grpc: unmarshalling service config %s: %v", js, err) return &serviceconfig.ParseResult{Err: err} } if m.MaxRequestMessageBytes != nil { @@ -239,13 +242,13 @@ func parseServiceConfig(js string) *serviceconfig.ParseResult { for i, n := range *m.Name { path, err := n.generatePath() if err != nil { - logger.Warningf("grpc: error unmarshaling service config %s due to methodConfig[%d]: %v", js, i, err) + logger.Warningf("grpc: error unmarshalling service config %s due to methodConfig[%d]: %v", js, i, err) return &serviceconfig.ParseResult{Err: err} } if _, ok := paths[path]; ok { err = errDuplicatedName - logger.Warningf("grpc: error unmarshaling service config %s due to methodConfig[%d]: %v", js, i, err) + logger.Warningf("grpc: error unmarshalling service config %s due to methodConfig[%d]: %v", js, i, err) return &serviceconfig.ParseResult{Err: err} } paths[path] = struct{}{} @@ -264,7 +267,7 @@ func parseServiceConfig(js string) *serviceconfig.ParseResult { return &serviceconfig.ParseResult{Config: &sc} } -func convertRetryPolicy(jrp *jsonRetryPolicy) (p *internalserviceconfig.RetryPolicy, err error) { +func convertRetryPolicy(jrp *jsonRetryPolicy, maxAttempts int) (p *internalserviceconfig.RetryPolicy, err error) { if jrp == nil { return nil, nil } @@ -278,17 +281,16 @@ func convertRetryPolicy(jrp *jsonRetryPolicy) (p *internalserviceconfig.RetryPol return nil, nil } + if jrp.MaxAttempts < maxAttempts { + maxAttempts = jrp.MaxAttempts + } rp := &internalserviceconfig.RetryPolicy{ - MaxAttempts: jrp.MaxAttempts, + MaxAttempts: maxAttempts, InitialBackoff: time.Duration(jrp.InitialBackoff), MaxBackoff: time.Duration(jrp.MaxBackoff), BackoffMultiplier: jrp.BackoffMultiplier, RetryableStatusCodes: make(map[codes.Code]bool), } - if rp.MaxAttempts > 5 { - // TODO(retry): Make the max maxAttempts configurable. - rp.MaxAttempts = 5 - } for _, code := range jrp.RetryableStatusCodes { rp.RetryableStatusCodes[code] = true } diff --git a/vendor/google.golang.org/grpc/stats/stats.go b/vendor/google.golang.org/grpc/stats/stats.go index 4ab70e2d4..fdb0bd651 100644 --- a/vendor/google.golang.org/grpc/stats/stats.go +++ b/vendor/google.golang.org/grpc/stats/stats.go @@ -73,9 +73,12 @@ func (*PickerUpdated) isRPCStats() {} type InPayload struct { // Client is true if this InPayload is from client side. Client bool - // Payload is the payload with original type. + // Payload is the payload with original type. This may be modified after + // the call to HandleRPC which provides the InPayload returns and must be + // copied if needed later. Payload any // Data is the serialized message payload. + // Deprecated: Data will be removed in the next release. Data []byte // Length is the size of the uncompressed payload data. Does not include any @@ -143,9 +146,12 @@ func (s *InTrailer) isRPCStats() {} type OutPayload struct { // Client is true if this OutPayload is from client side. Client bool - // Payload is the payload with original type. + // Payload is the payload with original type. This may be modified after + // the call to HandleRPC which provides the OutPayload returns and must be + // copied if needed later. Payload any // Data is the serialized message payload. + // Deprecated: Data will be removed in the next release. Data []byte // Length is the size of the uncompressed payload data. Does not include any // framing (gRPC or HTTP/2). diff --git a/vendor/google.golang.org/grpc/stream.go b/vendor/google.golang.org/grpc/stream.go index d939ffc63..8051ef5b5 100644 --- a/vendor/google.golang.org/grpc/stream.go +++ b/vendor/google.golang.org/grpc/stream.go @@ -23,6 +23,7 @@ import ( "errors" "io" "math" + "math/rand" "strconv" "sync" "time" @@ -34,7 +35,6 @@ import ( "google.golang.org/grpc/internal/balancerload" "google.golang.org/grpc/internal/binarylog" "google.golang.org/grpc/internal/channelz" - "google.golang.org/grpc/internal/grpcrand" "google.golang.org/grpc/internal/grpcutil" imetadata "google.golang.org/grpc/internal/metadata" iresolver "google.golang.org/grpc/internal/resolver" @@ -516,6 +516,7 @@ func (a *csAttempt) newStream() error { return toRPCErr(nse.Err) } a.s = s + a.ctx = s.Context() a.p = &parser{r: s, recvBufferPool: a.cs.cc.dopts.recvBufferPool} return nil } @@ -698,7 +699,7 @@ func (a *csAttempt) shouldRetry(err error) (bool, error) { if max := float64(rp.MaxBackoff); cur > max { cur = max } - dur = time.Duration(grpcrand.Int63n(int64(cur))) + dur = time.Duration(rand.Int63n(int64(cur))) cs.numRetriesSincePushback++ } diff --git a/vendor/google.golang.org/grpc/stream_interfaces.go b/vendor/google.golang.org/grpc/stream_interfaces.go new file mode 100644 index 000000000..8b813529c --- /dev/null +++ b/vendor/google.golang.org/grpc/stream_interfaces.go @@ -0,0 +1,152 @@ +/* + * + * Copyright 2024 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package grpc + +// ServerStreamingClient represents the client side of a server-streaming (one +// request, many responses) RPC. It is generic over the type of the response +// message. It is used in generated code. +type ServerStreamingClient[Res any] interface { + Recv() (*Res, error) + ClientStream +} + +// ServerStreamingServer represents the server side of a server-streaming (one +// request, many responses) RPC. It is generic over the type of the response +// message. It is used in generated code. +type ServerStreamingServer[Res any] interface { + Send(*Res) error + ServerStream +} + +// ClientStreamingClient represents the client side of a client-streaming (many +// requests, one response) RPC. It is generic over both the type of the request +// message stream and the type of the unary response message. It is used in +// generated code. +type ClientStreamingClient[Req any, Res any] interface { + Send(*Req) error + CloseAndRecv() (*Res, error) + ClientStream +} + +// ClientStreamingServer represents the server side of a client-streaming (many +// requests, one response) RPC. It is generic over both the type of the request +// message stream and the type of the unary response message. It is used in +// generated code. +type ClientStreamingServer[Req any, Res any] interface { + Recv() (*Req, error) + SendAndClose(*Res) error + ServerStream +} + +// BidiStreamingClient represents the client side of a bidirectional-streaming +// (many requests, many responses) RPC. It is generic over both the type of the +// request message stream and the type of the response message stream. It is +// used in generated code. +type BidiStreamingClient[Req any, Res any] interface { + Send(*Req) error + Recv() (*Res, error) + ClientStream +} + +// BidiStreamingServer represents the server side of a bidirectional-streaming +// (many requests, many responses) RPC. It is generic over both the type of the +// request message stream and the type of the response message stream. It is +// used in generated code. +type BidiStreamingServer[Req any, Res any] interface { + Recv() (*Req, error) + Send(*Res) error + ServerStream +} + +// GenericClientStream implements the ServerStreamingClient, ClientStreamingClient, +// and BidiStreamingClient interfaces. It is used in generated code. +type GenericClientStream[Req any, Res any] struct { + ClientStream +} + +var _ ServerStreamingClient[string] = (*GenericClientStream[int, string])(nil) +var _ ClientStreamingClient[int, string] = (*GenericClientStream[int, string])(nil) +var _ BidiStreamingClient[int, string] = (*GenericClientStream[int, string])(nil) + +// Send pushes one message into the stream of requests to be consumed by the +// server. The type of message which can be sent is determined by the Req type +// parameter of the GenericClientStream receiver. +func (x *GenericClientStream[Req, Res]) Send(m *Req) error { + return x.ClientStream.SendMsg(m) +} + +// Recv reads one message from the stream of responses generated by the server. +// The type of the message returned is determined by the Res type parameter +// of the GenericClientStream receiver. +func (x *GenericClientStream[Req, Res]) Recv() (*Res, error) { + m := new(Res) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +// CloseAndRecv closes the sending side of the stream, then receives the unary +// response from the server. The type of message which it returns is determined +// by the Res type parameter of the GenericClientStream receiver. +func (x *GenericClientStream[Req, Res]) CloseAndRecv() (*Res, error) { + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + m := new(Res) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +// GenericServerStream implements the ServerStreamingServer, ClientStreamingServer, +// and BidiStreamingServer interfaces. It is used in generated code. +type GenericServerStream[Req any, Res any] struct { + ServerStream +} + +var _ ServerStreamingServer[string] = (*GenericServerStream[int, string])(nil) +var _ ClientStreamingServer[int, string] = (*GenericServerStream[int, string])(nil) +var _ BidiStreamingServer[int, string] = (*GenericServerStream[int, string])(nil) + +// Send pushes one message into the stream of responses to be consumed by the +// client. The type of message which can be sent is determined by the Res +// type parameter of the serverStreamServer receiver. +func (x *GenericServerStream[Req, Res]) Send(m *Res) error { + return x.ServerStream.SendMsg(m) +} + +// SendAndClose pushes the unary response to the client. The type of message +// which can be sent is determined by the Res type parameter of the +// clientStreamServer receiver. +func (x *GenericServerStream[Req, Res]) SendAndClose(m *Res) error { + return x.ServerStream.SendMsg(m) +} + +// Recv reads one message from the stream of requests generated by the client. +// The type of the message returned is determined by the Req type parameter +// of the clientStreamServer receiver. +func (x *GenericServerStream[Req, Res]) Recv() (*Req, error) { + m := new(Req) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} diff --git a/vendor/google.golang.org/grpc/version.go b/vendor/google.golang.org/grpc/version.go index 2556f7583..bafaef99b 100644 --- a/vendor/google.golang.org/grpc/version.go +++ b/vendor/google.golang.org/grpc/version.go @@ -19,4 +19,4 @@ package grpc // Version is the current grpc version. -const Version = "1.63.2" +const Version = "1.65.0" diff --git a/vendor/google.golang.org/grpc/vet.sh b/vendor/google.golang.org/grpc/vet.sh deleted file mode 100644 index 7e6b92e49..000000000 --- a/vendor/google.golang.org/grpc/vet.sh +++ /dev/null @@ -1,195 +0,0 @@ -#!/bin/bash - -set -ex # Exit on error; debugging enabled. -set -o pipefail # Fail a pipe if any sub-command fails. - -# not makes sure the command passed to it does not exit with a return code of 0. -not() { - # This is required instead of the earlier (! $COMMAND) because subshells and - # pipefail don't work the same on Darwin as in Linux. - ! "$@" -} - -die() { - echo "$@" >&2 - exit 1 -} - -fail_on_output() { - tee /dev/stderr | not read -} - -# Check to make sure it's safe to modify the user's git repo. -git status --porcelain | fail_on_output - -# Undo any edits made by this script. -cleanup() { - git reset --hard HEAD -} -trap cleanup EXIT - -PATH="${HOME}/go/bin:${GOROOT}/bin:${PATH}" -go version - -if [[ "$1" = "-install" ]]; then - # Install the pinned versions as defined in module tools. - pushd ./test/tools - go install \ - golang.org/x/tools/cmd/goimports \ - honnef.co/go/tools/cmd/staticcheck \ - github.com/client9/misspell/cmd/misspell - popd - if [[ -z "${VET_SKIP_PROTO}" ]]; then - if [[ "${GITHUB_ACTIONS}" = "true" ]]; then - PROTOBUF_VERSION=25.2 # a.k.a. v4.22.0 in pb.go files. - PROTOC_FILENAME=protoc-${PROTOBUF_VERSION}-linux-x86_64.zip - pushd /home/runner/go - wget https://github.com/google/protobuf/releases/download/v${PROTOBUF_VERSION}/${PROTOC_FILENAME} - unzip ${PROTOC_FILENAME} - bin/protoc --version - popd - elif not which protoc > /dev/null; then - die "Please install protoc into your path" - fi - fi - exit 0 -elif [[ "$#" -ne 0 ]]; then - die "Unknown argument(s): $*" -fi - -# - Check that generated proto files are up to date. -if [[ -z "${VET_SKIP_PROTO}" ]]; then - make proto && git status --porcelain 2>&1 | fail_on_output || \ - (git status; git --no-pager diff; exit 1) -fi - -if [[ -n "${VET_ONLY_PROTO}" ]]; then - exit 0 -fi - -# - Ensure all source files contain a copyright message. -# (Done in two parts because Darwin "git grep" has broken support for compound -# exclusion matches.) -(grep -L "DO NOT EDIT" $(git grep -L "\(Copyright [0-9]\{4,\} gRPC authors\)" -- '*.go') || true) | fail_on_output - -# - Make sure all tests in grpc and grpc/test use leakcheck via Teardown. -not grep 'func Test[^(]' *_test.go -not grep 'func Test[^(]' test/*.go - -# - Check for typos in test function names -git grep 'func (s) ' -- "*_test.go" | not grep -v 'func (s) Test' -git grep 'func [A-Z]' -- "*_test.go" | not grep -v 'func Test\|Benchmark\|Example' - -# - Do not import x/net/context. -not git grep -l 'x/net/context' -- "*.go" - -# - Do not use time.After except in tests. It has the potential to leak the -# timer since there is no way to stop it early. -git grep -l 'time.After(' -- "*.go" | not grep -v '_test.go\|test_utils\|testutils' - -# - Do not import math/rand for real library code. Use internal/grpcrand for -# thread safety. -git grep -l '"math/rand"' -- "*.go" 2>&1 | not grep -v '^examples\|^interop/stress\|grpcrand\|^benchmark\|wrr_test' - -# - Do not use "interface{}"; use "any" instead. -git grep -l 'interface{}' -- "*.go" 2>&1 | not grep -v '\.pb\.go\|protoc-gen-go-grpc\|grpc_testing_not_regenerate' - -# - Do not call grpclog directly. Use grpclog.Component instead. -git grep -l -e 'grpclog.I' --or -e 'grpclog.W' --or -e 'grpclog.E' --or -e 'grpclog.F' --or -e 'grpclog.V' -- "*.go" | not grep -v '^grpclog/component.go\|^internal/grpctest/tlogger_test.go' - -# - Ensure all ptypes proto packages are renamed when importing. -not git grep "\(import \|^\s*\)\"github.com/golang/protobuf/ptypes/" -- "*.go" - -# - Ensure all usages of grpc_testing package are renamed when importing. -not git grep "\(import \|^\s*\)\"google.golang.org/grpc/interop/grpc_testing" -- "*.go" - -# - Ensure all xds proto imports are renamed to *pb or *grpc. -git grep '"github.com/envoyproxy/go-control-plane/envoy' -- '*.go' ':(exclude)*.pb.go' | not grep -v 'pb "\|grpc "' - -misspell -error . - -# - gofmt, goimports, go vet, go mod tidy. -# Perform these checks on each module inside gRPC. -for MOD_FILE in $(find . -name 'go.mod'); do - MOD_DIR=$(dirname ${MOD_FILE}) - pushd ${MOD_DIR} - go vet -all ./... | fail_on_output - gofmt -s -d -l . 2>&1 | fail_on_output - goimports -l . 2>&1 | not grep -vE "\.pb\.go" - - go mod tidy -compat=1.19 - git status --porcelain 2>&1 | fail_on_output || \ - (git status; git --no-pager diff; exit 1) - popd -done - -# - Collection of static analysis checks -SC_OUT="$(mktemp)" -staticcheck -go 1.19 -checks 'all' ./... > "${SC_OUT}" || true - -# Error for anything other than checks that need exclusions. -grep -v "(ST1000)" "${SC_OUT}" | grep -v "(SA1019)" | grep -v "(ST1003)" | not grep -v "(ST1019)\|\(other import of\)" - -# Exclude underscore checks for generated code. -grep "(ST1003)" "${SC_OUT}" | not grep -v '\(.pb.go:\)\|\(code_string_test.go:\)\|\(grpc_testing_not_regenerate\)' - -# Error for duplicate imports not including grpc protos. -grep "(ST1019)\|\(other import of\)" "${SC_OUT}" | not grep -Fv 'XXXXX PleaseIgnoreUnused -channelz/grpc_channelz_v1" -go-control-plane/envoy -grpclb/grpc_lb_v1" -health/grpc_health_v1" -interop/grpc_testing" -orca/v3" -proto/grpc_gcp" -proto/grpc_lookup_v1" -reflection/grpc_reflection_v1" -reflection/grpc_reflection_v1alpha" -XXXXX PleaseIgnoreUnused' - -# Error for any package comments not in generated code. -grep "(ST1000)" "${SC_OUT}" | not grep -v "\.pb\.go:" - -# Only ignore the following deprecated types/fields/functions and exclude -# generated code. -grep "(SA1019)" "${SC_OUT}" | not grep -Fv 'XXXXX PleaseIgnoreUnused -XXXXX Protobuf related deprecation errors: -"github.com/golang/protobuf -.pb.go: -grpc_testing_not_regenerate -: ptypes. -proto.RegisterType -XXXXX gRPC internal usage deprecation errors: -"google.golang.org/grpc -: grpc. -: v1alpha. -: v1alphareflectionpb. -BalancerAttributes is deprecated: -CredsBundle is deprecated: -Metadata is deprecated: use Attributes instead. -NewSubConn is deprecated: -OverrideServerName is deprecated: -RemoveSubConn is deprecated: -SecurityVersion is deprecated: -Target is deprecated: Use the Target field in the BuildOptions instead. -UpdateAddresses is deprecated: -UpdateSubConnState is deprecated: -balancer.ErrTransientFailure is deprecated: -grpc/reflection/v1alpha/reflection.proto -SwitchTo is deprecated: -XXXXX xDS deprecated fields we support -.ExactMatch -.PrefixMatch -.SafeRegexMatch -.SuffixMatch -GetContainsMatch -GetExactMatch -GetMatchSubjectAltNames -GetPrefixMatch -GetSafeRegexMatch -GetSuffixMatch -GetTlsCertificateCertificateProviderInstance -GetValidationContextCertificateProviderInstance -XXXXX PleaseIgnoreUnused' - -echo SUCCESS diff --git a/vendor/modules.txt b/vendor/modules.txt index c45cd868e..ee26bdb09 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -32,7 +32,7 @@ github.com/caarlos0/env/v6 # github.com/cenkalti/backoff/v4 v4.3.0 ## explicit; go 1.18 github.com/cenkalti/backoff/v4 -# github.com/cespare/xxhash/v2 v2.2.0 +# github.com/cespare/xxhash/v2 v2.3.0 ## explicit; go 1.11 github.com/cespare/xxhash/v2 # github.com/cilium/ebpf v0.15.0 @@ -568,7 +568,7 @@ go.opentelemetry.io/proto/otlp/trace/v1 # go.uber.org/atomic v1.9.0 ## explicit; go 1.13 go.uber.org/atomic -# golang.org/x/crypto v0.22.0 +# golang.org/x/crypto v0.23.0 ## explicit; go 1.18 golang.org/x/crypto/argon2 golang.org/x/crypto/blake2b @@ -579,7 +579,7 @@ golang.org/x/crypto/curve25519/internal/field # golang.org/x/exp v0.0.0-20230905200255-921286631fa9 ## explicit; go 1.20 golang.org/x/exp/constraints -# golang.org/x/net v0.24.0 +# golang.org/x/net v0.25.0 ## explicit; go 1.18 golang.org/x/net/context golang.org/x/net/html @@ -595,7 +595,7 @@ golang.org/x/net/proxy golang.org/x/net/publicsuffix golang.org/x/net/trace golang.org/x/net/websocket -# golang.org/x/oauth2 v0.18.0 +# golang.org/x/oauth2 v0.20.0 ## explicit; go 1.18 golang.org/x/oauth2 golang.org/x/oauth2/clientcredentials @@ -607,10 +607,10 @@ golang.org/x/sys/plan9 golang.org/x/sys/unix golang.org/x/sys/windows golang.org/x/sys/windows/registry -# golang.org/x/term v0.19.0 +# golang.org/x/term v0.20.0 ## explicit; go 1.18 golang.org/x/term -# golang.org/x/text v0.14.0 +# golang.org/x/text v0.15.0 ## explicit; go 1.18 golang.org/x/text/secure/bidirule golang.org/x/text/transform @@ -619,30 +619,22 @@ golang.org/x/text/unicode/norm # golang.org/x/time v0.5.0 ## explicit; go 1.18 golang.org/x/time/rate -# google.golang.org/appengine v1.6.8 -## explicit; go 1.11 -google.golang.org/appengine/internal -google.golang.org/appengine/internal/base -google.golang.org/appengine/internal/datastore -google.golang.org/appengine/internal/log -google.golang.org/appengine/internal/remote_api -google.golang.org/appengine/internal/urlfetch -google.golang.org/appengine/urlfetch -# google.golang.org/genproto/googleapis/api v0.0.0-20240311132316-a219d84964c2 -## explicit; go 1.19 +# google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157 +## explicit; go 1.20 google.golang.org/genproto/googleapis/api/httpbody -# google.golang.org/genproto/googleapis/rpc v0.0.0-20240415180920-8c6c420018be -## explicit; go 1.19 +# google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 +## explicit; go 1.20 google.golang.org/genproto/googleapis/rpc/errdetails google.golang.org/genproto/googleapis/rpc/status -# google.golang.org/grpc v1.63.2 -## explicit; go 1.19 +# google.golang.org/grpc v1.65.0 +## explicit; go 1.21 google.golang.org/grpc google.golang.org/grpc/attributes google.golang.org/grpc/backoff google.golang.org/grpc/balancer google.golang.org/grpc/balancer/base google.golang.org/grpc/balancer/grpclb/state +google.golang.org/grpc/balancer/pickfirst google.golang.org/grpc/balancer/roundrobin google.golang.org/grpc/binarylog/grpc_binarylog_v1 google.golang.org/grpc/channelz @@ -665,7 +657,6 @@ google.golang.org/grpc/internal/channelz google.golang.org/grpc/internal/credentials google.golang.org/grpc/internal/envconfig google.golang.org/grpc/internal/grpclog -google.golang.org/grpc/internal/grpcrand google.golang.org/grpc/internal/grpcsync google.golang.org/grpc/internal/grpcutil google.golang.org/grpc/internal/idle @@ -687,6 +678,7 @@ google.golang.org/grpc/peer google.golang.org/grpc/reflection google.golang.org/grpc/reflection/grpc_reflection_v1 google.golang.org/grpc/reflection/grpc_reflection_v1alpha +google.golang.org/grpc/reflection/internal google.golang.org/grpc/resolver google.golang.org/grpc/resolver/dns google.golang.org/grpc/serviceconfig