diff --git a/changelog/v1.14.12/handle-missing-tcp-upstreams.yaml b/changelog/v1.14.12/handle-missing-tcp-upstreams.yaml new file mode 100644 index 00000000000..87e4911723c --- /dev/null +++ b/changelog/v1.14.12/handle-missing-tcp-upstreams.yaml @@ -0,0 +1,7 @@ +changelog: + - type: FIX + issueLink: https://github.com/solo-io/solo-projects/issues/5163 + resolvesIssue: true + description: >- + When modifying gateways that depend on TCP upstreams that do not exist, + report these validation issues not as errors, but as warnings instead diff --git a/docs/content/reference/api/github.com/solo-io/gloo/projects/gloo/api/grpc/validation/gloo_validation.proto.sk.md b/docs/content/reference/api/github.com/solo-io/gloo/projects/gloo/api/grpc/validation/gloo_validation.proto.sk.md index 04d3a737ae2..47b6862725a 100644 --- a/docs/content/reference/api/github.com/solo-io/gloo/projects/gloo/api/grpc/validation/gloo_validation.proto.sk.md +++ b/docs/content/reference/api/github.com/solo-io/gloo/projects/gloo/api/grpc/validation/gloo_validation.proto.sk.md @@ -40,6 +40,8 @@ weight: 5 - [TcpHostReport](#tcphostreport) - [Error](#error) - [Type](#type) +- [Warning](#warning) +- [Type](#type) - [HybridListenerReport](#hybridlistenerreport) - [MatchedListenerReport](#matchedlistenerreport) - [AggregateListenerReport](#aggregatelistenerreport) @@ -533,12 +535,14 @@ error types for top-level tcp listener config ```yaml "errors": []gloo.solo.io.TcpHostReport.Error +"warnings": []gloo.solo.io.TcpHostReport.Warning ``` | Field | Type | Description | | ----- | ---- | ----------- | | `errors` | [[]gloo.solo.io.TcpHostReport.Error](../gloo_validation.proto.sk/#error) | errors on the tcp host. | +| `warnings` | [[]gloo.solo.io.TcpHostReport.Warning](../gloo_validation.proto.sk/#warning) | warnings on the config of the tcp host. | @@ -577,6 +581,39 @@ error types for tcp host config +--- +### Warning + + +warning types for the given tcp host config + +```yaml +"type": .gloo.solo.io.TcpHostReport.Warning.Type +"reason": string + +``` + +| Field | Type | Description | +| ----- | ---- | ----------- | +| `type` | [.gloo.solo.io.TcpHostReport.Warning.Type](../gloo_validation.proto.sk/#type) | the type of the warning. | +| `reason` | `string` | any extra info as a string. | + + + + +--- +### Type + + + +| Name | Description | +| ----- | ----------- | +| `UnknownWarning` | | +| `InvalidDestinationWarning` | | + + + + --- ### HybridListenerReport diff --git a/projects/gloo/api/grpc/validation/gloo_validation.proto b/projects/gloo/api/grpc/validation/gloo_validation.proto index 27b0fe8768a..08ef33cb545 100644 --- a/projects/gloo/api/grpc/validation/gloo_validation.proto +++ b/projects/gloo/api/grpc/validation/gloo_validation.proto @@ -236,7 +236,7 @@ message TcpHostReport { message Error { enum Type { NameNotUniqueError = 0; - InvalidDestinationError = 1; + InvalidDestinationError = 1 [deprecated = true]; ProcessingError = 2; } @@ -246,8 +246,24 @@ message TcpHostReport { string reason = 2; } + // warning types for the given tcp host config + message Warning { + enum Type { + UnknownWarning = 0; + InvalidDestinationWarning = 1; + } + + // the type of the warning + Type type = 1; + // any extra info as a string + string reason = 2; + } + // errors on the tcp host repeated Error errors = 2; + + // warnings on the config of the tcp host + repeated Warning warnings = 3; } message HybridListenerReport { @@ -266,4 +282,4 @@ message MatchedListenerReport { message AggregateListenerReport { map http_listener_reports = 1; map tcp_listener_reports = 2; -} \ No newline at end of file +} diff --git a/projects/gloo/pkg/api/grpc/validation/gloo_validation.pb.clone.go b/projects/gloo/pkg/api/grpc/validation/gloo_validation.pb.clone.go index fae4e644c6b..29c55069656 100644 --- a/projects/gloo/pkg/api/grpc/validation/gloo_validation.pb.clone.go +++ b/projects/gloo/pkg/api/grpc/validation/gloo_validation.pb.clone.go @@ -521,6 +521,19 @@ func (m *TcpHostReport) Clone() proto.Message { } } + if m.GetWarnings() != nil { + target.Warnings = make([]*TcpHostReport_Warning, len(m.GetWarnings())) + for idx, v := range m.GetWarnings() { + + if h, ok := interface{}(v).(clone.Cloner); ok { + target.Warnings[idx] = h.Clone().(*TcpHostReport_Warning) + } else { + target.Warnings[idx] = proto.Clone(v).(*TcpHostReport_Warning) + } + + } + } + return target } @@ -728,3 +741,18 @@ func (m *TcpHostReport_Error) Clone() proto.Message { return target } + +// Clone function +func (m *TcpHostReport_Warning) Clone() proto.Message { + var target *TcpHostReport_Warning + if m == nil { + return target + } + target = &TcpHostReport_Warning{} + + target.Type = m.GetType() + + target.Reason = m.GetReason() + + return target +} diff --git a/projects/gloo/pkg/api/grpc/validation/gloo_validation.pb.equal.go b/projects/gloo/pkg/api/grpc/validation/gloo_validation.pb.equal.go index 294cb963673..69f22a8c306 100644 --- a/projects/gloo/pkg/api/grpc/validation/gloo_validation.pb.equal.go +++ b/projects/gloo/pkg/api/grpc/validation/gloo_validation.pb.equal.go @@ -824,6 +824,23 @@ func (m *TcpHostReport) Equal(that interface{}) bool { } + if len(m.GetWarnings()) != len(target.GetWarnings()) { + return false + } + for idx, v := range m.GetWarnings() { + + if h, ok := interface{}(v).(equality.Equalizer); ok { + if !h.Equal(target.GetWarnings()[idx]) { + return false + } + } else { + if !proto.Equal(v, target.GetWarnings()[idx]) { + return false + } + } + + } + return true } @@ -1212,3 +1229,35 @@ func (m *TcpHostReport_Error) Equal(that interface{}) bool { return true } + +// Equal function +func (m *TcpHostReport_Warning) Equal(that interface{}) bool { + if that == nil { + return m == nil + } + + target, ok := that.(*TcpHostReport_Warning) + if !ok { + that2, ok := that.(TcpHostReport_Warning) + if ok { + target = &that2 + } else { + return false + } + } + if target == nil { + return m == nil + } else if m == nil { + return false + } + + if m.GetType() != target.GetType() { + return false + } + + if strings.Compare(m.GetReason(), target.GetReason()) != 0 { + return false + } + + return true +} diff --git a/projects/gloo/pkg/api/grpc/validation/gloo_validation.pb.go b/projects/gloo/pkg/api/grpc/validation/gloo_validation.pb.go index dfd52eb0a20..fa0efbc3560 100644 --- a/projects/gloo/pkg/api/grpc/validation/gloo_validation.pb.go +++ b/projects/gloo/pkg/api/grpc/validation/gloo_validation.pb.go @@ -319,7 +319,8 @@ func (TcpListenerReport_Error_Type) EnumDescriptor() ([]byte, []int) { type TcpHostReport_Error_Type int32 const ( - TcpHostReport_Error_NameNotUniqueError TcpHostReport_Error_Type = 0 + TcpHostReport_Error_NameNotUniqueError TcpHostReport_Error_Type = 0 + // Deprecated: Do not use. TcpHostReport_Error_InvalidDestinationError TcpHostReport_Error_Type = 1 TcpHostReport_Error_ProcessingError TcpHostReport_Error_Type = 2 ) @@ -365,6 +366,52 @@ func (TcpHostReport_Error_Type) EnumDescriptor() ([]byte, []int) { return file_github_com_solo_io_gloo_projects_gloo_api_grpc_validation_gloo_validation_proto_rawDescGZIP(), []int{14, 0, 0} } +type TcpHostReport_Warning_Type int32 + +const ( + TcpHostReport_Warning_UnknownWarning TcpHostReport_Warning_Type = 0 + TcpHostReport_Warning_InvalidDestinationWarning TcpHostReport_Warning_Type = 1 +) + +// Enum value maps for TcpHostReport_Warning_Type. +var ( + TcpHostReport_Warning_Type_name = map[int32]string{ + 0: "UnknownWarning", + 1: "InvalidDestinationWarning", + } + TcpHostReport_Warning_Type_value = map[string]int32{ + "UnknownWarning": 0, + "InvalidDestinationWarning": 1, + } +) + +func (x TcpHostReport_Warning_Type) Enum() *TcpHostReport_Warning_Type { + p := new(TcpHostReport_Warning_Type) + *p = x + return p +} + +func (x TcpHostReport_Warning_Type) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (TcpHostReport_Warning_Type) Descriptor() protoreflect.EnumDescriptor { + return file_github_com_solo_io_gloo_projects_gloo_api_grpc_validation_gloo_validation_proto_enumTypes[7].Descriptor() +} + +func (TcpHostReport_Warning_Type) Type() protoreflect.EnumType { + return &file_github_com_solo_io_gloo_projects_gloo_api_grpc_validation_gloo_validation_proto_enumTypes[7] +} + +func (x TcpHostReport_Warning_Type) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use TcpHostReport_Warning_Type.Descriptor instead. +func (TcpHostReport_Warning_Type) EnumDescriptor() ([]byte, []int) { + return file_github_com_solo_io_gloo_projects_gloo_api_grpc_validation_gloo_validation_proto_rawDescGZIP(), []int{14, 1, 0} +} + type GlooValidationServiceRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1235,6 +1282,8 @@ type TcpHostReport struct { // errors on the tcp host Errors []*TcpHostReport_Error `protobuf:"bytes,2,rep,name=errors,proto3" json:"errors,omitempty"` + // warnings on the config of the tcp host + Warnings []*TcpHostReport_Warning `protobuf:"bytes,3,rep,name=warnings,proto3" json:"warnings,omitempty"` } func (x *TcpHostReport) Reset() { @@ -1276,6 +1325,13 @@ func (x *TcpHostReport) GetErrors() []*TcpHostReport_Error { return nil } +func (x *TcpHostReport) GetWarnings() []*TcpHostReport_Warning { + if x != nil { + return x.Warnings + } + return nil +} + type HybridListenerReport struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1867,6 +1923,64 @@ func (x *TcpHostReport_Error) GetReason() string { return "" } +// warning types for the given tcp host config +type TcpHostReport_Warning struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the type of the warning + Type TcpHostReport_Warning_Type `protobuf:"varint,1,opt,name=type,proto3,enum=gloo.solo.io.TcpHostReport_Warning_Type" json:"type,omitempty"` + // any extra info as a string + Reason string `protobuf:"bytes,2,opt,name=reason,proto3" json:"reason,omitempty"` +} + +func (x *TcpHostReport_Warning) Reset() { + *x = TcpHostReport_Warning{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_solo_io_gloo_projects_gloo_api_grpc_validation_gloo_validation_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TcpHostReport_Warning) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TcpHostReport_Warning) ProtoMessage() {} + +func (x *TcpHostReport_Warning) ProtoReflect() protoreflect.Message { + mi := &file_github_com_solo_io_gloo_projects_gloo_api_grpc_validation_gloo_validation_proto_msgTypes[25] + 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 TcpHostReport_Warning.ProtoReflect.Descriptor instead. +func (*TcpHostReport_Warning) Descriptor() ([]byte, []int) { + return file_github_com_solo_io_gloo_projects_gloo_api_grpc_validation_gloo_validation_proto_rawDescGZIP(), []int{14, 1} +} + +func (x *TcpHostReport_Warning) GetType() TcpHostReport_Warning_Type { + if x != nil { + return x.Type + } + return TcpHostReport_Warning_UnknownWarning +} + +func (x *TcpHostReport_Warning) GetReason() string { + if x != nil { + return x.Reason + } + return "" +} + var File_github_com_solo_io_gloo_projects_gloo_api_grpc_validation_gloo_validation_proto protoreflect.FileDescriptor var file_github_com_solo_io_gloo_projects_gloo_api_grpc_validation_gloo_validation_proto_rawDesc = []byte{ @@ -2083,101 +2197,115 @@ var file_github_com_solo_io_gloo_projects_gloo_api_grpc_validation_gloo_validati 0x69, 0x71, 0x75, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x53, 0x4c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x45, 0x72, 0x72, - 0x6f, 0x72, 0x10, 0x03, 0x22, 0xfa, 0x01, 0x0a, 0x0d, 0x54, 0x63, 0x70, 0x48, 0x6f, 0x73, 0x74, + 0x6f, 0x72, 0x10, 0x03, 0x22, 0xdc, 0x03, 0x0a, 0x0d, 0x54, 0x63, 0x70, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x39, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x54, 0x63, 0x70, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x73, 0x1a, 0xad, 0x01, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x3a, 0x0a, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, - 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x54, 0x63, 0x70, 0x48, 0x6f, 0x73, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, - 0x50, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x4e, 0x61, 0x6d, 0x65, 0x4e, - 0x6f, 0x74, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0x00, 0x12, - 0x1b, 0x0a, 0x17, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, - 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, - 0x02, 0x22, 0x80, 0x02, 0x0a, 0x14, 0x48, 0x79, 0x62, 0x72, 0x69, 0x64, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x78, 0x0a, 0x18, 0x6d, 0x61, - 0x74, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x5f, 0x72, - 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x67, - 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x48, 0x79, 0x62, 0x72, - 0x69, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, - 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x16, 0x6d, 0x61, - 0x74, 0x63, 0x68, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x73, 0x1a, 0x6e, 0x0a, 0x1b, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x4c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, - 0x2e, 0x69, 0x6f, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd6, 0x01, 0x0a, 0x15, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, - 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x54, - 0x0a, 0x14, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x5f, - 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, - 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x48, 0x74, 0x74, 0x70, - 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x48, 0x00, - 0x52, 0x12, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, - 0x70, 0x6f, 0x72, 0x74, 0x12, 0x51, 0x0a, 0x13, 0x74, 0x63, 0x70, 0x5f, 0x6c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, - 0x2e, 0x54, 0x63, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, - 0x72, 0x74, 0x48, 0x00, 0x52, 0x11, 0x74, 0x63, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, - 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x14, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x79, 0x70, 0x65, 0x22, 0xd0, 0x03, - 0x0a, 0x17, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x72, 0x0a, 0x15, 0x68, 0x74, 0x74, - 0x70, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, - 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, - 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, - 0x65, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, - 0x48, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, - 0x72, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x6f, 0x0a, - 0x14, 0x74, 0x63, 0x70, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x65, - 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x67, 0x6c, - 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, - 0x67, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, - 0x72, 0x74, 0x2e, 0x54, 0x63, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, - 0x70, 0x6f, 0x72, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x12, 0x74, 0x63, 0x70, 0x4c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x1a, 0x68, - 0x0a, 0x18, 0x48, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, - 0x70, 0x6f, 0x72, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6c, - 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x4c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x66, 0x0a, 0x17, 0x54, 0x63, 0x70, 0x4c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, - 0x2e, 0x69, 0x6f, 0x2e, 0x54, 0x63, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, - 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x32, 0xdf, 0x01, 0x0a, 0x15, 0x47, 0x6c, 0x6f, 0x6f, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5f, 0x0a, 0x0e, 0x4e, 0x6f, - 0x74, 0x69, 0x66, 0x79, 0x4f, 0x6e, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x23, 0x2e, 0x67, - 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x4e, 0x6f, 0x74, 0x69, - 0x66, 0x79, 0x4f, 0x6e, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x24, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, - 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x4f, 0x6e, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x65, 0x0a, 0x08, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, - 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x47, 0x6c, 0x6f, 0x6f, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, - 0x69, 0x6f, 0x2e, 0x47, 0x6c, 0x6f, 0x6f, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x42, 0x4b, 0x5a, 0x3d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x73, 0x6f, 0x6c, 0x6f, 0x2d, 0x69, 0x6f, 0x2f, 0x67, 0x6c, 0x6f, 0x6f, 0x2f, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x67, 0x6c, 0x6f, 0x6f, 0x2f, 0x70, 0x6b, 0x67, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0xc0, 0xf5, 0x04, 0x01, 0xb8, 0xf5, 0x04, 0x01, 0xd0, 0xf5, 0x04, 0x01, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x12, 0x3f, 0x0a, 0x08, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, + 0x69, 0x6f, 0x2e, 0x54, 0x63, 0x70, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x2e, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, + 0x67, 0x73, 0x1a, 0xb1, 0x01, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x3a, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x67, 0x6c, 0x6f, + 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x54, 0x63, 0x70, 0x48, 0x6f, 0x73, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, + 0x22, 0x54, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x4e, 0x61, 0x6d, 0x65, + 0x4e, 0x6f, 0x74, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0x00, + 0x12, 0x1f, 0x0a, 0x17, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x44, 0x65, 0x73, 0x74, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0x01, 0x1a, 0x02, 0x08, + 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x10, 0x02, 0x1a, 0x9a, 0x01, 0x0a, 0x07, 0x57, 0x61, 0x72, 0x6e, 0x69, + 0x6e, 0x67, 0x12, 0x3c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x28, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, + 0x54, 0x63, 0x70, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x57, 0x61, + 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x39, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x12, 0x0a, 0x0e, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x57, 0x61, 0x72, 0x6e, 0x69, + 0x6e, 0x67, 0x10, 0x00, 0x12, 0x1d, 0x0a, 0x19, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x44, + 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, + 0x67, 0x10, 0x01, 0x22, 0x80, 0x02, 0x0a, 0x14, 0x48, 0x79, 0x62, 0x72, 0x69, 0x64, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x78, 0x0a, 0x18, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, + 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x48, 0x79, + 0x62, 0x72, 0x69, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x16, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x1a, 0x6e, 0x0a, 0x1b, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, + 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, + 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd6, 0x01, 0x0a, 0x15, 0x4d, 0x61, 0x74, 0x63, 0x68, + 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x12, 0x54, 0x0a, 0x14, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, + 0x72, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, + 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x48, 0x74, + 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x48, 0x00, 0x52, 0x12, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x51, 0x0a, 0x13, 0x74, 0x63, 0x70, 0x5f, 0x6c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, + 0x69, 0x6f, 0x2e, 0x54, 0x63, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x48, 0x00, 0x52, 0x11, 0x74, 0x63, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x14, 0x0a, 0x12, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x79, 0x70, 0x65, 0x22, + 0xd0, 0x03, 0x0a, 0x17, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x72, 0x0a, 0x15, 0x68, + 0x74, 0x74, 0x70, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x67, 0x6c, 0x6f, + 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, + 0x61, 0x74, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x68, 0x74, 0x74, 0x70, + 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x12, + 0x6f, 0x0a, 0x14, 0x74, 0x63, 0x70, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x5f, + 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, + 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x41, 0x67, 0x67, + 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x54, 0x63, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x12, 0x74, 0x63, + 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, + 0x1a, 0x68, 0x0a, 0x18, 0x48, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, + 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x48, 0x74, 0x74, + 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x66, 0x0a, 0x17, 0x54, 0x63, + 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, + 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x54, 0x63, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, + 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x32, 0xdf, 0x01, 0x0a, 0x15, 0x47, 0x6c, 0x6f, 0x6f, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5f, 0x0a, 0x0e, + 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x4f, 0x6e, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x23, + 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x4e, 0x6f, + 0x74, 0x69, 0x66, 0x79, 0x4f, 0x6e, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, + 0x69, 0x6f, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x4f, 0x6e, 0x52, 0x65, 0x73, 0x79, 0x6e, + 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x65, 0x0a, + 0x08, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, + 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x47, 0x6c, 0x6f, 0x6f, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, + 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x47, 0x6c, 0x6f, 0x6f, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x42, 0x4b, 0x5a, 0x3d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x73, 0x6f, 0x6c, 0x6f, 0x2d, 0x69, 0x6f, 0x2f, 0x67, 0x6c, 0x6f, 0x6f, 0x2f, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x67, 0x6c, 0x6f, 0x6f, 0x2f, 0x70, 0x6b, + 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xc0, 0xf5, 0x04, 0x01, 0xb8, 0xf5, 0x04, 0x01, 0xd0, 0xf5, 0x04, + 0x01, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2192,8 +2320,8 @@ func file_github_com_solo_io_gloo_projects_gloo_api_grpc_validation_gloo_validat return file_github_com_solo_io_gloo_projects_gloo_api_grpc_validation_gloo_validation_proto_rawDescData } -var file_github_com_solo_io_gloo_projects_gloo_api_grpc_validation_gloo_validation_proto_enumTypes = make([]protoimpl.EnumInfo, 7) -var file_github_com_solo_io_gloo_projects_gloo_api_grpc_validation_gloo_validation_proto_msgTypes = make([]protoimpl.MessageInfo, 28) +var file_github_com_solo_io_gloo_projects_gloo_api_grpc_validation_gloo_validation_proto_enumTypes = make([]protoimpl.EnumInfo, 8) +var file_github_com_solo_io_gloo_projects_gloo_api_grpc_validation_gloo_validation_proto_msgTypes = make([]protoimpl.MessageInfo, 29) var file_github_com_solo_io_gloo_projects_gloo_api_grpc_validation_gloo_validation_proto_goTypes = []interface{}{ (ListenerReport_Error_Type)(0), // 0: gloo.solo.io.ListenerReport.Error.Type (HttpListenerReport_Error_Type)(0), // 1: gloo.solo.io.HttpListenerReport.Error.Type @@ -2202,89 +2330,93 @@ var file_github_com_solo_io_gloo_projects_gloo_api_grpc_validation_gloo_validati (RouteReport_Warning_Type)(0), // 4: gloo.solo.io.RouteReport.Warning.Type (TcpListenerReport_Error_Type)(0), // 5: gloo.solo.io.TcpListenerReport.Error.Type (TcpHostReport_Error_Type)(0), // 6: gloo.solo.io.TcpHostReport.Error.Type - (*GlooValidationServiceRequest)(nil), // 7: gloo.solo.io.GlooValidationServiceRequest - (*GlooValidationServiceResponse)(nil), // 8: gloo.solo.io.GlooValidationServiceResponse - (*ModifiedResources)(nil), // 9: gloo.solo.io.ModifiedResources - (*DeletedResources)(nil), // 10: gloo.solo.io.DeletedResources - (*ValidationReport)(nil), // 11: gloo.solo.io.ValidationReport - (*ResourceReport)(nil), // 12: gloo.solo.io.ResourceReport - (*NotifyOnResyncRequest)(nil), // 13: gloo.solo.io.NotifyOnResyncRequest - (*NotifyOnResyncResponse)(nil), // 14: gloo.solo.io.NotifyOnResyncResponse - (*ProxyReport)(nil), // 15: gloo.solo.io.ProxyReport - (*ListenerReport)(nil), // 16: gloo.solo.io.ListenerReport - (*HttpListenerReport)(nil), // 17: gloo.solo.io.HttpListenerReport - (*VirtualHostReport)(nil), // 18: gloo.solo.io.VirtualHostReport - (*RouteReport)(nil), // 19: gloo.solo.io.RouteReport - (*TcpListenerReport)(nil), // 20: gloo.solo.io.TcpListenerReport - (*TcpHostReport)(nil), // 21: gloo.solo.io.TcpHostReport - (*HybridListenerReport)(nil), // 22: gloo.solo.io.HybridListenerReport - (*MatchedListenerReport)(nil), // 23: gloo.solo.io.MatchedListenerReport - (*AggregateListenerReport)(nil), // 24: gloo.solo.io.AggregateListenerReport - (*ListenerReport_Error)(nil), // 25: gloo.solo.io.ListenerReport.Error - (*HttpListenerReport_Error)(nil), // 26: gloo.solo.io.HttpListenerReport.Error - (*VirtualHostReport_Error)(nil), // 27: gloo.solo.io.VirtualHostReport.Error - (*RouteReport_Error)(nil), // 28: gloo.solo.io.RouteReport.Error - (*RouteReport_Warning)(nil), // 29: gloo.solo.io.RouteReport.Warning - (*TcpListenerReport_Error)(nil), // 30: gloo.solo.io.TcpListenerReport.Error - (*TcpHostReport_Error)(nil), // 31: gloo.solo.io.TcpHostReport.Error - nil, // 32: gloo.solo.io.HybridListenerReport.MatchedListenerReportsEntry - nil, // 33: gloo.solo.io.AggregateListenerReport.HttpListenerReportsEntry - nil, // 34: gloo.solo.io.AggregateListenerReport.TcpListenerReportsEntry - (*v1.Proxy)(nil), // 35: gloo.solo.io.Proxy - (*v1.Upstream)(nil), // 36: gloo.solo.io.Upstream - (*core.ResourceRef)(nil), // 37: core.solo.io.ResourceRef + (TcpHostReport_Warning_Type)(0), // 7: gloo.solo.io.TcpHostReport.Warning.Type + (*GlooValidationServiceRequest)(nil), // 8: gloo.solo.io.GlooValidationServiceRequest + (*GlooValidationServiceResponse)(nil), // 9: gloo.solo.io.GlooValidationServiceResponse + (*ModifiedResources)(nil), // 10: gloo.solo.io.ModifiedResources + (*DeletedResources)(nil), // 11: gloo.solo.io.DeletedResources + (*ValidationReport)(nil), // 12: gloo.solo.io.ValidationReport + (*ResourceReport)(nil), // 13: gloo.solo.io.ResourceReport + (*NotifyOnResyncRequest)(nil), // 14: gloo.solo.io.NotifyOnResyncRequest + (*NotifyOnResyncResponse)(nil), // 15: gloo.solo.io.NotifyOnResyncResponse + (*ProxyReport)(nil), // 16: gloo.solo.io.ProxyReport + (*ListenerReport)(nil), // 17: gloo.solo.io.ListenerReport + (*HttpListenerReport)(nil), // 18: gloo.solo.io.HttpListenerReport + (*VirtualHostReport)(nil), // 19: gloo.solo.io.VirtualHostReport + (*RouteReport)(nil), // 20: gloo.solo.io.RouteReport + (*TcpListenerReport)(nil), // 21: gloo.solo.io.TcpListenerReport + (*TcpHostReport)(nil), // 22: gloo.solo.io.TcpHostReport + (*HybridListenerReport)(nil), // 23: gloo.solo.io.HybridListenerReport + (*MatchedListenerReport)(nil), // 24: gloo.solo.io.MatchedListenerReport + (*AggregateListenerReport)(nil), // 25: gloo.solo.io.AggregateListenerReport + (*ListenerReport_Error)(nil), // 26: gloo.solo.io.ListenerReport.Error + (*HttpListenerReport_Error)(nil), // 27: gloo.solo.io.HttpListenerReport.Error + (*VirtualHostReport_Error)(nil), // 28: gloo.solo.io.VirtualHostReport.Error + (*RouteReport_Error)(nil), // 29: gloo.solo.io.RouteReport.Error + (*RouteReport_Warning)(nil), // 30: gloo.solo.io.RouteReport.Warning + (*TcpListenerReport_Error)(nil), // 31: gloo.solo.io.TcpListenerReport.Error + (*TcpHostReport_Error)(nil), // 32: gloo.solo.io.TcpHostReport.Error + (*TcpHostReport_Warning)(nil), // 33: gloo.solo.io.TcpHostReport.Warning + nil, // 34: gloo.solo.io.HybridListenerReport.MatchedListenerReportsEntry + nil, // 35: gloo.solo.io.AggregateListenerReport.HttpListenerReportsEntry + nil, // 36: gloo.solo.io.AggregateListenerReport.TcpListenerReportsEntry + (*v1.Proxy)(nil), // 37: gloo.solo.io.Proxy + (*v1.Upstream)(nil), // 38: gloo.solo.io.Upstream + (*core.ResourceRef)(nil), // 39: core.solo.io.ResourceRef } var file_github_com_solo_io_gloo_projects_gloo_api_grpc_validation_gloo_validation_proto_depIdxs = []int32{ - 35, // 0: gloo.solo.io.GlooValidationServiceRequest.proxy:type_name -> gloo.solo.io.Proxy - 9, // 1: gloo.solo.io.GlooValidationServiceRequest.modified_resources:type_name -> gloo.solo.io.ModifiedResources - 10, // 2: gloo.solo.io.GlooValidationServiceRequest.deleted_resources:type_name -> gloo.solo.io.DeletedResources - 11, // 3: gloo.solo.io.GlooValidationServiceResponse.validation_reports:type_name -> gloo.solo.io.ValidationReport - 36, // 4: gloo.solo.io.ModifiedResources.upstreams:type_name -> gloo.solo.io.Upstream - 37, // 5: gloo.solo.io.DeletedResources.upstream_refs:type_name -> core.solo.io.ResourceRef - 37, // 6: gloo.solo.io.DeletedResources.secret_refs:type_name -> core.solo.io.ResourceRef - 15, // 7: gloo.solo.io.ValidationReport.proxy_report:type_name -> gloo.solo.io.ProxyReport - 12, // 8: gloo.solo.io.ValidationReport.upstream_reports:type_name -> gloo.solo.io.ResourceReport - 35, // 9: gloo.solo.io.ValidationReport.proxy:type_name -> gloo.solo.io.Proxy - 37, // 10: gloo.solo.io.ResourceReport.resource_ref:type_name -> core.solo.io.ResourceRef - 16, // 11: gloo.solo.io.ProxyReport.listener_reports:type_name -> gloo.solo.io.ListenerReport - 25, // 12: gloo.solo.io.ListenerReport.errors:type_name -> gloo.solo.io.ListenerReport.Error - 17, // 13: gloo.solo.io.ListenerReport.http_listener_report:type_name -> gloo.solo.io.HttpListenerReport - 20, // 14: gloo.solo.io.ListenerReport.tcp_listener_report:type_name -> gloo.solo.io.TcpListenerReport - 22, // 15: gloo.solo.io.ListenerReport.hybrid_listener_report:type_name -> gloo.solo.io.HybridListenerReport - 24, // 16: gloo.solo.io.ListenerReport.aggregate_listener_report:type_name -> gloo.solo.io.AggregateListenerReport - 26, // 17: gloo.solo.io.HttpListenerReport.errors:type_name -> gloo.solo.io.HttpListenerReport.Error - 18, // 18: gloo.solo.io.HttpListenerReport.virtual_host_reports:type_name -> gloo.solo.io.VirtualHostReport - 27, // 19: gloo.solo.io.VirtualHostReport.errors:type_name -> gloo.solo.io.VirtualHostReport.Error - 19, // 20: gloo.solo.io.VirtualHostReport.route_reports:type_name -> gloo.solo.io.RouteReport - 28, // 21: gloo.solo.io.RouteReport.errors:type_name -> gloo.solo.io.RouteReport.Error - 29, // 22: gloo.solo.io.RouteReport.warnings:type_name -> gloo.solo.io.RouteReport.Warning - 30, // 23: gloo.solo.io.TcpListenerReport.errors:type_name -> gloo.solo.io.TcpListenerReport.Error - 21, // 24: gloo.solo.io.TcpListenerReport.tcp_host_reports:type_name -> gloo.solo.io.TcpHostReport - 31, // 25: gloo.solo.io.TcpHostReport.errors:type_name -> gloo.solo.io.TcpHostReport.Error - 32, // 26: gloo.solo.io.HybridListenerReport.matched_listener_reports:type_name -> gloo.solo.io.HybridListenerReport.MatchedListenerReportsEntry - 17, // 27: gloo.solo.io.MatchedListenerReport.http_listener_report:type_name -> gloo.solo.io.HttpListenerReport - 20, // 28: gloo.solo.io.MatchedListenerReport.tcp_listener_report:type_name -> gloo.solo.io.TcpListenerReport - 33, // 29: gloo.solo.io.AggregateListenerReport.http_listener_reports:type_name -> gloo.solo.io.AggregateListenerReport.HttpListenerReportsEntry - 34, // 30: gloo.solo.io.AggregateListenerReport.tcp_listener_reports:type_name -> gloo.solo.io.AggregateListenerReport.TcpListenerReportsEntry - 0, // 31: gloo.solo.io.ListenerReport.Error.type:type_name -> gloo.solo.io.ListenerReport.Error.Type - 1, // 32: gloo.solo.io.HttpListenerReport.Error.type:type_name -> gloo.solo.io.HttpListenerReport.Error.Type - 2, // 33: gloo.solo.io.VirtualHostReport.Error.type:type_name -> gloo.solo.io.VirtualHostReport.Error.Type - 3, // 34: gloo.solo.io.RouteReport.Error.type:type_name -> gloo.solo.io.RouteReport.Error.Type - 4, // 35: gloo.solo.io.RouteReport.Warning.type:type_name -> gloo.solo.io.RouteReport.Warning.Type - 5, // 36: gloo.solo.io.TcpListenerReport.Error.type:type_name -> gloo.solo.io.TcpListenerReport.Error.Type - 6, // 37: gloo.solo.io.TcpHostReport.Error.type:type_name -> gloo.solo.io.TcpHostReport.Error.Type - 23, // 38: gloo.solo.io.HybridListenerReport.MatchedListenerReportsEntry.value:type_name -> gloo.solo.io.MatchedListenerReport - 17, // 39: gloo.solo.io.AggregateListenerReport.HttpListenerReportsEntry.value:type_name -> gloo.solo.io.HttpListenerReport - 20, // 40: gloo.solo.io.AggregateListenerReport.TcpListenerReportsEntry.value:type_name -> gloo.solo.io.TcpListenerReport - 13, // 41: gloo.solo.io.GlooValidationService.NotifyOnResync:input_type -> gloo.solo.io.NotifyOnResyncRequest - 7, // 42: gloo.solo.io.GlooValidationService.Validate:input_type -> gloo.solo.io.GlooValidationServiceRequest - 14, // 43: gloo.solo.io.GlooValidationService.NotifyOnResync:output_type -> gloo.solo.io.NotifyOnResyncResponse - 8, // 44: gloo.solo.io.GlooValidationService.Validate:output_type -> gloo.solo.io.GlooValidationServiceResponse - 43, // [43:45] is the sub-list for method output_type - 41, // [41:43] is the sub-list for method input_type - 41, // [41:41] is the sub-list for extension type_name - 41, // [41:41] is the sub-list for extension extendee - 0, // [0:41] is the sub-list for field type_name + 37, // 0: gloo.solo.io.GlooValidationServiceRequest.proxy:type_name -> gloo.solo.io.Proxy + 10, // 1: gloo.solo.io.GlooValidationServiceRequest.modified_resources:type_name -> gloo.solo.io.ModifiedResources + 11, // 2: gloo.solo.io.GlooValidationServiceRequest.deleted_resources:type_name -> gloo.solo.io.DeletedResources + 12, // 3: gloo.solo.io.GlooValidationServiceResponse.validation_reports:type_name -> gloo.solo.io.ValidationReport + 38, // 4: gloo.solo.io.ModifiedResources.upstreams:type_name -> gloo.solo.io.Upstream + 39, // 5: gloo.solo.io.DeletedResources.upstream_refs:type_name -> core.solo.io.ResourceRef + 39, // 6: gloo.solo.io.DeletedResources.secret_refs:type_name -> core.solo.io.ResourceRef + 16, // 7: gloo.solo.io.ValidationReport.proxy_report:type_name -> gloo.solo.io.ProxyReport + 13, // 8: gloo.solo.io.ValidationReport.upstream_reports:type_name -> gloo.solo.io.ResourceReport + 37, // 9: gloo.solo.io.ValidationReport.proxy:type_name -> gloo.solo.io.Proxy + 39, // 10: gloo.solo.io.ResourceReport.resource_ref:type_name -> core.solo.io.ResourceRef + 17, // 11: gloo.solo.io.ProxyReport.listener_reports:type_name -> gloo.solo.io.ListenerReport + 26, // 12: gloo.solo.io.ListenerReport.errors:type_name -> gloo.solo.io.ListenerReport.Error + 18, // 13: gloo.solo.io.ListenerReport.http_listener_report:type_name -> gloo.solo.io.HttpListenerReport + 21, // 14: gloo.solo.io.ListenerReport.tcp_listener_report:type_name -> gloo.solo.io.TcpListenerReport + 23, // 15: gloo.solo.io.ListenerReport.hybrid_listener_report:type_name -> gloo.solo.io.HybridListenerReport + 25, // 16: gloo.solo.io.ListenerReport.aggregate_listener_report:type_name -> gloo.solo.io.AggregateListenerReport + 27, // 17: gloo.solo.io.HttpListenerReport.errors:type_name -> gloo.solo.io.HttpListenerReport.Error + 19, // 18: gloo.solo.io.HttpListenerReport.virtual_host_reports:type_name -> gloo.solo.io.VirtualHostReport + 28, // 19: gloo.solo.io.VirtualHostReport.errors:type_name -> gloo.solo.io.VirtualHostReport.Error + 20, // 20: gloo.solo.io.VirtualHostReport.route_reports:type_name -> gloo.solo.io.RouteReport + 29, // 21: gloo.solo.io.RouteReport.errors:type_name -> gloo.solo.io.RouteReport.Error + 30, // 22: gloo.solo.io.RouteReport.warnings:type_name -> gloo.solo.io.RouteReport.Warning + 31, // 23: gloo.solo.io.TcpListenerReport.errors:type_name -> gloo.solo.io.TcpListenerReport.Error + 22, // 24: gloo.solo.io.TcpListenerReport.tcp_host_reports:type_name -> gloo.solo.io.TcpHostReport + 32, // 25: gloo.solo.io.TcpHostReport.errors:type_name -> gloo.solo.io.TcpHostReport.Error + 33, // 26: gloo.solo.io.TcpHostReport.warnings:type_name -> gloo.solo.io.TcpHostReport.Warning + 34, // 27: gloo.solo.io.HybridListenerReport.matched_listener_reports:type_name -> gloo.solo.io.HybridListenerReport.MatchedListenerReportsEntry + 18, // 28: gloo.solo.io.MatchedListenerReport.http_listener_report:type_name -> gloo.solo.io.HttpListenerReport + 21, // 29: gloo.solo.io.MatchedListenerReport.tcp_listener_report:type_name -> gloo.solo.io.TcpListenerReport + 35, // 30: gloo.solo.io.AggregateListenerReport.http_listener_reports:type_name -> gloo.solo.io.AggregateListenerReport.HttpListenerReportsEntry + 36, // 31: gloo.solo.io.AggregateListenerReport.tcp_listener_reports:type_name -> gloo.solo.io.AggregateListenerReport.TcpListenerReportsEntry + 0, // 32: gloo.solo.io.ListenerReport.Error.type:type_name -> gloo.solo.io.ListenerReport.Error.Type + 1, // 33: gloo.solo.io.HttpListenerReport.Error.type:type_name -> gloo.solo.io.HttpListenerReport.Error.Type + 2, // 34: gloo.solo.io.VirtualHostReport.Error.type:type_name -> gloo.solo.io.VirtualHostReport.Error.Type + 3, // 35: gloo.solo.io.RouteReport.Error.type:type_name -> gloo.solo.io.RouteReport.Error.Type + 4, // 36: gloo.solo.io.RouteReport.Warning.type:type_name -> gloo.solo.io.RouteReport.Warning.Type + 5, // 37: gloo.solo.io.TcpListenerReport.Error.type:type_name -> gloo.solo.io.TcpListenerReport.Error.Type + 6, // 38: gloo.solo.io.TcpHostReport.Error.type:type_name -> gloo.solo.io.TcpHostReport.Error.Type + 7, // 39: gloo.solo.io.TcpHostReport.Warning.type:type_name -> gloo.solo.io.TcpHostReport.Warning.Type + 24, // 40: gloo.solo.io.HybridListenerReport.MatchedListenerReportsEntry.value:type_name -> gloo.solo.io.MatchedListenerReport + 18, // 41: gloo.solo.io.AggregateListenerReport.HttpListenerReportsEntry.value:type_name -> gloo.solo.io.HttpListenerReport + 21, // 42: gloo.solo.io.AggregateListenerReport.TcpListenerReportsEntry.value:type_name -> gloo.solo.io.TcpListenerReport + 14, // 43: gloo.solo.io.GlooValidationService.NotifyOnResync:input_type -> gloo.solo.io.NotifyOnResyncRequest + 8, // 44: gloo.solo.io.GlooValidationService.Validate:input_type -> gloo.solo.io.GlooValidationServiceRequest + 15, // 45: gloo.solo.io.GlooValidationService.NotifyOnResync:output_type -> gloo.solo.io.NotifyOnResyncResponse + 9, // 46: gloo.solo.io.GlooValidationService.Validate:output_type -> gloo.solo.io.GlooValidationServiceResponse + 45, // [45:47] is the sub-list for method output_type + 43, // [43:45] is the sub-list for method input_type + 43, // [43:43] is the sub-list for extension type_name + 43, // [43:43] is the sub-list for extension extendee + 0, // [0:43] is the sub-list for field type_name } func init() { @@ -2595,6 +2727,18 @@ func file_github_com_solo_io_gloo_projects_gloo_api_grpc_validation_gloo_validat return nil } } + file_github_com_solo_io_gloo_projects_gloo_api_grpc_validation_gloo_validation_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TcpHostReport_Warning); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } file_github_com_solo_io_gloo_projects_gloo_api_grpc_validation_gloo_validation_proto_msgTypes[0].OneofWrappers = []interface{}{ (*GlooValidationServiceRequest_ModifiedResources)(nil), @@ -2615,8 +2759,8 @@ func file_github_com_solo_io_gloo_projects_gloo_api_grpc_validation_gloo_validat File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_github_com_solo_io_gloo_projects_gloo_api_grpc_validation_gloo_validation_proto_rawDesc, - NumEnums: 7, - NumMessages: 28, + NumEnums: 8, + NumMessages: 29, NumExtensions: 0, NumServices: 1, }, diff --git a/projects/gloo/pkg/api/grpc/validation/gloo_validation.pb.hash.go b/projects/gloo/pkg/api/grpc/validation/gloo_validation.pb.hash.go index 64c556e4c4c..541af861f67 100644 --- a/projects/gloo/pkg/api/grpc/validation/gloo_validation.pb.hash.go +++ b/projects/gloo/pkg/api/grpc/validation/gloo_validation.pb.hash.go @@ -882,6 +882,30 @@ func (m *TcpHostReport) Hash(hasher hash.Hash64) (uint64, error) { } + for _, v := range m.GetWarnings() { + + if h, ok := interface{}(v).(safe_hasher.SafeHasher); ok { + if _, err = hasher.Write([]byte("")); err != nil { + return 0, err + } + if _, err = h.Hash(hasher); err != nil { + return 0, err + } + } else { + if fieldValue, err := hashstructure.Hash(v, nil); err != nil { + return 0, err + } else { + if _, err = hasher.Write([]byte("")); err != nil { + return 0, err + } + if err := binary.Write(hasher, binary.LittleEndian, fieldValue); err != nil { + return 0, err + } + } + } + + } + return hasher.Sum64(), nil } @@ -1272,3 +1296,28 @@ func (m *TcpHostReport_Error) Hash(hasher hash.Hash64) (uint64, error) { return hasher.Sum64(), nil } + +// Hash function +func (m *TcpHostReport_Warning) Hash(hasher hash.Hash64) (uint64, error) { + if m == nil { + return 0, nil + } + if hasher == nil { + hasher = fnv.New64() + } + var err error + if _, err = hasher.Write([]byte("gloo.solo.io.github.com/solo-io/gloo/projects/gloo/pkg/api/grpc/validation.TcpHostReport_Warning")); err != nil { + return 0, err + } + + err = binary.Write(hasher, binary.LittleEndian, m.GetType()) + if err != nil { + return 0, err + } + + if _, err = hasher.Write([]byte(m.GetReason())); err != nil { + return 0, err + } + + return hasher.Sum64(), nil +} diff --git a/projects/gloo/pkg/plugins/tcp/plugin.go b/projects/gloo/pkg/plugins/tcp/plugin.go index 2d6ca93076d..c82ade4cf4c 100644 --- a/projects/gloo/pkg/plugins/tcp/plugin.go +++ b/projects/gloo/pkg/plugins/tcp/plugin.go @@ -26,6 +26,7 @@ import ( translatorutil "github.com/solo-io/gloo/projects/gloo/pkg/translator" usconversion "github.com/solo-io/gloo/projects/gloo/pkg/upstreams" "github.com/solo-io/gloo/projects/gloo/pkg/utils" + "github.com/solo-io/gloo/projects/gloo/pkg/utils/validation" ) var ( @@ -72,7 +73,7 @@ func (p *plugin) CreateTcpFilterChains(params plugins.Params, parentListener *v1 alsSettings := parentListener.GetOptions().GetAccessLoggingService() tcpListenerOptions := in.GetOptions() - for _, tcpHost := range in.GetTcpHosts() { + for hostNum, tcpHost := range in.GetTcpHosts() { var listenerFilters []*envoy_config_listener_v3.Filter statPrefix := in.GetStatPrefix() if statPrefix == "" { @@ -81,7 +82,21 @@ func (p *plugin) CreateTcpFilterChains(params plugins.Params, parentListener *v1 tcpFilters, err := p.tcpProxyFilters(params, tcpHost, tcpListenerOptions, statPrefix, alsSettings) if err != nil { - multiErr.Errors = append(multiErr.Errors, err) + if _, ok := err.(*pluginutils.DestinationNotFoundError); ok { + // this error will be treated as just a warning; wrap in a + // special error object, and the caller will handle conversion + // from error to warning + // https://github.com/solo-io/solo-projects/issues/5163 + multiErr.Errors = append(multiErr.Errors, &validation.TcpHostWarning{ + Err: err, + ErrLevel: validation.ErrorLevels_WARNING, + Context: validation.ErrorLevelContext{ + HostNum: &hostNum, + }, + }) + } else { + multiErr.Errors = append(multiErr.Errors, err) + } continue } diff --git a/projects/gloo/pkg/translator/filter_chain.go b/projects/gloo/pkg/translator/filter_chain.go index 01639819371..27514806e6c 100644 --- a/projects/gloo/pkg/translator/filter_chain.go +++ b/projects/gloo/pkg/translator/filter_chain.go @@ -4,10 +4,12 @@ import ( "context" "fmt" + "github.com/hashicorp/go-multierror" "github.com/solo-io/go-utils/contextutils" v3 "github.com/solo-io/gloo/projects/gloo/pkg/api/external/envoy/config/core/v3" "github.com/solo-io/gloo/projects/gloo/pkg/api/v1/ssl" + "github.com/solo-io/gloo/projects/gloo/pkg/plugins/pluginutils" envoy_config_core_v3 "github.com/envoyproxy/go-control-plane/envoy/config/core/v3" envoyauth "github.com/envoyproxy/go-control-plane/envoy/extensions/transport_sockets/tls/v3" @@ -47,6 +49,62 @@ type tcpFilterChainTranslator struct { passthroughCipherSuites []string } +// if the error is of ErrorWithKnownLevel type, extract the level; if the level +// is a warning, extract the TcpHost number and report the warning on that +// TcpHost. if the level is an error, report it on the TcpListener object +// itself. nothing currently reports errors on a TcpHost instance or warnings +// on a TcpListener instance, so these two branches are not currently supported +func (t *tcpFilterChainTranslator) reportCreateTcpFilterChainsError(err error) { + getWarningType := func(errType error) validationapi.TcpHostReport_Warning_Type { + switch errType.(type) { + case *pluginutils.DestinationNotFoundError: + return validationapi.TcpHostReport_Warning_InvalidDestinationWarning + default: + return validationapi.TcpHostReport_Warning_UnknownWarning + } + } + + reportTcpListenerError := func(errType error) { + validation.AppendTCPListenerError( + t.report, + // currently only processing errors are reported + validationapi.TcpListenerReport_Error_ProcessingError, + fmt.Sprintf("listener %s: %s", t.parentListener.GetName(), errType.Error())) + } + + reportError := func(errReport error) { + switch errType := errReport.(type) { + case validation.ErrorWithKnownLevel: + switch errType.ErrorLevel() { + case validation.ErrorLevels_WARNING: + if tcpHostNum := errType.GetContext().HostNum; tcpHostNum != nil { + validation.AppendTcpHostWarning( + t.report.GetTcpHostReports()[*tcpHostNum], + getWarningType(errType.GetError()), + fmt.Sprintf("listener %s: %s", t.parentListener.GetName(), errType.Error())) + break + } + // hostNum was not provided, so just report as an error + fallthrough + case validation.ErrorLevels_ERROR: + reportTcpListenerError(errType) + } + // if the error is not of ErrorWithKnownLevel type, report it + // as an error on the TcpListener + default: + reportTcpListenerError(errType) + } + } + + if merr, ok := err.(*multierror.Error); ok { + for _, unwrappedErr := range merr.WrappedErrors() { + reportError(unwrappedErr) + } + } else { + reportError(err) + } +} + func (t *tcpFilterChainTranslator) ComputeFilterChains(params plugins.Params) []*plugins.ExtendedFilterChain { var filterChains []*envoy_config_listener_v3.FilterChain @@ -54,9 +112,7 @@ func (t *tcpFilterChainTranslator) ComputeFilterChains(params plugins.Params) [] for _, plug := range t.plugins { pluginFilterChains, err := plug.CreateTcpFilterChains(params, t.parentListener, t.listener) if err != nil { - validation.AppendTCPListenerError(t.report, - validationapi.TcpListenerReport_Error_ProcessingError, - fmt.Sprintf("listener %s: %s", t.parentListener.GetName(), err.Error())) + t.reportCreateTcpFilterChainsError(err) continue } diff --git a/projects/gloo/pkg/utils/validation/proxy_validation.go b/projects/gloo/pkg/utils/validation/proxy_validation.go index 18320a48b00..f2defc9af1d 100644 --- a/projects/gloo/pkg/utils/validation/proxy_validation.go +++ b/projects/gloo/pkg/utils/validation/proxy_validation.go @@ -16,6 +16,59 @@ var ( RouteIdentifierTxt = "Route Name" ) +const ( + ErrorLevels_WARNING string = "WARNING" + ErrorLevels_ERROR string = "ERROR" +) + +// ErrorLevelContext carries additional information to be passed in the +// ErrorWithKnownLevel object +type ErrorLevelContext struct { + // A given TCP listener can have multiple TCP hosts; HostNum provides the + // numerical index of the host on the listener associated with the error to + // be reported + HostNum *int +} + +// Types implementing ErrorWithKnownLevel are able to report on the severity of +// the error they describe by evaluating ErrorLevel() +type ErrorWithKnownLevel interface { + error + // The severity of the error - should return either ErrorLevels_WARNING or + // ErrorLevels_ERROR + ErrorLevel() string + // Additional contextual information required to report the error/warning + GetContext() ErrorLevelContext + // The instance of the error itself + GetError() error +} + +// TcpHostWarning implements ErrorWithKnownLevel; it is intended to allow +// reporting certain errors as warnings and others as errors, and provides the +// necessary context required for reporting errors as such +type TcpHostWarning struct { + Err error + ErrLevel string + Context ErrorLevelContext +} + +func (tcpHostWarning *TcpHostWarning) ErrorLevel() string { + return tcpHostWarning.ErrLevel +} + +func (tcpHostWarning *TcpHostWarning) Error() string { + return fmt.Sprintf("TcpHost error: %v", tcpHostWarning.Err) +} + +func (tcpHostWarning *TcpHostWarning) GetContext() ErrorLevelContext { + return tcpHostWarning.Context +} + +// return the instance of the Error this object is wrapping +func (tcpHostWarning *TcpHostWarning) GetError() error { + return tcpHostWarning.Err +} + func MakeReport(proxy *v1.Proxy) *validation.ProxyReport { listeners := proxy.GetListeners() listenerReports := make([]*validation.ListenerReport, len(listeners)) @@ -198,6 +251,21 @@ func GetTcpHostErr(tcpHost *validation.TcpHostReport) []error { return errs } +// Extract, format and return all warnings on this TcpHost instance as a list +// of strings +func GetTcpHostWarning(tcpHost *validation.TcpHostReport) []string { + var warnings []string + appendWarning := func(level, errType, reason string) { + warnings = append(warnings, fmt.Sprintf("%v Warning: %v. Reason: %v", level, errType, reason)) + } + + for _, warning := range tcpHost.GetWarnings() { + appendWarning("TcpHost", warning.GetType().String(), warning.GetReason()) + } + + return warnings +} + func GetProxyError(proxyRpt *validation.ProxyReport) error { var errs []error for _, listener := range proxyRpt.GetListenerReports() { @@ -286,6 +354,10 @@ func GetProxyWarning(proxyRpt *validation.ProxyReport) []string { } } } + for _, tcpHostReport := range utils.GetTcpHostReportsFromListenerReport(listenerReport) { + warnings = append(warnings, GetTcpHostWarning(tcpHostReport)...) + } + } return warnings @@ -312,8 +384,8 @@ func AppendHTTPListenerError(httpListenerReport *validation.HttpListenerReport, }) } -func AppendTCPListenerError(httpListenerReport *validation.TcpListenerReport, errType validation.TcpListenerReport_Error_Type, reason string) { - httpListenerReport.Errors = append(httpListenerReport.GetErrors(), &validation.TcpListenerReport_Error{ +func AppendTCPListenerError(tcpListenerReport *validation.TcpListenerReport, errType validation.TcpListenerReport_Error_Type, reason string) { + tcpListenerReport.Errors = append(tcpListenerReport.GetErrors(), &validation.TcpListenerReport_Error{ Type: errType, Reason: reason, }) @@ -332,3 +404,10 @@ func AppendRouteWarning(routeReport *validation.RouteReport, errType validation. Reason: reason, }) } + +func AppendTcpHostWarning(tcpHostReport *validation.TcpHostReport, errType validation.TcpHostReport_Warning_Type, reason string) { + tcpHostReport.Warnings = append(tcpHostReport.GetWarnings(), &validation.TcpHostReport_Warning{ + Type: errType, + Reason: reason, + }) +} diff --git a/projects/gloo/pkg/utils/vhosts.go b/projects/gloo/pkg/utils/vhosts.go index ba2f09d94e0..19ebfc13669 100644 --- a/projects/gloo/pkg/utils/vhosts.go +++ b/projects/gloo/pkg/utils/vhosts.go @@ -31,6 +31,31 @@ func GetVirtualHostsForListener(listener *v1.Listener) []*v1.VirtualHost { return virtualHosts } +// Given any supported listener type, returns the TcpHost report objects that +// are used for error/warning reporting +func GetTcpHostReportsFromListenerReport(listenerReport *validation.ListenerReport) []*validation.TcpHostReport { + var tcpHostReports []*validation.TcpHostReport + + switch listenerReportType := listenerReport.GetListenerTypeReport().(type) { + case *validation.ListenerReport_HttpListenerReport: + // HostReports are a tcp-only concept + case *validation.ListenerReport_TcpListenerReport: + tcpHostReports = append(tcpHostReports, listenerReportType.TcpListenerReport.GetTcpHostReports()...) + case *validation.ListenerReport_HybridListenerReport: + for _, matchedListenerReport := range listenerReportType.HybridListenerReport.GetMatchedListenerReports() { + if tcpListenerReport := matchedListenerReport.GetTcpListenerReport(); tcpListenerReport != nil { + tcpHostReports = append(tcpHostReports, tcpListenerReport.GetTcpHostReports()...) + } + } + case *validation.ListenerReport_AggregateListenerReport: + for _, tcpListenerReport := range listenerReportType.AggregateListenerReport.GetTcpListenerReports() { + tcpHostReports = append(tcpHostReports, tcpListenerReport.GetTcpHostReports()...) + } + } + + return tcpHostReports +} + func GetVhostReportsFromListenerReport(listenerReport *validation.ListenerReport) []*validation.VirtualHostReport { var virtualHostReports []*validation.VirtualHostReport diff --git a/projects/gloo/pkg/validation/server_test.go b/projects/gloo/pkg/validation/server_test.go index f356cb4d292..226c29f51f9 100644 --- a/projects/gloo/pkg/validation/server_test.go +++ b/projects/gloo/pkg/validation/server_test.go @@ -232,8 +232,8 @@ var _ = Describe("Validation Server", func() { validateProxyReport := func(proxyReport *validationgrpc.ProxyReport) { warnings := validation.GetProxyWarning(proxyReport) errors := validation.GetProxyError(proxyReport) - Expect(warnings).To(HaveLen(3)) - Expect(errors).To(HaveOccurred()) + Expect(warnings).To(HaveLen(4)) + Expect(errors).NotTo(HaveOccurred()) } JustBeforeEach(func() { @@ -327,8 +327,8 @@ var _ = Describe("Validation Server", func() { validateProxyReport := func(proxyReport *validationgrpc.ProxyReport) { warnings := validation.GetProxyWarning(proxyReport) errors := validation.GetProxyError(proxyReport) - Expect(warnings).To(HaveLen(3)) - Expect(errors).To(HaveOccurred()) + Expect(warnings).To(HaveLen(4)) + Expect(errors).NotTo(HaveOccurred()) } It("works with Validate", func() {