Update grpc and protobuf to latest. (#5369)
protoc now generates grpc code in a separate file from protobuf code. Also, grpc servers are now required to embed an "unimplemented" interface from the generated .pb.go file, which provides forward compatibility. Update the generate.go files since the invocation for protoc has changed with the split into .pb.org and _grpc.pb.go. Fixes #5368
This commit is contained in:
		
							parent
							
								
									ef1d3c4cde
								
							
						
					
					
						commit
						7194624191
					
				| 
						 | 
					@ -30,7 +30,7 @@ jobs:
 | 
				
			||||||
      matrix:
 | 
					      matrix:
 | 
				
			||||||
        # Add additional docker image tags here and all tests will be run with the additional image.
 | 
					        # Add additional docker image tags here and all tests will be run with the additional image.
 | 
				
			||||||
        BOULDER_TOOLS_TAG:
 | 
					        BOULDER_TOOLS_TAG:
 | 
				
			||||||
          - go1.16.2_2021-03-29
 | 
					          - go1.16.2_2021-03-30
 | 
				
			||||||
        # Tests command definitions. Use the entire docker-compose command you want to run.
 | 
					        # Tests command definitions. Use the entire docker-compose command you want to run.
 | 
				
			||||||
        tests:
 | 
					        tests:
 | 
				
			||||||
          # Run ./test.sh --help for a description of each of the flags.
 | 
					          # Run ./test.sh --help for a description of each of the flags.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,18 +1,13 @@
 | 
				
			||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
 | 
					// Code generated by protoc-gen-go. DO NOT EDIT.
 | 
				
			||||||
// versions:
 | 
					// versions:
 | 
				
			||||||
// 	protoc-gen-go v1.21.0
 | 
					// 	protoc-gen-go v1.26.0
 | 
				
			||||||
// 	protoc        v3.11.4
 | 
					// 	protoc        v3.15.6
 | 
				
			||||||
// source: akamai/proto/akamai.proto
 | 
					// source: akamai.proto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package proto
 | 
					package proto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	context "context"
 | 
						proto "github.com/letsencrypt/boulder/core/proto"
 | 
				
			||||||
	proto "github.com/golang/protobuf/proto"
 | 
					 | 
				
			||||||
	proto1 "github.com/letsencrypt/boulder/core/proto"
 | 
					 | 
				
			||||||
	grpc "google.golang.org/grpc"
 | 
					 | 
				
			||||||
	codes "google.golang.org/grpc/codes"
 | 
					 | 
				
			||||||
	status "google.golang.org/grpc/status"
 | 
					 | 
				
			||||||
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 | 
						protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 | 
				
			||||||
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 | 
						protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 | 
				
			||||||
	reflect "reflect"
 | 
						reflect "reflect"
 | 
				
			||||||
| 
						 | 
					@ -26,10 +21,6 @@ const (
 | 
				
			||||||
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
 | 
						_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// This is a compile-time assertion that a sufficiently up-to-date version
 | 
					 | 
				
			||||||
// of the legacy proto package is being used.
 | 
					 | 
				
			||||||
const _ = proto.ProtoPackageIsVersion4
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type PurgeRequest struct {
 | 
					type PurgeRequest struct {
 | 
				
			||||||
	state         protoimpl.MessageState
 | 
						state         protoimpl.MessageState
 | 
				
			||||||
	sizeCache     protoimpl.SizeCache
 | 
						sizeCache     protoimpl.SizeCache
 | 
				
			||||||
| 
						 | 
					@ -41,7 +32,7 @@ type PurgeRequest struct {
 | 
				
			||||||
func (x *PurgeRequest) Reset() {
 | 
					func (x *PurgeRequest) Reset() {
 | 
				
			||||||
	*x = PurgeRequest{}
 | 
						*x = PurgeRequest{}
 | 
				
			||||||
	if protoimpl.UnsafeEnabled {
 | 
						if protoimpl.UnsafeEnabled {
 | 
				
			||||||
		mi := &file_akamai_proto_akamai_proto_msgTypes[0]
 | 
							mi := &file_akamai_proto_msgTypes[0]
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		ms.StoreMessageInfo(mi)
 | 
							ms.StoreMessageInfo(mi)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -54,7 +45,7 @@ func (x *PurgeRequest) String() string {
 | 
				
			||||||
func (*PurgeRequest) ProtoMessage() {}
 | 
					func (*PurgeRequest) ProtoMessage() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *PurgeRequest) ProtoReflect() protoreflect.Message {
 | 
					func (x *PurgeRequest) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
	mi := &file_akamai_proto_akamai_proto_msgTypes[0]
 | 
						mi := &file_akamai_proto_msgTypes[0]
 | 
				
			||||||
	if protoimpl.UnsafeEnabled && x != nil {
 | 
						if protoimpl.UnsafeEnabled && x != nil {
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		if ms.LoadMessageInfo() == nil {
 | 
							if ms.LoadMessageInfo() == nil {
 | 
				
			||||||
| 
						 | 
					@ -67,7 +58,7 @@ func (x *PurgeRequest) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Deprecated: Use PurgeRequest.ProtoReflect.Descriptor instead.
 | 
					// Deprecated: Use PurgeRequest.ProtoReflect.Descriptor instead.
 | 
				
			||||||
func (*PurgeRequest) Descriptor() ([]byte, []int) {
 | 
					func (*PurgeRequest) Descriptor() ([]byte, []int) {
 | 
				
			||||||
	return file_akamai_proto_akamai_proto_rawDescGZIP(), []int{0}
 | 
						return file_akamai_proto_rawDescGZIP(), []int{0}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *PurgeRequest) GetUrls() []string {
 | 
					func (x *PurgeRequest) GetUrls() []string {
 | 
				
			||||||
| 
						 | 
					@ -77,43 +68,42 @@ func (x *PurgeRequest) GetUrls() []string {
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var File_akamai_proto_akamai_proto protoreflect.FileDescriptor
 | 
					var File_akamai_proto protoreflect.FileDescriptor
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var file_akamai_proto_akamai_proto_rawDesc = []byte{
 | 
					var file_akamai_proto_rawDesc = []byte{
 | 
				
			||||||
	0x0a, 0x19, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x61,
 | 
						0x0a, 0x0c, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06,
 | 
				
			||||||
	0x6b, 0x61, 0x6d, 0x61, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x61, 0x6b, 0x61,
 | 
						0x61, 0x6b, 0x61, 0x6d, 0x61, 0x69, 0x1a, 0x15, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f,
 | 
				
			||||||
	0x6d, 0x61, 0x69, 0x1a, 0x15, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f,
 | 
						0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x22, 0x0a,
 | 
				
			||||||
	0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x22, 0x0a, 0x0c, 0x50, 0x75,
 | 
						0x0c, 0x50, 0x75, 0x72, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a,
 | 
				
			||||||
	0x72, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x72,
 | 
						0x04, 0x75, 0x72, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x75, 0x72, 0x6c,
 | 
				
			||||||
	0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x75, 0x72, 0x6c, 0x73, 0x32, 0x3c,
 | 
						0x73, 0x32, 0x3c, 0x0a, 0x0c, 0x41, 0x6b, 0x61, 0x6d, 0x61, 0x69, 0x50, 0x75, 0x72, 0x67, 0x65,
 | 
				
			||||||
	0x0a, 0x0c, 0x41, 0x6b, 0x61, 0x6d, 0x61, 0x69, 0x50, 0x75, 0x72, 0x67, 0x65, 0x72, 0x12, 0x2c,
 | 
						0x72, 0x12, 0x2c, 0x0a, 0x05, 0x50, 0x75, 0x72, 0x67, 0x65, 0x12, 0x14, 0x2e, 0x61, 0x6b, 0x61,
 | 
				
			||||||
	0x0a, 0x05, 0x50, 0x75, 0x72, 0x67, 0x65, 0x12, 0x14, 0x2e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x69,
 | 
						0x6d, 0x61, 0x69, 0x2e, 0x50, 0x75, 0x72, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
 | 
				
			||||||
	0x2e, 0x50, 0x75, 0x72, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0b, 0x2e,
 | 
						0x1a, 0x0b, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42,
 | 
				
			||||||
	0x63, 0x6f, 0x72, 0x65, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x2d, 0x5a, 0x2b,
 | 
						0x2d, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x65,
 | 
				
			||||||
	0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x65, 0x74, 0x73, 0x65,
 | 
						0x74, 0x73, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x2f, 0x62, 0x6f, 0x75, 0x6c, 0x64, 0x65,
 | 
				
			||||||
	0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x2f, 0x62, 0x6f, 0x75, 0x6c, 0x64, 0x65, 0x72, 0x2f, 0x61,
 | 
						0x72, 0x2f, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06,
 | 
				
			||||||
	0x6b, 0x61, 0x6d, 0x61, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f,
 | 
						0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 | 
				
			||||||
	0x74, 0x6f, 0x33,
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
	file_akamai_proto_akamai_proto_rawDescOnce sync.Once
 | 
						file_akamai_proto_rawDescOnce sync.Once
 | 
				
			||||||
	file_akamai_proto_akamai_proto_rawDescData = file_akamai_proto_akamai_proto_rawDesc
 | 
						file_akamai_proto_rawDescData = file_akamai_proto_rawDesc
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func file_akamai_proto_akamai_proto_rawDescGZIP() []byte {
 | 
					func file_akamai_proto_rawDescGZIP() []byte {
 | 
				
			||||||
	file_akamai_proto_akamai_proto_rawDescOnce.Do(func() {
 | 
						file_akamai_proto_rawDescOnce.Do(func() {
 | 
				
			||||||
		file_akamai_proto_akamai_proto_rawDescData = protoimpl.X.CompressGZIP(file_akamai_proto_akamai_proto_rawDescData)
 | 
							file_akamai_proto_rawDescData = protoimpl.X.CompressGZIP(file_akamai_proto_rawDescData)
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	return file_akamai_proto_akamai_proto_rawDescData
 | 
						return file_akamai_proto_rawDescData
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var file_akamai_proto_akamai_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
 | 
					var file_akamai_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
 | 
				
			||||||
var file_akamai_proto_akamai_proto_goTypes = []interface{}{
 | 
					var file_akamai_proto_goTypes = []interface{}{
 | 
				
			||||||
	(*PurgeRequest)(nil), // 0: akamai.PurgeRequest
 | 
						(*PurgeRequest)(nil), // 0: akamai.PurgeRequest
 | 
				
			||||||
	(*proto1.Empty)(nil), // 1: core.Empty
 | 
						(*proto.Empty)(nil),  // 1: core.Empty
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
var file_akamai_proto_akamai_proto_depIdxs = []int32{
 | 
					var file_akamai_proto_depIdxs = []int32{
 | 
				
			||||||
	0, // 0: akamai.AkamaiPurger.Purge:input_type -> akamai.PurgeRequest
 | 
						0, // 0: akamai.AkamaiPurger.Purge:input_type -> akamai.PurgeRequest
 | 
				
			||||||
	1, // 1: akamai.AkamaiPurger.Purge:output_type -> core.Empty
 | 
						1, // 1: akamai.AkamaiPurger.Purge:output_type -> core.Empty
 | 
				
			||||||
	1, // [1:2] is the sub-list for method output_type
 | 
						1, // [1:2] is the sub-list for method output_type
 | 
				
			||||||
| 
						 | 
					@ -123,13 +113,13 @@ var file_akamai_proto_akamai_proto_depIdxs = []int32{
 | 
				
			||||||
	0, // [0:0] is the sub-list for field type_name
 | 
						0, // [0:0] is the sub-list for field type_name
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func init() { file_akamai_proto_akamai_proto_init() }
 | 
					func init() { file_akamai_proto_init() }
 | 
				
			||||||
func file_akamai_proto_akamai_proto_init() {
 | 
					func file_akamai_proto_init() {
 | 
				
			||||||
	if File_akamai_proto_akamai_proto != nil {
 | 
						if File_akamai_proto != nil {
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if !protoimpl.UnsafeEnabled {
 | 
						if !protoimpl.UnsafeEnabled {
 | 
				
			||||||
		file_akamai_proto_akamai_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 | 
							file_akamai_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 | 
				
			||||||
			switch v := v.(*PurgeRequest); i {
 | 
								switch v := v.(*PurgeRequest); i {
 | 
				
			||||||
			case 0:
 | 
								case 0:
 | 
				
			||||||
				return &v.state
 | 
									return &v.state
 | 
				
			||||||
| 
						 | 
					@ -146,98 +136,18 @@ func file_akamai_proto_akamai_proto_init() {
 | 
				
			||||||
	out := protoimpl.TypeBuilder{
 | 
						out := protoimpl.TypeBuilder{
 | 
				
			||||||
		File: protoimpl.DescBuilder{
 | 
							File: protoimpl.DescBuilder{
 | 
				
			||||||
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 | 
								GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 | 
				
			||||||
			RawDescriptor: file_akamai_proto_akamai_proto_rawDesc,
 | 
								RawDescriptor: file_akamai_proto_rawDesc,
 | 
				
			||||||
			NumEnums:      0,
 | 
								NumEnums:      0,
 | 
				
			||||||
			NumMessages:   1,
 | 
								NumMessages:   1,
 | 
				
			||||||
			NumExtensions: 0,
 | 
								NumExtensions: 0,
 | 
				
			||||||
			NumServices:   1,
 | 
								NumServices:   1,
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		GoTypes:           file_akamai_proto_akamai_proto_goTypes,
 | 
							GoTypes:           file_akamai_proto_goTypes,
 | 
				
			||||||
		DependencyIndexes: file_akamai_proto_akamai_proto_depIdxs,
 | 
							DependencyIndexes: file_akamai_proto_depIdxs,
 | 
				
			||||||
		MessageInfos:      file_akamai_proto_akamai_proto_msgTypes,
 | 
							MessageInfos:      file_akamai_proto_msgTypes,
 | 
				
			||||||
	}.Build()
 | 
						}.Build()
 | 
				
			||||||
	File_akamai_proto_akamai_proto = out.File
 | 
						File_akamai_proto = out.File
 | 
				
			||||||
	file_akamai_proto_akamai_proto_rawDesc = nil
 | 
						file_akamai_proto_rawDesc = nil
 | 
				
			||||||
	file_akamai_proto_akamai_proto_goTypes = nil
 | 
						file_akamai_proto_goTypes = nil
 | 
				
			||||||
	file_akamai_proto_akamai_proto_depIdxs = nil
 | 
						file_akamai_proto_depIdxs = nil
 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Reference imports to suppress errors if they are not otherwise used.
 | 
					 | 
				
			||||||
var _ context.Context
 | 
					 | 
				
			||||||
var _ grpc.ClientConnInterface
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// This is a compile-time assertion to ensure that this generated file
 | 
					 | 
				
			||||||
// is compatible with the grpc package it is being compiled against.
 | 
					 | 
				
			||||||
const _ = grpc.SupportPackageIsVersion6
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// AkamaiPurgerClient is the client API for AkamaiPurger service.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
 | 
					 | 
				
			||||||
type AkamaiPurgerClient interface {
 | 
					 | 
				
			||||||
	Purge(ctx context.Context, in *PurgeRequest, opts ...grpc.CallOption) (*proto1.Empty, error)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type akamaiPurgerClient struct {
 | 
					 | 
				
			||||||
	cc grpc.ClientConnInterface
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func NewAkamaiPurgerClient(cc grpc.ClientConnInterface) AkamaiPurgerClient {
 | 
					 | 
				
			||||||
	return &akamaiPurgerClient{cc}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (c *akamaiPurgerClient) Purge(ctx context.Context, in *PurgeRequest, opts ...grpc.CallOption) (*proto1.Empty, error) {
 | 
					 | 
				
			||||||
	out := new(proto1.Empty)
 | 
					 | 
				
			||||||
	err := c.cc.Invoke(ctx, "/akamai.AkamaiPurger/Purge", in, out, opts...)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return out, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// AkamaiPurgerServer is the server API for AkamaiPurger service.
 | 
					 | 
				
			||||||
type AkamaiPurgerServer interface {
 | 
					 | 
				
			||||||
	Purge(context.Context, *PurgeRequest) (*proto1.Empty, error)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// UnimplementedAkamaiPurgerServer can be embedded to have forward compatible implementations.
 | 
					 | 
				
			||||||
type UnimplementedAkamaiPurgerServer struct {
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (*UnimplementedAkamaiPurgerServer) Purge(context.Context, *PurgeRequest) (*proto1.Empty, error) {
 | 
					 | 
				
			||||||
	return nil, status.Errorf(codes.Unimplemented, "method Purge not implemented")
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func RegisterAkamaiPurgerServer(s *grpc.Server, srv AkamaiPurgerServer) {
 | 
					 | 
				
			||||||
	s.RegisterService(&_AkamaiPurger_serviceDesc, srv)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func _AkamaiPurger_Purge_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
					 | 
				
			||||||
	in := new(PurgeRequest)
 | 
					 | 
				
			||||||
	if err := dec(in); err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if interceptor == nil {
 | 
					 | 
				
			||||||
		return srv.(AkamaiPurgerServer).Purge(ctx, in)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	info := &grpc.UnaryServerInfo{
 | 
					 | 
				
			||||||
		Server:     srv,
 | 
					 | 
				
			||||||
		FullMethod: "/akamai.AkamaiPurger/Purge",
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 | 
					 | 
				
			||||||
		return srv.(AkamaiPurgerServer).Purge(ctx, req.(*PurgeRequest))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return interceptor(ctx, in, info, handler)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var _AkamaiPurger_serviceDesc = grpc.ServiceDesc{
 | 
					 | 
				
			||||||
	ServiceName: "akamai.AkamaiPurger",
 | 
					 | 
				
			||||||
	HandlerType: (*AkamaiPurgerServer)(nil),
 | 
					 | 
				
			||||||
	Methods: []grpc.MethodDesc{
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			MethodName: "Purge",
 | 
					 | 
				
			||||||
			Handler:    _AkamaiPurger_Purge_Handler,
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
	Streams:  []grpc.StreamDesc{},
 | 
					 | 
				
			||||||
	Metadata: "akamai/proto/akamai.proto",
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,102 @@
 | 
				
			||||||
 | 
					// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package proto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						context "context"
 | 
				
			||||||
 | 
						proto "github.com/letsencrypt/boulder/core/proto"
 | 
				
			||||||
 | 
						grpc "google.golang.org/grpc"
 | 
				
			||||||
 | 
						codes "google.golang.org/grpc/codes"
 | 
				
			||||||
 | 
						status "google.golang.org/grpc/status"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// AkamaiPurgerClient is the client API for AkamaiPurger 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.
 | 
				
			||||||
 | 
					type AkamaiPurgerClient interface {
 | 
				
			||||||
 | 
						Purge(ctx context.Context, in *PurgeRequest, opts ...grpc.CallOption) (*proto.Empty, error)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type akamaiPurgerClient struct {
 | 
				
			||||||
 | 
						cc grpc.ClientConnInterface
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewAkamaiPurgerClient(cc grpc.ClientConnInterface) AkamaiPurgerClient {
 | 
				
			||||||
 | 
						return &akamaiPurgerClient{cc}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *akamaiPurgerClient) Purge(ctx context.Context, in *PurgeRequest, opts ...grpc.CallOption) (*proto.Empty, error) {
 | 
				
			||||||
 | 
						out := new(proto.Empty)
 | 
				
			||||||
 | 
						err := c.cc.Invoke(ctx, "/akamai.AkamaiPurger/Purge", in, out, opts...)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return out, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// AkamaiPurgerServer is the server API for AkamaiPurger service.
 | 
				
			||||||
 | 
					// All implementations must embed UnimplementedAkamaiPurgerServer
 | 
				
			||||||
 | 
					// for forward compatibility
 | 
				
			||||||
 | 
					type AkamaiPurgerServer interface {
 | 
				
			||||||
 | 
						Purge(context.Context, *PurgeRequest) (*proto.Empty, error)
 | 
				
			||||||
 | 
						mustEmbedUnimplementedAkamaiPurgerServer()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// UnimplementedAkamaiPurgerServer must be embedded to have forward compatible implementations.
 | 
				
			||||||
 | 
					type UnimplementedAkamaiPurgerServer struct {
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (UnimplementedAkamaiPurgerServer) Purge(context.Context, *PurgeRequest) (*proto.Empty, error) {
 | 
				
			||||||
 | 
						return nil, status.Errorf(codes.Unimplemented, "method Purge not implemented")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					func (UnimplementedAkamaiPurgerServer) mustEmbedUnimplementedAkamaiPurgerServer() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// UnsafeAkamaiPurgerServer may be embedded to opt out of forward compatibility for this service.
 | 
				
			||||||
 | 
					// Use of this interface is not recommended, as added methods to AkamaiPurgerServer will
 | 
				
			||||||
 | 
					// result in compilation errors.
 | 
				
			||||||
 | 
					type UnsafeAkamaiPurgerServer interface {
 | 
				
			||||||
 | 
						mustEmbedUnimplementedAkamaiPurgerServer()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func RegisterAkamaiPurgerServer(s grpc.ServiceRegistrar, srv AkamaiPurgerServer) {
 | 
				
			||||||
 | 
						s.RegisterService(&AkamaiPurger_ServiceDesc, srv)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _AkamaiPurger_Purge_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
				
			||||||
 | 
						in := new(PurgeRequest)
 | 
				
			||||||
 | 
						if err := dec(in); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if interceptor == nil {
 | 
				
			||||||
 | 
							return srv.(AkamaiPurgerServer).Purge(ctx, in)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						info := &grpc.UnaryServerInfo{
 | 
				
			||||||
 | 
							Server:     srv,
 | 
				
			||||||
 | 
							FullMethod: "/akamai.AkamaiPurger/Purge",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 | 
				
			||||||
 | 
							return srv.(AkamaiPurgerServer).Purge(ctx, req.(*PurgeRequest))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return interceptor(ctx, in, info, handler)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// AkamaiPurger_ServiceDesc is the grpc.ServiceDesc for AkamaiPurger service.
 | 
				
			||||||
 | 
					// It's only intended for direct use with grpc.RegisterService,
 | 
				
			||||||
 | 
					// and not to be introspected or modified (even as a copy)
 | 
				
			||||||
 | 
					var AkamaiPurger_ServiceDesc = grpc.ServiceDesc{
 | 
				
			||||||
 | 
						ServiceName: "akamai.AkamaiPurger",
 | 
				
			||||||
 | 
						HandlerType: (*AkamaiPurgerServer)(nil),
 | 
				
			||||||
 | 
						Methods: []grpc.MethodDesc{
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								MethodName: "Purge",
 | 
				
			||||||
 | 
								Handler:    _AkamaiPurger_Purge_Handler,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						Streams:  []grpc.StreamDesc{},
 | 
				
			||||||
 | 
						Metadata: "akamai.proto",
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,3 @@
 | 
				
			||||||
package proto
 | 
					package proto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//go:generate sh -c "cd ../.. && protoc --go_opt=paths=source_relative --go_out=plugins=grpc,Mcore/proto/core.proto=github.com/letsencrypt/boulder/core/proto:. akamai/proto/akamai.proto"
 | 
					//go:generate sh -c "cd ../.. && protoc -I akamai/proto/ -I . --go_out=akamai/proto --go-grpc_out=akamai/proto --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative akamai/proto/akamai.proto"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								ca/ca.go
								
								
								
								
							
							
						
						
									
										2
									
								
								ca/ca.go
								
								
								
								
							| 
						 | 
					@ -73,6 +73,8 @@ type issuerMaps struct {
 | 
				
			||||||
// CertificateAuthorityImpl represents a CA that signs certificates, CRLs, and
 | 
					// CertificateAuthorityImpl represents a CA that signs certificates, CRLs, and
 | 
				
			||||||
// OCSP responses.
 | 
					// OCSP responses.
 | 
				
			||||||
type CertificateAuthorityImpl struct {
 | 
					type CertificateAuthorityImpl struct {
 | 
				
			||||||
 | 
						capb.UnimplementedCertificateAuthorityServer
 | 
				
			||||||
 | 
						capb.UnimplementedOCSPGeneratorServer
 | 
				
			||||||
	sa                 certificateStorage
 | 
						sa                 certificateStorage
 | 
				
			||||||
	pa                 core.PolicyAuthority
 | 
						pa                 core.PolicyAuthority
 | 
				
			||||||
	issuers            issuerMaps
 | 
						issuers            issuerMaps
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,18 +1,13 @@
 | 
				
			||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
 | 
					// Code generated by protoc-gen-go. DO NOT EDIT.
 | 
				
			||||||
// versions:
 | 
					// versions:
 | 
				
			||||||
// 	protoc-gen-go v1.21.0
 | 
					// 	protoc-gen-go v1.26.0
 | 
				
			||||||
// 	protoc        v3.11.4
 | 
					// 	protoc        v3.15.6
 | 
				
			||||||
// source: ca/proto/ca.proto
 | 
					// source: ca.proto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package proto
 | 
					package proto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	context "context"
 | 
						proto "github.com/letsencrypt/boulder/core/proto"
 | 
				
			||||||
	proto "github.com/golang/protobuf/proto"
 | 
					 | 
				
			||||||
	proto1 "github.com/letsencrypt/boulder/core/proto"
 | 
					 | 
				
			||||||
	grpc "google.golang.org/grpc"
 | 
					 | 
				
			||||||
	codes "google.golang.org/grpc/codes"
 | 
					 | 
				
			||||||
	status "google.golang.org/grpc/status"
 | 
					 | 
				
			||||||
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 | 
						protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 | 
				
			||||||
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 | 
						protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 | 
				
			||||||
	reflect "reflect"
 | 
						reflect "reflect"
 | 
				
			||||||
| 
						 | 
					@ -26,10 +21,6 @@ const (
 | 
				
			||||||
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
 | 
						_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// This is a compile-time assertion that a sufficiently up-to-date version
 | 
					 | 
				
			||||||
// of the legacy proto package is being used.
 | 
					 | 
				
			||||||
const _ = proto.ProtoPackageIsVersion4
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type IssueCertificateRequest struct {
 | 
					type IssueCertificateRequest struct {
 | 
				
			||||||
	state         protoimpl.MessageState
 | 
						state         protoimpl.MessageState
 | 
				
			||||||
	sizeCache     protoimpl.SizeCache
 | 
						sizeCache     protoimpl.SizeCache
 | 
				
			||||||
| 
						 | 
					@ -44,7 +35,7 @@ type IssueCertificateRequest struct {
 | 
				
			||||||
func (x *IssueCertificateRequest) Reset() {
 | 
					func (x *IssueCertificateRequest) Reset() {
 | 
				
			||||||
	*x = IssueCertificateRequest{}
 | 
						*x = IssueCertificateRequest{}
 | 
				
			||||||
	if protoimpl.UnsafeEnabled {
 | 
						if protoimpl.UnsafeEnabled {
 | 
				
			||||||
		mi := &file_ca_proto_ca_proto_msgTypes[0]
 | 
							mi := &file_ca_proto_msgTypes[0]
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		ms.StoreMessageInfo(mi)
 | 
							ms.StoreMessageInfo(mi)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -57,7 +48,7 @@ func (x *IssueCertificateRequest) String() string {
 | 
				
			||||||
func (*IssueCertificateRequest) ProtoMessage() {}
 | 
					func (*IssueCertificateRequest) ProtoMessage() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *IssueCertificateRequest) ProtoReflect() protoreflect.Message {
 | 
					func (x *IssueCertificateRequest) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
	mi := &file_ca_proto_ca_proto_msgTypes[0]
 | 
						mi := &file_ca_proto_msgTypes[0]
 | 
				
			||||||
	if protoimpl.UnsafeEnabled && x != nil {
 | 
						if protoimpl.UnsafeEnabled && x != nil {
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		if ms.LoadMessageInfo() == nil {
 | 
							if ms.LoadMessageInfo() == nil {
 | 
				
			||||||
| 
						 | 
					@ -70,7 +61,7 @@ func (x *IssueCertificateRequest) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Deprecated: Use IssueCertificateRequest.ProtoReflect.Descriptor instead.
 | 
					// Deprecated: Use IssueCertificateRequest.ProtoReflect.Descriptor instead.
 | 
				
			||||||
func (*IssueCertificateRequest) Descriptor() ([]byte, []int) {
 | 
					func (*IssueCertificateRequest) Descriptor() ([]byte, []int) {
 | 
				
			||||||
	return file_ca_proto_ca_proto_rawDescGZIP(), []int{0}
 | 
						return file_ca_proto_rawDescGZIP(), []int{0}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *IssueCertificateRequest) GetCsr() []byte {
 | 
					func (x *IssueCertificateRequest) GetCsr() []byte {
 | 
				
			||||||
| 
						 | 
					@ -112,7 +103,7 @@ type IssuePrecertificateResponse struct {
 | 
				
			||||||
func (x *IssuePrecertificateResponse) Reset() {
 | 
					func (x *IssuePrecertificateResponse) Reset() {
 | 
				
			||||||
	*x = IssuePrecertificateResponse{}
 | 
						*x = IssuePrecertificateResponse{}
 | 
				
			||||||
	if protoimpl.UnsafeEnabled {
 | 
						if protoimpl.UnsafeEnabled {
 | 
				
			||||||
		mi := &file_ca_proto_ca_proto_msgTypes[1]
 | 
							mi := &file_ca_proto_msgTypes[1]
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		ms.StoreMessageInfo(mi)
 | 
							ms.StoreMessageInfo(mi)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -125,7 +116,7 @@ func (x *IssuePrecertificateResponse) String() string {
 | 
				
			||||||
func (*IssuePrecertificateResponse) ProtoMessage() {}
 | 
					func (*IssuePrecertificateResponse) ProtoMessage() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *IssuePrecertificateResponse) ProtoReflect() protoreflect.Message {
 | 
					func (x *IssuePrecertificateResponse) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
	mi := &file_ca_proto_ca_proto_msgTypes[1]
 | 
						mi := &file_ca_proto_msgTypes[1]
 | 
				
			||||||
	if protoimpl.UnsafeEnabled && x != nil {
 | 
						if protoimpl.UnsafeEnabled && x != nil {
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		if ms.LoadMessageInfo() == nil {
 | 
							if ms.LoadMessageInfo() == nil {
 | 
				
			||||||
| 
						 | 
					@ -138,7 +129,7 @@ func (x *IssuePrecertificateResponse) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Deprecated: Use IssuePrecertificateResponse.ProtoReflect.Descriptor instead.
 | 
					// Deprecated: Use IssuePrecertificateResponse.ProtoReflect.Descriptor instead.
 | 
				
			||||||
func (*IssuePrecertificateResponse) Descriptor() ([]byte, []int) {
 | 
					func (*IssuePrecertificateResponse) Descriptor() ([]byte, []int) {
 | 
				
			||||||
	return file_ca_proto_ca_proto_rawDescGZIP(), []int{1}
 | 
						return file_ca_proto_rawDescGZIP(), []int{1}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *IssuePrecertificateResponse) GetDER() []byte {
 | 
					func (x *IssuePrecertificateResponse) GetDER() []byte {
 | 
				
			||||||
| 
						 | 
					@ -162,7 +153,7 @@ type IssueCertificateForPrecertificateRequest struct {
 | 
				
			||||||
func (x *IssueCertificateForPrecertificateRequest) Reset() {
 | 
					func (x *IssueCertificateForPrecertificateRequest) Reset() {
 | 
				
			||||||
	*x = IssueCertificateForPrecertificateRequest{}
 | 
						*x = IssueCertificateForPrecertificateRequest{}
 | 
				
			||||||
	if protoimpl.UnsafeEnabled {
 | 
						if protoimpl.UnsafeEnabled {
 | 
				
			||||||
		mi := &file_ca_proto_ca_proto_msgTypes[2]
 | 
							mi := &file_ca_proto_msgTypes[2]
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		ms.StoreMessageInfo(mi)
 | 
							ms.StoreMessageInfo(mi)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -175,7 +166,7 @@ func (x *IssueCertificateForPrecertificateRequest) String() string {
 | 
				
			||||||
func (*IssueCertificateForPrecertificateRequest) ProtoMessage() {}
 | 
					func (*IssueCertificateForPrecertificateRequest) ProtoMessage() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *IssueCertificateForPrecertificateRequest) ProtoReflect() protoreflect.Message {
 | 
					func (x *IssueCertificateForPrecertificateRequest) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
	mi := &file_ca_proto_ca_proto_msgTypes[2]
 | 
						mi := &file_ca_proto_msgTypes[2]
 | 
				
			||||||
	if protoimpl.UnsafeEnabled && x != nil {
 | 
						if protoimpl.UnsafeEnabled && x != nil {
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		if ms.LoadMessageInfo() == nil {
 | 
							if ms.LoadMessageInfo() == nil {
 | 
				
			||||||
| 
						 | 
					@ -188,7 +179,7 @@ func (x *IssueCertificateForPrecertificateRequest) ProtoReflect() protoreflect.M
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Deprecated: Use IssueCertificateForPrecertificateRequest.ProtoReflect.Descriptor instead.
 | 
					// Deprecated: Use IssueCertificateForPrecertificateRequest.ProtoReflect.Descriptor instead.
 | 
				
			||||||
func (*IssueCertificateForPrecertificateRequest) Descriptor() ([]byte, []int) {
 | 
					func (*IssueCertificateForPrecertificateRequest) Descriptor() ([]byte, []int) {
 | 
				
			||||||
	return file_ca_proto_ca_proto_rawDescGZIP(), []int{2}
 | 
						return file_ca_proto_rawDescGZIP(), []int{2}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *IssueCertificateForPrecertificateRequest) GetDER() []byte {
 | 
					func (x *IssueCertificateForPrecertificateRequest) GetDER() []byte {
 | 
				
			||||||
| 
						 | 
					@ -236,7 +227,7 @@ type GenerateOCSPRequest struct {
 | 
				
			||||||
func (x *GenerateOCSPRequest) Reset() {
 | 
					func (x *GenerateOCSPRequest) Reset() {
 | 
				
			||||||
	*x = GenerateOCSPRequest{}
 | 
						*x = GenerateOCSPRequest{}
 | 
				
			||||||
	if protoimpl.UnsafeEnabled {
 | 
						if protoimpl.UnsafeEnabled {
 | 
				
			||||||
		mi := &file_ca_proto_ca_proto_msgTypes[3]
 | 
							mi := &file_ca_proto_msgTypes[3]
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		ms.StoreMessageInfo(mi)
 | 
							ms.StoreMessageInfo(mi)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -249,7 +240,7 @@ func (x *GenerateOCSPRequest) String() string {
 | 
				
			||||||
func (*GenerateOCSPRequest) ProtoMessage() {}
 | 
					func (*GenerateOCSPRequest) ProtoMessage() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *GenerateOCSPRequest) ProtoReflect() protoreflect.Message {
 | 
					func (x *GenerateOCSPRequest) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
	mi := &file_ca_proto_ca_proto_msgTypes[3]
 | 
						mi := &file_ca_proto_msgTypes[3]
 | 
				
			||||||
	if protoimpl.UnsafeEnabled && x != nil {
 | 
						if protoimpl.UnsafeEnabled && x != nil {
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		if ms.LoadMessageInfo() == nil {
 | 
							if ms.LoadMessageInfo() == nil {
 | 
				
			||||||
| 
						 | 
					@ -262,7 +253,7 @@ func (x *GenerateOCSPRequest) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Deprecated: Use GenerateOCSPRequest.ProtoReflect.Descriptor instead.
 | 
					// Deprecated: Use GenerateOCSPRequest.ProtoReflect.Descriptor instead.
 | 
				
			||||||
func (*GenerateOCSPRequest) Descriptor() ([]byte, []int) {
 | 
					func (*GenerateOCSPRequest) Descriptor() ([]byte, []int) {
 | 
				
			||||||
	return file_ca_proto_ca_proto_rawDescGZIP(), []int{3}
 | 
						return file_ca_proto_rawDescGZIP(), []int{3}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *GenerateOCSPRequest) GetCertDER() []byte {
 | 
					func (x *GenerateOCSPRequest) GetCertDER() []byte {
 | 
				
			||||||
| 
						 | 
					@ -318,7 +309,7 @@ type OCSPResponse struct {
 | 
				
			||||||
func (x *OCSPResponse) Reset() {
 | 
					func (x *OCSPResponse) Reset() {
 | 
				
			||||||
	*x = OCSPResponse{}
 | 
						*x = OCSPResponse{}
 | 
				
			||||||
	if protoimpl.UnsafeEnabled {
 | 
						if protoimpl.UnsafeEnabled {
 | 
				
			||||||
		mi := &file_ca_proto_ca_proto_msgTypes[4]
 | 
							mi := &file_ca_proto_msgTypes[4]
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		ms.StoreMessageInfo(mi)
 | 
							ms.StoreMessageInfo(mi)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -331,7 +322,7 @@ func (x *OCSPResponse) String() string {
 | 
				
			||||||
func (*OCSPResponse) ProtoMessage() {}
 | 
					func (*OCSPResponse) ProtoMessage() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *OCSPResponse) ProtoReflect() protoreflect.Message {
 | 
					func (x *OCSPResponse) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
	mi := &file_ca_proto_ca_proto_msgTypes[4]
 | 
						mi := &file_ca_proto_msgTypes[4]
 | 
				
			||||||
	if protoimpl.UnsafeEnabled && x != nil {
 | 
						if protoimpl.UnsafeEnabled && x != nil {
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		if ms.LoadMessageInfo() == nil {
 | 
							if ms.LoadMessageInfo() == nil {
 | 
				
			||||||
| 
						 | 
					@ -344,7 +335,7 @@ func (x *OCSPResponse) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Deprecated: Use OCSPResponse.ProtoReflect.Descriptor instead.
 | 
					// Deprecated: Use OCSPResponse.ProtoReflect.Descriptor instead.
 | 
				
			||||||
func (*OCSPResponse) Descriptor() ([]byte, []int) {
 | 
					func (*OCSPResponse) Descriptor() ([]byte, []int) {
 | 
				
			||||||
	return file_ca_proto_ca_proto_rawDescGZIP(), []int{4}
 | 
						return file_ca_proto_rawDescGZIP(), []int{4}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *OCSPResponse) GetResponse() []byte {
 | 
					func (x *OCSPResponse) GetResponse() []byte {
 | 
				
			||||||
| 
						 | 
					@ -354,97 +345,97 @@ func (x *OCSPResponse) GetResponse() []byte {
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var File_ca_proto_ca_proto protoreflect.FileDescriptor
 | 
					var File_ca_proto protoreflect.FileDescriptor
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var file_ca_proto_ca_proto_rawDesc = []byte{
 | 
					var file_ca_proto_rawDesc = []byte{
 | 
				
			||||||
	0x0a, 0x11, 0x63, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x61, 0x2e, 0x70, 0x72,
 | 
						0x0a, 0x08, 0x63, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x02, 0x63, 0x61, 0x1a, 0x15,
 | 
				
			||||||
	0x6f, 0x74, 0x6f, 0x12, 0x02, 0x63, 0x61, 0x1a, 0x15, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72,
 | 
						0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2e,
 | 
				
			||||||
	0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x91,
 | 
						0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x91, 0x01, 0x0a, 0x17, 0x49, 0x73, 0x73, 0x75, 0x65, 0x43,
 | 
				
			||||||
	0x01, 0x0a, 0x17, 0x49, 0x73, 0x73, 0x75, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63,
 | 
						0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
 | 
				
			||||||
	0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x73,
 | 
						0x74, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x73, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03,
 | 
				
			||||||
	0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x63, 0x73, 0x72, 0x12, 0x26, 0x0a, 0x0e,
 | 
						0x63, 0x73, 0x72, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74,
 | 
				
			||||||
	0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02,
 | 
						0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x72, 0x65, 0x67,
 | 
				
			||||||
	0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69,
 | 
						0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x6f,
 | 
				
			||||||
	0x6f, 0x6e, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x44, 0x18,
 | 
						0x72, 0x64, 0x65, 0x72, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6f, 0x72,
 | 
				
			||||||
	0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x44, 0x12, 0x22,
 | 
						0x64, 0x65, 0x72, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x4e,
 | 
				
			||||||
	0x0a, 0x0c, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x49, 0x44, 0x18, 0x04,
 | 
						0x61, 0x6d, 0x65, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x69, 0x73, 0x73,
 | 
				
			||||||
	0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65,
 | 
						0x75, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x49, 0x44, 0x22, 0x2f, 0x0a, 0x1b, 0x49, 0x73, 0x73,
 | 
				
			||||||
	0x49, 0x44, 0x22, 0x2f, 0x0a, 0x1b, 0x49, 0x73, 0x73, 0x75, 0x65, 0x50, 0x72, 0x65, 0x63, 0x65,
 | 
						0x75, 0x65, 0x50, 0x72, 0x65, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65,
 | 
				
			||||||
	0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
 | 
						0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x44, 0x45, 0x52, 0x18,
 | 
				
			||||||
	0x65, 0x12, 0x10, 0x0a, 0x03, 0x44, 0x45, 0x52, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03,
 | 
						0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x44, 0x45, 0x52, 0x22, 0x92, 0x01, 0x0a, 0x28, 0x49,
 | 
				
			||||||
	0x44, 0x45, 0x52, 0x22, 0x92, 0x01, 0x0a, 0x28, 0x49, 0x73, 0x73, 0x75, 0x65, 0x43, 0x65, 0x72,
 | 
						0x73, 0x73, 0x75, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x46,
 | 
				
			||||||
	0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x50, 0x72, 0x65, 0x63, 0x65,
 | 
						0x6f, 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65,
 | 
				
			||||||
	0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
 | 
						0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x44, 0x45, 0x52, 0x18, 0x01,
 | 
				
			||||||
	0x12, 0x10, 0x0a, 0x03, 0x44, 0x45, 0x52, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x44,
 | 
						0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x44, 0x45, 0x52, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x43, 0x54,
 | 
				
			||||||
	0x45, 0x52, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x43, 0x54, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0c,
 | 
						0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x04, 0x53, 0x43, 0x54, 0x73, 0x12, 0x26, 0x0a,
 | 
				
			||||||
	0x52, 0x04, 0x53, 0x43, 0x54, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74,
 | 
						0x0e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18,
 | 
				
			||||||
	0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e,
 | 
						0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74,
 | 
				
			||||||
	0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x18,
 | 
						0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x44,
 | 
				
			||||||
	0x0a, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52,
 | 
						0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x44, 0x22,
 | 
				
			||||||
	0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x44, 0x22, 0xb1, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x6e,
 | 
						0xb1, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4f, 0x43, 0x53, 0x50,
 | 
				
			||||||
	0x65, 0x72, 0x61, 0x74, 0x65, 0x4f, 0x43, 0x53, 0x50, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
 | 
						0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x65, 0x72, 0x74, 0x44,
 | 
				
			||||||
	0x12, 0x18, 0x0a, 0x07, 0x63, 0x65, 0x72, 0x74, 0x44, 0x45, 0x52, 0x18, 0x01, 0x20, 0x01, 0x28,
 | 
						0x45, 0x52, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x65, 0x72, 0x74, 0x44, 0x45,
 | 
				
			||||||
	0x0c, 0x52, 0x07, 0x63, 0x65, 0x72, 0x74, 0x44, 0x45, 0x52, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74,
 | 
						0x52, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28,
 | 
				
			||||||
	0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74,
 | 
						0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61,
 | 
				
			||||||
	0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01,
 | 
						0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f,
 | 
				
			||||||
	0x28, 0x05, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65,
 | 
						0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x64, 0x41, 0x74, 0x18, 0x04,
 | 
				
			||||||
	0x76, 0x6f, 0x6b, 0x65, 0x64, 0x41, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x72,
 | 
						0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x72, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x64, 0x41, 0x74, 0x12,
 | 
				
			||||||
	0x65, 0x76, 0x6f, 0x6b, 0x65, 0x64, 0x41, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x69,
 | 
						0x16, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52,
 | 
				
			||||||
	0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c,
 | 
						0x06, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x73, 0x75, 0x65,
 | 
				
			||||||
	0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x49, 0x44, 0x18, 0x06, 0x20, 0x01,
 | 
						0x72, 0x49, 0x44, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x69, 0x73, 0x73, 0x75, 0x65,
 | 
				
			||||||
	0x28, 0x03, 0x52, 0x08, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x49, 0x44, 0x22, 0x2a, 0x0a, 0x0c,
 | 
						0x72, 0x49, 0x44, 0x22, 0x2a, 0x0a, 0x0c, 0x4f, 0x43, 0x53, 0x50, 0x52, 0x65, 0x73, 0x70, 0x6f,
 | 
				
			||||||
	0x4f, 0x43, 0x53, 0x50, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08,
 | 
						0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18,
 | 
				
			||||||
	0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08,
 | 
						0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32,
 | 
				
			||||||
	0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x92, 0x02, 0x0a, 0x14, 0x43, 0x65, 0x72,
 | 
						0x92, 0x02, 0x0a, 0x14, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x41,
 | 
				
			||||||
	0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74,
 | 
						0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x55, 0x0a, 0x13, 0x49, 0x73, 0x73, 0x75,
 | 
				
			||||||
	0x79, 0x12, 0x55, 0x0a, 0x13, 0x49, 0x73, 0x73, 0x75, 0x65, 0x50, 0x72, 0x65, 0x63, 0x65, 0x72,
 | 
						0x65, 0x50, 0x72, 0x65, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12,
 | 
				
			||||||
	0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x1b, 0x2e, 0x63, 0x61, 0x2e, 0x49, 0x73,
 | 
						0x1b, 0x2e, 0x63, 0x61, 0x2e, 0x49, 0x73, 0x73, 0x75, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66,
 | 
				
			||||||
	0x73, 0x75, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65,
 | 
						0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x63,
 | 
				
			||||||
	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x63, 0x61, 0x2e, 0x49, 0x73, 0x73, 0x75, 0x65,
 | 
						0x61, 0x2e, 0x49, 0x73, 0x73, 0x75, 0x65, 0x50, 0x72, 0x65, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66,
 | 
				
			||||||
	0x50, 0x72, 0x65, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65,
 | 
						0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12,
 | 
				
			||||||
	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x21, 0x49, 0x73, 0x73, 0x75,
 | 
						0x66, 0x0a, 0x21, 0x49, 0x73, 0x73, 0x75, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63,
 | 
				
			||||||
	0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x50,
 | 
					 | 
				
			||||||
	0x72, 0x65, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x2e,
 | 
					 | 
				
			||||||
	0x63, 0x61, 0x2e, 0x49, 0x73, 0x73, 0x75, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63,
 | 
					 | 
				
			||||||
	0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69,
 | 
						0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69,
 | 
				
			||||||
	0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6f,
 | 
						0x63, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x2e, 0x63, 0x61, 0x2e, 0x49, 0x73, 0x73, 0x75, 0x65, 0x43,
 | 
				
			||||||
	0x72, 0x65, 0x2e, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x22, 0x00,
 | 
						0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x50, 0x72, 0x65,
 | 
				
			||||||
	0x12, 0x3b, 0x0a, 0x0c, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4f, 0x43, 0x53, 0x50,
 | 
						0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
 | 
				
			||||||
	0x12, 0x17, 0x2e, 0x63, 0x61, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4f, 0x43,
 | 
						0x73, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66,
 | 
				
			||||||
	0x53, 0x50, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x63, 0x61, 0x2e, 0x4f,
 | 
						0x69, 0x63, 0x61, 0x74, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x0c, 0x47, 0x65, 0x6e, 0x65, 0x72,
 | 
				
			||||||
	0x43, 0x53, 0x50, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x32, 0x4c, 0x0a,
 | 
						0x61, 0x74, 0x65, 0x4f, 0x43, 0x53, 0x50, 0x12, 0x17, 0x2e, 0x63, 0x61, 0x2e, 0x47, 0x65, 0x6e,
 | 
				
			||||||
	0x0d, 0x4f, 0x43, 0x53, 0x50, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x3b,
 | 
						0x65, 0x72, 0x61, 0x74, 0x65, 0x4f, 0x43, 0x53, 0x50, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
 | 
				
			||||||
	0x0a, 0x0c, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4f, 0x43, 0x53, 0x50, 0x12, 0x17,
 | 
						0x1a, 0x10, 0x2e, 0x63, 0x61, 0x2e, 0x4f, 0x43, 0x53, 0x50, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
 | 
				
			||||||
	0x2e, 0x63, 0x61, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4f, 0x43, 0x53, 0x50,
 | 
						0x73, 0x65, 0x22, 0x00, 0x32, 0x4c, 0x0a, 0x0d, 0x4f, 0x43, 0x53, 0x50, 0x47, 0x65, 0x6e, 0x65,
 | 
				
			||||||
	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x63, 0x61, 0x2e, 0x4f, 0x43, 0x53,
 | 
						0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x3b, 0x0a, 0x0c, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,
 | 
				
			||||||
	0x50, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x29, 0x5a, 0x27, 0x67,
 | 
						0x65, 0x4f, 0x43, 0x53, 0x50, 0x12, 0x17, 0x2e, 0x63, 0x61, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72,
 | 
				
			||||||
	0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x65, 0x74, 0x73, 0x65, 0x6e,
 | 
						0x61, 0x74, 0x65, 0x4f, 0x43, 0x53, 0x50, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10,
 | 
				
			||||||
	0x63, 0x72, 0x79, 0x70, 0x74, 0x2f, 0x62, 0x6f, 0x75, 0x6c, 0x64, 0x65, 0x72, 0x2f, 0x63, 0x61,
 | 
						0x2e, 0x63, 0x61, 0x2e, 0x4f, 0x43, 0x53, 0x50, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
 | 
				
			||||||
	0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 | 
						0x22, 0x00, 0x42, 0x29, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,
 | 
				
			||||||
 | 
						0x2f, 0x6c, 0x65, 0x74, 0x73, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x2f, 0x62, 0x6f, 0x75,
 | 
				
			||||||
 | 
						0x6c, 0x64, 0x65, 0x72, 0x2f, 0x63, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70,
 | 
				
			||||||
 | 
						0x72, 0x6f, 0x74, 0x6f, 0x33,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
	file_ca_proto_ca_proto_rawDescOnce sync.Once
 | 
						file_ca_proto_rawDescOnce sync.Once
 | 
				
			||||||
	file_ca_proto_ca_proto_rawDescData = file_ca_proto_ca_proto_rawDesc
 | 
						file_ca_proto_rawDescData = file_ca_proto_rawDesc
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func file_ca_proto_ca_proto_rawDescGZIP() []byte {
 | 
					func file_ca_proto_rawDescGZIP() []byte {
 | 
				
			||||||
	file_ca_proto_ca_proto_rawDescOnce.Do(func() {
 | 
						file_ca_proto_rawDescOnce.Do(func() {
 | 
				
			||||||
		file_ca_proto_ca_proto_rawDescData = protoimpl.X.CompressGZIP(file_ca_proto_ca_proto_rawDescData)
 | 
							file_ca_proto_rawDescData = protoimpl.X.CompressGZIP(file_ca_proto_rawDescData)
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	return file_ca_proto_ca_proto_rawDescData
 | 
						return file_ca_proto_rawDescData
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var file_ca_proto_ca_proto_msgTypes = make([]protoimpl.MessageInfo, 5)
 | 
					var file_ca_proto_msgTypes = make([]protoimpl.MessageInfo, 5)
 | 
				
			||||||
var file_ca_proto_ca_proto_goTypes = []interface{}{
 | 
					var file_ca_proto_goTypes = []interface{}{
 | 
				
			||||||
	(*IssueCertificateRequest)(nil),                  // 0: ca.IssueCertificateRequest
 | 
						(*IssueCertificateRequest)(nil),                  // 0: ca.IssueCertificateRequest
 | 
				
			||||||
	(*IssuePrecertificateResponse)(nil),              // 1: ca.IssuePrecertificateResponse
 | 
						(*IssuePrecertificateResponse)(nil),              // 1: ca.IssuePrecertificateResponse
 | 
				
			||||||
	(*IssueCertificateForPrecertificateRequest)(nil), // 2: ca.IssueCertificateForPrecertificateRequest
 | 
						(*IssueCertificateForPrecertificateRequest)(nil), // 2: ca.IssueCertificateForPrecertificateRequest
 | 
				
			||||||
	(*GenerateOCSPRequest)(nil),                      // 3: ca.GenerateOCSPRequest
 | 
						(*GenerateOCSPRequest)(nil),                      // 3: ca.GenerateOCSPRequest
 | 
				
			||||||
	(*OCSPResponse)(nil),                             // 4: ca.OCSPResponse
 | 
						(*OCSPResponse)(nil),                             // 4: ca.OCSPResponse
 | 
				
			||||||
	(*proto1.Certificate)(nil),                       // 5: core.Certificate
 | 
						(*proto.Certificate)(nil),                        // 5: core.Certificate
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
var file_ca_proto_ca_proto_depIdxs = []int32{
 | 
					var file_ca_proto_depIdxs = []int32{
 | 
				
			||||||
	0, // 0: ca.CertificateAuthority.IssuePrecertificate:input_type -> ca.IssueCertificateRequest
 | 
						0, // 0: ca.CertificateAuthority.IssuePrecertificate:input_type -> ca.IssueCertificateRequest
 | 
				
			||||||
	2, // 1: ca.CertificateAuthority.IssueCertificateForPrecertificate:input_type -> ca.IssueCertificateForPrecertificateRequest
 | 
						2, // 1: ca.CertificateAuthority.IssueCertificateForPrecertificate:input_type -> ca.IssueCertificateForPrecertificateRequest
 | 
				
			||||||
	3, // 2: ca.CertificateAuthority.GenerateOCSP:input_type -> ca.GenerateOCSPRequest
 | 
						3, // 2: ca.CertificateAuthority.GenerateOCSP:input_type -> ca.GenerateOCSPRequest
 | 
				
			||||||
| 
						 | 
					@ -460,13 +451,13 @@ var file_ca_proto_ca_proto_depIdxs = []int32{
 | 
				
			||||||
	0, // [0:0] is the sub-list for field type_name
 | 
						0, // [0:0] is the sub-list for field type_name
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func init() { file_ca_proto_ca_proto_init() }
 | 
					func init() { file_ca_proto_init() }
 | 
				
			||||||
func file_ca_proto_ca_proto_init() {
 | 
					func file_ca_proto_init() {
 | 
				
			||||||
	if File_ca_proto_ca_proto != nil {
 | 
						if File_ca_proto != nil {
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if !protoimpl.UnsafeEnabled {
 | 
						if !protoimpl.UnsafeEnabled {
 | 
				
			||||||
		file_ca_proto_ca_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 | 
							file_ca_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 | 
				
			||||||
			switch v := v.(*IssueCertificateRequest); i {
 | 
								switch v := v.(*IssueCertificateRequest); i {
 | 
				
			||||||
			case 0:
 | 
								case 0:
 | 
				
			||||||
				return &v.state
 | 
									return &v.state
 | 
				
			||||||
| 
						 | 
					@ -478,7 +469,7 @@ func file_ca_proto_ca_proto_init() {
 | 
				
			||||||
				return nil
 | 
									return nil
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		file_ca_proto_ca_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 | 
							file_ca_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 | 
				
			||||||
			switch v := v.(*IssuePrecertificateResponse); i {
 | 
								switch v := v.(*IssuePrecertificateResponse); i {
 | 
				
			||||||
			case 0:
 | 
								case 0:
 | 
				
			||||||
				return &v.state
 | 
									return &v.state
 | 
				
			||||||
| 
						 | 
					@ -490,7 +481,7 @@ func file_ca_proto_ca_proto_init() {
 | 
				
			||||||
				return nil
 | 
									return nil
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		file_ca_proto_ca_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
 | 
							file_ca_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
 | 
				
			||||||
			switch v := v.(*IssueCertificateForPrecertificateRequest); i {
 | 
								switch v := v.(*IssueCertificateForPrecertificateRequest); i {
 | 
				
			||||||
			case 0:
 | 
								case 0:
 | 
				
			||||||
				return &v.state
 | 
									return &v.state
 | 
				
			||||||
| 
						 | 
					@ -502,7 +493,7 @@ func file_ca_proto_ca_proto_init() {
 | 
				
			||||||
				return nil
 | 
									return nil
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		file_ca_proto_ca_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
 | 
							file_ca_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
 | 
				
			||||||
			switch v := v.(*GenerateOCSPRequest); i {
 | 
								switch v := v.(*GenerateOCSPRequest); i {
 | 
				
			||||||
			case 0:
 | 
								case 0:
 | 
				
			||||||
				return &v.state
 | 
									return &v.state
 | 
				
			||||||
| 
						 | 
					@ -514,7 +505,7 @@ func file_ca_proto_ca_proto_init() {
 | 
				
			||||||
				return nil
 | 
									return nil
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		file_ca_proto_ca_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
 | 
							file_ca_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
 | 
				
			||||||
			switch v := v.(*OCSPResponse); i {
 | 
								switch v := v.(*OCSPResponse); i {
 | 
				
			||||||
			case 0:
 | 
								case 0:
 | 
				
			||||||
				return &v.state
 | 
									return &v.state
 | 
				
			||||||
| 
						 | 
					@ -531,242 +522,18 @@ func file_ca_proto_ca_proto_init() {
 | 
				
			||||||
	out := protoimpl.TypeBuilder{
 | 
						out := protoimpl.TypeBuilder{
 | 
				
			||||||
		File: protoimpl.DescBuilder{
 | 
							File: protoimpl.DescBuilder{
 | 
				
			||||||
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 | 
								GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 | 
				
			||||||
			RawDescriptor: file_ca_proto_ca_proto_rawDesc,
 | 
								RawDescriptor: file_ca_proto_rawDesc,
 | 
				
			||||||
			NumEnums:      0,
 | 
								NumEnums:      0,
 | 
				
			||||||
			NumMessages:   5,
 | 
								NumMessages:   5,
 | 
				
			||||||
			NumExtensions: 0,
 | 
								NumExtensions: 0,
 | 
				
			||||||
			NumServices:   2,
 | 
								NumServices:   2,
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		GoTypes:           file_ca_proto_ca_proto_goTypes,
 | 
							GoTypes:           file_ca_proto_goTypes,
 | 
				
			||||||
		DependencyIndexes: file_ca_proto_ca_proto_depIdxs,
 | 
							DependencyIndexes: file_ca_proto_depIdxs,
 | 
				
			||||||
		MessageInfos:      file_ca_proto_ca_proto_msgTypes,
 | 
							MessageInfos:      file_ca_proto_msgTypes,
 | 
				
			||||||
	}.Build()
 | 
						}.Build()
 | 
				
			||||||
	File_ca_proto_ca_proto = out.File
 | 
						File_ca_proto = out.File
 | 
				
			||||||
	file_ca_proto_ca_proto_rawDesc = nil
 | 
						file_ca_proto_rawDesc = nil
 | 
				
			||||||
	file_ca_proto_ca_proto_goTypes = nil
 | 
						file_ca_proto_goTypes = nil
 | 
				
			||||||
	file_ca_proto_ca_proto_depIdxs = nil
 | 
						file_ca_proto_depIdxs = nil
 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Reference imports to suppress errors if they are not otherwise used.
 | 
					 | 
				
			||||||
var _ context.Context
 | 
					 | 
				
			||||||
var _ grpc.ClientConnInterface
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// This is a compile-time assertion to ensure that this generated file
 | 
					 | 
				
			||||||
// is compatible with the grpc package it is being compiled against.
 | 
					 | 
				
			||||||
const _ = grpc.SupportPackageIsVersion6
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// CertificateAuthorityClient is the client API for CertificateAuthority service.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
 | 
					 | 
				
			||||||
type CertificateAuthorityClient interface {
 | 
					 | 
				
			||||||
	IssuePrecertificate(ctx context.Context, in *IssueCertificateRequest, opts ...grpc.CallOption) (*IssuePrecertificateResponse, error)
 | 
					 | 
				
			||||||
	IssueCertificateForPrecertificate(ctx context.Context, in *IssueCertificateForPrecertificateRequest, opts ...grpc.CallOption) (*proto1.Certificate, error)
 | 
					 | 
				
			||||||
	GenerateOCSP(ctx context.Context, in *GenerateOCSPRequest, opts ...grpc.CallOption) (*OCSPResponse, error)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type certificateAuthorityClient struct {
 | 
					 | 
				
			||||||
	cc grpc.ClientConnInterface
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func NewCertificateAuthorityClient(cc grpc.ClientConnInterface) CertificateAuthorityClient {
 | 
					 | 
				
			||||||
	return &certificateAuthorityClient{cc}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (c *certificateAuthorityClient) IssuePrecertificate(ctx context.Context, in *IssueCertificateRequest, opts ...grpc.CallOption) (*IssuePrecertificateResponse, error) {
 | 
					 | 
				
			||||||
	out := new(IssuePrecertificateResponse)
 | 
					 | 
				
			||||||
	err := c.cc.Invoke(ctx, "/ca.CertificateAuthority/IssuePrecertificate", in, out, opts...)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return out, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (c *certificateAuthorityClient) IssueCertificateForPrecertificate(ctx context.Context, in *IssueCertificateForPrecertificateRequest, opts ...grpc.CallOption) (*proto1.Certificate, error) {
 | 
					 | 
				
			||||||
	out := new(proto1.Certificate)
 | 
					 | 
				
			||||||
	err := c.cc.Invoke(ctx, "/ca.CertificateAuthority/IssueCertificateForPrecertificate", in, out, opts...)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return out, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (c *certificateAuthorityClient) GenerateOCSP(ctx context.Context, in *GenerateOCSPRequest, opts ...grpc.CallOption) (*OCSPResponse, error) {
 | 
					 | 
				
			||||||
	out := new(OCSPResponse)
 | 
					 | 
				
			||||||
	err := c.cc.Invoke(ctx, "/ca.CertificateAuthority/GenerateOCSP", in, out, opts...)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return out, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// CertificateAuthorityServer is the server API for CertificateAuthority service.
 | 
					 | 
				
			||||||
type CertificateAuthorityServer interface {
 | 
					 | 
				
			||||||
	IssuePrecertificate(context.Context, *IssueCertificateRequest) (*IssuePrecertificateResponse, error)
 | 
					 | 
				
			||||||
	IssueCertificateForPrecertificate(context.Context, *IssueCertificateForPrecertificateRequest) (*proto1.Certificate, error)
 | 
					 | 
				
			||||||
	GenerateOCSP(context.Context, *GenerateOCSPRequest) (*OCSPResponse, error)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// UnimplementedCertificateAuthorityServer can be embedded to have forward compatible implementations.
 | 
					 | 
				
			||||||
type UnimplementedCertificateAuthorityServer struct {
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (*UnimplementedCertificateAuthorityServer) IssuePrecertificate(context.Context, *IssueCertificateRequest) (*IssuePrecertificateResponse, error) {
 | 
					 | 
				
			||||||
	return nil, status.Errorf(codes.Unimplemented, "method IssuePrecertificate not implemented")
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
func (*UnimplementedCertificateAuthorityServer) IssueCertificateForPrecertificate(context.Context, *IssueCertificateForPrecertificateRequest) (*proto1.Certificate, error) {
 | 
					 | 
				
			||||||
	return nil, status.Errorf(codes.Unimplemented, "method IssueCertificateForPrecertificate not implemented")
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
func (*UnimplementedCertificateAuthorityServer) GenerateOCSP(context.Context, *GenerateOCSPRequest) (*OCSPResponse, error) {
 | 
					 | 
				
			||||||
	return nil, status.Errorf(codes.Unimplemented, "method GenerateOCSP not implemented")
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func RegisterCertificateAuthorityServer(s *grpc.Server, srv CertificateAuthorityServer) {
 | 
					 | 
				
			||||||
	s.RegisterService(&_CertificateAuthority_serviceDesc, srv)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func _CertificateAuthority_IssuePrecertificate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
					 | 
				
			||||||
	in := new(IssueCertificateRequest)
 | 
					 | 
				
			||||||
	if err := dec(in); err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if interceptor == nil {
 | 
					 | 
				
			||||||
		return srv.(CertificateAuthorityServer).IssuePrecertificate(ctx, in)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	info := &grpc.UnaryServerInfo{
 | 
					 | 
				
			||||||
		Server:     srv,
 | 
					 | 
				
			||||||
		FullMethod: "/ca.CertificateAuthority/IssuePrecertificate",
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 | 
					 | 
				
			||||||
		return srv.(CertificateAuthorityServer).IssuePrecertificate(ctx, req.(*IssueCertificateRequest))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return interceptor(ctx, in, info, handler)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func _CertificateAuthority_IssueCertificateForPrecertificate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
					 | 
				
			||||||
	in := new(IssueCertificateForPrecertificateRequest)
 | 
					 | 
				
			||||||
	if err := dec(in); err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if interceptor == nil {
 | 
					 | 
				
			||||||
		return srv.(CertificateAuthorityServer).IssueCertificateForPrecertificate(ctx, in)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	info := &grpc.UnaryServerInfo{
 | 
					 | 
				
			||||||
		Server:     srv,
 | 
					 | 
				
			||||||
		FullMethod: "/ca.CertificateAuthority/IssueCertificateForPrecertificate",
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 | 
					 | 
				
			||||||
		return srv.(CertificateAuthorityServer).IssueCertificateForPrecertificate(ctx, req.(*IssueCertificateForPrecertificateRequest))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return interceptor(ctx, in, info, handler)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func _CertificateAuthority_GenerateOCSP_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
					 | 
				
			||||||
	in := new(GenerateOCSPRequest)
 | 
					 | 
				
			||||||
	if err := dec(in); err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if interceptor == nil {
 | 
					 | 
				
			||||||
		return srv.(CertificateAuthorityServer).GenerateOCSP(ctx, in)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	info := &grpc.UnaryServerInfo{
 | 
					 | 
				
			||||||
		Server:     srv,
 | 
					 | 
				
			||||||
		FullMethod: "/ca.CertificateAuthority/GenerateOCSP",
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 | 
					 | 
				
			||||||
		return srv.(CertificateAuthorityServer).GenerateOCSP(ctx, req.(*GenerateOCSPRequest))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return interceptor(ctx, in, info, handler)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var _CertificateAuthority_serviceDesc = grpc.ServiceDesc{
 | 
					 | 
				
			||||||
	ServiceName: "ca.CertificateAuthority",
 | 
					 | 
				
			||||||
	HandlerType: (*CertificateAuthorityServer)(nil),
 | 
					 | 
				
			||||||
	Methods: []grpc.MethodDesc{
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			MethodName: "IssuePrecertificate",
 | 
					 | 
				
			||||||
			Handler:    _CertificateAuthority_IssuePrecertificate_Handler,
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			MethodName: "IssueCertificateForPrecertificate",
 | 
					 | 
				
			||||||
			Handler:    _CertificateAuthority_IssueCertificateForPrecertificate_Handler,
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			MethodName: "GenerateOCSP",
 | 
					 | 
				
			||||||
			Handler:    _CertificateAuthority_GenerateOCSP_Handler,
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
	Streams:  []grpc.StreamDesc{},
 | 
					 | 
				
			||||||
	Metadata: "ca/proto/ca.proto",
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// OCSPGeneratorClient is the client API for OCSPGenerator service.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
 | 
					 | 
				
			||||||
type OCSPGeneratorClient interface {
 | 
					 | 
				
			||||||
	GenerateOCSP(ctx context.Context, in *GenerateOCSPRequest, opts ...grpc.CallOption) (*OCSPResponse, error)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type oCSPGeneratorClient struct {
 | 
					 | 
				
			||||||
	cc grpc.ClientConnInterface
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func NewOCSPGeneratorClient(cc grpc.ClientConnInterface) OCSPGeneratorClient {
 | 
					 | 
				
			||||||
	return &oCSPGeneratorClient{cc}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (c *oCSPGeneratorClient) GenerateOCSP(ctx context.Context, in *GenerateOCSPRequest, opts ...grpc.CallOption) (*OCSPResponse, error) {
 | 
					 | 
				
			||||||
	out := new(OCSPResponse)
 | 
					 | 
				
			||||||
	err := c.cc.Invoke(ctx, "/ca.OCSPGenerator/GenerateOCSP", in, out, opts...)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return out, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// OCSPGeneratorServer is the server API for OCSPGenerator service.
 | 
					 | 
				
			||||||
type OCSPGeneratorServer interface {
 | 
					 | 
				
			||||||
	GenerateOCSP(context.Context, *GenerateOCSPRequest) (*OCSPResponse, error)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// UnimplementedOCSPGeneratorServer can be embedded to have forward compatible implementations.
 | 
					 | 
				
			||||||
type UnimplementedOCSPGeneratorServer struct {
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (*UnimplementedOCSPGeneratorServer) GenerateOCSP(context.Context, *GenerateOCSPRequest) (*OCSPResponse, error) {
 | 
					 | 
				
			||||||
	return nil, status.Errorf(codes.Unimplemented, "method GenerateOCSP not implemented")
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func RegisterOCSPGeneratorServer(s *grpc.Server, srv OCSPGeneratorServer) {
 | 
					 | 
				
			||||||
	s.RegisterService(&_OCSPGenerator_serviceDesc, srv)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func _OCSPGenerator_GenerateOCSP_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
					 | 
				
			||||||
	in := new(GenerateOCSPRequest)
 | 
					 | 
				
			||||||
	if err := dec(in); err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if interceptor == nil {
 | 
					 | 
				
			||||||
		return srv.(OCSPGeneratorServer).GenerateOCSP(ctx, in)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	info := &grpc.UnaryServerInfo{
 | 
					 | 
				
			||||||
		Server:     srv,
 | 
					 | 
				
			||||||
		FullMethod: "/ca.OCSPGenerator/GenerateOCSP",
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 | 
					 | 
				
			||||||
		return srv.(OCSPGeneratorServer).GenerateOCSP(ctx, req.(*GenerateOCSPRequest))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return interceptor(ctx, in, info, handler)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var _OCSPGenerator_serviceDesc = grpc.ServiceDesc{
 | 
					 | 
				
			||||||
	ServiceName: "ca.OCSPGenerator",
 | 
					 | 
				
			||||||
	HandlerType: (*OCSPGeneratorServer)(nil),
 | 
					 | 
				
			||||||
	Methods: []grpc.MethodDesc{
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			MethodName: "GenerateOCSP",
 | 
					 | 
				
			||||||
			Handler:    _OCSPGenerator_GenerateOCSP_Handler,
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
	Streams:  []grpc.StreamDesc{},
 | 
					 | 
				
			||||||
	Metadata: "ca/proto/ca.proto",
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,260 @@
 | 
				
			||||||
 | 
					// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package proto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						context "context"
 | 
				
			||||||
 | 
						proto "github.com/letsencrypt/boulder/core/proto"
 | 
				
			||||||
 | 
						grpc "google.golang.org/grpc"
 | 
				
			||||||
 | 
						codes "google.golang.org/grpc/codes"
 | 
				
			||||||
 | 
						status "google.golang.org/grpc/status"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CertificateAuthorityClient is the client API for CertificateAuthority 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.
 | 
				
			||||||
 | 
					type CertificateAuthorityClient interface {
 | 
				
			||||||
 | 
						IssuePrecertificate(ctx context.Context, in *IssueCertificateRequest, opts ...grpc.CallOption) (*IssuePrecertificateResponse, error)
 | 
				
			||||||
 | 
						IssueCertificateForPrecertificate(ctx context.Context, in *IssueCertificateForPrecertificateRequest, opts ...grpc.CallOption) (*proto.Certificate, error)
 | 
				
			||||||
 | 
						GenerateOCSP(ctx context.Context, in *GenerateOCSPRequest, opts ...grpc.CallOption) (*OCSPResponse, error)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type certificateAuthorityClient struct {
 | 
				
			||||||
 | 
						cc grpc.ClientConnInterface
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewCertificateAuthorityClient(cc grpc.ClientConnInterface) CertificateAuthorityClient {
 | 
				
			||||||
 | 
						return &certificateAuthorityClient{cc}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *certificateAuthorityClient) IssuePrecertificate(ctx context.Context, in *IssueCertificateRequest, opts ...grpc.CallOption) (*IssuePrecertificateResponse, error) {
 | 
				
			||||||
 | 
						out := new(IssuePrecertificateResponse)
 | 
				
			||||||
 | 
						err := c.cc.Invoke(ctx, "/ca.CertificateAuthority/IssuePrecertificate", in, out, opts...)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return out, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *certificateAuthorityClient) IssueCertificateForPrecertificate(ctx context.Context, in *IssueCertificateForPrecertificateRequest, opts ...grpc.CallOption) (*proto.Certificate, error) {
 | 
				
			||||||
 | 
						out := new(proto.Certificate)
 | 
				
			||||||
 | 
						err := c.cc.Invoke(ctx, "/ca.CertificateAuthority/IssueCertificateForPrecertificate", in, out, opts...)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return out, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *certificateAuthorityClient) GenerateOCSP(ctx context.Context, in *GenerateOCSPRequest, opts ...grpc.CallOption) (*OCSPResponse, error) {
 | 
				
			||||||
 | 
						out := new(OCSPResponse)
 | 
				
			||||||
 | 
						err := c.cc.Invoke(ctx, "/ca.CertificateAuthority/GenerateOCSP", in, out, opts...)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return out, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CertificateAuthorityServer is the server API for CertificateAuthority service.
 | 
				
			||||||
 | 
					// All implementations must embed UnimplementedCertificateAuthorityServer
 | 
				
			||||||
 | 
					// for forward compatibility
 | 
				
			||||||
 | 
					type CertificateAuthorityServer interface {
 | 
				
			||||||
 | 
						IssuePrecertificate(context.Context, *IssueCertificateRequest) (*IssuePrecertificateResponse, error)
 | 
				
			||||||
 | 
						IssueCertificateForPrecertificate(context.Context, *IssueCertificateForPrecertificateRequest) (*proto.Certificate, error)
 | 
				
			||||||
 | 
						GenerateOCSP(context.Context, *GenerateOCSPRequest) (*OCSPResponse, error)
 | 
				
			||||||
 | 
						mustEmbedUnimplementedCertificateAuthorityServer()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// UnimplementedCertificateAuthorityServer must be embedded to have forward compatible implementations.
 | 
				
			||||||
 | 
					type UnimplementedCertificateAuthorityServer struct {
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (UnimplementedCertificateAuthorityServer) IssuePrecertificate(context.Context, *IssueCertificateRequest) (*IssuePrecertificateResponse, error) {
 | 
				
			||||||
 | 
						return nil, status.Errorf(codes.Unimplemented, "method IssuePrecertificate not implemented")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					func (UnimplementedCertificateAuthorityServer) IssueCertificateForPrecertificate(context.Context, *IssueCertificateForPrecertificateRequest) (*proto.Certificate, error) {
 | 
				
			||||||
 | 
						return nil, status.Errorf(codes.Unimplemented, "method IssueCertificateForPrecertificate not implemented")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					func (UnimplementedCertificateAuthorityServer) GenerateOCSP(context.Context, *GenerateOCSPRequest) (*OCSPResponse, error) {
 | 
				
			||||||
 | 
						return nil, status.Errorf(codes.Unimplemented, "method GenerateOCSP not implemented")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					func (UnimplementedCertificateAuthorityServer) mustEmbedUnimplementedCertificateAuthorityServer() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// UnsafeCertificateAuthorityServer may be embedded to opt out of forward compatibility for this service.
 | 
				
			||||||
 | 
					// Use of this interface is not recommended, as added methods to CertificateAuthorityServer will
 | 
				
			||||||
 | 
					// result in compilation errors.
 | 
				
			||||||
 | 
					type UnsafeCertificateAuthorityServer interface {
 | 
				
			||||||
 | 
						mustEmbedUnimplementedCertificateAuthorityServer()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func RegisterCertificateAuthorityServer(s grpc.ServiceRegistrar, srv CertificateAuthorityServer) {
 | 
				
			||||||
 | 
						s.RegisterService(&CertificateAuthority_ServiceDesc, srv)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _CertificateAuthority_IssuePrecertificate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
				
			||||||
 | 
						in := new(IssueCertificateRequest)
 | 
				
			||||||
 | 
						if err := dec(in); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if interceptor == nil {
 | 
				
			||||||
 | 
							return srv.(CertificateAuthorityServer).IssuePrecertificate(ctx, in)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						info := &grpc.UnaryServerInfo{
 | 
				
			||||||
 | 
							Server:     srv,
 | 
				
			||||||
 | 
							FullMethod: "/ca.CertificateAuthority/IssuePrecertificate",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 | 
				
			||||||
 | 
							return srv.(CertificateAuthorityServer).IssuePrecertificate(ctx, req.(*IssueCertificateRequest))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return interceptor(ctx, in, info, handler)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _CertificateAuthority_IssueCertificateForPrecertificate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
				
			||||||
 | 
						in := new(IssueCertificateForPrecertificateRequest)
 | 
				
			||||||
 | 
						if err := dec(in); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if interceptor == nil {
 | 
				
			||||||
 | 
							return srv.(CertificateAuthorityServer).IssueCertificateForPrecertificate(ctx, in)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						info := &grpc.UnaryServerInfo{
 | 
				
			||||||
 | 
							Server:     srv,
 | 
				
			||||||
 | 
							FullMethod: "/ca.CertificateAuthority/IssueCertificateForPrecertificate",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 | 
				
			||||||
 | 
							return srv.(CertificateAuthorityServer).IssueCertificateForPrecertificate(ctx, req.(*IssueCertificateForPrecertificateRequest))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return interceptor(ctx, in, info, handler)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _CertificateAuthority_GenerateOCSP_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
				
			||||||
 | 
						in := new(GenerateOCSPRequest)
 | 
				
			||||||
 | 
						if err := dec(in); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if interceptor == nil {
 | 
				
			||||||
 | 
							return srv.(CertificateAuthorityServer).GenerateOCSP(ctx, in)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						info := &grpc.UnaryServerInfo{
 | 
				
			||||||
 | 
							Server:     srv,
 | 
				
			||||||
 | 
							FullMethod: "/ca.CertificateAuthority/GenerateOCSP",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 | 
				
			||||||
 | 
							return srv.(CertificateAuthorityServer).GenerateOCSP(ctx, req.(*GenerateOCSPRequest))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return interceptor(ctx, in, info, handler)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CertificateAuthority_ServiceDesc is the grpc.ServiceDesc for CertificateAuthority service.
 | 
				
			||||||
 | 
					// It's only intended for direct use with grpc.RegisterService,
 | 
				
			||||||
 | 
					// and not to be introspected or modified (even as a copy)
 | 
				
			||||||
 | 
					var CertificateAuthority_ServiceDesc = grpc.ServiceDesc{
 | 
				
			||||||
 | 
						ServiceName: "ca.CertificateAuthority",
 | 
				
			||||||
 | 
						HandlerType: (*CertificateAuthorityServer)(nil),
 | 
				
			||||||
 | 
						Methods: []grpc.MethodDesc{
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								MethodName: "IssuePrecertificate",
 | 
				
			||||||
 | 
								Handler:    _CertificateAuthority_IssuePrecertificate_Handler,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								MethodName: "IssueCertificateForPrecertificate",
 | 
				
			||||||
 | 
								Handler:    _CertificateAuthority_IssueCertificateForPrecertificate_Handler,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								MethodName: "GenerateOCSP",
 | 
				
			||||||
 | 
								Handler:    _CertificateAuthority_GenerateOCSP_Handler,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						Streams:  []grpc.StreamDesc{},
 | 
				
			||||||
 | 
						Metadata: "ca.proto",
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// OCSPGeneratorClient is the client API for OCSPGenerator 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.
 | 
				
			||||||
 | 
					type OCSPGeneratorClient interface {
 | 
				
			||||||
 | 
						GenerateOCSP(ctx context.Context, in *GenerateOCSPRequest, opts ...grpc.CallOption) (*OCSPResponse, error)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type oCSPGeneratorClient struct {
 | 
				
			||||||
 | 
						cc grpc.ClientConnInterface
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewOCSPGeneratorClient(cc grpc.ClientConnInterface) OCSPGeneratorClient {
 | 
				
			||||||
 | 
						return &oCSPGeneratorClient{cc}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *oCSPGeneratorClient) GenerateOCSP(ctx context.Context, in *GenerateOCSPRequest, opts ...grpc.CallOption) (*OCSPResponse, error) {
 | 
				
			||||||
 | 
						out := new(OCSPResponse)
 | 
				
			||||||
 | 
						err := c.cc.Invoke(ctx, "/ca.OCSPGenerator/GenerateOCSP", in, out, opts...)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return out, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// OCSPGeneratorServer is the server API for OCSPGenerator service.
 | 
				
			||||||
 | 
					// All implementations must embed UnimplementedOCSPGeneratorServer
 | 
				
			||||||
 | 
					// for forward compatibility
 | 
				
			||||||
 | 
					type OCSPGeneratorServer interface {
 | 
				
			||||||
 | 
						GenerateOCSP(context.Context, *GenerateOCSPRequest) (*OCSPResponse, error)
 | 
				
			||||||
 | 
						mustEmbedUnimplementedOCSPGeneratorServer()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// UnimplementedOCSPGeneratorServer must be embedded to have forward compatible implementations.
 | 
				
			||||||
 | 
					type UnimplementedOCSPGeneratorServer struct {
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (UnimplementedOCSPGeneratorServer) GenerateOCSP(context.Context, *GenerateOCSPRequest) (*OCSPResponse, error) {
 | 
				
			||||||
 | 
						return nil, status.Errorf(codes.Unimplemented, "method GenerateOCSP not implemented")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					func (UnimplementedOCSPGeneratorServer) mustEmbedUnimplementedOCSPGeneratorServer() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// UnsafeOCSPGeneratorServer may be embedded to opt out of forward compatibility for this service.
 | 
				
			||||||
 | 
					// Use of this interface is not recommended, as added methods to OCSPGeneratorServer will
 | 
				
			||||||
 | 
					// result in compilation errors.
 | 
				
			||||||
 | 
					type UnsafeOCSPGeneratorServer interface {
 | 
				
			||||||
 | 
						mustEmbedUnimplementedOCSPGeneratorServer()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func RegisterOCSPGeneratorServer(s grpc.ServiceRegistrar, srv OCSPGeneratorServer) {
 | 
				
			||||||
 | 
						s.RegisterService(&OCSPGenerator_ServiceDesc, srv)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _OCSPGenerator_GenerateOCSP_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
				
			||||||
 | 
						in := new(GenerateOCSPRequest)
 | 
				
			||||||
 | 
						if err := dec(in); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if interceptor == nil {
 | 
				
			||||||
 | 
							return srv.(OCSPGeneratorServer).GenerateOCSP(ctx, in)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						info := &grpc.UnaryServerInfo{
 | 
				
			||||||
 | 
							Server:     srv,
 | 
				
			||||||
 | 
							FullMethod: "/ca.OCSPGenerator/GenerateOCSP",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 | 
				
			||||||
 | 
							return srv.(OCSPGeneratorServer).GenerateOCSP(ctx, req.(*GenerateOCSPRequest))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return interceptor(ctx, in, info, handler)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// OCSPGenerator_ServiceDesc is the grpc.ServiceDesc for OCSPGenerator service.
 | 
				
			||||||
 | 
					// It's only intended for direct use with grpc.RegisterService,
 | 
				
			||||||
 | 
					// and not to be introspected or modified (even as a copy)
 | 
				
			||||||
 | 
					var OCSPGenerator_ServiceDesc = grpc.ServiceDesc{
 | 
				
			||||||
 | 
						ServiceName: "ca.OCSPGenerator",
 | 
				
			||||||
 | 
						HandlerType: (*OCSPGeneratorServer)(nil),
 | 
				
			||||||
 | 
						Methods: []grpc.MethodDesc{
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								MethodName: "GenerateOCSP",
 | 
				
			||||||
 | 
								Handler:    _OCSPGenerator_GenerateOCSP_Handler,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						Streams:  []grpc.StreamDesc{},
 | 
				
			||||||
 | 
						Metadata: "ca.proto",
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,3 @@
 | 
				
			||||||
package proto
 | 
					package proto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//go:generate sh -c "cd ../.. && protoc --go_opt=paths=source_relative --go_out=plugins=grpc:. ca/proto/ca.proto"
 | 
					//go:generate sh -c "cd ../.. && protoc -I ca/proto/ -I . --go_out=ca/proto --go-grpc_out=ca/proto --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative ca/proto/ca.proto"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -40,6 +40,7 @@ type config struct {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type akamaiPurger struct {
 | 
					type akamaiPurger struct {
 | 
				
			||||||
 | 
						akamaipb.UnimplementedAkamaiPurgerServer
 | 
				
			||||||
	mu      sync.Mutex
 | 
						mu      sync.Mutex
 | 
				
			||||||
	toPurge []string
 | 
						toPurge []string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,6 +24,7 @@ type config struct {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type nonceServer struct {
 | 
					type nonceServer struct {
 | 
				
			||||||
 | 
						noncepb.UnimplementedNonceServiceServer
 | 
				
			||||||
	inner *nonce.NonceService
 | 
						inner *nonce.NonceService
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,13 +1,12 @@
 | 
				
			||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
 | 
					// Code generated by protoc-gen-go. DO NOT EDIT.
 | 
				
			||||||
// versions:
 | 
					// versions:
 | 
				
			||||||
// 	protoc-gen-go v1.21.0
 | 
					// 	protoc-gen-go v1.26.0
 | 
				
			||||||
// 	protoc        v3.11.4
 | 
					// 	protoc        v3.15.6
 | 
				
			||||||
// source: core/proto/core.proto
 | 
					// source: core.proto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package proto
 | 
					package proto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	proto "github.com/golang/protobuf/proto"
 | 
					 | 
				
			||||||
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 | 
						protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 | 
				
			||||||
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 | 
						protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 | 
				
			||||||
	reflect "reflect"
 | 
						reflect "reflect"
 | 
				
			||||||
| 
						 | 
					@ -21,10 +20,6 @@ const (
 | 
				
			||||||
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
 | 
						_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// This is a compile-time assertion that a sufficiently up-to-date version
 | 
					 | 
				
			||||||
// of the legacy proto package is being used.
 | 
					 | 
				
			||||||
const _ = proto.ProtoPackageIsVersion4
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type Challenge struct {
 | 
					type Challenge struct {
 | 
				
			||||||
	state         protoimpl.MessageState
 | 
						state         protoimpl.MessageState
 | 
				
			||||||
	sizeCache     protoimpl.SizeCache
 | 
						sizeCache     protoimpl.SizeCache
 | 
				
			||||||
| 
						 | 
					@ -44,7 +39,7 @@ type Challenge struct {
 | 
				
			||||||
func (x *Challenge) Reset() {
 | 
					func (x *Challenge) Reset() {
 | 
				
			||||||
	*x = Challenge{}
 | 
						*x = Challenge{}
 | 
				
			||||||
	if protoimpl.UnsafeEnabled {
 | 
						if protoimpl.UnsafeEnabled {
 | 
				
			||||||
		mi := &file_core_proto_core_proto_msgTypes[0]
 | 
							mi := &file_core_proto_msgTypes[0]
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		ms.StoreMessageInfo(mi)
 | 
							ms.StoreMessageInfo(mi)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -57,7 +52,7 @@ func (x *Challenge) String() string {
 | 
				
			||||||
func (*Challenge) ProtoMessage() {}
 | 
					func (*Challenge) ProtoMessage() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *Challenge) ProtoReflect() protoreflect.Message {
 | 
					func (x *Challenge) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
	mi := &file_core_proto_core_proto_msgTypes[0]
 | 
						mi := &file_core_proto_msgTypes[0]
 | 
				
			||||||
	if protoimpl.UnsafeEnabled && x != nil {
 | 
						if protoimpl.UnsafeEnabled && x != nil {
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		if ms.LoadMessageInfo() == nil {
 | 
							if ms.LoadMessageInfo() == nil {
 | 
				
			||||||
| 
						 | 
					@ -70,7 +65,7 @@ func (x *Challenge) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Deprecated: Use Challenge.ProtoReflect.Descriptor instead.
 | 
					// Deprecated: Use Challenge.ProtoReflect.Descriptor instead.
 | 
				
			||||||
func (*Challenge) Descriptor() ([]byte, []int) {
 | 
					func (*Challenge) Descriptor() ([]byte, []int) {
 | 
				
			||||||
	return file_core_proto_core_proto_rawDescGZIP(), []int{0}
 | 
						return file_core_proto_rawDescGZIP(), []int{0}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *Challenge) GetId() int64 {
 | 
					func (x *Challenge) GetId() int64 {
 | 
				
			||||||
| 
						 | 
					@ -156,7 +151,7 @@ type ValidationRecord struct {
 | 
				
			||||||
func (x *ValidationRecord) Reset() {
 | 
					func (x *ValidationRecord) Reset() {
 | 
				
			||||||
	*x = ValidationRecord{}
 | 
						*x = ValidationRecord{}
 | 
				
			||||||
	if protoimpl.UnsafeEnabled {
 | 
						if protoimpl.UnsafeEnabled {
 | 
				
			||||||
		mi := &file_core_proto_core_proto_msgTypes[1]
 | 
							mi := &file_core_proto_msgTypes[1]
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		ms.StoreMessageInfo(mi)
 | 
							ms.StoreMessageInfo(mi)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -169,7 +164,7 @@ func (x *ValidationRecord) String() string {
 | 
				
			||||||
func (*ValidationRecord) ProtoMessage() {}
 | 
					func (*ValidationRecord) ProtoMessage() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *ValidationRecord) ProtoReflect() protoreflect.Message {
 | 
					func (x *ValidationRecord) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
	mi := &file_core_proto_core_proto_msgTypes[1]
 | 
						mi := &file_core_proto_msgTypes[1]
 | 
				
			||||||
	if protoimpl.UnsafeEnabled && x != nil {
 | 
						if protoimpl.UnsafeEnabled && x != nil {
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		if ms.LoadMessageInfo() == nil {
 | 
							if ms.LoadMessageInfo() == nil {
 | 
				
			||||||
| 
						 | 
					@ -182,7 +177,7 @@ func (x *ValidationRecord) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Deprecated: Use ValidationRecord.ProtoReflect.Descriptor instead.
 | 
					// Deprecated: Use ValidationRecord.ProtoReflect.Descriptor instead.
 | 
				
			||||||
func (*ValidationRecord) Descriptor() ([]byte, []int) {
 | 
					func (*ValidationRecord) Descriptor() ([]byte, []int) {
 | 
				
			||||||
	return file_core_proto_core_proto_rawDescGZIP(), []int{1}
 | 
						return file_core_proto_rawDescGZIP(), []int{1}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *ValidationRecord) GetHostname() string {
 | 
					func (x *ValidationRecord) GetHostname() string {
 | 
				
			||||||
| 
						 | 
					@ -247,7 +242,7 @@ type ProblemDetails struct {
 | 
				
			||||||
func (x *ProblemDetails) Reset() {
 | 
					func (x *ProblemDetails) Reset() {
 | 
				
			||||||
	*x = ProblemDetails{}
 | 
						*x = ProblemDetails{}
 | 
				
			||||||
	if protoimpl.UnsafeEnabled {
 | 
						if protoimpl.UnsafeEnabled {
 | 
				
			||||||
		mi := &file_core_proto_core_proto_msgTypes[2]
 | 
							mi := &file_core_proto_msgTypes[2]
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		ms.StoreMessageInfo(mi)
 | 
							ms.StoreMessageInfo(mi)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -260,7 +255,7 @@ func (x *ProblemDetails) String() string {
 | 
				
			||||||
func (*ProblemDetails) ProtoMessage() {}
 | 
					func (*ProblemDetails) ProtoMessage() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *ProblemDetails) ProtoReflect() protoreflect.Message {
 | 
					func (x *ProblemDetails) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
	mi := &file_core_proto_core_proto_msgTypes[2]
 | 
						mi := &file_core_proto_msgTypes[2]
 | 
				
			||||||
	if protoimpl.UnsafeEnabled && x != nil {
 | 
						if protoimpl.UnsafeEnabled && x != nil {
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		if ms.LoadMessageInfo() == nil {
 | 
							if ms.LoadMessageInfo() == nil {
 | 
				
			||||||
| 
						 | 
					@ -273,7 +268,7 @@ func (x *ProblemDetails) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Deprecated: Use ProblemDetails.ProtoReflect.Descriptor instead.
 | 
					// Deprecated: Use ProblemDetails.ProtoReflect.Descriptor instead.
 | 
				
			||||||
func (*ProblemDetails) Descriptor() ([]byte, []int) {
 | 
					func (*ProblemDetails) Descriptor() ([]byte, []int) {
 | 
				
			||||||
	return file_core_proto_core_proto_rawDescGZIP(), []int{2}
 | 
						return file_core_proto_rawDescGZIP(), []int{2}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *ProblemDetails) GetProblemType() string {
 | 
					func (x *ProblemDetails) GetProblemType() string {
 | 
				
			||||||
| 
						 | 
					@ -313,7 +308,7 @@ type Certificate struct {
 | 
				
			||||||
func (x *Certificate) Reset() {
 | 
					func (x *Certificate) Reset() {
 | 
				
			||||||
	*x = Certificate{}
 | 
						*x = Certificate{}
 | 
				
			||||||
	if protoimpl.UnsafeEnabled {
 | 
						if protoimpl.UnsafeEnabled {
 | 
				
			||||||
		mi := &file_core_proto_core_proto_msgTypes[3]
 | 
							mi := &file_core_proto_msgTypes[3]
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		ms.StoreMessageInfo(mi)
 | 
							ms.StoreMessageInfo(mi)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -326,7 +321,7 @@ func (x *Certificate) String() string {
 | 
				
			||||||
func (*Certificate) ProtoMessage() {}
 | 
					func (*Certificate) ProtoMessage() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *Certificate) ProtoReflect() protoreflect.Message {
 | 
					func (x *Certificate) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
	mi := &file_core_proto_core_proto_msgTypes[3]
 | 
						mi := &file_core_proto_msgTypes[3]
 | 
				
			||||||
	if protoimpl.UnsafeEnabled && x != nil {
 | 
						if protoimpl.UnsafeEnabled && x != nil {
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		if ms.LoadMessageInfo() == nil {
 | 
							if ms.LoadMessageInfo() == nil {
 | 
				
			||||||
| 
						 | 
					@ -339,7 +334,7 @@ func (x *Certificate) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Deprecated: Use Certificate.ProtoReflect.Descriptor instead.
 | 
					// Deprecated: Use Certificate.ProtoReflect.Descriptor instead.
 | 
				
			||||||
func (*Certificate) Descriptor() ([]byte, []int) {
 | 
					func (*Certificate) Descriptor() ([]byte, []int) {
 | 
				
			||||||
	return file_core_proto_core_proto_rawDescGZIP(), []int{3}
 | 
						return file_core_proto_rawDescGZIP(), []int{3}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *Certificate) GetRegistrationID() int64 {
 | 
					func (x *Certificate) GetRegistrationID() int64 {
 | 
				
			||||||
| 
						 | 
					@ -403,7 +398,7 @@ type CertificateStatus struct {
 | 
				
			||||||
func (x *CertificateStatus) Reset() {
 | 
					func (x *CertificateStatus) Reset() {
 | 
				
			||||||
	*x = CertificateStatus{}
 | 
						*x = CertificateStatus{}
 | 
				
			||||||
	if protoimpl.UnsafeEnabled {
 | 
						if protoimpl.UnsafeEnabled {
 | 
				
			||||||
		mi := &file_core_proto_core_proto_msgTypes[4]
 | 
							mi := &file_core_proto_msgTypes[4]
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		ms.StoreMessageInfo(mi)
 | 
							ms.StoreMessageInfo(mi)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -416,7 +411,7 @@ func (x *CertificateStatus) String() string {
 | 
				
			||||||
func (*CertificateStatus) ProtoMessage() {}
 | 
					func (*CertificateStatus) ProtoMessage() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *CertificateStatus) ProtoReflect() protoreflect.Message {
 | 
					func (x *CertificateStatus) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
	mi := &file_core_proto_core_proto_msgTypes[4]
 | 
						mi := &file_core_proto_msgTypes[4]
 | 
				
			||||||
	if protoimpl.UnsafeEnabled && x != nil {
 | 
						if protoimpl.UnsafeEnabled && x != nil {
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		if ms.LoadMessageInfo() == nil {
 | 
							if ms.LoadMessageInfo() == nil {
 | 
				
			||||||
| 
						 | 
					@ -429,7 +424,7 @@ func (x *CertificateStatus) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Deprecated: Use CertificateStatus.ProtoReflect.Descriptor instead.
 | 
					// Deprecated: Use CertificateStatus.ProtoReflect.Descriptor instead.
 | 
				
			||||||
func (*CertificateStatus) Descriptor() ([]byte, []int) {
 | 
					func (*CertificateStatus) Descriptor() ([]byte, []int) {
 | 
				
			||||||
	return file_core_proto_core_proto_rawDescGZIP(), []int{4}
 | 
						return file_core_proto_rawDescGZIP(), []int{4}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *CertificateStatus) GetSerial() string {
 | 
					func (x *CertificateStatus) GetSerial() string {
 | 
				
			||||||
| 
						 | 
					@ -513,7 +508,7 @@ type Registration struct {
 | 
				
			||||||
func (x *Registration) Reset() {
 | 
					func (x *Registration) Reset() {
 | 
				
			||||||
	*x = Registration{}
 | 
						*x = Registration{}
 | 
				
			||||||
	if protoimpl.UnsafeEnabled {
 | 
						if protoimpl.UnsafeEnabled {
 | 
				
			||||||
		mi := &file_core_proto_core_proto_msgTypes[5]
 | 
							mi := &file_core_proto_msgTypes[5]
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		ms.StoreMessageInfo(mi)
 | 
							ms.StoreMessageInfo(mi)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -526,7 +521,7 @@ func (x *Registration) String() string {
 | 
				
			||||||
func (*Registration) ProtoMessage() {}
 | 
					func (*Registration) ProtoMessage() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *Registration) ProtoReflect() protoreflect.Message {
 | 
					func (x *Registration) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
	mi := &file_core_proto_core_proto_msgTypes[5]
 | 
						mi := &file_core_proto_msgTypes[5]
 | 
				
			||||||
	if protoimpl.UnsafeEnabled && x != nil {
 | 
						if protoimpl.UnsafeEnabled && x != nil {
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		if ms.LoadMessageInfo() == nil {
 | 
							if ms.LoadMessageInfo() == nil {
 | 
				
			||||||
| 
						 | 
					@ -539,7 +534,7 @@ func (x *Registration) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Deprecated: Use Registration.ProtoReflect.Descriptor instead.
 | 
					// Deprecated: Use Registration.ProtoReflect.Descriptor instead.
 | 
				
			||||||
func (*Registration) Descriptor() ([]byte, []int) {
 | 
					func (*Registration) Descriptor() ([]byte, []int) {
 | 
				
			||||||
	return file_core_proto_core_proto_rawDescGZIP(), []int{5}
 | 
						return file_core_proto_rawDescGZIP(), []int{5}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *Registration) GetId() int64 {
 | 
					func (x *Registration) GetId() int64 {
 | 
				
			||||||
| 
						 | 
					@ -614,7 +609,7 @@ type Authorization struct {
 | 
				
			||||||
func (x *Authorization) Reset() {
 | 
					func (x *Authorization) Reset() {
 | 
				
			||||||
	*x = Authorization{}
 | 
						*x = Authorization{}
 | 
				
			||||||
	if protoimpl.UnsafeEnabled {
 | 
						if protoimpl.UnsafeEnabled {
 | 
				
			||||||
		mi := &file_core_proto_core_proto_msgTypes[6]
 | 
							mi := &file_core_proto_msgTypes[6]
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		ms.StoreMessageInfo(mi)
 | 
							ms.StoreMessageInfo(mi)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -627,7 +622,7 @@ func (x *Authorization) String() string {
 | 
				
			||||||
func (*Authorization) ProtoMessage() {}
 | 
					func (*Authorization) ProtoMessage() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *Authorization) ProtoReflect() protoreflect.Message {
 | 
					func (x *Authorization) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
	mi := &file_core_proto_core_proto_msgTypes[6]
 | 
						mi := &file_core_proto_msgTypes[6]
 | 
				
			||||||
	if protoimpl.UnsafeEnabled && x != nil {
 | 
						if protoimpl.UnsafeEnabled && x != nil {
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		if ms.LoadMessageInfo() == nil {
 | 
							if ms.LoadMessageInfo() == nil {
 | 
				
			||||||
| 
						 | 
					@ -640,7 +635,7 @@ func (x *Authorization) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Deprecated: Use Authorization.ProtoReflect.Descriptor instead.
 | 
					// Deprecated: Use Authorization.ProtoReflect.Descriptor instead.
 | 
				
			||||||
func (*Authorization) Descriptor() ([]byte, []int) {
 | 
					func (*Authorization) Descriptor() ([]byte, []int) {
 | 
				
			||||||
	return file_core_proto_core_proto_rawDescGZIP(), []int{6}
 | 
						return file_core_proto_rawDescGZIP(), []int{6}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *Authorization) GetId() string {
 | 
					func (x *Authorization) GetId() string {
 | 
				
			||||||
| 
						 | 
					@ -705,7 +700,7 @@ type Order struct {
 | 
				
			||||||
func (x *Order) Reset() {
 | 
					func (x *Order) Reset() {
 | 
				
			||||||
	*x = Order{}
 | 
						*x = Order{}
 | 
				
			||||||
	if protoimpl.UnsafeEnabled {
 | 
						if protoimpl.UnsafeEnabled {
 | 
				
			||||||
		mi := &file_core_proto_core_proto_msgTypes[7]
 | 
							mi := &file_core_proto_msgTypes[7]
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		ms.StoreMessageInfo(mi)
 | 
							ms.StoreMessageInfo(mi)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -718,7 +713,7 @@ func (x *Order) String() string {
 | 
				
			||||||
func (*Order) ProtoMessage() {}
 | 
					func (*Order) ProtoMessage() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *Order) ProtoReflect() protoreflect.Message {
 | 
					func (x *Order) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
	mi := &file_core_proto_core_proto_msgTypes[7]
 | 
						mi := &file_core_proto_msgTypes[7]
 | 
				
			||||||
	if protoimpl.UnsafeEnabled && x != nil {
 | 
						if protoimpl.UnsafeEnabled && x != nil {
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		if ms.LoadMessageInfo() == nil {
 | 
							if ms.LoadMessageInfo() == nil {
 | 
				
			||||||
| 
						 | 
					@ -731,7 +726,7 @@ func (x *Order) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Deprecated: Use Order.ProtoReflect.Descriptor instead.
 | 
					// Deprecated: Use Order.ProtoReflect.Descriptor instead.
 | 
				
			||||||
func (*Order) Descriptor() ([]byte, []int) {
 | 
					func (*Order) Descriptor() ([]byte, []int) {
 | 
				
			||||||
	return file_core_proto_core_proto_rawDescGZIP(), []int{7}
 | 
						return file_core_proto_rawDescGZIP(), []int{7}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *Order) GetId() int64 {
 | 
					func (x *Order) GetId() int64 {
 | 
				
			||||||
| 
						 | 
					@ -813,7 +808,7 @@ type Empty struct {
 | 
				
			||||||
func (x *Empty) Reset() {
 | 
					func (x *Empty) Reset() {
 | 
				
			||||||
	*x = Empty{}
 | 
						*x = Empty{}
 | 
				
			||||||
	if protoimpl.UnsafeEnabled {
 | 
						if protoimpl.UnsafeEnabled {
 | 
				
			||||||
		mi := &file_core_proto_core_proto_msgTypes[8]
 | 
							mi := &file_core_proto_msgTypes[8]
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		ms.StoreMessageInfo(mi)
 | 
							ms.StoreMessageInfo(mi)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -826,7 +821,7 @@ func (x *Empty) String() string {
 | 
				
			||||||
func (*Empty) ProtoMessage() {}
 | 
					func (*Empty) ProtoMessage() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *Empty) ProtoReflect() protoreflect.Message {
 | 
					func (x *Empty) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
	mi := &file_core_proto_core_proto_msgTypes[8]
 | 
						mi := &file_core_proto_msgTypes[8]
 | 
				
			||||||
	if protoimpl.UnsafeEnabled && x != nil {
 | 
						if protoimpl.UnsafeEnabled && x != nil {
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		if ms.LoadMessageInfo() == nil {
 | 
							if ms.LoadMessageInfo() == nil {
 | 
				
			||||||
| 
						 | 
					@ -839,156 +834,156 @@ func (x *Empty) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Deprecated: Use Empty.ProtoReflect.Descriptor instead.
 | 
					// Deprecated: Use Empty.ProtoReflect.Descriptor instead.
 | 
				
			||||||
func (*Empty) Descriptor() ([]byte, []int) {
 | 
					func (*Empty) Descriptor() ([]byte, []int) {
 | 
				
			||||||
	return file_core_proto_core_proto_rawDescGZIP(), []int{8}
 | 
						return file_core_proto_rawDescGZIP(), []int{8}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var File_core_proto_core_proto protoreflect.FileDescriptor
 | 
					var File_core_proto protoreflect.FileDescriptor
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var file_core_proto_core_proto_rawDesc = []byte{
 | 
					var file_core_proto_rawDesc = []byte{
 | 
				
			||||||
	0x0a, 0x15, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x72,
 | 
						0x0a, 0x0a, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x63, 0x6f,
 | 
				
			||||||
	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x63, 0x6f, 0x72, 0x65, 0x22, 0xab, 0x02,
 | 
						0x72, 0x65, 0x22, 0xab, 0x02, 0x0a, 0x09, 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65,
 | 
				
			||||||
	0x0a, 0x09, 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69,
 | 
						0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64,
 | 
				
			||||||
	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74,
 | 
						0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
 | 
				
			||||||
	0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12,
 | 
						0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06,
 | 
				
			||||||
	0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52,
 | 
						0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x10, 0x0a, 0x03,
 | 
				
			||||||
	0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x69, 0x18, 0x09,
 | 
						0x75, 0x72, 0x69, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x69, 0x12, 0x14,
 | 
				
			||||||
	0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x69, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b,
 | 
						0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74,
 | 
				
			||||||
	0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12,
 | 
						0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2a, 0x0a, 0x10, 0x6b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x6f,
 | 
				
			||||||
	0x2a, 0x0a, 0x10, 0x6b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74,
 | 
						0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10,
 | 
				
			||||||
	0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6b, 0x65, 0x79, 0x41, 0x75,
 | 
						0x6b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e,
 | 
				
			||||||
	0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x11, 0x76,
 | 
						0x12, 0x44, 0x0a, 0x11, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x72, 0x65,
 | 
				
			||||||
	0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73,
 | 
						0x63, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6f,
 | 
				
			||||||
	0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x56, 0x61,
 | 
						0x72, 0x65, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63,
 | 
				
			||||||
	0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x11,
 | 
						0x6f, 0x72, 0x64, 0x52, 0x11, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x72,
 | 
				
			||||||
	0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64,
 | 
						0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18,
 | 
				
			||||||
	0x73, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b,
 | 
						0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x6f,
 | 
				
			||||||
	0x32, 0x14, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x44,
 | 
						0x62, 0x6c, 0x65, 0x6d, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x05, 0x65, 0x72, 0x72,
 | 
				
			||||||
	0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1c, 0x0a,
 | 
						0x6f, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18,
 | 
				
			||||||
	0x09, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03,
 | 
						0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64,
 | 
				
			||||||
	0x52, 0x09, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x22, 0xee, 0x01, 0x0a, 0x10,
 | 
						0x22, 0xee, 0x01, 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52,
 | 
				
			||||||
	0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64,
 | 
						0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d,
 | 
				
			||||||
	0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,
 | 
						0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d,
 | 
				
			||||||
	0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04,
 | 
						0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
 | 
				
			||||||
	0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74,
 | 
						0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73,
 | 
				
			||||||
	0x12, 0x2c, 0x0a, 0x11, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73,
 | 
						0x65, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0c,
 | 
				
			||||||
	0x6f, 0x6c, 0x76, 0x65, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x11, 0x61, 0x64, 0x64,
 | 
						0x52, 0x11, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c,
 | 
				
			||||||
	0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x12, 0x20,
 | 
						0x76, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x55, 0x73,
 | 
				
			||||||
	0x0a, 0x0b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x55, 0x73, 0x65, 0x64, 0x18, 0x04, 0x20,
 | 
						0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73,
 | 
				
			||||||
	0x01, 0x28, 0x0c, 0x52, 0x0b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x55, 0x73, 0x65, 0x64,
 | 
						0x73, 0x55, 0x73, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69,
 | 
				
			||||||
	0x12, 0x20, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18,
 | 
						0x74, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x75, 0x74, 0x68,
 | 
				
			||||||
	0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x69,
 | 
						0x6f, 0x72, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x06,
 | 
				
			||||||
	0x65, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52,
 | 
						0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x26, 0x0a, 0x0e, 0x61, 0x64, 0x64,
 | 
				
			||||||
	0x03, 0x75, 0x72, 0x6c, 0x12, 0x26, 0x0a, 0x0e, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65,
 | 
						0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x54, 0x72, 0x69, 0x65, 0x64, 0x18, 0x07, 0x20, 0x03, 0x28,
 | 
				
			||||||
	0x73, 0x54, 0x72, 0x69, 0x65, 0x64, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0e, 0x61, 0x64,
 | 
						0x0c, 0x52, 0x0e, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x54, 0x72, 0x69, 0x65,
 | 
				
			||||||
	0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x54, 0x72, 0x69, 0x65, 0x64, 0x22, 0x6a, 0x0a, 0x0e,
 | 
						0x64, 0x22, 0x6a, 0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x44, 0x65, 0x74, 0x61,
 | 
				
			||||||
	0x50, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x20,
 | 
						0x69, 0x6c, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x54, 0x79,
 | 
				
			||||||
	0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20,
 | 
						0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x62, 0x6c, 0x65,
 | 
				
			||||||
	0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x54, 0x79, 0x70, 0x65,
 | 
						0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18,
 | 
				
			||||||
	0x12, 0x16, 0x0a, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
 | 
						0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x1e, 0x0a,
 | 
				
			||||||
	0x52, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x68, 0x74, 0x74, 0x70,
 | 
						0x0a, 0x68, 0x74, 0x74, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28,
 | 
				
			||||||
	0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x68, 0x74,
 | 
						0x05, 0x52, 0x0a, 0x68, 0x74, 0x74, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xa9, 0x01,
 | 
				
			||||||
	0x74, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xa9, 0x01, 0x0a, 0x0b, 0x43, 0x65, 0x72,
 | 
						0x0a, 0x0b, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x26, 0x0a,
 | 
				
			||||||
	0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x67, 0x69,
 | 
						0x0e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18,
 | 
				
			||||||
	0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03,
 | 
						0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74,
 | 
				
			||||||
	0x52, 0x0e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44,
 | 
						0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x18,
 | 
				
			||||||
	0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
 | 
						0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x12, 0x16, 0x0a,
 | 
				
			||||||
	0x52, 0x06, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x69, 0x67, 0x65,
 | 
						0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64,
 | 
				
			||||||
	0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74,
 | 
						0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01,
 | 
				
			||||||
	0x12, 0x10, 0x0a, 0x03, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x64,
 | 
						0x28, 0x0c, 0x52, 0x03, 0x64, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65,
 | 
				
			||||||
	0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01,
 | 
						0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x64, 0x12,
 | 
				
			||||||
	0x28, 0x03, 0x52, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78,
 | 
						0x18, 0x0a, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03,
 | 
				
			||||||
	0x70, 0x69, 0x72, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x78, 0x70,
 | 
						0x52, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x22, 0xcf, 0x02, 0x0a, 0x11, 0x43, 0x65,
 | 
				
			||||||
	0x69, 0x72, 0x65, 0x73, 0x22, 0xcf, 0x02, 0x0a, 0x11, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69,
 | 
						0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12,
 | 
				
			||||||
	0x63, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65,
 | 
						0x16, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
 | 
				
			||||||
	0x72, 0x69, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x72, 0x69,
 | 
						0x06, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75,
 | 
				
			||||||
	0x61, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01,
 | 
						0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12,
 | 
				
			||||||
	0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x6f, 0x63,
 | 
						0x28, 0x0a, 0x0f, 0x6f, 0x63, 0x73, 0x70, 0x4c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74,
 | 
				
			||||||
	0x73, 0x70, 0x4c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20,
 | 
						0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x6f, 0x63, 0x73, 0x70, 0x4c, 0x61,
 | 
				
			||||||
	0x01, 0x28, 0x03, 0x52, 0x0f, 0x6f, 0x63, 0x73, 0x70, 0x4c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64,
 | 
						0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x76,
 | 
				
			||||||
	0x61, 0x74, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x64, 0x44,
 | 
						0x6f, 0x6b, 0x65, 0x64, 0x44, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b,
 | 
				
			||||||
	0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x72, 0x65, 0x76, 0x6f, 0x6b,
 | 
						0x72, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x64, 0x44, 0x61, 0x74, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x72,
 | 
				
			||||||
	0x65, 0x64, 0x44, 0x61, 0x74, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x76, 0x6f, 0x6b, 0x65,
 | 
						0x65, 0x76, 0x6f, 0x6b, 0x65, 0x64, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01,
 | 
				
			||||||
	0x64, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x72,
 | 
						0x28, 0x03, 0x52, 0x0d, 0x72, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x64, 0x52, 0x65, 0x61, 0x73, 0x6f,
 | 
				
			||||||
	0x65, 0x76, 0x6f, 0x6b, 0x65, 0x64, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x15,
 | 
						0x6e, 0x12, 0x34, 0x0a, 0x15, 0x6c, 0x61, 0x73, 0x74, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74,
 | 
				
			||||||
	0x6c, 0x61, 0x73, 0x74, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61,
 | 
						0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x67, 0x53, 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03,
 | 
				
			||||||
	0x67, 0x53, 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x6c, 0x61, 0x73,
 | 
						0x52, 0x15, 0x6c, 0x61, 0x73, 0x74, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
 | 
				
			||||||
	0x74, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x67, 0x53, 0x65,
 | 
						0x4e, 0x61, 0x67, 0x53, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x6f, 0x63, 0x73, 0x70, 0x52,
 | 
				
			||||||
	0x6e, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x6f, 0x63, 0x73, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
 | 
						0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x6f,
 | 
				
			||||||
	0x73, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x6f, 0x63, 0x73, 0x70, 0x52, 0x65,
 | 
						0x63, 0x73, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6e,
 | 
				
			||||||
	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x6f, 0x74, 0x41, 0x66, 0x74,
 | 
						0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6e,
 | 
				
			||||||
	0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6e, 0x6f, 0x74, 0x41, 0x66, 0x74,
 | 
						0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x73, 0x45, 0x78, 0x70,
 | 
				
			||||||
	0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x73, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x18,
 | 
						0x69, 0x72, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x45, 0x78,
 | 
				
			||||||
	0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64,
 | 
						0x70, 0x69, 0x72, 0x65, 0x64, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0xe6, 0x01, 0x0a, 0x0c,
 | 
				
			||||||
	0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0xe6, 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73,
 | 
						0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02,
 | 
				
			||||||
	0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,
 | 
						0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03,
 | 
				
			||||||
	0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02,
 | 
						0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x18,
 | 
				
			||||||
	0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e,
 | 
						0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52,
 | 
				
			||||||
	0x74, 0x61, 0x63, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74,
 | 
						0x07, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74,
 | 
				
			||||||
	0x61, 0x63, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x73, 0x50,
 | 
						0x61, 0x63, 0x74, 0x73, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28,
 | 
				
			||||||
	0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x63, 0x6f,
 | 
						0x08, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x73, 0x50, 0x72, 0x65, 0x73, 0x65,
 | 
				
			||||||
	0x6e, 0x74, 0x61, 0x63, 0x74, 0x73, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a,
 | 
						0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x67, 0x72, 0x65, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18,
 | 
				
			||||||
	0x09, 0x61, 0x67, 0x72, 0x65, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09,
 | 
						0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x67, 0x72, 0x65, 0x65, 0x6d, 0x65, 0x6e, 0x74,
 | 
				
			||||||
	0x52, 0x09, 0x61, 0x67, 0x72, 0x65, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69,
 | 
						0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x49, 0x50, 0x18, 0x06, 0x20,
 | 
				
			||||||
	0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x49, 0x50, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09,
 | 
						0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x49, 0x50, 0x12, 0x1c,
 | 
				
			||||||
	0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x49, 0x50, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x72, 0x65,
 | 
						0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28,
 | 
				
			||||||
	0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72,
 | 
						0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x16, 0x0a, 0x06,
 | 
				
			||||||
	0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75,
 | 
						0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74,
 | 
				
			||||||
	0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22,
 | 
						0x61, 0x74, 0x75, 0x73, 0x22, 0xd6, 0x01, 0x0a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69,
 | 
				
			||||||
	0xd6, 0x01, 0x0a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f,
 | 
						0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
 | 
				
			||||||
	0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,
 | 
						0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69,
 | 
				
			||||||
	0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18,
 | 
						0x66, 0x69, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e,
 | 
				
			||||||
	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65,
 | 
						0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74,
 | 
				
			||||||
	0x72, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f,
 | 
						0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e,
 | 
				
			||||||
	0x6e, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x72, 0x65, 0x67, 0x69, 0x73,
 | 
						0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x16,
 | 
				
			||||||
	0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61,
 | 
						0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
 | 
				
			||||||
	0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75,
 | 
						0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65,
 | 
				
			||||||
	0x73, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01,
 | 
						0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73,
 | 
				
			||||||
	0x28, 0x03, 0x52, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x0a, 0x63,
 | 
						0x12, 0x2f, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x06,
 | 
				
			||||||
	0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32,
 | 
						0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6c,
 | 
				
			||||||
	0x0f, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65,
 | 
						0x6c, 0x65, 0x6e, 0x67, 0x65, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65,
 | 
				
			||||||
	0x52, 0x0a, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x73, 0x4a, 0x04, 0x08, 0x07,
 | 
						0x73, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x22, 0xd7, 0x02,
 | 
				
			||||||
	0x10, 0x08, 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x22, 0xd7, 0x02, 0x0a, 0x05, 0x4f, 0x72, 0x64,
 | 
						0x0a, 0x05, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,
 | 
				
			||||||
	0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02,
 | 
						0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x67, 0x69, 0x73,
 | 
				
			||||||
	0x69, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69,
 | 
						0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52,
 | 
				
			||||||
	0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x72, 0x65, 0x67, 0x69,
 | 
						0x0e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12,
 | 
				
			||||||
	0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78,
 | 
						0x18, 0x0a, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03,
 | 
				
			||||||
	0x70, 0x69, 0x72, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x78, 0x70,
 | 
						0x52, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72,
 | 
				
			||||||
	0x69, 0x72, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20,
 | 
						0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e,
 | 
				
			||||||
	0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x62, 0x6c,
 | 
						0x50, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x05,
 | 
				
			||||||
	0x65, 0x6d, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72,
 | 
						0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69,
 | 
				
			||||||
	0x12, 0x2c, 0x0a, 0x11, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x53,
 | 
						0x63, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09,
 | 
				
			||||||
	0x65, 0x72, 0x69, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x65, 0x72,
 | 
						0x52, 0x11, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72,
 | 
				
			||||||
	0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x12, 0x16,
 | 
						0x69, 0x61, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, 0x20,
 | 
				
			||||||
	0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
 | 
						0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6e,
 | 
				
			||||||
	0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18,
 | 
						0x61, 0x6d, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65,
 | 
				
			||||||
	0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x0f,
 | 
						0x73, 0x12, 0x28, 0x0a, 0x0f, 0x62, 0x65, 0x67, 0x61, 0x6e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73,
 | 
				
			||||||
	0x62, 0x65, 0x67, 0x61, 0x6e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x18,
 | 
						0x73, 0x69, 0x6e, 0x67, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x62, 0x65, 0x67, 0x61,
 | 
				
			||||||
	0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x62, 0x65, 0x67, 0x61, 0x6e, 0x50, 0x72, 0x6f, 0x63,
 | 
						0x6e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x63,
 | 
				
			||||||
	0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65,
 | 
						0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x63, 0x72,
 | 
				
			||||||
	0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
 | 
						0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x10, 0x76, 0x32, 0x41, 0x75, 0x74, 0x68, 0x6f,
 | 
				
			||||||
	0x12, 0x2a, 0x0a, 0x10, 0x76, 0x32, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74,
 | 
						0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x03, 0x52,
 | 
				
			||||||
	0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x03, 0x52, 0x10, 0x76, 0x32, 0x41, 0x75,
 | 
						0x10, 0x76, 0x32, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e,
 | 
				
			||||||
	0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4a, 0x04, 0x08, 0x06,
 | 
						0x73, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79,
 | 
				
			||||||
	0x10, 0x07, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x42, 0x2b, 0x5a, 0x29, 0x67,
 | 
						0x42, 0x2b, 0x5a, 0x29, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c,
 | 
				
			||||||
	0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x65, 0x74, 0x73, 0x65, 0x6e,
 | 
						0x65, 0x74, 0x73, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x2f, 0x62, 0x6f, 0x75, 0x6c, 0x64,
 | 
				
			||||||
	0x63, 0x72, 0x79, 0x70, 0x74, 0x2f, 0x62, 0x6f, 0x75, 0x6c, 0x64, 0x65, 0x72, 0x2f, 0x63, 0x6f,
 | 
						0x65, 0x72, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70,
 | 
				
			||||||
	0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 | 
						0x72, 0x6f, 0x74, 0x6f, 0x33,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
	file_core_proto_core_proto_rawDescOnce sync.Once
 | 
						file_core_proto_rawDescOnce sync.Once
 | 
				
			||||||
	file_core_proto_core_proto_rawDescData = file_core_proto_core_proto_rawDesc
 | 
						file_core_proto_rawDescData = file_core_proto_rawDesc
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func file_core_proto_core_proto_rawDescGZIP() []byte {
 | 
					func file_core_proto_rawDescGZIP() []byte {
 | 
				
			||||||
	file_core_proto_core_proto_rawDescOnce.Do(func() {
 | 
						file_core_proto_rawDescOnce.Do(func() {
 | 
				
			||||||
		file_core_proto_core_proto_rawDescData = protoimpl.X.CompressGZIP(file_core_proto_core_proto_rawDescData)
 | 
							file_core_proto_rawDescData = protoimpl.X.CompressGZIP(file_core_proto_rawDescData)
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	return file_core_proto_core_proto_rawDescData
 | 
						return file_core_proto_rawDescData
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var file_core_proto_core_proto_msgTypes = make([]protoimpl.MessageInfo, 9)
 | 
					var file_core_proto_msgTypes = make([]protoimpl.MessageInfo, 9)
 | 
				
			||||||
var file_core_proto_core_proto_goTypes = []interface{}{
 | 
					var file_core_proto_goTypes = []interface{}{
 | 
				
			||||||
	(*Challenge)(nil),         // 0: core.Challenge
 | 
						(*Challenge)(nil),         // 0: core.Challenge
 | 
				
			||||||
	(*ValidationRecord)(nil),  // 1: core.ValidationRecord
 | 
						(*ValidationRecord)(nil),  // 1: core.ValidationRecord
 | 
				
			||||||
	(*ProblemDetails)(nil),    // 2: core.ProblemDetails
 | 
						(*ProblemDetails)(nil),    // 2: core.ProblemDetails
 | 
				
			||||||
| 
						 | 
					@ -999,7 +994,7 @@ var file_core_proto_core_proto_goTypes = []interface{}{
 | 
				
			||||||
	(*Order)(nil),             // 7: core.Order
 | 
						(*Order)(nil),             // 7: core.Order
 | 
				
			||||||
	(*Empty)(nil),             // 8: core.Empty
 | 
						(*Empty)(nil),             // 8: core.Empty
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
var file_core_proto_core_proto_depIdxs = []int32{
 | 
					var file_core_proto_depIdxs = []int32{
 | 
				
			||||||
	1, // 0: core.Challenge.validationrecords:type_name -> core.ValidationRecord
 | 
						1, // 0: core.Challenge.validationrecords:type_name -> core.ValidationRecord
 | 
				
			||||||
	2, // 1: core.Challenge.error:type_name -> core.ProblemDetails
 | 
						2, // 1: core.Challenge.error:type_name -> core.ProblemDetails
 | 
				
			||||||
	0, // 2: core.Authorization.challenges:type_name -> core.Challenge
 | 
						0, // 2: core.Authorization.challenges:type_name -> core.Challenge
 | 
				
			||||||
| 
						 | 
					@ -1011,13 +1006,13 @@ var file_core_proto_core_proto_depIdxs = []int32{
 | 
				
			||||||
	0, // [0:4] is the sub-list for field type_name
 | 
						0, // [0:4] is the sub-list for field type_name
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func init() { file_core_proto_core_proto_init() }
 | 
					func init() { file_core_proto_init() }
 | 
				
			||||||
func file_core_proto_core_proto_init() {
 | 
					func file_core_proto_init() {
 | 
				
			||||||
	if File_core_proto_core_proto != nil {
 | 
						if File_core_proto != nil {
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if !protoimpl.UnsafeEnabled {
 | 
						if !protoimpl.UnsafeEnabled {
 | 
				
			||||||
		file_core_proto_core_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 | 
							file_core_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 | 
				
			||||||
			switch v := v.(*Challenge); i {
 | 
								switch v := v.(*Challenge); i {
 | 
				
			||||||
			case 0:
 | 
								case 0:
 | 
				
			||||||
				return &v.state
 | 
									return &v.state
 | 
				
			||||||
| 
						 | 
					@ -1029,7 +1024,7 @@ func file_core_proto_core_proto_init() {
 | 
				
			||||||
				return nil
 | 
									return nil
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		file_core_proto_core_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 | 
							file_core_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 | 
				
			||||||
			switch v := v.(*ValidationRecord); i {
 | 
								switch v := v.(*ValidationRecord); i {
 | 
				
			||||||
			case 0:
 | 
								case 0:
 | 
				
			||||||
				return &v.state
 | 
									return &v.state
 | 
				
			||||||
| 
						 | 
					@ -1041,7 +1036,7 @@ func file_core_proto_core_proto_init() {
 | 
				
			||||||
				return nil
 | 
									return nil
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		file_core_proto_core_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
 | 
							file_core_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
 | 
				
			||||||
			switch v := v.(*ProblemDetails); i {
 | 
								switch v := v.(*ProblemDetails); i {
 | 
				
			||||||
			case 0:
 | 
								case 0:
 | 
				
			||||||
				return &v.state
 | 
									return &v.state
 | 
				
			||||||
| 
						 | 
					@ -1053,7 +1048,7 @@ func file_core_proto_core_proto_init() {
 | 
				
			||||||
				return nil
 | 
									return nil
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		file_core_proto_core_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
 | 
							file_core_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
 | 
				
			||||||
			switch v := v.(*Certificate); i {
 | 
								switch v := v.(*Certificate); i {
 | 
				
			||||||
			case 0:
 | 
								case 0:
 | 
				
			||||||
				return &v.state
 | 
									return &v.state
 | 
				
			||||||
| 
						 | 
					@ -1065,7 +1060,7 @@ func file_core_proto_core_proto_init() {
 | 
				
			||||||
				return nil
 | 
									return nil
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		file_core_proto_core_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
 | 
							file_core_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
 | 
				
			||||||
			switch v := v.(*CertificateStatus); i {
 | 
								switch v := v.(*CertificateStatus); i {
 | 
				
			||||||
			case 0:
 | 
								case 0:
 | 
				
			||||||
				return &v.state
 | 
									return &v.state
 | 
				
			||||||
| 
						 | 
					@ -1077,7 +1072,7 @@ func file_core_proto_core_proto_init() {
 | 
				
			||||||
				return nil
 | 
									return nil
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		file_core_proto_core_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
 | 
							file_core_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
 | 
				
			||||||
			switch v := v.(*Registration); i {
 | 
								switch v := v.(*Registration); i {
 | 
				
			||||||
			case 0:
 | 
								case 0:
 | 
				
			||||||
				return &v.state
 | 
									return &v.state
 | 
				
			||||||
| 
						 | 
					@ -1089,7 +1084,7 @@ func file_core_proto_core_proto_init() {
 | 
				
			||||||
				return nil
 | 
									return nil
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		file_core_proto_core_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
 | 
							file_core_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
 | 
				
			||||||
			switch v := v.(*Authorization); i {
 | 
								switch v := v.(*Authorization); i {
 | 
				
			||||||
			case 0:
 | 
								case 0:
 | 
				
			||||||
				return &v.state
 | 
									return &v.state
 | 
				
			||||||
| 
						 | 
					@ -1101,7 +1096,7 @@ func file_core_proto_core_proto_init() {
 | 
				
			||||||
				return nil
 | 
									return nil
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		file_core_proto_core_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
 | 
							file_core_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
 | 
				
			||||||
			switch v := v.(*Order); i {
 | 
								switch v := v.(*Order); i {
 | 
				
			||||||
			case 0:
 | 
								case 0:
 | 
				
			||||||
				return &v.state
 | 
									return &v.state
 | 
				
			||||||
| 
						 | 
					@ -1113,7 +1108,7 @@ func file_core_proto_core_proto_init() {
 | 
				
			||||||
				return nil
 | 
									return nil
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		file_core_proto_core_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
 | 
							file_core_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
 | 
				
			||||||
			switch v := v.(*Empty); i {
 | 
								switch v := v.(*Empty); i {
 | 
				
			||||||
			case 0:
 | 
								case 0:
 | 
				
			||||||
				return &v.state
 | 
									return &v.state
 | 
				
			||||||
| 
						 | 
					@ -1130,18 +1125,18 @@ func file_core_proto_core_proto_init() {
 | 
				
			||||||
	out := protoimpl.TypeBuilder{
 | 
						out := protoimpl.TypeBuilder{
 | 
				
			||||||
		File: protoimpl.DescBuilder{
 | 
							File: protoimpl.DescBuilder{
 | 
				
			||||||
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 | 
								GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 | 
				
			||||||
			RawDescriptor: file_core_proto_core_proto_rawDesc,
 | 
								RawDescriptor: file_core_proto_rawDesc,
 | 
				
			||||||
			NumEnums:      0,
 | 
								NumEnums:      0,
 | 
				
			||||||
			NumMessages:   9,
 | 
								NumMessages:   9,
 | 
				
			||||||
			NumExtensions: 0,
 | 
								NumExtensions: 0,
 | 
				
			||||||
			NumServices:   0,
 | 
								NumServices:   0,
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		GoTypes:           file_core_proto_core_proto_goTypes,
 | 
							GoTypes:           file_core_proto_goTypes,
 | 
				
			||||||
		DependencyIndexes: file_core_proto_core_proto_depIdxs,
 | 
							DependencyIndexes: file_core_proto_depIdxs,
 | 
				
			||||||
		MessageInfos:      file_core_proto_core_proto_msgTypes,
 | 
							MessageInfos:      file_core_proto_msgTypes,
 | 
				
			||||||
	}.Build()
 | 
						}.Build()
 | 
				
			||||||
	File_core_proto_core_proto = out.File
 | 
						File_core_proto = out.File
 | 
				
			||||||
	file_core_proto_core_proto_rawDesc = nil
 | 
						file_core_proto_rawDesc = nil
 | 
				
			||||||
	file_core_proto_core_proto_goTypes = nil
 | 
						file_core_proto_goTypes = nil
 | 
				
			||||||
	file_core_proto_core_proto_depIdxs = nil
 | 
						file_core_proto_depIdxs = nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,3 @@
 | 
				
			||||||
package proto
 | 
					package proto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//go:generate sh -c "cd ../.. && protoc --go_opt=paths=source_relative --go_out=plugins=grpc:. core/proto/core.proto"
 | 
					//go:generate sh -c "cd ../.. && protoc -I core/proto/ -I . --go_out=core/proto --go-grpc_out=core/proto --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative core/proto/core.proto"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
version: '3'
 | 
					version: '3'
 | 
				
			||||||
services:
 | 
					services:
 | 
				
			||||||
  boulder:
 | 
					  boulder:
 | 
				
			||||||
    image: &boulder_image letsencrypt/boulder-tools:${BOULDER_TOOLS_TAG:-go1.16.2_2021-03-29}
 | 
					    image: &boulder_image letsencrypt/boulder-tools:${BOULDER_TOOLS_TAG:-go1.15.7_2021-03-30}
 | 
				
			||||||
    environment:
 | 
					    environment:
 | 
				
			||||||
      FAKE_DNS: 10.77.77.77
 | 
					      FAKE_DNS: 10.77.77.77
 | 
				
			||||||
      BOULDER_CONFIG_DIR: test/config
 | 
					      BOULDER_CONFIG_DIR: test/config
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										4
									
								
								go.mod
								
								
								
								
							
							
						
						
									
										4
									
								
								go.mod
								
								
								
								
							| 
						 | 
					@ -30,8 +30,8 @@ require (
 | 
				
			||||||
	golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f
 | 
						golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f
 | 
				
			||||||
	golang.org/x/net v0.0.0-20201110031124-69a78807bb2b
 | 
						golang.org/x/net v0.0.0-20201110031124-69a78807bb2b
 | 
				
			||||||
	golang.org/x/text v0.3.4
 | 
						golang.org/x/text v0.3.4
 | 
				
			||||||
	google.golang.org/grpc v1.29.0
 | 
						google.golang.org/grpc v1.36.1
 | 
				
			||||||
	google.golang.org/protobuf v1.23.0
 | 
						google.golang.org/protobuf v1.25.0
 | 
				
			||||||
	gopkg.in/square/go-jose.v2 v2.4.1
 | 
						gopkg.in/square/go-jose.v2 v2.4.1
 | 
				
			||||||
	gopkg.in/yaml.v2 v2.2.5
 | 
						gopkg.in/yaml.v2 v2.2.5
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										16
									
								
								go.sum
								
								
								
								
							
							
						
						
									
										16
									
								
								go.sum
								
								
								
								
							| 
						 | 
					@ -35,6 +35,7 @@ github.com/cloudflare/go-metrics v0.0.0-20151117154305-6a9aea36fb41/go.mod h1:ea
 | 
				
			||||||
github.com/cloudflare/redoctober v0.0.0-20171127175943-746a508df14c h1:p0Q1GvgWtVf46XpMMibupKiE7aQxPYUIb+/jLTTK2kM=
 | 
					github.com/cloudflare/redoctober v0.0.0-20171127175943-746a508df14c h1:p0Q1GvgWtVf46XpMMibupKiE7aQxPYUIb+/jLTTK2kM=
 | 
				
			||||||
github.com/cloudflare/redoctober v0.0.0-20171127175943-746a508df14c/go.mod h1:6Se34jNoqrd8bTxrmJB2Bg2aoZ2CdSXonils9NsiNgo=
 | 
					github.com/cloudflare/redoctober v0.0.0-20171127175943-746a508df14c/go.mod h1:6Se34jNoqrd8bTxrmJB2Bg2aoZ2CdSXonils9NsiNgo=
 | 
				
			||||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
 | 
					github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
 | 
				
			||||||
 | 
					github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
 | 
				
			||||||
github.com/daaku/go.zipexe v1.0.0 h1:VSOgZtH418pH9L16hC/JrgSNJbbAL26pj7lmD1+CGdY=
 | 
					github.com/daaku/go.zipexe v1.0.0 h1:VSOgZtH418pH9L16hC/JrgSNJbbAL26pj7lmD1+CGdY=
 | 
				
			||||||
github.com/daaku/go.zipexe v1.0.0/go.mod h1:z8IiR6TsVLEYKwXAoE/I+8ys/sDkgTzSL0CLnGVd57E=
 | 
					github.com/daaku/go.zipexe v1.0.0/go.mod h1:z8IiR6TsVLEYKwXAoE/I+8ys/sDkgTzSL0CLnGVd57E=
 | 
				
			||||||
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
 | 
					github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
 | 
				
			||||||
| 
						 | 
					@ -44,7 +45,9 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
 | 
				
			||||||
github.com/eggsampler/acme/v3 v3.0.0 h1:Fl1fWD94NcdC7Ensb6Ed/CJZ6S24PpekLo/jZB6Ltg8=
 | 
					github.com/eggsampler/acme/v3 v3.0.0 h1:Fl1fWD94NcdC7Ensb6Ed/CJZ6S24PpekLo/jZB6Ltg8=
 | 
				
			||||||
github.com/eggsampler/acme/v3 v3.0.0/go.mod h1:gw64Ckma6iKulWks9BtE/g/9z/Vdz9D1lM7x7M1X1Ag=
 | 
					github.com/eggsampler/acme/v3 v3.0.0/go.mod h1:gw64Ckma6iKulWks9BtE/g/9z/Vdz9D1lM7x7M1X1Ag=
 | 
				
			||||||
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 | 
					github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 | 
				
			||||||
 | 
					github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 | 
				
			||||||
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
 | 
					github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
 | 
				
			||||||
 | 
					github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
 | 
				
			||||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
 | 
					github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
 | 
				
			||||||
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
 | 
					github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
 | 
				
			||||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 | 
					github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 | 
				
			||||||
| 
						 | 
					@ -82,6 +85,7 @@ github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrU
 | 
				
			||||||
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0 h1:aRz0NBceriICVtjhCgKkDvl+RudKu1CT6h0ZvUTrNfE=
 | 
					github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0 h1:aRz0NBceriICVtjhCgKkDvl+RudKu1CT6h0ZvUTrNfE=
 | 
				
			||||||
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
 | 
					github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
 | 
				
			||||||
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
 | 
					github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
 | 
				
			||||||
 | 
					github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
 | 
				
			||||||
github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
 | 
					github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
 | 
				
			||||||
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
 | 
					github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
 | 
				
			||||||
github.com/golang/snappy v0.0.0-20170215233205-553a64147049 h1:K9KHZbXKpGydfDN0aZrsoHpLJlZsBrGMFWbgLDGnPZk=
 | 
					github.com/golang/snappy v0.0.0-20170215233205-553a64147049 h1:K9KHZbXKpGydfDN0aZrsoHpLJlZsBrGMFWbgLDGnPZk=
 | 
				
			||||||
| 
						 | 
					@ -94,7 +98,9 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw
 | 
				
			||||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 | 
					github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 | 
				
			||||||
github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
 | 
					github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
 | 
				
			||||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
					github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
				
			||||||
 | 
					github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
				
			||||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 | 
					github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 | 
				
			||||||
 | 
					github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
				
			||||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho=
 | 
					github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho=
 | 
				
			||||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
 | 
					github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
 | 
				
			||||||
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
 | 
					github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
 | 
				
			||||||
| 
						 | 
					@ -192,6 +198,7 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf
 | 
				
			||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 | 
					github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 | 
				
			||||||
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
 | 
					github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
 | 
				
			||||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
 | 
					github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
 | 
				
			||||||
 | 
					github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
 | 
				
			||||||
github.com/syndtr/goleveldb v0.0.0-20180331014930-714f901b98fd h1:WuVJ5mLz1bggtrjvb2pQCZxN4MBDEK/SoyQXGI5UtBA=
 | 
					github.com/syndtr/goleveldb v0.0.0-20180331014930-714f901b98fd h1:WuVJ5mLz1bggtrjvb2pQCZxN4MBDEK/SoyQXGI5UtBA=
 | 
				
			||||||
github.com/syndtr/goleveldb v0.0.0-20180331014930-714f901b98fd/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
 | 
					github.com/syndtr/goleveldb v0.0.0-20180331014930-714f901b98fd/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
 | 
				
			||||||
github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399 h1:e/5i7d4oYZ+C1wj2THlRK+oAhjeS/TRQwMfkIuet3w0=
 | 
					github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399 h1:e/5i7d4oYZ+C1wj2THlRK+oAhjeS/TRQwMfkIuet3w0=
 | 
				
			||||||
| 
						 | 
					@ -320,19 +327,28 @@ google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCID
 | 
				
			||||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 | 
					google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 | 
				
			||||||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE=
 | 
					google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE=
 | 
				
			||||||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
 | 
					google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
 | 
				
			||||||
 | 
					google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY=
 | 
				
			||||||
 | 
					google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
 | 
				
			||||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 | 
					google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 | 
				
			||||||
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
 | 
					google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
 | 
				
			||||||
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
 | 
					google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
 | 
				
			||||||
 | 
					google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
 | 
				
			||||||
google.golang.org/grpc v1.29.0 h1:2pJjwYOdkZ9HlN4sWRYBg9ttH5bCOlsueaM+b/oYjwo=
 | 
					google.golang.org/grpc v1.29.0 h1:2pJjwYOdkZ9HlN4sWRYBg9ttH5bCOlsueaM+b/oYjwo=
 | 
				
			||||||
google.golang.org/grpc v1.29.0/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
 | 
					google.golang.org/grpc v1.29.0/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
 | 
				
			||||||
 | 
					google.golang.org/grpc v1.36.1 h1:cmUfbeGKnz9+2DD/UYsMQXeqbHZqZDs4eQwW0sFOpBY=
 | 
				
			||||||
 | 
					google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
 | 
				
			||||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 | 
					google.golang.org/protobuf v0.0.0-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-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
 | 
				
			||||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
 | 
					google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
 | 
				
			||||||
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
 | 
					google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
 | 
				
			||||||
google.golang.org/protobuf v1.21.0 h1:qdOKuR/EIArgaWNjetjgTzgVTAZ+S/WXVrq9HW9zimw=
 | 
					google.golang.org/protobuf v1.21.0 h1:qdOKuR/EIArgaWNjetjgTzgVTAZ+S/WXVrq9HW9zimw=
 | 
				
			||||||
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
 | 
					google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
 | 
				
			||||||
 | 
					google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 | 
				
			||||||
google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM=
 | 
					google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM=
 | 
				
			||||||
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 | 
					google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 | 
				
			||||||
 | 
					google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 | 
				
			||||||
 | 
					google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c=
 | 
				
			||||||
 | 
					google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
 | 
				
			||||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 | 
					gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 | 
				
			||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
					gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
				
			||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
 | 
					gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -186,11 +186,12 @@ func (ras *RegistrationAuthorityClientWrapper) FinalizeOrder(ctx context.Context
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// RegistrationAuthorityServerWrapper is the gRPC version of a core.RegistrationAuthority server
 | 
					// RegistrationAuthorityServerWrapper is the gRPC version of a core.RegistrationAuthority server
 | 
				
			||||||
type RegistrationAuthorityServerWrapper struct {
 | 
					type RegistrationAuthorityServerWrapper struct {
 | 
				
			||||||
 | 
						rapb.UnimplementedRegistrationAuthorityServer
 | 
				
			||||||
	inner core.RegistrationAuthority
 | 
						inner core.RegistrationAuthority
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewRegistrationAuthorityServer(inner core.RegistrationAuthority) *RegistrationAuthorityServerWrapper {
 | 
					func NewRegistrationAuthorityServer(inner core.RegistrationAuthority) *RegistrationAuthorityServerWrapper {
 | 
				
			||||||
	return &RegistrationAuthorityServerWrapper{inner}
 | 
						return &RegistrationAuthorityServerWrapper{inner: inner}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ras *RegistrationAuthorityServerWrapper) NewRegistration(ctx context.Context, request *corepb.Registration) (*corepb.Registration, error) {
 | 
					func (ras *RegistrationAuthorityServerWrapper) NewRegistration(ctx context.Context, request *corepb.Registration) (*corepb.Registration, error) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -490,13 +490,20 @@ func (sac StorageAuthorityClientWrapper) KeyBlocked(ctx context.Context, req *sa
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// StorageAuthorityServerWrapper is the gRPC version of a core.ServerAuthority server
 | 
					// StorageAuthorityServerWrapper is the gRPC version of a core.ServerAuthority server
 | 
				
			||||||
type StorageAuthorityServerWrapper struct {
 | 
					type StorageAuthorityServerWrapper struct {
 | 
				
			||||||
	// TODO(#3119): Don't use core.StorageAuthority
 | 
						sapb.UnimplementedStorageAuthorityServer
 | 
				
			||||||
	inner core.StorageAuthority
 | 
						inner core.StorageAuthority
 | 
				
			||||||
	core.StorageAuthority
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewStorageAuthorityServer(inner core.StorageAuthority) *StorageAuthorityServerWrapper {
 | 
					func NewStorageAuthorityServer(inner core.StorageAuthority) *StorageAuthorityServerWrapper {
 | 
				
			||||||
	return &StorageAuthorityServerWrapper{inner, inner}
 | 
						return &StorageAuthorityServerWrapper{inner: inner}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (sas *StorageAuthorityServerWrapper) AddPrecertificate(ctx context.Context, req *sapb.AddCertificateRequest) (*corepb.Empty, error) {
 | 
				
			||||||
 | 
						return sas.inner.AddPrecertificate(ctx, req)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (sas *StorageAuthorityServerWrapper) AddSerial(ctx context.Context, req *sapb.AddSerialRequest) (*corepb.Empty, error) {
 | 
				
			||||||
 | 
						return sas.inner.AddSerial(ctx, req)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (sas StorageAuthorityServerWrapper) GetRegistration(ctx context.Context, request *sapb.RegistrationID) (*corepb.Registration, error) {
 | 
					func (sas StorageAuthorityServerWrapper) GetRegistration(ctx context.Context, request *sapb.RegistrationID) (*corepb.Registration, error) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,3 @@
 | 
				
			||||||
package test_proto
 | 
					package test_proto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//go:generate sh -c "cd ../.. && protoc --go_opt=paths=source_relative --go_out=plugins=grpc,Mcore/proto/core.proto=github.com/letsencrypt/boulder/grpc/test_proto:. grpc/test_proto/interceptors_test.proto"
 | 
					//go:generate sh -c "cd ../.. && protoc -I va/proto/ -I . --go_out=va/proto --go-grpc_out=va/proto --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative va/proto/va.proto"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,3 @@
 | 
				
			||||||
package proto
 | 
					package proto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//go:generate sh -c "cd ../.. && protoc --go_opt=paths=source_relative --go_out=plugins=grpc,Mcore/proto/core.proto=github.com/letsencrypt/boulder/core/proto:. nonce/proto/nonce.proto"
 | 
					//go:generate sh -c "cd ../.. && protoc -I nonce/proto/ -I . --go_out=nonce/proto --go-grpc_out=nonce/proto --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative nonce/proto/nonce.proto"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,18 +1,13 @@
 | 
				
			||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
 | 
					// Code generated by protoc-gen-go. DO NOT EDIT.
 | 
				
			||||||
// versions:
 | 
					// versions:
 | 
				
			||||||
// 	protoc-gen-go v1.21.0
 | 
					// 	protoc-gen-go v1.26.0
 | 
				
			||||||
// 	protoc        v3.11.4
 | 
					// 	protoc        v3.15.6
 | 
				
			||||||
// source: nonce/proto/nonce.proto
 | 
					// source: nonce.proto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package proto
 | 
					package proto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	context "context"
 | 
						proto "github.com/letsencrypt/boulder/core/proto"
 | 
				
			||||||
	proto "github.com/golang/protobuf/proto"
 | 
					 | 
				
			||||||
	proto1 "github.com/letsencrypt/boulder/core/proto"
 | 
					 | 
				
			||||||
	grpc "google.golang.org/grpc"
 | 
					 | 
				
			||||||
	codes "google.golang.org/grpc/codes"
 | 
					 | 
				
			||||||
	status "google.golang.org/grpc/status"
 | 
					 | 
				
			||||||
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 | 
						protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 | 
				
			||||||
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 | 
						protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 | 
				
			||||||
	reflect "reflect"
 | 
						reflect "reflect"
 | 
				
			||||||
| 
						 | 
					@ -26,10 +21,6 @@ const (
 | 
				
			||||||
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
 | 
						_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// This is a compile-time assertion that a sufficiently up-to-date version
 | 
					 | 
				
			||||||
// of the legacy proto package is being used.
 | 
					 | 
				
			||||||
const _ = proto.ProtoPackageIsVersion4
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type NonceMessage struct {
 | 
					type NonceMessage struct {
 | 
				
			||||||
	state         protoimpl.MessageState
 | 
						state         protoimpl.MessageState
 | 
				
			||||||
	sizeCache     protoimpl.SizeCache
 | 
						sizeCache     protoimpl.SizeCache
 | 
				
			||||||
| 
						 | 
					@ -41,7 +32,7 @@ type NonceMessage struct {
 | 
				
			||||||
func (x *NonceMessage) Reset() {
 | 
					func (x *NonceMessage) Reset() {
 | 
				
			||||||
	*x = NonceMessage{}
 | 
						*x = NonceMessage{}
 | 
				
			||||||
	if protoimpl.UnsafeEnabled {
 | 
						if protoimpl.UnsafeEnabled {
 | 
				
			||||||
		mi := &file_nonce_proto_nonce_proto_msgTypes[0]
 | 
							mi := &file_nonce_proto_msgTypes[0]
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		ms.StoreMessageInfo(mi)
 | 
							ms.StoreMessageInfo(mi)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -54,7 +45,7 @@ func (x *NonceMessage) String() string {
 | 
				
			||||||
func (*NonceMessage) ProtoMessage() {}
 | 
					func (*NonceMessage) ProtoMessage() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *NonceMessage) ProtoReflect() protoreflect.Message {
 | 
					func (x *NonceMessage) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
	mi := &file_nonce_proto_nonce_proto_msgTypes[0]
 | 
						mi := &file_nonce_proto_msgTypes[0]
 | 
				
			||||||
	if protoimpl.UnsafeEnabled && x != nil {
 | 
						if protoimpl.UnsafeEnabled && x != nil {
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		if ms.LoadMessageInfo() == nil {
 | 
							if ms.LoadMessageInfo() == nil {
 | 
				
			||||||
| 
						 | 
					@ -67,7 +58,7 @@ func (x *NonceMessage) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Deprecated: Use NonceMessage.ProtoReflect.Descriptor instead.
 | 
					// Deprecated: Use NonceMessage.ProtoReflect.Descriptor instead.
 | 
				
			||||||
func (*NonceMessage) Descriptor() ([]byte, []int) {
 | 
					func (*NonceMessage) Descriptor() ([]byte, []int) {
 | 
				
			||||||
	return file_nonce_proto_nonce_proto_rawDescGZIP(), []int{0}
 | 
						return file_nonce_proto_rawDescGZIP(), []int{0}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *NonceMessage) GetNonce() string {
 | 
					func (x *NonceMessage) GetNonce() string {
 | 
				
			||||||
| 
						 | 
					@ -88,7 +79,7 @@ type ValidMessage struct {
 | 
				
			||||||
func (x *ValidMessage) Reset() {
 | 
					func (x *ValidMessage) Reset() {
 | 
				
			||||||
	*x = ValidMessage{}
 | 
						*x = ValidMessage{}
 | 
				
			||||||
	if protoimpl.UnsafeEnabled {
 | 
						if protoimpl.UnsafeEnabled {
 | 
				
			||||||
		mi := &file_nonce_proto_nonce_proto_msgTypes[1]
 | 
							mi := &file_nonce_proto_msgTypes[1]
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		ms.StoreMessageInfo(mi)
 | 
							ms.StoreMessageInfo(mi)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -101,7 +92,7 @@ func (x *ValidMessage) String() string {
 | 
				
			||||||
func (*ValidMessage) ProtoMessage() {}
 | 
					func (*ValidMessage) ProtoMessage() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *ValidMessage) ProtoReflect() protoreflect.Message {
 | 
					func (x *ValidMessage) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
	mi := &file_nonce_proto_nonce_proto_msgTypes[1]
 | 
						mi := &file_nonce_proto_msgTypes[1]
 | 
				
			||||||
	if protoimpl.UnsafeEnabled && x != nil {
 | 
						if protoimpl.UnsafeEnabled && x != nil {
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		if ms.LoadMessageInfo() == nil {
 | 
							if ms.LoadMessageInfo() == nil {
 | 
				
			||||||
| 
						 | 
					@ -114,7 +105,7 @@ func (x *ValidMessage) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Deprecated: Use ValidMessage.ProtoReflect.Descriptor instead.
 | 
					// Deprecated: Use ValidMessage.ProtoReflect.Descriptor instead.
 | 
				
			||||||
func (*ValidMessage) Descriptor() ([]byte, []int) {
 | 
					func (*ValidMessage) Descriptor() ([]byte, []int) {
 | 
				
			||||||
	return file_nonce_proto_nonce_proto_rawDescGZIP(), []int{1}
 | 
						return file_nonce_proto_rawDescGZIP(), []int{1}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *ValidMessage) GetValid() bool {
 | 
					func (x *ValidMessage) GetValid() bool {
 | 
				
			||||||
| 
						 | 
					@ -124,49 +115,48 @@ func (x *ValidMessage) GetValid() bool {
 | 
				
			||||||
	return false
 | 
						return false
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var File_nonce_proto_nonce_proto protoreflect.FileDescriptor
 | 
					var File_nonce_proto protoreflect.FileDescriptor
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var file_nonce_proto_nonce_proto_rawDesc = []byte{
 | 
					var file_nonce_proto_rawDesc = []byte{
 | 
				
			||||||
	0x0a, 0x17, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6e, 0x6f,
 | 
						0x0a, 0x0b, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x6e,
 | 
				
			||||||
	0x6e, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65,
 | 
						0x6f, 0x6e, 0x63, 0x65, 0x1a, 0x15, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
 | 
				
			||||||
	0x1a, 0x15, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x72,
 | 
						0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x24, 0x0a, 0x0c, 0x4e,
 | 
				
			||||||
	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x24, 0x0a, 0x0c, 0x4e, 0x6f, 0x6e, 0x63, 0x65,
 | 
						0x6f, 0x6e, 0x63, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6e,
 | 
				
			||||||
	0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65,
 | 
						0x6f, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63,
 | 
				
			||||||
	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x22, 0x24, 0x0a,
 | 
						0x65, 0x22, 0x24, 0x0a, 0x0c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67,
 | 
				
			||||||
	0x0c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a,
 | 
						0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08,
 | 
				
			||||||
	0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61,
 | 
						0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x32, 0x71, 0x0a, 0x0c, 0x4e, 0x6f, 0x6e, 0x63, 0x65,
 | 
				
			||||||
	0x6c, 0x69, 0x64, 0x32, 0x71, 0x0a, 0x0c, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x53, 0x65, 0x72, 0x76,
 | 
						0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x2b, 0x0a, 0x05, 0x4e, 0x6f, 0x6e, 0x63, 0x65,
 | 
				
			||||||
	0x69, 0x63, 0x65, 0x12, 0x2b, 0x0a, 0x05, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x0b, 0x2e, 0x63,
 | 
						0x12, 0x0b, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x13, 0x2e,
 | 
				
			||||||
	0x6f, 0x72, 0x65, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x13, 0x2e, 0x6e, 0x6f, 0x6e, 0x63,
 | 
						0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x2e, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61,
 | 
				
			||||||
	0x65, 0x2e, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00,
 | 
						0x67, 0x65, 0x22, 0x00, 0x12, 0x34, 0x0a, 0x06, 0x52, 0x65, 0x64, 0x65, 0x65, 0x6d, 0x12, 0x13,
 | 
				
			||||||
	0x12, 0x34, 0x0a, 0x06, 0x52, 0x65, 0x64, 0x65, 0x65, 0x6d, 0x12, 0x13, 0x2e, 0x6e, 0x6f, 0x6e,
 | 
						0x2e, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x2e, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x4d, 0x65, 0x73, 0x73,
 | 
				
			||||||
	0x63, 0x65, 0x2e, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a,
 | 
						0x61, 0x67, 0x65, 0x1a, 0x13, 0x2e, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x2e, 0x56, 0x61, 0x6c, 0x69,
 | 
				
			||||||
	0x13, 0x2e, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x4d, 0x65, 0x73,
 | 
						0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x42, 0x2c, 0x5a, 0x2a, 0x67, 0x69,
 | 
				
			||||||
	0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x42, 0x2c, 0x5a, 0x2a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,
 | 
						0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x65, 0x74, 0x73, 0x65, 0x6e, 0x63,
 | 
				
			||||||
	0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x65, 0x74, 0x73, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74,
 | 
						0x72, 0x79, 0x70, 0x74, 0x2f, 0x62, 0x6f, 0x75, 0x6c, 0x64, 0x65, 0x72, 0x2f, 0x6e, 0x6f, 0x6e,
 | 
				
			||||||
	0x2f, 0x62, 0x6f, 0x75, 0x6c, 0x64, 0x65, 0x72, 0x2f, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x2f, 0x70,
 | 
						0x63, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 | 
				
			||||||
	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
	file_nonce_proto_nonce_proto_rawDescOnce sync.Once
 | 
						file_nonce_proto_rawDescOnce sync.Once
 | 
				
			||||||
	file_nonce_proto_nonce_proto_rawDescData = file_nonce_proto_nonce_proto_rawDesc
 | 
						file_nonce_proto_rawDescData = file_nonce_proto_rawDesc
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func file_nonce_proto_nonce_proto_rawDescGZIP() []byte {
 | 
					func file_nonce_proto_rawDescGZIP() []byte {
 | 
				
			||||||
	file_nonce_proto_nonce_proto_rawDescOnce.Do(func() {
 | 
						file_nonce_proto_rawDescOnce.Do(func() {
 | 
				
			||||||
		file_nonce_proto_nonce_proto_rawDescData = protoimpl.X.CompressGZIP(file_nonce_proto_nonce_proto_rawDescData)
 | 
							file_nonce_proto_rawDescData = protoimpl.X.CompressGZIP(file_nonce_proto_rawDescData)
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	return file_nonce_proto_nonce_proto_rawDescData
 | 
						return file_nonce_proto_rawDescData
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var file_nonce_proto_nonce_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
 | 
					var file_nonce_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
 | 
				
			||||||
var file_nonce_proto_nonce_proto_goTypes = []interface{}{
 | 
					var file_nonce_proto_goTypes = []interface{}{
 | 
				
			||||||
	(*NonceMessage)(nil), // 0: nonce.NonceMessage
 | 
						(*NonceMessage)(nil), // 0: nonce.NonceMessage
 | 
				
			||||||
	(*ValidMessage)(nil), // 1: nonce.ValidMessage
 | 
						(*ValidMessage)(nil), // 1: nonce.ValidMessage
 | 
				
			||||||
	(*proto1.Empty)(nil), // 2: core.Empty
 | 
						(*proto.Empty)(nil),  // 2: core.Empty
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
var file_nonce_proto_nonce_proto_depIdxs = []int32{
 | 
					var file_nonce_proto_depIdxs = []int32{
 | 
				
			||||||
	2, // 0: nonce.NonceService.Nonce:input_type -> core.Empty
 | 
						2, // 0: nonce.NonceService.Nonce:input_type -> core.Empty
 | 
				
			||||||
	0, // 1: nonce.NonceService.Redeem:input_type -> nonce.NonceMessage
 | 
						0, // 1: nonce.NonceService.Redeem:input_type -> nonce.NonceMessage
 | 
				
			||||||
	0, // 2: nonce.NonceService.Nonce:output_type -> nonce.NonceMessage
 | 
						0, // 2: nonce.NonceService.Nonce:output_type -> nonce.NonceMessage
 | 
				
			||||||
| 
						 | 
					@ -178,13 +168,13 @@ var file_nonce_proto_nonce_proto_depIdxs = []int32{
 | 
				
			||||||
	0, // [0:0] is the sub-list for field type_name
 | 
						0, // [0:0] is the sub-list for field type_name
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func init() { file_nonce_proto_nonce_proto_init() }
 | 
					func init() { file_nonce_proto_init() }
 | 
				
			||||||
func file_nonce_proto_nonce_proto_init() {
 | 
					func file_nonce_proto_init() {
 | 
				
			||||||
	if File_nonce_proto_nonce_proto != nil {
 | 
						if File_nonce_proto != nil {
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if !protoimpl.UnsafeEnabled {
 | 
						if !protoimpl.UnsafeEnabled {
 | 
				
			||||||
		file_nonce_proto_nonce_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 | 
							file_nonce_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 | 
				
			||||||
			switch v := v.(*NonceMessage); i {
 | 
								switch v := v.(*NonceMessage); i {
 | 
				
			||||||
			case 0:
 | 
								case 0:
 | 
				
			||||||
				return &v.state
 | 
									return &v.state
 | 
				
			||||||
| 
						 | 
					@ -196,7 +186,7 @@ func file_nonce_proto_nonce_proto_init() {
 | 
				
			||||||
				return nil
 | 
									return nil
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		file_nonce_proto_nonce_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 | 
							file_nonce_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 | 
				
			||||||
			switch v := v.(*ValidMessage); i {
 | 
								switch v := v.(*ValidMessage); i {
 | 
				
			||||||
			case 0:
 | 
								case 0:
 | 
				
			||||||
				return &v.state
 | 
									return &v.state
 | 
				
			||||||
| 
						 | 
					@ -213,134 +203,18 @@ func file_nonce_proto_nonce_proto_init() {
 | 
				
			||||||
	out := protoimpl.TypeBuilder{
 | 
						out := protoimpl.TypeBuilder{
 | 
				
			||||||
		File: protoimpl.DescBuilder{
 | 
							File: protoimpl.DescBuilder{
 | 
				
			||||||
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 | 
								GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 | 
				
			||||||
			RawDescriptor: file_nonce_proto_nonce_proto_rawDesc,
 | 
								RawDescriptor: file_nonce_proto_rawDesc,
 | 
				
			||||||
			NumEnums:      0,
 | 
								NumEnums:      0,
 | 
				
			||||||
			NumMessages:   2,
 | 
								NumMessages:   2,
 | 
				
			||||||
			NumExtensions: 0,
 | 
								NumExtensions: 0,
 | 
				
			||||||
			NumServices:   1,
 | 
								NumServices:   1,
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		GoTypes:           file_nonce_proto_nonce_proto_goTypes,
 | 
							GoTypes:           file_nonce_proto_goTypes,
 | 
				
			||||||
		DependencyIndexes: file_nonce_proto_nonce_proto_depIdxs,
 | 
							DependencyIndexes: file_nonce_proto_depIdxs,
 | 
				
			||||||
		MessageInfos:      file_nonce_proto_nonce_proto_msgTypes,
 | 
							MessageInfos:      file_nonce_proto_msgTypes,
 | 
				
			||||||
	}.Build()
 | 
						}.Build()
 | 
				
			||||||
	File_nonce_proto_nonce_proto = out.File
 | 
						File_nonce_proto = out.File
 | 
				
			||||||
	file_nonce_proto_nonce_proto_rawDesc = nil
 | 
						file_nonce_proto_rawDesc = nil
 | 
				
			||||||
	file_nonce_proto_nonce_proto_goTypes = nil
 | 
						file_nonce_proto_goTypes = nil
 | 
				
			||||||
	file_nonce_proto_nonce_proto_depIdxs = nil
 | 
						file_nonce_proto_depIdxs = nil
 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Reference imports to suppress errors if they are not otherwise used.
 | 
					 | 
				
			||||||
var _ context.Context
 | 
					 | 
				
			||||||
var _ grpc.ClientConnInterface
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// This is a compile-time assertion to ensure that this generated file
 | 
					 | 
				
			||||||
// is compatible with the grpc package it is being compiled against.
 | 
					 | 
				
			||||||
const _ = grpc.SupportPackageIsVersion6
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// NonceServiceClient is the client API for NonceService service.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
 | 
					 | 
				
			||||||
type NonceServiceClient interface {
 | 
					 | 
				
			||||||
	Nonce(ctx context.Context, in *proto1.Empty, opts ...grpc.CallOption) (*NonceMessage, error)
 | 
					 | 
				
			||||||
	Redeem(ctx context.Context, in *NonceMessage, opts ...grpc.CallOption) (*ValidMessage, error)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type nonceServiceClient struct {
 | 
					 | 
				
			||||||
	cc grpc.ClientConnInterface
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func NewNonceServiceClient(cc grpc.ClientConnInterface) NonceServiceClient {
 | 
					 | 
				
			||||||
	return &nonceServiceClient{cc}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (c *nonceServiceClient) Nonce(ctx context.Context, in *proto1.Empty, opts ...grpc.CallOption) (*NonceMessage, error) {
 | 
					 | 
				
			||||||
	out := new(NonceMessage)
 | 
					 | 
				
			||||||
	err := c.cc.Invoke(ctx, "/nonce.NonceService/Nonce", in, out, opts...)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return out, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (c *nonceServiceClient) Redeem(ctx context.Context, in *NonceMessage, opts ...grpc.CallOption) (*ValidMessage, error) {
 | 
					 | 
				
			||||||
	out := new(ValidMessage)
 | 
					 | 
				
			||||||
	err := c.cc.Invoke(ctx, "/nonce.NonceService/Redeem", in, out, opts...)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return out, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// NonceServiceServer is the server API for NonceService service.
 | 
					 | 
				
			||||||
type NonceServiceServer interface {
 | 
					 | 
				
			||||||
	Nonce(context.Context, *proto1.Empty) (*NonceMessage, error)
 | 
					 | 
				
			||||||
	Redeem(context.Context, *NonceMessage) (*ValidMessage, error)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// UnimplementedNonceServiceServer can be embedded to have forward compatible implementations.
 | 
					 | 
				
			||||||
type UnimplementedNonceServiceServer struct {
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (*UnimplementedNonceServiceServer) Nonce(context.Context, *proto1.Empty) (*NonceMessage, error) {
 | 
					 | 
				
			||||||
	return nil, status.Errorf(codes.Unimplemented, "method Nonce not implemented")
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
func (*UnimplementedNonceServiceServer) Redeem(context.Context, *NonceMessage) (*ValidMessage, error) {
 | 
					 | 
				
			||||||
	return nil, status.Errorf(codes.Unimplemented, "method Redeem not implemented")
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func RegisterNonceServiceServer(s *grpc.Server, srv NonceServiceServer) {
 | 
					 | 
				
			||||||
	s.RegisterService(&_NonceService_serviceDesc, srv)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func _NonceService_Nonce_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
					 | 
				
			||||||
	in := new(proto1.Empty)
 | 
					 | 
				
			||||||
	if err := dec(in); err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if interceptor == nil {
 | 
					 | 
				
			||||||
		return srv.(NonceServiceServer).Nonce(ctx, in)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	info := &grpc.UnaryServerInfo{
 | 
					 | 
				
			||||||
		Server:     srv,
 | 
					 | 
				
			||||||
		FullMethod: "/nonce.NonceService/Nonce",
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 | 
					 | 
				
			||||||
		return srv.(NonceServiceServer).Nonce(ctx, req.(*proto1.Empty))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return interceptor(ctx, in, info, handler)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func _NonceService_Redeem_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
					 | 
				
			||||||
	in := new(NonceMessage)
 | 
					 | 
				
			||||||
	if err := dec(in); err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if interceptor == nil {
 | 
					 | 
				
			||||||
		return srv.(NonceServiceServer).Redeem(ctx, in)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	info := &grpc.UnaryServerInfo{
 | 
					 | 
				
			||||||
		Server:     srv,
 | 
					 | 
				
			||||||
		FullMethod: "/nonce.NonceService/Redeem",
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 | 
					 | 
				
			||||||
		return srv.(NonceServiceServer).Redeem(ctx, req.(*NonceMessage))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return interceptor(ctx, in, info, handler)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var _NonceService_serviceDesc = grpc.ServiceDesc{
 | 
					 | 
				
			||||||
	ServiceName: "nonce.NonceService",
 | 
					 | 
				
			||||||
	HandlerType: (*NonceServiceServer)(nil),
 | 
					 | 
				
			||||||
	Methods: []grpc.MethodDesc{
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			MethodName: "Nonce",
 | 
					 | 
				
			||||||
			Handler:    _NonceService_Nonce_Handler,
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			MethodName: "Redeem",
 | 
					 | 
				
			||||||
			Handler:    _NonceService_Redeem_Handler,
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
	Streams:  []grpc.StreamDesc{},
 | 
					 | 
				
			||||||
	Metadata: "nonce/proto/nonce.proto",
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,138 @@
 | 
				
			||||||
 | 
					// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package proto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						context "context"
 | 
				
			||||||
 | 
						proto "github.com/letsencrypt/boulder/core/proto"
 | 
				
			||||||
 | 
						grpc "google.golang.org/grpc"
 | 
				
			||||||
 | 
						codes "google.golang.org/grpc/codes"
 | 
				
			||||||
 | 
						status "google.golang.org/grpc/status"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NonceServiceClient is the client API for NonceService 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.
 | 
				
			||||||
 | 
					type NonceServiceClient interface {
 | 
				
			||||||
 | 
						Nonce(ctx context.Context, in *proto.Empty, opts ...grpc.CallOption) (*NonceMessage, error)
 | 
				
			||||||
 | 
						Redeem(ctx context.Context, in *NonceMessage, opts ...grpc.CallOption) (*ValidMessage, error)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type nonceServiceClient struct {
 | 
				
			||||||
 | 
						cc grpc.ClientConnInterface
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewNonceServiceClient(cc grpc.ClientConnInterface) NonceServiceClient {
 | 
				
			||||||
 | 
						return &nonceServiceClient{cc}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *nonceServiceClient) Nonce(ctx context.Context, in *proto.Empty, opts ...grpc.CallOption) (*NonceMessage, error) {
 | 
				
			||||||
 | 
						out := new(NonceMessage)
 | 
				
			||||||
 | 
						err := c.cc.Invoke(ctx, "/nonce.NonceService/Nonce", in, out, opts...)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return out, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *nonceServiceClient) Redeem(ctx context.Context, in *NonceMessage, opts ...grpc.CallOption) (*ValidMessage, error) {
 | 
				
			||||||
 | 
						out := new(ValidMessage)
 | 
				
			||||||
 | 
						err := c.cc.Invoke(ctx, "/nonce.NonceService/Redeem", in, out, opts...)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return out, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NonceServiceServer is the server API for NonceService service.
 | 
				
			||||||
 | 
					// All implementations must embed UnimplementedNonceServiceServer
 | 
				
			||||||
 | 
					// for forward compatibility
 | 
				
			||||||
 | 
					type NonceServiceServer interface {
 | 
				
			||||||
 | 
						Nonce(context.Context, *proto.Empty) (*NonceMessage, error)
 | 
				
			||||||
 | 
						Redeem(context.Context, *NonceMessage) (*ValidMessage, error)
 | 
				
			||||||
 | 
						mustEmbedUnimplementedNonceServiceServer()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// UnimplementedNonceServiceServer must be embedded to have forward compatible implementations.
 | 
				
			||||||
 | 
					type UnimplementedNonceServiceServer struct {
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (UnimplementedNonceServiceServer) Nonce(context.Context, *proto.Empty) (*NonceMessage, error) {
 | 
				
			||||||
 | 
						return nil, status.Errorf(codes.Unimplemented, "method Nonce not implemented")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					func (UnimplementedNonceServiceServer) Redeem(context.Context, *NonceMessage) (*ValidMessage, error) {
 | 
				
			||||||
 | 
						return nil, status.Errorf(codes.Unimplemented, "method Redeem not implemented")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					func (UnimplementedNonceServiceServer) mustEmbedUnimplementedNonceServiceServer() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// UnsafeNonceServiceServer may be embedded to opt out of forward compatibility for this service.
 | 
				
			||||||
 | 
					// Use of this interface is not recommended, as added methods to NonceServiceServer will
 | 
				
			||||||
 | 
					// result in compilation errors.
 | 
				
			||||||
 | 
					type UnsafeNonceServiceServer interface {
 | 
				
			||||||
 | 
						mustEmbedUnimplementedNonceServiceServer()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func RegisterNonceServiceServer(s grpc.ServiceRegistrar, srv NonceServiceServer) {
 | 
				
			||||||
 | 
						s.RegisterService(&NonceService_ServiceDesc, srv)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _NonceService_Nonce_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
				
			||||||
 | 
						in := new(proto.Empty)
 | 
				
			||||||
 | 
						if err := dec(in); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if interceptor == nil {
 | 
				
			||||||
 | 
							return srv.(NonceServiceServer).Nonce(ctx, in)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						info := &grpc.UnaryServerInfo{
 | 
				
			||||||
 | 
							Server:     srv,
 | 
				
			||||||
 | 
							FullMethod: "/nonce.NonceService/Nonce",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 | 
				
			||||||
 | 
							return srv.(NonceServiceServer).Nonce(ctx, req.(*proto.Empty))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return interceptor(ctx, in, info, handler)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _NonceService_Redeem_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
				
			||||||
 | 
						in := new(NonceMessage)
 | 
				
			||||||
 | 
						if err := dec(in); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if interceptor == nil {
 | 
				
			||||||
 | 
							return srv.(NonceServiceServer).Redeem(ctx, in)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						info := &grpc.UnaryServerInfo{
 | 
				
			||||||
 | 
							Server:     srv,
 | 
				
			||||||
 | 
							FullMethod: "/nonce.NonceService/Redeem",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 | 
				
			||||||
 | 
							return srv.(NonceServiceServer).Redeem(ctx, req.(*NonceMessage))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return interceptor(ctx, in, info, handler)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NonceService_ServiceDesc is the grpc.ServiceDesc for NonceService service.
 | 
				
			||||||
 | 
					// It's only intended for direct use with grpc.RegisterService,
 | 
				
			||||||
 | 
					// and not to be introspected or modified (even as a copy)
 | 
				
			||||||
 | 
					var NonceService_ServiceDesc = grpc.ServiceDesc{
 | 
				
			||||||
 | 
						ServiceName: "nonce.NonceService",
 | 
				
			||||||
 | 
						HandlerType: (*NonceServiceServer)(nil),
 | 
				
			||||||
 | 
						Methods: []grpc.MethodDesc{
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								MethodName: "Nonce",
 | 
				
			||||||
 | 
								Handler:    _NonceService_Nonce_Handler,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								MethodName: "Redeem",
 | 
				
			||||||
 | 
								Handler:    _NonceService_Redeem_Handler,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						Streams:  []grpc.StreamDesc{},
 | 
				
			||||||
 | 
						Metadata: "nonce.proto",
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,3 @@
 | 
				
			||||||
package publisher
 | 
					package proto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//go:generate protoc --go_opt=paths=source_relative --go_out=plugins=grpc:. publisher.proto
 | 
					//go:generate sh -c "cd ../.. && protoc -I publisher/proto/ -I . --go_out=publisher/proto --go-grpc_out=publisher/proto --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative publisher/proto/publisher.proto"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,17 +1,12 @@
 | 
				
			||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
 | 
					// Code generated by protoc-gen-go. DO NOT EDIT.
 | 
				
			||||||
// versions:
 | 
					// versions:
 | 
				
			||||||
// 	protoc-gen-go v1.21.0
 | 
					// 	protoc-gen-go v1.26.0
 | 
				
			||||||
// 	protoc        v3.11.4
 | 
					// 	protoc        v3.15.6
 | 
				
			||||||
// source: publisher.proto
 | 
					// source: publisher.proto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package publisher
 | 
					package proto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	context "context"
 | 
					 | 
				
			||||||
	proto "github.com/golang/protobuf/proto"
 | 
					 | 
				
			||||||
	grpc "google.golang.org/grpc"
 | 
					 | 
				
			||||||
	codes "google.golang.org/grpc/codes"
 | 
					 | 
				
			||||||
	status "google.golang.org/grpc/status"
 | 
					 | 
				
			||||||
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 | 
						protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 | 
				
			||||||
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 | 
						protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 | 
				
			||||||
	reflect "reflect"
 | 
						reflect "reflect"
 | 
				
			||||||
| 
						 | 
					@ -25,10 +20,6 @@ const (
 | 
				
			||||||
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
 | 
						_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// This is a compile-time assertion that a sufficiently up-to-date version
 | 
					 | 
				
			||||||
// of the legacy proto package is being used.
 | 
					 | 
				
			||||||
const _ = proto.ProtoPackageIsVersion4
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type Request struct {
 | 
					type Request struct {
 | 
				
			||||||
	state         protoimpl.MessageState
 | 
						state         protoimpl.MessageState
 | 
				
			||||||
	sizeCache     protoimpl.SizeCache
 | 
						sizeCache     protoimpl.SizeCache
 | 
				
			||||||
| 
						 | 
					@ -173,9 +164,11 @@ var file_publisher_proto_rawDesc = []byte{
 | 
				
			||||||
	0x09, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x72, 0x12, 0x31, 0x0a, 0x1a, 0x53, 0x75,
 | 
						0x09, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x72, 0x12, 0x31, 0x0a, 0x1a, 0x53, 0x75,
 | 
				
			||||||
	0x62, 0x6d, 0x69, 0x74, 0x54, 0x6f, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x43, 0x54, 0x57, 0x69,
 | 
						0x62, 0x6d, 0x69, 0x74, 0x54, 0x6f, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x43, 0x54, 0x57, 0x69,
 | 
				
			||||||
	0x74, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x08, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65,
 | 
						0x74, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x08, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65,
 | 
				
			||||||
	0x73, 0x74, 0x1a, 0x07, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x42, 0x0d, 0x5a,
 | 
						0x73, 0x74, 0x1a, 0x07, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x42, 0x30, 0x5a,
 | 
				
			||||||
	0x0b, 0x2e, 0x3b, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72,
 | 
						0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x65, 0x74, 0x73,
 | 
				
			||||||
	0x6f, 0x74, 0x6f, 0x33,
 | 
						0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x2f, 0x62, 0x6f, 0x75, 0x6c, 0x64, 0x65, 0x72, 0x2f,
 | 
				
			||||||
 | 
						0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
 | 
				
			||||||
 | 
						0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
| 
						 | 
					@ -255,83 +248,3 @@ func file_publisher_proto_init() {
 | 
				
			||||||
	file_publisher_proto_goTypes = nil
 | 
						file_publisher_proto_goTypes = nil
 | 
				
			||||||
	file_publisher_proto_depIdxs = nil
 | 
						file_publisher_proto_depIdxs = nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
// Reference imports to suppress errors if they are not otherwise used.
 | 
					 | 
				
			||||||
var _ context.Context
 | 
					 | 
				
			||||||
var _ grpc.ClientConnInterface
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// This is a compile-time assertion to ensure that this generated file
 | 
					 | 
				
			||||||
// is compatible with the grpc package it is being compiled against.
 | 
					 | 
				
			||||||
const _ = grpc.SupportPackageIsVersion6
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// PublisherClient is the client API for Publisher service.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
 | 
					 | 
				
			||||||
type PublisherClient interface {
 | 
					 | 
				
			||||||
	SubmitToSingleCTWithResult(ctx context.Context, in *Request, opts ...grpc.CallOption) (*Result, error)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type publisherClient struct {
 | 
					 | 
				
			||||||
	cc grpc.ClientConnInterface
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func NewPublisherClient(cc grpc.ClientConnInterface) PublisherClient {
 | 
					 | 
				
			||||||
	return &publisherClient{cc}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (c *publisherClient) SubmitToSingleCTWithResult(ctx context.Context, in *Request, opts ...grpc.CallOption) (*Result, error) {
 | 
					 | 
				
			||||||
	out := new(Result)
 | 
					 | 
				
			||||||
	err := c.cc.Invoke(ctx, "/Publisher/SubmitToSingleCTWithResult", in, out, opts...)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return out, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// PublisherServer is the server API for Publisher service.
 | 
					 | 
				
			||||||
type PublisherServer interface {
 | 
					 | 
				
			||||||
	SubmitToSingleCTWithResult(context.Context, *Request) (*Result, error)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// UnimplementedPublisherServer can be embedded to have forward compatible implementations.
 | 
					 | 
				
			||||||
type UnimplementedPublisherServer struct {
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (*UnimplementedPublisherServer) SubmitToSingleCTWithResult(context.Context, *Request) (*Result, error) {
 | 
					 | 
				
			||||||
	return nil, status.Errorf(codes.Unimplemented, "method SubmitToSingleCTWithResult not implemented")
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func RegisterPublisherServer(s *grpc.Server, srv PublisherServer) {
 | 
					 | 
				
			||||||
	s.RegisterService(&_Publisher_serviceDesc, srv)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func _Publisher_SubmitToSingleCTWithResult_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
					 | 
				
			||||||
	in := new(Request)
 | 
					 | 
				
			||||||
	if err := dec(in); err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if interceptor == nil {
 | 
					 | 
				
			||||||
		return srv.(PublisherServer).SubmitToSingleCTWithResult(ctx, in)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	info := &grpc.UnaryServerInfo{
 | 
					 | 
				
			||||||
		Server:     srv,
 | 
					 | 
				
			||||||
		FullMethod: "/Publisher/SubmitToSingleCTWithResult",
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 | 
					 | 
				
			||||||
		return srv.(PublisherServer).SubmitToSingleCTWithResult(ctx, req.(*Request))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return interceptor(ctx, in, info, handler)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var _Publisher_serviceDesc = grpc.ServiceDesc{
 | 
					 | 
				
			||||||
	ServiceName: "Publisher",
 | 
					 | 
				
			||||||
	HandlerType: (*PublisherServer)(nil),
 | 
					 | 
				
			||||||
	Methods: []grpc.MethodDesc{
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			MethodName: "SubmitToSingleCTWithResult",
 | 
					 | 
				
			||||||
			Handler:    _Publisher_SubmitToSingleCTWithResult_Handler,
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
	Streams:  []grpc.StreamDesc{},
 | 
					 | 
				
			||||||
	Metadata: "publisher.proto",
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,5 @@
 | 
				
			||||||
syntax = "proto3";
 | 
					syntax = "proto3";
 | 
				
			||||||
option go_package = ".;publisher";
 | 
					option go_package = "github.com/letsencrypt/boulder/publisher/proto";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
service Publisher {
 | 
					service Publisher {
 | 
				
			||||||
  rpc SubmitToSingleCTWithResult(Request) returns (Result) {}
 | 
					  rpc SubmitToSingleCTWithResult(Request) returns (Result) {}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,101 @@
 | 
				
			||||||
 | 
					// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package proto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						context "context"
 | 
				
			||||||
 | 
						grpc "google.golang.org/grpc"
 | 
				
			||||||
 | 
						codes "google.golang.org/grpc/codes"
 | 
				
			||||||
 | 
						status "google.golang.org/grpc/status"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// PublisherClient is the client API for Publisher 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.
 | 
				
			||||||
 | 
					type PublisherClient interface {
 | 
				
			||||||
 | 
						SubmitToSingleCTWithResult(ctx context.Context, in *Request, opts ...grpc.CallOption) (*Result, error)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type publisherClient struct {
 | 
				
			||||||
 | 
						cc grpc.ClientConnInterface
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewPublisherClient(cc grpc.ClientConnInterface) PublisherClient {
 | 
				
			||||||
 | 
						return &publisherClient{cc}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *publisherClient) SubmitToSingleCTWithResult(ctx context.Context, in *Request, opts ...grpc.CallOption) (*Result, error) {
 | 
				
			||||||
 | 
						out := new(Result)
 | 
				
			||||||
 | 
						err := c.cc.Invoke(ctx, "/Publisher/SubmitToSingleCTWithResult", in, out, opts...)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return out, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// PublisherServer is the server API for Publisher service.
 | 
				
			||||||
 | 
					// All implementations must embed UnimplementedPublisherServer
 | 
				
			||||||
 | 
					// for forward compatibility
 | 
				
			||||||
 | 
					type PublisherServer interface {
 | 
				
			||||||
 | 
						SubmitToSingleCTWithResult(context.Context, *Request) (*Result, error)
 | 
				
			||||||
 | 
						mustEmbedUnimplementedPublisherServer()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// UnimplementedPublisherServer must be embedded to have forward compatible implementations.
 | 
				
			||||||
 | 
					type UnimplementedPublisherServer struct {
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (UnimplementedPublisherServer) SubmitToSingleCTWithResult(context.Context, *Request) (*Result, error) {
 | 
				
			||||||
 | 
						return nil, status.Errorf(codes.Unimplemented, "method SubmitToSingleCTWithResult not implemented")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					func (UnimplementedPublisherServer) mustEmbedUnimplementedPublisherServer() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// UnsafePublisherServer may be embedded to opt out of forward compatibility for this service.
 | 
				
			||||||
 | 
					// Use of this interface is not recommended, as added methods to PublisherServer will
 | 
				
			||||||
 | 
					// result in compilation errors.
 | 
				
			||||||
 | 
					type UnsafePublisherServer interface {
 | 
				
			||||||
 | 
						mustEmbedUnimplementedPublisherServer()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func RegisterPublisherServer(s grpc.ServiceRegistrar, srv PublisherServer) {
 | 
				
			||||||
 | 
						s.RegisterService(&Publisher_ServiceDesc, srv)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _Publisher_SubmitToSingleCTWithResult_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
				
			||||||
 | 
						in := new(Request)
 | 
				
			||||||
 | 
						if err := dec(in); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if interceptor == nil {
 | 
				
			||||||
 | 
							return srv.(PublisherServer).SubmitToSingleCTWithResult(ctx, in)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						info := &grpc.UnaryServerInfo{
 | 
				
			||||||
 | 
							Server:     srv,
 | 
				
			||||||
 | 
							FullMethod: "/Publisher/SubmitToSingleCTWithResult",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 | 
				
			||||||
 | 
							return srv.(PublisherServer).SubmitToSingleCTWithResult(ctx, req.(*Request))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return interceptor(ctx, in, info, handler)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Publisher_ServiceDesc is the grpc.ServiceDesc for Publisher service.
 | 
				
			||||||
 | 
					// It's only intended for direct use with grpc.RegisterService,
 | 
				
			||||||
 | 
					// and not to be introspected or modified (even as a copy)
 | 
				
			||||||
 | 
					var Publisher_ServiceDesc = grpc.ServiceDesc{
 | 
				
			||||||
 | 
						ServiceName: "Publisher",
 | 
				
			||||||
 | 
						HandlerType: (*PublisherServer)(nil),
 | 
				
			||||||
 | 
						Methods: []grpc.MethodDesc{
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								MethodName: "SubmitToSingleCTWithResult",
 | 
				
			||||||
 | 
								Handler:    _Publisher_SubmitToSingleCTWithResult_Handler,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						Streams:  []grpc.StreamDesc{},
 | 
				
			||||||
 | 
						Metadata: "publisher.proto",
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -197,6 +197,7 @@ func initMetrics(stats prometheus.Registerer) *pubMetrics {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Impl defines a Publisher
 | 
					// Impl defines a Publisher
 | 
				
			||||||
type Impl struct {
 | 
					type Impl struct {
 | 
				
			||||||
 | 
						pubpb.UnimplementedPublisherServer
 | 
				
			||||||
	log           blog.Logger
 | 
						log           blog.Logger
 | 
				
			||||||
	userAgent     string
 | 
						userAgent     string
 | 
				
			||||||
	issuerBundles map[issuance.IssuerNameID][]ct.ASN1Cert
 | 
						issuerBundles map[issuance.IssuerNameID][]ct.ASN1Cert
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,3 @@
 | 
				
			||||||
package proto
 | 
					package proto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//go:generate sh -c "cd ../.. && protoc --go_opt=paths=source_relative --go_out=plugins=grpc,Mcore/proto/core.proto=github.com/letsencrypt/boulder/core/proto:. ra/proto/ra.proto"
 | 
					//go:generate sh -c "cd ../.. && protoc -I ra/proto/ -I . --go_out=ra/proto --go-grpc_out=ra/proto --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative ra/proto/ra.proto"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
					@ -0,0 +1,462 @@
 | 
				
			||||||
 | 
					// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package proto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						context "context"
 | 
				
			||||||
 | 
						proto "github.com/letsencrypt/boulder/core/proto"
 | 
				
			||||||
 | 
						grpc "google.golang.org/grpc"
 | 
				
			||||||
 | 
						codes "google.golang.org/grpc/codes"
 | 
				
			||||||
 | 
						status "google.golang.org/grpc/status"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// RegistrationAuthorityClient is the client API for RegistrationAuthority 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.
 | 
				
			||||||
 | 
					type RegistrationAuthorityClient interface {
 | 
				
			||||||
 | 
						NewRegistration(ctx context.Context, in *proto.Registration, opts ...grpc.CallOption) (*proto.Registration, error)
 | 
				
			||||||
 | 
						NewAuthorization(ctx context.Context, in *NewAuthorizationRequest, opts ...grpc.CallOption) (*proto.Authorization, error)
 | 
				
			||||||
 | 
						NewCertificate(ctx context.Context, in *NewCertificateRequest, opts ...grpc.CallOption) (*proto.Certificate, error)
 | 
				
			||||||
 | 
						UpdateRegistration(ctx context.Context, in *UpdateRegistrationRequest, opts ...grpc.CallOption) (*proto.Registration, error)
 | 
				
			||||||
 | 
						PerformValidation(ctx context.Context, in *PerformValidationRequest, opts ...grpc.CallOption) (*proto.Authorization, error)
 | 
				
			||||||
 | 
						RevokeCertificateWithReg(ctx context.Context, in *RevokeCertificateWithRegRequest, opts ...grpc.CallOption) (*proto.Empty, error)
 | 
				
			||||||
 | 
						DeactivateRegistration(ctx context.Context, in *proto.Registration, opts ...grpc.CallOption) (*proto.Empty, error)
 | 
				
			||||||
 | 
						DeactivateAuthorization(ctx context.Context, in *proto.Authorization, opts ...grpc.CallOption) (*proto.Empty, error)
 | 
				
			||||||
 | 
						AdministrativelyRevokeCertificate(ctx context.Context, in *AdministrativelyRevokeCertificateRequest, opts ...grpc.CallOption) (*proto.Empty, error)
 | 
				
			||||||
 | 
						NewOrder(ctx context.Context, in *NewOrderRequest, opts ...grpc.CallOption) (*proto.Order, error)
 | 
				
			||||||
 | 
						FinalizeOrder(ctx context.Context, in *FinalizeOrderRequest, opts ...grpc.CallOption) (*proto.Order, error)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type registrationAuthorityClient struct {
 | 
				
			||||||
 | 
						cc grpc.ClientConnInterface
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewRegistrationAuthorityClient(cc grpc.ClientConnInterface) RegistrationAuthorityClient {
 | 
				
			||||||
 | 
						return ®istrationAuthorityClient{cc}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *registrationAuthorityClient) NewRegistration(ctx context.Context, in *proto.Registration, opts ...grpc.CallOption) (*proto.Registration, error) {
 | 
				
			||||||
 | 
						out := new(proto.Registration)
 | 
				
			||||||
 | 
						err := c.cc.Invoke(ctx, "/ra.RegistrationAuthority/NewRegistration", in, out, opts...)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return out, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *registrationAuthorityClient) NewAuthorization(ctx context.Context, in *NewAuthorizationRequest, opts ...grpc.CallOption) (*proto.Authorization, error) {
 | 
				
			||||||
 | 
						out := new(proto.Authorization)
 | 
				
			||||||
 | 
						err := c.cc.Invoke(ctx, "/ra.RegistrationAuthority/NewAuthorization", in, out, opts...)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return out, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *registrationAuthorityClient) NewCertificate(ctx context.Context, in *NewCertificateRequest, opts ...grpc.CallOption) (*proto.Certificate, error) {
 | 
				
			||||||
 | 
						out := new(proto.Certificate)
 | 
				
			||||||
 | 
						err := c.cc.Invoke(ctx, "/ra.RegistrationAuthority/NewCertificate", in, out, opts...)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return out, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *registrationAuthorityClient) UpdateRegistration(ctx context.Context, in *UpdateRegistrationRequest, opts ...grpc.CallOption) (*proto.Registration, error) {
 | 
				
			||||||
 | 
						out := new(proto.Registration)
 | 
				
			||||||
 | 
						err := c.cc.Invoke(ctx, "/ra.RegistrationAuthority/UpdateRegistration", in, out, opts...)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return out, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *registrationAuthorityClient) PerformValidation(ctx context.Context, in *PerformValidationRequest, opts ...grpc.CallOption) (*proto.Authorization, error) {
 | 
				
			||||||
 | 
						out := new(proto.Authorization)
 | 
				
			||||||
 | 
						err := c.cc.Invoke(ctx, "/ra.RegistrationAuthority/PerformValidation", in, out, opts...)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return out, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *registrationAuthorityClient) RevokeCertificateWithReg(ctx context.Context, in *RevokeCertificateWithRegRequest, opts ...grpc.CallOption) (*proto.Empty, error) {
 | 
				
			||||||
 | 
						out := new(proto.Empty)
 | 
				
			||||||
 | 
						err := c.cc.Invoke(ctx, "/ra.RegistrationAuthority/RevokeCertificateWithReg", in, out, opts...)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return out, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *registrationAuthorityClient) DeactivateRegistration(ctx context.Context, in *proto.Registration, opts ...grpc.CallOption) (*proto.Empty, error) {
 | 
				
			||||||
 | 
						out := new(proto.Empty)
 | 
				
			||||||
 | 
						err := c.cc.Invoke(ctx, "/ra.RegistrationAuthority/DeactivateRegistration", in, out, opts...)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return out, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *registrationAuthorityClient) DeactivateAuthorization(ctx context.Context, in *proto.Authorization, opts ...grpc.CallOption) (*proto.Empty, error) {
 | 
				
			||||||
 | 
						out := new(proto.Empty)
 | 
				
			||||||
 | 
						err := c.cc.Invoke(ctx, "/ra.RegistrationAuthority/DeactivateAuthorization", in, out, opts...)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return out, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *registrationAuthorityClient) AdministrativelyRevokeCertificate(ctx context.Context, in *AdministrativelyRevokeCertificateRequest, opts ...grpc.CallOption) (*proto.Empty, error) {
 | 
				
			||||||
 | 
						out := new(proto.Empty)
 | 
				
			||||||
 | 
						err := c.cc.Invoke(ctx, "/ra.RegistrationAuthority/AdministrativelyRevokeCertificate", in, out, opts...)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return out, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *registrationAuthorityClient) NewOrder(ctx context.Context, in *NewOrderRequest, opts ...grpc.CallOption) (*proto.Order, error) {
 | 
				
			||||||
 | 
						out := new(proto.Order)
 | 
				
			||||||
 | 
						err := c.cc.Invoke(ctx, "/ra.RegistrationAuthority/NewOrder", in, out, opts...)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return out, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *registrationAuthorityClient) FinalizeOrder(ctx context.Context, in *FinalizeOrderRequest, opts ...grpc.CallOption) (*proto.Order, error) {
 | 
				
			||||||
 | 
						out := new(proto.Order)
 | 
				
			||||||
 | 
						err := c.cc.Invoke(ctx, "/ra.RegistrationAuthority/FinalizeOrder", in, out, opts...)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return out, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// RegistrationAuthorityServer is the server API for RegistrationAuthority service.
 | 
				
			||||||
 | 
					// All implementations must embed UnimplementedRegistrationAuthorityServer
 | 
				
			||||||
 | 
					// for forward compatibility
 | 
				
			||||||
 | 
					type RegistrationAuthorityServer interface {
 | 
				
			||||||
 | 
						NewRegistration(context.Context, *proto.Registration) (*proto.Registration, error)
 | 
				
			||||||
 | 
						NewAuthorization(context.Context, *NewAuthorizationRequest) (*proto.Authorization, error)
 | 
				
			||||||
 | 
						NewCertificate(context.Context, *NewCertificateRequest) (*proto.Certificate, error)
 | 
				
			||||||
 | 
						UpdateRegistration(context.Context, *UpdateRegistrationRequest) (*proto.Registration, error)
 | 
				
			||||||
 | 
						PerformValidation(context.Context, *PerformValidationRequest) (*proto.Authorization, error)
 | 
				
			||||||
 | 
						RevokeCertificateWithReg(context.Context, *RevokeCertificateWithRegRequest) (*proto.Empty, error)
 | 
				
			||||||
 | 
						DeactivateRegistration(context.Context, *proto.Registration) (*proto.Empty, error)
 | 
				
			||||||
 | 
						DeactivateAuthorization(context.Context, *proto.Authorization) (*proto.Empty, error)
 | 
				
			||||||
 | 
						AdministrativelyRevokeCertificate(context.Context, *AdministrativelyRevokeCertificateRequest) (*proto.Empty, error)
 | 
				
			||||||
 | 
						NewOrder(context.Context, *NewOrderRequest) (*proto.Order, error)
 | 
				
			||||||
 | 
						FinalizeOrder(context.Context, *FinalizeOrderRequest) (*proto.Order, error)
 | 
				
			||||||
 | 
						mustEmbedUnimplementedRegistrationAuthorityServer()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// UnimplementedRegistrationAuthorityServer must be embedded to have forward compatible implementations.
 | 
				
			||||||
 | 
					type UnimplementedRegistrationAuthorityServer struct {
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (UnimplementedRegistrationAuthorityServer) NewRegistration(context.Context, *proto.Registration) (*proto.Registration, error) {
 | 
				
			||||||
 | 
						return nil, status.Errorf(codes.Unimplemented, "method NewRegistration not implemented")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					func (UnimplementedRegistrationAuthorityServer) NewAuthorization(context.Context, *NewAuthorizationRequest) (*proto.Authorization, error) {
 | 
				
			||||||
 | 
						return nil, status.Errorf(codes.Unimplemented, "method NewAuthorization not implemented")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					func (UnimplementedRegistrationAuthorityServer) NewCertificate(context.Context, *NewCertificateRequest) (*proto.Certificate, error) {
 | 
				
			||||||
 | 
						return nil, status.Errorf(codes.Unimplemented, "method NewCertificate not implemented")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					func (UnimplementedRegistrationAuthorityServer) UpdateRegistration(context.Context, *UpdateRegistrationRequest) (*proto.Registration, error) {
 | 
				
			||||||
 | 
						return nil, status.Errorf(codes.Unimplemented, "method UpdateRegistration not implemented")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					func (UnimplementedRegistrationAuthorityServer) PerformValidation(context.Context, *PerformValidationRequest) (*proto.Authorization, error) {
 | 
				
			||||||
 | 
						return nil, status.Errorf(codes.Unimplemented, "method PerformValidation not implemented")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					func (UnimplementedRegistrationAuthorityServer) RevokeCertificateWithReg(context.Context, *RevokeCertificateWithRegRequest) (*proto.Empty, error) {
 | 
				
			||||||
 | 
						return nil, status.Errorf(codes.Unimplemented, "method RevokeCertificateWithReg not implemented")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					func (UnimplementedRegistrationAuthorityServer) DeactivateRegistration(context.Context, *proto.Registration) (*proto.Empty, error) {
 | 
				
			||||||
 | 
						return nil, status.Errorf(codes.Unimplemented, "method DeactivateRegistration not implemented")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					func (UnimplementedRegistrationAuthorityServer) DeactivateAuthorization(context.Context, *proto.Authorization) (*proto.Empty, error) {
 | 
				
			||||||
 | 
						return nil, status.Errorf(codes.Unimplemented, "method DeactivateAuthorization not implemented")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					func (UnimplementedRegistrationAuthorityServer) AdministrativelyRevokeCertificate(context.Context, *AdministrativelyRevokeCertificateRequest) (*proto.Empty, error) {
 | 
				
			||||||
 | 
						return nil, status.Errorf(codes.Unimplemented, "method AdministrativelyRevokeCertificate not implemented")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					func (UnimplementedRegistrationAuthorityServer) NewOrder(context.Context, *NewOrderRequest) (*proto.Order, error) {
 | 
				
			||||||
 | 
						return nil, status.Errorf(codes.Unimplemented, "method NewOrder not implemented")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					func (UnimplementedRegistrationAuthorityServer) FinalizeOrder(context.Context, *FinalizeOrderRequest) (*proto.Order, error) {
 | 
				
			||||||
 | 
						return nil, status.Errorf(codes.Unimplemented, "method FinalizeOrder not implemented")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					func (UnimplementedRegistrationAuthorityServer) mustEmbedUnimplementedRegistrationAuthorityServer() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// UnsafeRegistrationAuthorityServer may be embedded to opt out of forward compatibility for this service.
 | 
				
			||||||
 | 
					// Use of this interface is not recommended, as added methods to RegistrationAuthorityServer will
 | 
				
			||||||
 | 
					// result in compilation errors.
 | 
				
			||||||
 | 
					type UnsafeRegistrationAuthorityServer interface {
 | 
				
			||||||
 | 
						mustEmbedUnimplementedRegistrationAuthorityServer()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func RegisterRegistrationAuthorityServer(s grpc.ServiceRegistrar, srv RegistrationAuthorityServer) {
 | 
				
			||||||
 | 
						s.RegisterService(&RegistrationAuthority_ServiceDesc, srv)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _RegistrationAuthority_NewRegistration_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
				
			||||||
 | 
						in := new(proto.Registration)
 | 
				
			||||||
 | 
						if err := dec(in); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if interceptor == nil {
 | 
				
			||||||
 | 
							return srv.(RegistrationAuthorityServer).NewRegistration(ctx, in)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						info := &grpc.UnaryServerInfo{
 | 
				
			||||||
 | 
							Server:     srv,
 | 
				
			||||||
 | 
							FullMethod: "/ra.RegistrationAuthority/NewRegistration",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 | 
				
			||||||
 | 
							return srv.(RegistrationAuthorityServer).NewRegistration(ctx, req.(*proto.Registration))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return interceptor(ctx, in, info, handler)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _RegistrationAuthority_NewAuthorization_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
				
			||||||
 | 
						in := new(NewAuthorizationRequest)
 | 
				
			||||||
 | 
						if err := dec(in); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if interceptor == nil {
 | 
				
			||||||
 | 
							return srv.(RegistrationAuthorityServer).NewAuthorization(ctx, in)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						info := &grpc.UnaryServerInfo{
 | 
				
			||||||
 | 
							Server:     srv,
 | 
				
			||||||
 | 
							FullMethod: "/ra.RegistrationAuthority/NewAuthorization",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 | 
				
			||||||
 | 
							return srv.(RegistrationAuthorityServer).NewAuthorization(ctx, req.(*NewAuthorizationRequest))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return interceptor(ctx, in, info, handler)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _RegistrationAuthority_NewCertificate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
				
			||||||
 | 
						in := new(NewCertificateRequest)
 | 
				
			||||||
 | 
						if err := dec(in); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if interceptor == nil {
 | 
				
			||||||
 | 
							return srv.(RegistrationAuthorityServer).NewCertificate(ctx, in)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						info := &grpc.UnaryServerInfo{
 | 
				
			||||||
 | 
							Server:     srv,
 | 
				
			||||||
 | 
							FullMethod: "/ra.RegistrationAuthority/NewCertificate",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 | 
				
			||||||
 | 
							return srv.(RegistrationAuthorityServer).NewCertificate(ctx, req.(*NewCertificateRequest))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return interceptor(ctx, in, info, handler)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _RegistrationAuthority_UpdateRegistration_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
				
			||||||
 | 
						in := new(UpdateRegistrationRequest)
 | 
				
			||||||
 | 
						if err := dec(in); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if interceptor == nil {
 | 
				
			||||||
 | 
							return srv.(RegistrationAuthorityServer).UpdateRegistration(ctx, in)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						info := &grpc.UnaryServerInfo{
 | 
				
			||||||
 | 
							Server:     srv,
 | 
				
			||||||
 | 
							FullMethod: "/ra.RegistrationAuthority/UpdateRegistration",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 | 
				
			||||||
 | 
							return srv.(RegistrationAuthorityServer).UpdateRegistration(ctx, req.(*UpdateRegistrationRequest))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return interceptor(ctx, in, info, handler)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _RegistrationAuthority_PerformValidation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
				
			||||||
 | 
						in := new(PerformValidationRequest)
 | 
				
			||||||
 | 
						if err := dec(in); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if interceptor == nil {
 | 
				
			||||||
 | 
							return srv.(RegistrationAuthorityServer).PerformValidation(ctx, in)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						info := &grpc.UnaryServerInfo{
 | 
				
			||||||
 | 
							Server:     srv,
 | 
				
			||||||
 | 
							FullMethod: "/ra.RegistrationAuthority/PerformValidation",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 | 
				
			||||||
 | 
							return srv.(RegistrationAuthorityServer).PerformValidation(ctx, req.(*PerformValidationRequest))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return interceptor(ctx, in, info, handler)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _RegistrationAuthority_RevokeCertificateWithReg_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
				
			||||||
 | 
						in := new(RevokeCertificateWithRegRequest)
 | 
				
			||||||
 | 
						if err := dec(in); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if interceptor == nil {
 | 
				
			||||||
 | 
							return srv.(RegistrationAuthorityServer).RevokeCertificateWithReg(ctx, in)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						info := &grpc.UnaryServerInfo{
 | 
				
			||||||
 | 
							Server:     srv,
 | 
				
			||||||
 | 
							FullMethod: "/ra.RegistrationAuthority/RevokeCertificateWithReg",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 | 
				
			||||||
 | 
							return srv.(RegistrationAuthorityServer).RevokeCertificateWithReg(ctx, req.(*RevokeCertificateWithRegRequest))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return interceptor(ctx, in, info, handler)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _RegistrationAuthority_DeactivateRegistration_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
				
			||||||
 | 
						in := new(proto.Registration)
 | 
				
			||||||
 | 
						if err := dec(in); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if interceptor == nil {
 | 
				
			||||||
 | 
							return srv.(RegistrationAuthorityServer).DeactivateRegistration(ctx, in)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						info := &grpc.UnaryServerInfo{
 | 
				
			||||||
 | 
							Server:     srv,
 | 
				
			||||||
 | 
							FullMethod: "/ra.RegistrationAuthority/DeactivateRegistration",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 | 
				
			||||||
 | 
							return srv.(RegistrationAuthorityServer).DeactivateRegistration(ctx, req.(*proto.Registration))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return interceptor(ctx, in, info, handler)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _RegistrationAuthority_DeactivateAuthorization_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
				
			||||||
 | 
						in := new(proto.Authorization)
 | 
				
			||||||
 | 
						if err := dec(in); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if interceptor == nil {
 | 
				
			||||||
 | 
							return srv.(RegistrationAuthorityServer).DeactivateAuthorization(ctx, in)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						info := &grpc.UnaryServerInfo{
 | 
				
			||||||
 | 
							Server:     srv,
 | 
				
			||||||
 | 
							FullMethod: "/ra.RegistrationAuthority/DeactivateAuthorization",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 | 
				
			||||||
 | 
							return srv.(RegistrationAuthorityServer).DeactivateAuthorization(ctx, req.(*proto.Authorization))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return interceptor(ctx, in, info, handler)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _RegistrationAuthority_AdministrativelyRevokeCertificate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
				
			||||||
 | 
						in := new(AdministrativelyRevokeCertificateRequest)
 | 
				
			||||||
 | 
						if err := dec(in); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if interceptor == nil {
 | 
				
			||||||
 | 
							return srv.(RegistrationAuthorityServer).AdministrativelyRevokeCertificate(ctx, in)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						info := &grpc.UnaryServerInfo{
 | 
				
			||||||
 | 
							Server:     srv,
 | 
				
			||||||
 | 
							FullMethod: "/ra.RegistrationAuthority/AdministrativelyRevokeCertificate",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 | 
				
			||||||
 | 
							return srv.(RegistrationAuthorityServer).AdministrativelyRevokeCertificate(ctx, req.(*AdministrativelyRevokeCertificateRequest))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return interceptor(ctx, in, info, handler)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _RegistrationAuthority_NewOrder_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
				
			||||||
 | 
						in := new(NewOrderRequest)
 | 
				
			||||||
 | 
						if err := dec(in); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if interceptor == nil {
 | 
				
			||||||
 | 
							return srv.(RegistrationAuthorityServer).NewOrder(ctx, in)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						info := &grpc.UnaryServerInfo{
 | 
				
			||||||
 | 
							Server:     srv,
 | 
				
			||||||
 | 
							FullMethod: "/ra.RegistrationAuthority/NewOrder",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 | 
				
			||||||
 | 
							return srv.(RegistrationAuthorityServer).NewOrder(ctx, req.(*NewOrderRequest))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return interceptor(ctx, in, info, handler)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _RegistrationAuthority_FinalizeOrder_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
				
			||||||
 | 
						in := new(FinalizeOrderRequest)
 | 
				
			||||||
 | 
						if err := dec(in); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if interceptor == nil {
 | 
				
			||||||
 | 
							return srv.(RegistrationAuthorityServer).FinalizeOrder(ctx, in)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						info := &grpc.UnaryServerInfo{
 | 
				
			||||||
 | 
							Server:     srv,
 | 
				
			||||||
 | 
							FullMethod: "/ra.RegistrationAuthority/FinalizeOrder",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 | 
				
			||||||
 | 
							return srv.(RegistrationAuthorityServer).FinalizeOrder(ctx, req.(*FinalizeOrderRequest))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return interceptor(ctx, in, info, handler)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// RegistrationAuthority_ServiceDesc is the grpc.ServiceDesc for RegistrationAuthority service.
 | 
				
			||||||
 | 
					// It's only intended for direct use with grpc.RegisterService,
 | 
				
			||||||
 | 
					// and not to be introspected or modified (even as a copy)
 | 
				
			||||||
 | 
					var RegistrationAuthority_ServiceDesc = grpc.ServiceDesc{
 | 
				
			||||||
 | 
						ServiceName: "ra.RegistrationAuthority",
 | 
				
			||||||
 | 
						HandlerType: (*RegistrationAuthorityServer)(nil),
 | 
				
			||||||
 | 
						Methods: []grpc.MethodDesc{
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								MethodName: "NewRegistration",
 | 
				
			||||||
 | 
								Handler:    _RegistrationAuthority_NewRegistration_Handler,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								MethodName: "NewAuthorization",
 | 
				
			||||||
 | 
								Handler:    _RegistrationAuthority_NewAuthorization_Handler,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								MethodName: "NewCertificate",
 | 
				
			||||||
 | 
								Handler:    _RegistrationAuthority_NewCertificate_Handler,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								MethodName: "UpdateRegistration",
 | 
				
			||||||
 | 
								Handler:    _RegistrationAuthority_UpdateRegistration_Handler,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								MethodName: "PerformValidation",
 | 
				
			||||||
 | 
								Handler:    _RegistrationAuthority_PerformValidation_Handler,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								MethodName: "RevokeCertificateWithReg",
 | 
				
			||||||
 | 
								Handler:    _RegistrationAuthority_RevokeCertificateWithReg_Handler,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								MethodName: "DeactivateRegistration",
 | 
				
			||||||
 | 
								Handler:    _RegistrationAuthority_DeactivateRegistration_Handler,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								MethodName: "DeactivateAuthorization",
 | 
				
			||||||
 | 
								Handler:    _RegistrationAuthority_DeactivateAuthorization_Handler,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								MethodName: "AdministrativelyRevokeCertificate",
 | 
				
			||||||
 | 
								Handler:    _RegistrationAuthority_AdministrativelyRevokeCertificate_Handler,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								MethodName: "NewOrder",
 | 
				
			||||||
 | 
								Handler:    _RegistrationAuthority_NewOrder_Handler,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								MethodName: "FinalizeOrder",
 | 
				
			||||||
 | 
								Handler:    _RegistrationAuthority_FinalizeOrder_Handler,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						Streams:  []grpc.StreamDesc{},
 | 
				
			||||||
 | 
						Metadata: "ra.proto",
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,3 @@
 | 
				
			||||||
package proto
 | 
					package proto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//go:generate sh -c "cd ../.. && protoc --go_opt=paths=source_relative --go_out=plugins=grpc,Mcore/proto/core.proto=github.com/letsencrypt/boulder/core/proto:. sa/proto/sa.proto"
 | 
					//go:generate sh -c "cd ../.. && protoc -I sa/proto/ -I . --go_out=sa/proto --go-grpc_out=sa/proto --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative sa/proto/sa.proto"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2477
									
								
								sa/proto/sa.pb.go
								
								
								
								
							
							
						
						
									
										2477
									
								
								sa/proto/sa.pb.go
								
								
								
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
					@ -24,7 +24,7 @@ apt-get install -y --no-install-recommends \
 | 
				
			||||||
  autoconf \
 | 
					  autoconf \
 | 
				
			||||||
  automake
 | 
					  automake
 | 
				
			||||||
 | 
					
 | 
				
			||||||
curl -L https://github.com/google/protobuf/releases/download/v3.11.4/protoc-3.11.4-linux-x86_64.zip -o /tmp/protoc.zip
 | 
					curl -L https://github.com/google/protobuf/releases/download/v3.15.6/protoc-3.15.6-linux-x86_64.zip -o /tmp/protoc.zip
 | 
				
			||||||
unzip /tmp/protoc.zip -d /usr/local/protoc
 | 
					unzip /tmp/protoc.zip -d /usr/local/protoc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Override default GOBIN and GOCACHE
 | 
					# Override default GOBIN and GOCACHE
 | 
				
			||||||
| 
						 | 
					@ -39,8 +39,8 @@ curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/insta
 | 
				
			||||||
# and vice versa.
 | 
					# and vice versa.
 | 
				
			||||||
GO111MODULE=on go get \
 | 
					GO111MODULE=on go get \
 | 
				
			||||||
  bitbucket.org/liamstask/goose/cmd/goose \
 | 
					  bitbucket.org/liamstask/goose/cmd/goose \
 | 
				
			||||||
  github.com/golang/protobuf/proto@v1.4.0 \
 | 
					  google.golang.org/protobuf/cmd/protoc-gen-go@v1.26.0 \
 | 
				
			||||||
  github.com/golang/protobuf/protoc-gen-go@v1.4.0 \
 | 
					  google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.1.0 \
 | 
				
			||||||
  golang.org/x/tools/cmd/stringer
 | 
					  golang.org/x/tools/cmd/stringer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Pebble's latest version is v2+, but it's not properly go mod compatible, so we
 | 
					# Pebble's latest version is v2+, but it's not properly go mod compatible, so we
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,7 +5,7 @@ cd $(dirname $0)
 | 
				
			||||||
DATESTAMP=$(date +%Y-%m-%d)
 | 
					DATESTAMP=$(date +%Y-%m-%d)
 | 
				
			||||||
DOCKER_REPO="letsencrypt/boulder-tools"
 | 
					DOCKER_REPO="letsencrypt/boulder-tools"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GO_VERSIONS=( "1.15.7" "1.16.2" )
 | 
					GO_VERSIONS=( "1.16.2" )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Build a tagged image for each GO_VERSION
 | 
					# Build a tagged image for each GO_VERSION
 | 
				
			||||||
for GO_VERSION in "${GO_VERSIONS[@]}"
 | 
					for GO_VERSION in "${GO_VERSIONS[@]}"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,3 @@
 | 
				
			||||||
package proto
 | 
					package proto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//go:generate sh -c "cd ../.. && protoc --go_opt=paths=source_relative --go_out=plugins=grpc,Mcore/proto/core.proto=github.com/letsencrypt/boulder/core/proto:. va/proto/va.proto"
 | 
					//go:generate sh -c "cd ../.. && protoc -I va/proto/ -I . --go_out=va/proto --go-grpc_out=va/proto --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative va/proto/va.proto"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,18 +1,13 @@
 | 
				
			||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
 | 
					// Code generated by protoc-gen-go. DO NOT EDIT.
 | 
				
			||||||
// versions:
 | 
					// versions:
 | 
				
			||||||
// 	protoc-gen-go v1.21.0
 | 
					// 	protoc-gen-go v1.26.0
 | 
				
			||||||
// 	protoc        v3.11.4
 | 
					// 	protoc        v3.15.6
 | 
				
			||||||
// source: va/proto/va.proto
 | 
					// source: va.proto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package proto
 | 
					package proto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	context "context"
 | 
						proto "github.com/letsencrypt/boulder/core/proto"
 | 
				
			||||||
	proto "github.com/golang/protobuf/proto"
 | 
					 | 
				
			||||||
	proto1 "github.com/letsencrypt/boulder/core/proto"
 | 
					 | 
				
			||||||
	grpc "google.golang.org/grpc"
 | 
					 | 
				
			||||||
	codes "google.golang.org/grpc/codes"
 | 
					 | 
				
			||||||
	status "google.golang.org/grpc/status"
 | 
					 | 
				
			||||||
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 | 
						protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 | 
				
			||||||
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 | 
						protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 | 
				
			||||||
	reflect "reflect"
 | 
						reflect "reflect"
 | 
				
			||||||
| 
						 | 
					@ -26,10 +21,6 @@ const (
 | 
				
			||||||
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
 | 
						_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// This is a compile-time assertion that a sufficiently up-to-date version
 | 
					 | 
				
			||||||
// of the legacy proto package is being used.
 | 
					 | 
				
			||||||
const _ = proto.ProtoPackageIsVersion4
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type IsCAAValidRequest struct {
 | 
					type IsCAAValidRequest struct {
 | 
				
			||||||
	state         protoimpl.MessageState
 | 
						state         protoimpl.MessageState
 | 
				
			||||||
	sizeCache     protoimpl.SizeCache
 | 
						sizeCache     protoimpl.SizeCache
 | 
				
			||||||
| 
						 | 
					@ -44,7 +35,7 @@ type IsCAAValidRequest struct {
 | 
				
			||||||
func (x *IsCAAValidRequest) Reset() {
 | 
					func (x *IsCAAValidRequest) Reset() {
 | 
				
			||||||
	*x = IsCAAValidRequest{}
 | 
						*x = IsCAAValidRequest{}
 | 
				
			||||||
	if protoimpl.UnsafeEnabled {
 | 
						if protoimpl.UnsafeEnabled {
 | 
				
			||||||
		mi := &file_va_proto_va_proto_msgTypes[0]
 | 
							mi := &file_va_proto_msgTypes[0]
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		ms.StoreMessageInfo(mi)
 | 
							ms.StoreMessageInfo(mi)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -57,7 +48,7 @@ func (x *IsCAAValidRequest) String() string {
 | 
				
			||||||
func (*IsCAAValidRequest) ProtoMessage() {}
 | 
					func (*IsCAAValidRequest) ProtoMessage() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *IsCAAValidRequest) ProtoReflect() protoreflect.Message {
 | 
					func (x *IsCAAValidRequest) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
	mi := &file_va_proto_va_proto_msgTypes[0]
 | 
						mi := &file_va_proto_msgTypes[0]
 | 
				
			||||||
	if protoimpl.UnsafeEnabled && x != nil {
 | 
						if protoimpl.UnsafeEnabled && x != nil {
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		if ms.LoadMessageInfo() == nil {
 | 
							if ms.LoadMessageInfo() == nil {
 | 
				
			||||||
| 
						 | 
					@ -70,7 +61,7 @@ func (x *IsCAAValidRequest) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Deprecated: Use IsCAAValidRequest.ProtoReflect.Descriptor instead.
 | 
					// Deprecated: Use IsCAAValidRequest.ProtoReflect.Descriptor instead.
 | 
				
			||||||
func (*IsCAAValidRequest) Descriptor() ([]byte, []int) {
 | 
					func (*IsCAAValidRequest) Descriptor() ([]byte, []int) {
 | 
				
			||||||
	return file_va_proto_va_proto_rawDescGZIP(), []int{0}
 | 
						return file_va_proto_rawDescGZIP(), []int{0}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *IsCAAValidRequest) GetDomain() string {
 | 
					func (x *IsCAAValidRequest) GetDomain() string {
 | 
				
			||||||
| 
						 | 
					@ -100,13 +91,13 @@ type IsCAAValidResponse struct {
 | 
				
			||||||
	sizeCache     protoimpl.SizeCache
 | 
						sizeCache     protoimpl.SizeCache
 | 
				
			||||||
	unknownFields protoimpl.UnknownFields
 | 
						unknownFields protoimpl.UnknownFields
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Problem *proto1.ProblemDetails `protobuf:"bytes,1,opt,name=problem,proto3" json:"problem,omitempty"`
 | 
						Problem *proto.ProblemDetails `protobuf:"bytes,1,opt,name=problem,proto3" json:"problem,omitempty"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *IsCAAValidResponse) Reset() {
 | 
					func (x *IsCAAValidResponse) Reset() {
 | 
				
			||||||
	*x = IsCAAValidResponse{}
 | 
						*x = IsCAAValidResponse{}
 | 
				
			||||||
	if protoimpl.UnsafeEnabled {
 | 
						if protoimpl.UnsafeEnabled {
 | 
				
			||||||
		mi := &file_va_proto_va_proto_msgTypes[1]
 | 
							mi := &file_va_proto_msgTypes[1]
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		ms.StoreMessageInfo(mi)
 | 
							ms.StoreMessageInfo(mi)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -119,7 +110,7 @@ func (x *IsCAAValidResponse) String() string {
 | 
				
			||||||
func (*IsCAAValidResponse) ProtoMessage() {}
 | 
					func (*IsCAAValidResponse) ProtoMessage() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *IsCAAValidResponse) ProtoReflect() protoreflect.Message {
 | 
					func (x *IsCAAValidResponse) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
	mi := &file_va_proto_va_proto_msgTypes[1]
 | 
						mi := &file_va_proto_msgTypes[1]
 | 
				
			||||||
	if protoimpl.UnsafeEnabled && x != nil {
 | 
						if protoimpl.UnsafeEnabled && x != nil {
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		if ms.LoadMessageInfo() == nil {
 | 
							if ms.LoadMessageInfo() == nil {
 | 
				
			||||||
| 
						 | 
					@ -132,10 +123,10 @@ func (x *IsCAAValidResponse) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Deprecated: Use IsCAAValidResponse.ProtoReflect.Descriptor instead.
 | 
					// Deprecated: Use IsCAAValidResponse.ProtoReflect.Descriptor instead.
 | 
				
			||||||
func (*IsCAAValidResponse) Descriptor() ([]byte, []int) {
 | 
					func (*IsCAAValidResponse) Descriptor() ([]byte, []int) {
 | 
				
			||||||
	return file_va_proto_va_proto_rawDescGZIP(), []int{1}
 | 
						return file_va_proto_rawDescGZIP(), []int{1}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *IsCAAValidResponse) GetProblem() *proto1.ProblemDetails {
 | 
					func (x *IsCAAValidResponse) GetProblem() *proto.ProblemDetails {
 | 
				
			||||||
	if x != nil {
 | 
						if x != nil {
 | 
				
			||||||
		return x.Problem
 | 
							return x.Problem
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -147,15 +138,15 @@ type PerformValidationRequest struct {
 | 
				
			||||||
	sizeCache     protoimpl.SizeCache
 | 
						sizeCache     protoimpl.SizeCache
 | 
				
			||||||
	unknownFields protoimpl.UnknownFields
 | 
						unknownFields protoimpl.UnknownFields
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Domain    string            `protobuf:"bytes,1,opt,name=domain,proto3" json:"domain,omitempty"`
 | 
						Domain    string           `protobuf:"bytes,1,opt,name=domain,proto3" json:"domain,omitempty"`
 | 
				
			||||||
	Challenge *proto1.Challenge `protobuf:"bytes,2,opt,name=challenge,proto3" json:"challenge,omitempty"`
 | 
						Challenge *proto.Challenge `protobuf:"bytes,2,opt,name=challenge,proto3" json:"challenge,omitempty"`
 | 
				
			||||||
	Authz     *AuthzMeta        `protobuf:"bytes,3,opt,name=authz,proto3" json:"authz,omitempty"`
 | 
						Authz     *AuthzMeta       `protobuf:"bytes,3,opt,name=authz,proto3" json:"authz,omitempty"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *PerformValidationRequest) Reset() {
 | 
					func (x *PerformValidationRequest) Reset() {
 | 
				
			||||||
	*x = PerformValidationRequest{}
 | 
						*x = PerformValidationRequest{}
 | 
				
			||||||
	if protoimpl.UnsafeEnabled {
 | 
						if protoimpl.UnsafeEnabled {
 | 
				
			||||||
		mi := &file_va_proto_va_proto_msgTypes[2]
 | 
							mi := &file_va_proto_msgTypes[2]
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		ms.StoreMessageInfo(mi)
 | 
							ms.StoreMessageInfo(mi)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -168,7 +159,7 @@ func (x *PerformValidationRequest) String() string {
 | 
				
			||||||
func (*PerformValidationRequest) ProtoMessage() {}
 | 
					func (*PerformValidationRequest) ProtoMessage() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *PerformValidationRequest) ProtoReflect() protoreflect.Message {
 | 
					func (x *PerformValidationRequest) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
	mi := &file_va_proto_va_proto_msgTypes[2]
 | 
						mi := &file_va_proto_msgTypes[2]
 | 
				
			||||||
	if protoimpl.UnsafeEnabled && x != nil {
 | 
						if protoimpl.UnsafeEnabled && x != nil {
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		if ms.LoadMessageInfo() == nil {
 | 
							if ms.LoadMessageInfo() == nil {
 | 
				
			||||||
| 
						 | 
					@ -181,7 +172,7 @@ func (x *PerformValidationRequest) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Deprecated: Use PerformValidationRequest.ProtoReflect.Descriptor instead.
 | 
					// Deprecated: Use PerformValidationRequest.ProtoReflect.Descriptor instead.
 | 
				
			||||||
func (*PerformValidationRequest) Descriptor() ([]byte, []int) {
 | 
					func (*PerformValidationRequest) Descriptor() ([]byte, []int) {
 | 
				
			||||||
	return file_va_proto_va_proto_rawDescGZIP(), []int{2}
 | 
						return file_va_proto_rawDescGZIP(), []int{2}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *PerformValidationRequest) GetDomain() string {
 | 
					func (x *PerformValidationRequest) GetDomain() string {
 | 
				
			||||||
| 
						 | 
					@ -191,7 +182,7 @@ func (x *PerformValidationRequest) GetDomain() string {
 | 
				
			||||||
	return ""
 | 
						return ""
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *PerformValidationRequest) GetChallenge() *proto1.Challenge {
 | 
					func (x *PerformValidationRequest) GetChallenge() *proto.Challenge {
 | 
				
			||||||
	if x != nil {
 | 
						if x != nil {
 | 
				
			||||||
		return x.Challenge
 | 
							return x.Challenge
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -217,7 +208,7 @@ type AuthzMeta struct {
 | 
				
			||||||
func (x *AuthzMeta) Reset() {
 | 
					func (x *AuthzMeta) Reset() {
 | 
				
			||||||
	*x = AuthzMeta{}
 | 
						*x = AuthzMeta{}
 | 
				
			||||||
	if protoimpl.UnsafeEnabled {
 | 
						if protoimpl.UnsafeEnabled {
 | 
				
			||||||
		mi := &file_va_proto_va_proto_msgTypes[3]
 | 
							mi := &file_va_proto_msgTypes[3]
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		ms.StoreMessageInfo(mi)
 | 
							ms.StoreMessageInfo(mi)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -230,7 +221,7 @@ func (x *AuthzMeta) String() string {
 | 
				
			||||||
func (*AuthzMeta) ProtoMessage() {}
 | 
					func (*AuthzMeta) ProtoMessage() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *AuthzMeta) ProtoReflect() protoreflect.Message {
 | 
					func (x *AuthzMeta) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
	mi := &file_va_proto_va_proto_msgTypes[3]
 | 
						mi := &file_va_proto_msgTypes[3]
 | 
				
			||||||
	if protoimpl.UnsafeEnabled && x != nil {
 | 
						if protoimpl.UnsafeEnabled && x != nil {
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		if ms.LoadMessageInfo() == nil {
 | 
							if ms.LoadMessageInfo() == nil {
 | 
				
			||||||
| 
						 | 
					@ -243,7 +234,7 @@ func (x *AuthzMeta) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Deprecated: Use AuthzMeta.ProtoReflect.Descriptor instead.
 | 
					// Deprecated: Use AuthzMeta.ProtoReflect.Descriptor instead.
 | 
				
			||||||
func (*AuthzMeta) Descriptor() ([]byte, []int) {
 | 
					func (*AuthzMeta) Descriptor() ([]byte, []int) {
 | 
				
			||||||
	return file_va_proto_va_proto_rawDescGZIP(), []int{3}
 | 
						return file_va_proto_rawDescGZIP(), []int{3}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *AuthzMeta) GetId() string {
 | 
					func (x *AuthzMeta) GetId() string {
 | 
				
			||||||
| 
						 | 
					@ -265,14 +256,14 @@ type ValidationResult struct {
 | 
				
			||||||
	sizeCache     protoimpl.SizeCache
 | 
						sizeCache     protoimpl.SizeCache
 | 
				
			||||||
	unknownFields protoimpl.UnknownFields
 | 
						unknownFields protoimpl.UnknownFields
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Records  []*proto1.ValidationRecord `protobuf:"bytes,1,rep,name=records,proto3" json:"records,omitempty"`
 | 
						Records  []*proto.ValidationRecord `protobuf:"bytes,1,rep,name=records,proto3" json:"records,omitempty"`
 | 
				
			||||||
	Problems *proto1.ProblemDetails     `protobuf:"bytes,2,opt,name=problems,proto3" json:"problems,omitempty"`
 | 
						Problems *proto.ProblemDetails     `protobuf:"bytes,2,opt,name=problems,proto3" json:"problems,omitempty"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *ValidationResult) Reset() {
 | 
					func (x *ValidationResult) Reset() {
 | 
				
			||||||
	*x = ValidationResult{}
 | 
						*x = ValidationResult{}
 | 
				
			||||||
	if protoimpl.UnsafeEnabled {
 | 
						if protoimpl.UnsafeEnabled {
 | 
				
			||||||
		mi := &file_va_proto_va_proto_msgTypes[4]
 | 
							mi := &file_va_proto_msgTypes[4]
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		ms.StoreMessageInfo(mi)
 | 
							ms.StoreMessageInfo(mi)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -285,7 +276,7 @@ func (x *ValidationResult) String() string {
 | 
				
			||||||
func (*ValidationResult) ProtoMessage() {}
 | 
					func (*ValidationResult) ProtoMessage() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *ValidationResult) ProtoReflect() protoreflect.Message {
 | 
					func (x *ValidationResult) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
	mi := &file_va_proto_va_proto_msgTypes[4]
 | 
						mi := &file_va_proto_msgTypes[4]
 | 
				
			||||||
	if protoimpl.UnsafeEnabled && x != nil {
 | 
						if protoimpl.UnsafeEnabled && x != nil {
 | 
				
			||||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
		if ms.LoadMessageInfo() == nil {
 | 
							if ms.LoadMessageInfo() == nil {
 | 
				
			||||||
| 
						 | 
					@ -298,99 +289,99 @@ func (x *ValidationResult) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Deprecated: Use ValidationResult.ProtoReflect.Descriptor instead.
 | 
					// Deprecated: Use ValidationResult.ProtoReflect.Descriptor instead.
 | 
				
			||||||
func (*ValidationResult) Descriptor() ([]byte, []int) {
 | 
					func (*ValidationResult) Descriptor() ([]byte, []int) {
 | 
				
			||||||
	return file_va_proto_va_proto_rawDescGZIP(), []int{4}
 | 
						return file_va_proto_rawDescGZIP(), []int{4}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *ValidationResult) GetRecords() []*proto1.ValidationRecord {
 | 
					func (x *ValidationResult) GetRecords() []*proto.ValidationRecord {
 | 
				
			||||||
	if x != nil {
 | 
						if x != nil {
 | 
				
			||||||
		return x.Records
 | 
							return x.Records
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *ValidationResult) GetProblems() *proto1.ProblemDetails {
 | 
					func (x *ValidationResult) GetProblems() *proto.ProblemDetails {
 | 
				
			||||||
	if x != nil {
 | 
						if x != nil {
 | 
				
			||||||
		return x.Problems
 | 
							return x.Problems
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var File_va_proto_va_proto protoreflect.FileDescriptor
 | 
					var File_va_proto protoreflect.FileDescriptor
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var file_va_proto_va_proto_rawDesc = []byte{
 | 
					var file_va_proto_rawDesc = []byte{
 | 
				
			||||||
	0x0a, 0x11, 0x76, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x61, 0x2e, 0x70, 0x72,
 | 
						0x0a, 0x08, 0x76, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x02, 0x76, 0x61, 0x1a, 0x15,
 | 
				
			||||||
	0x6f, 0x74, 0x6f, 0x12, 0x02, 0x76, 0x61, 0x1a, 0x15, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72,
 | 
						0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2e,
 | 
				
			||||||
	0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x7b,
 | 
						0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x7b, 0x0a, 0x11, 0x49, 0x73, 0x43, 0x41, 0x41, 0x56, 0x61,
 | 
				
			||||||
	0x0a, 0x11, 0x49, 0x73, 0x43, 0x41, 0x41, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x52, 0x65, 0x71, 0x75,
 | 
						0x6c, 0x69, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x6f,
 | 
				
			||||||
	0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20,
 | 
						0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61,
 | 
				
			||||||
	0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x2a, 0x0a, 0x10, 0x76,
 | 
						0x69, 0x6e, 0x12, 0x2a, 0x0a, 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e,
 | 
				
			||||||
	0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18,
 | 
						0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x76, 0x61,
 | 
				
			||||||
	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f,
 | 
						0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x22,
 | 
				
			||||||
	0x6e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x6f, 0x75,
 | 
						0x0a, 0x0c, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x52, 0x49, 0x49, 0x44, 0x18, 0x03,
 | 
				
			||||||
	0x6e, 0x74, 0x55, 0x52, 0x49, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x61,
 | 
						0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x52, 0x49,
 | 
				
			||||||
	0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x52, 0x49, 0x49, 0x44, 0x22, 0x44, 0x0a, 0x12, 0x49,
 | 
						0x49, 0x44, 0x22, 0x44, 0x0a, 0x12, 0x49, 0x73, 0x43, 0x41, 0x41, 0x56, 0x61, 0x6c, 0x69, 0x64,
 | 
				
			||||||
 | 
						0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x62,
 | 
				
			||||||
 | 
						0x6c, 0x65, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6f, 0x72, 0x65,
 | 
				
			||||||
 | 
						0x2e, 0x50, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52,
 | 
				
			||||||
 | 
						0x07, 0x70, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x22, 0x86, 0x01, 0x0a, 0x18, 0x50, 0x65, 0x72,
 | 
				
			||||||
 | 
						0x66, 0x6f, 0x72, 0x6d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65,
 | 
				
			||||||
 | 
						0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18,
 | 
				
			||||||
 | 
						0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x2d, 0x0a,
 | 
				
			||||||
 | 
						0x09, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,
 | 
				
			||||||
 | 
						0x32, 0x0f, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67,
 | 
				
			||||||
 | 
						0x65, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x05,
 | 
				
			||||||
 | 
						0x61, 0x75, 0x74, 0x68, 0x7a, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x76, 0x61,
 | 
				
			||||||
 | 
						0x2e, 0x41, 0x75, 0x74, 0x68, 0x7a, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x05, 0x61, 0x75, 0x74, 0x68,
 | 
				
			||||||
 | 
						0x7a, 0x22, 0x31, 0x0a, 0x09, 0x41, 0x75, 0x74, 0x68, 0x7a, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x0e,
 | 
				
			||||||
 | 
						0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14,
 | 
				
			||||||
 | 
						0x0a, 0x05, 0x72, 0x65, 0x67, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x72,
 | 
				
			||||||
 | 
						0x65, 0x67, 0x49, 0x44, 0x22, 0x76, 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69,
 | 
				
			||||||
 | 
						0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x30, 0x0a, 0x07, 0x72, 0x65, 0x63, 0x6f,
 | 
				
			||||||
 | 
						0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6f, 0x72, 0x65,
 | 
				
			||||||
 | 
						0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72,
 | 
				
			||||||
 | 
						0x64, 0x52, 0x07, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x12, 0x30, 0x0a, 0x08, 0x70, 0x72,
 | 
				
			||||||
 | 
						0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63,
 | 
				
			||||||
 | 
						0x6f, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x44, 0x65, 0x74, 0x61, 0x69,
 | 
				
			||||||
 | 
						0x6c, 0x73, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x73, 0x32, 0x4f, 0x0a, 0x02,
 | 
				
			||||||
 | 
						0x56, 0x41, 0x12, 0x49, 0x0a, 0x11, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x56, 0x61, 0x6c,
 | 
				
			||||||
 | 
						0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x2e, 0x76, 0x61, 0x2e, 0x50, 0x65, 0x72,
 | 
				
			||||||
 | 
						0x66, 0x6f, 0x72, 0x6d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65,
 | 
				
			||||||
 | 
						0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x76, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64,
 | 
				
			||||||
 | 
						0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x32, 0x44, 0x0a,
 | 
				
			||||||
 | 
						0x03, 0x43, 0x41, 0x41, 0x12, 0x3d, 0x0a, 0x0a, 0x49, 0x73, 0x43, 0x41, 0x41, 0x56, 0x61, 0x6c,
 | 
				
			||||||
 | 
						0x69, 0x64, 0x12, 0x15, 0x2e, 0x76, 0x61, 0x2e, 0x49, 0x73, 0x43, 0x41, 0x41, 0x56, 0x61, 0x6c,
 | 
				
			||||||
 | 
						0x69, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x76, 0x61, 0x2e, 0x49,
 | 
				
			||||||
	0x73, 0x43, 0x41, 0x41, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
 | 
						0x73, 0x43, 0x41, 0x41, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
 | 
				
			||||||
	0x65, 0x12, 0x2e, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x18, 0x01, 0x20, 0x01,
 | 
						0x65, 0x22, 0x00, 0x42, 0x29, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f,
 | 
				
			||||||
	0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x62, 0x6c, 0x65,
 | 
						0x6d, 0x2f, 0x6c, 0x65, 0x74, 0x73, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x2f, 0x62, 0x6f,
 | 
				
			||||||
	0x6d, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x62, 0x6c, 0x65,
 | 
						0x75, 0x6c, 0x64, 0x65, 0x72, 0x2f, 0x76, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06,
 | 
				
			||||||
	0x6d, 0x22, 0x86, 0x01, 0x0a, 0x18, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x56, 0x61, 0x6c,
 | 
						0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 | 
				
			||||||
	0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16,
 | 
					 | 
				
			||||||
	0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
 | 
					 | 
				
			||||||
	0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x2d, 0x0a, 0x09, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65,
 | 
					 | 
				
			||||||
	0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x63, 0x6f, 0x72, 0x65,
 | 
					 | 
				
			||||||
	0x2e, 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6c,
 | 
					 | 
				
			||||||
	0x6c, 0x65, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x05, 0x61, 0x75, 0x74, 0x68, 0x7a, 0x18, 0x03,
 | 
					 | 
				
			||||||
	0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x76, 0x61, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x7a, 0x4d,
 | 
					 | 
				
			||||||
	0x65, 0x74, 0x61, 0x52, 0x05, 0x61, 0x75, 0x74, 0x68, 0x7a, 0x22, 0x31, 0x0a, 0x09, 0x41, 0x75,
 | 
					 | 
				
			||||||
	0x74, 0x68, 0x7a, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,
 | 
					 | 
				
			||||||
	0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x67, 0x49, 0x44,
 | 
					 | 
				
			||||||
	0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x72, 0x65, 0x67, 0x49, 0x44, 0x22, 0x76, 0x0a,
 | 
					 | 
				
			||||||
	0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c,
 | 
					 | 
				
			||||||
	0x74, 0x12, 0x30, 0x0a, 0x07, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03,
 | 
					 | 
				
			||||||
	0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61,
 | 
					 | 
				
			||||||
	0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x07, 0x72, 0x65, 0x63, 0x6f,
 | 
					 | 
				
			||||||
	0x72, 0x64, 0x73, 0x12, 0x30, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x73, 0x18,
 | 
					 | 
				
			||||||
	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x6f,
 | 
					 | 
				
			||||||
	0x62, 0x6c, 0x65, 0x6d, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x08, 0x70, 0x72, 0x6f,
 | 
					 | 
				
			||||||
	0x62, 0x6c, 0x65, 0x6d, 0x73, 0x32, 0x4f, 0x0a, 0x02, 0x56, 0x41, 0x12, 0x49, 0x0a, 0x11, 0x50,
 | 
					 | 
				
			||||||
	0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e,
 | 
					 | 
				
			||||||
	0x12, 0x1c, 0x2e, 0x76, 0x61, 0x2e, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x56, 0x61, 0x6c,
 | 
					 | 
				
			||||||
	0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14,
 | 
					 | 
				
			||||||
	0x2e, 0x76, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65,
 | 
					 | 
				
			||||||
	0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x32, 0x44, 0x0a, 0x03, 0x43, 0x41, 0x41, 0x12, 0x3d, 0x0a,
 | 
					 | 
				
			||||||
	0x0a, 0x49, 0x73, 0x43, 0x41, 0x41, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x15, 0x2e, 0x76, 0x61,
 | 
					 | 
				
			||||||
	0x2e, 0x49, 0x73, 0x43, 0x41, 0x41, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65,
 | 
					 | 
				
			||||||
	0x73, 0x74, 0x1a, 0x16, 0x2e, 0x76, 0x61, 0x2e, 0x49, 0x73, 0x43, 0x41, 0x41, 0x56, 0x61, 0x6c,
 | 
					 | 
				
			||||||
	0x69, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x29, 0x5a, 0x27,
 | 
					 | 
				
			||||||
	0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x65, 0x74, 0x73, 0x65,
 | 
					 | 
				
			||||||
	0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x2f, 0x62, 0x6f, 0x75, 0x6c, 0x64, 0x65, 0x72, 0x2f, 0x76,
 | 
					 | 
				
			||||||
	0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
	file_va_proto_va_proto_rawDescOnce sync.Once
 | 
						file_va_proto_rawDescOnce sync.Once
 | 
				
			||||||
	file_va_proto_va_proto_rawDescData = file_va_proto_va_proto_rawDesc
 | 
						file_va_proto_rawDescData = file_va_proto_rawDesc
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func file_va_proto_va_proto_rawDescGZIP() []byte {
 | 
					func file_va_proto_rawDescGZIP() []byte {
 | 
				
			||||||
	file_va_proto_va_proto_rawDescOnce.Do(func() {
 | 
						file_va_proto_rawDescOnce.Do(func() {
 | 
				
			||||||
		file_va_proto_va_proto_rawDescData = protoimpl.X.CompressGZIP(file_va_proto_va_proto_rawDescData)
 | 
							file_va_proto_rawDescData = protoimpl.X.CompressGZIP(file_va_proto_rawDescData)
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	return file_va_proto_va_proto_rawDescData
 | 
						return file_va_proto_rawDescData
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var file_va_proto_va_proto_msgTypes = make([]protoimpl.MessageInfo, 5)
 | 
					var file_va_proto_msgTypes = make([]protoimpl.MessageInfo, 5)
 | 
				
			||||||
var file_va_proto_va_proto_goTypes = []interface{}{
 | 
					var file_va_proto_goTypes = []interface{}{
 | 
				
			||||||
	(*IsCAAValidRequest)(nil),        // 0: va.IsCAAValidRequest
 | 
						(*IsCAAValidRequest)(nil),        // 0: va.IsCAAValidRequest
 | 
				
			||||||
	(*IsCAAValidResponse)(nil),       // 1: va.IsCAAValidResponse
 | 
						(*IsCAAValidResponse)(nil),       // 1: va.IsCAAValidResponse
 | 
				
			||||||
	(*PerformValidationRequest)(nil), // 2: va.PerformValidationRequest
 | 
						(*PerformValidationRequest)(nil), // 2: va.PerformValidationRequest
 | 
				
			||||||
	(*AuthzMeta)(nil),                // 3: va.AuthzMeta
 | 
						(*AuthzMeta)(nil),                // 3: va.AuthzMeta
 | 
				
			||||||
	(*ValidationResult)(nil),         // 4: va.ValidationResult
 | 
						(*ValidationResult)(nil),         // 4: va.ValidationResult
 | 
				
			||||||
	(*proto1.ProblemDetails)(nil),    // 5: core.ProblemDetails
 | 
						(*proto.ProblemDetails)(nil),     // 5: core.ProblemDetails
 | 
				
			||||||
	(*proto1.Challenge)(nil),         // 6: core.Challenge
 | 
						(*proto.Challenge)(nil),          // 6: core.Challenge
 | 
				
			||||||
	(*proto1.ValidationRecord)(nil),  // 7: core.ValidationRecord
 | 
						(*proto.ValidationRecord)(nil),   // 7: core.ValidationRecord
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
var file_va_proto_va_proto_depIdxs = []int32{
 | 
					var file_va_proto_depIdxs = []int32{
 | 
				
			||||||
	5, // 0: va.IsCAAValidResponse.problem:type_name -> core.ProblemDetails
 | 
						5, // 0: va.IsCAAValidResponse.problem:type_name -> core.ProblemDetails
 | 
				
			||||||
	6, // 1: va.PerformValidationRequest.challenge:type_name -> core.Challenge
 | 
						6, // 1: va.PerformValidationRequest.challenge:type_name -> core.Challenge
 | 
				
			||||||
	3, // 2: va.PerformValidationRequest.authz:type_name -> va.AuthzMeta
 | 
						3, // 2: va.PerformValidationRequest.authz:type_name -> va.AuthzMeta
 | 
				
			||||||
| 
						 | 
					@ -407,13 +398,13 @@ var file_va_proto_va_proto_depIdxs = []int32{
 | 
				
			||||||
	0, // [0:5] is the sub-list for field type_name
 | 
						0, // [0:5] is the sub-list for field type_name
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func init() { file_va_proto_va_proto_init() }
 | 
					func init() { file_va_proto_init() }
 | 
				
			||||||
func file_va_proto_va_proto_init() {
 | 
					func file_va_proto_init() {
 | 
				
			||||||
	if File_va_proto_va_proto != nil {
 | 
						if File_va_proto != nil {
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if !protoimpl.UnsafeEnabled {
 | 
						if !protoimpl.UnsafeEnabled {
 | 
				
			||||||
		file_va_proto_va_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 | 
							file_va_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 | 
				
			||||||
			switch v := v.(*IsCAAValidRequest); i {
 | 
								switch v := v.(*IsCAAValidRequest); i {
 | 
				
			||||||
			case 0:
 | 
								case 0:
 | 
				
			||||||
				return &v.state
 | 
									return &v.state
 | 
				
			||||||
| 
						 | 
					@ -425,7 +416,7 @@ func file_va_proto_va_proto_init() {
 | 
				
			||||||
				return nil
 | 
									return nil
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		file_va_proto_va_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 | 
							file_va_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 | 
				
			||||||
			switch v := v.(*IsCAAValidResponse); i {
 | 
								switch v := v.(*IsCAAValidResponse); i {
 | 
				
			||||||
			case 0:
 | 
								case 0:
 | 
				
			||||||
				return &v.state
 | 
									return &v.state
 | 
				
			||||||
| 
						 | 
					@ -437,7 +428,7 @@ func file_va_proto_va_proto_init() {
 | 
				
			||||||
				return nil
 | 
									return nil
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		file_va_proto_va_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
 | 
							file_va_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
 | 
				
			||||||
			switch v := v.(*PerformValidationRequest); i {
 | 
								switch v := v.(*PerformValidationRequest); i {
 | 
				
			||||||
			case 0:
 | 
								case 0:
 | 
				
			||||||
				return &v.state
 | 
									return &v.state
 | 
				
			||||||
| 
						 | 
					@ -449,7 +440,7 @@ func file_va_proto_va_proto_init() {
 | 
				
			||||||
				return nil
 | 
									return nil
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		file_va_proto_va_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
 | 
							file_va_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
 | 
				
			||||||
			switch v := v.(*AuthzMeta); i {
 | 
								switch v := v.(*AuthzMeta); i {
 | 
				
			||||||
			case 0:
 | 
								case 0:
 | 
				
			||||||
				return &v.state
 | 
									return &v.state
 | 
				
			||||||
| 
						 | 
					@ -461,7 +452,7 @@ func file_va_proto_va_proto_init() {
 | 
				
			||||||
				return nil
 | 
									return nil
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		file_va_proto_va_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
 | 
							file_va_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
 | 
				
			||||||
			switch v := v.(*ValidationResult); i {
 | 
								switch v := v.(*ValidationResult); i {
 | 
				
			||||||
			case 0:
 | 
								case 0:
 | 
				
			||||||
				return &v.state
 | 
									return &v.state
 | 
				
			||||||
| 
						 | 
					@ -478,170 +469,18 @@ func file_va_proto_va_proto_init() {
 | 
				
			||||||
	out := protoimpl.TypeBuilder{
 | 
						out := protoimpl.TypeBuilder{
 | 
				
			||||||
		File: protoimpl.DescBuilder{
 | 
							File: protoimpl.DescBuilder{
 | 
				
			||||||
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 | 
								GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 | 
				
			||||||
			RawDescriptor: file_va_proto_va_proto_rawDesc,
 | 
								RawDescriptor: file_va_proto_rawDesc,
 | 
				
			||||||
			NumEnums:      0,
 | 
								NumEnums:      0,
 | 
				
			||||||
			NumMessages:   5,
 | 
								NumMessages:   5,
 | 
				
			||||||
			NumExtensions: 0,
 | 
								NumExtensions: 0,
 | 
				
			||||||
			NumServices:   2,
 | 
								NumServices:   2,
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		GoTypes:           file_va_proto_va_proto_goTypes,
 | 
							GoTypes:           file_va_proto_goTypes,
 | 
				
			||||||
		DependencyIndexes: file_va_proto_va_proto_depIdxs,
 | 
							DependencyIndexes: file_va_proto_depIdxs,
 | 
				
			||||||
		MessageInfos:      file_va_proto_va_proto_msgTypes,
 | 
							MessageInfos:      file_va_proto_msgTypes,
 | 
				
			||||||
	}.Build()
 | 
						}.Build()
 | 
				
			||||||
	File_va_proto_va_proto = out.File
 | 
						File_va_proto = out.File
 | 
				
			||||||
	file_va_proto_va_proto_rawDesc = nil
 | 
						file_va_proto_rawDesc = nil
 | 
				
			||||||
	file_va_proto_va_proto_goTypes = nil
 | 
						file_va_proto_goTypes = nil
 | 
				
			||||||
	file_va_proto_va_proto_depIdxs = nil
 | 
						file_va_proto_depIdxs = nil
 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Reference imports to suppress errors if they are not otherwise used.
 | 
					 | 
				
			||||||
var _ context.Context
 | 
					 | 
				
			||||||
var _ grpc.ClientConnInterface
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// This is a compile-time assertion to ensure that this generated file
 | 
					 | 
				
			||||||
// is compatible with the grpc package it is being compiled against.
 | 
					 | 
				
			||||||
const _ = grpc.SupportPackageIsVersion6
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// VAClient is the client API for VA service.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
 | 
					 | 
				
			||||||
type VAClient interface {
 | 
					 | 
				
			||||||
	PerformValidation(ctx context.Context, in *PerformValidationRequest, opts ...grpc.CallOption) (*ValidationResult, error)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type vAClient struct {
 | 
					 | 
				
			||||||
	cc grpc.ClientConnInterface
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func NewVAClient(cc grpc.ClientConnInterface) VAClient {
 | 
					 | 
				
			||||||
	return &vAClient{cc}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (c *vAClient) PerformValidation(ctx context.Context, in *PerformValidationRequest, opts ...grpc.CallOption) (*ValidationResult, error) {
 | 
					 | 
				
			||||||
	out := new(ValidationResult)
 | 
					 | 
				
			||||||
	err := c.cc.Invoke(ctx, "/va.VA/PerformValidation", in, out, opts...)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return out, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// VAServer is the server API for VA service.
 | 
					 | 
				
			||||||
type VAServer interface {
 | 
					 | 
				
			||||||
	PerformValidation(context.Context, *PerformValidationRequest) (*ValidationResult, error)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// UnimplementedVAServer can be embedded to have forward compatible implementations.
 | 
					 | 
				
			||||||
type UnimplementedVAServer struct {
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (*UnimplementedVAServer) PerformValidation(context.Context, *PerformValidationRequest) (*ValidationResult, error) {
 | 
					 | 
				
			||||||
	return nil, status.Errorf(codes.Unimplemented, "method PerformValidation not implemented")
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func RegisterVAServer(s *grpc.Server, srv VAServer) {
 | 
					 | 
				
			||||||
	s.RegisterService(&_VA_serviceDesc, srv)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func _VA_PerformValidation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
					 | 
				
			||||||
	in := new(PerformValidationRequest)
 | 
					 | 
				
			||||||
	if err := dec(in); err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if interceptor == nil {
 | 
					 | 
				
			||||||
		return srv.(VAServer).PerformValidation(ctx, in)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	info := &grpc.UnaryServerInfo{
 | 
					 | 
				
			||||||
		Server:     srv,
 | 
					 | 
				
			||||||
		FullMethod: "/va.VA/PerformValidation",
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 | 
					 | 
				
			||||||
		return srv.(VAServer).PerformValidation(ctx, req.(*PerformValidationRequest))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return interceptor(ctx, in, info, handler)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var _VA_serviceDesc = grpc.ServiceDesc{
 | 
					 | 
				
			||||||
	ServiceName: "va.VA",
 | 
					 | 
				
			||||||
	HandlerType: (*VAServer)(nil),
 | 
					 | 
				
			||||||
	Methods: []grpc.MethodDesc{
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			MethodName: "PerformValidation",
 | 
					 | 
				
			||||||
			Handler:    _VA_PerformValidation_Handler,
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
	Streams:  []grpc.StreamDesc{},
 | 
					 | 
				
			||||||
	Metadata: "va/proto/va.proto",
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// CAAClient is the client API for CAA service.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
 | 
					 | 
				
			||||||
type CAAClient interface {
 | 
					 | 
				
			||||||
	IsCAAValid(ctx context.Context, in *IsCAAValidRequest, opts ...grpc.CallOption) (*IsCAAValidResponse, error)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type cAAClient struct {
 | 
					 | 
				
			||||||
	cc grpc.ClientConnInterface
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func NewCAAClient(cc grpc.ClientConnInterface) CAAClient {
 | 
					 | 
				
			||||||
	return &cAAClient{cc}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (c *cAAClient) IsCAAValid(ctx context.Context, in *IsCAAValidRequest, opts ...grpc.CallOption) (*IsCAAValidResponse, error) {
 | 
					 | 
				
			||||||
	out := new(IsCAAValidResponse)
 | 
					 | 
				
			||||||
	err := c.cc.Invoke(ctx, "/va.CAA/IsCAAValid", in, out, opts...)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return out, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// CAAServer is the server API for CAA service.
 | 
					 | 
				
			||||||
type CAAServer interface {
 | 
					 | 
				
			||||||
	IsCAAValid(context.Context, *IsCAAValidRequest) (*IsCAAValidResponse, error)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// UnimplementedCAAServer can be embedded to have forward compatible implementations.
 | 
					 | 
				
			||||||
type UnimplementedCAAServer struct {
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (*UnimplementedCAAServer) IsCAAValid(context.Context, *IsCAAValidRequest) (*IsCAAValidResponse, error) {
 | 
					 | 
				
			||||||
	return nil, status.Errorf(codes.Unimplemented, "method IsCAAValid not implemented")
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func RegisterCAAServer(s *grpc.Server, srv CAAServer) {
 | 
					 | 
				
			||||||
	s.RegisterService(&_CAA_serviceDesc, srv)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func _CAA_IsCAAValid_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
					 | 
				
			||||||
	in := new(IsCAAValidRequest)
 | 
					 | 
				
			||||||
	if err := dec(in); err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if interceptor == nil {
 | 
					 | 
				
			||||||
		return srv.(CAAServer).IsCAAValid(ctx, in)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	info := &grpc.UnaryServerInfo{
 | 
					 | 
				
			||||||
		Server:     srv,
 | 
					 | 
				
			||||||
		FullMethod: "/va.CAA/IsCAAValid",
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 | 
					 | 
				
			||||||
		return srv.(CAAServer).IsCAAValid(ctx, req.(*IsCAAValidRequest))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return interceptor(ctx, in, info, handler)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var _CAA_serviceDesc = grpc.ServiceDesc{
 | 
					 | 
				
			||||||
	ServiceName: "va.CAA",
 | 
					 | 
				
			||||||
	HandlerType: (*CAAServer)(nil),
 | 
					 | 
				
			||||||
	Methods: []grpc.MethodDesc{
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			MethodName: "IsCAAValid",
 | 
					 | 
				
			||||||
			Handler:    _CAA_IsCAAValid_Handler,
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
	Streams:  []grpc.StreamDesc{},
 | 
					 | 
				
			||||||
	Metadata: "va/proto/va.proto",
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,187 @@
 | 
				
			||||||
 | 
					// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package proto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						context "context"
 | 
				
			||||||
 | 
						grpc "google.golang.org/grpc"
 | 
				
			||||||
 | 
						codes "google.golang.org/grpc/codes"
 | 
				
			||||||
 | 
						status "google.golang.org/grpc/status"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// VAClient is the client API for VA 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.
 | 
				
			||||||
 | 
					type VAClient interface {
 | 
				
			||||||
 | 
						PerformValidation(ctx context.Context, in *PerformValidationRequest, opts ...grpc.CallOption) (*ValidationResult, error)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type vAClient struct {
 | 
				
			||||||
 | 
						cc grpc.ClientConnInterface
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewVAClient(cc grpc.ClientConnInterface) VAClient {
 | 
				
			||||||
 | 
						return &vAClient{cc}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *vAClient) PerformValidation(ctx context.Context, in *PerformValidationRequest, opts ...grpc.CallOption) (*ValidationResult, error) {
 | 
				
			||||||
 | 
						out := new(ValidationResult)
 | 
				
			||||||
 | 
						err := c.cc.Invoke(ctx, "/va.VA/PerformValidation", in, out, opts...)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return out, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// VAServer is the server API for VA service.
 | 
				
			||||||
 | 
					// All implementations must embed UnimplementedVAServer
 | 
				
			||||||
 | 
					// for forward compatibility
 | 
				
			||||||
 | 
					type VAServer interface {
 | 
				
			||||||
 | 
						PerformValidation(context.Context, *PerformValidationRequest) (*ValidationResult, error)
 | 
				
			||||||
 | 
						mustEmbedUnimplementedVAServer()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// UnimplementedVAServer must be embedded to have forward compatible implementations.
 | 
				
			||||||
 | 
					type UnimplementedVAServer struct {
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (UnimplementedVAServer) PerformValidation(context.Context, *PerformValidationRequest) (*ValidationResult, error) {
 | 
				
			||||||
 | 
						return nil, status.Errorf(codes.Unimplemented, "method PerformValidation not implemented")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					func (UnimplementedVAServer) mustEmbedUnimplementedVAServer() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// UnsafeVAServer may be embedded to opt out of forward compatibility for this service.
 | 
				
			||||||
 | 
					// Use of this interface is not recommended, as added methods to VAServer will
 | 
				
			||||||
 | 
					// result in compilation errors.
 | 
				
			||||||
 | 
					type UnsafeVAServer interface {
 | 
				
			||||||
 | 
						mustEmbedUnimplementedVAServer()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func RegisterVAServer(s grpc.ServiceRegistrar, srv VAServer) {
 | 
				
			||||||
 | 
						s.RegisterService(&VA_ServiceDesc, srv)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _VA_PerformValidation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
				
			||||||
 | 
						in := new(PerformValidationRequest)
 | 
				
			||||||
 | 
						if err := dec(in); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if interceptor == nil {
 | 
				
			||||||
 | 
							return srv.(VAServer).PerformValidation(ctx, in)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						info := &grpc.UnaryServerInfo{
 | 
				
			||||||
 | 
							Server:     srv,
 | 
				
			||||||
 | 
							FullMethod: "/va.VA/PerformValidation",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 | 
				
			||||||
 | 
							return srv.(VAServer).PerformValidation(ctx, req.(*PerformValidationRequest))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return interceptor(ctx, in, info, handler)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// VA_ServiceDesc is the grpc.ServiceDesc for VA service.
 | 
				
			||||||
 | 
					// It's only intended for direct use with grpc.RegisterService,
 | 
				
			||||||
 | 
					// and not to be introspected or modified (even as a copy)
 | 
				
			||||||
 | 
					var VA_ServiceDesc = grpc.ServiceDesc{
 | 
				
			||||||
 | 
						ServiceName: "va.VA",
 | 
				
			||||||
 | 
						HandlerType: (*VAServer)(nil),
 | 
				
			||||||
 | 
						Methods: []grpc.MethodDesc{
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								MethodName: "PerformValidation",
 | 
				
			||||||
 | 
								Handler:    _VA_PerformValidation_Handler,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						Streams:  []grpc.StreamDesc{},
 | 
				
			||||||
 | 
						Metadata: "va.proto",
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CAAClient is the client API for CAA 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.
 | 
				
			||||||
 | 
					type CAAClient interface {
 | 
				
			||||||
 | 
						IsCAAValid(ctx context.Context, in *IsCAAValidRequest, opts ...grpc.CallOption) (*IsCAAValidResponse, error)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type cAAClient struct {
 | 
				
			||||||
 | 
						cc grpc.ClientConnInterface
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewCAAClient(cc grpc.ClientConnInterface) CAAClient {
 | 
				
			||||||
 | 
						return &cAAClient{cc}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *cAAClient) IsCAAValid(ctx context.Context, in *IsCAAValidRequest, opts ...grpc.CallOption) (*IsCAAValidResponse, error) {
 | 
				
			||||||
 | 
						out := new(IsCAAValidResponse)
 | 
				
			||||||
 | 
						err := c.cc.Invoke(ctx, "/va.CAA/IsCAAValid", in, out, opts...)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return out, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CAAServer is the server API for CAA service.
 | 
				
			||||||
 | 
					// All implementations must embed UnimplementedCAAServer
 | 
				
			||||||
 | 
					// for forward compatibility
 | 
				
			||||||
 | 
					type CAAServer interface {
 | 
				
			||||||
 | 
						IsCAAValid(context.Context, *IsCAAValidRequest) (*IsCAAValidResponse, error)
 | 
				
			||||||
 | 
						mustEmbedUnimplementedCAAServer()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// UnimplementedCAAServer must be embedded to have forward compatible implementations.
 | 
				
			||||||
 | 
					type UnimplementedCAAServer struct {
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (UnimplementedCAAServer) IsCAAValid(context.Context, *IsCAAValidRequest) (*IsCAAValidResponse, error) {
 | 
				
			||||||
 | 
						return nil, status.Errorf(codes.Unimplemented, "method IsCAAValid not implemented")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					func (UnimplementedCAAServer) mustEmbedUnimplementedCAAServer() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// UnsafeCAAServer may be embedded to opt out of forward compatibility for this service.
 | 
				
			||||||
 | 
					// Use of this interface is not recommended, as added methods to CAAServer will
 | 
				
			||||||
 | 
					// result in compilation errors.
 | 
				
			||||||
 | 
					type UnsafeCAAServer interface {
 | 
				
			||||||
 | 
						mustEmbedUnimplementedCAAServer()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func RegisterCAAServer(s grpc.ServiceRegistrar, srv CAAServer) {
 | 
				
			||||||
 | 
						s.RegisterService(&CAA_ServiceDesc, srv)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _CAA_IsCAAValid_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
				
			||||||
 | 
						in := new(IsCAAValidRequest)
 | 
				
			||||||
 | 
						if err := dec(in); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if interceptor == nil {
 | 
				
			||||||
 | 
							return srv.(CAAServer).IsCAAValid(ctx, in)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						info := &grpc.UnaryServerInfo{
 | 
				
			||||||
 | 
							Server:     srv,
 | 
				
			||||||
 | 
							FullMethod: "/va.CAA/IsCAAValid",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 | 
				
			||||||
 | 
							return srv.(CAAServer).IsCAAValid(ctx, req.(*IsCAAValidRequest))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return interceptor(ctx, in, info, handler)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CAA_ServiceDesc is the grpc.ServiceDesc for CAA service.
 | 
				
			||||||
 | 
					// It's only intended for direct use with grpc.RegisterService,
 | 
				
			||||||
 | 
					// and not to be introspected or modified (even as a copy)
 | 
				
			||||||
 | 
					var CAA_ServiceDesc = grpc.ServiceDesc{
 | 
				
			||||||
 | 
						ServiceName: "va.CAA",
 | 
				
			||||||
 | 
						HandlerType: (*CAAServer)(nil),
 | 
				
			||||||
 | 
						Methods: []grpc.MethodDesc{
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								MethodName: "IsCAAValid",
 | 
				
			||||||
 | 
								Handler:    _CAA_IsCAAValid_Handler,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						Streams:  []grpc.StreamDesc{},
 | 
				
			||||||
 | 
						Metadata: "va.proto",
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										2
									
								
								va/va.go
								
								
								
								
							
							
						
						
									
										2
									
								
								va/va.go
								
								
								
								
							| 
						 | 
					@ -172,6 +172,8 @@ func initMetrics(stats prometheus.Registerer) *vaMetrics {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ValidationAuthorityImpl represents a VA
 | 
					// ValidationAuthorityImpl represents a VA
 | 
				
			||||||
type ValidationAuthorityImpl struct {
 | 
					type ValidationAuthorityImpl struct {
 | 
				
			||||||
 | 
						vapb.UnimplementedVAServer
 | 
				
			||||||
 | 
						vapb.UnimplementedCAAServer
 | 
				
			||||||
	log                blog.Logger
 | 
						log                blog.Logger
 | 
				
			||||||
	dnsClient          bdns.Client
 | 
						dnsClient          bdns.Client
 | 
				
			||||||
	issuerDomain       string
 | 
						issuerDomain       string
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,163 +1,206 @@
 | 
				
			||||||
 | 
					// Copyright 2020 Google LLC
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
 | 
					// Code generated by protoc-gen-go. DO NOT EDIT.
 | 
				
			||||||
 | 
					// versions:
 | 
				
			||||||
 | 
					// 	protoc-gen-go v1.22.0
 | 
				
			||||||
 | 
					// 	protoc        v3.11.2
 | 
				
			||||||
// source: google/rpc/status.proto
 | 
					// source: google/rpc/status.proto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package status
 | 
					package status
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	fmt "fmt"
 | 
						reflect "reflect"
 | 
				
			||||||
	math "math"
 | 
						sync "sync"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	proto "github.com/golang/protobuf/proto"
 | 
						proto "github.com/golang/protobuf/proto"
 | 
				
			||||||
	any "github.com/golang/protobuf/ptypes/any"
 | 
						any "github.com/golang/protobuf/ptypes/any"
 | 
				
			||||||
 | 
						protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 | 
				
			||||||
 | 
						protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Reference imports to suppress errors if they are not otherwise used.
 | 
					const (
 | 
				
			||||||
var _ = proto.Marshal
 | 
						// Verify that this generated code is sufficiently up-to-date.
 | 
				
			||||||
var _ = fmt.Errorf
 | 
						_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
 | 
				
			||||||
var _ = math.Inf
 | 
						// Verify that runtime/protoimpl is sufficiently up-to-date.
 | 
				
			||||||
 | 
						_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// This is a compile-time assertion to ensure that this generated file
 | 
					// This is a compile-time assertion that a sufficiently up-to-date version
 | 
				
			||||||
// is compatible with the proto package it is being compiled against.
 | 
					// of the legacy proto package is being used.
 | 
				
			||||||
// A compilation error at this line likely means your copy of the
 | 
					const _ = proto.ProtoPackageIsVersion4
 | 
				
			||||||
// proto package needs to be updated.
 | 
					 | 
				
			||||||
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// The `Status` type defines a logical error model that is suitable for
 | 
					// The `Status` type defines a logical error model that is suitable for
 | 
				
			||||||
// different programming environments, including REST APIs and RPC APIs. It is
 | 
					// different programming environments, including REST APIs and RPC APIs. It is
 | 
				
			||||||
// used by [gRPC](https://github.com/grpc). The error model is designed to be:
 | 
					// used by [gRPC](https://github.com/grpc). Each `Status` message contains
 | 
				
			||||||
 | 
					// three pieces of data: error code, error message, and error details.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// - Simple to use and understand for most users
 | 
					// You can find out more about this error model and how to work with it in the
 | 
				
			||||||
// - Flexible enough to meet unexpected needs
 | 
					// [API Design Guide](https://cloud.google.com/apis/design/errors).
 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// # Overview
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// The `Status` message contains three pieces of data: error code, error
 | 
					 | 
				
			||||||
// message, and error details. The error code should be an enum value of
 | 
					 | 
				
			||||||
// [google.rpc.Code][google.rpc.Code], but it may accept additional error codes
 | 
					 | 
				
			||||||
// if needed.  The error message should be a developer-facing English message
 | 
					 | 
				
			||||||
// that helps developers *understand* and *resolve* the error. If a localized
 | 
					 | 
				
			||||||
// user-facing error message is needed, put the localized message in the error
 | 
					 | 
				
			||||||
// details or localize it in the client. The optional error details may contain
 | 
					 | 
				
			||||||
// arbitrary information about the error. There is a predefined set of error
 | 
					 | 
				
			||||||
// detail types in the package `google.rpc` that can be used for common error
 | 
					 | 
				
			||||||
// conditions.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// # Language mapping
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// The `Status` message is the logical representation of the error model, but it
 | 
					 | 
				
			||||||
// is not necessarily the actual wire format. When the `Status` message is
 | 
					 | 
				
			||||||
// exposed in different client libraries and different wire protocols, it can be
 | 
					 | 
				
			||||||
// mapped differently. For example, it will likely be mapped to some exceptions
 | 
					 | 
				
			||||||
// in Java, but more likely mapped to some error codes in C.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// # Other uses
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// The error model and the `Status` message can be used in a variety of
 | 
					 | 
				
			||||||
// environments, either with or without APIs, to provide a
 | 
					 | 
				
			||||||
// consistent developer experience across different environments.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Example uses of this error model include:
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// - Partial errors. If a service needs to return partial errors to the client,
 | 
					 | 
				
			||||||
//     it may embed the `Status` in the normal response to indicate the partial
 | 
					 | 
				
			||||||
//     errors.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// - Workflow errors. A typical workflow has multiple steps. Each step may
 | 
					 | 
				
			||||||
//     have a `Status` message for error reporting.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// - Batch operations. If a client uses batch request and batch response, the
 | 
					 | 
				
			||||||
//     `Status` message should be used directly inside batch response, one for
 | 
					 | 
				
			||||||
//     each error sub-response.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// - Asynchronous operations. If an API call embeds asynchronous operation
 | 
					 | 
				
			||||||
//     results in its response, the status of those operations should be
 | 
					 | 
				
			||||||
//     represented directly using the `Status` message.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// - Logging. If some API errors are stored in logs, the message `Status` could
 | 
					 | 
				
			||||||
//     be used directly after any stripping needed for security/privacy reasons.
 | 
					 | 
				
			||||||
type Status struct {
 | 
					type Status struct {
 | 
				
			||||||
	// The status code, which should be an enum value of
 | 
						state         protoimpl.MessageState
 | 
				
			||||||
	// [google.rpc.Code][google.rpc.Code].
 | 
						sizeCache     protoimpl.SizeCache
 | 
				
			||||||
 | 
						unknownFields protoimpl.UnknownFields
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code].
 | 
				
			||||||
	Code int32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"`
 | 
						Code int32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"`
 | 
				
			||||||
	// A developer-facing error message, which should be in English. Any
 | 
						// A developer-facing error message, which should be in English. Any
 | 
				
			||||||
	// user-facing error message should be localized and sent in the
 | 
						// user-facing error message should be localized and sent in the
 | 
				
			||||||
	// [google.rpc.Status.details][google.rpc.Status.details] field, or localized
 | 
						// [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client.
 | 
				
			||||||
	// by the client.
 | 
					 | 
				
			||||||
	Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"`
 | 
						Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"`
 | 
				
			||||||
	// A list of messages that carry the error details.  There is a common set of
 | 
						// A list of messages that carry the error details.  There is a common set of
 | 
				
			||||||
	// message types for APIs to use.
 | 
						// message types for APIs to use.
 | 
				
			||||||
	Details              []*any.Any `protobuf:"bytes,3,rep,name=details,proto3" json:"details,omitempty"`
 | 
						Details []*any.Any `protobuf:"bytes,3,rep,name=details,proto3" json:"details,omitempty"`
 | 
				
			||||||
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
 | 
					 | 
				
			||||||
	XXX_unrecognized     []byte     `json:"-"`
 | 
					 | 
				
			||||||
	XXX_sizecache        int32      `json:"-"`
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (m *Status) Reset()         { *m = Status{} }
 | 
					func (x *Status) Reset() {
 | 
				
			||||||
func (m *Status) String() string { return proto.CompactTextString(m) }
 | 
						*x = Status{}
 | 
				
			||||||
func (*Status) ProtoMessage()    {}
 | 
						if protoimpl.UnsafeEnabled {
 | 
				
			||||||
 | 
							mi := &file_google_rpc_status_proto_msgTypes[0]
 | 
				
			||||||
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
 | 
							ms.StoreMessageInfo(mi)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (x *Status) String() string {
 | 
				
			||||||
 | 
						return protoimpl.X.MessageStringOf(x)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (*Status) ProtoMessage() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (x *Status) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
 | 
						mi := &file_google_rpc_status_proto_msgTypes[0]
 | 
				
			||||||
 | 
						if protoimpl.UnsafeEnabled && x != nil {
 | 
				
			||||||
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
 | 
							if ms.LoadMessageInfo() == nil {
 | 
				
			||||||
 | 
								ms.StoreMessageInfo(mi)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return ms
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return mi.MessageOf(x)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Deprecated: Use Status.ProtoReflect.Descriptor instead.
 | 
				
			||||||
func (*Status) Descriptor() ([]byte, []int) {
 | 
					func (*Status) Descriptor() ([]byte, []int) {
 | 
				
			||||||
	return fileDescriptor_24d244abaf643bfe, []int{0}
 | 
						return file_google_rpc_status_proto_rawDescGZIP(), []int{0}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (m *Status) XXX_Unmarshal(b []byte) error {
 | 
					func (x *Status) GetCode() int32 {
 | 
				
			||||||
	return xxx_messageInfo_Status.Unmarshal(m, b)
 | 
						if x != nil {
 | 
				
			||||||
}
 | 
							return x.Code
 | 
				
			||||||
func (m *Status) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 | 
					 | 
				
			||||||
	return xxx_messageInfo_Status.Marshal(b, m, deterministic)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
func (m *Status) XXX_Merge(src proto.Message) {
 | 
					 | 
				
			||||||
	xxx_messageInfo_Status.Merge(m, src)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
func (m *Status) XXX_Size() int {
 | 
					 | 
				
			||||||
	return xxx_messageInfo_Status.Size(m)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
func (m *Status) XXX_DiscardUnknown() {
 | 
					 | 
				
			||||||
	xxx_messageInfo_Status.DiscardUnknown(m)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var xxx_messageInfo_Status proto.InternalMessageInfo
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (m *Status) GetCode() int32 {
 | 
					 | 
				
			||||||
	if m != nil {
 | 
					 | 
				
			||||||
		return m.Code
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return 0
 | 
						return 0
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (m *Status) GetMessage() string {
 | 
					func (x *Status) GetMessage() string {
 | 
				
			||||||
	if m != nil {
 | 
						if x != nil {
 | 
				
			||||||
		return m.Message
 | 
							return x.Message
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return ""
 | 
						return ""
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (m *Status) GetDetails() []*any.Any {
 | 
					func (x *Status) GetDetails() []*any.Any {
 | 
				
			||||||
	if m != nil {
 | 
						if x != nil {
 | 
				
			||||||
		return m.Details
 | 
							return x.Details
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func init() {
 | 
					var File_google_rpc_status_proto protoreflect.FileDescriptor
 | 
				
			||||||
	proto.RegisterType((*Status)(nil), "google.rpc.Status")
 | 
					
 | 
				
			||||||
 | 
					var file_google_rpc_status_proto_rawDesc = []byte{
 | 
				
			||||||
 | 
						0x0a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x73, 0x74, 0x61,
 | 
				
			||||||
 | 
						0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
 | 
				
			||||||
 | 
						0x65, 0x2e, 0x72, 0x70, 0x63, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72,
 | 
				
			||||||
 | 
						0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
 | 
				
			||||||
 | 
						0x22, 0x66, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f,
 | 
				
			||||||
 | 
						0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18,
 | 
				
			||||||
 | 
						0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
 | 
				
			||||||
 | 
						0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61,
 | 
				
			||||||
 | 
						0x69, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
 | 
				
			||||||
 | 
						0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52,
 | 
				
			||||||
 | 
						0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x42, 0x61, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x2e,
 | 
				
			||||||
 | 
						0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x42, 0x0b, 0x53, 0x74, 0x61, 0x74,
 | 
				
			||||||
 | 
						0x75, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x37, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
 | 
				
			||||||
 | 
						0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x65, 0x6e,
 | 
				
			||||||
 | 
						0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73,
 | 
				
			||||||
 | 
						0x2f, 0x72, 0x70, 0x63, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3b, 0x73, 0x74, 0x61, 0x74,
 | 
				
			||||||
 | 
						0x75, 0x73, 0xf8, 0x01, 0x01, 0xa2, 0x02, 0x03, 0x52, 0x50, 0x43, 0x62, 0x06, 0x70, 0x72, 0x6f,
 | 
				
			||||||
 | 
						0x74, 0x6f, 0x33,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func init() { proto.RegisterFile("google/rpc/status.proto", fileDescriptor_24d244abaf643bfe) }
 | 
					var (
 | 
				
			||||||
 | 
						file_google_rpc_status_proto_rawDescOnce sync.Once
 | 
				
			||||||
 | 
						file_google_rpc_status_proto_rawDescData = file_google_rpc_status_proto_rawDesc
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var fileDescriptor_24d244abaf643bfe = []byte{
 | 
					func file_google_rpc_status_proto_rawDescGZIP() []byte {
 | 
				
			||||||
	// 209 bytes of a gzipped FileDescriptorProto
 | 
						file_google_rpc_status_proto_rawDescOnce.Do(func() {
 | 
				
			||||||
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x4f, 0xcf, 0xcf, 0x4f,
 | 
							file_google_rpc_status_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_rpc_status_proto_rawDescData)
 | 
				
			||||||
	0xcf, 0x49, 0xd5, 0x2f, 0x2a, 0x48, 0xd6, 0x2f, 0x2e, 0x49, 0x2c, 0x29, 0x2d, 0xd6, 0x2b, 0x28,
 | 
						})
 | 
				
			||||||
	0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x82, 0x48, 0xe8, 0x15, 0x15, 0x24, 0x4b, 0x49, 0x42, 0x15, 0x81,
 | 
						return file_google_rpc_status_proto_rawDescData
 | 
				
			||||||
	0x65, 0x92, 0x4a, 0xd3, 0xf4, 0x13, 0xf3, 0x2a, 0x21, 0xca, 0x94, 0xd2, 0xb8, 0xd8, 0x82, 0xc1,
 | 
					}
 | 
				
			||||||
	0xda, 0x84, 0x84, 0xb8, 0x58, 0x92, 0xf3, 0x53, 0x52, 0x25, 0x18, 0x15, 0x18, 0x35, 0x58, 0x83,
 | 
					
 | 
				
			||||||
	0xc0, 0x6c, 0x21, 0x09, 0x2e, 0xf6, 0xdc, 0xd4, 0xe2, 0xe2, 0xc4, 0xf4, 0x54, 0x09, 0x26, 0x05,
 | 
					var file_google_rpc_status_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
 | 
				
			||||||
	0x46, 0x0d, 0xce, 0x20, 0x18, 0x57, 0x48, 0x8f, 0x8b, 0x3d, 0x25, 0xb5, 0x24, 0x31, 0x33, 0xa7,
 | 
					var file_google_rpc_status_proto_goTypes = []interface{}{
 | 
				
			||||||
	0x58, 0x82, 0x59, 0x81, 0x59, 0x83, 0xdb, 0x48, 0x44, 0x0f, 0x6a, 0x21, 0xcc, 0x12, 0x3d, 0xc7,
 | 
						(*Status)(nil),  // 0: google.rpc.Status
 | 
				
			||||||
	0xbc, 0xca, 0x20, 0x98, 0x22, 0xa7, 0x38, 0x2e, 0xbe, 0xe4, 0xfc, 0x5c, 0x3d, 0x84, 0xa3, 0x9c,
 | 
						(*any.Any)(nil), // 1: google.protobuf.Any
 | 
				
			||||||
	0xb8, 0x21, 0xf6, 0x06, 0x80, 0x94, 0x07, 0x30, 0x46, 0x99, 0x43, 0xa5, 0xd2, 0xf3, 0x73, 0x12,
 | 
					}
 | 
				
			||||||
	0xf3, 0xd2, 0xf5, 0xf2, 0x8b, 0xd2, 0xf5, 0xd3, 0x53, 0xf3, 0xc0, 0x86, 0xe9, 0x43, 0xa4, 0x12,
 | 
					var file_google_rpc_status_proto_depIdxs = []int32{
 | 
				
			||||||
	0x0b, 0x32, 0x8b, 0x91, 0xfc, 0x69, 0x0d, 0xa1, 0x16, 0x31, 0x31, 0x07, 0x05, 0x38, 0x27, 0xb1,
 | 
						1, // 0: google.rpc.Status.details:type_name -> google.protobuf.Any
 | 
				
			||||||
	0x81, 0x55, 0x1a, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0xa4, 0x53, 0xf0, 0x7c, 0x10, 0x01, 0x00,
 | 
						1, // [1:1] is the sub-list for method output_type
 | 
				
			||||||
	0x00,
 | 
						1, // [1:1] is the sub-list for method input_type
 | 
				
			||||||
 | 
						1, // [1:1] is the sub-list for extension type_name
 | 
				
			||||||
 | 
						1, // [1:1] is the sub-list for extension extendee
 | 
				
			||||||
 | 
						0, // [0:1] is the sub-list for field type_name
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() { file_google_rpc_status_proto_init() }
 | 
				
			||||||
 | 
					func file_google_rpc_status_proto_init() {
 | 
				
			||||||
 | 
						if File_google_rpc_status_proto != nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if !protoimpl.UnsafeEnabled {
 | 
				
			||||||
 | 
							file_google_rpc_status_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 | 
				
			||||||
 | 
								switch v := v.(*Status); i {
 | 
				
			||||||
 | 
								case 0:
 | 
				
			||||||
 | 
									return &v.state
 | 
				
			||||||
 | 
								case 1:
 | 
				
			||||||
 | 
									return &v.sizeCache
 | 
				
			||||||
 | 
								case 2:
 | 
				
			||||||
 | 
									return &v.unknownFields
 | 
				
			||||||
 | 
								default:
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						type x struct{}
 | 
				
			||||||
 | 
						out := protoimpl.TypeBuilder{
 | 
				
			||||||
 | 
							File: protoimpl.DescBuilder{
 | 
				
			||||||
 | 
								GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 | 
				
			||||||
 | 
								RawDescriptor: file_google_rpc_status_proto_rawDesc,
 | 
				
			||||||
 | 
								NumEnums:      0,
 | 
				
			||||||
 | 
								NumMessages:   1,
 | 
				
			||||||
 | 
								NumExtensions: 0,
 | 
				
			||||||
 | 
								NumServices:   0,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							GoTypes:           file_google_rpc_status_proto_goTypes,
 | 
				
			||||||
 | 
							DependencyIndexes: file_google_rpc_status_proto_depIdxs,
 | 
				
			||||||
 | 
							MessageInfos:      file_google_rpc_status_proto_msgTypes,
 | 
				
			||||||
 | 
						}.Build()
 | 
				
			||||||
 | 
						File_google_rpc_status_proto = out.File
 | 
				
			||||||
 | 
						file_google_rpc_status_proto_rawDesc = nil
 | 
				
			||||||
 | 
						file_google_rpc_status_proto_goTypes = nil
 | 
				
			||||||
 | 
						file_google_rpc_status_proto_depIdxs = nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,22 +2,22 @@ language: go
 | 
				
			||||||
 | 
					
 | 
				
			||||||
matrix:
 | 
					matrix:
 | 
				
			||||||
  include:
 | 
					  include:
 | 
				
			||||||
  - go: 1.13.x
 | 
					  - go: 1.14.x
 | 
				
			||||||
    env: VET=1 GO111MODULE=on
 | 
					    env: VET=1 GO111MODULE=on
 | 
				
			||||||
  - go: 1.13.x
 | 
					  - go: 1.14.x
 | 
				
			||||||
    env: RACE=1 GO111MODULE=on
 | 
					    env: RACE=1 GO111MODULE=on
 | 
				
			||||||
  - go: 1.13.x
 | 
					  - go: 1.14.x
 | 
				
			||||||
    env: RUN386=1
 | 
					    env: RUN386=1
 | 
				
			||||||
  - go: 1.13.x
 | 
					  - go: 1.14.x
 | 
				
			||||||
    env: GRPC_GO_RETRY=on
 | 
					    env: GRPC_GO_RETRY=on
 | 
				
			||||||
  - go: 1.13.x
 | 
					  - go: 1.14.x
 | 
				
			||||||
    env: TESTEXTRAS=1
 | 
					    env: TESTEXTRAS=1
 | 
				
			||||||
 | 
					  - go: 1.13.x
 | 
				
			||||||
 | 
					    env: GO111MODULE=on
 | 
				
			||||||
  - go: 1.12.x
 | 
					  - go: 1.12.x
 | 
				
			||||||
    env: GO111MODULE=on
 | 
					    env: GO111MODULE=on
 | 
				
			||||||
  - go: 1.11.x
 | 
					  - go: 1.11.x  # Keep until interop tests no longer require Go1.11
 | 
				
			||||||
    env: GO111MODULE=on
 | 
					    env: GO111MODULE=on
 | 
				
			||||||
  - go: 1.9.x
 | 
					 | 
				
			||||||
    env: GAE=1
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
go_import_path: google.golang.org/grpc
 | 
					go_import_path: google.golang.org/grpc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,7 +35,7 @@ install:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
script:
 | 
					script:
 | 
				
			||||||
  - set -e
 | 
					  - set -e
 | 
				
			||||||
  - if [[ -n "${TESTEXTRAS}" ]]; then examples/examples_test.sh; interop/interop_test.sh; make testsubmodule; exit 0; fi
 | 
					  - if [[ -n "${TESTEXTRAS}" ]]; then examples/examples_test.sh; security/advancedtls/examples/examples_test.sh; interop/interop_test.sh; make testsubmodule; exit 0; fi
 | 
				
			||||||
  - if [[ -n "${VET}" ]]; then ./vet.sh; fi
 | 
					  - if [[ -n "${VET}" ]]; then ./vet.sh; fi
 | 
				
			||||||
  - if [[ -n "${GAE}" ]]; then make testappengine; exit 0; fi
 | 
					  - if [[ -n "${GAE}" ]]; then make testappengine; exit 0; fi
 | 
				
			||||||
  - if [[ -n "${RACE}" ]]; then make testrace; exit 0; fi
 | 
					  - if [[ -n "${RACE}" ]]; then make testrace; exit 0; fi
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -57,6 +57,5 @@ How to get your contributions merged smoothly and quickly.
 | 
				
			||||||
  - `make vet` to catch vet errors
 | 
					  - `make vet` to catch vet errors
 | 
				
			||||||
  - `make test` to run the tests
 | 
					  - `make test` to run the tests
 | 
				
			||||||
  - `make testrace` to run tests in race mode
 | 
					  - `make testrace` to run tests in race mode
 | 
				
			||||||
  - optional `make testappengine` to run tests with appengine
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
- Exceptions to the rules can be made if there's a compelling reason for doing so.
 | 
					- Exceptions to the rules can be made if there's a compelling reason for doing so.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,13 +1,13 @@
 | 
				
			||||||
all: vet test testrace
 | 
					all: vet test testrace
 | 
				
			||||||
 | 
					
 | 
				
			||||||
build: deps
 | 
					build:
 | 
				
			||||||
	go build google.golang.org/grpc/...
 | 
						go build google.golang.org/grpc/...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
clean:
 | 
					clean:
 | 
				
			||||||
	go clean -i google.golang.org/grpc/...
 | 
						go clean -i google.golang.org/grpc/...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
deps:
 | 
					deps:
 | 
				
			||||||
	go get -d -v google.golang.org/grpc/...
 | 
						GO111MODULE=on go get -d -v google.golang.org/grpc/...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
proto:
 | 
					proto:
 | 
				
			||||||
	@ if ! which protoc > /dev/null; then \
 | 
						@ if ! which protoc > /dev/null; then \
 | 
				
			||||||
| 
						 | 
					@ -16,29 +16,18 @@ proto:
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
	go generate google.golang.org/grpc/...
 | 
						go generate google.golang.org/grpc/...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
test: testdeps
 | 
					test:
 | 
				
			||||||
	go test -cpu 1,4 -timeout 7m google.golang.org/grpc/...
 | 
						go test -cpu 1,4 -timeout 7m google.golang.org/grpc/...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
testsubmodule: testdeps
 | 
					testsubmodule:
 | 
				
			||||||
	cd security/advancedtls && go test -cpu 1,4 -timeout 7m google.golang.org/grpc/security/advancedtls/...
 | 
						cd security/advancedtls && go test -cpu 1,4 -timeout 7m google.golang.org/grpc/security/advancedtls/...
 | 
				
			||||||
 | 
						cd security/authorization && go test -cpu 1,4 -timeout 7m google.golang.org/grpc/security/authorization/...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
testappengine: testappenginedeps
 | 
					testrace:
 | 
				
			||||||
	goapp test -cpu 1,4 -timeout 7m google.golang.org/grpc/...
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
testappenginedeps:
 | 
					 | 
				
			||||||
	goapp get -d -v -t -tags 'appengine appenginevm' google.golang.org/grpc/...
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
testdeps:
 | 
					 | 
				
			||||||
	go get -d -v -t google.golang.org/grpc/...
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
testrace: testdeps
 | 
					 | 
				
			||||||
	go test -race -cpu 1,4 -timeout 7m google.golang.org/grpc/...
 | 
						go test -race -cpu 1,4 -timeout 7m google.golang.org/grpc/...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
updatedeps:
 | 
					testdeps:
 | 
				
			||||||
	go get -d -v -u -f google.golang.org/grpc/...
 | 
						GO111MODULE=on go get -d -v -t google.golang.org/grpc/...
 | 
				
			||||||
 | 
					 | 
				
			||||||
updatetestdeps:
 | 
					 | 
				
			||||||
	go get -d -v -t -u -f google.golang.org/grpc/...
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
vet: vetdeps
 | 
					vet: vetdeps
 | 
				
			||||||
	./vet.sh
 | 
						./vet.sh
 | 
				
			||||||
| 
						 | 
					@ -50,14 +39,10 @@ vetdeps:
 | 
				
			||||||
	all \
 | 
						all \
 | 
				
			||||||
	build \
 | 
						build \
 | 
				
			||||||
	clean \
 | 
						clean \
 | 
				
			||||||
	deps \
 | 
					 | 
				
			||||||
	proto \
 | 
						proto \
 | 
				
			||||||
	test \
 | 
						test \
 | 
				
			||||||
	testappengine \
 | 
						testappengine \
 | 
				
			||||||
	testappenginedeps \
 | 
						testappenginedeps \
 | 
				
			||||||
	testdeps \
 | 
					 | 
				
			||||||
	testrace \
 | 
						testrace \
 | 
				
			||||||
	updatedeps \
 | 
					 | 
				
			||||||
	updatetestdeps \
 | 
					 | 
				
			||||||
	vet \
 | 
						vet \
 | 
				
			||||||
	vetdeps
 | 
						vetdeps
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,64 +1,53 @@
 | 
				
			||||||
# gRPC-Go
 | 
					# gRPC-Go
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[](https://travis-ci.org/grpc/grpc-go)
 | 
					[](https://travis-ci.org/grpc/grpc-go)
 | 
				
			||||||
[](https://godoc.org/google.golang.org/grpc)
 | 
					[][API]
 | 
				
			||||||
[](https://goreportcard.com/report/github.com/grpc/grpc-go)
 | 
					[](https://goreportcard.com/report/github.com/grpc/grpc-go)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The Go implementation of [gRPC](https://grpc.io/): A high performance, open
 | 
					The [Go][] implementation of [gRPC][]: A high performance, open source, general
 | 
				
			||||||
source, general RPC framework that puts mobile and HTTP/2 first. For more
 | 
					RPC framework that puts mobile and HTTP/2 first. For more information see the
 | 
				
			||||||
information see the [gRPC Quick Start:
 | 
					[Go gRPC docs][], or jump directly into the [quick start][].
 | 
				
			||||||
Go](https://grpc.io/docs/quickstart/go.html) guide.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
Installation
 | 
					## Prerequisites
 | 
				
			||||||
------------
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
To install this package, you need to install Go and setup your Go workspace on
 | 
					- **[Go][]**: any one of the **three latest major** [releases][go-releases].
 | 
				
			||||||
your computer. The simplest way to install the library is to run:
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Installation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					With [Go module][] support (Go 1.11+), simply add the following import
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```go
 | 
				
			||||||
 | 
					import "google.golang.org/grpc"
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					to your code, and then `go [build|run|test]` will automatically fetch the
 | 
				
			||||||
 | 
					necessary dependencies.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Otherwise, to install the `grpc-go` package, run the following command:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```console
 | 
				
			||||||
$ go get -u google.golang.org/grpc
 | 
					$ go get -u google.golang.org/grpc
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
With Go module support (Go 1.11+), simply `import "google.golang.org/grpc"` in
 | 
					> **Note:** If you are trying to access `grpc-go` from **China**, see the
 | 
				
			||||||
your source code and `go [build|run|test]` will automatically download the
 | 
					> [FAQ](#FAQ) below.
 | 
				
			||||||
necessary dependencies ([Go modules
 | 
					 | 
				
			||||||
ref](https://github.com/golang/go/wiki/Modules)).
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
If you are trying to access grpc-go from within China, please see the
 | 
					## Learn more
 | 
				
			||||||
[FAQ](#FAQ) below.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
Prerequisites
 | 
					- [Go gRPC docs][], which include a [quick start][] and [API
 | 
				
			||||||
-------------
 | 
					  reference][API] among other resources
 | 
				
			||||||
gRPC-Go requires Go 1.9 or later.
 | 
					- [Low-level technical docs](Documentation) from this repository
 | 
				
			||||||
 | 
					- [Performance benchmark][]
 | 
				
			||||||
 | 
					- [Examples](examples)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Documentation
 | 
					## FAQ
 | 
				
			||||||
-------------
 | 
					 | 
				
			||||||
- See [godoc](https://godoc.org/google.golang.org/grpc) for package and API
 | 
					 | 
				
			||||||
  descriptions.
 | 
					 | 
				
			||||||
- Documentation on specific topics can be found in the [Documentation
 | 
					 | 
				
			||||||
  directory](Documentation/).
 | 
					 | 
				
			||||||
- Examples can be found in the [examples directory](examples/).
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
Performance
 | 
					### I/O Timeout Errors
 | 
				
			||||||
-----------
 | 
					 | 
				
			||||||
Performance benchmark data for grpc-go and other languages is maintained in
 | 
					 | 
				
			||||||
[this
 | 
					 | 
				
			||||||
dashboard](https://performance-dot-grpc-testing.appspot.com/explore?dashboard=5652536396611584&widget=490377658&container=1286539696).
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
Status
 | 
					The `golang.org` domain may be blocked from some countries. `go get` usually
 | 
				
			||||||
------
 | 
					 | 
				
			||||||
General Availability [Google Cloud Platform Launch
 | 
					 | 
				
			||||||
Stages](https://cloud.google.com/terms/launch-stages).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
FAQ
 | 
					 | 
				
			||||||
---
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#### I/O Timeout Errors
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
The `golang.org` domain may be blocked from some countries.  `go get` usually
 | 
					 | 
				
			||||||
produces an error like the following when this happens:
 | 
					produces an error like the following when this happens:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```
 | 
					```console
 | 
				
			||||||
$ go get -u google.golang.org/grpc
 | 
					$ go get -u google.golang.org/grpc
 | 
				
			||||||
package google.golang.org/grpc: unrecognized import path "google.golang.org/grpc" (https fetch: Get https://google.golang.org/grpc?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)
 | 
					package google.golang.org/grpc: unrecognized import path "google.golang.org/grpc" (https fetch: Get https://google.golang.org/grpc?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
| 
						 | 
					@ -69,7 +58,7 @@ To build Go code, there are several options:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- Without Go module support: `git clone` the repo manually:
 | 
					- Without Go module support: `git clone` the repo manually:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  ```
 | 
					  ```sh
 | 
				
			||||||
  git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpc
 | 
					  git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpc
 | 
				
			||||||
  ```
 | 
					  ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -79,7 +68,7 @@ To build Go code, there are several options:
 | 
				
			||||||
- With Go module support: it is possible to use the `replace` feature of `go
 | 
					- With Go module support: it is possible to use the `replace` feature of `go
 | 
				
			||||||
  mod` to create aliases for golang.org packages.  In your project's directory:
 | 
					  mod` to create aliases for golang.org packages.  In your project's directory:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  ```
 | 
					  ```sh
 | 
				
			||||||
  go mod edit -replace=google.golang.org/grpc=github.com/grpc/grpc-go@latest
 | 
					  go mod edit -replace=google.golang.org/grpc=github.com/grpc/grpc-go@latest
 | 
				
			||||||
  go mod tidy
 | 
					  go mod tidy
 | 
				
			||||||
  go mod vendor
 | 
					  go mod vendor
 | 
				
			||||||
| 
						 | 
					@ -87,19 +76,17 @@ To build Go code, there are several options:
 | 
				
			||||||
  ```
 | 
					  ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Again, this will need to be done for all transitive dependencies hosted on
 | 
					  Again, this will need to be done for all transitive dependencies hosted on
 | 
				
			||||||
  golang.org as well.  Please refer to [this
 | 
					  golang.org as well. For details, refer to [golang/go issue #28652](https://github.com/golang/go/issues/28652).
 | 
				
			||||||
  issue](https://github.com/golang/go/issues/28652) in the golang repo regarding
 | 
					 | 
				
			||||||
  this concern.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#### Compiling error, undefined: grpc.SupportPackageIsVersion
 | 
					### Compiling error, undefined: grpc.SupportPackageIsVersion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
##### If you are using Go modules:
 | 
					#### If you are using Go modules:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Please ensure your gRPC-Go version is `require`d at the appropriate version in
 | 
					Ensure your gRPC-Go version is `require`d at the appropriate version in
 | 
				
			||||||
the same module containing the generated `.pb.go` files.  For example,
 | 
					the same module containing the generated `.pb.go` files.  For example,
 | 
				
			||||||
`SupportPackageIsVersion6` needs `v1.27.0`, so in your `go.mod` file:
 | 
					`SupportPackageIsVersion6` needs `v1.27.0`, so in your `go.mod` file:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```
 | 
					```go
 | 
				
			||||||
module <your module name>
 | 
					module <your module name>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
require (
 | 
					require (
 | 
				
			||||||
| 
						 | 
					@ -107,23 +94,27 @@ require (
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
##### If you are *not* using Go modules:
 | 
					#### If you are *not* using Go modules:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Please update proto package, gRPC package and rebuild the proto files:
 | 
					Update the `proto` package, gRPC package, and rebuild the `.proto` files:
 | 
				
			||||||
 - `go get -u github.com/golang/protobuf/{proto,protoc-gen-go}`
 | 
					 | 
				
			||||||
 - `go get -u google.golang.org/grpc`
 | 
					 | 
				
			||||||
 - `protoc --go_out=plugins=grpc:. *.proto`
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#### How to turn on logging
 | 
					```sh
 | 
				
			||||||
 | 
					go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
 | 
				
			||||||
The default logger is controlled by the environment variables. Turn everything
 | 
					go get -u google.golang.org/grpc
 | 
				
			||||||
on by setting:
 | 
					protoc --go_out=plugins=grpc:. *.proto
 | 
				
			||||||
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
GRPC_GO_LOG_VERBOSITY_LEVEL=99 GRPC_GO_LOG_SEVERITY_LEVEL=info
 | 
					 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#### The RPC failed with error `"code = Unavailable desc = transport is closing"`
 | 
					### How to turn on logging
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The default logger is controlled by environment variables. Turn everything on
 | 
				
			||||||
 | 
					like this:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```console
 | 
				
			||||||
 | 
					$ export GRPC_GO_LOG_VERBOSITY_LEVEL=99
 | 
				
			||||||
 | 
					$ export GRPC_GO_LOG_SEVERITY_LEVEL=info
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### The RPC failed with error `"code = Unavailable desc = transport is closing"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This error means the connection the RPC is using was closed, and there are many
 | 
					This error means the connection the RPC is using was closed, and there are many
 | 
				
			||||||
possible reasons, including:
 | 
					possible reasons, including:
 | 
				
			||||||
| 
						 | 
					@ -139,3 +130,12 @@ It can be tricky to debug this because the error happens on the client side but
 | 
				
			||||||
the root cause of the connection being closed is on the server side. Turn on
 | 
					the root cause of the connection being closed is on the server side. Turn on
 | 
				
			||||||
logging on __both client and server__, and see if there are any transport
 | 
					logging on __both client and server__, and see if there are any transport
 | 
				
			||||||
errors.
 | 
					errors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[API]: https://pkg.go.dev/google.golang.org/grpc
 | 
				
			||||||
 | 
					[Go]: https://golang.org
 | 
				
			||||||
 | 
					[Go module]: https://github.com/golang/go/wiki/Modules
 | 
				
			||||||
 | 
					[gRPC]: https://grpc.io
 | 
				
			||||||
 | 
					[Go gRPC docs]: https://grpc.io/docs/languages/go
 | 
				
			||||||
 | 
					[Performance benchmark]: https://performance-dot-grpc-testing.appspot.com/explore?dashboard=5652536396611584&widget=490377658&container=1286539696
 | 
				
			||||||
 | 
					[quick start]: https://grpc.io/docs/languages/go/quickstart
 | 
				
			||||||
 | 
					[go-releases]: https://golang.org/doc/devel/release.html
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,3 @@
 | 
				
			||||||
 | 
					# Security Policy
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					For information on gRPC Security Policy and reporting potentional security issues, please see [gRPC CVE Process](https://github.com/grpc/proposal/blob/master/P4-grpc-cve-process.md).
 | 
				
			||||||
| 
						 | 
					@ -19,7 +19,10 @@
 | 
				
			||||||
// Package attributes defines a generic key/value store used in various gRPC
 | 
					// Package attributes defines a generic key/value store used in various gRPC
 | 
				
			||||||
// components.
 | 
					// components.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// All APIs in this package are EXPERIMENTAL.
 | 
					// Experimental
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Notice: This package is EXPERIMENTAL and may be changed or removed in a
 | 
				
			||||||
 | 
					// later release.
 | 
				
			||||||
package attributes
 | 
					package attributes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "fmt"
 | 
					import "fmt"
 | 
				
			||||||
| 
						 | 
					@ -50,6 +53,9 @@ func New(kvs ...interface{}) *Attributes {
 | 
				
			||||||
// times, the last value overwrites all previous values for that key.  To
 | 
					// times, the last value overwrites all previous values for that key.  To
 | 
				
			||||||
// remove an existing key, use a nil value.
 | 
					// remove an existing key, use a nil value.
 | 
				
			||||||
func (a *Attributes) WithValues(kvs ...interface{}) *Attributes {
 | 
					func (a *Attributes) WithValues(kvs ...interface{}) *Attributes {
 | 
				
			||||||
 | 
						if a == nil {
 | 
				
			||||||
 | 
							return New(kvs...)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	if len(kvs)%2 != 0 {
 | 
						if len(kvs)%2 != 0 {
 | 
				
			||||||
		panic(fmt.Sprintf("attributes.New called with unexpected input: len(kvs) = %v", len(kvs)))
 | 
							panic(fmt.Sprintf("attributes.New called with unexpected input: len(kvs) = %v", len(kvs)))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -66,5 +72,8 @@ func (a *Attributes) WithValues(kvs ...interface{}) *Attributes {
 | 
				
			||||||
// Value returns the value associated with these attributes for key, or nil if
 | 
					// Value returns the value associated with these attributes for key, or nil if
 | 
				
			||||||
// no value is associated with key.
 | 
					// no value is associated with key.
 | 
				
			||||||
func (a *Attributes) Value(key interface{}) interface{} {
 | 
					func (a *Attributes) Value(key interface{}) interface{} {
 | 
				
			||||||
 | 
						if a == nil {
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	return a.m[key]
 | 
						return a.m[key]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -48,7 +48,10 @@ type BackoffConfig struct {
 | 
				
			||||||
// here for more details:
 | 
					// here for more details:
 | 
				
			||||||
// https://github.com/grpc/grpc/blob/master/doc/connection-backoff.md.
 | 
					// https://github.com/grpc/grpc/blob/master/doc/connection-backoff.md.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// This API is EXPERIMENTAL.
 | 
					// Experimental
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Notice: This type is EXPERIMENTAL and may be changed or removed in a
 | 
				
			||||||
 | 
					// later release.
 | 
				
			||||||
type ConnectParams struct {
 | 
					type ConnectParams struct {
 | 
				
			||||||
	// Backoff specifies the configuration options for connection backoff.
 | 
						// Backoff specifies the configuration options for connection backoff.
 | 
				
			||||||
	Backoff backoff.Config
 | 
						Backoff backoff.Config
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,391 +0,0 @@
 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * Copyright 2016 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
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"context"
 | 
					 | 
				
			||||||
	"net"
 | 
					 | 
				
			||||||
	"sync"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"google.golang.org/grpc/codes"
 | 
					 | 
				
			||||||
	"google.golang.org/grpc/credentials"
 | 
					 | 
				
			||||||
	"google.golang.org/grpc/grpclog"
 | 
					 | 
				
			||||||
	"google.golang.org/grpc/naming"
 | 
					 | 
				
			||||||
	"google.golang.org/grpc/status"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Address represents a server the client connects to.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Deprecated: please use package balancer.
 | 
					 | 
				
			||||||
type Address struct {
 | 
					 | 
				
			||||||
	// Addr is the server address on which a connection will be established.
 | 
					 | 
				
			||||||
	Addr string
 | 
					 | 
				
			||||||
	// Metadata is the information associated with Addr, which may be used
 | 
					 | 
				
			||||||
	// to make load balancing decision.
 | 
					 | 
				
			||||||
	Metadata interface{}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// BalancerConfig specifies the configurations for Balancer.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Deprecated: please use package balancer.  May be removed in a future 1.x release.
 | 
					 | 
				
			||||||
type BalancerConfig struct {
 | 
					 | 
				
			||||||
	// DialCreds is the transport credential the Balancer implementation can
 | 
					 | 
				
			||||||
	// use to dial to a remote load balancer server. The Balancer implementations
 | 
					 | 
				
			||||||
	// can ignore this if it does not need to talk to another party securely.
 | 
					 | 
				
			||||||
	DialCreds credentials.TransportCredentials
 | 
					 | 
				
			||||||
	// Dialer is the custom dialer the Balancer implementation can use to dial
 | 
					 | 
				
			||||||
	// to a remote load balancer server. The Balancer implementations
 | 
					 | 
				
			||||||
	// can ignore this if it doesn't need to talk to remote balancer.
 | 
					 | 
				
			||||||
	Dialer func(context.Context, string) (net.Conn, error)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// BalancerGetOptions configures a Get call.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Deprecated: please use package balancer.  May be removed in a future 1.x release.
 | 
					 | 
				
			||||||
type BalancerGetOptions struct {
 | 
					 | 
				
			||||||
	// BlockingWait specifies whether Get should block when there is no
 | 
					 | 
				
			||||||
	// connected address.
 | 
					 | 
				
			||||||
	BlockingWait bool
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Balancer chooses network addresses for RPCs.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Deprecated: please use package balancer.  May be removed in a future 1.x release.
 | 
					 | 
				
			||||||
type Balancer interface {
 | 
					 | 
				
			||||||
	// Start does the initialization work to bootstrap a Balancer. For example,
 | 
					 | 
				
			||||||
	// this function may start the name resolution and watch the updates. It will
 | 
					 | 
				
			||||||
	// be called when dialing.
 | 
					 | 
				
			||||||
	Start(target string, config BalancerConfig) error
 | 
					 | 
				
			||||||
	// Up informs the Balancer that gRPC has a connection to the server at
 | 
					 | 
				
			||||||
	// addr. It returns down which is called once the connection to addr gets
 | 
					 | 
				
			||||||
	// lost or closed.
 | 
					 | 
				
			||||||
	// TODO: It is not clear how to construct and take advantage of the meaningful error
 | 
					 | 
				
			||||||
	// parameter for down. Need realistic demands to guide.
 | 
					 | 
				
			||||||
	Up(addr Address) (down func(error))
 | 
					 | 
				
			||||||
	// Get gets the address of a server for the RPC corresponding to ctx.
 | 
					 | 
				
			||||||
	// i) If it returns a connected address, gRPC internals issues the RPC on the
 | 
					 | 
				
			||||||
	// connection to this address;
 | 
					 | 
				
			||||||
	// ii) If it returns an address on which the connection is under construction
 | 
					 | 
				
			||||||
	// (initiated by Notify(...)) but not connected, gRPC internals
 | 
					 | 
				
			||||||
	//  * fails RPC if the RPC is fail-fast and connection is in the TransientFailure or
 | 
					 | 
				
			||||||
	//  Shutdown state;
 | 
					 | 
				
			||||||
	//  or
 | 
					 | 
				
			||||||
	//  * issues RPC on the connection otherwise.
 | 
					 | 
				
			||||||
	// iii) If it returns an address on which the connection does not exist, gRPC
 | 
					 | 
				
			||||||
	// internals treats it as an error and will fail the corresponding RPC.
 | 
					 | 
				
			||||||
	//
 | 
					 | 
				
			||||||
	// Therefore, the following is the recommended rule when writing a custom Balancer.
 | 
					 | 
				
			||||||
	// If opts.BlockingWait is true, it should return a connected address or
 | 
					 | 
				
			||||||
	// block if there is no connected address. It should respect the timeout or
 | 
					 | 
				
			||||||
	// cancellation of ctx when blocking. If opts.BlockingWait is false (for fail-fast
 | 
					 | 
				
			||||||
	// RPCs), it should return an address it has notified via Notify(...) immediately
 | 
					 | 
				
			||||||
	// instead of blocking.
 | 
					 | 
				
			||||||
	//
 | 
					 | 
				
			||||||
	// The function returns put which is called once the rpc has completed or failed.
 | 
					 | 
				
			||||||
	// put can collect and report RPC stats to a remote load balancer.
 | 
					 | 
				
			||||||
	//
 | 
					 | 
				
			||||||
	// This function should only return the errors Balancer cannot recover by itself.
 | 
					 | 
				
			||||||
	// gRPC internals will fail the RPC if an error is returned.
 | 
					 | 
				
			||||||
	Get(ctx context.Context, opts BalancerGetOptions) (addr Address, put func(), err error)
 | 
					 | 
				
			||||||
	// Notify returns a channel that is used by gRPC internals to watch the addresses
 | 
					 | 
				
			||||||
	// gRPC needs to connect. The addresses might be from a name resolver or remote
 | 
					 | 
				
			||||||
	// load balancer. gRPC internals will compare it with the existing connected
 | 
					 | 
				
			||||||
	// addresses. If the address Balancer notified is not in the existing connected
 | 
					 | 
				
			||||||
	// addresses, gRPC starts to connect the address. If an address in the existing
 | 
					 | 
				
			||||||
	// connected addresses is not in the notification list, the corresponding connection
 | 
					 | 
				
			||||||
	// is shutdown gracefully. Otherwise, there are no operations to take. Note that
 | 
					 | 
				
			||||||
	// the Address slice must be the full list of the Addresses which should be connected.
 | 
					 | 
				
			||||||
	// It is NOT delta.
 | 
					 | 
				
			||||||
	Notify() <-chan []Address
 | 
					 | 
				
			||||||
	// Close shuts down the balancer.
 | 
					 | 
				
			||||||
	Close() error
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// RoundRobin returns a Balancer that selects addresses round-robin. It uses r to watch
 | 
					 | 
				
			||||||
// the name resolution updates and updates the addresses available correspondingly.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Deprecated: please use package balancer/roundrobin. May be removed in a future 1.x release.
 | 
					 | 
				
			||||||
func RoundRobin(r naming.Resolver) Balancer {
 | 
					 | 
				
			||||||
	return &roundRobin{r: r}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type addrInfo struct {
 | 
					 | 
				
			||||||
	addr      Address
 | 
					 | 
				
			||||||
	connected bool
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type roundRobin struct {
 | 
					 | 
				
			||||||
	r      naming.Resolver
 | 
					 | 
				
			||||||
	w      naming.Watcher
 | 
					 | 
				
			||||||
	addrs  []*addrInfo // all the addresses the client should potentially connect
 | 
					 | 
				
			||||||
	mu     sync.Mutex
 | 
					 | 
				
			||||||
	addrCh chan []Address // the channel to notify gRPC internals the list of addresses the client should connect to.
 | 
					 | 
				
			||||||
	next   int            // index of the next address to return for Get()
 | 
					 | 
				
			||||||
	waitCh chan struct{}  // the channel to block when there is no connected address available
 | 
					 | 
				
			||||||
	done   bool           // The Balancer is closed.
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (rr *roundRobin) watchAddrUpdates() error {
 | 
					 | 
				
			||||||
	updates, err := rr.w.Next()
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		grpclog.Warningf("grpc: the naming watcher stops working due to %v.", err)
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	rr.mu.Lock()
 | 
					 | 
				
			||||||
	defer rr.mu.Unlock()
 | 
					 | 
				
			||||||
	for _, update := range updates {
 | 
					 | 
				
			||||||
		addr := Address{
 | 
					 | 
				
			||||||
			Addr:     update.Addr,
 | 
					 | 
				
			||||||
			Metadata: update.Metadata,
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		switch update.Op {
 | 
					 | 
				
			||||||
		case naming.Add:
 | 
					 | 
				
			||||||
			var exist bool
 | 
					 | 
				
			||||||
			for _, v := range rr.addrs {
 | 
					 | 
				
			||||||
				if addr == v.addr {
 | 
					 | 
				
			||||||
					exist = true
 | 
					 | 
				
			||||||
					grpclog.Infoln("grpc: The name resolver wanted to add an existing address: ", addr)
 | 
					 | 
				
			||||||
					break
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if exist {
 | 
					 | 
				
			||||||
				continue
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			rr.addrs = append(rr.addrs, &addrInfo{addr: addr})
 | 
					 | 
				
			||||||
		case naming.Delete:
 | 
					 | 
				
			||||||
			for i, v := range rr.addrs {
 | 
					 | 
				
			||||||
				if addr == v.addr {
 | 
					 | 
				
			||||||
					copy(rr.addrs[i:], rr.addrs[i+1:])
 | 
					 | 
				
			||||||
					rr.addrs = rr.addrs[:len(rr.addrs)-1]
 | 
					 | 
				
			||||||
					break
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		default:
 | 
					 | 
				
			||||||
			grpclog.Errorln("Unknown update.Op ", update.Op)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	// Make a copy of rr.addrs and write it onto rr.addrCh so that gRPC internals gets notified.
 | 
					 | 
				
			||||||
	open := make([]Address, len(rr.addrs))
 | 
					 | 
				
			||||||
	for i, v := range rr.addrs {
 | 
					 | 
				
			||||||
		open[i] = v.addr
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if rr.done {
 | 
					 | 
				
			||||||
		return ErrClientConnClosing
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	select {
 | 
					 | 
				
			||||||
	case <-rr.addrCh:
 | 
					 | 
				
			||||||
	default:
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	rr.addrCh <- open
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (rr *roundRobin) Start(target string, config BalancerConfig) error {
 | 
					 | 
				
			||||||
	rr.mu.Lock()
 | 
					 | 
				
			||||||
	defer rr.mu.Unlock()
 | 
					 | 
				
			||||||
	if rr.done {
 | 
					 | 
				
			||||||
		return ErrClientConnClosing
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if rr.r == nil {
 | 
					 | 
				
			||||||
		// If there is no name resolver installed, it is not needed to
 | 
					 | 
				
			||||||
		// do name resolution. In this case, target is added into rr.addrs
 | 
					 | 
				
			||||||
		// as the only address available and rr.addrCh stays nil.
 | 
					 | 
				
			||||||
		rr.addrs = append(rr.addrs, &addrInfo{addr: Address{Addr: target}})
 | 
					 | 
				
			||||||
		return nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	w, err := rr.r.Resolve(target)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	rr.w = w
 | 
					 | 
				
			||||||
	rr.addrCh = make(chan []Address, 1)
 | 
					 | 
				
			||||||
	go func() {
 | 
					 | 
				
			||||||
		for {
 | 
					 | 
				
			||||||
			if err := rr.watchAddrUpdates(); err != nil {
 | 
					 | 
				
			||||||
				return
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}()
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Up sets the connected state of addr and sends notification if there are pending
 | 
					 | 
				
			||||||
// Get() calls.
 | 
					 | 
				
			||||||
func (rr *roundRobin) Up(addr Address) func(error) {
 | 
					 | 
				
			||||||
	rr.mu.Lock()
 | 
					 | 
				
			||||||
	defer rr.mu.Unlock()
 | 
					 | 
				
			||||||
	var cnt int
 | 
					 | 
				
			||||||
	for _, a := range rr.addrs {
 | 
					 | 
				
			||||||
		if a.addr == addr {
 | 
					 | 
				
			||||||
			if a.connected {
 | 
					 | 
				
			||||||
				return nil
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			a.connected = true
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if a.connected {
 | 
					 | 
				
			||||||
			cnt++
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	// addr is only one which is connected. Notify the Get() callers who are blocking.
 | 
					 | 
				
			||||||
	if cnt == 1 && rr.waitCh != nil {
 | 
					 | 
				
			||||||
		close(rr.waitCh)
 | 
					 | 
				
			||||||
		rr.waitCh = nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return func(err error) {
 | 
					 | 
				
			||||||
		rr.down(addr, err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// down unsets the connected state of addr.
 | 
					 | 
				
			||||||
func (rr *roundRobin) down(addr Address, err error) {
 | 
					 | 
				
			||||||
	rr.mu.Lock()
 | 
					 | 
				
			||||||
	defer rr.mu.Unlock()
 | 
					 | 
				
			||||||
	for _, a := range rr.addrs {
 | 
					 | 
				
			||||||
		if addr == a.addr {
 | 
					 | 
				
			||||||
			a.connected = false
 | 
					 | 
				
			||||||
			break
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Get returns the next addr in the rotation.
 | 
					 | 
				
			||||||
func (rr *roundRobin) Get(ctx context.Context, opts BalancerGetOptions) (addr Address, put func(), err error) {
 | 
					 | 
				
			||||||
	var ch chan struct{}
 | 
					 | 
				
			||||||
	rr.mu.Lock()
 | 
					 | 
				
			||||||
	if rr.done {
 | 
					 | 
				
			||||||
		rr.mu.Unlock()
 | 
					 | 
				
			||||||
		err = ErrClientConnClosing
 | 
					 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if len(rr.addrs) > 0 {
 | 
					 | 
				
			||||||
		if rr.next >= len(rr.addrs) {
 | 
					 | 
				
			||||||
			rr.next = 0
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		next := rr.next
 | 
					 | 
				
			||||||
		for {
 | 
					 | 
				
			||||||
			a := rr.addrs[next]
 | 
					 | 
				
			||||||
			next = (next + 1) % len(rr.addrs)
 | 
					 | 
				
			||||||
			if a.connected {
 | 
					 | 
				
			||||||
				addr = a.addr
 | 
					 | 
				
			||||||
				rr.next = next
 | 
					 | 
				
			||||||
				rr.mu.Unlock()
 | 
					 | 
				
			||||||
				return
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if next == rr.next {
 | 
					 | 
				
			||||||
				// Has iterated all the possible address but none is connected.
 | 
					 | 
				
			||||||
				break
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if !opts.BlockingWait {
 | 
					 | 
				
			||||||
		if len(rr.addrs) == 0 {
 | 
					 | 
				
			||||||
			rr.mu.Unlock()
 | 
					 | 
				
			||||||
			err = status.Errorf(codes.Unavailable, "there is no address available")
 | 
					 | 
				
			||||||
			return
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		// Returns the next addr on rr.addrs for failfast RPCs.
 | 
					 | 
				
			||||||
		addr = rr.addrs[rr.next].addr
 | 
					 | 
				
			||||||
		rr.next++
 | 
					 | 
				
			||||||
		rr.mu.Unlock()
 | 
					 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	// Wait on rr.waitCh for non-failfast RPCs.
 | 
					 | 
				
			||||||
	if rr.waitCh == nil {
 | 
					 | 
				
			||||||
		ch = make(chan struct{})
 | 
					 | 
				
			||||||
		rr.waitCh = ch
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		ch = rr.waitCh
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	rr.mu.Unlock()
 | 
					 | 
				
			||||||
	for {
 | 
					 | 
				
			||||||
		select {
 | 
					 | 
				
			||||||
		case <-ctx.Done():
 | 
					 | 
				
			||||||
			err = ctx.Err()
 | 
					 | 
				
			||||||
			return
 | 
					 | 
				
			||||||
		case <-ch:
 | 
					 | 
				
			||||||
			rr.mu.Lock()
 | 
					 | 
				
			||||||
			if rr.done {
 | 
					 | 
				
			||||||
				rr.mu.Unlock()
 | 
					 | 
				
			||||||
				err = ErrClientConnClosing
 | 
					 | 
				
			||||||
				return
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			if len(rr.addrs) > 0 {
 | 
					 | 
				
			||||||
				if rr.next >= len(rr.addrs) {
 | 
					 | 
				
			||||||
					rr.next = 0
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				next := rr.next
 | 
					 | 
				
			||||||
				for {
 | 
					 | 
				
			||||||
					a := rr.addrs[next]
 | 
					 | 
				
			||||||
					next = (next + 1) % len(rr.addrs)
 | 
					 | 
				
			||||||
					if a.connected {
 | 
					 | 
				
			||||||
						addr = a.addr
 | 
					 | 
				
			||||||
						rr.next = next
 | 
					 | 
				
			||||||
						rr.mu.Unlock()
 | 
					 | 
				
			||||||
						return
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					if next == rr.next {
 | 
					 | 
				
			||||||
						// Has iterated all the possible address but none is connected.
 | 
					 | 
				
			||||||
						break
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			// The newly added addr got removed by Down() again.
 | 
					 | 
				
			||||||
			if rr.waitCh == nil {
 | 
					 | 
				
			||||||
				ch = make(chan struct{})
 | 
					 | 
				
			||||||
				rr.waitCh = ch
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				ch = rr.waitCh
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			rr.mu.Unlock()
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (rr *roundRobin) Notify() <-chan []Address {
 | 
					 | 
				
			||||||
	return rr.addrCh
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (rr *roundRobin) Close() error {
 | 
					 | 
				
			||||||
	rr.mu.Lock()
 | 
					 | 
				
			||||||
	defer rr.mu.Unlock()
 | 
					 | 
				
			||||||
	if rr.done {
 | 
					 | 
				
			||||||
		return errBalancerClosed
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	rr.done = true
 | 
					 | 
				
			||||||
	if rr.w != nil {
 | 
					 | 
				
			||||||
		rr.w.Close()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if rr.waitCh != nil {
 | 
					 | 
				
			||||||
		close(rr.waitCh)
 | 
					 | 
				
			||||||
		rr.waitCh = nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if rr.addrCh != nil {
 | 
					 | 
				
			||||||
		close(rr.addrCh)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// pickFirst is used to test multi-addresses in one addrConn in which all addresses share the same addrConn.
 | 
					 | 
				
			||||||
// It is a wrapper around roundRobin balancer. The logic of all methods works fine because balancer.Get()
 | 
					 | 
				
			||||||
// returns the only address Up by resetTransport().
 | 
					 | 
				
			||||||
type pickFirst struct {
 | 
					 | 
				
			||||||
	*roundRobin
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -111,6 +111,9 @@ type NewSubConnOptions struct {
 | 
				
			||||||
	// CredsBundle is the credentials bundle that will be used in the created
 | 
						// CredsBundle is the credentials bundle that will be used in the created
 | 
				
			||||||
	// SubConn. If it's nil, the original creds from grpc DialOptions will be
 | 
						// SubConn. If it's nil, the original creds from grpc DialOptions will be
 | 
				
			||||||
	// used.
 | 
						// used.
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// Deprecated: Use the Attributes field in resolver.Address to pass
 | 
				
			||||||
 | 
						// arbitrary data to the credential handshaker.
 | 
				
			||||||
	CredsBundle credentials.Bundle
 | 
						CredsBundle credentials.Bundle
 | 
				
			||||||
	// HealthCheckEnabled indicates whether health check service should be
 | 
						// HealthCheckEnabled indicates whether health check service should be
 | 
				
			||||||
	// enabled on this SubConn
 | 
						// enabled on this SubConn
 | 
				
			||||||
| 
						 | 
					@ -123,7 +126,7 @@ type State struct {
 | 
				
			||||||
	// determine the state of the ClientConn.
 | 
						// determine the state of the ClientConn.
 | 
				
			||||||
	ConnectivityState connectivity.State
 | 
						ConnectivityState connectivity.State
 | 
				
			||||||
	// Picker is used to choose connections (SubConns) for RPCs.
 | 
						// Picker is used to choose connections (SubConns) for RPCs.
 | 
				
			||||||
	Picker V2Picker
 | 
						Picker Picker
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ClientConn represents a gRPC ClientConn.
 | 
					// ClientConn represents a gRPC ClientConn.
 | 
				
			||||||
| 
						 | 
					@ -141,20 +144,11 @@ type ClientConn interface {
 | 
				
			||||||
	// The SubConn will be shutdown.
 | 
						// The SubConn will be shutdown.
 | 
				
			||||||
	RemoveSubConn(SubConn)
 | 
						RemoveSubConn(SubConn)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// UpdateBalancerState is called by balancer to notify gRPC that some internal
 | 
					 | 
				
			||||||
	// state in balancer has changed.
 | 
					 | 
				
			||||||
	//
 | 
					 | 
				
			||||||
	// gRPC will update the connectivity state of the ClientConn, and will call pick
 | 
					 | 
				
			||||||
	// on the new picker to pick new SubConn.
 | 
					 | 
				
			||||||
	//
 | 
					 | 
				
			||||||
	// Deprecated: use UpdateState instead
 | 
					 | 
				
			||||||
	UpdateBalancerState(s connectivity.State, p Picker)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// UpdateState notifies gRPC that the balancer's internal state has
 | 
						// UpdateState notifies gRPC that the balancer's internal state has
 | 
				
			||||||
	// changed.
 | 
						// changed.
 | 
				
			||||||
	//
 | 
						//
 | 
				
			||||||
	// gRPC will update the connectivity state of the ClientConn, and will call pick
 | 
						// gRPC will update the connectivity state of the ClientConn, and will call
 | 
				
			||||||
	// on the new picker to pick new SubConns.
 | 
						// Pick on the new Picker to pick new SubConns.
 | 
				
			||||||
	UpdateState(State)
 | 
						UpdateState(State)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// ResolveNow is called by balancer to notify gRPC to do a name resolving.
 | 
						// ResolveNow is called by balancer to notify gRPC to do a name resolving.
 | 
				
			||||||
| 
						 | 
					@ -180,6 +174,10 @@ type BuildOptions struct {
 | 
				
			||||||
	Dialer func(context.Context, string) (net.Conn, error)
 | 
						Dialer func(context.Context, string) (net.Conn, error)
 | 
				
			||||||
	// ChannelzParentID is the entity parent's channelz unique identification number.
 | 
						// ChannelzParentID is the entity parent's channelz unique identification number.
 | 
				
			||||||
	ChannelzParentID int64
 | 
						ChannelzParentID int64
 | 
				
			||||||
 | 
						// CustomUserAgent is the custom user agent set on the parent ClientConn.
 | 
				
			||||||
 | 
						// The balancer should set the same custom user agent if it creates a
 | 
				
			||||||
 | 
						// ClientConn.
 | 
				
			||||||
 | 
						CustomUserAgent string
 | 
				
			||||||
	// Target contains the parsed address info of the dial target. It is the same resolver.Target as
 | 
						// Target contains the parsed address info of the dial target. It is the same resolver.Target as
 | 
				
			||||||
	// passed to the resolver.
 | 
						// passed to the resolver.
 | 
				
			||||||
	// See the documentation for the resolver.Target type for details about what it contains.
 | 
						// See the documentation for the resolver.Target type for details about what it contains.
 | 
				
			||||||
| 
						 | 
					@ -232,56 +230,17 @@ type DoneInfo struct {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
	// ErrNoSubConnAvailable indicates no SubConn is available for pick().
 | 
						// ErrNoSubConnAvailable indicates no SubConn is available for pick().
 | 
				
			||||||
	// gRPC will block the RPC until a new picker is available via UpdateBalancerState().
 | 
						// gRPC will block the RPC until a new picker is available via UpdateState().
 | 
				
			||||||
	ErrNoSubConnAvailable = errors.New("no SubConn is available")
 | 
						ErrNoSubConnAvailable = errors.New("no SubConn is available")
 | 
				
			||||||
	// ErrTransientFailure indicates all SubConns are in TransientFailure.
 | 
						// ErrTransientFailure indicates all SubConns are in TransientFailure.
 | 
				
			||||||
	// WaitForReady RPCs will block, non-WaitForReady RPCs will fail.
 | 
						// WaitForReady RPCs will block, non-WaitForReady RPCs will fail.
 | 
				
			||||||
	ErrTransientFailure = TransientFailureError(errors.New("all SubConns are in TransientFailure"))
 | 
						//
 | 
				
			||||||
 | 
						// Deprecated: return an appropriate error based on the last resolution or
 | 
				
			||||||
 | 
						// connection attempt instead.  The behavior is the same for any non-gRPC
 | 
				
			||||||
 | 
						// status error.
 | 
				
			||||||
 | 
						ErrTransientFailure = errors.New("all SubConns are in TransientFailure")
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Picker is used by gRPC to pick a SubConn to send an RPC.
 | 
					 | 
				
			||||||
// Balancer is expected to generate a new picker from its snapshot every time its
 | 
					 | 
				
			||||||
// internal state has changed.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// The pickers used by gRPC can be updated by ClientConn.UpdateBalancerState().
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Deprecated: use V2Picker instead
 | 
					 | 
				
			||||||
type Picker interface {
 | 
					 | 
				
			||||||
	// Pick returns the SubConn to be used to send the RPC.
 | 
					 | 
				
			||||||
	// The returned SubConn must be one returned by NewSubConn().
 | 
					 | 
				
			||||||
	//
 | 
					 | 
				
			||||||
	// This functions is expected to return:
 | 
					 | 
				
			||||||
	// - a SubConn that is known to be READY;
 | 
					 | 
				
			||||||
	// - ErrNoSubConnAvailable if no SubConn is available, but progress is being
 | 
					 | 
				
			||||||
	//   made (for example, some SubConn is in CONNECTING mode);
 | 
					 | 
				
			||||||
	// - other errors if no active connecting is happening (for example, all SubConn
 | 
					 | 
				
			||||||
	//   are in TRANSIENT_FAILURE mode).
 | 
					 | 
				
			||||||
	//
 | 
					 | 
				
			||||||
	// If a SubConn is returned:
 | 
					 | 
				
			||||||
	// - If it is READY, gRPC will send the RPC on it;
 | 
					 | 
				
			||||||
	// - If it is not ready, or becomes not ready after it's returned, gRPC will
 | 
					 | 
				
			||||||
	//   block until UpdateBalancerState() is called and will call pick on the
 | 
					 | 
				
			||||||
	//   new picker. The done function returned from Pick(), if not nil, will be
 | 
					 | 
				
			||||||
	//   called with nil error, no bytes sent and no bytes received.
 | 
					 | 
				
			||||||
	//
 | 
					 | 
				
			||||||
	// If the returned error is not nil:
 | 
					 | 
				
			||||||
	// - If the error is ErrNoSubConnAvailable, gRPC will block until UpdateBalancerState()
 | 
					 | 
				
			||||||
	// - If the error is ErrTransientFailure or implements IsTransientFailure()
 | 
					 | 
				
			||||||
	//   bool, returning true:
 | 
					 | 
				
			||||||
	//   - If the RPC is wait-for-ready, gRPC will block until UpdateBalancerState()
 | 
					 | 
				
			||||||
	//     is called to pick again;
 | 
					 | 
				
			||||||
	//   - Otherwise, RPC will fail with unavailable error.
 | 
					 | 
				
			||||||
	// - Else (error is other non-nil error):
 | 
					 | 
				
			||||||
	//   - The RPC will fail with the error's status code, or Unknown if it is
 | 
					 | 
				
			||||||
	//     not a status error.
 | 
					 | 
				
			||||||
	//
 | 
					 | 
				
			||||||
	// The returned done() function will be called once the rpc has finished,
 | 
					 | 
				
			||||||
	// with the final status of that RPC.  If the SubConn returned is not a
 | 
					 | 
				
			||||||
	// valid SubConn type, done may not be called.  done may be nil if balancer
 | 
					 | 
				
			||||||
	// doesn't care about the RPC status.
 | 
					 | 
				
			||||||
	Pick(ctx context.Context, info PickInfo) (conn SubConn, done func(DoneInfo), err error)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// PickResult contains information related to a connection chosen for an RPC.
 | 
					// PickResult contains information related to a connection chosen for an RPC.
 | 
				
			||||||
type PickResult struct {
 | 
					type PickResult struct {
 | 
				
			||||||
	// SubConn is the connection to use for this pick, if its state is Ready.
 | 
						// SubConn is the connection to use for this pick, if its state is Ready.
 | 
				
			||||||
| 
						 | 
					@ -297,24 +256,19 @@ type PickResult struct {
 | 
				
			||||||
	Done func(DoneInfo)
 | 
						Done func(DoneInfo)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type transientFailureError struct {
 | 
					// TransientFailureError returns e.  It exists for backward compatibility and
 | 
				
			||||||
	error
 | 
					// will be deleted soon.
 | 
				
			||||||
}
 | 
					//
 | 
				
			||||||
 | 
					// Deprecated: no longer necessary, picker errors are treated this way by
 | 
				
			||||||
 | 
					// default.
 | 
				
			||||||
 | 
					func TransientFailureError(e error) error { return e }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (e *transientFailureError) IsTransientFailure() bool { return true }
 | 
					// Picker is used by gRPC to pick a SubConn to send an RPC.
 | 
				
			||||||
 | 
					 | 
				
			||||||
// TransientFailureError wraps err in an error implementing
 | 
					 | 
				
			||||||
// IsTransientFailure() bool, returning true.
 | 
					 | 
				
			||||||
func TransientFailureError(err error) error {
 | 
					 | 
				
			||||||
	return &transientFailureError{error: err}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// V2Picker is used by gRPC to pick a SubConn to send an RPC.
 | 
					 | 
				
			||||||
// Balancer is expected to generate a new picker from its snapshot every time its
 | 
					// Balancer is expected to generate a new picker from its snapshot every time its
 | 
				
			||||||
// internal state has changed.
 | 
					// internal state has changed.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// The pickers used by gRPC can be updated by ClientConn.UpdateBalancerState().
 | 
					// The pickers used by gRPC can be updated by ClientConn.UpdateState().
 | 
				
			||||||
type V2Picker interface {
 | 
					type Picker interface {
 | 
				
			||||||
	// Pick returns the connection to use for this RPC and related information.
 | 
						// Pick returns the connection to use for this RPC and related information.
 | 
				
			||||||
	//
 | 
						//
 | 
				
			||||||
	// Pick should not block.  If the balancer needs to do I/O or any blocking
 | 
						// Pick should not block.  If the balancer needs to do I/O or any blocking
 | 
				
			||||||
| 
						 | 
					@ -327,14 +281,13 @@ type V2Picker interface {
 | 
				
			||||||
	// - If the error is ErrNoSubConnAvailable, gRPC will block until a new
 | 
						// - If the error is ErrNoSubConnAvailable, gRPC will block until a new
 | 
				
			||||||
	//   Picker is provided by the balancer (using ClientConn.UpdateState).
 | 
						//   Picker is provided by the balancer (using ClientConn.UpdateState).
 | 
				
			||||||
	//
 | 
						//
 | 
				
			||||||
	// - If the error implements IsTransientFailure() bool, returning true,
 | 
						// - If the error is a status error (implemented by the grpc/status
 | 
				
			||||||
	//   wait for ready RPCs will wait, but non-wait for ready RPCs will be
 | 
						//   package), gRPC will terminate the RPC with the code and message
 | 
				
			||||||
	//   terminated with this error's Error() string and status code
 | 
						//   provided.
 | 
				
			||||||
	//   Unavailable.
 | 
					 | 
				
			||||||
	//
 | 
						//
 | 
				
			||||||
	// - Any other errors terminate all RPCs with the code and message
 | 
						// - For all other errors, wait for ready RPCs will wait, but non-wait for
 | 
				
			||||||
	//   provided.  If the error is not a status error, it will be converted by
 | 
						//   ready RPCs will be terminated with this error's Error() string and
 | 
				
			||||||
	//   gRPC to a status error with code Unknown.
 | 
						//   status code Unavailable.
 | 
				
			||||||
	Pick(info PickInfo) (PickResult, error)
 | 
						Pick(info PickInfo) (PickResult, error)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -343,29 +296,21 @@ type V2Picker interface {
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// It also generates and updates the Picker used by gRPC to pick SubConns for RPCs.
 | 
					// It also generates and updates the Picker used by gRPC to pick SubConns for RPCs.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// HandleSubConnectionStateChange, HandleResolvedAddrs and Close are guaranteed
 | 
					// UpdateClientConnState, ResolverError, UpdateSubConnState, and Close are
 | 
				
			||||||
// to be called synchronously from the same goroutine.
 | 
					// guaranteed to be called synchronously from the same goroutine.  There's no
 | 
				
			||||||
// There's no guarantee on picker.Pick, it may be called anytime.
 | 
					// guarantee on picker.Pick, it may be called anytime.
 | 
				
			||||||
type Balancer interface {
 | 
					type Balancer interface {
 | 
				
			||||||
	// HandleSubConnStateChange is called by gRPC when the connectivity state
 | 
						// UpdateClientConnState is called by gRPC when the state of the ClientConn
 | 
				
			||||||
	// of sc has changed.
 | 
						// changes.  If the error returned is ErrBadResolverState, the ClientConn
 | 
				
			||||||
	// Balancer is expected to aggregate all the state of SubConn and report
 | 
						// will begin calling ResolveNow on the active name resolver with
 | 
				
			||||||
	// that back to gRPC.
 | 
						// exponential backoff until a subsequent call to UpdateClientConnState
 | 
				
			||||||
	// Balancer should also generate and update Pickers when its internal state has
 | 
						// returns a nil error.  Any other errors are currently ignored.
 | 
				
			||||||
	// been changed by the new state.
 | 
						UpdateClientConnState(ClientConnState) error
 | 
				
			||||||
	//
 | 
						// ResolverError is called by gRPC when the name resolver reports an error.
 | 
				
			||||||
	// Deprecated: if V2Balancer is implemented by the Balancer,
 | 
						ResolverError(error)
 | 
				
			||||||
	// UpdateSubConnState will be called instead.
 | 
						// UpdateSubConnState is called by gRPC when the state of a SubConn
 | 
				
			||||||
	HandleSubConnStateChange(sc SubConn, state connectivity.State)
 | 
						// changes.
 | 
				
			||||||
	// HandleResolvedAddrs is called by gRPC to send updated resolved addresses to
 | 
						UpdateSubConnState(SubConn, SubConnState)
 | 
				
			||||||
	// balancers.
 | 
					 | 
				
			||||||
	// Balancer can create new SubConn or remove SubConn with the addresses.
 | 
					 | 
				
			||||||
	// An empty address slice and a non-nil error will be passed if the resolver returns
 | 
					 | 
				
			||||||
	// non-nil error to gRPC.
 | 
					 | 
				
			||||||
	//
 | 
					 | 
				
			||||||
	// Deprecated: if V2Balancer is implemented by the Balancer,
 | 
					 | 
				
			||||||
	// UpdateClientConnState will be called instead.
 | 
					 | 
				
			||||||
	HandleResolvedAddrs([]resolver.Address, error)
 | 
					 | 
				
			||||||
	// Close closes the balancer. The balancer is not required to call
 | 
						// Close closes the balancer. The balancer is not required to call
 | 
				
			||||||
	// ClientConn.RemoveSubConn for its existing SubConns.
 | 
						// ClientConn.RemoveSubConn for its existing SubConns.
 | 
				
			||||||
	Close()
 | 
						Close()
 | 
				
			||||||
| 
						 | 
					@ -393,27 +338,6 @@ type ClientConnState struct {
 | 
				
			||||||
// problem with the provided name resolver data.
 | 
					// problem with the provided name resolver data.
 | 
				
			||||||
var ErrBadResolverState = errors.New("bad resolver state")
 | 
					var ErrBadResolverState = errors.New("bad resolver state")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// V2Balancer is defined for documentation purposes.  If a Balancer also
 | 
					 | 
				
			||||||
// implements V2Balancer, its UpdateClientConnState method will be called
 | 
					 | 
				
			||||||
// instead of HandleResolvedAddrs and its UpdateSubConnState will be called
 | 
					 | 
				
			||||||
// instead of HandleSubConnStateChange.
 | 
					 | 
				
			||||||
type V2Balancer interface {
 | 
					 | 
				
			||||||
	// UpdateClientConnState is called by gRPC when the state of the ClientConn
 | 
					 | 
				
			||||||
	// changes.  If the error returned is ErrBadResolverState, the ClientConn
 | 
					 | 
				
			||||||
	// will begin calling ResolveNow on the active name resolver with
 | 
					 | 
				
			||||||
	// exponential backoff until a subsequent call to UpdateClientConnState
 | 
					 | 
				
			||||||
	// returns a nil error.  Any other errors are currently ignored.
 | 
					 | 
				
			||||||
	UpdateClientConnState(ClientConnState) error
 | 
					 | 
				
			||||||
	// ResolverError is called by gRPC when the name resolver reports an error.
 | 
					 | 
				
			||||||
	ResolverError(error)
 | 
					 | 
				
			||||||
	// UpdateSubConnState is called by gRPC when the state of a SubConn
 | 
					 | 
				
			||||||
	// changes.
 | 
					 | 
				
			||||||
	UpdateSubConnState(SubConn, SubConnState)
 | 
					 | 
				
			||||||
	// Close closes the balancer. The balancer is not required to call
 | 
					 | 
				
			||||||
	// ClientConn.RemoveSubConn for its existing SubConns.
 | 
					 | 
				
			||||||
	Close()
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ConnectivityStateEvaluator takes the connectivity states of multiple SubConns
 | 
					// ConnectivityStateEvaluator takes the connectivity states of multiple SubConns
 | 
				
			||||||
// and returns one aggregated connectivity state.
 | 
					// and returns one aggregated connectivity state.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,7 +19,6 @@
 | 
				
			||||||
package base
 | 
					package base
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"context"
 | 
					 | 
				
			||||||
	"errors"
 | 
						"errors"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -29,18 +28,18 @@ import (
 | 
				
			||||||
	"google.golang.org/grpc/resolver"
 | 
						"google.golang.org/grpc/resolver"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var logger = grpclog.Component("balancer")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type baseBuilder struct {
 | 
					type baseBuilder struct {
 | 
				
			||||||
	name            string
 | 
						name          string
 | 
				
			||||||
	pickerBuilder   PickerBuilder
 | 
						pickerBuilder PickerBuilder
 | 
				
			||||||
	v2PickerBuilder V2PickerBuilder
 | 
						config        Config
 | 
				
			||||||
	config          Config
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (bb *baseBuilder) Build(cc balancer.ClientConn, opt balancer.BuildOptions) balancer.Balancer {
 | 
					func (bb *baseBuilder) Build(cc balancer.ClientConn, opt balancer.BuildOptions) balancer.Balancer {
 | 
				
			||||||
	bal := &baseBalancer{
 | 
						bal := &baseBalancer{
 | 
				
			||||||
		cc:              cc,
 | 
							cc:            cc,
 | 
				
			||||||
		pickerBuilder:   bb.pickerBuilder,
 | 
							pickerBuilder: bb.pickerBuilder,
 | 
				
			||||||
		v2PickerBuilder: bb.v2PickerBuilder,
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		subConns: make(map[resolver.Address]balancer.SubConn),
 | 
							subConns: make(map[resolver.Address]balancer.SubConn),
 | 
				
			||||||
		scStates: make(map[balancer.SubConn]connectivity.State),
 | 
							scStates: make(map[balancer.SubConn]connectivity.State),
 | 
				
			||||||
| 
						 | 
					@ -50,11 +49,7 @@ func (bb *baseBuilder) Build(cc balancer.ClientConn, opt balancer.BuildOptions)
 | 
				
			||||||
	// Initialize picker to a picker that always returns
 | 
						// Initialize picker to a picker that always returns
 | 
				
			||||||
	// ErrNoSubConnAvailable, because when state of a SubConn changes, we
 | 
						// ErrNoSubConnAvailable, because when state of a SubConn changes, we
 | 
				
			||||||
	// may call UpdateState with this picker.
 | 
						// may call UpdateState with this picker.
 | 
				
			||||||
	if bb.pickerBuilder != nil {
 | 
						bal.picker = NewErrPicker(balancer.ErrNoSubConnAvailable)
 | 
				
			||||||
		bal.picker = NewErrPicker(balancer.ErrNoSubConnAvailable)
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		bal.v2Picker = NewErrPickerV2(balancer.ErrNoSubConnAvailable)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return bal
 | 
						return bal
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -62,73 +57,85 @@ func (bb *baseBuilder) Name() string {
 | 
				
			||||||
	return bb.name
 | 
						return bb.name
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var _ balancer.V2Balancer = (*baseBalancer)(nil) // Assert that we implement V2Balancer
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type baseBalancer struct {
 | 
					type baseBalancer struct {
 | 
				
			||||||
	cc              balancer.ClientConn
 | 
						cc            balancer.ClientConn
 | 
				
			||||||
	pickerBuilder   PickerBuilder
 | 
						pickerBuilder PickerBuilder
 | 
				
			||||||
	v2PickerBuilder V2PickerBuilder
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	csEvltr *balancer.ConnectivityStateEvaluator
 | 
						csEvltr *balancer.ConnectivityStateEvaluator
 | 
				
			||||||
	state   connectivity.State
 | 
						state   connectivity.State
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	subConns map[resolver.Address]balancer.SubConn
 | 
						subConns map[resolver.Address]balancer.SubConn // `attributes` is stripped from the keys of this map (the addresses)
 | 
				
			||||||
	scStates map[balancer.SubConn]connectivity.State
 | 
						scStates map[balancer.SubConn]connectivity.State
 | 
				
			||||||
	picker   balancer.Picker
 | 
						picker   balancer.Picker
 | 
				
			||||||
	v2Picker balancer.V2Picker
 | 
					 | 
				
			||||||
	config   Config
 | 
						config   Config
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	resolverErr error // the last error reported by the resolver; cleared on successful resolution
 | 
						resolverErr error // the last error reported by the resolver; cleared on successful resolution
 | 
				
			||||||
	connErr     error // the last connection error; cleared upon leaving TransientFailure
 | 
						connErr     error // the last connection error; cleared upon leaving TransientFailure
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (b *baseBalancer) HandleResolvedAddrs(addrs []resolver.Address, err error) {
 | 
					 | 
				
			||||||
	panic("not implemented")
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (b *baseBalancer) ResolverError(err error) {
 | 
					func (b *baseBalancer) ResolverError(err error) {
 | 
				
			||||||
	b.resolverErr = err
 | 
						b.resolverErr = err
 | 
				
			||||||
	if len(b.subConns) == 0 {
 | 
						if len(b.subConns) == 0 {
 | 
				
			||||||
		b.state = connectivity.TransientFailure
 | 
							b.state = connectivity.TransientFailure
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if b.state != connectivity.TransientFailure {
 | 
						if b.state != connectivity.TransientFailure {
 | 
				
			||||||
		// The picker will not change since the balancer does not currently
 | 
							// The picker will not change since the balancer does not currently
 | 
				
			||||||
		// report an error.
 | 
							// report an error.
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	b.regeneratePicker()
 | 
						b.regeneratePicker()
 | 
				
			||||||
	if b.picker != nil {
 | 
						b.cc.UpdateState(balancer.State{
 | 
				
			||||||
		b.cc.UpdateBalancerState(b.state, b.picker)
 | 
							ConnectivityState: b.state,
 | 
				
			||||||
	} else {
 | 
							Picker:            b.picker,
 | 
				
			||||||
		b.cc.UpdateState(balancer.State{
 | 
						})
 | 
				
			||||||
			ConnectivityState: b.state,
 | 
					 | 
				
			||||||
			Picker:            b.v2Picker,
 | 
					 | 
				
			||||||
		})
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (b *baseBalancer) UpdateClientConnState(s balancer.ClientConnState) error {
 | 
					func (b *baseBalancer) UpdateClientConnState(s balancer.ClientConnState) error {
 | 
				
			||||||
	// TODO: handle s.ResolverState.Err (log if not nil) once implemented.
 | 
					 | 
				
			||||||
	// TODO: handle s.ResolverState.ServiceConfig?
 | 
						// TODO: handle s.ResolverState.ServiceConfig?
 | 
				
			||||||
	if grpclog.V(2) {
 | 
						if logger.V(2) {
 | 
				
			||||||
		grpclog.Infoln("base.baseBalancer: got new ClientConn state: ", s)
 | 
							logger.Info("base.baseBalancer: got new ClientConn state: ", s)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// Successful resolution; clear resolver error and ensure we return nil.
 | 
						// Successful resolution; clear resolver error and ensure we return nil.
 | 
				
			||||||
	b.resolverErr = nil
 | 
						b.resolverErr = nil
 | 
				
			||||||
	// addrsSet is the set converted from addrs, it's used for quick lookup of an address.
 | 
						// addrsSet is the set converted from addrs, it's used for quick lookup of an address.
 | 
				
			||||||
	addrsSet := make(map[resolver.Address]struct{})
 | 
						addrsSet := make(map[resolver.Address]struct{})
 | 
				
			||||||
	for _, a := range s.ResolverState.Addresses {
 | 
						for _, a := range s.ResolverState.Addresses {
 | 
				
			||||||
		addrsSet[a] = struct{}{}
 | 
							// Strip attributes from addresses before using them as map keys. So
 | 
				
			||||||
		if _, ok := b.subConns[a]; !ok {
 | 
							// that when two addresses only differ in attributes pointers (but with
 | 
				
			||||||
 | 
							// the same attribute content), they are considered the same address.
 | 
				
			||||||
 | 
							//
 | 
				
			||||||
 | 
							// Note that this doesn't handle the case where the attribute content is
 | 
				
			||||||
 | 
							// different. So if users want to set different attributes to create
 | 
				
			||||||
 | 
							// duplicate connections to the same backend, it doesn't work. This is
 | 
				
			||||||
 | 
							// fine for now, because duplicate is done by setting Metadata today.
 | 
				
			||||||
 | 
							//
 | 
				
			||||||
 | 
							// TODO: read attributes to handle duplicate connections.
 | 
				
			||||||
 | 
							aNoAttrs := a
 | 
				
			||||||
 | 
							aNoAttrs.Attributes = nil
 | 
				
			||||||
 | 
							addrsSet[aNoAttrs] = struct{}{}
 | 
				
			||||||
 | 
							if sc, ok := b.subConns[aNoAttrs]; !ok {
 | 
				
			||||||
			// a is a new address (not existing in b.subConns).
 | 
								// a is a new address (not existing in b.subConns).
 | 
				
			||||||
 | 
								//
 | 
				
			||||||
 | 
								// When creating SubConn, the original address with attributes is
 | 
				
			||||||
 | 
								// passed through. So that connection configurations in attributes
 | 
				
			||||||
 | 
								// (like creds) will be used.
 | 
				
			||||||
			sc, err := b.cc.NewSubConn([]resolver.Address{a}, balancer.NewSubConnOptions{HealthCheckEnabled: b.config.HealthCheck})
 | 
								sc, err := b.cc.NewSubConn([]resolver.Address{a}, balancer.NewSubConnOptions{HealthCheckEnabled: b.config.HealthCheck})
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				grpclog.Warningf("base.baseBalancer: failed to create new SubConn: %v", err)
 | 
									logger.Warningf("base.baseBalancer: failed to create new SubConn: %v", err)
 | 
				
			||||||
				continue
 | 
									continue
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			b.subConns[a] = sc
 | 
								b.subConns[aNoAttrs] = sc
 | 
				
			||||||
			b.scStates[sc] = connectivity.Idle
 | 
								b.scStates[sc] = connectivity.Idle
 | 
				
			||||||
			sc.Connect()
 | 
								sc.Connect()
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								// Always update the subconn's address in case the attributes
 | 
				
			||||||
 | 
								// changed.
 | 
				
			||||||
 | 
								//
 | 
				
			||||||
 | 
								// The SubConn does a reflect.DeepEqual of the new and old
 | 
				
			||||||
 | 
								// addresses. So this is a noop if the current address is the same
 | 
				
			||||||
 | 
								// as the old one (including attributes).
 | 
				
			||||||
 | 
								sc.UpdateAddresses([]resolver.Address{a})
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	for a, sc := range b.subConns {
 | 
						for a, sc := range b.subConns {
 | 
				
			||||||
| 
						 | 
					@ -137,7 +144,7 @@ func (b *baseBalancer) UpdateClientConnState(s balancer.ClientConnState) error {
 | 
				
			||||||
			b.cc.RemoveSubConn(sc)
 | 
								b.cc.RemoveSubConn(sc)
 | 
				
			||||||
			delete(b.subConns, a)
 | 
								delete(b.subConns, a)
 | 
				
			||||||
			// Keep the state of this sc in b.scStates until sc's state becomes Shutdown.
 | 
								// Keep the state of this sc in b.scStates until sc's state becomes Shutdown.
 | 
				
			||||||
			// The entry will be deleted in HandleSubConnStateChange.
 | 
								// The entry will be deleted in UpdateSubConnState.
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// If resolver state contains no addresses, return an error so ClientConn
 | 
						// If resolver state contains no addresses, return an error so ClientConn
 | 
				
			||||||
| 
						 | 
					@ -171,49 +178,29 @@ func (b *baseBalancer) mergeErrors() error {
 | 
				
			||||||
//  - built by the pickerBuilder with all READY SubConns otherwise.
 | 
					//  - built by the pickerBuilder with all READY SubConns otherwise.
 | 
				
			||||||
func (b *baseBalancer) regeneratePicker() {
 | 
					func (b *baseBalancer) regeneratePicker() {
 | 
				
			||||||
	if b.state == connectivity.TransientFailure {
 | 
						if b.state == connectivity.TransientFailure {
 | 
				
			||||||
		if b.pickerBuilder != nil {
 | 
							b.picker = NewErrPicker(b.mergeErrors())
 | 
				
			||||||
			b.picker = NewErrPicker(balancer.ErrTransientFailure)
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			b.v2Picker = NewErrPickerV2(balancer.TransientFailureError(b.mergeErrors()))
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if b.pickerBuilder != nil {
 | 
						readySCs := make(map[balancer.SubConn]SubConnInfo)
 | 
				
			||||||
		readySCs := make(map[resolver.Address]balancer.SubConn)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Filter out all ready SCs from full subConn map.
 | 
						// Filter out all ready SCs from full subConn map.
 | 
				
			||||||
		for addr, sc := range b.subConns {
 | 
						for addr, sc := range b.subConns {
 | 
				
			||||||
			if st, ok := b.scStates[sc]; ok && st == connectivity.Ready {
 | 
							if st, ok := b.scStates[sc]; ok && st == connectivity.Ready {
 | 
				
			||||||
				readySCs[addr] = sc
 | 
								readySCs[sc] = SubConnInfo{Address: addr}
 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		b.picker = b.pickerBuilder.Build(readySCs)
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		readySCs := make(map[balancer.SubConn]SubConnInfo)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Filter out all ready SCs from full subConn map.
 | 
					 | 
				
			||||||
		for addr, sc := range b.subConns {
 | 
					 | 
				
			||||||
			if st, ok := b.scStates[sc]; ok && st == connectivity.Ready {
 | 
					 | 
				
			||||||
				readySCs[sc] = SubConnInfo{Address: addr}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		b.v2Picker = b.v2PickerBuilder.Build(PickerBuildInfo{ReadySCs: readySCs})
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
						b.picker = b.pickerBuilder.Build(PickerBuildInfo{ReadySCs: readySCs})
 | 
				
			||||||
 | 
					 | 
				
			||||||
func (b *baseBalancer) HandleSubConnStateChange(sc balancer.SubConn, s connectivity.State) {
 | 
					 | 
				
			||||||
	panic("not implemented")
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (b *baseBalancer) UpdateSubConnState(sc balancer.SubConn, state balancer.SubConnState) {
 | 
					func (b *baseBalancer) UpdateSubConnState(sc balancer.SubConn, state balancer.SubConnState) {
 | 
				
			||||||
	s := state.ConnectivityState
 | 
						s := state.ConnectivityState
 | 
				
			||||||
	if grpclog.V(2) {
 | 
						if logger.V(2) {
 | 
				
			||||||
		grpclog.Infof("base.baseBalancer: handle SubConn state change: %p, %v", sc, s)
 | 
							logger.Infof("base.baseBalancer: handle SubConn state change: %p, %v", sc, s)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	oldS, ok := b.scStates[sc]
 | 
						oldS, ok := b.scStates[sc]
 | 
				
			||||||
	if !ok {
 | 
						if !ok {
 | 
				
			||||||
		if grpclog.V(2) {
 | 
							if logger.V(2) {
 | 
				
			||||||
			grpclog.Infof("base.baseBalancer: got state changes for an unknown SubConn: %p, %v", sc, s)
 | 
								logger.Infof("base.baseBalancer: got state changes for an unknown SubConn: %p, %v", sc, s)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -247,11 +234,7 @@ func (b *baseBalancer) UpdateSubConnState(sc balancer.SubConn, state balancer.Su
 | 
				
			||||||
		b.regeneratePicker()
 | 
							b.regeneratePicker()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if b.picker != nil {
 | 
						b.cc.UpdateState(balancer.State{ConnectivityState: b.state, Picker: b.picker})
 | 
				
			||||||
		b.cc.UpdateBalancerState(b.state, b.picker)
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		b.cc.UpdateState(balancer.State{ConnectivityState: b.state, Picker: b.v2Picker})
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Close is a nop because base balancer doesn't have internal state to clean up,
 | 
					// Close is a nop because base balancer doesn't have internal state to clean up,
 | 
				
			||||||
| 
						 | 
					@ -259,28 +242,20 @@ func (b *baseBalancer) UpdateSubConnState(sc balancer.SubConn, state balancer.Su
 | 
				
			||||||
func (b *baseBalancer) Close() {
 | 
					func (b *baseBalancer) Close() {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewErrPicker returns a picker that always returns err on Pick().
 | 
					// NewErrPicker returns a Picker that always returns err on Pick().
 | 
				
			||||||
func NewErrPicker(err error) balancer.Picker {
 | 
					func NewErrPicker(err error) balancer.Picker {
 | 
				
			||||||
	return &errPicker{err: err}
 | 
						return &errPicker{err: err}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NewErrPickerV2 is temporarily defined for backward compatibility reasons.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Deprecated: use NewErrPicker instead.
 | 
				
			||||||
 | 
					var NewErrPickerV2 = NewErrPicker
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type errPicker struct {
 | 
					type errPicker struct {
 | 
				
			||||||
	err error // Pick() always returns this err.
 | 
						err error // Pick() always returns this err.
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (p *errPicker) Pick(context.Context, balancer.PickInfo) (balancer.SubConn, func(balancer.DoneInfo), error) {
 | 
					func (p *errPicker) Pick(info balancer.PickInfo) (balancer.PickResult, error) {
 | 
				
			||||||
	return nil, nil, p.err
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// NewErrPickerV2 returns a V2Picker that always returns err on Pick().
 | 
					 | 
				
			||||||
func NewErrPickerV2(err error) balancer.V2Picker {
 | 
					 | 
				
			||||||
	return &errPickerV2{err: err}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type errPickerV2 struct {
 | 
					 | 
				
			||||||
	err error // Pick() always returns this err.
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (p *errPickerV2) Pick(info balancer.PickInfo) (balancer.PickResult, error) {
 | 
					 | 
				
			||||||
	return balancer.PickResult{}, p.err
 | 
						return balancer.PickResult{}, p.err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -37,15 +37,8 @@ import (
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// PickerBuilder creates balancer.Picker.
 | 
					// PickerBuilder creates balancer.Picker.
 | 
				
			||||||
type PickerBuilder interface {
 | 
					type PickerBuilder interface {
 | 
				
			||||||
	// Build takes a slice of ready SubConns, and returns a picker that will be
 | 
					 | 
				
			||||||
	// used by gRPC to pick a SubConn.
 | 
					 | 
				
			||||||
	Build(readySCs map[resolver.Address]balancer.SubConn) balancer.Picker
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// V2PickerBuilder creates balancer.V2Picker.
 | 
					 | 
				
			||||||
type V2PickerBuilder interface {
 | 
					 | 
				
			||||||
	// Build returns a picker that will be used by gRPC to pick a SubConn.
 | 
						// Build returns a picker that will be used by gRPC to pick a SubConn.
 | 
				
			||||||
	Build(info PickerBuildInfo) balancer.V2Picker
 | 
						Build(info PickerBuildInfo) balancer.Picker
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// PickerBuildInfo contains information needed by the picker builder to
 | 
					// PickerBuildInfo contains information needed by the picker builder to
 | 
				
			||||||
| 
						 | 
					@ -62,32 +55,17 @@ type SubConnInfo struct {
 | 
				
			||||||
	Address resolver.Address // the address used to create this SubConn
 | 
						Address resolver.Address // the address used to create this SubConn
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewBalancerBuilder returns a balancer builder. The balancers
 | 
					 | 
				
			||||||
// built by this builder will use the picker builder to build pickers.
 | 
					 | 
				
			||||||
func NewBalancerBuilder(name string, pb PickerBuilder) balancer.Builder {
 | 
					 | 
				
			||||||
	return NewBalancerBuilderWithConfig(name, pb, Config{})
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Config contains the config info about the base balancer builder.
 | 
					// Config contains the config info about the base balancer builder.
 | 
				
			||||||
type Config struct {
 | 
					type Config struct {
 | 
				
			||||||
	// HealthCheck indicates whether health checking should be enabled for this specific balancer.
 | 
						// HealthCheck indicates whether health checking should be enabled for this specific balancer.
 | 
				
			||||||
	HealthCheck bool
 | 
						HealthCheck bool
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewBalancerBuilderWithConfig returns a base balancer builder configured by the provided config.
 | 
					// NewBalancerBuilder returns a base balancer builder configured by the provided config.
 | 
				
			||||||
func NewBalancerBuilderWithConfig(name string, pb PickerBuilder, config Config) balancer.Builder {
 | 
					func NewBalancerBuilder(name string, pb PickerBuilder, config Config) balancer.Builder {
 | 
				
			||||||
	return &baseBuilder{
 | 
						return &baseBuilder{
 | 
				
			||||||
		name:          name,
 | 
							name:          name,
 | 
				
			||||||
		pickerBuilder: pb,
 | 
							pickerBuilder: pb,
 | 
				
			||||||
		config:        config,
 | 
							config:        config,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
// NewBalancerBuilderV2 returns a base balancer builder configured by the provided config.
 | 
					 | 
				
			||||||
func NewBalancerBuilderV2(name string, pb V2PickerBuilder, config Config) balancer.Builder {
 | 
					 | 
				
			||||||
	return &baseBuilder{
 | 
					 | 
				
			||||||
		name:            name,
 | 
					 | 
				
			||||||
		v2PickerBuilder: pb,
 | 
					 | 
				
			||||||
		config:          config,
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,51 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Copyright 2020 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 state declares grpclb types to be set by resolvers wishing to pass
 | 
				
			||||||
 | 
					// information to grpclb via resolver.State Attributes.
 | 
				
			||||||
 | 
					package state
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"google.golang.org/grpc/resolver"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// keyType is the key to use for storing State in Attributes.
 | 
				
			||||||
 | 
					type keyType string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const key = keyType("grpc.grpclb.state")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// State contains gRPCLB-relevant data passed from the name resolver.
 | 
				
			||||||
 | 
					type State struct {
 | 
				
			||||||
 | 
						// BalancerAddresses contains the remote load balancer address(es).  If
 | 
				
			||||||
 | 
						// set, overrides any resolver-provided addresses with Type of GRPCLB.
 | 
				
			||||||
 | 
						BalancerAddresses []resolver.Address
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Set returns a copy of the provided state with attributes containing s.  s's
 | 
				
			||||||
 | 
					// data should not be mutated after calling Set.
 | 
				
			||||||
 | 
					func Set(state resolver.State, s *State) resolver.State {
 | 
				
			||||||
 | 
						state.Attributes = state.Attributes.WithValues(key, s)
 | 
				
			||||||
 | 
						return state
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Get returns the grpclb State in the resolver.State, or nil if not present.
 | 
				
			||||||
 | 
					// The returned data should not be mutated.
 | 
				
			||||||
 | 
					func Get(state resolver.State) *State {
 | 
				
			||||||
 | 
						s, _ := state.Attributes.Value(key).(*State)
 | 
				
			||||||
 | 
						return s
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -33,9 +33,11 @@ import (
 | 
				
			||||||
// Name is the name of round_robin balancer.
 | 
					// Name is the name of round_robin balancer.
 | 
				
			||||||
const Name = "round_robin"
 | 
					const Name = "round_robin"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var logger = grpclog.Component("roundrobin")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// newBuilder creates a new roundrobin balancer builder.
 | 
					// newBuilder creates a new roundrobin balancer builder.
 | 
				
			||||||
func newBuilder() balancer.Builder {
 | 
					func newBuilder() balancer.Builder {
 | 
				
			||||||
	return base.NewBalancerBuilderV2(Name, &rrPickerBuilder{}, base.Config{HealthCheck: true})
 | 
						return base.NewBalancerBuilder(Name, &rrPickerBuilder{}, base.Config{HealthCheck: true})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func init() {
 | 
					func init() {
 | 
				
			||||||
| 
						 | 
					@ -44,10 +46,10 @@ func init() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type rrPickerBuilder struct{}
 | 
					type rrPickerBuilder struct{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (*rrPickerBuilder) Build(info base.PickerBuildInfo) balancer.V2Picker {
 | 
					func (*rrPickerBuilder) Build(info base.PickerBuildInfo) balancer.Picker {
 | 
				
			||||||
	grpclog.Infof("roundrobinPicker: newPicker called with info: %v", info)
 | 
						logger.Infof("roundrobinPicker: newPicker called with info: %v", info)
 | 
				
			||||||
	if len(info.ReadySCs) == 0 {
 | 
						if len(info.ReadySCs) == 0 {
 | 
				
			||||||
		return base.NewErrPickerV2(balancer.ErrNoSubConnAvailable)
 | 
							return base.NewErrPicker(balancer.ErrNoSubConnAvailable)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var scs []balancer.SubConn
 | 
						var scs []balancer.SubConn
 | 
				
			||||||
	for sc := range info.ReadySCs {
 | 
						for sc := range info.ReadySCs {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -74,11 +74,7 @@ func (ccb *ccBalancerWrapper) watcher() {
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			ccb.balancerMu.Lock()
 | 
								ccb.balancerMu.Lock()
 | 
				
			||||||
			su := t.(*scStateUpdate)
 | 
								su := t.(*scStateUpdate)
 | 
				
			||||||
			if ub, ok := ccb.balancer.(balancer.V2Balancer); ok {
 | 
								ccb.balancer.UpdateSubConnState(su.sc, balancer.SubConnState{ConnectivityState: su.state, ConnectionError: su.err})
 | 
				
			||||||
				ub.UpdateSubConnState(su.sc, balancer.SubConnState{ConnectivityState: su.state, ConnectionError: su.err})
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				ccb.balancer.HandleSubConnStateChange(su.sc, su.state)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			ccb.balancerMu.Unlock()
 | 
								ccb.balancerMu.Unlock()
 | 
				
			||||||
		case <-ccb.done.Done():
 | 
							case <-ccb.done.Done():
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -123,19 +119,13 @@ func (ccb *ccBalancerWrapper) handleSubConnStateChange(sc balancer.SubConn, s co
 | 
				
			||||||
func (ccb *ccBalancerWrapper) updateClientConnState(ccs *balancer.ClientConnState) error {
 | 
					func (ccb *ccBalancerWrapper) updateClientConnState(ccs *balancer.ClientConnState) error {
 | 
				
			||||||
	ccb.balancerMu.Lock()
 | 
						ccb.balancerMu.Lock()
 | 
				
			||||||
	defer ccb.balancerMu.Unlock()
 | 
						defer ccb.balancerMu.Unlock()
 | 
				
			||||||
	if ub, ok := ccb.balancer.(balancer.V2Balancer); ok {
 | 
						return ccb.balancer.UpdateClientConnState(*ccs)
 | 
				
			||||||
		return ub.UpdateClientConnState(*ccs)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	ccb.balancer.HandleResolvedAddrs(ccs.ResolverState.Addresses, nil)
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ccb *ccBalancerWrapper) resolverError(err error) {
 | 
					func (ccb *ccBalancerWrapper) resolverError(err error) {
 | 
				
			||||||
	if ub, ok := ccb.balancer.(balancer.V2Balancer); ok {
 | 
						ccb.balancerMu.Lock()
 | 
				
			||||||
		ccb.balancerMu.Lock()
 | 
						ccb.balancer.ResolverError(err)
 | 
				
			||||||
		ub.ResolverError(err)
 | 
						ccb.balancerMu.Unlock()
 | 
				
			||||||
		ccb.balancerMu.Unlock()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ccb *ccBalancerWrapper) NewSubConn(addrs []resolver.Address, opts balancer.NewSubConnOptions) (balancer.SubConn, error) {
 | 
					func (ccb *ccBalancerWrapper) NewSubConn(addrs []resolver.Address, opts balancer.NewSubConnOptions) (balancer.SubConn, error) {
 | 
				
			||||||
| 
						 | 
					@ -173,21 +163,6 @@ func (ccb *ccBalancerWrapper) RemoveSubConn(sc balancer.SubConn) {
 | 
				
			||||||
	ccb.cc.removeAddrConn(acbw.getAddrConn(), errConnDrain)
 | 
						ccb.cc.removeAddrConn(acbw.getAddrConn(), errConnDrain)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ccb *ccBalancerWrapper) UpdateBalancerState(s connectivity.State, p balancer.Picker) {
 | 
					 | 
				
			||||||
	ccb.mu.Lock()
 | 
					 | 
				
			||||||
	defer ccb.mu.Unlock()
 | 
					 | 
				
			||||||
	if ccb.subConns == nil {
 | 
					 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	// Update picker before updating state.  Even though the ordering here does
 | 
					 | 
				
			||||||
	// not matter, it can lead to multiple calls of Pick in the common start-up
 | 
					 | 
				
			||||||
	// case where we wait for ready and then perform an RPC.  If the picker is
 | 
					 | 
				
			||||||
	// updated later, we could call the "connecting" picker when the state is
 | 
					 | 
				
			||||||
	// updated, and then call the "ready" picker after the picker gets updated.
 | 
					 | 
				
			||||||
	ccb.cc.blockingpicker.updatePicker(p)
 | 
					 | 
				
			||||||
	ccb.cc.csMgr.updateState(s)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (ccb *ccBalancerWrapper) UpdateState(s balancer.State) {
 | 
					func (ccb *ccBalancerWrapper) UpdateState(s balancer.State) {
 | 
				
			||||||
	ccb.mu.Lock()
 | 
						ccb.mu.Lock()
 | 
				
			||||||
	defer ccb.mu.Unlock()
 | 
						defer ccb.mu.Unlock()
 | 
				
			||||||
| 
						 | 
					@ -199,7 +174,7 @@ func (ccb *ccBalancerWrapper) UpdateState(s balancer.State) {
 | 
				
			||||||
	// case where we wait for ready and then perform an RPC.  If the picker is
 | 
						// case where we wait for ready and then perform an RPC.  If the picker is
 | 
				
			||||||
	// updated later, we could call the "connecting" picker when the state is
 | 
						// updated later, we could call the "connecting" picker when the state is
 | 
				
			||||||
	// updated, and then call the "ready" picker after the picker gets updated.
 | 
						// updated, and then call the "ready" picker after the picker gets updated.
 | 
				
			||||||
	ccb.cc.blockingpicker.updatePickerV2(s.Picker)
 | 
						ccb.cc.blockingpicker.updatePicker(s.Picker)
 | 
				
			||||||
	ccb.cc.csMgr.updateState(s.ConnectivityState)
 | 
						ccb.cc.csMgr.updateState(s.ConnectivityState)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -245,7 +220,7 @@ func (acbw *acBalancerWrapper) UpdateAddresses(addrs []resolver.Address) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		ac, err := cc.newAddrConn(addrs, opts)
 | 
							ac, err := cc.newAddrConn(addrs, opts)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			channelz.Warningf(acbw.ac.channelzID, "acBalancerWrapper: UpdateAddresses: failed to newAddrConn: %v", err)
 | 
								channelz.Warningf(logger, acbw.ac.channelzID, "acBalancerWrapper: UpdateAddresses: failed to newAddrConn: %v", err)
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		acbw.ac = ac
 | 
							acbw.ac = ac
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,334 +0,0 @@
 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * Copyright 2017 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
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"sync"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"google.golang.org/grpc/balancer"
 | 
					 | 
				
			||||||
	"google.golang.org/grpc/connectivity"
 | 
					 | 
				
			||||||
	"google.golang.org/grpc/grpclog"
 | 
					 | 
				
			||||||
	"google.golang.org/grpc/resolver"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type balancerWrapperBuilder struct {
 | 
					 | 
				
			||||||
	b Balancer // The v1 balancer.
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (bwb *balancerWrapperBuilder) Build(cc balancer.ClientConn, opts balancer.BuildOptions) balancer.Balancer {
 | 
					 | 
				
			||||||
	bwb.b.Start(opts.Target.Endpoint, BalancerConfig{
 | 
					 | 
				
			||||||
		DialCreds: opts.DialCreds,
 | 
					 | 
				
			||||||
		Dialer:    opts.Dialer,
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
	_, pickfirst := bwb.b.(*pickFirst)
 | 
					 | 
				
			||||||
	bw := &balancerWrapper{
 | 
					 | 
				
			||||||
		balancer:   bwb.b,
 | 
					 | 
				
			||||||
		pickfirst:  pickfirst,
 | 
					 | 
				
			||||||
		cc:         cc,
 | 
					 | 
				
			||||||
		targetAddr: opts.Target.Endpoint,
 | 
					 | 
				
			||||||
		startCh:    make(chan struct{}),
 | 
					 | 
				
			||||||
		conns:      make(map[resolver.Address]balancer.SubConn),
 | 
					 | 
				
			||||||
		connSt:     make(map[balancer.SubConn]*scState),
 | 
					 | 
				
			||||||
		csEvltr:    &balancer.ConnectivityStateEvaluator{},
 | 
					 | 
				
			||||||
		state:      connectivity.Idle,
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	cc.UpdateState(balancer.State{ConnectivityState: connectivity.Idle, Picker: bw})
 | 
					 | 
				
			||||||
	go bw.lbWatcher()
 | 
					 | 
				
			||||||
	return bw
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (bwb *balancerWrapperBuilder) Name() string {
 | 
					 | 
				
			||||||
	return "wrapper"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type scState struct {
 | 
					 | 
				
			||||||
	addr Address // The v1 address type.
 | 
					 | 
				
			||||||
	s    connectivity.State
 | 
					 | 
				
			||||||
	down func(error)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type balancerWrapper struct {
 | 
					 | 
				
			||||||
	balancer  Balancer // The v1 balancer.
 | 
					 | 
				
			||||||
	pickfirst bool
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	cc         balancer.ClientConn
 | 
					 | 
				
			||||||
	targetAddr string // Target without the scheme.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	mu     sync.Mutex
 | 
					 | 
				
			||||||
	conns  map[resolver.Address]balancer.SubConn
 | 
					 | 
				
			||||||
	connSt map[balancer.SubConn]*scState
 | 
					 | 
				
			||||||
	// This channel is closed when handling the first resolver result.
 | 
					 | 
				
			||||||
	// lbWatcher blocks until this is closed, to avoid race between
 | 
					 | 
				
			||||||
	// - NewSubConn is created, cc wants to notify balancer of state changes;
 | 
					 | 
				
			||||||
	// - Build hasn't return, cc doesn't have access to balancer.
 | 
					 | 
				
			||||||
	startCh chan struct{}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// To aggregate the connectivity state.
 | 
					 | 
				
			||||||
	csEvltr *balancer.ConnectivityStateEvaluator
 | 
					 | 
				
			||||||
	state   connectivity.State
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// lbWatcher watches the Notify channel of the balancer and manages
 | 
					 | 
				
			||||||
// connections accordingly.
 | 
					 | 
				
			||||||
func (bw *balancerWrapper) lbWatcher() {
 | 
					 | 
				
			||||||
	<-bw.startCh
 | 
					 | 
				
			||||||
	notifyCh := bw.balancer.Notify()
 | 
					 | 
				
			||||||
	if notifyCh == nil {
 | 
					 | 
				
			||||||
		// There's no resolver in the balancer. Connect directly.
 | 
					 | 
				
			||||||
		a := resolver.Address{
 | 
					 | 
				
			||||||
			Addr: bw.targetAddr,
 | 
					 | 
				
			||||||
			Type: resolver.Backend,
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		sc, err := bw.cc.NewSubConn([]resolver.Address{a}, balancer.NewSubConnOptions{})
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			grpclog.Warningf("Error creating connection to %v. Err: %v", a, err)
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			bw.mu.Lock()
 | 
					 | 
				
			||||||
			bw.conns[a] = sc
 | 
					 | 
				
			||||||
			bw.connSt[sc] = &scState{
 | 
					 | 
				
			||||||
				addr: Address{Addr: bw.targetAddr},
 | 
					 | 
				
			||||||
				s:    connectivity.Idle,
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			bw.mu.Unlock()
 | 
					 | 
				
			||||||
			sc.Connect()
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	for addrs := range notifyCh {
 | 
					 | 
				
			||||||
		grpclog.Infof("balancerWrapper: got update addr from Notify: %v", addrs)
 | 
					 | 
				
			||||||
		if bw.pickfirst {
 | 
					 | 
				
			||||||
			var (
 | 
					 | 
				
			||||||
				oldA  resolver.Address
 | 
					 | 
				
			||||||
				oldSC balancer.SubConn
 | 
					 | 
				
			||||||
			)
 | 
					 | 
				
			||||||
			bw.mu.Lock()
 | 
					 | 
				
			||||||
			for oldA, oldSC = range bw.conns {
 | 
					 | 
				
			||||||
				break
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			bw.mu.Unlock()
 | 
					 | 
				
			||||||
			if len(addrs) <= 0 {
 | 
					 | 
				
			||||||
				if oldSC != nil {
 | 
					 | 
				
			||||||
					// Teardown old sc.
 | 
					 | 
				
			||||||
					bw.mu.Lock()
 | 
					 | 
				
			||||||
					delete(bw.conns, oldA)
 | 
					 | 
				
			||||||
					delete(bw.connSt, oldSC)
 | 
					 | 
				
			||||||
					bw.mu.Unlock()
 | 
					 | 
				
			||||||
					bw.cc.RemoveSubConn(oldSC)
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				continue
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			var newAddrs []resolver.Address
 | 
					 | 
				
			||||||
			for _, a := range addrs {
 | 
					 | 
				
			||||||
				newAddr := resolver.Address{
 | 
					 | 
				
			||||||
					Addr:       a.Addr,
 | 
					 | 
				
			||||||
					Type:       resolver.Backend, // All addresses from balancer are all backends.
 | 
					 | 
				
			||||||
					ServerName: "",
 | 
					 | 
				
			||||||
					Metadata:   a.Metadata,
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				newAddrs = append(newAddrs, newAddr)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if oldSC == nil {
 | 
					 | 
				
			||||||
				// Create new sc.
 | 
					 | 
				
			||||||
				sc, err := bw.cc.NewSubConn(newAddrs, balancer.NewSubConnOptions{})
 | 
					 | 
				
			||||||
				if err != nil {
 | 
					 | 
				
			||||||
					grpclog.Warningf("Error creating connection to %v. Err: %v", newAddrs, err)
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					bw.mu.Lock()
 | 
					 | 
				
			||||||
					// For pickfirst, there should be only one SubConn, so the
 | 
					 | 
				
			||||||
					// address doesn't matter. All states updating (up and down)
 | 
					 | 
				
			||||||
					// and picking should all happen on that only SubConn.
 | 
					 | 
				
			||||||
					bw.conns[resolver.Address{}] = sc
 | 
					 | 
				
			||||||
					bw.connSt[sc] = &scState{
 | 
					 | 
				
			||||||
						addr: addrs[0], // Use the first address.
 | 
					 | 
				
			||||||
						s:    connectivity.Idle,
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					bw.mu.Unlock()
 | 
					 | 
				
			||||||
					sc.Connect()
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				bw.mu.Lock()
 | 
					 | 
				
			||||||
				bw.connSt[oldSC].addr = addrs[0]
 | 
					 | 
				
			||||||
				bw.mu.Unlock()
 | 
					 | 
				
			||||||
				oldSC.UpdateAddresses(newAddrs)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			var (
 | 
					 | 
				
			||||||
				add []resolver.Address // Addresses need to setup connections.
 | 
					 | 
				
			||||||
				del []balancer.SubConn // Connections need to tear down.
 | 
					 | 
				
			||||||
			)
 | 
					 | 
				
			||||||
			resAddrs := make(map[resolver.Address]Address)
 | 
					 | 
				
			||||||
			for _, a := range addrs {
 | 
					 | 
				
			||||||
				resAddrs[resolver.Address{
 | 
					 | 
				
			||||||
					Addr:       a.Addr,
 | 
					 | 
				
			||||||
					Type:       resolver.Backend, // All addresses from balancer are all backends.
 | 
					 | 
				
			||||||
					ServerName: "",
 | 
					 | 
				
			||||||
					Metadata:   a.Metadata,
 | 
					 | 
				
			||||||
				}] = a
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			bw.mu.Lock()
 | 
					 | 
				
			||||||
			for a := range resAddrs {
 | 
					 | 
				
			||||||
				if _, ok := bw.conns[a]; !ok {
 | 
					 | 
				
			||||||
					add = append(add, a)
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			for a, c := range bw.conns {
 | 
					 | 
				
			||||||
				if _, ok := resAddrs[a]; !ok {
 | 
					 | 
				
			||||||
					del = append(del, c)
 | 
					 | 
				
			||||||
					delete(bw.conns, a)
 | 
					 | 
				
			||||||
					// Keep the state of this sc in bw.connSt until its state becomes Shutdown.
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			bw.mu.Unlock()
 | 
					 | 
				
			||||||
			for _, a := range add {
 | 
					 | 
				
			||||||
				sc, err := bw.cc.NewSubConn([]resolver.Address{a}, balancer.NewSubConnOptions{})
 | 
					 | 
				
			||||||
				if err != nil {
 | 
					 | 
				
			||||||
					grpclog.Warningf("Error creating connection to %v. Err: %v", a, err)
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					bw.mu.Lock()
 | 
					 | 
				
			||||||
					bw.conns[a] = sc
 | 
					 | 
				
			||||||
					bw.connSt[sc] = &scState{
 | 
					 | 
				
			||||||
						addr: resAddrs[a],
 | 
					 | 
				
			||||||
						s:    connectivity.Idle,
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					bw.mu.Unlock()
 | 
					 | 
				
			||||||
					sc.Connect()
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			for _, c := range del {
 | 
					 | 
				
			||||||
				bw.cc.RemoveSubConn(c)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (bw *balancerWrapper) HandleSubConnStateChange(sc balancer.SubConn, s connectivity.State) {
 | 
					 | 
				
			||||||
	bw.mu.Lock()
 | 
					 | 
				
			||||||
	defer bw.mu.Unlock()
 | 
					 | 
				
			||||||
	scSt, ok := bw.connSt[sc]
 | 
					 | 
				
			||||||
	if !ok {
 | 
					 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if s == connectivity.Idle {
 | 
					 | 
				
			||||||
		sc.Connect()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	oldS := scSt.s
 | 
					 | 
				
			||||||
	scSt.s = s
 | 
					 | 
				
			||||||
	if oldS != connectivity.Ready && s == connectivity.Ready {
 | 
					 | 
				
			||||||
		scSt.down = bw.balancer.Up(scSt.addr)
 | 
					 | 
				
			||||||
	} else if oldS == connectivity.Ready && s != connectivity.Ready {
 | 
					 | 
				
			||||||
		if scSt.down != nil {
 | 
					 | 
				
			||||||
			scSt.down(errConnClosing)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	sa := bw.csEvltr.RecordTransition(oldS, s)
 | 
					 | 
				
			||||||
	if bw.state != sa {
 | 
					 | 
				
			||||||
		bw.state = sa
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	bw.cc.UpdateState(balancer.State{ConnectivityState: bw.state, Picker: bw})
 | 
					 | 
				
			||||||
	if s == connectivity.Shutdown {
 | 
					 | 
				
			||||||
		// Remove state for this sc.
 | 
					 | 
				
			||||||
		delete(bw.connSt, sc)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (bw *balancerWrapper) HandleResolvedAddrs([]resolver.Address, error) {
 | 
					 | 
				
			||||||
	bw.mu.Lock()
 | 
					 | 
				
			||||||
	defer bw.mu.Unlock()
 | 
					 | 
				
			||||||
	select {
 | 
					 | 
				
			||||||
	case <-bw.startCh:
 | 
					 | 
				
			||||||
	default:
 | 
					 | 
				
			||||||
		close(bw.startCh)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	// There should be a resolver inside the balancer.
 | 
					 | 
				
			||||||
	// All updates here, if any, are ignored.
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (bw *balancerWrapper) Close() {
 | 
					 | 
				
			||||||
	bw.mu.Lock()
 | 
					 | 
				
			||||||
	defer bw.mu.Unlock()
 | 
					 | 
				
			||||||
	select {
 | 
					 | 
				
			||||||
	case <-bw.startCh:
 | 
					 | 
				
			||||||
	default:
 | 
					 | 
				
			||||||
		close(bw.startCh)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	bw.balancer.Close()
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// The picker is the balancerWrapper itself.
 | 
					 | 
				
			||||||
// It either blocks or returns error, consistent with v1 balancer Get().
 | 
					 | 
				
			||||||
func (bw *balancerWrapper) Pick(info balancer.PickInfo) (result balancer.PickResult, err error) {
 | 
					 | 
				
			||||||
	failfast := true // Default failfast is true.
 | 
					 | 
				
			||||||
	if ss, ok := rpcInfoFromContext(info.Ctx); ok {
 | 
					 | 
				
			||||||
		failfast = ss.failfast
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	a, p, err := bw.balancer.Get(info.Ctx, BalancerGetOptions{BlockingWait: !failfast})
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return balancer.PickResult{}, toRPCErr(err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if p != nil {
 | 
					 | 
				
			||||||
		result.Done = func(balancer.DoneInfo) { p() }
 | 
					 | 
				
			||||||
		defer func() {
 | 
					 | 
				
			||||||
			if err != nil {
 | 
					 | 
				
			||||||
				p()
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	bw.mu.Lock()
 | 
					 | 
				
			||||||
	defer bw.mu.Unlock()
 | 
					 | 
				
			||||||
	if bw.pickfirst {
 | 
					 | 
				
			||||||
		// Get the first sc in conns.
 | 
					 | 
				
			||||||
		for _, result.SubConn = range bw.conns {
 | 
					 | 
				
			||||||
			return result, nil
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return balancer.PickResult{}, balancer.ErrNoSubConnAvailable
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	var ok1 bool
 | 
					 | 
				
			||||||
	result.SubConn, ok1 = bw.conns[resolver.Address{
 | 
					 | 
				
			||||||
		Addr:       a.Addr,
 | 
					 | 
				
			||||||
		Type:       resolver.Backend,
 | 
					 | 
				
			||||||
		ServerName: "",
 | 
					 | 
				
			||||||
		Metadata:   a.Metadata,
 | 
					 | 
				
			||||||
	}]
 | 
					 | 
				
			||||||
	s, ok2 := bw.connSt[result.SubConn]
 | 
					 | 
				
			||||||
	if !ok1 || !ok2 {
 | 
					 | 
				
			||||||
		// This can only happen due to a race where Get() returned an address
 | 
					 | 
				
			||||||
		// that was subsequently removed by Notify.  In this case we should
 | 
					 | 
				
			||||||
		// retry always.
 | 
					 | 
				
			||||||
		return balancer.PickResult{}, balancer.ErrNoSubConnAvailable
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	switch s.s {
 | 
					 | 
				
			||||||
	case connectivity.Ready, connectivity.Idle:
 | 
					 | 
				
			||||||
		return result, nil
 | 
					 | 
				
			||||||
	case connectivity.Shutdown, connectivity.TransientFailure:
 | 
					 | 
				
			||||||
		// If the returned sc has been shut down or is in transient failure,
 | 
					 | 
				
			||||||
		// return error, and this RPC will fail or wait for another picker (if
 | 
					 | 
				
			||||||
		// non-failfast).
 | 
					 | 
				
			||||||
		return balancer.PickResult{}, balancer.ErrTransientFailure
 | 
					 | 
				
			||||||
	default:
 | 
					 | 
				
			||||||
		// For other states (connecting or unknown), the v1 balancer would
 | 
					 | 
				
			||||||
		// traditionally wait until ready and then issue the RPC.  Returning
 | 
					 | 
				
			||||||
		// ErrNoSubConnAvailable will be a slight improvement in that it will
 | 
					 | 
				
			||||||
		// allow the balancer to choose another address in case others are
 | 
					 | 
				
			||||||
		// connected.
 | 
					 | 
				
			||||||
		return balancer.PickResult{}, balancer.ErrNoSubConnAvailable
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
					@ -23,7 +23,6 @@ import (
 | 
				
			||||||
	"errors"
 | 
						"errors"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"math"
 | 
						"math"
 | 
				
			||||||
	"net"
 | 
					 | 
				
			||||||
	"reflect"
 | 
						"reflect"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
| 
						 | 
					@ -39,6 +38,7 @@ import (
 | 
				
			||||||
	"google.golang.org/grpc/internal/channelz"
 | 
						"google.golang.org/grpc/internal/channelz"
 | 
				
			||||||
	"google.golang.org/grpc/internal/grpcsync"
 | 
						"google.golang.org/grpc/internal/grpcsync"
 | 
				
			||||||
	"google.golang.org/grpc/internal/grpcutil"
 | 
						"google.golang.org/grpc/internal/grpcutil"
 | 
				
			||||||
 | 
						iresolver "google.golang.org/grpc/internal/resolver"
 | 
				
			||||||
	"google.golang.org/grpc/internal/transport"
 | 
						"google.golang.org/grpc/internal/transport"
 | 
				
			||||||
	"google.golang.org/grpc/keepalive"
 | 
						"google.golang.org/grpc/keepalive"
 | 
				
			||||||
	"google.golang.org/grpc/resolver"
 | 
						"google.golang.org/grpc/resolver"
 | 
				
			||||||
| 
						 | 
					@ -48,6 +48,7 @@ import (
 | 
				
			||||||
	_ "google.golang.org/grpc/balancer/roundrobin"           // To register roundrobin.
 | 
						_ "google.golang.org/grpc/balancer/roundrobin"           // To register roundrobin.
 | 
				
			||||||
	_ "google.golang.org/grpc/internal/resolver/dns"         // To register dns resolver.
 | 
						_ "google.golang.org/grpc/internal/resolver/dns"         // To register dns resolver.
 | 
				
			||||||
	_ "google.golang.org/grpc/internal/resolver/passthrough" // To register passthrough resolver.
 | 
						_ "google.golang.org/grpc/internal/resolver/passthrough" // To register passthrough resolver.
 | 
				
			||||||
 | 
						_ "google.golang.org/grpc/internal/resolver/unix"        // To register unix resolver.
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
| 
						 | 
					@ -68,8 +69,6 @@ var (
 | 
				
			||||||
	errConnDrain = errors.New("grpc: the connection is drained")
 | 
						errConnDrain = errors.New("grpc: the connection is drained")
 | 
				
			||||||
	// errConnClosing indicates that the connection is closing.
 | 
						// errConnClosing indicates that the connection is closing.
 | 
				
			||||||
	errConnClosing = errors.New("grpc: the connection is closing")
 | 
						errConnClosing = errors.New("grpc: the connection is closing")
 | 
				
			||||||
	// errBalancerClosed indicates that the balancer is closed.
 | 
					 | 
				
			||||||
	errBalancerClosed = errors.New("grpc: balancer is closed")
 | 
					 | 
				
			||||||
	// invalidDefaultServiceConfigErrPrefix is used to prefix the json parsing error for the default
 | 
						// invalidDefaultServiceConfigErrPrefix is used to prefix the json parsing error for the default
 | 
				
			||||||
	// service config.
 | 
						// service config.
 | 
				
			||||||
	invalidDefaultServiceConfigErrPrefix = "grpc: the provided default service config is invalid"
 | 
						invalidDefaultServiceConfigErrPrefix = "grpc: the provided default service config is invalid"
 | 
				
			||||||
| 
						 | 
					@ -106,6 +105,17 @@ func Dial(target string, opts ...DialOption) (*ClientConn, error) {
 | 
				
			||||||
	return DialContext(context.Background(), target, opts...)
 | 
						return DialContext(context.Background(), target, opts...)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type defaultConfigSelector struct {
 | 
				
			||||||
 | 
						sc *ServiceConfig
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (dcs *defaultConfigSelector) SelectConfig(rpcInfo iresolver.RPCInfo) (*iresolver.RPCConfig, error) {
 | 
				
			||||||
 | 
						return &iresolver.RPCConfig{
 | 
				
			||||||
 | 
							Context:      rpcInfo.Context,
 | 
				
			||||||
 | 
							MethodConfig: getMethodConfig(dcs.sc, rpcInfo.Method),
 | 
				
			||||||
 | 
						}, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// DialContext creates a client connection to the given target. By default, it's
 | 
					// DialContext creates a client connection to the given target. By default, it's
 | 
				
			||||||
// a non-blocking dial (the function won't wait for connections to be
 | 
					// a non-blocking dial (the function won't wait for connections to be
 | 
				
			||||||
// established, and connecting happens in the background). To make it a blocking
 | 
					// established, and connecting happens in the background). To make it a blocking
 | 
				
			||||||
| 
						 | 
					@ -151,17 +161,17 @@ func DialContext(ctx context.Context, target string, opts ...DialOption) (conn *
 | 
				
			||||||
	if channelz.IsOn() {
 | 
						if channelz.IsOn() {
 | 
				
			||||||
		if cc.dopts.channelzParentID != 0 {
 | 
							if cc.dopts.channelzParentID != 0 {
 | 
				
			||||||
			cc.channelzID = channelz.RegisterChannel(&channelzChannel{cc}, cc.dopts.channelzParentID, target)
 | 
								cc.channelzID = channelz.RegisterChannel(&channelzChannel{cc}, cc.dopts.channelzParentID, target)
 | 
				
			||||||
			channelz.AddTraceEvent(cc.channelzID, 0, &channelz.TraceEventDesc{
 | 
								channelz.AddTraceEvent(logger, cc.channelzID, 0, &channelz.TraceEventDesc{
 | 
				
			||||||
				Desc:     "Channel Created",
 | 
									Desc:     "Channel Created",
 | 
				
			||||||
				Severity: channelz.CtINFO,
 | 
									Severity: channelz.CtInfo,
 | 
				
			||||||
				Parent: &channelz.TraceEventDesc{
 | 
									Parent: &channelz.TraceEventDesc{
 | 
				
			||||||
					Desc:     fmt.Sprintf("Nested Channel(id:%d) created", cc.channelzID),
 | 
										Desc:     fmt.Sprintf("Nested Channel(id:%d) created", cc.channelzID),
 | 
				
			||||||
					Severity: channelz.CtINFO,
 | 
										Severity: channelz.CtInfo,
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
			})
 | 
								})
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			cc.channelzID = channelz.RegisterChannel(&channelzChannel{cc}, 0, target)
 | 
								cc.channelzID = channelz.RegisterChannel(&channelzChannel{cc}, 0, target)
 | 
				
			||||||
			channelz.Info(cc.channelzID, "Channel Created")
 | 
								channelz.Info(logger, cc.channelzID, "Channel Created")
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		cc.csMgr.channelzID = cc.channelzID
 | 
							cc.csMgr.channelzID = cc.channelzID
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -193,16 +203,6 @@ func DialContext(ctx context.Context, target string, opts ...DialOption) (conn *
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	cc.mkp = cc.dopts.copts.KeepaliveParams
 | 
						cc.mkp = cc.dopts.copts.KeepaliveParams
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if cc.dopts.copts.Dialer == nil {
 | 
					 | 
				
			||||||
		cc.dopts.copts.Dialer = func(ctx context.Context, addr string) (net.Conn, error) {
 | 
					 | 
				
			||||||
			network, addr := parseDialTarget(addr)
 | 
					 | 
				
			||||||
			return (&net.Dialer{}).DialContext(ctx, network, addr)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if cc.dopts.withProxy {
 | 
					 | 
				
			||||||
			cc.dopts.copts.Dialer = newProxyDialer(cc.dopts.copts.Dialer)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if cc.dopts.copts.UserAgent != "" {
 | 
						if cc.dopts.copts.UserAgent != "" {
 | 
				
			||||||
		cc.dopts.copts.UserAgent += " " + grpcUA
 | 
							cc.dopts.copts.UserAgent += " " + grpcUA
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
| 
						 | 
					@ -217,7 +217,14 @@ func DialContext(ctx context.Context, target string, opts ...DialOption) (conn *
 | 
				
			||||||
	defer func() {
 | 
						defer func() {
 | 
				
			||||||
		select {
 | 
							select {
 | 
				
			||||||
		case <-ctx.Done():
 | 
							case <-ctx.Done():
 | 
				
			||||||
			conn, err = nil, ctx.Err()
 | 
								switch {
 | 
				
			||||||
 | 
								case ctx.Err() == err:
 | 
				
			||||||
 | 
									conn = nil
 | 
				
			||||||
 | 
								case err == nil || !cc.dopts.returnLastError:
 | 
				
			||||||
 | 
									conn, err = nil, ctx.Err()
 | 
				
			||||||
 | 
								default:
 | 
				
			||||||
 | 
									conn, err = nil, fmt.Errorf("%v: %v", ctx.Err(), err)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		default:
 | 
							default:
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}()
 | 
						}()
 | 
				
			||||||
| 
						 | 
					@ -229,6 +236,7 @@ func DialContext(ctx context.Context, target string, opts ...DialOption) (conn *
 | 
				
			||||||
		case sc, ok := <-cc.dopts.scChan:
 | 
							case sc, ok := <-cc.dopts.scChan:
 | 
				
			||||||
			if ok {
 | 
								if ok {
 | 
				
			||||||
				cc.sc = &sc
 | 
									cc.sc = &sc
 | 
				
			||||||
 | 
									cc.safeConfigSelector.UpdateConfigSelector(&defaultConfigSelector{&sc})
 | 
				
			||||||
				scSet = true
 | 
									scSet = true
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		default:
 | 
							default:
 | 
				
			||||||
| 
						 | 
					@ -239,14 +247,14 @@ func DialContext(ctx context.Context, target string, opts ...DialOption) (conn *
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Determine the resolver to use.
 | 
						// Determine the resolver to use.
 | 
				
			||||||
	cc.parsedTarget = grpcutil.ParseTarget(cc.target)
 | 
						cc.parsedTarget = grpcutil.ParseTarget(cc.target, cc.dopts.copts.Dialer != nil)
 | 
				
			||||||
	channelz.Infof(cc.channelzID, "parsed scheme: %q", cc.parsedTarget.Scheme)
 | 
						channelz.Infof(logger, cc.channelzID, "parsed scheme: %q", cc.parsedTarget.Scheme)
 | 
				
			||||||
	resolverBuilder := cc.getResolver(cc.parsedTarget.Scheme)
 | 
						resolverBuilder := cc.getResolver(cc.parsedTarget.Scheme)
 | 
				
			||||||
	if resolverBuilder == nil {
 | 
						if resolverBuilder == nil {
 | 
				
			||||||
		// If resolver builder is still nil, the parsed target's scheme is
 | 
							// If resolver builder is still nil, the parsed target's scheme is
 | 
				
			||||||
		// not registered. Fallback to default resolver and set Endpoint to
 | 
							// not registered. Fallback to default resolver and set Endpoint to
 | 
				
			||||||
		// the original target.
 | 
							// the original target.
 | 
				
			||||||
		channelz.Infof(cc.channelzID, "scheme %q not registered, fallback to default scheme", cc.parsedTarget.Scheme)
 | 
							channelz.Infof(logger, cc.channelzID, "scheme %q not registered, fallback to default scheme", cc.parsedTarget.Scheme)
 | 
				
			||||||
		cc.parsedTarget = resolver.Target{
 | 
							cc.parsedTarget = resolver.Target{
 | 
				
			||||||
			Scheme:   resolver.GetDefaultScheme(),
 | 
								Scheme:   resolver.GetDefaultScheme(),
 | 
				
			||||||
			Endpoint: target,
 | 
								Endpoint: target,
 | 
				
			||||||
| 
						 | 
					@ -262,6 +270,10 @@ func DialContext(ctx context.Context, target string, opts ...DialOption) (conn *
 | 
				
			||||||
		cc.authority = creds.Info().ServerName
 | 
							cc.authority = creds.Info().ServerName
 | 
				
			||||||
	} else if cc.dopts.insecure && cc.dopts.authority != "" {
 | 
						} else if cc.dopts.insecure && cc.dopts.authority != "" {
 | 
				
			||||||
		cc.authority = cc.dopts.authority
 | 
							cc.authority = cc.dopts.authority
 | 
				
			||||||
 | 
						} else if strings.HasPrefix(cc.target, "unix:") || strings.HasPrefix(cc.target, "unix-abstract:") {
 | 
				
			||||||
 | 
							cc.authority = "localhost"
 | 
				
			||||||
 | 
						} else if strings.HasPrefix(cc.parsedTarget.Endpoint, ":") {
 | 
				
			||||||
 | 
							cc.authority = "localhost" + cc.parsedTarget.Endpoint
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		// Use endpoint from "scheme://authority/endpoint" as the default
 | 
							// Use endpoint from "scheme://authority/endpoint" as the default
 | 
				
			||||||
		// authority for ClientConn.
 | 
							// authority for ClientConn.
 | 
				
			||||||
| 
						 | 
					@ -274,6 +286,7 @@ func DialContext(ctx context.Context, target string, opts ...DialOption) (conn *
 | 
				
			||||||
		case sc, ok := <-cc.dopts.scChan:
 | 
							case sc, ok := <-cc.dopts.scChan:
 | 
				
			||||||
			if ok {
 | 
								if ok {
 | 
				
			||||||
				cc.sc = &sc
 | 
									cc.sc = &sc
 | 
				
			||||||
 | 
									cc.safeConfigSelector.UpdateConfigSelector(&defaultConfigSelector{&sc})
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		case <-ctx.Done():
 | 
							case <-ctx.Done():
 | 
				
			||||||
			return nil, ctx.Err()
 | 
								return nil, ctx.Err()
 | 
				
			||||||
| 
						 | 
					@ -291,6 +304,7 @@ func DialContext(ctx context.Context, target string, opts ...DialOption) (conn *
 | 
				
			||||||
		DialCreds:        credsClone,
 | 
							DialCreds:        credsClone,
 | 
				
			||||||
		CredsBundle:      cc.dopts.copts.CredsBundle,
 | 
							CredsBundle:      cc.dopts.copts.CredsBundle,
 | 
				
			||||||
		Dialer:           cc.dopts.copts.Dialer,
 | 
							Dialer:           cc.dopts.copts.Dialer,
 | 
				
			||||||
 | 
							CustomUserAgent:  cc.dopts.copts.UserAgent,
 | 
				
			||||||
		ChannelzParentID: cc.channelzID,
 | 
							ChannelzParentID: cc.channelzID,
 | 
				
			||||||
		Target:           cc.parsedTarget,
 | 
							Target:           cc.parsedTarget,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -311,7 +325,7 @@ func DialContext(ctx context.Context, target string, opts ...DialOption) (conn *
 | 
				
			||||||
			if s == connectivity.Ready {
 | 
								if s == connectivity.Ready {
 | 
				
			||||||
				break
 | 
									break
 | 
				
			||||||
			} else if cc.dopts.copts.FailOnNonTempDialError && s == connectivity.TransientFailure {
 | 
								} else if cc.dopts.copts.FailOnNonTempDialError && s == connectivity.TransientFailure {
 | 
				
			||||||
				if err = cc.blockingpicker.connectionError(); err != nil {
 | 
									if err = cc.connectionError(); err != nil {
 | 
				
			||||||
					terr, ok := err.(interface {
 | 
										terr, ok := err.(interface {
 | 
				
			||||||
						Temporary() bool
 | 
											Temporary() bool
 | 
				
			||||||
					})
 | 
										})
 | 
				
			||||||
| 
						 | 
					@ -322,6 +336,9 @@ func DialContext(ctx context.Context, target string, opts ...DialOption) (conn *
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			if !cc.WaitForStateChange(ctx, s) {
 | 
								if !cc.WaitForStateChange(ctx, s) {
 | 
				
			||||||
				// ctx got timeout or canceled.
 | 
									// ctx got timeout or canceled.
 | 
				
			||||||
 | 
									if err = cc.connectionError(); err != nil && cc.dopts.returnLastError {
 | 
				
			||||||
 | 
										return nil, err
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
				return nil, ctx.Err()
 | 
									return nil, ctx.Err()
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -414,7 +431,7 @@ func (csm *connectivityStateManager) updateState(state connectivity.State) {
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	csm.state = state
 | 
						csm.state = state
 | 
				
			||||||
	channelz.Infof(csm.channelzID, "Channel Connectivity change to %v", state)
 | 
						channelz.Infof(logger, csm.channelzID, "Channel Connectivity change to %v", state)
 | 
				
			||||||
	if csm.notifyChan != nil {
 | 
						if csm.notifyChan != nil {
 | 
				
			||||||
		// There are other goroutines waiting on this channel.
 | 
							// There are other goroutines waiting on this channel.
 | 
				
			||||||
		close(csm.notifyChan)
 | 
							close(csm.notifyChan)
 | 
				
			||||||
| 
						 | 
					@ -476,6 +493,8 @@ type ClientConn struct {
 | 
				
			||||||
	balancerBuildOpts balancer.BuildOptions
 | 
						balancerBuildOpts balancer.BuildOptions
 | 
				
			||||||
	blockingpicker    *pickerWrapper
 | 
						blockingpicker    *pickerWrapper
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						safeConfigSelector iresolver.SafeConfigSelector
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mu              sync.RWMutex
 | 
						mu              sync.RWMutex
 | 
				
			||||||
	resolverWrapper *ccResolverWrapper
 | 
						resolverWrapper *ccResolverWrapper
 | 
				
			||||||
	sc              *ServiceConfig
 | 
						sc              *ServiceConfig
 | 
				
			||||||
| 
						 | 
					@ -490,11 +509,18 @@ type ClientConn struct {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	channelzID int64 // channelz unique identification number
 | 
						channelzID int64 // channelz unique identification number
 | 
				
			||||||
	czData     *channelzData
 | 
						czData     *channelzData
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						lceMu               sync.Mutex // protects lastConnectionError
 | 
				
			||||||
 | 
						lastConnectionError error
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// WaitForStateChange waits until the connectivity.State of ClientConn changes from sourceState or
 | 
					// WaitForStateChange waits until the connectivity.State of ClientConn changes from sourceState or
 | 
				
			||||||
// ctx expires. A true value is returned in former case and false in latter.
 | 
					// ctx expires. A true value is returned in former case and false in latter.
 | 
				
			||||||
// This is an EXPERIMENTAL API.
 | 
					//
 | 
				
			||||||
 | 
					// Experimental
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Notice: This API is EXPERIMENTAL and may be changed or removed in a
 | 
				
			||||||
 | 
					// later release.
 | 
				
			||||||
func (cc *ClientConn) WaitForStateChange(ctx context.Context, sourceState connectivity.State) bool {
 | 
					func (cc *ClientConn) WaitForStateChange(ctx context.Context, sourceState connectivity.State) bool {
 | 
				
			||||||
	ch := cc.csMgr.getNotifyChan()
 | 
						ch := cc.csMgr.getNotifyChan()
 | 
				
			||||||
	if cc.csMgr.getState() != sourceState {
 | 
						if cc.csMgr.getState() != sourceState {
 | 
				
			||||||
| 
						 | 
					@ -509,7 +535,11 @@ func (cc *ClientConn) WaitForStateChange(ctx context.Context, sourceState connec
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GetState returns the connectivity.State of ClientConn.
 | 
					// GetState returns the connectivity.State of ClientConn.
 | 
				
			||||||
// This is an EXPERIMENTAL API.
 | 
					//
 | 
				
			||||||
 | 
					// Experimental
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Notice: This API is EXPERIMENTAL and may be changed or removed in a
 | 
				
			||||||
 | 
					// later release.
 | 
				
			||||||
func (cc *ClientConn) GetState() connectivity.State {
 | 
					func (cc *ClientConn) GetState() connectivity.State {
 | 
				
			||||||
	return cc.csMgr.getState()
 | 
						return cc.csMgr.getState()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -525,6 +555,7 @@ func (cc *ClientConn) scWatcher() {
 | 
				
			||||||
			// TODO: load balance policy runtime change is ignored.
 | 
								// TODO: load balance policy runtime change is ignored.
 | 
				
			||||||
			// We may revisit this decision in the future.
 | 
								// We may revisit this decision in the future.
 | 
				
			||||||
			cc.sc = &sc
 | 
								cc.sc = &sc
 | 
				
			||||||
 | 
								cc.safeConfigSelector.UpdateConfigSelector(&defaultConfigSelector{&sc})
 | 
				
			||||||
			cc.mu.Unlock()
 | 
								cc.mu.Unlock()
 | 
				
			||||||
		case <-cc.ctx.Done():
 | 
							case <-cc.ctx.Done():
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
| 
						 | 
					@ -563,13 +594,13 @@ func init() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (cc *ClientConn) maybeApplyDefaultServiceConfig(addrs []resolver.Address) {
 | 
					func (cc *ClientConn) maybeApplyDefaultServiceConfig(addrs []resolver.Address) {
 | 
				
			||||||
	if cc.sc != nil {
 | 
						if cc.sc != nil {
 | 
				
			||||||
		cc.applyServiceConfigAndBalancer(cc.sc, addrs)
 | 
							cc.applyServiceConfigAndBalancer(cc.sc, nil, addrs)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if cc.dopts.defaultServiceConfig != nil {
 | 
						if cc.dopts.defaultServiceConfig != nil {
 | 
				
			||||||
		cc.applyServiceConfigAndBalancer(cc.dopts.defaultServiceConfig, addrs)
 | 
							cc.applyServiceConfigAndBalancer(cc.dopts.defaultServiceConfig, &defaultConfigSelector{cc.dopts.defaultServiceConfig}, addrs)
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		cc.applyServiceConfigAndBalancer(emptyServiceConfig, addrs)
 | 
							cc.applyServiceConfigAndBalancer(emptyServiceConfig, &defaultConfigSelector{emptyServiceConfig}, addrs)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -606,7 +637,15 @@ func (cc *ClientConn) updateResolverState(s resolver.State, err error) error {
 | 
				
			||||||
		// default, per the error handling design?
 | 
							// default, per the error handling design?
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		if sc, ok := s.ServiceConfig.Config.(*ServiceConfig); s.ServiceConfig.Err == nil && ok {
 | 
							if sc, ok := s.ServiceConfig.Config.(*ServiceConfig); s.ServiceConfig.Err == nil && ok {
 | 
				
			||||||
			cc.applyServiceConfigAndBalancer(sc, s.Addresses)
 | 
								configSelector := iresolver.GetConfigSelector(s)
 | 
				
			||||||
 | 
								if configSelector != nil {
 | 
				
			||||||
 | 
									if len(s.ServiceConfig.Config.(*ServiceConfig).Methods) != 0 {
 | 
				
			||||||
 | 
										channelz.Infof(logger, cc.channelzID, "method configs in service config will be ignored due to presence of config selector")
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									configSelector = &defaultConfigSelector{sc}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								cc.applyServiceConfigAndBalancer(sc, configSelector, s.Addresses)
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			ret = balancer.ErrBadResolverState
 | 
								ret = balancer.ErrBadResolverState
 | 
				
			||||||
			if cc.balancerWrapper == nil {
 | 
								if cc.balancerWrapper == nil {
 | 
				
			||||||
| 
						 | 
					@ -616,6 +655,7 @@ func (cc *ClientConn) updateResolverState(s resolver.State, err error) error {
 | 
				
			||||||
				} else {
 | 
									} else {
 | 
				
			||||||
					err = status.Errorf(codes.Unavailable, "illegal service config type: %T", s.ServiceConfig.Config)
 | 
										err = status.Errorf(codes.Unavailable, "illegal service config type: %T", s.ServiceConfig.Config)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
									cc.safeConfigSelector.UpdateConfigSelector(&defaultConfigSelector{cc.sc})
 | 
				
			||||||
				cc.blockingpicker.updatePicker(base.NewErrPicker(err))
 | 
									cc.blockingpicker.updatePicker(base.NewErrPicker(err))
 | 
				
			||||||
				cc.csMgr.updateState(connectivity.TransientFailure)
 | 
									cc.csMgr.updateState(connectivity.TransientFailure)
 | 
				
			||||||
				cc.mu.Unlock()
 | 
									cc.mu.Unlock()
 | 
				
			||||||
| 
						 | 
					@ -664,9 +704,9 @@ func (cc *ClientConn) switchBalancer(name string) {
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	channelz.Infof(cc.channelzID, "ClientConn switching balancer to %q", name)
 | 
						channelz.Infof(logger, cc.channelzID, "ClientConn switching balancer to %q", name)
 | 
				
			||||||
	if cc.dopts.balancerBuilder != nil {
 | 
						if cc.dopts.balancerBuilder != nil {
 | 
				
			||||||
		channelz.Info(cc.channelzID, "ignoring balancer switching: Balancer DialOption used instead")
 | 
							channelz.Info(logger, cc.channelzID, "ignoring balancer switching: Balancer DialOption used instead")
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if cc.balancerWrapper != nil {
 | 
						if cc.balancerWrapper != nil {
 | 
				
			||||||
| 
						 | 
					@ -675,11 +715,11 @@ func (cc *ClientConn) switchBalancer(name string) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	builder := balancer.Get(name)
 | 
						builder := balancer.Get(name)
 | 
				
			||||||
	if builder == nil {
 | 
						if builder == nil {
 | 
				
			||||||
		channelz.Warningf(cc.channelzID, "Channel switches to new LB policy %q due to fallback from invalid balancer name", PickFirstBalancerName)
 | 
							channelz.Warningf(logger, cc.channelzID, "Channel switches to new LB policy %q due to fallback from invalid balancer name", PickFirstBalancerName)
 | 
				
			||||||
		channelz.Infof(cc.channelzID, "failed to get balancer builder for: %v, using pick_first instead", name)
 | 
							channelz.Infof(logger, cc.channelzID, "failed to get balancer builder for: %v, using pick_first instead", name)
 | 
				
			||||||
		builder = newPickfirstBuilder()
 | 
							builder = newPickfirstBuilder()
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		channelz.Infof(cc.channelzID, "Channel switches to new LB policy %q", name)
 | 
							channelz.Infof(logger, cc.channelzID, "Channel switches to new LB policy %q", name)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cc.curBalancerName = builder.Name()
 | 
						cc.curBalancerName = builder.Name()
 | 
				
			||||||
| 
						 | 
					@ -720,12 +760,12 @@ func (cc *ClientConn) newAddrConn(addrs []resolver.Address, opts balancer.NewSub
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if channelz.IsOn() {
 | 
						if channelz.IsOn() {
 | 
				
			||||||
		ac.channelzID = channelz.RegisterSubChannel(ac, cc.channelzID, "")
 | 
							ac.channelzID = channelz.RegisterSubChannel(ac, cc.channelzID, "")
 | 
				
			||||||
		channelz.AddTraceEvent(ac.channelzID, 0, &channelz.TraceEventDesc{
 | 
							channelz.AddTraceEvent(logger, ac.channelzID, 0, &channelz.TraceEventDesc{
 | 
				
			||||||
			Desc:     "Subchannel Created",
 | 
								Desc:     "Subchannel Created",
 | 
				
			||||||
			Severity: channelz.CtINFO,
 | 
								Severity: channelz.CtInfo,
 | 
				
			||||||
			Parent: &channelz.TraceEventDesc{
 | 
								Parent: &channelz.TraceEventDesc{
 | 
				
			||||||
				Desc:     fmt.Sprintf("Subchannel(id:%d) created", ac.channelzID),
 | 
									Desc:     fmt.Sprintf("Subchannel(id:%d) created", ac.channelzID),
 | 
				
			||||||
				Severity: channelz.CtINFO,
 | 
									Severity: channelz.CtInfo,
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -759,7 +799,11 @@ func (cc *ClientConn) channelzMetric() *channelz.ChannelInternalMetric {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Target returns the target string of the ClientConn.
 | 
					// Target returns the target string of the ClientConn.
 | 
				
			||||||
// This is an EXPERIMENTAL API.
 | 
					//
 | 
				
			||||||
 | 
					// Experimental
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Notice: This API is EXPERIMENTAL and may be changed or removed in a
 | 
				
			||||||
 | 
					// later release.
 | 
				
			||||||
func (cc *ClientConn) Target() string {
 | 
					func (cc *ClientConn) Target() string {
 | 
				
			||||||
	return cc.target
 | 
						return cc.target
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -818,7 +862,7 @@ func (ac *addrConn) connect() error {
 | 
				
			||||||
func (ac *addrConn) tryUpdateAddrs(addrs []resolver.Address) bool {
 | 
					func (ac *addrConn) tryUpdateAddrs(addrs []resolver.Address) bool {
 | 
				
			||||||
	ac.mu.Lock()
 | 
						ac.mu.Lock()
 | 
				
			||||||
	defer ac.mu.Unlock()
 | 
						defer ac.mu.Unlock()
 | 
				
			||||||
	channelz.Infof(ac.channelzID, "addrConn: tryUpdateAddrs curAddr: %v, addrs: %v", ac.curAddr, addrs)
 | 
						channelz.Infof(logger, ac.channelzID, "addrConn: tryUpdateAddrs curAddr: %v, addrs: %v", ac.curAddr, addrs)
 | 
				
			||||||
	if ac.state == connectivity.Shutdown ||
 | 
						if ac.state == connectivity.Shutdown ||
 | 
				
			||||||
		ac.state == connectivity.TransientFailure ||
 | 
							ac.state == connectivity.TransientFailure ||
 | 
				
			||||||
		ac.state == connectivity.Idle {
 | 
							ac.state == connectivity.Idle {
 | 
				
			||||||
| 
						 | 
					@ -838,7 +882,7 @@ func (ac *addrConn) tryUpdateAddrs(addrs []resolver.Address) bool {
 | 
				
			||||||
			break
 | 
								break
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	channelz.Infof(ac.channelzID, "addrConn: tryUpdateAddrs curAddrFound: %v", curAddrFound)
 | 
						channelz.Infof(logger, ac.channelzID, "addrConn: tryUpdateAddrs curAddrFound: %v", curAddrFound)
 | 
				
			||||||
	if curAddrFound {
 | 
						if curAddrFound {
 | 
				
			||||||
		ac.addrs = addrs
 | 
							ac.addrs = addrs
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -846,26 +890,33 @@ func (ac *addrConn) tryUpdateAddrs(addrs []resolver.Address) bool {
 | 
				
			||||||
	return curAddrFound
 | 
						return curAddrFound
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func getMethodConfig(sc *ServiceConfig, method string) MethodConfig {
 | 
				
			||||||
 | 
						if sc == nil {
 | 
				
			||||||
 | 
							return MethodConfig{}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if m, ok := sc.Methods[method]; ok {
 | 
				
			||||||
 | 
							return m
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						i := strings.LastIndex(method, "/")
 | 
				
			||||||
 | 
						if m, ok := sc.Methods[method[:i+1]]; ok {
 | 
				
			||||||
 | 
							return m
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return sc.Methods[""]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GetMethodConfig gets the method config of the input method.
 | 
					// GetMethodConfig gets the method config of the input method.
 | 
				
			||||||
// If there's an exact match for input method (i.e. /service/method), we return
 | 
					// If there's an exact match for input method (i.e. /service/method), we return
 | 
				
			||||||
// the corresponding MethodConfig.
 | 
					// the corresponding MethodConfig.
 | 
				
			||||||
// If there isn't an exact match for the input method, we look for the default config
 | 
					// If there isn't an exact match for the input method, we look for the service's default
 | 
				
			||||||
// under the service (i.e /service/). If there is a default MethodConfig for
 | 
					// config under the service (i.e /service/) and then for the default for all services (empty string).
 | 
				
			||||||
// the service, we return it.
 | 
					//
 | 
				
			||||||
 | 
					// If there is a default MethodConfig for the service, we return it.
 | 
				
			||||||
// Otherwise, we return an empty MethodConfig.
 | 
					// Otherwise, we return an empty MethodConfig.
 | 
				
			||||||
func (cc *ClientConn) GetMethodConfig(method string) MethodConfig {
 | 
					func (cc *ClientConn) GetMethodConfig(method string) MethodConfig {
 | 
				
			||||||
	// TODO: Avoid the locking here.
 | 
						// TODO: Avoid the locking here.
 | 
				
			||||||
	cc.mu.RLock()
 | 
						cc.mu.RLock()
 | 
				
			||||||
	defer cc.mu.RUnlock()
 | 
						defer cc.mu.RUnlock()
 | 
				
			||||||
	if cc.sc == nil {
 | 
						return getMethodConfig(cc.sc, method)
 | 
				
			||||||
		return MethodConfig{}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	m, ok := cc.sc.Methods[method]
 | 
					 | 
				
			||||||
	if !ok {
 | 
					 | 
				
			||||||
		i := strings.LastIndex(method, "/")
 | 
					 | 
				
			||||||
		m = cc.sc.Methods[method[:i+1]]
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return m
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (cc *ClientConn) healthCheckConfig() *healthCheckConfig {
 | 
					func (cc *ClientConn) healthCheckConfig() *healthCheckConfig {
 | 
				
			||||||
| 
						 | 
					@ -888,12 +939,15 @@ func (cc *ClientConn) getTransport(ctx context.Context, failfast bool, method st
 | 
				
			||||||
	return t, done, nil
 | 
						return t, done, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (cc *ClientConn) applyServiceConfigAndBalancer(sc *ServiceConfig, addrs []resolver.Address) {
 | 
					func (cc *ClientConn) applyServiceConfigAndBalancer(sc *ServiceConfig, configSelector iresolver.ConfigSelector, addrs []resolver.Address) {
 | 
				
			||||||
	if sc == nil {
 | 
						if sc == nil {
 | 
				
			||||||
		// should never reach here.
 | 
							// should never reach here.
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	cc.sc = sc
 | 
						cc.sc = sc
 | 
				
			||||||
 | 
						if configSelector != nil {
 | 
				
			||||||
 | 
							cc.safeConfigSelector.UpdateConfigSelector(configSelector)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if cc.sc.retryThrottling != nil {
 | 
						if cc.sc.retryThrottling != nil {
 | 
				
			||||||
		newThrottler := &retryThrottler{
 | 
							newThrottler := &retryThrottler{
 | 
				
			||||||
| 
						 | 
					@ -957,7 +1011,10 @@ func (cc *ClientConn) resolveNow(o resolver.ResolveNowOptions) {
 | 
				
			||||||
// However, if a previously unavailable network becomes available, this may be
 | 
					// However, if a previously unavailable network becomes available, this may be
 | 
				
			||||||
// used to trigger an immediate reconnect.
 | 
					// used to trigger an immediate reconnect.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// This API is EXPERIMENTAL.
 | 
					// Experimental
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Notice: This API is EXPERIMENTAL and may be changed or removed in a
 | 
				
			||||||
 | 
					// later release.
 | 
				
			||||||
func (cc *ClientConn) ResetConnectBackoff() {
 | 
					func (cc *ClientConn) ResetConnectBackoff() {
 | 
				
			||||||
	cc.mu.Lock()
 | 
						cc.mu.Lock()
 | 
				
			||||||
	conns := cc.conns
 | 
						conns := cc.conns
 | 
				
			||||||
| 
						 | 
					@ -1001,15 +1058,15 @@ func (cc *ClientConn) Close() error {
 | 
				
			||||||
	if channelz.IsOn() {
 | 
						if channelz.IsOn() {
 | 
				
			||||||
		ted := &channelz.TraceEventDesc{
 | 
							ted := &channelz.TraceEventDesc{
 | 
				
			||||||
			Desc:     "Channel Deleted",
 | 
								Desc:     "Channel Deleted",
 | 
				
			||||||
			Severity: channelz.CtINFO,
 | 
								Severity: channelz.CtInfo,
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if cc.dopts.channelzParentID != 0 {
 | 
							if cc.dopts.channelzParentID != 0 {
 | 
				
			||||||
			ted.Parent = &channelz.TraceEventDesc{
 | 
								ted.Parent = &channelz.TraceEventDesc{
 | 
				
			||||||
				Desc:     fmt.Sprintf("Nested channel(id:%d) deleted", cc.channelzID),
 | 
									Desc:     fmt.Sprintf("Nested channel(id:%d) deleted", cc.channelzID),
 | 
				
			||||||
				Severity: channelz.CtINFO,
 | 
									Severity: channelz.CtInfo,
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		channelz.AddTraceEvent(cc.channelzID, 0, ted)
 | 
							channelz.AddTraceEvent(logger, cc.channelzID, 0, ted)
 | 
				
			||||||
		// TraceEvent needs to be called before RemoveEntry, as TraceEvent may add trace reference to
 | 
							// TraceEvent needs to be called before RemoveEntry, as TraceEvent may add trace reference to
 | 
				
			||||||
		// the entity being deleted, and thus prevent it from being deleted right away.
 | 
							// the entity being deleted, and thus prevent it from being deleted right away.
 | 
				
			||||||
		channelz.RemoveEntry(cc.channelzID)
 | 
							channelz.RemoveEntry(cc.channelzID)
 | 
				
			||||||
| 
						 | 
					@ -1053,7 +1110,7 @@ func (ac *addrConn) updateConnectivityState(s connectivity.State, lastErr error)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	ac.state = s
 | 
						ac.state = s
 | 
				
			||||||
	channelz.Infof(ac.channelzID, "Subchannel Connectivity change to %v", s)
 | 
						channelz.Infof(logger, ac.channelzID, "Subchannel Connectivity change to %v", s)
 | 
				
			||||||
	ac.cc.handleSubConnStateChange(ac.acbw, s, lastErr)
 | 
						ac.cc.handleSubConnStateChange(ac.acbw, s, lastErr)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1190,7 +1247,7 @@ func (ac *addrConn) tryAllAddrs(addrs []resolver.Address, connectDeadline time.T
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		ac.mu.Unlock()
 | 
							ac.mu.Unlock()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		channelz.Infof(ac.channelzID, "Subchannel picks a new address %q to connect", addr.Addr)
 | 
							channelz.Infof(logger, ac.channelzID, "Subchannel picks a new address %q to connect", addr.Addr)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		newTr, reconnect, err := ac.createTransport(addr, copts, connectDeadline)
 | 
							newTr, reconnect, err := ac.createTransport(addr, copts, connectDeadline)
 | 
				
			||||||
		if err == nil {
 | 
							if err == nil {
 | 
				
			||||||
| 
						 | 
					@ -1199,7 +1256,7 @@ func (ac *addrConn) tryAllAddrs(addrs []resolver.Address, connectDeadline time.T
 | 
				
			||||||
		if firstConnErr == nil {
 | 
							if firstConnErr == nil {
 | 
				
			||||||
			firstConnErr = err
 | 
								firstConnErr = err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		ac.cc.blockingpicker.updateConnectionError(err)
 | 
							ac.cc.updateConnectionError(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Couldn't connect to any address.
 | 
						// Couldn't connect to any address.
 | 
				
			||||||
| 
						 | 
					@ -1214,16 +1271,9 @@ func (ac *addrConn) createTransport(addr resolver.Address, copts transport.Conne
 | 
				
			||||||
	onCloseCalled := make(chan struct{})
 | 
						onCloseCalled := make(chan struct{})
 | 
				
			||||||
	reconnect := grpcsync.NewEvent()
 | 
						reconnect := grpcsync.NewEvent()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	authority := ac.cc.authority
 | 
					 | 
				
			||||||
	// addr.ServerName takes precedent over ClientConn authority, if present.
 | 
						// addr.ServerName takes precedent over ClientConn authority, if present.
 | 
				
			||||||
	if addr.ServerName != "" {
 | 
						if addr.ServerName == "" {
 | 
				
			||||||
		authority = addr.ServerName
 | 
							addr.ServerName = ac.cc.authority
 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	target := transport.TargetInfo{
 | 
					 | 
				
			||||||
		Addr:      addr.Addr,
 | 
					 | 
				
			||||||
		Metadata:  addr.Metadata,
 | 
					 | 
				
			||||||
		Authority: authority,
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	once := sync.Once{}
 | 
						once := sync.Once{}
 | 
				
			||||||
| 
						 | 
					@ -1269,10 +1319,10 @@ func (ac *addrConn) createTransport(addr resolver.Address, copts transport.Conne
 | 
				
			||||||
		copts.ChannelzParentID = ac.channelzID
 | 
							copts.ChannelzParentID = ac.channelzID
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	newTr, err := transport.NewClientTransport(connectCtx, ac.cc.ctx, target, copts, onPrefaceReceipt, onGoAway, onClose)
 | 
						newTr, err := transport.NewClientTransport(connectCtx, ac.cc.ctx, addr, copts, onPrefaceReceipt, onGoAway, onClose)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		// newTr is either nil, or closed.
 | 
							// newTr is either nil, or closed.
 | 
				
			||||||
		channelz.Warningf(ac.channelzID, "grpc: addrConn.createTransport failed to connect to %v. Err: %v. Reconnecting...", addr, err)
 | 
							channelz.Warningf(logger, ac.channelzID, "grpc: addrConn.createTransport failed to connect to %v. Err: %v. Reconnecting...", addr, err)
 | 
				
			||||||
		return nil, nil, err
 | 
							return nil, nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1280,7 +1330,7 @@ func (ac *addrConn) createTransport(addr resolver.Address, copts transport.Conne
 | 
				
			||||||
	case <-time.After(time.Until(connectDeadline)):
 | 
						case <-time.After(time.Until(connectDeadline)):
 | 
				
			||||||
		// We didn't get the preface in time.
 | 
							// We didn't get the preface in time.
 | 
				
			||||||
		newTr.Close()
 | 
							newTr.Close()
 | 
				
			||||||
		channelz.Warningf(ac.channelzID, "grpc: addrConn.createTransport failed to connect to %v: didn't receive server preface in time. Reconnecting...", addr)
 | 
							channelz.Warningf(logger, ac.channelzID, "grpc: addrConn.createTransport failed to connect to %v: didn't receive server preface in time. Reconnecting...", addr)
 | 
				
			||||||
		return nil, nil, errors.New("timed out waiting for server handshake")
 | 
							return nil, nil, errors.New("timed out waiting for server handshake")
 | 
				
			||||||
	case <-prefaceReceived:
 | 
						case <-prefaceReceived:
 | 
				
			||||||
		// We got the preface - huzzah! things are good.
 | 
							// We got the preface - huzzah! things are good.
 | 
				
			||||||
| 
						 | 
					@ -1297,7 +1347,7 @@ func (ac *addrConn) createTransport(addr resolver.Address, copts transport.Conne
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// LB channel health checking is enabled when all requirements below are met:
 | 
					// LB channel health checking is enabled when all requirements below are met:
 | 
				
			||||||
// 1. it is not disabled by the user with the WithDisableHealthCheck DialOption
 | 
					// 1. it is not disabled by the user with the WithDisableHealthCheck DialOption
 | 
				
			||||||
// 2. internal.HealthCheckFunc is set by importing the grpc/healthcheck package
 | 
					// 2. internal.HealthCheckFunc is set by importing the grpc/health package
 | 
				
			||||||
// 3. a service config with non-empty healthCheckConfig field is provided
 | 
					// 3. a service config with non-empty healthCheckConfig field is provided
 | 
				
			||||||
// 4. the load balancer requests it
 | 
					// 4. the load balancer requests it
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
| 
						 | 
					@ -1327,7 +1377,7 @@ func (ac *addrConn) startHealthCheck(ctx context.Context) {
 | 
				
			||||||
		// The health package is not imported to set health check function.
 | 
							// The health package is not imported to set health check function.
 | 
				
			||||||
		//
 | 
							//
 | 
				
			||||||
		// TODO: add a link to the health check doc in the error message.
 | 
							// TODO: add a link to the health check doc in the error message.
 | 
				
			||||||
		channelz.Error(ac.channelzID, "Health check is requested but health check function is not set.")
 | 
							channelz.Error(logger, ac.channelzID, "Health check is requested but health check function is not set.")
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1357,9 +1407,9 @@ func (ac *addrConn) startHealthCheck(ctx context.Context) {
 | 
				
			||||||
		err := ac.cc.dopts.healthCheckFunc(ctx, newStream, setConnectivityState, healthCheckConfig.ServiceName)
 | 
							err := ac.cc.dopts.healthCheckFunc(ctx, newStream, setConnectivityState, healthCheckConfig.ServiceName)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			if status.Code(err) == codes.Unimplemented {
 | 
								if status.Code(err) == codes.Unimplemented {
 | 
				
			||||||
				channelz.Error(ac.channelzID, "Subchannel health check is unimplemented at server side, thus health check is disabled")
 | 
									channelz.Error(logger, ac.channelzID, "Subchannel health check is unimplemented at server side, thus health check is disabled")
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				channelz.Errorf(ac.channelzID, "HealthCheckFunc exits with unexpected error %v", err)
 | 
									channelz.Errorf(logger, ac.channelzID, "HealthCheckFunc exits with unexpected error %v", err)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}()
 | 
						}()
 | 
				
			||||||
| 
						 | 
					@ -1424,12 +1474,12 @@ func (ac *addrConn) tearDown(err error) {
 | 
				
			||||||
		ac.mu.Lock()
 | 
							ac.mu.Lock()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if channelz.IsOn() {
 | 
						if channelz.IsOn() {
 | 
				
			||||||
		channelz.AddTraceEvent(ac.channelzID, 0, &channelz.TraceEventDesc{
 | 
							channelz.AddTraceEvent(logger, ac.channelzID, 0, &channelz.TraceEventDesc{
 | 
				
			||||||
			Desc:     "Subchannel Deleted",
 | 
								Desc:     "Subchannel Deleted",
 | 
				
			||||||
			Severity: channelz.CtINFO,
 | 
								Severity: channelz.CtInfo,
 | 
				
			||||||
			Parent: &channelz.TraceEventDesc{
 | 
								Parent: &channelz.TraceEventDesc{
 | 
				
			||||||
				Desc:     fmt.Sprintf("Subchanel(id:%d) deleted", ac.channelzID),
 | 
									Desc:     fmt.Sprintf("Subchanel(id:%d) deleted", ac.channelzID),
 | 
				
			||||||
				Severity: channelz.CtINFO,
 | 
									Severity: channelz.CtInfo,
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
		// TraceEvent needs to be called before RemoveEntry, as TraceEvent may add trace reference to
 | 
							// TraceEvent needs to be called before RemoveEntry, as TraceEvent may add trace reference to
 | 
				
			||||||
| 
						 | 
					@ -1532,3 +1582,15 @@ func (cc *ClientConn) getResolver(scheme string) resolver.Builder {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return resolver.Get(scheme)
 | 
						return resolver.Get(scheme)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (cc *ClientConn) updateConnectionError(err error) {
 | 
				
			||||||
 | 
						cc.lceMu.Lock()
 | 
				
			||||||
 | 
						cc.lastConnectionError = err
 | 
				
			||||||
 | 
						cc.lceMu.Unlock()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (cc *ClientConn) connectionError() error {
 | 
				
			||||||
 | 
						cc.lceMu.Lock()
 | 
				
			||||||
 | 
						defer cc.lceMu.Unlock()
 | 
				
			||||||
 | 
						return cc.lastConnectionError
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -33,6 +33,9 @@ const (
 | 
				
			||||||
	OK Code = 0
 | 
						OK Code = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Canceled indicates the operation was canceled (typically by the caller).
 | 
						// Canceled indicates the operation was canceled (typically by the caller).
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// The gRPC framework will generate this error code when cancellation
 | 
				
			||||||
 | 
						// is requested.
 | 
				
			||||||
	Canceled Code = 1
 | 
						Canceled Code = 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Unknown error. An example of where this error may be returned is
 | 
						// Unknown error. An example of where this error may be returned is
 | 
				
			||||||
| 
						 | 
					@ -40,12 +43,17 @@ const (
 | 
				
			||||||
	// an error-space that is not known in this address space. Also
 | 
						// an error-space that is not known in this address space. Also
 | 
				
			||||||
	// errors raised by APIs that do not return enough error information
 | 
						// errors raised by APIs that do not return enough error information
 | 
				
			||||||
	// may be converted to this error.
 | 
						// may be converted to this error.
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// The gRPC framework will generate this error code in the above two
 | 
				
			||||||
 | 
						// mentioned cases.
 | 
				
			||||||
	Unknown Code = 2
 | 
						Unknown Code = 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// InvalidArgument indicates client specified an invalid argument.
 | 
						// InvalidArgument indicates client specified an invalid argument.
 | 
				
			||||||
	// Note that this differs from FailedPrecondition. It indicates arguments
 | 
						// Note that this differs from FailedPrecondition. It indicates arguments
 | 
				
			||||||
	// that are problematic regardless of the state of the system
 | 
						// that are problematic regardless of the state of the system
 | 
				
			||||||
	// (e.g., a malformed file name).
 | 
						// (e.g., a malformed file name).
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// This error code will not be generated by the gRPC framework.
 | 
				
			||||||
	InvalidArgument Code = 3
 | 
						InvalidArgument Code = 3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// DeadlineExceeded means operation expired before completion.
 | 
						// DeadlineExceeded means operation expired before completion.
 | 
				
			||||||
| 
						 | 
					@ -53,14 +61,21 @@ const (
 | 
				
			||||||
	// returned even if the operation has completed successfully. For
 | 
						// returned even if the operation has completed successfully. For
 | 
				
			||||||
	// example, a successful response from a server could have been delayed
 | 
						// example, a successful response from a server could have been delayed
 | 
				
			||||||
	// long enough for the deadline to expire.
 | 
						// long enough for the deadline to expire.
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// The gRPC framework will generate this error code when the deadline is
 | 
				
			||||||
 | 
						// exceeded.
 | 
				
			||||||
	DeadlineExceeded Code = 4
 | 
						DeadlineExceeded Code = 4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// NotFound means some requested entity (e.g., file or directory) was
 | 
						// NotFound means some requested entity (e.g., file or directory) was
 | 
				
			||||||
	// not found.
 | 
						// not found.
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// This error code will not be generated by the gRPC framework.
 | 
				
			||||||
	NotFound Code = 5
 | 
						NotFound Code = 5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// AlreadyExists means an attempt to create an entity failed because one
 | 
						// AlreadyExists means an attempt to create an entity failed because one
 | 
				
			||||||
	// already exists.
 | 
						// already exists.
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// This error code will not be generated by the gRPC framework.
 | 
				
			||||||
	AlreadyExists Code = 6
 | 
						AlreadyExists Code = 6
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// PermissionDenied indicates the caller does not have permission to
 | 
						// PermissionDenied indicates the caller does not have permission to
 | 
				
			||||||
| 
						 | 
					@ -69,10 +84,17 @@ const (
 | 
				
			||||||
	// instead for those errors). It must not be
 | 
						// instead for those errors). It must not be
 | 
				
			||||||
	// used if the caller cannot be identified (use Unauthenticated
 | 
						// used if the caller cannot be identified (use Unauthenticated
 | 
				
			||||||
	// instead for those errors).
 | 
						// instead for those errors).
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// This error code will not be generated by the gRPC core framework,
 | 
				
			||||||
 | 
						// but expect authentication middleware to use it.
 | 
				
			||||||
	PermissionDenied Code = 7
 | 
						PermissionDenied Code = 7
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// ResourceExhausted indicates some resource has been exhausted, perhaps
 | 
						// ResourceExhausted indicates some resource has been exhausted, perhaps
 | 
				
			||||||
	// a per-user quota, or perhaps the entire file system is out of space.
 | 
						// a per-user quota, or perhaps the entire file system is out of space.
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// This error code will be generated by the gRPC framework in
 | 
				
			||||||
 | 
						// out-of-memory and server overload situations, or when a message is
 | 
				
			||||||
 | 
						// larger than the configured maximum size.
 | 
				
			||||||
	ResourceExhausted Code = 8
 | 
						ResourceExhausted Code = 8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// FailedPrecondition indicates operation was rejected because the
 | 
						// FailedPrecondition indicates operation was rejected because the
 | 
				
			||||||
| 
						 | 
					@ -94,6 +116,8 @@ const (
 | 
				
			||||||
	//      REST Get/Update/Delete on a resource and the resource on the
 | 
						//      REST Get/Update/Delete on a resource and the resource on the
 | 
				
			||||||
	//      server does not match the condition. E.g., conflicting
 | 
						//      server does not match the condition. E.g., conflicting
 | 
				
			||||||
	//      read-modify-write on the same resource.
 | 
						//      read-modify-write on the same resource.
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// This error code will not be generated by the gRPC framework.
 | 
				
			||||||
	FailedPrecondition Code = 9
 | 
						FailedPrecondition Code = 9
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Aborted indicates the operation was aborted, typically due to a
 | 
						// Aborted indicates the operation was aborted, typically due to a
 | 
				
			||||||
| 
						 | 
					@ -102,6 +126,8 @@ const (
 | 
				
			||||||
	//
 | 
						//
 | 
				
			||||||
	// See litmus test above for deciding between FailedPrecondition,
 | 
						// See litmus test above for deciding between FailedPrecondition,
 | 
				
			||||||
	// Aborted, and Unavailable.
 | 
						// Aborted, and Unavailable.
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// This error code will not be generated by the gRPC framework.
 | 
				
			||||||
	Aborted Code = 10
 | 
						Aborted Code = 10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// OutOfRange means operation was attempted past the valid range.
 | 
						// OutOfRange means operation was attempted past the valid range.
 | 
				
			||||||
| 
						 | 
					@ -119,15 +145,26 @@ const (
 | 
				
			||||||
	// error) when it applies so that callers who are iterating through
 | 
						// error) when it applies so that callers who are iterating through
 | 
				
			||||||
	// a space can easily look for an OutOfRange error to detect when
 | 
						// a space can easily look for an OutOfRange error to detect when
 | 
				
			||||||
	// they are done.
 | 
						// they are done.
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// This error code will not be generated by the gRPC framework.
 | 
				
			||||||
	OutOfRange Code = 11
 | 
						OutOfRange Code = 11
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Unimplemented indicates operation is not implemented or not
 | 
						// Unimplemented indicates operation is not implemented or not
 | 
				
			||||||
	// supported/enabled in this service.
 | 
						// supported/enabled in this service.
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// This error code will be generated by the gRPC framework. Most
 | 
				
			||||||
 | 
						// commonly, you will see this error code when a method implementation
 | 
				
			||||||
 | 
						// is missing on the server. It can also be generated for unknown
 | 
				
			||||||
 | 
						// compression algorithms or a disagreement as to whether an RPC should
 | 
				
			||||||
 | 
						// be streaming.
 | 
				
			||||||
	Unimplemented Code = 12
 | 
						Unimplemented Code = 12
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Internal errors. Means some invariants expected by underlying
 | 
						// Internal errors. Means some invariants expected by underlying
 | 
				
			||||||
	// system has been broken. If you see one of these errors,
 | 
						// system has been broken. If you see one of these errors,
 | 
				
			||||||
	// something is very broken.
 | 
						// something is very broken.
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// This error code will be generated by the gRPC framework in several
 | 
				
			||||||
 | 
						// internal error conditions.
 | 
				
			||||||
	Internal Code = 13
 | 
						Internal Code = 13
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Unavailable indicates the service is currently unavailable.
 | 
						// Unavailable indicates the service is currently unavailable.
 | 
				
			||||||
| 
						 | 
					@ -137,13 +174,22 @@ const (
 | 
				
			||||||
	//
 | 
						//
 | 
				
			||||||
	// See litmus test above for deciding between FailedPrecondition,
 | 
						// See litmus test above for deciding between FailedPrecondition,
 | 
				
			||||||
	// Aborted, and Unavailable.
 | 
						// Aborted, and Unavailable.
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// This error code will be generated by the gRPC framework during
 | 
				
			||||||
 | 
						// abrupt shutdown of a server process or network connection.
 | 
				
			||||||
	Unavailable Code = 14
 | 
						Unavailable Code = 14
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// DataLoss indicates unrecoverable data loss or corruption.
 | 
						// DataLoss indicates unrecoverable data loss or corruption.
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// This error code will not be generated by the gRPC framework.
 | 
				
			||||||
	DataLoss Code = 15
 | 
						DataLoss Code = 15
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Unauthenticated indicates the request does not have valid
 | 
						// Unauthenticated indicates the request does not have valid
 | 
				
			||||||
	// authentication credentials for the operation.
 | 
						// authentication credentials for the operation.
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// The gRPC framework will generate this error code when the
 | 
				
			||||||
 | 
						// authentication metadata is invalid or a Credentials callback fails,
 | 
				
			||||||
 | 
						// but also expect authentication middleware to generate it.
 | 
				
			||||||
	Unauthenticated Code = 16
 | 
						Unauthenticated Code = 16
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	_maxCode = 17
 | 
						_maxCode = 17
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -22,11 +22,11 @@
 | 
				
			||||||
package connectivity
 | 
					package connectivity
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"context"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"google.golang.org/grpc/grpclog"
 | 
						"google.golang.org/grpc/grpclog"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var logger = grpclog.Component("core")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// State indicates the state of connectivity.
 | 
					// State indicates the state of connectivity.
 | 
				
			||||||
// It can be the state of a ClientConn or SubConn.
 | 
					// It can be the state of a ClientConn or SubConn.
 | 
				
			||||||
type State int
 | 
					type State int
 | 
				
			||||||
| 
						 | 
					@ -44,7 +44,7 @@ func (s State) String() string {
 | 
				
			||||||
	case Shutdown:
 | 
						case Shutdown:
 | 
				
			||||||
		return "SHUTDOWN"
 | 
							return "SHUTDOWN"
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		grpclog.Errorf("unknown connectivity state: %d", s)
 | 
							logger.Errorf("unknown connectivity state: %d", s)
 | 
				
			||||||
		return "Invalid-State"
 | 
							return "Invalid-State"
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -61,13 +61,3 @@ const (
 | 
				
			||||||
	// Shutdown indicates the ClientConn has started shutting down.
 | 
						// Shutdown indicates the ClientConn has started shutting down.
 | 
				
			||||||
	Shutdown
 | 
						Shutdown
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					 | 
				
			||||||
// Reporter reports the connectivity states.
 | 
					 | 
				
			||||||
type Reporter interface {
 | 
					 | 
				
			||||||
	// CurrentState returns the current state of the reporter.
 | 
					 | 
				
			||||||
	CurrentState() State
 | 
					 | 
				
			||||||
	// WaitForStateChange blocks until the reporter's state is different from the given state,
 | 
					 | 
				
			||||||
	// and returns true.
 | 
					 | 
				
			||||||
	// It returns false if <-ctx.Done() can proceed (ctx got timeout or got canceled).
 | 
					 | 
				
			||||||
	WaitForStateChange(context.Context, State) bool
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -29,6 +29,7 @@ import (
 | 
				
			||||||
	"net"
 | 
						"net"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/golang/protobuf/proto"
 | 
						"github.com/golang/protobuf/proto"
 | 
				
			||||||
 | 
						"google.golang.org/grpc/attributes"
 | 
				
			||||||
	"google.golang.org/grpc/internal"
 | 
						"google.golang.org/grpc/internal"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -57,9 +58,11 @@ type PerRPCCredentials interface {
 | 
				
			||||||
type SecurityLevel int
 | 
					type SecurityLevel int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
	// NoSecurity indicates a connection is insecure.
 | 
						// InvalidSecurityLevel indicates an invalid security level.
 | 
				
			||||||
	// The zero SecurityLevel value is invalid for backward compatibility.
 | 
						// The zero SecurityLevel value is invalid for backward compatibility.
 | 
				
			||||||
	NoSecurity SecurityLevel = iota + 1
 | 
						InvalidSecurityLevel SecurityLevel = iota
 | 
				
			||||||
 | 
						// NoSecurity indicates a connection is insecure.
 | 
				
			||||||
 | 
						NoSecurity
 | 
				
			||||||
	// IntegrityOnly indicates a connection only provides integrity protection.
 | 
						// IntegrityOnly indicates a connection only provides integrity protection.
 | 
				
			||||||
	IntegrityOnly
 | 
						IntegrityOnly
 | 
				
			||||||
	// PrivacyAndIntegrity indicates a connection provides both privacy and integrity protection.
 | 
						// PrivacyAndIntegrity indicates a connection provides both privacy and integrity protection.
 | 
				
			||||||
| 
						 | 
					@ -89,7 +92,7 @@ type CommonAuthInfo struct {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GetCommonAuthInfo returns the pointer to CommonAuthInfo struct.
 | 
					// GetCommonAuthInfo returns the pointer to CommonAuthInfo struct.
 | 
				
			||||||
func (c *CommonAuthInfo) GetCommonAuthInfo() *CommonAuthInfo {
 | 
					func (c CommonAuthInfo) GetCommonAuthInfo() CommonAuthInfo {
 | 
				
			||||||
	return c
 | 
						return c
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -124,15 +127,18 @@ var ErrConnDispatched = errors.New("credentials: rawConn is dispatched out of gR
 | 
				
			||||||
// TransportCredentials defines the common interface for all the live gRPC wire
 | 
					// TransportCredentials defines the common interface for all the live gRPC wire
 | 
				
			||||||
// protocols and supported transport security protocols (e.g., TLS, SSL).
 | 
					// protocols and supported transport security protocols (e.g., TLS, SSL).
 | 
				
			||||||
type TransportCredentials interface {
 | 
					type TransportCredentials interface {
 | 
				
			||||||
	// ClientHandshake does the authentication handshake specified by the corresponding
 | 
						// ClientHandshake does the authentication handshake specified by the
 | 
				
			||||||
	// authentication protocol on rawConn for clients. It returns the authenticated
 | 
						// corresponding authentication protocol on rawConn for clients. It returns
 | 
				
			||||||
	// connection and the corresponding auth information about the connection.
 | 
						// the authenticated connection and the corresponding auth information
 | 
				
			||||||
	// The auth information should embed CommonAuthInfo to return additional information about
 | 
						// about the connection.  The auth information should embed CommonAuthInfo
 | 
				
			||||||
	// the credentials. Implementations must use the provided context to implement timely cancellation.
 | 
						// to return additional information about the credentials. Implementations
 | 
				
			||||||
	// gRPC will try to reconnect if the error returned is a temporary error
 | 
						// must use the provided context to implement timely cancellation.  gRPC
 | 
				
			||||||
	// (io.EOF, context.DeadlineExceeded or err.Temporary() == true).
 | 
						// will try to reconnect if the error returned is a temporary error
 | 
				
			||||||
	// If the returned error is a wrapper error, implementations should make sure that
 | 
						// (io.EOF, context.DeadlineExceeded or err.Temporary() == true).  If the
 | 
				
			||||||
 | 
						// returned error is a wrapper error, implementations should make sure that
 | 
				
			||||||
	// the error implements Temporary() to have the correct retry behaviors.
 | 
						// the error implements Temporary() to have the correct retry behaviors.
 | 
				
			||||||
 | 
						// Additionally, ClientHandshakeInfo data will be available via the context
 | 
				
			||||||
 | 
						// passed to this call.
 | 
				
			||||||
	//
 | 
						//
 | 
				
			||||||
	// If the returned net.Conn is closed, it MUST close the net.Conn provided.
 | 
						// If the returned net.Conn is closed, it MUST close the net.Conn provided.
 | 
				
			||||||
	ClientHandshake(context.Context, string, net.Conn) (net.Conn, AuthInfo, error)
 | 
						ClientHandshake(context.Context, string, net.Conn) (net.Conn, AuthInfo, error)
 | 
				
			||||||
| 
						 | 
					@ -193,22 +199,46 @@ func RequestInfoFromContext(ctx context.Context) (ri RequestInfo, ok bool) {
 | 
				
			||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ClientHandshakeInfo holds data to be passed to ClientHandshake. This makes
 | 
				
			||||||
 | 
					// it possible to pass arbitrary data to the handshaker from gRPC, resolver,
 | 
				
			||||||
 | 
					// balancer etc. Individual credential implementations control the actual
 | 
				
			||||||
 | 
					// format of the data that they are willing to receive.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// This API is experimental.
 | 
				
			||||||
 | 
					type ClientHandshakeInfo struct {
 | 
				
			||||||
 | 
						// Attributes contains the attributes for the address. It could be provided
 | 
				
			||||||
 | 
						// by the gRPC, resolver, balancer etc.
 | 
				
			||||||
 | 
						Attributes *attributes.Attributes
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// clientHandshakeInfoKey is a struct used as the key to store
 | 
				
			||||||
 | 
					// ClientHandshakeInfo in a context.
 | 
				
			||||||
 | 
					type clientHandshakeInfoKey struct{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ClientHandshakeInfoFromContext returns the ClientHandshakeInfo struct stored
 | 
				
			||||||
 | 
					// in ctx.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// This API is experimental.
 | 
				
			||||||
 | 
					func ClientHandshakeInfoFromContext(ctx context.Context) ClientHandshakeInfo {
 | 
				
			||||||
 | 
						chi, _ := ctx.Value(clientHandshakeInfoKey{}).(ClientHandshakeInfo)
 | 
				
			||||||
 | 
						return chi
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// CheckSecurityLevel checks if a connection's security level is greater than or equal to the specified one.
 | 
					// 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 satisified 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.
 | 
					// 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.
 | 
					// This API is experimental.
 | 
				
			||||||
func CheckSecurityLevel(ctx context.Context, level SecurityLevel) error {
 | 
					func CheckSecurityLevel(ai AuthInfo, level SecurityLevel) error {
 | 
				
			||||||
	type internalInfo interface {
 | 
						type internalInfo interface {
 | 
				
			||||||
		GetCommonAuthInfo() *CommonAuthInfo
 | 
							GetCommonAuthInfo() CommonAuthInfo
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	ri, _ := RequestInfoFromContext(ctx)
 | 
						if ai == nil {
 | 
				
			||||||
	if ri.AuthInfo == nil {
 | 
							return errors.New("AuthInfo is nil")
 | 
				
			||||||
		return errors.New("unable to obtain SecurityLevel from context")
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if ci, ok := ri.AuthInfo.(internalInfo); ok {
 | 
						if ci, ok := ai.(internalInfo); ok {
 | 
				
			||||||
		// CommonAuthInfo.SecurityLevel has an invalid value.
 | 
							// CommonAuthInfo.SecurityLevel has an invalid value.
 | 
				
			||||||
		if ci.GetCommonAuthInfo().SecurityLevel == 0 {
 | 
							if ci.GetCommonAuthInfo().SecurityLevel == InvalidSecurityLevel {
 | 
				
			||||||
			return nil
 | 
								return nil
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if ci.GetCommonAuthInfo().SecurityLevel < level {
 | 
							if ci.GetCommonAuthInfo().SecurityLevel < level {
 | 
				
			||||||
| 
						 | 
					@ -223,6 +253,9 @@ func init() {
 | 
				
			||||||
	internal.NewRequestInfoContext = func(ctx context.Context, ri RequestInfo) context.Context {
 | 
						internal.NewRequestInfoContext = func(ctx context.Context, ri RequestInfo) context.Context {
 | 
				
			||||||
		return context.WithValue(ctx, requestInfoKey{}, ri)
 | 
							return context.WithValue(ctx, requestInfoKey{}, ri)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						internal.NewClientHandshakeInfoContext = func(ctx context.Context, chi ClientHandshakeInfo) context.Context {
 | 
				
			||||||
 | 
							return context.WithValue(ctx, clientHandshakeInfoKey{}, chi)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ChannelzSecurityInfo defines the interface that security protocols should implement
 | 
					// ChannelzSecurityInfo defines the interface that security protocols should implement
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,8 +25,9 @@ import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"io/ioutil"
 | 
						"io/ioutil"
 | 
				
			||||||
	"net"
 | 
						"net"
 | 
				
			||||||
 | 
						"net/url"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"google.golang.org/grpc/credentials/internal"
 | 
						credinternal "google.golang.org/grpc/internal/credentials"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// TLSInfo contains the auth information for a TLS authenticated connection.
 | 
					// TLSInfo contains the auth information for a TLS authenticated connection.
 | 
				
			||||||
| 
						 | 
					@ -34,6 +35,8 @@ import (
 | 
				
			||||||
type TLSInfo struct {
 | 
					type TLSInfo struct {
 | 
				
			||||||
	State tls.ConnectionState
 | 
						State tls.ConnectionState
 | 
				
			||||||
	CommonAuthInfo
 | 
						CommonAuthInfo
 | 
				
			||||||
 | 
						// This API is experimental.
 | 
				
			||||||
 | 
						SPIFFEID *url.URL
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// AuthType returns the type of TLSInfo as a string.
 | 
					// AuthType returns the type of TLSInfo as a string.
 | 
				
			||||||
| 
						 | 
					@ -69,7 +72,7 @@ func (c tlsCreds) Info() ProtocolInfo {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (c *tlsCreds) ClientHandshake(ctx context.Context, authority string, rawConn net.Conn) (_ net.Conn, _ AuthInfo, err error) {
 | 
					func (c *tlsCreds) ClientHandshake(ctx context.Context, authority string, rawConn net.Conn) (_ net.Conn, _ AuthInfo, err error) {
 | 
				
			||||||
	// use local cfg to avoid clobbering ServerName if using multiple endpoints
 | 
						// use local cfg to avoid clobbering ServerName if using multiple endpoints
 | 
				
			||||||
	cfg := cloneTLSConfig(c.config)
 | 
						cfg := credinternal.CloneTLSConfig(c.config)
 | 
				
			||||||
	if cfg.ServerName == "" {
 | 
						if cfg.ServerName == "" {
 | 
				
			||||||
		serverName, _, err := net.SplitHostPort(authority)
 | 
							serverName, _, err := net.SplitHostPort(authority)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
| 
						 | 
					@ -94,7 +97,17 @@ func (c *tlsCreds) ClientHandshake(ctx context.Context, authority string, rawCon
 | 
				
			||||||
		conn.Close()
 | 
							conn.Close()
 | 
				
			||||||
		return nil, nil, ctx.Err()
 | 
							return nil, nil, ctx.Err()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return internal.WrapSyscallConn(rawConn, conn), TLSInfo{conn.ConnectionState(), CommonAuthInfo{PrivacyAndIntegrity}}, nil
 | 
						tlsInfo := TLSInfo{
 | 
				
			||||||
 | 
							State: conn.ConnectionState(),
 | 
				
			||||||
 | 
							CommonAuthInfo: CommonAuthInfo{
 | 
				
			||||||
 | 
								SecurityLevel: PrivacyAndIntegrity,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						id := credinternal.SPIFFEIDFromState(conn.ConnectionState())
 | 
				
			||||||
 | 
						if id != nil {
 | 
				
			||||||
 | 
							tlsInfo.SPIFFEID = id
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return credinternal.WrapSyscallConn(rawConn, conn), tlsInfo, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (c *tlsCreds) ServerHandshake(rawConn net.Conn) (net.Conn, AuthInfo, error) {
 | 
					func (c *tlsCreds) ServerHandshake(rawConn net.Conn) (net.Conn, AuthInfo, error) {
 | 
				
			||||||
| 
						 | 
					@ -103,7 +116,17 @@ func (c *tlsCreds) ServerHandshake(rawConn net.Conn) (net.Conn, AuthInfo, error)
 | 
				
			||||||
		conn.Close()
 | 
							conn.Close()
 | 
				
			||||||
		return nil, nil, err
 | 
							return nil, nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return internal.WrapSyscallConn(rawConn, conn), TLSInfo{conn.ConnectionState(), CommonAuthInfo{PrivacyAndIntegrity}}, nil
 | 
						tlsInfo := TLSInfo{
 | 
				
			||||||
 | 
							State: conn.ConnectionState(),
 | 
				
			||||||
 | 
							CommonAuthInfo: CommonAuthInfo{
 | 
				
			||||||
 | 
								SecurityLevel: PrivacyAndIntegrity,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						id := credinternal.SPIFFEIDFromState(conn.ConnectionState())
 | 
				
			||||||
 | 
						if id != nil {
 | 
				
			||||||
 | 
							tlsInfo.SPIFFEID = id
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return credinternal.WrapSyscallConn(rawConn, conn), tlsInfo, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (c *tlsCreds) Clone() TransportCredentials {
 | 
					func (c *tlsCreds) Clone() TransportCredentials {
 | 
				
			||||||
| 
						 | 
					@ -115,23 +138,10 @@ func (c *tlsCreds) OverrideServerName(serverNameOverride string) error {
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const alpnProtoStrH2 = "h2"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func appendH2ToNextProtos(ps []string) []string {
 | 
					 | 
				
			||||||
	for _, p := range ps {
 | 
					 | 
				
			||||||
		if p == alpnProtoStrH2 {
 | 
					 | 
				
			||||||
			return ps
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	ret := make([]string, 0, len(ps)+1)
 | 
					 | 
				
			||||||
	ret = append(ret, ps...)
 | 
					 | 
				
			||||||
	return append(ret, alpnProtoStrH2)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// NewTLS uses c to construct a TransportCredentials based on TLS.
 | 
					// NewTLS uses c to construct a TransportCredentials based on TLS.
 | 
				
			||||||
func NewTLS(c *tls.Config) TransportCredentials {
 | 
					func NewTLS(c *tls.Config) TransportCredentials {
 | 
				
			||||||
	tc := &tlsCreds{cloneTLSConfig(c)}
 | 
						tc := &tlsCreds{credinternal.CloneTLSConfig(c)}
 | 
				
			||||||
	tc.config.NextProtos = appendH2ToNextProtos(tc.config.NextProtos)
 | 
						tc.config.NextProtos = credinternal.AppendH2ToNextProtos(tc.config.NextProtos)
 | 
				
			||||||
	return tc
 | 
						return tc
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -185,7 +195,10 @@ func NewServerTLSFromFile(certFile, keyFile string) (TransportCredentials, error
 | 
				
			||||||
// TLSChannelzSecurityValue defines the struct that TLS protocol should return
 | 
					// TLSChannelzSecurityValue defines the struct that TLS protocol should return
 | 
				
			||||||
// from GetSecurityValue(), containing security info like cipher and certificate used.
 | 
					// from GetSecurityValue(), containing security info like cipher and certificate used.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// This API is EXPERIMENTAL.
 | 
					// Experimental
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Notice: This type is EXPERIMENTAL and may be changed or removed in a
 | 
				
			||||||
 | 
					// later release.
 | 
				
			||||||
type TLSChannelzSecurityValue struct {
 | 
					type TLSChannelzSecurityValue struct {
 | 
				
			||||||
	ChannelzSecurityValue
 | 
						ChannelzSecurityValue
 | 
				
			||||||
	StandardName      string
 | 
						StandardName      string
 | 
				
			||||||
| 
						 | 
					@ -218,18 +231,3 @@ var cipherSuiteLookup = map[uint16]string{
 | 
				
			||||||
	tls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305:    "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305",
 | 
						tls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305:    "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305",
 | 
				
			||||||
	tls.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305:  "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305",
 | 
						tls.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305:  "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305",
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
// cloneTLSConfig returns a shallow clone of the exported
 | 
					 | 
				
			||||||
// fields of cfg, ignoring the unexported sync.Once, which
 | 
					 | 
				
			||||||
// contains a mutex and must not be copied.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// If cfg is nil, a new zero tls.Config is returned.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// TODO: inline this function if possible.
 | 
					 | 
				
			||||||
func cloneTLSConfig(cfg *tls.Config) *tls.Config {
 | 
					 | 
				
			||||||
	if cfg == nil {
 | 
					 | 
				
			||||||
		return &tls.Config{}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return cfg.Clone()
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -27,7 +27,6 @@ import (
 | 
				
			||||||
	"google.golang.org/grpc/backoff"
 | 
						"google.golang.org/grpc/backoff"
 | 
				
			||||||
	"google.golang.org/grpc/balancer"
 | 
						"google.golang.org/grpc/balancer"
 | 
				
			||||||
	"google.golang.org/grpc/credentials"
 | 
						"google.golang.org/grpc/credentials"
 | 
				
			||||||
	"google.golang.org/grpc/grpclog"
 | 
					 | 
				
			||||||
	"google.golang.org/grpc/internal"
 | 
						"google.golang.org/grpc/internal"
 | 
				
			||||||
	internalbackoff "google.golang.org/grpc/internal/backoff"
 | 
						internalbackoff "google.golang.org/grpc/internal/backoff"
 | 
				
			||||||
	"google.golang.org/grpc/internal/envconfig"
 | 
						"google.golang.org/grpc/internal/envconfig"
 | 
				
			||||||
| 
						 | 
					@ -46,18 +45,18 @@ type dialOptions struct {
 | 
				
			||||||
	chainUnaryInts  []UnaryClientInterceptor
 | 
						chainUnaryInts  []UnaryClientInterceptor
 | 
				
			||||||
	chainStreamInts []StreamClientInterceptor
 | 
						chainStreamInts []StreamClientInterceptor
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cp          Compressor
 | 
						cp              Compressor
 | 
				
			||||||
	dc          Decompressor
 | 
						dc              Decompressor
 | 
				
			||||||
	bs          internalbackoff.Strategy
 | 
						bs              internalbackoff.Strategy
 | 
				
			||||||
	block       bool
 | 
						block           bool
 | 
				
			||||||
	insecure    bool
 | 
						returnLastError bool
 | 
				
			||||||
	timeout     time.Duration
 | 
						insecure        bool
 | 
				
			||||||
	scChan      <-chan ServiceConfig
 | 
						timeout         time.Duration
 | 
				
			||||||
	authority   string
 | 
						scChan          <-chan ServiceConfig
 | 
				
			||||||
	copts       transport.ConnectOptions
 | 
						authority       string
 | 
				
			||||||
	callOptions []CallOption
 | 
						copts           transport.ConnectOptions
 | 
				
			||||||
	// This is used by v1 balancer dial option WithBalancer to support v1
 | 
						callOptions     []CallOption
 | 
				
			||||||
	// balancer, and also by WithBalancerName dial option.
 | 
						// This is used by WithBalancerName dial option.
 | 
				
			||||||
	balancerBuilder             balancer.Builder
 | 
						balancerBuilder             balancer.Builder
 | 
				
			||||||
	channelzParentID            int64
 | 
						channelzParentID            int64
 | 
				
			||||||
	disableServiceConfig        bool
 | 
						disableServiceConfig        bool
 | 
				
			||||||
| 
						 | 
					@ -72,7 +71,6 @@ type dialOptions struct {
 | 
				
			||||||
	// we need to be able to configure this in tests.
 | 
						// we need to be able to configure this in tests.
 | 
				
			||||||
	resolveNowBackoff func(int) time.Duration
 | 
						resolveNowBackoff func(int) time.Duration
 | 
				
			||||||
	resolvers         []resolver.Builder
 | 
						resolvers         []resolver.Builder
 | 
				
			||||||
	withProxy         bool
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// DialOption configures how we set up the connection.
 | 
					// DialOption configures how we set up the connection.
 | 
				
			||||||
| 
						 | 
					@ -83,7 +81,10 @@ type DialOption interface {
 | 
				
			||||||
// EmptyDialOption does not alter the dial configuration. It can be embedded in
 | 
					// EmptyDialOption does not alter the dial configuration. It can be embedded in
 | 
				
			||||||
// another structure to build custom dial options.
 | 
					// another structure to build custom dial options.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// This API is EXPERIMENTAL.
 | 
					// Experimental
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Notice: This type is EXPERIMENTAL and may be changed or removed in a
 | 
				
			||||||
 | 
					// later release.
 | 
				
			||||||
type EmptyDialOption struct{}
 | 
					type EmptyDialOption struct{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (EmptyDialOption) apply(*dialOptions) {}
 | 
					func (EmptyDialOption) apply(*dialOptions) {}
 | 
				
			||||||
| 
						 | 
					@ -199,19 +200,6 @@ func WithDecompressor(dc Decompressor) DialOption {
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// WithBalancer returns a DialOption which sets a load balancer with the v1 API.
 | 
					 | 
				
			||||||
// Name resolver will be ignored if this DialOption is specified.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Deprecated: use the new balancer APIs in balancer package and
 | 
					 | 
				
			||||||
// WithBalancerName.  Will be removed in a future 1.x release.
 | 
					 | 
				
			||||||
func WithBalancer(b Balancer) DialOption {
 | 
					 | 
				
			||||||
	return newFuncDialOption(func(o *dialOptions) {
 | 
					 | 
				
			||||||
		o.balancerBuilder = &balancerWrapperBuilder{
 | 
					 | 
				
			||||||
			b: b,
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// WithBalancerName sets the balancer that the ClientConn will be initialized
 | 
					// WithBalancerName sets the balancer that the ClientConn will be initialized
 | 
				
			||||||
// with. Balancer registered with balancerName will be used. This function
 | 
					// with. Balancer registered with balancerName will be used. This function
 | 
				
			||||||
// panics if no balancer was registered by balancerName.
 | 
					// panics if no balancer was registered by balancerName.
 | 
				
			||||||
| 
						 | 
					@ -252,7 +240,10 @@ func WithServiceConfig(c <-chan ServiceConfig) DialOption {
 | 
				
			||||||
// using the backoff.DefaultConfig as a base, in cases where you want to
 | 
					// using the backoff.DefaultConfig as a base, in cases where you want to
 | 
				
			||||||
// override only a subset of the backoff configuration.
 | 
					// override only a subset of the backoff configuration.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// This API is EXPERIMENTAL.
 | 
					// Experimental
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Notice: This API is EXPERIMENTAL and may be changed or removed in a
 | 
				
			||||||
 | 
					// later release.
 | 
				
			||||||
func WithConnectParams(p ConnectParams) DialOption {
 | 
					func WithConnectParams(p ConnectParams) DialOption {
 | 
				
			||||||
	return newFuncDialOption(func(o *dialOptions) {
 | 
						return newFuncDialOption(func(o *dialOptions) {
 | 
				
			||||||
		o.bs = internalbackoff.Exponential{Config: p.Backoff}
 | 
							o.bs = internalbackoff.Exponential{Config: p.Backoff}
 | 
				
			||||||
| 
						 | 
					@ -299,6 +290,22 @@ func WithBlock() DialOption {
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// WithReturnConnectionError returns a DialOption which makes the client connection
 | 
				
			||||||
 | 
					// return a string containing both the last connection error that occurred and
 | 
				
			||||||
 | 
					// the context.DeadlineExceeded error.
 | 
				
			||||||
 | 
					// Implies WithBlock()
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Experimental
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Notice: This API is EXPERIMENTAL and may be changed or removed in a
 | 
				
			||||||
 | 
					// later release.
 | 
				
			||||||
 | 
					func WithReturnConnectionError() DialOption {
 | 
				
			||||||
 | 
						return newFuncDialOption(func(o *dialOptions) {
 | 
				
			||||||
 | 
							o.block = true
 | 
				
			||||||
 | 
							o.returnLastError = true
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// WithInsecure returns a DialOption which disables transport security for this
 | 
					// WithInsecure returns a DialOption which disables transport security for this
 | 
				
			||||||
// ClientConn. Note that transport security is required unless WithInsecure is
 | 
					// ClientConn. Note that transport security is required unless WithInsecure is
 | 
				
			||||||
// set.
 | 
					// set.
 | 
				
			||||||
| 
						 | 
					@ -311,10 +318,13 @@ func WithInsecure() DialOption {
 | 
				
			||||||
// WithNoProxy returns a DialOption which disables the use of proxies for this
 | 
					// WithNoProxy returns a DialOption which disables the use of proxies for this
 | 
				
			||||||
// ClientConn. This is ignored if WithDialer or WithContextDialer are used.
 | 
					// ClientConn. This is ignored if WithDialer or WithContextDialer are used.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// This API is EXPERIMENTAL.
 | 
					// Experimental
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Notice: This API is EXPERIMENTAL and may be changed or removed in a
 | 
				
			||||||
 | 
					// later release.
 | 
				
			||||||
func WithNoProxy() DialOption {
 | 
					func WithNoProxy() DialOption {
 | 
				
			||||||
	return newFuncDialOption(func(o *dialOptions) {
 | 
						return newFuncDialOption(func(o *dialOptions) {
 | 
				
			||||||
		o.withProxy = false
 | 
							o.copts.UseProxy = false
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -339,7 +349,10 @@ func WithPerRPCCredentials(creds credentials.PerRPCCredentials) DialOption {
 | 
				
			||||||
// the ClientConn.WithCreds. This should not be used together with
 | 
					// the ClientConn.WithCreds. This should not be used together with
 | 
				
			||||||
// WithTransportCredentials.
 | 
					// WithTransportCredentials.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// This API is experimental.
 | 
					// Experimental
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Notice: This API is EXPERIMENTAL and may be changed or removed in a
 | 
				
			||||||
 | 
					// later release.
 | 
				
			||||||
func WithCredentialsBundle(b credentials.Bundle) DialOption {
 | 
					func WithCredentialsBundle(b credentials.Bundle) DialOption {
 | 
				
			||||||
	return newFuncDialOption(func(o *dialOptions) {
 | 
						return newFuncDialOption(func(o *dialOptions) {
 | 
				
			||||||
		o.copts.CredsBundle = b
 | 
							o.copts.CredsBundle = b
 | 
				
			||||||
| 
						 | 
					@ -404,7 +417,10 @@ func WithStatsHandler(h stats.Handler) DialOption {
 | 
				
			||||||
// FailOnNonTempDialError only affects the initial dial, and does not do
 | 
					// FailOnNonTempDialError only affects the initial dial, and does not do
 | 
				
			||||||
// anything useful unless you are also using WithBlock().
 | 
					// anything useful unless you are also using WithBlock().
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// This is an EXPERIMENTAL API.
 | 
					// Experimental
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Notice: This API is EXPERIMENTAL and may be changed or removed in a
 | 
				
			||||||
 | 
					// later release.
 | 
				
			||||||
func FailOnNonTempDialError(f bool) DialOption {
 | 
					func FailOnNonTempDialError(f bool) DialOption {
 | 
				
			||||||
	return newFuncDialOption(func(o *dialOptions) {
 | 
						return newFuncDialOption(func(o *dialOptions) {
 | 
				
			||||||
		o.copts.FailOnNonTempDialError = f
 | 
							o.copts.FailOnNonTempDialError = f
 | 
				
			||||||
| 
						 | 
					@ -423,7 +439,7 @@ func WithUserAgent(s string) DialOption {
 | 
				
			||||||
// for the client transport.
 | 
					// for the client transport.
 | 
				
			||||||
func WithKeepaliveParams(kp keepalive.ClientParameters) DialOption {
 | 
					func WithKeepaliveParams(kp keepalive.ClientParameters) DialOption {
 | 
				
			||||||
	if kp.Time < internal.KeepaliveMinPingTime {
 | 
						if kp.Time < internal.KeepaliveMinPingTime {
 | 
				
			||||||
		grpclog.Warningf("Adjusting keepalive ping interval to minimum period of %v", internal.KeepaliveMinPingTime)
 | 
							logger.Warningf("Adjusting keepalive ping interval to minimum period of %v", internal.KeepaliveMinPingTime)
 | 
				
			||||||
		kp.Time = internal.KeepaliveMinPingTime
 | 
							kp.Time = internal.KeepaliveMinPingTime
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return newFuncDialOption(func(o *dialOptions) {
 | 
						return newFuncDialOption(func(o *dialOptions) {
 | 
				
			||||||
| 
						 | 
					@ -459,7 +475,7 @@ func WithStreamInterceptor(f StreamClientInterceptor) DialOption {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// WithChainStreamInterceptor returns a DialOption that specifies the chained
 | 
					// WithChainStreamInterceptor returns a DialOption that specifies the chained
 | 
				
			||||||
// interceptor for unary RPCs. The first interceptor will be the outer most,
 | 
					// interceptor for streaming RPCs. The first interceptor will be the outer most,
 | 
				
			||||||
// while the last interceptor will be the inner most wrapper around the real call.
 | 
					// while the last interceptor will be the inner most wrapper around the real call.
 | 
				
			||||||
// All interceptors added by this method will be chained, and the interceptor
 | 
					// All interceptors added by this method will be chained, and the interceptor
 | 
				
			||||||
// defined by WithStreamInterceptor will always be prepended to the chain.
 | 
					// defined by WithStreamInterceptor will always be prepended to the chain.
 | 
				
			||||||
| 
						 | 
					@ -482,7 +498,10 @@ func WithAuthority(a string) DialOption {
 | 
				
			||||||
// current ClientConn's parent. This function is used in nested channel creation
 | 
					// current ClientConn's parent. This function is used in nested channel creation
 | 
				
			||||||
// (e.g. grpclb dial).
 | 
					// (e.g. grpclb dial).
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// This API is EXPERIMENTAL.
 | 
					// Experimental
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Notice: This API is EXPERIMENTAL and may be changed or removed in a
 | 
				
			||||||
 | 
					// later release.
 | 
				
			||||||
func WithChannelzParentID(id int64) DialOption {
 | 
					func WithChannelzParentID(id int64) DialOption {
 | 
				
			||||||
	return newFuncDialOption(func(o *dialOptions) {
 | 
						return newFuncDialOption(func(o *dialOptions) {
 | 
				
			||||||
		o.channelzParentID = id
 | 
							o.channelzParentID = id
 | 
				
			||||||
| 
						 | 
					@ -508,7 +527,10 @@ func WithDisableServiceConfig() DialOption {
 | 
				
			||||||
// 2. Resolver does not return a service config or if the resolver returns an
 | 
					// 2. Resolver does not return a service config or if the resolver returns an
 | 
				
			||||||
//    invalid service config.
 | 
					//    invalid service config.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// This API is EXPERIMENTAL.
 | 
					// Experimental
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Notice: This API is EXPERIMENTAL and may be changed or removed in a
 | 
				
			||||||
 | 
					// later release.
 | 
				
			||||||
func WithDefaultServiceConfig(s string) DialOption {
 | 
					func WithDefaultServiceConfig(s string) DialOption {
 | 
				
			||||||
	return newFuncDialOption(func(o *dialOptions) {
 | 
						return newFuncDialOption(func(o *dialOptions) {
 | 
				
			||||||
		o.defaultServiceConfigRawJSON = &s
 | 
							o.defaultServiceConfigRawJSON = &s
 | 
				
			||||||
| 
						 | 
					@ -524,7 +546,10 @@ func WithDefaultServiceConfig(s string) DialOption {
 | 
				
			||||||
// default in the future.  Until then, it may be enabled by setting the
 | 
					// default in the future.  Until then, it may be enabled by setting the
 | 
				
			||||||
// environment variable "GRPC_GO_RETRY" to "on".
 | 
					// environment variable "GRPC_GO_RETRY" to "on".
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// This API is EXPERIMENTAL.
 | 
					// Experimental
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Notice: This API is EXPERIMENTAL and may be changed or removed in a
 | 
				
			||||||
 | 
					// later release.
 | 
				
			||||||
func WithDisableRetry() DialOption {
 | 
					func WithDisableRetry() DialOption {
 | 
				
			||||||
	return newFuncDialOption(func(o *dialOptions) {
 | 
						return newFuncDialOption(func(o *dialOptions) {
 | 
				
			||||||
		o.disableRetry = true
 | 
							o.disableRetry = true
 | 
				
			||||||
| 
						 | 
					@ -542,7 +567,10 @@ func WithMaxHeaderListSize(s uint32) DialOption {
 | 
				
			||||||
// WithDisableHealthCheck disables the LB channel health checking for all
 | 
					// WithDisableHealthCheck disables the LB channel health checking for all
 | 
				
			||||||
// SubConns of this ClientConn.
 | 
					// SubConns of this ClientConn.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// This API is EXPERIMENTAL.
 | 
					// Experimental
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Notice: This API is EXPERIMENTAL and may be changed or removed in a
 | 
				
			||||||
 | 
					// later release.
 | 
				
			||||||
func WithDisableHealthCheck() DialOption {
 | 
					func WithDisableHealthCheck() DialOption {
 | 
				
			||||||
	return newFuncDialOption(func(o *dialOptions) {
 | 
						return newFuncDialOption(func(o *dialOptions) {
 | 
				
			||||||
		o.disableHealthCheck = true
 | 
							o.disableHealthCheck = true
 | 
				
			||||||
| 
						 | 
					@ -566,9 +594,9 @@ func defaultDialOptions() dialOptions {
 | 
				
			||||||
		copts: transport.ConnectOptions{
 | 
							copts: transport.ConnectOptions{
 | 
				
			||||||
			WriteBufferSize: defaultWriteBufSize,
 | 
								WriteBufferSize: defaultWriteBufSize,
 | 
				
			||||||
			ReadBufferSize:  defaultReadBufSize,
 | 
								ReadBufferSize:  defaultReadBufSize,
 | 
				
			||||||
 | 
								UseProxy:        true,
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		resolveNowBackoff: internalbackoff.DefaultExponential.Backoff,
 | 
							resolveNowBackoff: internalbackoff.DefaultExponential.Backoff,
 | 
				
			||||||
		withProxy:         true,
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -598,7 +626,10 @@ func withResolveNowBackoff(f func(int) time.Duration) DialOption {
 | 
				
			||||||
// resolver.Register.  They will be matched against the scheme used for the
 | 
					// resolver.Register.  They will be matched against the scheme used for the
 | 
				
			||||||
// current Dial only, and will take precedence over the global registry.
 | 
					// current Dial only, and will take precedence over the global registry.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// This API is EXPERIMENTAL.
 | 
					// Experimental
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Notice: This API is EXPERIMENTAL and may be changed or removed in a
 | 
				
			||||||
 | 
					// later release.
 | 
				
			||||||
func WithResolvers(rs ...resolver.Builder) DialOption {
 | 
					func WithResolvers(rs ...resolver.Builder) DialOption {
 | 
				
			||||||
	return newFuncDialOption(func(o *dialOptions) {
 | 
						return newFuncDialOption(func(o *dialOptions) {
 | 
				
			||||||
		o.resolvers = append(o.resolvers, rs...)
 | 
							o.resolvers = append(o.resolvers, rs...)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,6 +16,8 @@
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//go:generate ./regenerate.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
Package grpc implements an RPC system called gRPC.
 | 
					Package grpc implements an RPC system called gRPC.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,7 +19,10 @@
 | 
				
			||||||
// Package encoding defines the interface for the compressor and codec, and
 | 
					// Package encoding defines the interface for the compressor and codec, and
 | 
				
			||||||
// functions to register and retrieve compressors and codecs.
 | 
					// functions to register and retrieve compressors and codecs.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// This package is EXPERIMENTAL.
 | 
					// Experimental
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Notice: This package is EXPERIMENTAL and may be changed or removed in a
 | 
				
			||||||
 | 
					// later release.
 | 
				
			||||||
package encoding
 | 
					package encoding
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
| 
						 | 
					@ -46,10 +49,15 @@ type Compressor interface {
 | 
				
			||||||
	// coding header.  The result must be static; the result cannot change
 | 
						// coding header.  The result must be static; the result cannot change
 | 
				
			||||||
	// between calls.
 | 
						// between calls.
 | 
				
			||||||
	Name() string
 | 
						Name() string
 | 
				
			||||||
	// EXPERIMENTAL: if a Compressor implements
 | 
						// If a Compressor implements
 | 
				
			||||||
	// DecompressedSize(compressedBytes []byte) int, gRPC will call it
 | 
						// DecompressedSize(compressedBytes []byte) int, gRPC will call it
 | 
				
			||||||
	// to determine the size of the buffer allocated for the result of decompression.
 | 
						// to determine the size of the buffer allocated for the result of decompression.
 | 
				
			||||||
	// Return -1 to indicate unknown size.
 | 
						// Return -1 to indicate unknown size.
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// Experimental
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// Notice: This API is EXPERIMENTAL and may be changed or removed in a
 | 
				
			||||||
 | 
						// later release.
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var registeredCompressor = make(map[string]Compressor)
 | 
					var registeredCompressor = make(map[string]Compressor)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -21,8 +21,7 @@
 | 
				
			||||||
package proto
 | 
					package proto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"math"
 | 
						"fmt"
 | 
				
			||||||
	"sync"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/golang/protobuf/proto"
 | 
						"github.com/golang/protobuf/proto"
 | 
				
			||||||
	"google.golang.org/grpc/encoding"
 | 
						"google.golang.org/grpc/encoding"
 | 
				
			||||||
| 
						 | 
					@ -38,73 +37,22 @@ func init() {
 | 
				
			||||||
// codec is a Codec implementation with protobuf. It is the default codec for gRPC.
 | 
					// codec is a Codec implementation with protobuf. It is the default codec for gRPC.
 | 
				
			||||||
type codec struct{}
 | 
					type codec struct{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type cachedProtoBuffer struct {
 | 
					 | 
				
			||||||
	lastMarshaledSize uint32
 | 
					 | 
				
			||||||
	proto.Buffer
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func capToMaxInt32(val int) uint32 {
 | 
					 | 
				
			||||||
	if val > math.MaxInt32 {
 | 
					 | 
				
			||||||
		return uint32(math.MaxInt32)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return uint32(val)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func marshal(v interface{}, cb *cachedProtoBuffer) ([]byte, error) {
 | 
					 | 
				
			||||||
	protoMsg := v.(proto.Message)
 | 
					 | 
				
			||||||
	newSlice := make([]byte, 0, cb.lastMarshaledSize)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	cb.SetBuf(newSlice)
 | 
					 | 
				
			||||||
	cb.Reset()
 | 
					 | 
				
			||||||
	if err := cb.Marshal(protoMsg); err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	out := cb.Bytes()
 | 
					 | 
				
			||||||
	cb.lastMarshaledSize = capToMaxInt32(len(out))
 | 
					 | 
				
			||||||
	return out, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (codec) Marshal(v interface{}) ([]byte, error) {
 | 
					func (codec) Marshal(v interface{}) ([]byte, error) {
 | 
				
			||||||
	if pm, ok := v.(proto.Marshaler); ok {
 | 
						vv, ok := v.(proto.Message)
 | 
				
			||||||
		// object can marshal itself, no need for buffer
 | 
						if !ok {
 | 
				
			||||||
		return pm.Marshal()
 | 
							return nil, fmt.Errorf("failed to marshal, message is %T, want proto.Message", v)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						return proto.Marshal(vv)
 | 
				
			||||||
	cb := protoBufferPool.Get().(*cachedProtoBuffer)
 | 
					 | 
				
			||||||
	out, err := marshal(v, cb)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// put back buffer and lose the ref to the slice
 | 
					 | 
				
			||||||
	cb.SetBuf(nil)
 | 
					 | 
				
			||||||
	protoBufferPool.Put(cb)
 | 
					 | 
				
			||||||
	return out, err
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (codec) Unmarshal(data []byte, v interface{}) error {
 | 
					func (codec) Unmarshal(data []byte, v interface{}) error {
 | 
				
			||||||
	protoMsg := v.(proto.Message)
 | 
						vv, ok := v.(proto.Message)
 | 
				
			||||||
	protoMsg.Reset()
 | 
						if !ok {
 | 
				
			||||||
 | 
							return fmt.Errorf("failed to unmarshal, message is %T, want proto.Message", v)
 | 
				
			||||||
	if pu, ok := protoMsg.(proto.Unmarshaler); ok {
 | 
					 | 
				
			||||||
		// object can unmarshal itself, no need for buffer
 | 
					 | 
				
			||||||
		return pu.Unmarshal(data)
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						return proto.Unmarshal(data, vv)
 | 
				
			||||||
	cb := protoBufferPool.Get().(*cachedProtoBuffer)
 | 
					 | 
				
			||||||
	cb.SetBuf(data)
 | 
					 | 
				
			||||||
	err := cb.Unmarshal(protoMsg)
 | 
					 | 
				
			||||||
	cb.SetBuf(nil)
 | 
					 | 
				
			||||||
	protoBufferPool.Put(cb)
 | 
					 | 
				
			||||||
	return err
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (codec) Name() string {
 | 
					func (codec) Name() string {
 | 
				
			||||||
	return Name
 | 
						return Name
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
var protoBufferPool = &sync.Pool{
 | 
					 | 
				
			||||||
	New: func() interface{} {
 | 
					 | 
				
			||||||
		return &cachedProtoBuffer{
 | 
					 | 
				
			||||||
			Buffer:            proto.Buffer{},
 | 
					 | 
				
			||||||
			lastMarshaledSize: 16,
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,14 +3,15 @@ module google.golang.org/grpc
 | 
				
			||||||
go 1.11
 | 
					go 1.11
 | 
				
			||||||
 | 
					
 | 
				
			||||||
require (
 | 
					require (
 | 
				
			||||||
	github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f
 | 
						github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403
 | 
				
			||||||
	github.com/envoyproxy/go-control-plane v0.9.4
 | 
						github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad
 | 
				
			||||||
	github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b
 | 
						github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b
 | 
				
			||||||
	github.com/golang/mock v1.1.1
 | 
						github.com/golang/protobuf v1.4.2
 | 
				
			||||||
	github.com/golang/protobuf v1.3.3
 | 
						github.com/google/go-cmp v0.5.0
 | 
				
			||||||
	github.com/google/go-cmp v0.2.0
 | 
						github.com/google/uuid v1.1.2
 | 
				
			||||||
	golang.org/x/net v0.0.0-20190311183353-d8887717615a
 | 
						golang.org/x/net v0.0.0-20190311183353-d8887717615a
 | 
				
			||||||
	golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be
 | 
						golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be
 | 
				
			||||||
	golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a
 | 
						golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a
 | 
				
			||||||
	google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55
 | 
						google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013
 | 
				
			||||||
 | 
						google.golang.org/protobuf v1.25.0
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,33 +2,52 @@ cloud.google.com/go v0.26.0 h1:e0WKqKTd5BnrG8aKH3J3h+QvEIQtSUcf2n5UZ5ZgLtQ=
 | 
				
			||||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 | 
					cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 | 
				
			||||||
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
 | 
					github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
 | 
				
			||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 | 
					github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 | 
				
			||||||
 | 
					github.com/census-instrumentation/opencensus-proto v0.2.1 h1:glEXhBS5PSLLv4IXzLA5yPRVX4bilULVyxxbrfOtDAk=
 | 
				
			||||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 | 
					github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 | 
				
			||||||
github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI=
 | 
					github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI=
 | 
				
			||||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 | 
					github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 | 
				
			||||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f h1:WBZRG4aNOuI15bLRrCgN8fCq8E5Xuty6jGbmSNEvSsU=
 | 
					github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403 h1:cqQfy1jclcSy/FwLjemeg3SR1yaINm74aQyupQ0Bl8M=
 | 
				
			||||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
 | 
					github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
 | 
				
			||||||
 | 
					github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
 | 
				
			||||||
 | 
					github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
				
			||||||
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 | 
					github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 | 
				
			||||||
github.com/envoyproxy/go-control-plane v0.9.4 h1:rEvIZUSZ3fx39WIi3JkQqQBitGwpELBIYWeBVh6wn+E=
 | 
					github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 | 
				
			||||||
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
 | 
					github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad h1:EmNYJhPYy0pOFjCx2PrgtaBXmee0iUX9hLlxE1xHOJE=
 | 
				
			||||||
 | 
					github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
 | 
				
			||||||
github.com/envoyproxy/protoc-gen-validate v0.1.0 h1:EQciDnbrYxy13PgWoY8AqoxGiPrpgBZ1R8UNe3ddc+A=
 | 
					github.com/envoyproxy/protoc-gen-validate v0.1.0 h1:EQciDnbrYxy13PgWoY8AqoxGiPrpgBZ1R8UNe3ddc+A=
 | 
				
			||||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
 | 
					github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
 | 
				
			||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
 | 
					github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
 | 
				
			||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
 | 
					github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
 | 
				
			||||||
github.com/golang/mock v1.1.1 h1:G5FRp8JnTd7RQH5kemVNlMeyXQAztQ3mOWV95KxsXH8=
 | 
					 | 
				
			||||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 | 
					github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 | 
				
			||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 | 
					github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 | 
				
			||||||
github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
 | 
					 | 
				
			||||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 | 
					github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 | 
				
			||||||
github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I=
 | 
					github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
 | 
				
			||||||
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
 | 
					github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
 | 
				
			||||||
github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
 | 
					github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
 | 
				
			||||||
 | 
					github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
 | 
				
			||||||
 | 
					github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
 | 
				
			||||||
 | 
					github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
 | 
				
			||||||
 | 
					github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
 | 
				
			||||||
 | 
					github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
 | 
				
			||||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
 | 
					github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
 | 
				
			||||||
 | 
					github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 | 
				
			||||||
 | 
					github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 | 
				
			||||||
 | 
					github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
				
			||||||
 | 
					github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w=
 | 
				
			||||||
 | 
					github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
				
			||||||
 | 
					github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y=
 | 
				
			||||||
 | 
					github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
				
			||||||
 | 
					github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 | 
				
			||||||
 | 
					github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 | 
				
			||||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 | 
					github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 | 
				
			||||||
 | 
					github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
				
			||||||
 | 
					github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4=
 | 
				
			||||||
 | 
					github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
 | 
				
			||||||
 | 
					golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
					golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
				
			||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 | 
					golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 | 
				
			||||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 | 
					golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 | 
				
			||||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
 | 
					golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
 | 
				
			||||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3 h1:XQyxROzUlZH+WIQwySDgnISgOivlhjIEwaQaJEJrrN0=
 | 
					 | 
				
			||||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 | 
					golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 | 
				
			||||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
					golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
				
			||||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
					golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
				
			||||||
| 
						 | 
					@ -48,17 +67,33 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
					golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
 | 
					golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
					golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135 h1:5Beo0mZN8dRzgrMMkDp0jc8YXQKx9DiJ2k1dkvGsn5A=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 | 
					golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 | 
				
			||||||
 | 
					golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
 | 
				
			||||||
 | 
					golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
				
			||||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 | 
					google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 | 
				
			||||||
google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508=
 | 
					google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508=
 | 
				
			||||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 | 
					google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 | 
				
			||||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 | 
					google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 | 
				
			||||||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE=
 | 
					 | 
				
			||||||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
 | 
					google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
 | 
				
			||||||
 | 
					google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY=
 | 
				
			||||||
 | 
					google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
 | 
				
			||||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 | 
					google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 | 
				
			||||||
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
 | 
					google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
 | 
				
			||||||
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
 | 
					google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
 | 
				
			||||||
 | 
					google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
 | 
				
			||||||
 | 
					google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 | 
				
			||||||
 | 
					google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
 | 
				
			||||||
 | 
					google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
 | 
				
			||||||
 | 
					google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
 | 
				
			||||||
 | 
					google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
 | 
				
			||||||
 | 
					google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 | 
				
			||||||
 | 
					google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 | 
				
			||||||
 | 
					google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 | 
				
			||||||
 | 
					google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c=
 | 
				
			||||||
 | 
					google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
 | 
				
			||||||
 | 
					gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
 | 
				
			||||||
 | 
					gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
				
			||||||
 | 
					gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
 | 
				
			||||||
 | 
					gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
				
			||||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 | 
					honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 | 
				
			||||||
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc h1:/hemPrYIhOhy8zYrNj+069zDB68us2sMGsfkFJO0iZs=
 | 
					 | 
				
			||||||
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 | 
					honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,117 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Copyright 2020 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 grpclog
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"google.golang.org/grpc/internal/grpclog"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// componentData records the settings for a component.
 | 
				
			||||||
 | 
					type componentData struct {
 | 
				
			||||||
 | 
						name string
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var cache = map[string]*componentData{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *componentData) InfoDepth(depth int, args ...interface{}) {
 | 
				
			||||||
 | 
						args = append([]interface{}{"[" + string(c.name) + "]"}, args...)
 | 
				
			||||||
 | 
						grpclog.InfoDepth(depth+1, args...)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *componentData) WarningDepth(depth int, args ...interface{}) {
 | 
				
			||||||
 | 
						args = append([]interface{}{"[" + string(c.name) + "]"}, args...)
 | 
				
			||||||
 | 
						grpclog.WarningDepth(depth+1, args...)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *componentData) ErrorDepth(depth int, args ...interface{}) {
 | 
				
			||||||
 | 
						args = append([]interface{}{"[" + string(c.name) + "]"}, args...)
 | 
				
			||||||
 | 
						grpclog.ErrorDepth(depth+1, args...)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *componentData) FatalDepth(depth int, args ...interface{}) {
 | 
				
			||||||
 | 
						args = append([]interface{}{"[" + string(c.name) + "]"}, args...)
 | 
				
			||||||
 | 
						grpclog.FatalDepth(depth+1, args...)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *componentData) Info(args ...interface{}) {
 | 
				
			||||||
 | 
						c.InfoDepth(1, args...)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *componentData) Warning(args ...interface{}) {
 | 
				
			||||||
 | 
						c.WarningDepth(1, args...)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *componentData) Error(args ...interface{}) {
 | 
				
			||||||
 | 
						c.ErrorDepth(1, args...)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *componentData) Fatal(args ...interface{}) {
 | 
				
			||||||
 | 
						c.FatalDepth(1, args...)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *componentData) Infof(format string, args ...interface{}) {
 | 
				
			||||||
 | 
						c.InfoDepth(1, fmt.Sprintf(format, args...))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *componentData) Warningf(format string, args ...interface{}) {
 | 
				
			||||||
 | 
						c.WarningDepth(1, fmt.Sprintf(format, args...))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *componentData) Errorf(format string, args ...interface{}) {
 | 
				
			||||||
 | 
						c.ErrorDepth(1, fmt.Sprintf(format, args...))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *componentData) Fatalf(format string, args ...interface{}) {
 | 
				
			||||||
 | 
						c.FatalDepth(1, fmt.Sprintf(format, args...))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *componentData) Infoln(args ...interface{}) {
 | 
				
			||||||
 | 
						c.InfoDepth(1, args...)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *componentData) Warningln(args ...interface{}) {
 | 
				
			||||||
 | 
						c.WarningDepth(1, args...)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *componentData) Errorln(args ...interface{}) {
 | 
				
			||||||
 | 
						c.ErrorDepth(1, args...)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *componentData) Fatalln(args ...interface{}) {
 | 
				
			||||||
 | 
						c.FatalDepth(1, args...)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *componentData) V(l int) bool {
 | 
				
			||||||
 | 
						return V(l)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Component creates a new component and returns it for logging. If a component
 | 
				
			||||||
 | 
					// with the name already exists, nothing will be created and it will be
 | 
				
			||||||
 | 
					// returned. SetLoggerV2 will panic if it is called with a logger created by
 | 
				
			||||||
 | 
					// Component.
 | 
				
			||||||
 | 
					func Component(componentName string) DepthLoggerV2 {
 | 
				
			||||||
 | 
						if cData, ok := cache[componentName]; ok {
 | 
				
			||||||
 | 
							return cData
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						c := &componentData{componentName}
 | 
				
			||||||
 | 
						cache[componentName] = c
 | 
				
			||||||
 | 
						return c
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -67,6 +67,9 @@ type LoggerV2 interface {
 | 
				
			||||||
// SetLoggerV2 sets logger that is used in grpc to a V2 logger.
 | 
					// SetLoggerV2 sets logger that is used in grpc to a V2 logger.
 | 
				
			||||||
// Not mutex-protected, should be called before any gRPC functions.
 | 
					// Not mutex-protected, should be called before any gRPC functions.
 | 
				
			||||||
func SetLoggerV2(l LoggerV2) {
 | 
					func SetLoggerV2(l LoggerV2) {
 | 
				
			||||||
 | 
						if _, ok := l.(*componentData); ok {
 | 
				
			||||||
 | 
							panic("cannot use component logger as grpclog logger")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	grpclog.Logger = l
 | 
						grpclog.Logger = l
 | 
				
			||||||
	grpclog.DepthLogger, _ = l.(grpclog.DepthLoggerV2)
 | 
						grpclog.DepthLogger, _ = l.(grpclog.DepthLoggerV2)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -201,8 +204,12 @@ func (g *loggerT) V(l int) bool {
 | 
				
			||||||
// DepthLoggerV2, the below functions will be called with the appropriate stack
 | 
					// DepthLoggerV2, the below functions will be called with the appropriate stack
 | 
				
			||||||
// depth set for trivial functions the logger may ignore.
 | 
					// depth set for trivial functions the logger may ignore.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// This API is EXPERIMENTAL.
 | 
					// Experimental
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Notice: This type is EXPERIMENTAL and may be changed or removed in a
 | 
				
			||||||
 | 
					// later release.
 | 
				
			||||||
type DepthLoggerV2 interface {
 | 
					type DepthLoggerV2 interface {
 | 
				
			||||||
 | 
						LoggerV2
 | 
				
			||||||
	// InfoDepth logs to INFO log at the specified depth. Arguments are handled in the manner of fmt.Print.
 | 
						// InfoDepth logs to INFO log at the specified depth. Arguments are handled in the manner of fmt.Print.
 | 
				
			||||||
	InfoDepth(depth int, args ...interface{})
 | 
						InfoDepth(depth int, args ...interface{})
 | 
				
			||||||
	// WarningDepth logs to WARNING log at the specified depth. Arguments are handled in the manner of fmt.Print.
 | 
						// WarningDepth logs to WARNING log at the specified depth. Arguments are handled in the manner of fmt.Print.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,28 +1,46 @@
 | 
				
			||||||
 | 
					// Copyright 2015 The 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// The canonical version of this proto can be found at
 | 
				
			||||||
 | 
					// https://github.com/grpc/grpc-proto/blob/master/grpc/health/v1/health.proto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
 | 
					// Code generated by protoc-gen-go. DO NOT EDIT.
 | 
				
			||||||
 | 
					// versions:
 | 
				
			||||||
 | 
					// 	protoc-gen-go v1.25.0
 | 
				
			||||||
 | 
					// 	protoc        v3.14.0
 | 
				
			||||||
// source: grpc/health/v1/health.proto
 | 
					// source: grpc/health/v1/health.proto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package grpc_health_v1
 | 
					package grpc_health_v1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	context "context"
 | 
					 | 
				
			||||||
	fmt "fmt"
 | 
					 | 
				
			||||||
	proto "github.com/golang/protobuf/proto"
 | 
						proto "github.com/golang/protobuf/proto"
 | 
				
			||||||
	grpc "google.golang.org/grpc"
 | 
						protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 | 
				
			||||||
	codes "google.golang.org/grpc/codes"
 | 
						protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 | 
				
			||||||
	status "google.golang.org/grpc/status"
 | 
						reflect "reflect"
 | 
				
			||||||
	math "math"
 | 
						sync "sync"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Reference imports to suppress errors if they are not otherwise used.
 | 
					const (
 | 
				
			||||||
var _ = proto.Marshal
 | 
						// Verify that this generated code is sufficiently up-to-date.
 | 
				
			||||||
var _ = fmt.Errorf
 | 
						_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
 | 
				
			||||||
var _ = math.Inf
 | 
						// Verify that runtime/protoimpl is sufficiently up-to-date.
 | 
				
			||||||
 | 
						_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// This is a compile-time assertion to ensure that this generated file
 | 
					// This is a compile-time assertion that a sufficiently up-to-date version
 | 
				
			||||||
// is compatible with the proto package it is being compiled against.
 | 
					// of the legacy proto package is being used.
 | 
				
			||||||
// A compilation error at this line likely means your copy of the
 | 
					const _ = proto.ProtoPackageIsVersion4
 | 
				
			||||||
// proto package needs to be updated.
 | 
					 | 
				
			||||||
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
type HealthCheckResponse_ServingStatus int32
 | 
					type HealthCheckResponse_ServingStatus int32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -30,314 +48,266 @@ const (
 | 
				
			||||||
	HealthCheckResponse_UNKNOWN         HealthCheckResponse_ServingStatus = 0
 | 
						HealthCheckResponse_UNKNOWN         HealthCheckResponse_ServingStatus = 0
 | 
				
			||||||
	HealthCheckResponse_SERVING         HealthCheckResponse_ServingStatus = 1
 | 
						HealthCheckResponse_SERVING         HealthCheckResponse_ServingStatus = 1
 | 
				
			||||||
	HealthCheckResponse_NOT_SERVING     HealthCheckResponse_ServingStatus = 2
 | 
						HealthCheckResponse_NOT_SERVING     HealthCheckResponse_ServingStatus = 2
 | 
				
			||||||
	HealthCheckResponse_SERVICE_UNKNOWN HealthCheckResponse_ServingStatus = 3
 | 
						HealthCheckResponse_SERVICE_UNKNOWN HealthCheckResponse_ServingStatus = 3 // Used only by the Watch method.
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var HealthCheckResponse_ServingStatus_name = map[int32]string{
 | 
					// Enum value maps for HealthCheckResponse_ServingStatus.
 | 
				
			||||||
	0: "UNKNOWN",
 | 
					var (
 | 
				
			||||||
	1: "SERVING",
 | 
						HealthCheckResponse_ServingStatus_name = map[int32]string{
 | 
				
			||||||
	2: "NOT_SERVING",
 | 
							0: "UNKNOWN",
 | 
				
			||||||
	3: "SERVICE_UNKNOWN",
 | 
							1: "SERVING",
 | 
				
			||||||
}
 | 
							2: "NOT_SERVING",
 | 
				
			||||||
 | 
							3: "SERVICE_UNKNOWN",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						HealthCheckResponse_ServingStatus_value = map[string]int32{
 | 
				
			||||||
 | 
							"UNKNOWN":         0,
 | 
				
			||||||
 | 
							"SERVING":         1,
 | 
				
			||||||
 | 
							"NOT_SERVING":     2,
 | 
				
			||||||
 | 
							"SERVICE_UNKNOWN": 3,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var HealthCheckResponse_ServingStatus_value = map[string]int32{
 | 
					func (x HealthCheckResponse_ServingStatus) Enum() *HealthCheckResponse_ServingStatus {
 | 
				
			||||||
	"UNKNOWN":         0,
 | 
						p := new(HealthCheckResponse_ServingStatus)
 | 
				
			||||||
	"SERVING":         1,
 | 
						*p = x
 | 
				
			||||||
	"NOT_SERVING":     2,
 | 
						return p
 | 
				
			||||||
	"SERVICE_UNKNOWN": 3,
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x HealthCheckResponse_ServingStatus) String() string {
 | 
					func (x HealthCheckResponse_ServingStatus) String() string {
 | 
				
			||||||
	return proto.EnumName(HealthCheckResponse_ServingStatus_name, int32(x))
 | 
						return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (HealthCheckResponse_ServingStatus) Descriptor() protoreflect.EnumDescriptor {
 | 
				
			||||||
 | 
						return file_grpc_health_v1_health_proto_enumTypes[0].Descriptor()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (HealthCheckResponse_ServingStatus) Type() protoreflect.EnumType {
 | 
				
			||||||
 | 
						return &file_grpc_health_v1_health_proto_enumTypes[0]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (x HealthCheckResponse_ServingStatus) Number() protoreflect.EnumNumber {
 | 
				
			||||||
 | 
						return protoreflect.EnumNumber(x)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Deprecated: Use HealthCheckResponse_ServingStatus.Descriptor instead.
 | 
				
			||||||
func (HealthCheckResponse_ServingStatus) EnumDescriptor() ([]byte, []int) {
 | 
					func (HealthCheckResponse_ServingStatus) EnumDescriptor() ([]byte, []int) {
 | 
				
			||||||
	return fileDescriptor_e265fd9d4e077217, []int{1, 0}
 | 
						return file_grpc_health_v1_health_proto_rawDescGZIP(), []int{1, 0}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type HealthCheckRequest struct {
 | 
					type HealthCheckRequest struct {
 | 
				
			||||||
	Service              string   `protobuf:"bytes,1,opt,name=service,proto3" json:"service,omitempty"`
 | 
						state         protoimpl.MessageState
 | 
				
			||||||
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 | 
						sizeCache     protoimpl.SizeCache
 | 
				
			||||||
	XXX_unrecognized     []byte   `json:"-"`
 | 
						unknownFields protoimpl.UnknownFields
 | 
				
			||||||
	XXX_sizecache        int32    `json:"-"`
 | 
					
 | 
				
			||||||
 | 
						Service string `protobuf:"bytes,1,opt,name=service,proto3" json:"service,omitempty"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (m *HealthCheckRequest) Reset()         { *m = HealthCheckRequest{} }
 | 
					func (x *HealthCheckRequest) Reset() {
 | 
				
			||||||
func (m *HealthCheckRequest) String() string { return proto.CompactTextString(m) }
 | 
						*x = HealthCheckRequest{}
 | 
				
			||||||
func (*HealthCheckRequest) ProtoMessage()    {}
 | 
						if protoimpl.UnsafeEnabled {
 | 
				
			||||||
 | 
							mi := &file_grpc_health_v1_health_proto_msgTypes[0]
 | 
				
			||||||
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
 | 
							ms.StoreMessageInfo(mi)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (x *HealthCheckRequest) String() string {
 | 
				
			||||||
 | 
						return protoimpl.X.MessageStringOf(x)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (*HealthCheckRequest) ProtoMessage() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (x *HealthCheckRequest) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
 | 
						mi := &file_grpc_health_v1_health_proto_msgTypes[0]
 | 
				
			||||||
 | 
						if protoimpl.UnsafeEnabled && x != nil {
 | 
				
			||||||
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
 | 
							if ms.LoadMessageInfo() == nil {
 | 
				
			||||||
 | 
								ms.StoreMessageInfo(mi)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return ms
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return mi.MessageOf(x)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Deprecated: Use HealthCheckRequest.ProtoReflect.Descriptor instead.
 | 
				
			||||||
func (*HealthCheckRequest) Descriptor() ([]byte, []int) {
 | 
					func (*HealthCheckRequest) Descriptor() ([]byte, []int) {
 | 
				
			||||||
	return fileDescriptor_e265fd9d4e077217, []int{0}
 | 
						return file_grpc_health_v1_health_proto_rawDescGZIP(), []int{0}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (m *HealthCheckRequest) XXX_Unmarshal(b []byte) error {
 | 
					func (x *HealthCheckRequest) GetService() string {
 | 
				
			||||||
	return xxx_messageInfo_HealthCheckRequest.Unmarshal(m, b)
 | 
						if x != nil {
 | 
				
			||||||
}
 | 
							return x.Service
 | 
				
			||||||
func (m *HealthCheckRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 | 
					 | 
				
			||||||
	return xxx_messageInfo_HealthCheckRequest.Marshal(b, m, deterministic)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
func (m *HealthCheckRequest) XXX_Merge(src proto.Message) {
 | 
					 | 
				
			||||||
	xxx_messageInfo_HealthCheckRequest.Merge(m, src)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
func (m *HealthCheckRequest) XXX_Size() int {
 | 
					 | 
				
			||||||
	return xxx_messageInfo_HealthCheckRequest.Size(m)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
func (m *HealthCheckRequest) XXX_DiscardUnknown() {
 | 
					 | 
				
			||||||
	xxx_messageInfo_HealthCheckRequest.DiscardUnknown(m)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var xxx_messageInfo_HealthCheckRequest proto.InternalMessageInfo
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (m *HealthCheckRequest) GetService() string {
 | 
					 | 
				
			||||||
	if m != nil {
 | 
					 | 
				
			||||||
		return m.Service
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return ""
 | 
						return ""
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type HealthCheckResponse struct {
 | 
					type HealthCheckResponse struct {
 | 
				
			||||||
	Status               HealthCheckResponse_ServingStatus `protobuf:"varint,1,opt,name=status,proto3,enum=grpc.health.v1.HealthCheckResponse_ServingStatus" json:"status,omitempty"`
 | 
						state         protoimpl.MessageState
 | 
				
			||||||
	XXX_NoUnkeyedLiteral struct{}                          `json:"-"`
 | 
						sizeCache     protoimpl.SizeCache
 | 
				
			||||||
	XXX_unrecognized     []byte                            `json:"-"`
 | 
						unknownFields protoimpl.UnknownFields
 | 
				
			||||||
	XXX_sizecache        int32                             `json:"-"`
 | 
					
 | 
				
			||||||
 | 
						Status HealthCheckResponse_ServingStatus `protobuf:"varint,1,opt,name=status,proto3,enum=grpc.health.v1.HealthCheckResponse_ServingStatus" json:"status,omitempty"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (m *HealthCheckResponse) Reset()         { *m = HealthCheckResponse{} }
 | 
					func (x *HealthCheckResponse) Reset() {
 | 
				
			||||||
func (m *HealthCheckResponse) String() string { return proto.CompactTextString(m) }
 | 
						*x = HealthCheckResponse{}
 | 
				
			||||||
func (*HealthCheckResponse) ProtoMessage()    {}
 | 
						if protoimpl.UnsafeEnabled {
 | 
				
			||||||
 | 
							mi := &file_grpc_health_v1_health_proto_msgTypes[1]
 | 
				
			||||||
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
 | 
							ms.StoreMessageInfo(mi)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (x *HealthCheckResponse) String() string {
 | 
				
			||||||
 | 
						return protoimpl.X.MessageStringOf(x)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (*HealthCheckResponse) ProtoMessage() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (x *HealthCheckResponse) ProtoReflect() protoreflect.Message {
 | 
				
			||||||
 | 
						mi := &file_grpc_health_v1_health_proto_msgTypes[1]
 | 
				
			||||||
 | 
						if protoimpl.UnsafeEnabled && x != nil {
 | 
				
			||||||
 | 
							ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
				
			||||||
 | 
							if ms.LoadMessageInfo() == nil {
 | 
				
			||||||
 | 
								ms.StoreMessageInfo(mi)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return ms
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return mi.MessageOf(x)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Deprecated: Use HealthCheckResponse.ProtoReflect.Descriptor instead.
 | 
				
			||||||
func (*HealthCheckResponse) Descriptor() ([]byte, []int) {
 | 
					func (*HealthCheckResponse) Descriptor() ([]byte, []int) {
 | 
				
			||||||
	return fileDescriptor_e265fd9d4e077217, []int{1}
 | 
						return file_grpc_health_v1_health_proto_rawDescGZIP(), []int{1}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (m *HealthCheckResponse) XXX_Unmarshal(b []byte) error {
 | 
					func (x *HealthCheckResponse) GetStatus() HealthCheckResponse_ServingStatus {
 | 
				
			||||||
	return xxx_messageInfo_HealthCheckResponse.Unmarshal(m, b)
 | 
						if x != nil {
 | 
				
			||||||
}
 | 
							return x.Status
 | 
				
			||||||
func (m *HealthCheckResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 | 
					 | 
				
			||||||
	return xxx_messageInfo_HealthCheckResponse.Marshal(b, m, deterministic)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
func (m *HealthCheckResponse) XXX_Merge(src proto.Message) {
 | 
					 | 
				
			||||||
	xxx_messageInfo_HealthCheckResponse.Merge(m, src)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
func (m *HealthCheckResponse) XXX_Size() int {
 | 
					 | 
				
			||||||
	return xxx_messageInfo_HealthCheckResponse.Size(m)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
func (m *HealthCheckResponse) XXX_DiscardUnknown() {
 | 
					 | 
				
			||||||
	xxx_messageInfo_HealthCheckResponse.DiscardUnknown(m)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var xxx_messageInfo_HealthCheckResponse proto.InternalMessageInfo
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (m *HealthCheckResponse) GetStatus() HealthCheckResponse_ServingStatus {
 | 
					 | 
				
			||||||
	if m != nil {
 | 
					 | 
				
			||||||
		return m.Status
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return HealthCheckResponse_UNKNOWN
 | 
						return HealthCheckResponse_UNKNOWN
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func init() {
 | 
					var File_grpc_health_v1_health_proto protoreflect.FileDescriptor
 | 
				
			||||||
	proto.RegisterEnum("grpc.health.v1.HealthCheckResponse_ServingStatus", HealthCheckResponse_ServingStatus_name, HealthCheckResponse_ServingStatus_value)
 | 
					
 | 
				
			||||||
	proto.RegisterType((*HealthCheckRequest)(nil), "grpc.health.v1.HealthCheckRequest")
 | 
					var file_grpc_health_v1_health_proto_rawDesc = []byte{
 | 
				
			||||||
	proto.RegisterType((*HealthCheckResponse)(nil), "grpc.health.v1.HealthCheckResponse")
 | 
						0x0a, 0x1b, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x2f, 0x76, 0x31,
 | 
				
			||||||
 | 
						0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x67,
 | 
				
			||||||
 | 
						0x72, 0x70, 0x63, 0x2e, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x22, 0x2e, 0x0a,
 | 
				
			||||||
 | 
						0x12, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75,
 | 
				
			||||||
 | 
						0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01,
 | 
				
			||||||
 | 
						0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0xb1, 0x01,
 | 
				
			||||||
 | 
						0x0a, 0x13, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73,
 | 
				
			||||||
 | 
						0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18,
 | 
				
			||||||
 | 
						0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x68, 0x65, 0x61,
 | 
				
			||||||
 | 
						0x6c, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65,
 | 
				
			||||||
 | 
						0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69,
 | 
				
			||||||
 | 
						0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
 | 
				
			||||||
 | 
						0x22, 0x4f, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75,
 | 
				
			||||||
 | 
						0x73, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b,
 | 
				
			||||||
 | 
						0x0a, 0x07, 0x53, 0x45, 0x52, 0x56, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x4e,
 | 
				
			||||||
 | 
						0x4f, 0x54, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f,
 | 
				
			||||||
 | 
						0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10,
 | 
				
			||||||
 | 
						0x03, 0x32, 0xae, 0x01, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x50, 0x0a, 0x05,
 | 
				
			||||||
 | 
						0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x22, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x68, 0x65, 0x61,
 | 
				
			||||||
 | 
						0x6c, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65,
 | 
				
			||||||
 | 
						0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63,
 | 
				
			||||||
 | 
						0x2e, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74,
 | 
				
			||||||
 | 
						0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52,
 | 
				
			||||||
 | 
						0x0a, 0x05, 0x57, 0x61, 0x74, 0x63, 0x68, 0x12, 0x22, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x68,
 | 
				
			||||||
 | 
						0x65, 0x61, 0x6c, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43,
 | 
				
			||||||
 | 
						0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x67, 0x72,
 | 
				
			||||||
 | 
						0x70, 0x63, 0x2e, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61,
 | 
				
			||||||
 | 
						0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
 | 
				
			||||||
 | 
						0x30, 0x01, 0x42, 0x61, 0x0a, 0x11, 0x69, 0x6f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x68, 0x65,
 | 
				
			||||||
 | 
						0x61, 0x6c, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x42, 0x0b, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x50,
 | 
				
			||||||
 | 
						0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67,
 | 
				
			||||||
 | 
						0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x68,
 | 
				
			||||||
 | 
						0x65, 0x61, 0x6c, 0x74, 0x68, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74,
 | 
				
			||||||
 | 
						0x68, 0x5f, 0x76, 0x31, 0xaa, 0x02, 0x0e, 0x47, 0x72, 0x70, 0x63, 0x2e, 0x48, 0x65, 0x61, 0x6c,
 | 
				
			||||||
 | 
						0x74, 0x68, 0x2e, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func init() { proto.RegisterFile("grpc/health/v1/health.proto", fileDescriptor_e265fd9d4e077217) }
 | 
					var (
 | 
				
			||||||
 | 
						file_grpc_health_v1_health_proto_rawDescOnce sync.Once
 | 
				
			||||||
 | 
						file_grpc_health_v1_health_proto_rawDescData = file_grpc_health_v1_health_proto_rawDesc
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var fileDescriptor_e265fd9d4e077217 = []byte{
 | 
					func file_grpc_health_v1_health_proto_rawDescGZIP() []byte {
 | 
				
			||||||
	// 297 bytes of a gzipped FileDescriptorProto
 | 
						file_grpc_health_v1_health_proto_rawDescOnce.Do(func() {
 | 
				
			||||||
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4e, 0x2f, 0x2a, 0x48,
 | 
							file_grpc_health_v1_health_proto_rawDescData = protoimpl.X.CompressGZIP(file_grpc_health_v1_health_proto_rawDescData)
 | 
				
			||||||
	0xd6, 0xcf, 0x48, 0x4d, 0xcc, 0x29, 0xc9, 0xd0, 0x2f, 0x33, 0x84, 0xb2, 0xf4, 0x0a, 0x8a, 0xf2,
 | 
						})
 | 
				
			||||||
	0x4b, 0xf2, 0x85, 0xf8, 0x40, 0x92, 0x7a, 0x50, 0xa1, 0x32, 0x43, 0x25, 0x3d, 0x2e, 0x21, 0x0f,
 | 
						return file_grpc_health_v1_health_proto_rawDescData
 | 
				
			||||||
	0x30, 0xc7, 0x39, 0x23, 0x35, 0x39, 0x3b, 0x28, 0xb5, 0xb0, 0x34, 0xb5, 0xb8, 0x44, 0x48, 0x82,
 | 
					 | 
				
			||||||
	0x8b, 0xbd, 0x38, 0xb5, 0xa8, 0x2c, 0x33, 0x39, 0x55, 0x82, 0x51, 0x81, 0x51, 0x83, 0x33, 0x08,
 | 
					 | 
				
			||||||
	0xc6, 0x55, 0xda, 0xc8, 0xc8, 0x25, 0x8c, 0xa2, 0xa1, 0xb8, 0x20, 0x3f, 0xaf, 0x38, 0x55, 0xc8,
 | 
					 | 
				
			||||||
	0x93, 0x8b, 0xad, 0xb8, 0x24, 0xb1, 0xa4, 0xb4, 0x18, 0xac, 0x81, 0xcf, 0xc8, 0x50, 0x0f, 0xd5,
 | 
					 | 
				
			||||||
	0x22, 0x3d, 0x2c, 0x9a, 0xf4, 0x82, 0x41, 0x86, 0xe6, 0xa5, 0x07, 0x83, 0x35, 0x06, 0x41, 0x0d,
 | 
					 | 
				
			||||||
	0x50, 0xf2, 0xe7, 0xe2, 0x45, 0x91, 0x10, 0xe2, 0xe6, 0x62, 0x0f, 0xf5, 0xf3, 0xf6, 0xf3, 0x0f,
 | 
					 | 
				
			||||||
	0xf7, 0x13, 0x60, 0x00, 0x71, 0x82, 0x5d, 0x83, 0xc2, 0x3c, 0xfd, 0xdc, 0x05, 0x18, 0x85, 0xf8,
 | 
					 | 
				
			||||||
	0xb9, 0xb8, 0xfd, 0xfc, 0x43, 0xe2, 0x61, 0x02, 0x4c, 0x42, 0xc2, 0x5c, 0xfc, 0x60, 0x8e, 0xb3,
 | 
					 | 
				
			||||||
	0x6b, 0x3c, 0x4c, 0x0b, 0xb3, 0xd1, 0x3a, 0x46, 0x2e, 0x36, 0x88, 0xf5, 0x42, 0x01, 0x5c, 0xac,
 | 
					 | 
				
			||||||
	0x60, 0x27, 0x08, 0x29, 0xe1, 0x75, 0x1f, 0x38, 0x14, 0xa4, 0x94, 0x89, 0xf0, 0x83, 0x50, 0x10,
 | 
					 | 
				
			||||||
	0x17, 0x6b, 0x78, 0x62, 0x49, 0x72, 0x06, 0xd5, 0x4c, 0x34, 0x60, 0x74, 0x4a, 0xe4, 0x12, 0xcc,
 | 
					 | 
				
			||||||
	0xcc, 0x47, 0x53, 0xea, 0xc4, 0x0d, 0x51, 0x1b, 0x00, 0x8a, 0xc6, 0x00, 0xc6, 0x28, 0x9d, 0xf4,
 | 
					 | 
				
			||||||
	0xfc, 0xfc, 0xf4, 0x9c, 0x54, 0xbd, 0xf4, 0xfc, 0x9c, 0xc4, 0xbc, 0x74, 0xbd, 0xfc, 0xa2, 0x74,
 | 
					 | 
				
			||||||
	0x7d, 0xe4, 0x78, 0x07, 0xb1, 0xe3, 0x21, 0xec, 0xf8, 0x32, 0xc3, 0x55, 0x4c, 0x7c, 0xee, 0x20,
 | 
					 | 
				
			||||||
	0xd3, 0x20, 0x46, 0xe8, 0x85, 0x19, 0x26, 0xb1, 0x81, 0x93, 0x83, 0x31, 0x20, 0x00, 0x00, 0xff,
 | 
					 | 
				
			||||||
	0xff, 0x12, 0x7d, 0x96, 0xcb, 0x2d, 0x02, 0x00, 0x00,
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Reference imports to suppress errors if they are not otherwise used.
 | 
					var file_grpc_health_v1_health_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
 | 
				
			||||||
var _ context.Context
 | 
					var file_grpc_health_v1_health_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
 | 
				
			||||||
var _ grpc.ClientConnInterface
 | 
					var file_grpc_health_v1_health_proto_goTypes = []interface{}{
 | 
				
			||||||
 | 
						(HealthCheckResponse_ServingStatus)(0), // 0: grpc.health.v1.HealthCheckResponse.ServingStatus
 | 
				
			||||||
// This is a compile-time assertion to ensure that this generated file
 | 
						(*HealthCheckRequest)(nil),             // 1: grpc.health.v1.HealthCheckRequest
 | 
				
			||||||
// is compatible with the grpc package it is being compiled against.
 | 
						(*HealthCheckResponse)(nil),            // 2: grpc.health.v1.HealthCheckResponse
 | 
				
			||||||
const _ = grpc.SupportPackageIsVersion6
 | 
					}
 | 
				
			||||||
 | 
					var file_grpc_health_v1_health_proto_depIdxs = []int32{
 | 
				
			||||||
// HealthClient is the client API for Health service.
 | 
						0, // 0: grpc.health.v1.HealthCheckResponse.status:type_name -> grpc.health.v1.HealthCheckResponse.ServingStatus
 | 
				
			||||||
//
 | 
						1, // 1: grpc.health.v1.Health.Check:input_type -> grpc.health.v1.HealthCheckRequest
 | 
				
			||||||
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
 | 
						1, // 2: grpc.health.v1.Health.Watch:input_type -> grpc.health.v1.HealthCheckRequest
 | 
				
			||||||
type HealthClient interface {
 | 
						2, // 3: grpc.health.v1.Health.Check:output_type -> grpc.health.v1.HealthCheckResponse
 | 
				
			||||||
	// If the requested service is unknown, the call will fail with status
 | 
						2, // 4: grpc.health.v1.Health.Watch:output_type -> grpc.health.v1.HealthCheckResponse
 | 
				
			||||||
	// NOT_FOUND.
 | 
						3, // [3:5] is the sub-list for method output_type
 | 
				
			||||||
	Check(ctx context.Context, in *HealthCheckRequest, opts ...grpc.CallOption) (*HealthCheckResponse, error)
 | 
						1, // [1:3] is the sub-list for method input_type
 | 
				
			||||||
	// Performs a watch for the serving status of the requested service.
 | 
						1, // [1:1] is the sub-list for extension type_name
 | 
				
			||||||
	// The server will immediately send back a message indicating the current
 | 
						1, // [1:1] is the sub-list for extension extendee
 | 
				
			||||||
	// serving status.  It will then subsequently send a new message whenever
 | 
						0, // [0:1] is the sub-list for field type_name
 | 
				
			||||||
	// the service's serving status changes.
 | 
					 | 
				
			||||||
	//
 | 
					 | 
				
			||||||
	// If the requested service is unknown when the call is received, the
 | 
					 | 
				
			||||||
	// server will send a message setting the serving status to
 | 
					 | 
				
			||||||
	// SERVICE_UNKNOWN but will *not* terminate the call.  If at some
 | 
					 | 
				
			||||||
	// future point, the serving status of the service becomes known, the
 | 
					 | 
				
			||||||
	// server will send a new message with the service's serving status.
 | 
					 | 
				
			||||||
	//
 | 
					 | 
				
			||||||
	// If the call terminates with status UNIMPLEMENTED, then clients
 | 
					 | 
				
			||||||
	// should assume this method is not supported and should not retry the
 | 
					 | 
				
			||||||
	// call.  If the call terminates with any other status (including OK),
 | 
					 | 
				
			||||||
	// clients should retry the call with appropriate exponential backoff.
 | 
					 | 
				
			||||||
	Watch(ctx context.Context, in *HealthCheckRequest, opts ...grpc.CallOption) (Health_WatchClient, error)
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type healthClient struct {
 | 
					func init() { file_grpc_health_v1_health_proto_init() }
 | 
				
			||||||
	cc grpc.ClientConnInterface
 | 
					func file_grpc_health_v1_health_proto_init() {
 | 
				
			||||||
}
 | 
						if File_grpc_health_v1_health_proto != nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
func NewHealthClient(cc grpc.ClientConnInterface) HealthClient {
 | 
					 | 
				
			||||||
	return &healthClient{cc}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (c *healthClient) Check(ctx context.Context, in *HealthCheckRequest, opts ...grpc.CallOption) (*HealthCheckResponse, error) {
 | 
					 | 
				
			||||||
	out := new(HealthCheckResponse)
 | 
					 | 
				
			||||||
	err := c.cc.Invoke(ctx, "/grpc.health.v1.Health/Check", in, out, opts...)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return out, nil
 | 
						if !protoimpl.UnsafeEnabled {
 | 
				
			||||||
}
 | 
							file_grpc_health_v1_health_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 | 
				
			||||||
 | 
								switch v := v.(*HealthCheckRequest); i {
 | 
				
			||||||
func (c *healthClient) Watch(ctx context.Context, in *HealthCheckRequest, opts ...grpc.CallOption) (Health_WatchClient, error) {
 | 
								case 0:
 | 
				
			||||||
	stream, err := c.cc.NewStream(ctx, &_Health_serviceDesc.Streams[0], "/grpc.health.v1.Health/Watch", opts...)
 | 
									return &v.state
 | 
				
			||||||
	if err != nil {
 | 
								case 1:
 | 
				
			||||||
		return nil, err
 | 
									return &v.sizeCache
 | 
				
			||||||
 | 
								case 2:
 | 
				
			||||||
 | 
									return &v.unknownFields
 | 
				
			||||||
 | 
								default:
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							file_grpc_health_v1_health_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 | 
				
			||||||
 | 
								switch v := v.(*HealthCheckResponse); i {
 | 
				
			||||||
 | 
								case 0:
 | 
				
			||||||
 | 
									return &v.state
 | 
				
			||||||
 | 
								case 1:
 | 
				
			||||||
 | 
									return &v.sizeCache
 | 
				
			||||||
 | 
								case 2:
 | 
				
			||||||
 | 
									return &v.unknownFields
 | 
				
			||||||
 | 
								default:
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	x := &healthWatchClient{stream}
 | 
						type x struct{}
 | 
				
			||||||
	if err := x.ClientStream.SendMsg(in); err != nil {
 | 
						out := protoimpl.TypeBuilder{
 | 
				
			||||||
		return nil, err
 | 
							File: protoimpl.DescBuilder{
 | 
				
			||||||
	}
 | 
								GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 | 
				
			||||||
	if err := x.ClientStream.CloseSend(); err != nil {
 | 
								RawDescriptor: file_grpc_health_v1_health_proto_rawDesc,
 | 
				
			||||||
		return nil, err
 | 
								NumEnums:      1,
 | 
				
			||||||
	}
 | 
								NumMessages:   2,
 | 
				
			||||||
	return x, nil
 | 
								NumExtensions: 0,
 | 
				
			||||||
}
 | 
								NumServices:   1,
 | 
				
			||||||
 | 
					 | 
				
			||||||
type Health_WatchClient interface {
 | 
					 | 
				
			||||||
	Recv() (*HealthCheckResponse, error)
 | 
					 | 
				
			||||||
	grpc.ClientStream
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type healthWatchClient struct {
 | 
					 | 
				
			||||||
	grpc.ClientStream
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (x *healthWatchClient) Recv() (*HealthCheckResponse, error) {
 | 
					 | 
				
			||||||
	m := new(HealthCheckResponse)
 | 
					 | 
				
			||||||
	if err := x.ClientStream.RecvMsg(m); err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return m, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// HealthServer is the server API for Health service.
 | 
					 | 
				
			||||||
type HealthServer interface {
 | 
					 | 
				
			||||||
	// If the requested service is unknown, the call will fail with status
 | 
					 | 
				
			||||||
	// NOT_FOUND.
 | 
					 | 
				
			||||||
	Check(context.Context, *HealthCheckRequest) (*HealthCheckResponse, error)
 | 
					 | 
				
			||||||
	// Performs a watch for the serving status of the requested service.
 | 
					 | 
				
			||||||
	// The server will immediately send back a message indicating the current
 | 
					 | 
				
			||||||
	// serving status.  It will then subsequently send a new message whenever
 | 
					 | 
				
			||||||
	// the service's serving status changes.
 | 
					 | 
				
			||||||
	//
 | 
					 | 
				
			||||||
	// If the requested service is unknown when the call is received, the
 | 
					 | 
				
			||||||
	// server will send a message setting the serving status to
 | 
					 | 
				
			||||||
	// SERVICE_UNKNOWN but will *not* terminate the call.  If at some
 | 
					 | 
				
			||||||
	// future point, the serving status of the service becomes known, the
 | 
					 | 
				
			||||||
	// server will send a new message with the service's serving status.
 | 
					 | 
				
			||||||
	//
 | 
					 | 
				
			||||||
	// If the call terminates with status UNIMPLEMENTED, then clients
 | 
					 | 
				
			||||||
	// should assume this method is not supported and should not retry the
 | 
					 | 
				
			||||||
	// call.  If the call terminates with any other status (including OK),
 | 
					 | 
				
			||||||
	// clients should retry the call with appropriate exponential backoff.
 | 
					 | 
				
			||||||
	Watch(*HealthCheckRequest, Health_WatchServer) error
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// UnimplementedHealthServer can be embedded to have forward compatible implementations.
 | 
					 | 
				
			||||||
type UnimplementedHealthServer struct {
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (*UnimplementedHealthServer) Check(ctx context.Context, req *HealthCheckRequest) (*HealthCheckResponse, error) {
 | 
					 | 
				
			||||||
	return nil, status.Errorf(codes.Unimplemented, "method Check not implemented")
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
func (*UnimplementedHealthServer) Watch(req *HealthCheckRequest, srv Health_WatchServer) error {
 | 
					 | 
				
			||||||
	return status.Errorf(codes.Unimplemented, "method Watch not implemented")
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func RegisterHealthServer(s *grpc.Server, srv HealthServer) {
 | 
					 | 
				
			||||||
	s.RegisterService(&_Health_serviceDesc, srv)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func _Health_Check_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
					 | 
				
			||||||
	in := new(HealthCheckRequest)
 | 
					 | 
				
			||||||
	if err := dec(in); err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if interceptor == nil {
 | 
					 | 
				
			||||||
		return srv.(HealthServer).Check(ctx, in)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	info := &grpc.UnaryServerInfo{
 | 
					 | 
				
			||||||
		Server:     srv,
 | 
					 | 
				
			||||||
		FullMethod: "/grpc.health.v1.Health/Check",
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 | 
					 | 
				
			||||||
		return srv.(HealthServer).Check(ctx, req.(*HealthCheckRequest))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return interceptor(ctx, in, info, handler)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func _Health_Watch_Handler(srv interface{}, stream grpc.ServerStream) error {
 | 
					 | 
				
			||||||
	m := new(HealthCheckRequest)
 | 
					 | 
				
			||||||
	if err := stream.RecvMsg(m); err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return srv.(HealthServer).Watch(m, &healthWatchServer{stream})
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type Health_WatchServer interface {
 | 
					 | 
				
			||||||
	Send(*HealthCheckResponse) error
 | 
					 | 
				
			||||||
	grpc.ServerStream
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type healthWatchServer struct {
 | 
					 | 
				
			||||||
	grpc.ServerStream
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (x *healthWatchServer) Send(m *HealthCheckResponse) error {
 | 
					 | 
				
			||||||
	return x.ServerStream.SendMsg(m)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var _Health_serviceDesc = grpc.ServiceDesc{
 | 
					 | 
				
			||||||
	ServiceName: "grpc.health.v1.Health",
 | 
					 | 
				
			||||||
	HandlerType: (*HealthServer)(nil),
 | 
					 | 
				
			||||||
	Methods: []grpc.MethodDesc{
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			MethodName: "Check",
 | 
					 | 
				
			||||||
			Handler:    _Health_Check_Handler,
 | 
					 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	},
 | 
							GoTypes:           file_grpc_health_v1_health_proto_goTypes,
 | 
				
			||||||
	Streams: []grpc.StreamDesc{
 | 
							DependencyIndexes: file_grpc_health_v1_health_proto_depIdxs,
 | 
				
			||||||
		{
 | 
							EnumInfos:         file_grpc_health_v1_health_proto_enumTypes,
 | 
				
			||||||
			StreamName:    "Watch",
 | 
							MessageInfos:      file_grpc_health_v1_health_proto_msgTypes,
 | 
				
			||||||
			Handler:       _Health_Watch_Handler,
 | 
						}.Build()
 | 
				
			||||||
			ServerStreams: true,
 | 
						File_grpc_health_v1_health_proto = out.File
 | 
				
			||||||
		},
 | 
						file_grpc_health_v1_health_proto_rawDesc = nil
 | 
				
			||||||
	},
 | 
						file_grpc_health_v1_health_proto_goTypes = nil
 | 
				
			||||||
	Metadata: "grpc/health/v1/health.proto",
 | 
						file_grpc_health_v1_health_proto_depIdxs = nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										197
									
								
								vendor/google.golang.org/grpc/health/grpc_health_v1/health_grpc.pb.go
								
								
									generated
								
								
									vendored
								
								
									Normal file
								
							
							
						
						
									
										197
									
								
								vendor/google.golang.org/grpc/health/grpc_health_v1/health_grpc.pb.go
								
								
									generated
								
								
									vendored
								
								
									Normal file
								
							| 
						 | 
					@ -0,0 +1,197 @@
 | 
				
			||||||
 | 
					// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package grpc_health_v1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						context "context"
 | 
				
			||||||
 | 
						grpc "google.golang.org/grpc"
 | 
				
			||||||
 | 
						codes "google.golang.org/grpc/codes"
 | 
				
			||||||
 | 
						status "google.golang.org/grpc/status"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 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.
 | 
				
			||||||
 | 
					type HealthClient interface {
 | 
				
			||||||
 | 
						// If the requested service is unknown, the call will fail with status
 | 
				
			||||||
 | 
						// NOT_FOUND.
 | 
				
			||||||
 | 
						Check(ctx context.Context, in *HealthCheckRequest, opts ...grpc.CallOption) (*HealthCheckResponse, error)
 | 
				
			||||||
 | 
						// Performs a watch for the serving status of the requested service.
 | 
				
			||||||
 | 
						// The server will immediately send back a message indicating the current
 | 
				
			||||||
 | 
						// serving status.  It will then subsequently send a new message whenever
 | 
				
			||||||
 | 
						// the service's serving status changes.
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// If the requested service is unknown when the call is received, the
 | 
				
			||||||
 | 
						// server will send a message setting the serving status to
 | 
				
			||||||
 | 
						// SERVICE_UNKNOWN but will *not* terminate the call.  If at some
 | 
				
			||||||
 | 
						// future point, the serving status of the service becomes known, the
 | 
				
			||||||
 | 
						// server will send a new message with the service's serving status.
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// If the call terminates with status UNIMPLEMENTED, then clients
 | 
				
			||||||
 | 
						// should assume this method is not supported and should not retry the
 | 
				
			||||||
 | 
						// call.  If the call terminates with any other status (including OK),
 | 
				
			||||||
 | 
						// clients should retry the call with appropriate exponential backoff.
 | 
				
			||||||
 | 
						Watch(ctx context.Context, in *HealthCheckRequest, opts ...grpc.CallOption) (Health_WatchClient, error)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type healthClient struct {
 | 
				
			||||||
 | 
						cc grpc.ClientConnInterface
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewHealthClient(cc grpc.ClientConnInterface) HealthClient {
 | 
				
			||||||
 | 
						return &healthClient{cc}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *healthClient) Check(ctx context.Context, in *HealthCheckRequest, opts ...grpc.CallOption) (*HealthCheckResponse, error) {
 | 
				
			||||||
 | 
						out := new(HealthCheckResponse)
 | 
				
			||||||
 | 
						err := c.cc.Invoke(ctx, "/grpc.health.v1.Health/Check", in, out, opts...)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return out, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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], "/grpc.health.v1.Health/Watch", opts...)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						x := &healthWatchClient{stream}
 | 
				
			||||||
 | 
						if err := x.ClientStream.SendMsg(in); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if err := x.ClientStream.CloseSend(); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return x, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Health_WatchClient interface {
 | 
				
			||||||
 | 
						Recv() (*HealthCheckResponse, error)
 | 
				
			||||||
 | 
						grpc.ClientStream
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type healthWatchClient struct {
 | 
				
			||||||
 | 
						grpc.ClientStream
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (x *healthWatchClient) Recv() (*HealthCheckResponse, error) {
 | 
				
			||||||
 | 
						m := new(HealthCheckResponse)
 | 
				
			||||||
 | 
						if err := x.ClientStream.RecvMsg(m); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return m, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// HealthServer is the server API for Health service.
 | 
				
			||||||
 | 
					// All implementations should embed UnimplementedHealthServer
 | 
				
			||||||
 | 
					// for forward compatibility
 | 
				
			||||||
 | 
					type HealthServer interface {
 | 
				
			||||||
 | 
						// If the requested service is unknown, the call will fail with status
 | 
				
			||||||
 | 
						// NOT_FOUND.
 | 
				
			||||||
 | 
						Check(context.Context, *HealthCheckRequest) (*HealthCheckResponse, error)
 | 
				
			||||||
 | 
						// Performs a watch for the serving status of the requested service.
 | 
				
			||||||
 | 
						// The server will immediately send back a message indicating the current
 | 
				
			||||||
 | 
						// serving status.  It will then subsequently send a new message whenever
 | 
				
			||||||
 | 
						// the service's serving status changes.
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// If the requested service is unknown when the call is received, the
 | 
				
			||||||
 | 
						// server will send a message setting the serving status to
 | 
				
			||||||
 | 
						// SERVICE_UNKNOWN but will *not* terminate the call.  If at some
 | 
				
			||||||
 | 
						// future point, the serving status of the service becomes known, the
 | 
				
			||||||
 | 
						// server will send a new message with the service's serving status.
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// If the call terminates with status UNIMPLEMENTED, then clients
 | 
				
			||||||
 | 
						// should assume this method is not supported and should not retry the
 | 
				
			||||||
 | 
						// call.  If the call terminates with any other status (including OK),
 | 
				
			||||||
 | 
						// clients should retry the call with appropriate exponential backoff.
 | 
				
			||||||
 | 
						Watch(*HealthCheckRequest, Health_WatchServer) error
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// UnimplementedHealthServer should be embedded to have forward compatible implementations.
 | 
				
			||||||
 | 
					type UnimplementedHealthServer struct {
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (UnimplementedHealthServer) Check(context.Context, *HealthCheckRequest) (*HealthCheckResponse, error) {
 | 
				
			||||||
 | 
						return nil, status.Errorf(codes.Unimplemented, "method Check not implemented")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					func (UnimplementedHealthServer) Watch(*HealthCheckRequest, Health_WatchServer) error {
 | 
				
			||||||
 | 
						return status.Errorf(codes.Unimplemented, "method Watch not implemented")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// UnsafeHealthServer may be embedded to opt out of forward compatibility for this service.
 | 
				
			||||||
 | 
					// Use of this interface is not recommended, as added methods to HealthServer will
 | 
				
			||||||
 | 
					// result in compilation errors.
 | 
				
			||||||
 | 
					type UnsafeHealthServer interface {
 | 
				
			||||||
 | 
						mustEmbedUnimplementedHealthServer()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func RegisterHealthServer(s grpc.ServiceRegistrar, srv HealthServer) {
 | 
				
			||||||
 | 
						s.RegisterService(&Health_ServiceDesc, srv)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _Health_Check_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
				
			||||||
 | 
						in := new(HealthCheckRequest)
 | 
				
			||||||
 | 
						if err := dec(in); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if interceptor == nil {
 | 
				
			||||||
 | 
							return srv.(HealthServer).Check(ctx, in)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						info := &grpc.UnaryServerInfo{
 | 
				
			||||||
 | 
							Server:     srv,
 | 
				
			||||||
 | 
							FullMethod: "/grpc.health.v1.Health/Check",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 | 
				
			||||||
 | 
							return srv.(HealthServer).Check(ctx, req.(*HealthCheckRequest))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return interceptor(ctx, in, info, handler)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _Health_Watch_Handler(srv interface{}, stream grpc.ServerStream) error {
 | 
				
			||||||
 | 
						m := new(HealthCheckRequest)
 | 
				
			||||||
 | 
						if err := stream.RecvMsg(m); err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return srv.(HealthServer).Watch(m, &healthWatchServer{stream})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Health_WatchServer interface {
 | 
				
			||||||
 | 
						Send(*HealthCheckResponse) error
 | 
				
			||||||
 | 
						grpc.ServerStream
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type healthWatchServer struct {
 | 
				
			||||||
 | 
						grpc.ServerStream
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (x *healthWatchServer) Send(m *HealthCheckResponse) error {
 | 
				
			||||||
 | 
						return x.ServerStream.SendMsg(m)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Health_ServiceDesc is the grpc.ServiceDesc for Health service.
 | 
				
			||||||
 | 
					// It's only intended for direct use with grpc.RegisterService,
 | 
				
			||||||
 | 
					// and not to be introspected or modified (even as a copy)
 | 
				
			||||||
 | 
					var Health_ServiceDesc = grpc.ServiceDesc{
 | 
				
			||||||
 | 
						ServiceName: "grpc.health.v1.Health",
 | 
				
			||||||
 | 
						HandlerType: (*HealthServer)(nil),
 | 
				
			||||||
 | 
						Methods: []grpc.MethodDesc{
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								MethodName: "Check",
 | 
				
			||||||
 | 
								Handler:    _Health_Check_Handler,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						Streams: []grpc.StreamDesc{
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								StreamName:    "Watch",
 | 
				
			||||||
 | 
								Handler:       _Health_Watch_Handler,
 | 
				
			||||||
 | 
								ServerStreams: true,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						Metadata: "grpc/health/v1/health.proto",
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,6 @@
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Copyright 2017 gRPC authors.
 | 
					 * Copyright 2020 gRPC authors.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 * you may not use this file except in compliance with the License.
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
| 
						 | 
					@ -16,29 +16,8 @@
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// This file contains wrappers for grpclog functions.
 | 
					package health
 | 
				
			||||||
// The transport package only logs to verbose level 2 by default.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package transport
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "google.golang.org/grpc/grpclog"
 | 
					import "google.golang.org/grpc/grpclog"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const logLevel = 2
 | 
					var logger = grpclog.Component("health_service")
 | 
				
			||||||
 | 
					 | 
				
			||||||
func infof(format string, args ...interface{}) {
 | 
					 | 
				
			||||||
	if grpclog.V(logLevel) {
 | 
					 | 
				
			||||||
		grpclog.Infof(format, args...)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func warningf(format string, args ...interface{}) {
 | 
					 | 
				
			||||||
	if grpclog.V(logLevel) {
 | 
					 | 
				
			||||||
		grpclog.Warningf(format, args...)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func errorf(format string, args ...interface{}) {
 | 
					 | 
				
			||||||
	if grpclog.V(logLevel) {
 | 
					 | 
				
			||||||
		grpclog.Errorf(format, args...)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,33 +0,0 @@
 | 
				
			||||||
#!/bin/bash
 | 
					 | 
				
			||||||
# 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.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
set -eux -o pipefail
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TMP=$(mktemp -d)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function finish {
 | 
					 | 
				
			||||||
  rm -rf "$TMP"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
trap finish EXIT
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pushd "$TMP"
 | 
					 | 
				
			||||||
mkdir -p grpc/health/v1
 | 
					 | 
				
			||||||
curl https://raw.githubusercontent.com/grpc/grpc-proto/master/grpc/health/v1/health.proto > grpc/health/v1/health.proto
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
protoc --go_out=plugins=grpc,paths=source_relative:. -I. grpc/health/v1/*.proto
 | 
					 | 
				
			||||||
popd
 | 
					 | 
				
			||||||
rm -f grpc_health_v1/*.pb.go
 | 
					 | 
				
			||||||
cp "$TMP"/grpc/health/v1/*.pb.go grpc_health_v1/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
| 
						 | 
					@ -16,8 +16,6 @@
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//go:generate ./regenerate.sh
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Package health provides a service that exposes server's health and it must be
 | 
					// Package health provides a service that exposes server's health and it must be
 | 
				
			||||||
// imported to enable support for client-side health checks.
 | 
					// imported to enable support for client-side health checks.
 | 
				
			||||||
package health
 | 
					package health
 | 
				
			||||||
| 
						 | 
					@ -27,7 +25,6 @@ import (
 | 
				
			||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"google.golang.org/grpc/codes"
 | 
						"google.golang.org/grpc/codes"
 | 
				
			||||||
	"google.golang.org/grpc/grpclog"
 | 
					 | 
				
			||||||
	healthgrpc "google.golang.org/grpc/health/grpc_health_v1"
 | 
						healthgrpc "google.golang.org/grpc/health/grpc_health_v1"
 | 
				
			||||||
	healthpb "google.golang.org/grpc/health/grpc_health_v1"
 | 
						healthpb "google.golang.org/grpc/health/grpc_health_v1"
 | 
				
			||||||
	"google.golang.org/grpc/status"
 | 
						"google.golang.org/grpc/status"
 | 
				
			||||||
| 
						 | 
					@ -35,6 +32,7 @@ import (
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Server implements `service Health`.
 | 
					// Server implements `service Health`.
 | 
				
			||||||
type Server struct {
 | 
					type Server struct {
 | 
				
			||||||
 | 
						healthgrpc.UnimplementedHealthServer
 | 
				
			||||||
	mu sync.RWMutex
 | 
						mu sync.RWMutex
 | 
				
			||||||
	// If shutdown is true, it's expected all serving status is NOT_SERVING, and
 | 
						// If shutdown is true, it's expected all serving status is NOT_SERVING, and
 | 
				
			||||||
	// will stay in NOT_SERVING.
 | 
						// will stay in NOT_SERVING.
 | 
				
			||||||
| 
						 | 
					@ -115,7 +113,7 @@ func (s *Server) SetServingStatus(service string, servingStatus healthpb.HealthC
 | 
				
			||||||
	s.mu.Lock()
 | 
						s.mu.Lock()
 | 
				
			||||||
	defer s.mu.Unlock()
 | 
						defer s.mu.Unlock()
 | 
				
			||||||
	if s.shutdown {
 | 
						if s.shutdown {
 | 
				
			||||||
		grpclog.Infof("health: status changing for %s to %v is ignored because health service is shutdown", service, servingStatus)
 | 
							logger.Infof("health: status changing for %s to %v is ignored because health service is shutdown", service, servingStatus)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,4 +3,4 @@
 | 
				
			||||||
TMP=$(mktemp -d /tmp/sdk.XXX) \
 | 
					TMP=$(mktemp -d /tmp/sdk.XXX) \
 | 
				
			||||||
&& curl -o $TMP.zip "https://storage.googleapis.com/appengine-sdks/featured/go_appengine_sdk_linux_amd64-1.9.68.zip" \
 | 
					&& curl -o $TMP.zip "https://storage.googleapis.com/appengine-sdks/featured/go_appengine_sdk_linux_amd64-1.9.68.zip" \
 | 
				
			||||||
&& unzip -q $TMP.zip -d $TMP \
 | 
					&& unzip -q $TMP.zip -d $TMP \
 | 
				
			||||||
&& export PATH="$PATH:$TMP/go_appengine"
 | 
					&& export PATH="$PATH:$TMP/go_appengine"
 | 
				
			||||||
| 
						 | 
					@ -25,17 +25,41 @@ import (
 | 
				
			||||||
// UnaryInvoker is called by UnaryClientInterceptor to complete RPCs.
 | 
					// UnaryInvoker is called by UnaryClientInterceptor to complete RPCs.
 | 
				
			||||||
type UnaryInvoker func(ctx context.Context, method string, req, reply interface{}, cc *ClientConn, opts ...CallOption) error
 | 
					type UnaryInvoker func(ctx context.Context, method string, req, reply interface{}, cc *ClientConn, opts ...CallOption) error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// UnaryClientInterceptor intercepts the execution of a unary RPC on the client. invoker is the handler to complete the RPC
 | 
					// UnaryClientInterceptor intercepts the execution of a unary RPC on the client.
 | 
				
			||||||
// and it is the responsibility of the interceptor to call it.
 | 
					// Unary interceptors can be specified as a DialOption, using
 | 
				
			||||||
// This is an EXPERIMENTAL API.
 | 
					// WithUnaryInterceptor() or WithChainUnaryInterceptor(), when creating a
 | 
				
			||||||
 | 
					// ClientConn. When a unary interceptor(s) is set on a ClientConn, gRPC
 | 
				
			||||||
 | 
					// delegates all unary RPC invocations to the interceptor, and it is the
 | 
				
			||||||
 | 
					// responsibility of the interceptor to call invoker to complete the processing
 | 
				
			||||||
 | 
					// of the RPC.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// method is the RPC name. req and reply are the corresponding request and
 | 
				
			||||||
 | 
					// response messages. cc is the ClientConn on which the RPC was invoked. invoker
 | 
				
			||||||
 | 
					// is the handler to complete the RPC and it is the responsibility of the
 | 
				
			||||||
 | 
					// interceptor to call it. opts contain all applicable call options, including
 | 
				
			||||||
 | 
					// defaults from the ClientConn as well as per-call options.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// The returned error must be compatible with the status package.
 | 
				
			||||||
type UnaryClientInterceptor func(ctx context.Context, method string, req, reply interface{}, cc *ClientConn, invoker UnaryInvoker, opts ...CallOption) error
 | 
					type UnaryClientInterceptor func(ctx context.Context, method string, req, reply interface{}, cc *ClientConn, invoker UnaryInvoker, opts ...CallOption) error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Streamer is called by StreamClientInterceptor to create a ClientStream.
 | 
					// Streamer is called by StreamClientInterceptor to create a ClientStream.
 | 
				
			||||||
type Streamer func(ctx context.Context, desc *StreamDesc, cc *ClientConn, method string, opts ...CallOption) (ClientStream, error)
 | 
					type Streamer func(ctx context.Context, desc *StreamDesc, cc *ClientConn, method string, opts ...CallOption) (ClientStream, error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// StreamClientInterceptor intercepts the creation of ClientStream. It may return a custom ClientStream to intercept all I/O
 | 
					// StreamClientInterceptor intercepts the creation of a ClientStream. Stream
 | 
				
			||||||
// operations. streamer is the handler to create a ClientStream and it is the responsibility of the interceptor to call it.
 | 
					// interceptors can be specified as a DialOption, using WithStreamInterceptor()
 | 
				
			||||||
// This is an EXPERIMENTAL API.
 | 
					// or WithChainStreamInterceptor(), when creating a ClientConn. When a stream
 | 
				
			||||||
 | 
					// interceptor(s) is set on the ClientConn, gRPC delegates all stream creations
 | 
				
			||||||
 | 
					// to the interceptor, and it is the responsibility of the interceptor to call
 | 
				
			||||||
 | 
					// streamer.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// desc contains a description of the stream. cc is the ClientConn on which the
 | 
				
			||||||
 | 
					// RPC was invoked. streamer is the handler to create a ClientStream and it is
 | 
				
			||||||
 | 
					// the responsibility of the interceptor to call it. opts contain all applicable
 | 
				
			||||||
 | 
					// call options, including defaults from the ClientConn as well as per-call
 | 
				
			||||||
 | 
					// options.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// StreamClientInterceptor may return a custom ClientStream to intercept all I/O
 | 
				
			||||||
 | 
					// operations. The returned error must be compatible with the status package.
 | 
				
			||||||
type StreamClientInterceptor func(ctx context.Context, desc *StreamDesc, cc *ClientConn, method string, streamer Streamer, opts ...CallOption) (ClientStream, error)
 | 
					type StreamClientInterceptor func(ctx context.Context, desc *StreamDesc, cc *ClientConn, method string, streamer Streamer, opts ...CallOption) (ClientStream, error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// UnaryServerInfo consists of various information about a unary RPC on
 | 
					// UnaryServerInfo consists of various information about a unary RPC on
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,6 +25,7 @@ import (
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"google.golang.org/grpc/grpclog"
 | 
						"google.golang.org/grpc/grpclog"
 | 
				
			||||||
 | 
						"google.golang.org/grpc/internal/grpcutil"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Logger is the global binary logger. It can be used to get binary logger for
 | 
					// Logger is the global binary logger. It can be used to get binary logger for
 | 
				
			||||||
| 
						 | 
					@ -39,6 +40,8 @@ type Logger interface {
 | 
				
			||||||
// It is used to get a methodLogger for each individual method.
 | 
					// It is used to get a methodLogger for each individual method.
 | 
				
			||||||
var binLogger Logger
 | 
					var binLogger Logger
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var grpclogLogger = grpclog.Component("binarylog")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// SetLogger sets the binarg logger.
 | 
					// SetLogger sets the binarg logger.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// Only call this at init time.
 | 
					// Only call this at init time.
 | 
				
			||||||
| 
						 | 
					@ -146,9 +149,9 @@ func (l *logger) setBlacklist(method string) error {
 | 
				
			||||||
// Each methodLogger returned by this method is a new instance. This is to
 | 
					// Each methodLogger returned by this method is a new instance. This is to
 | 
				
			||||||
// generate sequence id within the call.
 | 
					// generate sequence id within the call.
 | 
				
			||||||
func (l *logger) getMethodLogger(methodName string) *MethodLogger {
 | 
					func (l *logger) getMethodLogger(methodName string) *MethodLogger {
 | 
				
			||||||
	s, m, err := parseMethodName(methodName)
 | 
						s, m, err := grpcutil.ParseMethod(methodName)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		grpclog.Infof("binarylogging: failed to parse %q: %v", methodName, err)
 | 
							grpclogLogger.Infof("binarylogging: failed to parse %q: %v", methodName, err)
 | 
				
			||||||
		return nil
 | 
							return nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if ml, ok := l.methods[s+"/"+m]; ok {
 | 
						if ml, ok := l.methods[s+"/"+m]; ok {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,8 +24,6 @@ import (
 | 
				
			||||||
	"regexp"
 | 
						"regexp"
 | 
				
			||||||
	"strconv"
 | 
						"strconv"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					 | 
				
			||||||
	"google.golang.org/grpc/grpclog"
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewLoggerFromConfigString reads the string and build a logger. It can be used
 | 
					// NewLoggerFromConfigString reads the string and build a logger. It can be used
 | 
				
			||||||
| 
						 | 
					@ -52,7 +50,7 @@ func NewLoggerFromConfigString(s string) Logger {
 | 
				
			||||||
	methods := strings.Split(s, ",")
 | 
						methods := strings.Split(s, ",")
 | 
				
			||||||
	for _, method := range methods {
 | 
						for _, method := range methods {
 | 
				
			||||||
		if err := l.fillMethodLoggerWithConfigString(method); err != nil {
 | 
							if err := l.fillMethodLoggerWithConfigString(method); err != nil {
 | 
				
			||||||
			grpclog.Warningf("failed to parse binary log config: %v", err)
 | 
								grpclogLogger.Warningf("failed to parse binary log config: %v", err)
 | 
				
			||||||
			return nil
 | 
								return nil
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -27,7 +27,6 @@ import (
 | 
				
			||||||
	"github.com/golang/protobuf/proto"
 | 
						"github.com/golang/protobuf/proto"
 | 
				
			||||||
	"github.com/golang/protobuf/ptypes"
 | 
						"github.com/golang/protobuf/ptypes"
 | 
				
			||||||
	pb "google.golang.org/grpc/binarylog/grpc_binarylog_v1"
 | 
						pb "google.golang.org/grpc/binarylog/grpc_binarylog_v1"
 | 
				
			||||||
	"google.golang.org/grpc/grpclog"
 | 
					 | 
				
			||||||
	"google.golang.org/grpc/metadata"
 | 
						"google.golang.org/grpc/metadata"
 | 
				
			||||||
	"google.golang.org/grpc/status"
 | 
						"google.golang.org/grpc/status"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
| 
						 | 
					@ -66,7 +65,7 @@ func newMethodLogger(h, m uint64) *MethodLogger {
 | 
				
			||||||
		callID:          idGen.next(),
 | 
							callID:          idGen.next(),
 | 
				
			||||||
		idWithinCallGen: &callIDGenerator{},
 | 
							idWithinCallGen: &callIDGenerator{},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		sink: defaultSink, // TODO(blog): make it plugable.
 | 
							sink: DefaultSink, // TODO(blog): make it plugable.
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -219,12 +218,12 @@ func (c *ClientMessage) toProto() *pb.GrpcLogEntry {
 | 
				
			||||||
	if m, ok := c.Message.(proto.Message); ok {
 | 
						if m, ok := c.Message.(proto.Message); ok {
 | 
				
			||||||
		data, err = proto.Marshal(m)
 | 
							data, err = proto.Marshal(m)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			grpclog.Infof("binarylogging: failed to marshal proto message: %v", err)
 | 
								grpclogLogger.Infof("binarylogging: failed to marshal proto message: %v", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	} else if b, ok := c.Message.([]byte); ok {
 | 
						} else if b, ok := c.Message.([]byte); ok {
 | 
				
			||||||
		data = b
 | 
							data = b
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		grpclog.Infof("binarylogging: message to log is neither proto.message nor []byte")
 | 
							grpclogLogger.Infof("binarylogging: message to log is neither proto.message nor []byte")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	ret := &pb.GrpcLogEntry{
 | 
						ret := &pb.GrpcLogEntry{
 | 
				
			||||||
		Type: pb.GrpcLogEntry_EVENT_TYPE_CLIENT_MESSAGE,
 | 
							Type: pb.GrpcLogEntry_EVENT_TYPE_CLIENT_MESSAGE,
 | 
				
			||||||
| 
						 | 
					@ -259,12 +258,12 @@ func (c *ServerMessage) toProto() *pb.GrpcLogEntry {
 | 
				
			||||||
	if m, ok := c.Message.(proto.Message); ok {
 | 
						if m, ok := c.Message.(proto.Message); ok {
 | 
				
			||||||
		data, err = proto.Marshal(m)
 | 
							data, err = proto.Marshal(m)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			grpclog.Infof("binarylogging: failed to marshal proto message: %v", err)
 | 
								grpclogLogger.Infof("binarylogging: failed to marshal proto message: %v", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	} else if b, ok := c.Message.([]byte); ok {
 | 
						} else if b, ok := c.Message.([]byte); ok {
 | 
				
			||||||
		data = b
 | 
							data = b
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		grpclog.Infof("binarylogging: message to log is neither proto.message nor []byte")
 | 
							grpclogLogger.Infof("binarylogging: message to log is neither proto.message nor []byte")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	ret := &pb.GrpcLogEntry{
 | 
						ret := &pb.GrpcLogEntry{
 | 
				
			||||||
		Type: pb.GrpcLogEntry_EVENT_TYPE_SERVER_MESSAGE,
 | 
							Type: pb.GrpcLogEntry_EVENT_TYPE_SERVER_MESSAGE,
 | 
				
			||||||
| 
						 | 
					@ -315,7 +314,7 @@ type ServerTrailer struct {
 | 
				
			||||||
func (c *ServerTrailer) toProto() *pb.GrpcLogEntry {
 | 
					func (c *ServerTrailer) toProto() *pb.GrpcLogEntry {
 | 
				
			||||||
	st, ok := status.FromError(c.Err)
 | 
						st, ok := status.FromError(c.Err)
 | 
				
			||||||
	if !ok {
 | 
						if !ok {
 | 
				
			||||||
		grpclog.Info("binarylogging: error in trailer is not a status error")
 | 
							grpclogLogger.Info("binarylogging: error in trailer is not a status error")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var (
 | 
						var (
 | 
				
			||||||
		detailsBytes []byte
 | 
							detailsBytes []byte
 | 
				
			||||||
| 
						 | 
					@ -325,7 +324,7 @@ func (c *ServerTrailer) toProto() *pb.GrpcLogEntry {
 | 
				
			||||||
	if stProto != nil && len(stProto.Details) != 0 {
 | 
						if stProto != nil && len(stProto.Details) != 0 {
 | 
				
			||||||
		detailsBytes, err = proto.Marshal(stProto)
 | 
							detailsBytes, err = proto.Marshal(stProto)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			grpclog.Infof("binarylogging: failed to marshal status proto: %v", err)
 | 
								grpclogLogger.Infof("binarylogging: failed to marshal status proto: %v", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	ret := &pb.GrpcLogEntry{
 | 
						ret := &pb.GrpcLogEntry{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,33 +0,0 @@
 | 
				
			||||||
#!/bin/bash
 | 
					 | 
				
			||||||
# 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.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
set -eux -o pipefail
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TMP=$(mktemp -d)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function finish {
 | 
					 | 
				
			||||||
  rm -rf "$TMP"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
trap finish EXIT
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pushd "$TMP"
 | 
					 | 
				
			||||||
mkdir -p grpc/binarylog/grpc_binarylog_v1
 | 
					 | 
				
			||||||
curl https://raw.githubusercontent.com/grpc/grpc-proto/master/grpc/binlog/v1/binarylog.proto > grpc/binarylog/grpc_binarylog_v1/binarylog.proto
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
protoc --go_out=plugins=grpc,paths=source_relative:. -I. grpc/binarylog/grpc_binarylog_v1/*.proto
 | 
					 | 
				
			||||||
popd
 | 
					 | 
				
			||||||
rm -f ./grpc_binarylog_v1/*.pb.go
 | 
					 | 
				
			||||||
cp "$TMP"/grpc/binarylog/grpc_binarylog_v1/*.pb.go ../../binarylog/grpc_binarylog_v1/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
| 
						 | 
					@ -21,32 +21,23 @@ package binarylog
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"bufio"
 | 
						"bufio"
 | 
				
			||||||
	"encoding/binary"
 | 
						"encoding/binary"
 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"io"
 | 
						"io"
 | 
				
			||||||
	"io/ioutil"
 | 
					 | 
				
			||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/golang/protobuf/proto"
 | 
						"github.com/golang/protobuf/proto"
 | 
				
			||||||
	pb "google.golang.org/grpc/binarylog/grpc_binarylog_v1"
 | 
						pb "google.golang.org/grpc/binarylog/grpc_binarylog_v1"
 | 
				
			||||||
	"google.golang.org/grpc/grpclog"
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
	defaultSink Sink = &noopSink{} // TODO(blog): change this default (file in /tmp).
 | 
						// DefaultSink is the sink where the logs will be written to. It's exported
 | 
				
			||||||
 | 
						// for the binarylog package to update.
 | 
				
			||||||
 | 
						DefaultSink Sink = &noopSink{} // TODO(blog): change this default (file in /tmp).
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// SetDefaultSink sets the sink where binary logs will be written to.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Not thread safe. Only set during initialization.
 | 
					 | 
				
			||||||
func SetDefaultSink(s Sink) {
 | 
					 | 
				
			||||||
	if defaultSink != nil {
 | 
					 | 
				
			||||||
		defaultSink.Close()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	defaultSink = s
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Sink writes log entry into the binary log sink.
 | 
					// Sink writes log entry into the binary log sink.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// sink is a copy of the exported binarylog.Sink, to avoid circular dependency.
 | 
				
			||||||
type Sink interface {
 | 
					type Sink interface {
 | 
				
			||||||
	// Write will be called to write the log entry into the sink.
 | 
						// Write will be called to write the log entry into the sink.
 | 
				
			||||||
	//
 | 
						//
 | 
				
			||||||
| 
						 | 
					@ -67,7 +58,7 @@ func (ns *noopSink) Close() error                 { return nil }
 | 
				
			||||||
// message is prefixed with a 4 byte big endian unsigned integer as the length.
 | 
					// message is prefixed with a 4 byte big endian unsigned integer as the length.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// No buffer is done, Close() doesn't try to close the writer.
 | 
					// No buffer is done, Close() doesn't try to close the writer.
 | 
				
			||||||
func newWriterSink(w io.Writer) *writerSink {
 | 
					func newWriterSink(w io.Writer) Sink {
 | 
				
			||||||
	return &writerSink{out: w}
 | 
						return &writerSink{out: w}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -78,7 +69,7 @@ type writerSink struct {
 | 
				
			||||||
func (ws *writerSink) Write(e *pb.GrpcLogEntry) error {
 | 
					func (ws *writerSink) Write(e *pb.GrpcLogEntry) error {
 | 
				
			||||||
	b, err := proto.Marshal(e)
 | 
						b, err := proto.Marshal(e)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		grpclog.Infof("binary logging: failed to marshal proto message: %v", err)
 | 
							grpclogLogger.Infof("binary logging: failed to marshal proto message: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	hdr := make([]byte, 4)
 | 
						hdr := make([]byte, 4)
 | 
				
			||||||
	binary.BigEndian.PutUint32(hdr, uint32(len(b)))
 | 
						binary.BigEndian.PutUint32(hdr, uint32(len(b)))
 | 
				
			||||||
| 
						 | 
					@ -93,17 +84,17 @@ func (ws *writerSink) Write(e *pb.GrpcLogEntry) error {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ws *writerSink) Close() error { return nil }
 | 
					func (ws *writerSink) Close() error { return nil }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type bufWriteCloserSink struct {
 | 
					type bufferedSink struct {
 | 
				
			||||||
	mu     sync.Mutex
 | 
						mu     sync.Mutex
 | 
				
			||||||
	closer io.Closer
 | 
						closer io.Closer
 | 
				
			||||||
	out    *writerSink   // out is built on buf.
 | 
						out    Sink          // out is built on buf.
 | 
				
			||||||
	buf    *bufio.Writer // buf is kept for flush.
 | 
						buf    *bufio.Writer // buf is kept for flush.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	writeStartOnce sync.Once
 | 
						writeStartOnce sync.Once
 | 
				
			||||||
	writeTicker    *time.Ticker
 | 
						writeTicker    *time.Ticker
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (fs *bufWriteCloserSink) Write(e *pb.GrpcLogEntry) error {
 | 
					func (fs *bufferedSink) Write(e *pb.GrpcLogEntry) error {
 | 
				
			||||||
	// Start the write loop when Write is called.
 | 
						// Start the write loop when Write is called.
 | 
				
			||||||
	fs.writeStartOnce.Do(fs.startFlushGoroutine)
 | 
						fs.writeStartOnce.Do(fs.startFlushGoroutine)
 | 
				
			||||||
	fs.mu.Lock()
 | 
						fs.mu.Lock()
 | 
				
			||||||
| 
						 | 
					@ -119,44 +110,50 @@ const (
 | 
				
			||||||
	bufFlushDuration = 60 * time.Second
 | 
						bufFlushDuration = 60 * time.Second
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (fs *bufWriteCloserSink) startFlushGoroutine() {
 | 
					func (fs *bufferedSink) startFlushGoroutine() {
 | 
				
			||||||
	fs.writeTicker = time.NewTicker(bufFlushDuration)
 | 
						fs.writeTicker = time.NewTicker(bufFlushDuration)
 | 
				
			||||||
	go func() {
 | 
						go func() {
 | 
				
			||||||
		for range fs.writeTicker.C {
 | 
							for range fs.writeTicker.C {
 | 
				
			||||||
			fs.mu.Lock()
 | 
								fs.mu.Lock()
 | 
				
			||||||
			fs.buf.Flush()
 | 
								if err := fs.buf.Flush(); err != nil {
 | 
				
			||||||
 | 
									grpclogLogger.Warningf("failed to flush to Sink: %v", err)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			fs.mu.Unlock()
 | 
								fs.mu.Unlock()
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}()
 | 
						}()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (fs *bufWriteCloserSink) Close() error {
 | 
					func (fs *bufferedSink) Close() error {
 | 
				
			||||||
	if fs.writeTicker != nil {
 | 
						if fs.writeTicker != nil {
 | 
				
			||||||
		fs.writeTicker.Stop()
 | 
							fs.writeTicker.Stop()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	fs.mu.Lock()
 | 
						fs.mu.Lock()
 | 
				
			||||||
	fs.buf.Flush()
 | 
						if err := fs.buf.Flush(); err != nil {
 | 
				
			||||||
	fs.closer.Close()
 | 
							grpclogLogger.Warningf("failed to flush to Sink: %v", err)
 | 
				
			||||||
	fs.out.Close()
 | 
						}
 | 
				
			||||||
 | 
						if err := fs.closer.Close(); err != nil {
 | 
				
			||||||
 | 
							grpclogLogger.Warningf("failed to close the underlying WriterCloser: %v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if err := fs.out.Close(); err != nil {
 | 
				
			||||||
 | 
							grpclogLogger.Warningf("failed to close the Sink: %v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	fs.mu.Unlock()
 | 
						fs.mu.Unlock()
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func newBufWriteCloserSink(o io.WriteCloser) Sink {
 | 
					// NewBufferedSink creates a binary log sink with the given WriteCloser.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Write() marshals the proto message and writes it to the given writer. Each
 | 
				
			||||||
 | 
					// message is prefixed with a 4 byte big endian unsigned integer as the length.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Content is kept in a buffer, and is flushed every 60 seconds.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Close closes the WriteCloser.
 | 
				
			||||||
 | 
					func NewBufferedSink(o io.WriteCloser) Sink {
 | 
				
			||||||
	bufW := bufio.NewWriter(o)
 | 
						bufW := bufio.NewWriter(o)
 | 
				
			||||||
	return &bufWriteCloserSink{
 | 
						return &bufferedSink{
 | 
				
			||||||
		closer: o,
 | 
							closer: o,
 | 
				
			||||||
		out:    newWriterSink(bufW),
 | 
							out:    newWriterSink(bufW),
 | 
				
			||||||
		buf:    bufW,
 | 
							buf:    bufW,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
// NewTempFileSink creates a temp file and returns a Sink that writes to this
 | 
					 | 
				
			||||||
// file.
 | 
					 | 
				
			||||||
func NewTempFileSink() (Sink, error) {
 | 
					 | 
				
			||||||
	tempFile, err := ioutil.TempFile("/tmp", "grpcgo_binarylog_*.txt")
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return nil, fmt.Errorf("failed to create temp file: %v", err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return newBufWriteCloserSink(tempFile), nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,41 +0,0 @@
 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * 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 binarylog
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"errors"
 | 
					 | 
				
			||||||
	"strings"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// parseMethodName splits service and method from the input. It expects format
 | 
					 | 
				
			||||||
// "/service/method".
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// TODO: move to internal/grpcutil.
 | 
					 | 
				
			||||||
func parseMethodName(methodName string) (service, method string, _ error) {
 | 
					 | 
				
			||||||
	if !strings.HasPrefix(methodName, "/") {
 | 
					 | 
				
			||||||
		return "", "", errors.New("invalid method name: should start with /")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	methodName = methodName[1:]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	pos := strings.LastIndex(methodName, "/")
 | 
					 | 
				
			||||||
	if pos < 0 {
 | 
					 | 
				
			||||||
		return "", "", errors.New("invalid method name: suffix /method is missing")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return methodName[:pos], methodName[pos+1:], nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -30,7 +30,7 @@ import (
 | 
				
			||||||
	"sync/atomic"
 | 
						"sync/atomic"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"google.golang.org/grpc/internal/grpclog"
 | 
						"google.golang.org/grpc/grpclog"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
| 
						 | 
					@ -216,7 +216,7 @@ func RegisterChannel(c Channel, pid int64, ref string) int64 {
 | 
				
			||||||
// by pid). It returns the unique channelz tracking id assigned to this subchannel.
 | 
					// by pid). It returns the unique channelz tracking id assigned to this subchannel.
 | 
				
			||||||
func RegisterSubChannel(c Channel, pid int64, ref string) int64 {
 | 
					func RegisterSubChannel(c Channel, pid int64, ref string) int64 {
 | 
				
			||||||
	if pid == 0 {
 | 
						if pid == 0 {
 | 
				
			||||||
		grpclog.ErrorDepth(0, "a SubChannel's parent id cannot be 0")
 | 
							logger.Error("a SubChannel's parent id cannot be 0")
 | 
				
			||||||
		return 0
 | 
							return 0
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	id := idGen.genID()
 | 
						id := idGen.genID()
 | 
				
			||||||
| 
						 | 
					@ -253,7 +253,7 @@ func RegisterServer(s Server, ref string) int64 {
 | 
				
			||||||
// this listen socket.
 | 
					// this listen socket.
 | 
				
			||||||
func RegisterListenSocket(s Socket, pid int64, ref string) int64 {
 | 
					func RegisterListenSocket(s Socket, pid int64, ref string) int64 {
 | 
				
			||||||
	if pid == 0 {
 | 
						if pid == 0 {
 | 
				
			||||||
		grpclog.ErrorDepth(0, "a ListenSocket's parent id cannot be 0")
 | 
							logger.Error("a ListenSocket's parent id cannot be 0")
 | 
				
			||||||
		return 0
 | 
							return 0
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	id := idGen.genID()
 | 
						id := idGen.genID()
 | 
				
			||||||
| 
						 | 
					@ -268,7 +268,7 @@ func RegisterListenSocket(s Socket, pid int64, ref string) int64 {
 | 
				
			||||||
// this normal socket.
 | 
					// this normal socket.
 | 
				
			||||||
func RegisterNormalSocket(s Socket, pid int64, ref string) int64 {
 | 
					func RegisterNormalSocket(s Socket, pid int64, ref string) int64 {
 | 
				
			||||||
	if pid == 0 {
 | 
						if pid == 0 {
 | 
				
			||||||
		grpclog.ErrorDepth(0, "a NormalSocket's parent id cannot be 0")
 | 
							logger.Error("a NormalSocket's parent id cannot be 0")
 | 
				
			||||||
		return 0
 | 
							return 0
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	id := idGen.genID()
 | 
						id := idGen.genID()
 | 
				
			||||||
| 
						 | 
					@ -294,17 +294,15 @@ type TraceEventDesc struct {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// AddTraceEvent adds trace related to the entity with specified id, using the provided TraceEventDesc.
 | 
					// AddTraceEvent adds trace related to the entity with specified id, using the provided TraceEventDesc.
 | 
				
			||||||
func AddTraceEvent(id int64, depth int, desc *TraceEventDesc) {
 | 
					func AddTraceEvent(l grpclog.DepthLoggerV2, id int64, depth int, desc *TraceEventDesc) {
 | 
				
			||||||
	for d := desc; d != nil; d = d.Parent {
 | 
						for d := desc; d != nil; d = d.Parent {
 | 
				
			||||||
		switch d.Severity {
 | 
							switch d.Severity {
 | 
				
			||||||
		case CtUNKNOWN:
 | 
							case CtUnknown, CtInfo:
 | 
				
			||||||
			grpclog.InfoDepth(depth+1, d.Desc)
 | 
								l.InfoDepth(depth+1, d.Desc)
 | 
				
			||||||
		case CtINFO:
 | 
					 | 
				
			||||||
			grpclog.InfoDepth(depth+1, d.Desc)
 | 
					 | 
				
			||||||
		case CtWarning:
 | 
							case CtWarning:
 | 
				
			||||||
			grpclog.WarningDepth(depth+1, d.Desc)
 | 
								l.WarningDepth(depth+1, d.Desc)
 | 
				
			||||||
		case CtError:
 | 
							case CtError:
 | 
				
			||||||
			grpclog.ErrorDepth(depth+1, d.Desc)
 | 
								l.ErrorDepth(depth+1, d.Desc)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if getMaxTraceEntry() == 0 {
 | 
						if getMaxTraceEntry() == 0 {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -21,80 +21,82 @@ package channelz
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"google.golang.org/grpc/internal/grpclog"
 | 
						"google.golang.org/grpc/grpclog"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Info logs through grpclog.Info and adds a trace event if channelz is on.
 | 
					var logger = grpclog.Component("channelz")
 | 
				
			||||||
func Info(id int64, args ...interface{}) {
 | 
					
 | 
				
			||||||
 | 
					// Info logs and adds a trace event if channelz is on.
 | 
				
			||||||
 | 
					func Info(l grpclog.DepthLoggerV2, id int64, args ...interface{}) {
 | 
				
			||||||
	if IsOn() {
 | 
						if IsOn() {
 | 
				
			||||||
		AddTraceEvent(id, 1, &TraceEventDesc{
 | 
							AddTraceEvent(l, id, 1, &TraceEventDesc{
 | 
				
			||||||
			Desc:     fmt.Sprint(args...),
 | 
								Desc:     fmt.Sprint(args...),
 | 
				
			||||||
			Severity: CtINFO,
 | 
								Severity: CtInfo,
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		grpclog.InfoDepth(1, args...)
 | 
							l.InfoDepth(1, args...)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Infof logs through grpclog.Infof and adds a trace event if channelz is on.
 | 
					// Infof logs and adds a trace event if channelz is on.
 | 
				
			||||||
func Infof(id int64, format string, args ...interface{}) {
 | 
					func Infof(l grpclog.DepthLoggerV2, id int64, format string, args ...interface{}) {
 | 
				
			||||||
	msg := fmt.Sprintf(format, args...)
 | 
						msg := fmt.Sprintf(format, args...)
 | 
				
			||||||
	if IsOn() {
 | 
						if IsOn() {
 | 
				
			||||||
		AddTraceEvent(id, 1, &TraceEventDesc{
 | 
							AddTraceEvent(l, id, 1, &TraceEventDesc{
 | 
				
			||||||
			Desc:     msg,
 | 
								Desc:     msg,
 | 
				
			||||||
			Severity: CtINFO,
 | 
								Severity: CtInfo,
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		grpclog.InfoDepth(1, msg)
 | 
							l.InfoDepth(1, msg)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Warning logs through grpclog.Warning and adds a trace event if channelz is on.
 | 
					// Warning logs and adds a trace event if channelz is on.
 | 
				
			||||||
func Warning(id int64, args ...interface{}) {
 | 
					func Warning(l grpclog.DepthLoggerV2, id int64, args ...interface{}) {
 | 
				
			||||||
	if IsOn() {
 | 
						if IsOn() {
 | 
				
			||||||
		AddTraceEvent(id, 1, &TraceEventDesc{
 | 
							AddTraceEvent(l, id, 1, &TraceEventDesc{
 | 
				
			||||||
			Desc:     fmt.Sprint(args...),
 | 
								Desc:     fmt.Sprint(args...),
 | 
				
			||||||
			Severity: CtWarning,
 | 
								Severity: CtWarning,
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		grpclog.WarningDepth(1, args...)
 | 
							l.WarningDepth(1, args...)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Warningf logs through grpclog.Warningf and adds a trace event if channelz is on.
 | 
					// Warningf logs and adds a trace event if channelz is on.
 | 
				
			||||||
func Warningf(id int64, format string, args ...interface{}) {
 | 
					func Warningf(l grpclog.DepthLoggerV2, id int64, format string, args ...interface{}) {
 | 
				
			||||||
	msg := fmt.Sprintf(format, args...)
 | 
						msg := fmt.Sprintf(format, args...)
 | 
				
			||||||
	if IsOn() {
 | 
						if IsOn() {
 | 
				
			||||||
		AddTraceEvent(id, 1, &TraceEventDesc{
 | 
							AddTraceEvent(l, id, 1, &TraceEventDesc{
 | 
				
			||||||
			Desc:     msg,
 | 
								Desc:     msg,
 | 
				
			||||||
			Severity: CtWarning,
 | 
								Severity: CtWarning,
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		grpclog.WarningDepth(1, msg)
 | 
							l.WarningDepth(1, msg)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Error logs through grpclog.Error and adds a trace event if channelz is on.
 | 
					// Error logs and adds a trace event if channelz is on.
 | 
				
			||||||
func Error(id int64, args ...interface{}) {
 | 
					func Error(l grpclog.DepthLoggerV2, id int64, args ...interface{}) {
 | 
				
			||||||
	if IsOn() {
 | 
						if IsOn() {
 | 
				
			||||||
		AddTraceEvent(id, 1, &TraceEventDesc{
 | 
							AddTraceEvent(l, id, 1, &TraceEventDesc{
 | 
				
			||||||
			Desc:     fmt.Sprint(args...),
 | 
								Desc:     fmt.Sprint(args...),
 | 
				
			||||||
			Severity: CtError,
 | 
								Severity: CtError,
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		grpclog.ErrorDepth(1, args...)
 | 
							l.ErrorDepth(1, args...)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Errorf logs through grpclog.Errorf and adds a trace event if channelz is on.
 | 
					// Errorf logs and adds a trace event if channelz is on.
 | 
				
			||||||
func Errorf(id int64, format string, args ...interface{}) {
 | 
					func Errorf(l grpclog.DepthLoggerV2, id int64, format string, args ...interface{}) {
 | 
				
			||||||
	msg := fmt.Sprintf(format, args...)
 | 
						msg := fmt.Sprintf(format, args...)
 | 
				
			||||||
	if IsOn() {
 | 
						if IsOn() {
 | 
				
			||||||
		AddTraceEvent(id, 1, &TraceEventDesc{
 | 
							AddTraceEvent(l, id, 1, &TraceEventDesc{
 | 
				
			||||||
			Desc:     msg,
 | 
								Desc:     msg,
 | 
				
			||||||
			Severity: CtError,
 | 
								Severity: CtError,
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		grpclog.ErrorDepth(1, msg)
 | 
							l.ErrorDepth(1, msg)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,7 +26,6 @@ import (
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"google.golang.org/grpc/connectivity"
 | 
						"google.golang.org/grpc/connectivity"
 | 
				
			||||||
	"google.golang.org/grpc/credentials"
 | 
						"google.golang.org/grpc/credentials"
 | 
				
			||||||
	"google.golang.org/grpc/grpclog"
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// entry represents a node in the channelz database.
 | 
					// entry represents a node in the channelz database.
 | 
				
			||||||
| 
						 | 
					@ -60,17 +59,17 @@ func (d *dummyEntry) addChild(id int64, e entry) {
 | 
				
			||||||
	// the addrConn will create a new transport. And when registering the new transport in
 | 
						// the addrConn will create a new transport. And when registering the new transport in
 | 
				
			||||||
	// channelz, its parent addrConn could have already been torn down and deleted
 | 
						// channelz, its parent addrConn could have already been torn down and deleted
 | 
				
			||||||
	// from channelz tracking, and thus reach the code here.
 | 
						// from channelz tracking, and thus reach the code here.
 | 
				
			||||||
	grpclog.Infof("attempt to add child of type %T with id %d to a parent (id=%d) that doesn't currently exist", e, id, d.idNotFound)
 | 
						logger.Infof("attempt to add child of type %T with id %d to a parent (id=%d) that doesn't currently exist", e, id, d.idNotFound)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (d *dummyEntry) deleteChild(id int64) {
 | 
					func (d *dummyEntry) deleteChild(id int64) {
 | 
				
			||||||
	// It is possible for a normal program to reach here under race condition.
 | 
						// It is possible for a normal program to reach here under race condition.
 | 
				
			||||||
	// Refer to the example described in addChild().
 | 
						// Refer to the example described in addChild().
 | 
				
			||||||
	grpclog.Infof("attempt to delete child with id %d from a parent (id=%d) that doesn't currently exist", id, d.idNotFound)
 | 
						logger.Infof("attempt to delete child with id %d from a parent (id=%d) that doesn't currently exist", id, d.idNotFound)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (d *dummyEntry) triggerDelete() {
 | 
					func (d *dummyEntry) triggerDelete() {
 | 
				
			||||||
	grpclog.Warningf("attempt to delete an entry (id=%d) that doesn't currently exist", d.idNotFound)
 | 
						logger.Warningf("attempt to delete an entry (id=%d) that doesn't currently exist", d.idNotFound)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (*dummyEntry) deleteSelfIfReady() {
 | 
					func (*dummyEntry) deleteSelfIfReady() {
 | 
				
			||||||
| 
						 | 
					@ -215,7 +214,7 @@ func (c *channel) addChild(id int64, e entry) {
 | 
				
			||||||
	case *channel:
 | 
						case *channel:
 | 
				
			||||||
		c.nestedChans[id] = v.refName
 | 
							c.nestedChans[id] = v.refName
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		grpclog.Errorf("cannot add a child (id = %d) of type %T to a channel", id, e)
 | 
							logger.Errorf("cannot add a child (id = %d) of type %T to a channel", id, e)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -326,7 +325,7 @@ func (sc *subChannel) addChild(id int64, e entry) {
 | 
				
			||||||
	if v, ok := e.(*normalSocket); ok {
 | 
						if v, ok := e.(*normalSocket); ok {
 | 
				
			||||||
		sc.sockets[id] = v.refName
 | 
							sc.sockets[id] = v.refName
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		grpclog.Errorf("cannot add a child (id = %d) of type %T to a subChannel", id, e)
 | 
							logger.Errorf("cannot add a child (id = %d) of type %T to a subChannel", id, e)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -493,11 +492,11 @@ type listenSocket struct {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ls *listenSocket) addChild(id int64, e entry) {
 | 
					func (ls *listenSocket) addChild(id int64, e entry) {
 | 
				
			||||||
	grpclog.Errorf("cannot add a child (id = %d) of type %T to a listen socket", id, e)
 | 
						logger.Errorf("cannot add a child (id = %d) of type %T to a listen socket", id, e)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ls *listenSocket) deleteChild(id int64) {
 | 
					func (ls *listenSocket) deleteChild(id int64) {
 | 
				
			||||||
	grpclog.Errorf("cannot delete a child (id = %d) from a listen socket", id)
 | 
						logger.Errorf("cannot delete a child (id = %d) from a listen socket", id)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ls *listenSocket) triggerDelete() {
 | 
					func (ls *listenSocket) triggerDelete() {
 | 
				
			||||||
| 
						 | 
					@ -506,7 +505,7 @@ func (ls *listenSocket) triggerDelete() {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ls *listenSocket) deleteSelfIfReady() {
 | 
					func (ls *listenSocket) deleteSelfIfReady() {
 | 
				
			||||||
	grpclog.Errorf("cannot call deleteSelfIfReady on a listen socket")
 | 
						logger.Errorf("cannot call deleteSelfIfReady on a listen socket")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ls *listenSocket) getParentID() int64 {
 | 
					func (ls *listenSocket) getParentID() int64 {
 | 
				
			||||||
| 
						 | 
					@ -522,11 +521,11 @@ type normalSocket struct {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ns *normalSocket) addChild(id int64, e entry) {
 | 
					func (ns *normalSocket) addChild(id int64, e entry) {
 | 
				
			||||||
	grpclog.Errorf("cannot add a child (id = %d) of type %T to a normal socket", id, e)
 | 
						logger.Errorf("cannot add a child (id = %d) of type %T to a normal socket", id, e)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ns *normalSocket) deleteChild(id int64) {
 | 
					func (ns *normalSocket) deleteChild(id int64) {
 | 
				
			||||||
	grpclog.Errorf("cannot delete a child (id = %d) from a normal socket", id)
 | 
						logger.Errorf("cannot delete a child (id = %d) from a normal socket", id)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ns *normalSocket) triggerDelete() {
 | 
					func (ns *normalSocket) triggerDelete() {
 | 
				
			||||||
| 
						 | 
					@ -535,7 +534,7 @@ func (ns *normalSocket) triggerDelete() {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ns *normalSocket) deleteSelfIfReady() {
 | 
					func (ns *normalSocket) deleteSelfIfReady() {
 | 
				
			||||||
	grpclog.Errorf("cannot call deleteSelfIfReady on a normal socket")
 | 
						logger.Errorf("cannot call deleteSelfIfReady on a normal socket")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ns *normalSocket) getParentID() int64 {
 | 
					func (ns *normalSocket) getParentID() int64 {
 | 
				
			||||||
| 
						 | 
					@ -594,7 +593,7 @@ func (s *server) addChild(id int64, e entry) {
 | 
				
			||||||
	case *listenSocket:
 | 
						case *listenSocket:
 | 
				
			||||||
		s.listenSockets[id] = v.refName
 | 
							s.listenSockets[id] = v.refName
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		grpclog.Errorf("cannot add a child (id = %d) of type %T to a server", id, e)
 | 
							logger.Errorf("cannot add a child (id = %d) of type %T to a server", id, e)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -673,10 +672,10 @@ func (c *channelTrace) clear() {
 | 
				
			||||||
type Severity int
 | 
					type Severity int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
	// CtUNKNOWN indicates unknown severity of a trace event.
 | 
						// CtUnknown indicates unknown severity of a trace event.
 | 
				
			||||||
	CtUNKNOWN Severity = iota
 | 
						CtUnknown Severity = iota
 | 
				
			||||||
	// CtINFO indicates info level severity of a trace event.
 | 
						// CtInfo indicates info level severity of a trace event.
 | 
				
			||||||
	CtINFO
 | 
						CtInfo
 | 
				
			||||||
	// CtWarning indicates warning level severity of a trace event.
 | 
						// CtWarning indicates warning level severity of a trace event.
 | 
				
			||||||
	CtWarning
 | 
						CtWarning
 | 
				
			||||||
	// CtError indicates error level severity of a trace event.
 | 
						// CtError indicates error level severity of a trace event.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -22,8 +22,6 @@ package channelz
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
 | 
					 | 
				
			||||||
	"google.golang.org/grpc/grpclog"
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var once sync.Once
 | 
					var once sync.Once
 | 
				
			||||||
| 
						 | 
					@ -39,6 +37,6 @@ type SocketOptionData struct {
 | 
				
			||||||
// Windows OS doesn't support Socket Option
 | 
					// Windows OS doesn't support Socket Option
 | 
				
			||||||
func (s *SocketOptionData) Getsockopt(fd uintptr) {
 | 
					func (s *SocketOptionData) Getsockopt(fd uintptr) {
 | 
				
			||||||
	once.Do(func() {
 | 
						once.Do(func() {
 | 
				
			||||||
		grpclog.Warningln("Channelz: socket options are not supported on non-linux os and appengine.")
 | 
							logger.Warning("Channelz: socket options are not supported on non-linux os and appengine.")
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,77 @@
 | 
				
			||||||
 | 
					// +build !appengine
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Copyright 2020 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 credentials defines APIs for parsing SPIFFE ID.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// All APIs in this package are experimental.
 | 
				
			||||||
 | 
					package credentials
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"crypto/tls"
 | 
				
			||||||
 | 
						"crypto/x509"
 | 
				
			||||||
 | 
						"net/url"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"google.golang.org/grpc/grpclog"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var logger = grpclog.Component("credentials")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// SPIFFEIDFromState parses the SPIFFE ID from State. If the SPIFFE ID format
 | 
				
			||||||
 | 
					// is invalid, return nil with warning.
 | 
				
			||||||
 | 
					func SPIFFEIDFromState(state tls.ConnectionState) *url.URL {
 | 
				
			||||||
 | 
						if len(state.PeerCertificates) == 0 || len(state.PeerCertificates[0].URIs) == 0 {
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return SPIFFEIDFromCert(state.PeerCertificates[0])
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// SPIFFEIDFromCert parses the SPIFFE ID from x509.Certificate. If the SPIFFE
 | 
				
			||||||
 | 
					// ID format is invalid, return nil with warning.
 | 
				
			||||||
 | 
					func SPIFFEIDFromCert(cert *x509.Certificate) *url.URL {
 | 
				
			||||||
 | 
						if cert == nil || cert.URIs == nil {
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var spiffeID *url.URL
 | 
				
			||||||
 | 
						for _, uri := range cert.URIs {
 | 
				
			||||||
 | 
							if uri == nil || uri.Scheme != "spiffe" || uri.Opaque != "" || (uri.User != nil && uri.User.Username() != "") {
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							// From this point, we assume the uri is intended for a SPIFFE ID.
 | 
				
			||||||
 | 
							if len(uri.String()) > 2048 {
 | 
				
			||||||
 | 
								logger.Warning("invalid SPIFFE ID: total ID length larger than 2048 bytes")
 | 
				
			||||||
 | 
								return nil
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if len(uri.Host) == 0 || len(uri.Path) == 0 {
 | 
				
			||||||
 | 
								logger.Warning("invalid SPIFFE ID: domain or workload ID is empty")
 | 
				
			||||||
 | 
								return nil
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if len(uri.Host) > 255 {
 | 
				
			||||||
 | 
								logger.Warning("invalid SPIFFE ID: domain length larger than 255 characters")
 | 
				
			||||||
 | 
								return nil
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							// A valid SPIFFE certificate can only have exactly one URI SAN field.
 | 
				
			||||||
 | 
							if len(cert.URIs) > 1 {
 | 
				
			||||||
 | 
								logger.Warning("invalid SPIFFE ID: multiple URI SANs")
 | 
				
			||||||
 | 
								return nil
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							spiffeID = uri
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return spiffeID
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										31
									
								
								vendor/google.golang.org/grpc/internal/credentials/spiffe_appengine.go
								
								
									generated
								
								
									vendored
								
								
									Normal file
								
							
							
						
						
									
										31
									
								
								vendor/google.golang.org/grpc/internal/credentials/spiffe_appengine.go
								
								
									generated
								
								
									vendored
								
								
									Normal file
								
							| 
						 | 
					@ -0,0 +1,31 @@
 | 
				
			||||||
 | 
					// +build appengine
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Copyright 2020 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 credentials
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"crypto/tls"
 | 
				
			||||||
 | 
						"net/url"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// SPIFFEIDFromState is a no-op for appengine builds.
 | 
				
			||||||
 | 
					func SPIFFEIDFromState(state tls.ConnectionState) *url.URL {
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -18,8 +18,7 @@
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Package internal contains credentials-internal code.
 | 
					package credentials
 | 
				
			||||||
package internal
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"net"
 | 
						"net"
 | 
				
			||||||
| 
						 | 
					@ -18,7 +18,7 @@
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package internal
 | 
					package credentials
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"net"
 | 
						"net"
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,50 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Copyright 2020 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 credentials
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import "crypto/tls"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const alpnProtoStrH2 = "h2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// AppendH2ToNextProtos appends h2 to next protos.
 | 
				
			||||||
 | 
					func AppendH2ToNextProtos(ps []string) []string {
 | 
				
			||||||
 | 
						for _, p := range ps {
 | 
				
			||||||
 | 
							if p == alpnProtoStrH2 {
 | 
				
			||||||
 | 
								return ps
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						ret := make([]string, 0, len(ps)+1)
 | 
				
			||||||
 | 
						ret = append(ret, ps...)
 | 
				
			||||||
 | 
						return append(ret, alpnProtoStrH2)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CloneTLSConfig returns a shallow clone of the exported
 | 
				
			||||||
 | 
					// fields of cfg, ignoring the unexported sync.Once, which
 | 
				
			||||||
 | 
					// contains a mutex and must not be copied.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// If cfg is nil, a new zero tls.Config is returned.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// TODO: inline this function if possible.
 | 
				
			||||||
 | 
					func CloneTLSConfig(cfg *tls.Config) *tls.Config {
 | 
				
			||||||
 | 
						if cfg == nil {
 | 
				
			||||||
 | 
							return &tls.Config{}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return cfg.Clone()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -34,5 +34,5 @@ var (
 | 
				
			||||||
	// Retry is set if retry is explicitly enabled via "GRPC_GO_RETRY=on".
 | 
						// Retry is set if retry is explicitly enabled via "GRPC_GO_RETRY=on".
 | 
				
			||||||
	Retry = strings.EqualFold(os.Getenv(retryStr), "on")
 | 
						Retry = strings.EqualFold(os.Getenv(retryStr), "on")
 | 
				
			||||||
	// TXTErrIgnore is set if TXT errors should be ignored ("GRPC_GO_IGNORE_TXT_ERRORS" is not "false").
 | 
						// TXTErrIgnore is set if TXT errors should be ignored ("GRPC_GO_IGNORE_TXT_ERRORS" is not "false").
 | 
				
			||||||
	TXTErrIgnore = !strings.EqualFold(os.Getenv(retryStr), "false")
 | 
						TXTErrIgnore = !strings.EqualFold(os.Getenv(txtErrIgnoreStr), "false")
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,6 +19,10 @@
 | 
				
			||||||
// Package grpclog (internal) defines depth logging for grpc.
 | 
					// Package grpclog (internal) defines depth logging for grpc.
 | 
				
			||||||
package grpclog
 | 
					package grpclog
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Logger is the logger used for the non-depth log functions.
 | 
					// Logger is the logger used for the non-depth log functions.
 | 
				
			||||||
var Logger LoggerV2
 | 
					var Logger LoggerV2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -30,7 +34,7 @@ func InfoDepth(depth int, args ...interface{}) {
 | 
				
			||||||
	if DepthLogger != nil {
 | 
						if DepthLogger != nil {
 | 
				
			||||||
		DepthLogger.InfoDepth(depth, args...)
 | 
							DepthLogger.InfoDepth(depth, args...)
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		Logger.Info(args...)
 | 
							Logger.Infoln(args...)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -39,7 +43,7 @@ func WarningDepth(depth int, args ...interface{}) {
 | 
				
			||||||
	if DepthLogger != nil {
 | 
						if DepthLogger != nil {
 | 
				
			||||||
		DepthLogger.WarningDepth(depth, args...)
 | 
							DepthLogger.WarningDepth(depth, args...)
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		Logger.Warning(args...)
 | 
							Logger.Warningln(args...)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -48,7 +52,7 @@ func ErrorDepth(depth int, args ...interface{}) {
 | 
				
			||||||
	if DepthLogger != nil {
 | 
						if DepthLogger != nil {
 | 
				
			||||||
		DepthLogger.ErrorDepth(depth, args...)
 | 
							DepthLogger.ErrorDepth(depth, args...)
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		Logger.Error(args...)
 | 
							Logger.Errorln(args...)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -57,8 +61,9 @@ func FatalDepth(depth int, args ...interface{}) {
 | 
				
			||||||
	if DepthLogger != nil {
 | 
						if DepthLogger != nil {
 | 
				
			||||||
		DepthLogger.FatalDepth(depth, args...)
 | 
							DepthLogger.FatalDepth(depth, args...)
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		Logger.Fatal(args...)
 | 
							Logger.Fatalln(args...)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						os.Exit(1)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// LoggerV2 does underlying logging work for grpclog.
 | 
					// LoggerV2 does underlying logging work for grpclog.
 | 
				
			||||||
| 
						 | 
					@ -105,7 +110,10 @@ type LoggerV2 interface {
 | 
				
			||||||
// This is a copy of the DepthLoggerV2 defined in the external grpclog package.
 | 
					// This is a copy of the DepthLoggerV2 defined in the external grpclog package.
 | 
				
			||||||
// It is defined here to avoid a circular dependency.
 | 
					// It is defined here to avoid a circular dependency.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// This API is EXPERIMENTAL.
 | 
					// Experimental
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Notice: This type is EXPERIMENTAL and may be changed or removed in a
 | 
				
			||||||
 | 
					// later release.
 | 
				
			||||||
type DepthLoggerV2 interface {
 | 
					type DepthLoggerV2 interface {
 | 
				
			||||||
	// InfoDepth logs to INFO log at the specified depth. Arguments are handled in the manner of fmt.Print.
 | 
						// InfoDepth logs to INFO log at the specified depth. Arguments are handled in the manner of fmt.Print.
 | 
				
			||||||
	InfoDepth(depth int, args ...interface{})
 | 
						InfoDepth(depth int, args ...interface{})
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,10 +18,15 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package grpclog
 | 
					package grpclog
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// PrefixLogger does logging with a prefix.
 | 
					// PrefixLogger does logging with a prefix.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// Logging method on a nil logs without any prefix.
 | 
					// Logging method on a nil logs without any prefix.
 | 
				
			||||||
type PrefixLogger struct {
 | 
					type PrefixLogger struct {
 | 
				
			||||||
 | 
						logger DepthLoggerV2
 | 
				
			||||||
	prefix string
 | 
						prefix string
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -30,34 +35,47 @@ func (pl *PrefixLogger) Infof(format string, args ...interface{}) {
 | 
				
			||||||
	if pl != nil {
 | 
						if pl != nil {
 | 
				
			||||||
		// Handle nil, so the tests can pass in a nil logger.
 | 
							// Handle nil, so the tests can pass in a nil logger.
 | 
				
			||||||
		format = pl.prefix + format
 | 
							format = pl.prefix + format
 | 
				
			||||||
 | 
							pl.logger.InfoDepth(1, fmt.Sprintf(format, args...))
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	Logger.Infof(format, args...)
 | 
						InfoDepth(1, fmt.Sprintf(format, args...))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Warningf does warning logging.
 | 
					// Warningf does warning logging.
 | 
				
			||||||
func (pl *PrefixLogger) Warningf(format string, args ...interface{}) {
 | 
					func (pl *PrefixLogger) Warningf(format string, args ...interface{}) {
 | 
				
			||||||
	if pl != nil {
 | 
						if pl != nil {
 | 
				
			||||||
		format = pl.prefix + format
 | 
							format = pl.prefix + format
 | 
				
			||||||
 | 
							pl.logger.WarningDepth(1, fmt.Sprintf(format, args...))
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	Logger.Warningf(format, args...)
 | 
						WarningDepth(1, fmt.Sprintf(format, args...))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Errorf does error logging.
 | 
					// Errorf does error logging.
 | 
				
			||||||
func (pl *PrefixLogger) Errorf(format string, args ...interface{}) {
 | 
					func (pl *PrefixLogger) Errorf(format string, args ...interface{}) {
 | 
				
			||||||
	if pl != nil {
 | 
						if pl != nil {
 | 
				
			||||||
		format = pl.prefix + format
 | 
							format = pl.prefix + format
 | 
				
			||||||
 | 
							pl.logger.ErrorDepth(1, fmt.Sprintf(format, args...))
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	Logger.Errorf(format, args...)
 | 
						ErrorDepth(1, fmt.Sprintf(format, args...))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Debugf does info logging at verbose level 2.
 | 
					// Debugf does info logging at verbose level 2.
 | 
				
			||||||
func (pl *PrefixLogger) Debugf(format string, args ...interface{}) {
 | 
					func (pl *PrefixLogger) Debugf(format string, args ...interface{}) {
 | 
				
			||||||
	if Logger.V(2) {
 | 
						if !Logger.V(2) {
 | 
				
			||||||
		pl.Infof(format, args...)
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						if pl != nil {
 | 
				
			||||||
 | 
							// Handle nil, so the tests can pass in a nil logger.
 | 
				
			||||||
 | 
							format = pl.prefix + format
 | 
				
			||||||
 | 
							pl.logger.InfoDepth(1, fmt.Sprintf(format, args...))
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						InfoDepth(1, fmt.Sprintf(format, args...))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewPrefixLogger creates a prefix logger with the given prefix.
 | 
					// NewPrefixLogger creates a prefix logger with the given prefix.
 | 
				
			||||||
func NewPrefixLogger(prefix string) *PrefixLogger {
 | 
					func NewPrefixLogger(logger DepthLoggerV2, prefix string) *PrefixLogger {
 | 
				
			||||||
	return &PrefixLogger{prefix: prefix}
 | 
						return &PrefixLogger{logger: logger, prefix: prefix}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										63
									
								
								vendor/google.golang.org/grpc/internal/grpcutil/encode_duration.go
								
								
									generated
								
								
									vendored
								
								
									Normal file
								
							
							
						
						
									
										63
									
								
								vendor/google.golang.org/grpc/internal/grpcutil/encode_duration.go
								
								
									generated
								
								
									vendored
								
								
									Normal file
								
							| 
						 | 
					@ -0,0 +1,63 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Copyright 2020 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 grpcutil
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"strconv"
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const maxTimeoutValue int64 = 100000000 - 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// div does integer division and round-up the result. Note that this is
 | 
				
			||||||
 | 
					// equivalent to (d+r-1)/r but has less chance to overflow.
 | 
				
			||||||
 | 
					func div(d, r time.Duration) int64 {
 | 
				
			||||||
 | 
						if d%r > 0 {
 | 
				
			||||||
 | 
							return int64(d/r + 1)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return int64(d / r)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// EncodeDuration encodes the duration to the format grpc-timeout header
 | 
				
			||||||
 | 
					// accepts.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests
 | 
				
			||||||
 | 
					func EncodeDuration(t time.Duration) string {
 | 
				
			||||||
 | 
						// TODO: This is simplistic and not bandwidth efficient. Improve it.
 | 
				
			||||||
 | 
						if t <= 0 {
 | 
				
			||||||
 | 
							return "0n"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if d := div(t, time.Nanosecond); d <= maxTimeoutValue {
 | 
				
			||||||
 | 
							return strconv.FormatInt(d, 10) + "n"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if d := div(t, time.Microsecond); d <= maxTimeoutValue {
 | 
				
			||||||
 | 
							return strconv.FormatInt(d, 10) + "u"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if d := div(t, time.Millisecond); d <= maxTimeoutValue {
 | 
				
			||||||
 | 
							return strconv.FormatInt(d, 10) + "m"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if d := div(t, time.Second); d <= maxTimeoutValue {
 | 
				
			||||||
 | 
							return strconv.FormatInt(d, 10) + "S"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if d := div(t, time.Minute); d <= maxTimeoutValue {
 | 
				
			||||||
 | 
							return strconv.FormatInt(d, 10) + "M"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						// Note that maxTimeoutValue * time.Hour > MaxInt64.
 | 
				
			||||||
 | 
						return strconv.FormatInt(div(t, time.Hour), 10) + "H"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,40 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Copyright 2020 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 grpcutil
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"google.golang.org/grpc/metadata"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type mdExtraKey struct{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// WithExtraMetadata creates a new context with incoming md attached.
 | 
				
			||||||
 | 
					func WithExtraMetadata(ctx context.Context, md metadata.MD) context.Context {
 | 
				
			||||||
 | 
						return context.WithValue(ctx, mdExtraKey{}, md)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ExtraMetadata returns the incoming metadata in ctx if it exists.  The
 | 
				
			||||||
 | 
					// returned MD should not be modified. Writing to it may cause races.
 | 
				
			||||||
 | 
					// Modification should be made to copies of the returned MD.
 | 
				
			||||||
 | 
					func ExtraMetadata(ctx context.Context) (md metadata.MD, ok bool) {
 | 
				
			||||||
 | 
						md, ok = ctx.Value(mdExtraKey{}).(metadata.MD)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,84 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * 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 grpcutil
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"errors"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ParseMethod splits service and method from the input. It expects format
 | 
				
			||||||
 | 
					// "/service/method".
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					func ParseMethod(methodName string) (service, method string, _ error) {
 | 
				
			||||||
 | 
						if !strings.HasPrefix(methodName, "/") {
 | 
				
			||||||
 | 
							return "", "", errors.New("invalid method name: should start with /")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						methodName = methodName[1:]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pos := strings.LastIndex(methodName, "/")
 | 
				
			||||||
 | 
						if pos < 0 {
 | 
				
			||||||
 | 
							return "", "", errors.New("invalid method name: suffix /method is missing")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return methodName[:pos], methodName[pos+1:], nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const baseContentType = "application/grpc"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ContentSubtype returns the content-subtype for the given content-type.  The
 | 
				
			||||||
 | 
					// given content-type must be a valid content-type that starts with
 | 
				
			||||||
 | 
					// "application/grpc". A content-subtype will follow "application/grpc" after a
 | 
				
			||||||
 | 
					// "+" or ";". See
 | 
				
			||||||
 | 
					// https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests for
 | 
				
			||||||
 | 
					// more details.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// If contentType is not a valid content-type for gRPC, the boolean
 | 
				
			||||||
 | 
					// will be false, otherwise true. If content-type == "application/grpc",
 | 
				
			||||||
 | 
					// "application/grpc+", or "application/grpc;", the boolean will be true,
 | 
				
			||||||
 | 
					// but no content-subtype will be returned.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// contentType is assumed to be lowercase already.
 | 
				
			||||||
 | 
					func ContentSubtype(contentType string) (string, bool) {
 | 
				
			||||||
 | 
						if contentType == baseContentType {
 | 
				
			||||||
 | 
							return "", true
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if !strings.HasPrefix(contentType, baseContentType) {
 | 
				
			||||||
 | 
							return "", false
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						// guaranteed since != baseContentType and has baseContentType prefix
 | 
				
			||||||
 | 
						switch contentType[len(baseContentType)] {
 | 
				
			||||||
 | 
						case '+', ';':
 | 
				
			||||||
 | 
							// this will return true for "application/grpc+" or "application/grpc;"
 | 
				
			||||||
 | 
							// which the previous validContentType function tested to be valid, so we
 | 
				
			||||||
 | 
							// just say that no content-subtype is specified in this case
 | 
				
			||||||
 | 
							return contentType[len(baseContentType)+1:], true
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							return "", false
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ContentType builds full content type with the given sub-type.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// contentSubtype is assumed to be lowercase
 | 
				
			||||||
 | 
					func ContentType(contentSubtype string) string {
 | 
				
			||||||
 | 
						if contentSubtype == "" {
 | 
				
			||||||
 | 
							return baseContentType
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return baseContentType + "+" + contentSubtype
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -37,19 +37,53 @@ func split2(s, sep string) (string, string, bool) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ParseTarget splits target into a resolver.Target struct containing scheme,
 | 
					// ParseTarget splits target into a resolver.Target struct containing scheme,
 | 
				
			||||||
// authority and endpoint.
 | 
					// authority and endpoint. skipUnixColonParsing indicates that the parse should
 | 
				
			||||||
 | 
					// not parse "unix:[path]" cases. This should be true in cases where a custom
 | 
				
			||||||
 | 
					// dialer is present, to prevent a behavior change.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// If target is not a valid scheme://authority/endpoint, it returns {Endpoint:
 | 
					// If target is not a valid scheme://authority/endpoint as specified in
 | 
				
			||||||
// target}.
 | 
					// https://github.com/grpc/grpc/blob/master/doc/naming.md,
 | 
				
			||||||
func ParseTarget(target string) (ret resolver.Target) {
 | 
					// it returns {Endpoint: target}.
 | 
				
			||||||
 | 
					func ParseTarget(target string, skipUnixColonParsing bool) (ret resolver.Target) {
 | 
				
			||||||
	var ok bool
 | 
						var ok bool
 | 
				
			||||||
 | 
						if strings.HasPrefix(target, "unix-abstract:") {
 | 
				
			||||||
 | 
							if strings.HasPrefix(target, "unix-abstract://") {
 | 
				
			||||||
 | 
								// Maybe, with Authority specified, try to parse it
 | 
				
			||||||
 | 
								var remain string
 | 
				
			||||||
 | 
								ret.Scheme, remain, _ = split2(target, "://")
 | 
				
			||||||
 | 
								ret.Authority, ret.Endpoint, ok = split2(remain, "/")
 | 
				
			||||||
 | 
								if !ok {
 | 
				
			||||||
 | 
									// No Authority, add the "//" back
 | 
				
			||||||
 | 
									ret.Endpoint = "//" + remain
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									// Found Authority, add the "/" back
 | 
				
			||||||
 | 
									ret.Endpoint = "/" + ret.Endpoint
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								// Without Authority specified, split target on ":"
 | 
				
			||||||
 | 
								ret.Scheme, ret.Endpoint, _ = split2(target, ":")
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return ret
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	ret.Scheme, ret.Endpoint, ok = split2(target, "://")
 | 
						ret.Scheme, ret.Endpoint, ok = split2(target, "://")
 | 
				
			||||||
	if !ok {
 | 
						if !ok {
 | 
				
			||||||
 | 
							if strings.HasPrefix(target, "unix:") && !skipUnixColonParsing {
 | 
				
			||||||
 | 
								// Handle the "unix:[local/path]" and "unix:[/absolute/path]" cases,
 | 
				
			||||||
 | 
								// because splitting on :// only handles the
 | 
				
			||||||
 | 
								// "unix://[/absolute/path]" case. Only handle if the dialer is nil,
 | 
				
			||||||
 | 
								// to avoid a behavior change with custom dialers.
 | 
				
			||||||
 | 
								return resolver.Target{Scheme: "unix", Endpoint: target[len("unix:"):]}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		return resolver.Target{Endpoint: target}
 | 
							return resolver.Target{Endpoint: target}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	ret.Authority, ret.Endpoint, ok = split2(ret.Endpoint, "/")
 | 
						ret.Authority, ret.Endpoint, ok = split2(ret.Endpoint, "/")
 | 
				
			||||||
	if !ok {
 | 
						if !ok {
 | 
				
			||||||
		return resolver.Target{Endpoint: target}
 | 
							return resolver.Target{Endpoint: target}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						if ret.Scheme == "unix" {
 | 
				
			||||||
 | 
							// Add the "/" back in the unix case, so the unix resolver receives the
 | 
				
			||||||
 | 
							// actual endpoint in the "unix://[/absolute/path]" case.
 | 
				
			||||||
 | 
							ret.Endpoint = "/" + ret.Endpoint
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	return ret
 | 
						return ret
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,6 +25,7 @@ import (
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"google.golang.org/grpc/connectivity"
 | 
						"google.golang.org/grpc/connectivity"
 | 
				
			||||||
 | 
						"google.golang.org/grpc/serviceconfig"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
| 
						 | 
					@ -40,9 +41,30 @@ var (
 | 
				
			||||||
	// NewRequestInfoContext creates a new context based on the argument context attaching
 | 
						// NewRequestInfoContext creates a new context based on the argument context attaching
 | 
				
			||||||
	// the passed in RequestInfo to the new context.
 | 
						// the passed in RequestInfo to the new context.
 | 
				
			||||||
	NewRequestInfoContext interface{} // func(context.Context, credentials.RequestInfo) context.Context
 | 
						NewRequestInfoContext interface{} // func(context.Context, credentials.RequestInfo) context.Context
 | 
				
			||||||
 | 
						// NewClientHandshakeInfoContext returns a copy of the input context with
 | 
				
			||||||
 | 
						// the passed in ClientHandshakeInfo struct added to it.
 | 
				
			||||||
 | 
						NewClientHandshakeInfoContext interface{} // func(context.Context, credentials.ClientHandshakeInfo) context.Context
 | 
				
			||||||
	// ParseServiceConfigForTesting is for creating a fake
 | 
						// ParseServiceConfigForTesting is for creating a fake
 | 
				
			||||||
	// ClientConn for resolver testing only
 | 
						// ClientConn for resolver testing only
 | 
				
			||||||
	ParseServiceConfigForTesting interface{} // func(string) *serviceconfig.ParseResult
 | 
						ParseServiceConfigForTesting interface{} // func(string) *serviceconfig.ParseResult
 | 
				
			||||||
 | 
						// EqualServiceConfigForTesting is for testing service config generation and
 | 
				
			||||||
 | 
						// parsing. Both a and b should be returned by ParseServiceConfigForTesting.
 | 
				
			||||||
 | 
						// This function compares the config without rawJSON stripped, in case the
 | 
				
			||||||
 | 
						// there's difference in white space.
 | 
				
			||||||
 | 
						EqualServiceConfigForTesting func(a, b serviceconfig.Config) bool
 | 
				
			||||||
 | 
						// GetCertificateProviderBuilder returns the registered builder for the
 | 
				
			||||||
 | 
						// given name. This is set by package certprovider for use from xDS
 | 
				
			||||||
 | 
						// bootstrap code while parsing certificate provider configs in the
 | 
				
			||||||
 | 
						// bootstrap file.
 | 
				
			||||||
 | 
						GetCertificateProviderBuilder interface{} // func(string) certprovider.Builder
 | 
				
			||||||
 | 
						// GetXDSHandshakeInfoForTesting returns a pointer to the xds.HandshakeInfo
 | 
				
			||||||
 | 
						// stored in the passed in attributes. This is set by
 | 
				
			||||||
 | 
						// credentials/xds/xds.go.
 | 
				
			||||||
 | 
						GetXDSHandshakeInfoForTesting interface{} // func (*attributes.Attributes) *xds.HandshakeInfo
 | 
				
			||||||
 | 
						// GetServerCredentials returns the transport credentials configured on a
 | 
				
			||||||
 | 
						// gRPC server. An xDS-enabled server needs to know what type of credentials
 | 
				
			||||||
 | 
						// is configured on the underlying gRPC server. This is set by server.go.
 | 
				
			||||||
 | 
						GetServerCredentials interface{} // func (*grpc.Server) credentials.TransportCredentials
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 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.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,50 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Copyright 2020 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 metadata contains functions to set and get metadata from addresses.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// This package is experimental.
 | 
				
			||||||
 | 
					package metadata
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"google.golang.org/grpc/metadata"
 | 
				
			||||||
 | 
						"google.golang.org/grpc/resolver"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type mdKeyType string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const mdKey = mdKeyType("grpc.internal.address.metadata")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Get returns the metadata of addr.
 | 
				
			||||||
 | 
					func Get(addr resolver.Address) metadata.MD {
 | 
				
			||||||
 | 
						attrs := addr.Attributes
 | 
				
			||||||
 | 
						if attrs == nil {
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						md, _ := attrs.Value(mdKey).(metadata.MD)
 | 
				
			||||||
 | 
						return md
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Set sets (overrides) the metadata in addr.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// When a SubConn is created with this address, the RPCs sent on it will all
 | 
				
			||||||
 | 
					// have this metadata.
 | 
				
			||||||
 | 
					func Set(addr resolver.Address, md metadata.MD) resolver.Address {
 | 
				
			||||||
 | 
						addr.Attributes = addr.Attributes.WithValues(mdKey, md)
 | 
				
			||||||
 | 
						return addr
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										95
									
								
								vendor/google.golang.org/grpc/internal/resolver/config_selector.go
								
								
									generated
								
								
									vendored
								
								
									Normal file
								
							
							
						
						
									
										95
									
								
								vendor/google.golang.org/grpc/internal/resolver/config_selector.go
								
								
									generated
								
								
									vendored
								
								
									Normal file
								
							| 
						 | 
					@ -0,0 +1,95 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Copyright 2020 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 resolver provides internal resolver-related functionality.
 | 
				
			||||||
 | 
					package resolver
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
 | 
						"sync"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"google.golang.org/grpc/internal/serviceconfig"
 | 
				
			||||||
 | 
						"google.golang.org/grpc/resolver"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ConfigSelector controls what configuration to use for every RPC.
 | 
				
			||||||
 | 
					type ConfigSelector interface {
 | 
				
			||||||
 | 
						// Selects the configuration for the RPC, or terminates it using the error.
 | 
				
			||||||
 | 
						// This error will be converted by the gRPC library to a status error with
 | 
				
			||||||
 | 
						// code UNKNOWN if it is not returned as a status error.
 | 
				
			||||||
 | 
						SelectConfig(RPCInfo) (*RPCConfig, error)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// RPCInfo contains RPC information needed by a ConfigSelector.
 | 
				
			||||||
 | 
					type RPCInfo struct {
 | 
				
			||||||
 | 
						// Context is the user's context for the RPC and contains headers and
 | 
				
			||||||
 | 
						// application timeout.  It is passed for interception purposes and for
 | 
				
			||||||
 | 
						// efficiency reasons.  SelectConfig should not be blocking.
 | 
				
			||||||
 | 
						Context context.Context
 | 
				
			||||||
 | 
						Method  string // i.e. "/Service/Method"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// RPCConfig describes the configuration to use for each RPC.
 | 
				
			||||||
 | 
					type RPCConfig struct {
 | 
				
			||||||
 | 
						// The context to use for the remainder of the RPC; can pass info to LB
 | 
				
			||||||
 | 
						// policy or affect timeout or metadata.
 | 
				
			||||||
 | 
						Context      context.Context
 | 
				
			||||||
 | 
						MethodConfig serviceconfig.MethodConfig // configuration to use for this RPC
 | 
				
			||||||
 | 
						OnCommitted  func()                     // Called when the RPC has been committed (retries no longer possible)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type csKeyType string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const csKey = csKeyType("grpc.internal.resolver.configSelector")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// SetConfigSelector sets the config selector in state and returns the new
 | 
				
			||||||
 | 
					// state.
 | 
				
			||||||
 | 
					func SetConfigSelector(state resolver.State, cs ConfigSelector) resolver.State {
 | 
				
			||||||
 | 
						state.Attributes = state.Attributes.WithValues(csKey, cs)
 | 
				
			||||||
 | 
						return state
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GetConfigSelector retrieves the config selector from state, if present, and
 | 
				
			||||||
 | 
					// returns it or nil if absent.
 | 
				
			||||||
 | 
					func GetConfigSelector(state resolver.State) ConfigSelector {
 | 
				
			||||||
 | 
						cs, _ := state.Attributes.Value(csKey).(ConfigSelector)
 | 
				
			||||||
 | 
						return cs
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// SafeConfigSelector allows for safe switching of ConfigSelector
 | 
				
			||||||
 | 
					// implementations such that previous values are guaranteed to not be in use
 | 
				
			||||||
 | 
					// when UpdateConfigSelector returns.
 | 
				
			||||||
 | 
					type SafeConfigSelector struct {
 | 
				
			||||||
 | 
						mu sync.RWMutex
 | 
				
			||||||
 | 
						cs ConfigSelector
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// UpdateConfigSelector swaps to the provided ConfigSelector and blocks until
 | 
				
			||||||
 | 
					// all uses of the previous ConfigSelector have completed.
 | 
				
			||||||
 | 
					func (scs *SafeConfigSelector) UpdateConfigSelector(cs ConfigSelector) {
 | 
				
			||||||
 | 
						scs.mu.Lock()
 | 
				
			||||||
 | 
						defer scs.mu.Unlock()
 | 
				
			||||||
 | 
						scs.cs = cs
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// SelectConfig defers to the current ConfigSelector in scs.
 | 
				
			||||||
 | 
					func (scs *SafeConfigSelector) SelectConfig(r RPCInfo) (*RPCConfig, error) {
 | 
				
			||||||
 | 
						scs.mu.RLock()
 | 
				
			||||||
 | 
						defer scs.mu.RUnlock()
 | 
				
			||||||
 | 
						return scs.cs.SelectConfig(r)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue