From aa6124105dcbe93bed61bc832440f07548fb36be Mon Sep 17 00:00:00 2001 From: Paul Lorenz Date: Tue, 13 Sep 2022 17:18:12 -0400 Subject: [PATCH 1/3] Update to usage v3. Adds circuit tags to usage. Fixes openziti/fabric#496 --- controller/db/terminator_store.go | 4 + controller/handler_ctrl/circuit_request.go | 47 +++- controller/network/circuit.go | 12 + controller/network/network.go | 14 +- controller/network/terminator.go | 4 + controller/xt/xt.go | 1 + event/usage.go | 37 ++- events/dispatcher.go | 1 + events/dispatcher_usage.go | 118 ++++++++- events/formatter.go | 21 ++ pb/ctrl_pb/ctrl.pb.go | 291 +++++++++++---------- pb/ctrl_pb/ctrl.proto | 1 + router/handler_ctrl/route.go | 51 +++- router/metrics/peekhandler.go | 19 +- router/xgress/ordering_test.go | 2 +- router/xgress/request.go | 4 +- router/xgress/xgress.go | 24 +- router/xgress_transport/dialer.go | 13 +- router/xgress_transport_udp/dialer.go | 14 +- version | 2 +- 20 files changed, 488 insertions(+), 192 deletions(-) diff --git a/controller/db/terminator_store.go b/controller/db/terminator_store.go index 2fe665aad..89e224fdb 100644 --- a/controller/db/terminator_store.go +++ b/controller/db/terminator_store.go @@ -90,6 +90,10 @@ func (entity *Terminator) GetPeerData() xt.PeerData { return entity.PeerData } +func (entity *Terminator) GetHostId() string { + return entity.HostId +} + func (entity *Terminator) LoadValues(_ boltz.CrudStore, bucket *boltz.TypedBucket) { entity.LoadBaseValues(bucket) entity.Service = bucket.GetStringOrError(FieldTerminatorService) diff --git a/controller/handler_ctrl/circuit_request.go b/controller/handler_ctrl/circuit_request.go index 6becbd782..0ce621641 100644 --- a/controller/handler_ctrl/circuit_request.go +++ b/controller/handler_ctrl/circuit_request.go @@ -17,6 +17,7 @@ package handler_ctrl import ( + "github.com/openziti/fabric/controller/xt" "time" "github.com/golang/protobuf/proto" @@ -60,7 +61,7 @@ func (h *circuitRequestHandler) HandleReceive(msg *channel.Message, ch channel.C } } log = log.WithField("serviceId", service) - if circuit, err := h.network.CreateCircuit(h.r, id, service, logcontext.NewContext(), time.Now().Add(network.DefaultNetworkOptionsRouteTimeout)); err == nil { + if circuit, err := h.network.CreateCircuit(h.newCircuitCreateParms(service, h.r, id)); err == nil { responseMsg := ctrl_msg.NewCircuitSuccessMsg(circuit.Id, circuit.Path.IngressId) responseMsg.ReplyTo(msg) @@ -94,3 +95,47 @@ func (h *circuitRequestHandler) HandleReceive(msg *channel.Message, ch channel.C log.Errorf("unexpected error (%s)", err) } } + +func (h *circuitRequestHandler) newCircuitCreateParms(serviceId string, sourceRouter *network.Router, clientId *identity.TokenId) network.CreateCircuitParams { + return &circuitParams{ + serviceId: serviceId, + sourceRouter: sourceRouter, + clientId: clientId, + ctx: logcontext.NewContext(), + deadline: time.Now().Add(h.network.GetOptions().RouteTimeout), + } +} + +type circuitParams struct { + serviceId string + sourceRouter *network.Router + clientId *identity.TokenId + ctx logcontext.Context + deadline time.Time +} + +func (self *circuitParams) GetServiceId() string { + return self.serviceId +} + +func (self *circuitParams) GetSourceRouter() *network.Router { + return self.sourceRouter +} + +func (self *circuitParams) GetClientId() *identity.TokenId { + return self.clientId +} + +func (self *circuitParams) GetCircuitTags(xt.CostedTerminator) map[string]string { + return map[string]string{ + "svcId": self.serviceId, + } +} + +func (self *circuitParams) GetLogContext() logcontext.Context { + return self.ctx +} + +func (self *circuitParams) GetDeadline() time.Time { + return self.deadline +} diff --git a/controller/network/circuit.go b/controller/network/circuit.go index 98128d63e..45113000c 100644 --- a/controller/network/circuit.go +++ b/controller/network/circuit.go @@ -19,7 +19,9 @@ package network import ( "github.com/openziti/fabric/controller/idgen" "github.com/openziti/fabric/controller/xt" + "github.com/openziti/fabric/logcontext" "github.com/openziti/foundation/v2/concurrenz" + "github.com/openziti/identity" "github.com/orcaman/concurrent-map/v2" "time" ) @@ -30,6 +32,7 @@ type Circuit struct { Service *Service Terminator xt.CostedTerminator Path *Path + Tags map[string]string Rerouting concurrenz.AtomicBoolean PeerData xt.PeerData CreatedAt time.Time @@ -96,3 +99,12 @@ func (self *circuitController) all() []*Circuit { func (self *circuitController) remove(circuit *Circuit) { self.circuits.Remove(circuit.Id) } + +type CreateCircuitParams interface { + GetServiceId() string + GetSourceRouter() *Router + GetClientId() *identity.TokenId + GetCircuitTags(terminator xt.CostedTerminator) map[string]string + GetLogContext() logcontext.Context + GetDeadline() time.Time +} diff --git a/controller/network/network.go b/controller/network/network.go index 2ca042729..16e54423a 100644 --- a/controller/network/network.go +++ b/controller/network/network.go @@ -407,7 +407,13 @@ func (network *Network) LinkChanged(l *Link) { }() } -func (network *Network) CreateCircuit(srcR *Router, clientId *identity.TokenId, service string, ctx logcontext.Context, deadline time.Time) (*Circuit, error) { +func (network *Network) CreateCircuit(params CreateCircuitParams) (*Circuit, error) { + srcR := params.GetSourceRouter() + clientId := params.GetClientId() + service := params.GetServiceId() + ctx := params.GetLogContext() + deadline := params.GetDeadline() + startTime := time.Now() instanceId, serviceId := parseInstanceIdAndService(service) @@ -453,15 +459,18 @@ func (network *Network) CreateCircuit(srcR *Router, clientId *identity.TokenId, return nil, pathErr } + // get circuit tags + tags := params.GetCircuitTags(terminator) + // 4a: Create Route Messages rms := path.CreateRouteMessages(attempt, circuitId, terminator, deadline) rms[len(rms)-1].Egress.PeerData = clientId.Data - for _, msg := range rms { msg.Context = &ctrl_pb.Context{ Fields: ctx.GetStringFields(), ChannelMask: ctx.GetChannelsMask(), } + msg.Tags = tags } // 5: Routing @@ -534,6 +543,7 @@ func (network *Network) CreateCircuit(srcR *Router, clientId *identity.TokenId, Terminator: terminator, PeerData: peerData, CreatedAt: time.Now(), + Tags: tags, } network.circuitController.add(circuit) creationTimespan := time.Since(startTime) diff --git a/controller/network/terminator.go b/controller/network/terminator.go index cfb46ece9..31277a83c 100644 --- a/controller/network/terminator.go +++ b/controller/network/terminator.go @@ -79,6 +79,10 @@ func (entity *Terminator) GetPeerData() xt.PeerData { return entity.PeerData } +func (entity *Terminator) GetHostId() string { + return entity.HostId +} + func (entity *Terminator) toBolt() *db.Terminator { precedence := xt.Precedences.Default.String() if entity.Precedence != nil { diff --git a/controller/xt/xt.go b/controller/xt/xt.go index 4881c16b9..ee1c9f0a7 100644 --- a/controller/xt/xt.go +++ b/controller/xt/xt.go @@ -42,6 +42,7 @@ type Terminator interface { GetAddress() string GetPeerData() PeerData GetCreatedAt() time.Time + GetHostId() string } type PeerData map[uint32][]byte diff --git a/event/usage.go b/event/usage.go index 0d21d2cdc..903daf96e 100644 --- a/event/usage.go +++ b/event/usage.go @@ -8,14 +8,15 @@ const ( ) type UsageEvent struct { - Namespace string `json:"namespace"` - Version uint32 `json:"version"` - EventType string `json:"event_type"` - SourceId string `json:"source_id"` - CircuitId string `json:"circuit_id"` - Usage uint64 `json:"usage"` - IntervalStartUTC int64 `json:"interval_start_utc"` - IntervalLength uint64 `json:"interval_length"` + Namespace string `json:"namespace"` + Version uint32 `json:"version"` + EventType string `json:"event_type"` + SourceId string `json:"source_id"` + CircuitId string `json:"circuit_id"` + Usage uint64 `json:"usage"` + IntervalStartUTC int64 `json:"interval_start_utc"` + IntervalLength uint64 `json:"interval_length"` + Tags map[string]string `json:"tags"` } func (event *UsageEvent) String() string { @@ -26,3 +27,23 @@ func (event *UsageEvent) String() string { type UsageEventHandler interface { AcceptUsageEvent(event *UsageEvent) } + +type UsageEventV3 struct { + Namespace string `json:"namespace"` + Version uint32 `json:"version"` + SourceId string `json:"source_id"` + CircuitId string `json:"circuit_id"` + Usage map[string]uint64 `json:"usage"` + IntervalStartUTC int64 `json:"interval_start_utc"` + IntervalLength uint64 `json:"interval_length"` + Tags map[string]string `json:"tags"` +} + +func (event *UsageEventV3) String() string { + return fmt.Sprintf("source=%v session=%v usage=%v intervalStart=%v intervalLength=%v", + event.SourceId, event.CircuitId, event.Usage, event.IntervalStartUTC, event.IntervalLength) +} + +type UsageEventV3Handler interface { + AcceptUsageEventV3(event *UsageEventV3) +} diff --git a/events/dispatcher.go b/events/dispatcher.go index 613cf686a..c4914aaae 100644 --- a/events/dispatcher.go +++ b/events/dispatcher.go @@ -57,6 +57,7 @@ type Dispatcher struct { serviceEventHandlers concurrenz.CopyOnWriteSlice[event.ServiceEventHandler] terminatorEventHandlers concurrenz.CopyOnWriteSlice[event.TerminatorEventHandler] usageEventHandlers concurrenz.CopyOnWriteSlice[event.UsageEventHandler] + usageEventV3Handlers concurrenz.CopyOnWriteSlice[event.UsageEventV3Handler] metricsMappers concurrenz.CopyOnWriteSlice[event.MetricsMapper] diff --git a/events/dispatcher_usage.go b/events/dispatcher_usage.go index 00845fab4..f6a80717c 100644 --- a/events/dispatcher_usage.go +++ b/events/dispatcher_usage.go @@ -31,6 +31,14 @@ func (self *Dispatcher) RemoveUsageEventHandler(handler event.UsageEventHandler) self.usageEventHandlers.Delete(handler) } +func (self *Dispatcher) AddUsageEventV3Handler(handler event.UsageEventV3Handler) { + self.usageEventV3Handlers.Append(handler) +} + +func (self *Dispatcher) RemoveUsageEventV3Handler(handler event.UsageEventV3Handler) { + self.usageEventV3Handlers.Delete(handler) +} + func (self *Dispatcher) AcceptUsageEvent(event *event.UsageEvent) { go func() { for _, handler := range self.usageEventHandlers.Value() { @@ -39,13 +47,38 @@ func (self *Dispatcher) AcceptUsageEvent(event *event.UsageEvent) { }() } -func (self *Dispatcher) registerUsageEventHandler(val interface{}, _ map[interface{}]interface{}) error { - handler, ok := val.(event.UsageEventHandler) - if !ok { - return errors.Errorf("type %v doesn't implement github.com/openziti/fabric/event/UsageEventHandler interface.", reflect.TypeOf(val)) +func (self *Dispatcher) AcceptUsageEventV3(event *event.UsageEventV3) { + go func() { + for _, handler := range self.usageEventV3Handlers.Value() { + handler.AcceptUsageEventV3(event) + } + }() +} + +func (self *Dispatcher) registerUsageEventHandler(val interface{}, config map[interface{}]interface{}) error { + version := 2 + + if configVal, found := config["version"]; found { + if intVal, ok := configVal.(int); ok { + version = intVal + } } - self.AddUsageEventHandler(handler) + if version == 2 { + handler, ok := val.(event.UsageEventHandler) + if !ok { + return errors.Errorf("type %v doesn't implement github.com/openziti/fabric/event/UsageEventHandler interface.", reflect.TypeOf(val)) + } + self.AddUsageEventHandler(handler) + } else if version == 3 { + handler, ok := val.(event.UsageEventV3Handler) + if !ok { + return errors.Errorf("type %v doesn't implement github.com/openziti/fabric/event/UsageEventV3Handler interface.", reflect.TypeOf(val)) + } + self.AddUsageEventV3Handler(handler) + } else { + return errors.Errorf("unsupported usage version: %v", version) + } return nil } @@ -60,20 +93,77 @@ type usageEventAdapter struct { } func (self *usageEventAdapter) AcceptMetricsMsg(message *metrics_pb.MetricsMessage) { - for name, interval := range message.IntervalCounters { - for _, bucket := range interval.Buckets { - for circuitId, usage := range bucket.Values { - evt := &event.UsageEvent{ + if len(self.dispatcher.usageEventHandlers.Value()) > 0 { + for name, interval := range message.IntervalCounters { + for _, bucket := range interval.Buckets { + for circuitId, usage := range bucket.Values { + evt := &event.UsageEvent{ + Namespace: event.UsageEventsNs, + Version: event.UsageEventsVersion, + EventType: name, + SourceId: message.SourceId, + CircuitId: circuitId, + Usage: usage, + IntervalStartUTC: bucket.IntervalStartUTC, + IntervalLength: interval.IntervalLength, + } + self.dispatcher.AcceptUsageEvent(evt) + } + } + } + for _, interval := range message.UsageCounters { + for circuitId, bucket := range interval.Buckets { + for usageType, usage := range bucket.Values { + evt := &event.UsageEvent{ + Namespace: event.UsageEventsNs, + Version: event.UsageEventsVersion, + EventType: "usage." + usageType, + SourceId: message.SourceId, + CircuitId: circuitId, + Usage: usage, + IntervalStartUTC: interval.IntervalStartUTC, + IntervalLength: interval.IntervalLength, + Tags: bucket.Tags, + } + self.dispatcher.AcceptUsageEvent(evt) + } + } + } + } + + if len(self.dispatcher.usageEventV3Handlers.Value()) > 0 { + for name, interval := range message.IntervalCounters { + for _, bucket := range interval.Buckets { + for circuitId, usage := range bucket.Values { + evt := &event.UsageEventV3{ + Namespace: event.UsageEventsNs, + Version: 3, + SourceId: message.SourceId, + CircuitId: circuitId, + Usage: map[string]uint64{ + name: usage, + }, + IntervalStartUTC: bucket.IntervalStartUTC, + IntervalLength: interval.IntervalLength, + } + self.dispatcher.AcceptUsageEventV3(evt) + } + } + } + + for _, interval := range message.UsageCounters { + for circuitId, bucket := range interval.Buckets { + evt := &event.UsageEventV3{ Namespace: event.UsageEventsNs, - Version: event.UsageEventsVersion, - EventType: name, + Version: 3, SourceId: message.SourceId, CircuitId: circuitId, - Usage: usage, - IntervalStartUTC: bucket.IntervalStartUTC, + Usage: bucket.Values, + IntervalStartUTC: interval.IntervalStartUTC, IntervalLength: interval.IntervalLength, + Tags: bucket.Tags, } - self.dispatcher.AcceptUsageEvent(evt) + self.dispatcher.AcceptUsageEventV3(evt) } } } diff --git a/events/formatter.go b/events/formatter.go index add906b39..89584b760 100644 --- a/events/formatter.go +++ b/events/formatter.go @@ -105,6 +105,12 @@ func (event *JsonUsageEvent) WriteTo(output io.Writer) error { return marshalJson(event, output) } +type JsonUsageEventV3 event.UsageEventV3 + +func (event *JsonUsageEventV3) WriteTo(output io.Writer) error { + return marshalJson(event, output) +} + func NewJsonFormatter(queueDepth int, output io.Writer) *JsonFormatter { return &JsonFormatter{ BaseFormatter: BaseFormatter{ @@ -146,6 +152,10 @@ func (formatter *JsonFormatter) AcceptUsageEvent(evt *event.UsageEvent) { formatter.AcceptLoggingEvent((*JsonUsageEvent)(evt)) } +func (formatter *JsonFormatter) AcceptUsageEventV3(evt *event.UsageEventV3) { + formatter.AcceptLoggingEvent((*JsonUsageEventV3)(evt)) +} + type PlainTextCircuitEvent event.CircuitEvent func (self *PlainTextCircuitEvent) WriteTo(output io.Writer) error { @@ -182,6 +192,13 @@ func (self *PlainTextUsageEvent) WriteTo(output io.Writer) error { return err } +type PlainTextUsageEventV3 event.UsageEventV3 + +func (self *PlainTextUsageEventV3) WriteTo(output io.Writer) error { + _, err := output.Write([]byte((*event.UsageEventV3)(self).String())) + return err +} + type PlainTextServiceEvent event.ServiceEvent func (self *PlainTextServiceEvent) WriteTo(output io.Writer) error { @@ -244,6 +261,10 @@ func (formatter *PlainTextFormatter) AcceptUsageEvent(evt *event.UsageEvent) { formatter.AcceptLoggingEvent((*PlainTextUsageEvent)(evt)) } +func (formatter *PlainTextFormatter) AcceptUsageEventV3(evt *event.UsageEventV3) { + formatter.AcceptLoggingEvent((*PlainTextUsageEventV3)(evt)) +} + var histogramBuckets = map[string]string{"p50": "0.50", "p75": "0.75", "p95": "0.95", "p99": "0.99", "p999": "0.999", "p9999": "0.9999"} type PrometheusMetricsEvent event.MetricsEvent diff --git a/pb/ctrl_pb/ctrl.pb.go b/pb/ctrl_pb/ctrl.pb.go index 4ee53cb45..d39cbbfed 100644 --- a/pb/ctrl_pb/ctrl.pb.go +++ b/pb/ctrl_pb/ctrl.pb.go @@ -1186,12 +1186,13 @@ type Route struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - CircuitId string `protobuf:"bytes,1,opt,name=circuitId,proto3" json:"circuitId,omitempty"` - Attempt uint32 `protobuf:"varint,2,opt,name=attempt,proto3" json:"attempt,omitempty"` - Egress *Route_Egress `protobuf:"bytes,3,opt,name=egress,proto3" json:"egress,omitempty"` - Forwards []*Route_Forward `protobuf:"bytes,4,rep,name=forwards,proto3" json:"forwards,omitempty"` - Context *Context `protobuf:"bytes,5,opt,name=context,proto3" json:"context,omitempty"` - Timeout uint64 `protobuf:"varint,6,opt,name=timeout,proto3" json:"timeout,omitempty"` + CircuitId string `protobuf:"bytes,1,opt,name=circuitId,proto3" json:"circuitId,omitempty"` + Attempt uint32 `protobuf:"varint,2,opt,name=attempt,proto3" json:"attempt,omitempty"` + Egress *Route_Egress `protobuf:"bytes,3,opt,name=egress,proto3" json:"egress,omitempty"` + Forwards []*Route_Forward `protobuf:"bytes,4,rep,name=forwards,proto3" json:"forwards,omitempty"` + Context *Context `protobuf:"bytes,5,opt,name=context,proto3" json:"context,omitempty"` + Timeout uint64 `protobuf:"varint,6,opt,name=timeout,proto3" json:"timeout,omitempty"` + Tags map[string]string `protobuf:"bytes,7,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *Route) Reset() { @@ -1268,6 +1269,13 @@ func (x *Route) GetTimeout() uint64 { return 0 } +func (x *Route) GetTags() map[string]string { + if x != nil { + return x.Tags + } + return nil +} + type Unroute struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1878,7 +1886,7 @@ type InspectResponse_InspectValue struct { func (x *InspectResponse_InspectValue) Reset() { *x = InspectResponse_InspectValue{} if protoimpl.UnsafeEnabled { - mi := &file_ctrl_proto_msgTypes[30] + mi := &file_ctrl_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1891,7 +1899,7 @@ func (x *InspectResponse_InspectValue) String() string { func (*InspectResponse_InspectValue) ProtoMessage() {} func (x *InspectResponse_InspectValue) ProtoReflect() protoreflect.Message { - mi := &file_ctrl_proto_msgTypes[30] + mi := &file_ctrl_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2055,7 +2063,7 @@ var file_ctrl_proto_rawDesc = []byte{ 0x73, 0x6b, 0x1a, 0x39, 0x0a, 0x0b, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd8, 0x04, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc4, 0x05, 0x0a, 0x05, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, @@ -2071,120 +2079,127 @@ var file_ctrl_proto_rawDesc = []byte{ 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, - 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x1a, 0xe1, 0x01, 0x0a, 0x06, 0x45, 0x67, 0x72, 0x65, - 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x18, 0x0a, 0x07, - 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, - 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x08, 0x70, 0x65, 0x65, 0x72, - 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x7a, 0x69, 0x74, - 0x69, 0x2e, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, - 0x45, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x3b, - 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x7b, 0x0a, 0x07, 0x46, - 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x72, 0x63, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x72, 0x63, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x73, 0x74, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x73, 0x74, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x30, 0x0a, 0x07, 0x64, 0x73, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x63, - 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, - 0x07, 0x64, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x22, 0x39, 0x0a, 0x07, 0x55, 0x6e, 0x72, 0x6f, - 0x75, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x49, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x49, - 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6e, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, - 0x6e, 0x6f, 0x77, 0x22, 0x3a, 0x0a, 0x0e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, - 0xc1, 0x01, 0x0a, 0x0f, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, - 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x42, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x63, 0x74, 0x72, - 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x1a, 0x38, 0x0a, 0x0c, 0x49, 0x6e, 0x73, - 0x70, 0x65, 0x63, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x22, 0x48, 0x0a, 0x0a, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x4c, 0x69, 0x6e, - 0x6b, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x69, 0x6e, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x6c, 0x69, 0x6e, 0x6b, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x69, 0x6e, - 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x4e, 0x0a, - 0x0c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x12, 0x1a, 0x0a, - 0x08, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x69, 0x6e, - 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x5c, 0x0a, - 0x08, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, - 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x73, 0x74, 0x54, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x08, 0x63, 0x6f, 0x73, 0x74, 0x54, 0x61, 0x67, 0x73, 0x22, 0x41, 0x0a, 0x09, 0x4c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x34, 0x0a, 0x09, 0x6c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x7a, 0x69, - 0x74, 0x69, 0x2e, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x2a, 0x98, - 0x04, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, - 0x0a, 0x04, 0x5a, 0x65, 0x72, 0x6f, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x12, 0x43, 0x69, 0x72, 0x63, - 0x75, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xe8, - 0x07, 0x12, 0x0d, 0x0a, 0x08, 0x44, 0x69, 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x10, 0xea, 0x07, - 0x12, 0x16, 0x0a, 0x11, 0x4c, 0x69, 0x6e, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, - 0x64, 0x54, 0x79, 0x70, 0x65, 0x10, 0xeb, 0x07, 0x12, 0x0e, 0x0a, 0x09, 0x46, 0x61, 0x75, 0x6c, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xec, 0x07, 0x12, 0x0e, 0x0a, 0x09, 0x52, 0x6f, 0x75, 0x74, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xed, 0x07, 0x12, 0x10, 0x0a, 0x0b, 0x55, 0x6e, 0x72, 0x6f, - 0x75, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xee, 0x07, 0x12, 0x10, 0x0a, 0x0b, 0x4d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x54, 0x79, 0x70, 0x65, 0x10, 0xef, 0x07, 0x12, 0x20, 0x0a, 0x1b, - 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x50, 0x69, 0x70, 0x65, 0x54, 0x72, 0x61, 0x63, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf0, 0x07, 0x12, 0x13, - 0x0a, 0x0e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, - 0x10, 0xf2, 0x07, 0x12, 0x20, 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, - 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x10, 0xf3, 0x07, 0x12, 0x20, 0x0a, 0x1b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, - 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x54, 0x79, 0x70, 0x65, 0x10, 0xf4, 0x07, 0x12, 0x17, 0x0a, 0x12, 0x49, 0x6e, 0x73, 0x70, 0x65, - 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf5, 0x07, - 0x12, 0x18, 0x0a, 0x13, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf6, 0x07, 0x12, 0x23, 0x0a, 0x1e, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf9, 0x07, 0x12, - 0x20, 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, - 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xfa, - 0x07, 0x12, 0x13, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x4c, 0x69, 0x6e, 0x6b, 0x54, - 0x79, 0x70, 0x65, 0x10, 0xfb, 0x07, 0x12, 0x11, 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x54, 0x79, 0x70, 0x65, 0x10, 0xfc, 0x07, 0x12, 0x1c, 0x0a, 0x17, 0x43, 0x69, 0x72, - 0x63, 0x75, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x54, 0x79, 0x70, 0x65, 0x10, 0x8a, 0x08, 0x12, 0x14, 0x0a, 0x0f, 0x52, 0x6f, 0x75, 0x74, 0x65, - 0x72, 0x4c, 0x69, 0x6e, 0x6b, 0x73, 0x54, 0x79, 0x70, 0x65, 0x10, 0x8b, 0x08, 0x12, 0x15, 0x0a, - 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, - 0x65, 0x10, 0x8c, 0x08, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, - 0x73, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x10, 0x0a, 0x2a, 0x35, 0x0a, 0x0c, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x11, 0x0a, 0x0d, 0x55, 0x6e, 0x75, - 0x73, 0x65, 0x64, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, - 0x4e, 0x65, 0x77, 0x43, 0x74, 0x72, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x10, 0x01, - 0x2a, 0x3d, 0x0a, 0x14, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x72, - 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, - 0x64, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x02, 0x2a, - 0x52, 0x0a, 0x0c, 0x46, 0x61, 0x75, 0x6c, 0x74, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, - 0x10, 0x0a, 0x0c, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x46, 0x61, 0x75, 0x6c, 0x74, 0x10, - 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x45, 0x67, 0x72, 0x65, 0x73, 0x73, 0x46, 0x61, 0x75, 0x6c, 0x74, - 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4c, 0x69, 0x6e, 0x6b, 0x46, 0x61, 0x75, 0x6c, 0x74, 0x10, - 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x46, 0x61, 0x75, 0x6c, - 0x74, 0x10, 0x03, 0x2a, 0x28, 0x0a, 0x08, 0x44, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x09, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x72, 0x74, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x45, 0x6e, - 0x64, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x69, 0x6e, 0x6b, 0x10, 0x02, 0x42, 0x27, 0x5a, - 0x25, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65, 0x6e, - 0x7a, 0x69, 0x74, 0x69, 0x2f, 0x66, 0x61, 0x62, 0x72, 0x69, 0x63, 0x2f, 0x70, 0x62, 0x2f, 0x63, - 0x74, 0x72, 0x6c, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x31, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, + 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x63, 0x74, 0x72, + 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x1a, 0xe1, 0x01, 0x0a, 0x06, 0x45, + 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, + 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, + 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x08, 0x70, + 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, + 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x6f, 0x75, + 0x74, 0x65, 0x2e, 0x45, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, + 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, + 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x7b, + 0x0a, 0x07, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x72, 0x63, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, + 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x73, 0x74, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, + 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x30, 0x0a, 0x07, 0x64, 0x73, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x7a, 0x69, 0x74, + 0x69, 0x2e, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x07, 0x64, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x1a, 0x37, 0x0a, 0x09, 0x54, + 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x39, 0x0a, 0x07, 0x55, 0x6e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x49, 0x64, 0x12, 0x10, 0x0a, + 0x03, 0x6e, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x6e, 0x6f, 0x77, 0x22, + 0x3a, 0x0a, 0x0e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0xc1, 0x01, 0x0a, 0x0f, + 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x73, 0x12, 0x42, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, + 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x1a, 0x38, 0x0a, 0x0c, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, + 0x48, 0x0a, 0x0a, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x4c, 0x69, 0x6e, 0x6b, 0x12, 0x16, 0x0a, + 0x06, 0x6c, 0x69, 0x6e, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, + 0x69, 0x6e, 0x6b, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, + 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x69, 0x6e, + 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x4e, 0x0a, 0x0c, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x79, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x75, + 0x74, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x75, + 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, + 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x69, 0x6e, + 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x5c, 0x0a, 0x08, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, + 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x63, + 0x6f, 0x73, 0x74, 0x54, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x63, + 0x6f, 0x73, 0x74, 0x54, 0x61, 0x67, 0x73, 0x22, 0x41, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x65, 0x72, 0x73, 0x12, 0x34, 0x0a, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x63, + 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, + 0x09, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x2a, 0x98, 0x04, 0x0a, 0x0b, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x5a, 0x65, + 0x72, 0x6f, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x12, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xe8, 0x07, 0x12, 0x0d, 0x0a, + 0x08, 0x44, 0x69, 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x10, 0xea, 0x07, 0x12, 0x16, 0x0a, 0x11, + 0x4c, 0x69, 0x6e, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x79, 0x70, + 0x65, 0x10, 0xeb, 0x07, 0x12, 0x0e, 0x0a, 0x09, 0x46, 0x61, 0x75, 0x6c, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x10, 0xec, 0x07, 0x12, 0x0e, 0x0a, 0x09, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x10, 0xed, 0x07, 0x12, 0x10, 0x0a, 0x0b, 0x55, 0x6e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x10, 0xee, 0x07, 0x12, 0x10, 0x0a, 0x0b, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x54, 0x79, 0x70, 0x65, 0x10, 0xef, 0x07, 0x12, 0x20, 0x0a, 0x1b, 0x54, 0x6f, 0x67, 0x67, + 0x6c, 0x65, 0x50, 0x69, 0x70, 0x65, 0x54, 0x72, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf0, 0x07, 0x12, 0x13, 0x0a, 0x0e, 0x54, 0x72, + 0x61, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf2, 0x07, 0x12, + 0x20, 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, + 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf3, + 0x07, 0x12, 0x20, 0x0a, 0x1b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, + 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, + 0x10, 0xf4, 0x07, 0x12, 0x17, 0x0a, 0x12, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf5, 0x07, 0x12, 0x18, 0x0a, 0x13, + 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x10, 0xf6, 0x07, 0x12, 0x23, 0x0a, 0x1e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf9, 0x07, 0x12, 0x20, 0x0a, 0x1b, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xfa, 0x07, 0x12, 0x13, 0x0a, + 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x4c, 0x69, 0x6e, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x10, + 0xfb, 0x07, 0x12, 0x11, 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x54, 0x79, + 0x70, 0x65, 0x10, 0xfc, 0x07, 0x12, 0x1c, 0x0a, 0x17, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, + 0x10, 0x8a, 0x08, 0x12, 0x14, 0x0a, 0x0f, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x4c, 0x69, 0x6e, + 0x6b, 0x73, 0x54, 0x79, 0x70, 0x65, 0x10, 0x8b, 0x08, 0x12, 0x15, 0x0a, 0x10, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x79, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x10, 0x8c, 0x08, + 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x10, 0x0a, 0x2a, 0x35, 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x11, 0x0a, 0x0d, 0x55, 0x6e, 0x75, 0x73, 0x65, 0x64, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x43, + 0x74, 0x72, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x10, 0x01, 0x2a, 0x3d, 0x0a, 0x14, + 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, + 0x65, 0x6e, 0x63, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x10, + 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x10, 0x01, 0x12, + 0x0a, 0x0a, 0x06, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x02, 0x2a, 0x52, 0x0a, 0x0c, 0x46, + 0x61, 0x75, 0x6c, 0x74, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x10, 0x0a, 0x0c, 0x49, + 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x46, 0x61, 0x75, 0x6c, 0x74, 0x10, 0x00, 0x12, 0x0f, 0x0a, + 0x0b, 0x45, 0x67, 0x72, 0x65, 0x73, 0x73, 0x46, 0x61, 0x75, 0x6c, 0x74, 0x10, 0x01, 0x12, 0x0d, + 0x0a, 0x09, 0x4c, 0x69, 0x6e, 0x6b, 0x46, 0x61, 0x75, 0x6c, 0x74, 0x10, 0x02, 0x12, 0x10, 0x0a, + 0x0c, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x46, 0x61, 0x75, 0x6c, 0x74, 0x10, 0x03, 0x2a, + 0x28, 0x0a, 0x08, 0x44, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x09, 0x0a, 0x05, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x45, 0x6e, 0x64, 0x10, 0x01, 0x12, + 0x08, 0x0a, 0x04, 0x4c, 0x69, 0x6e, 0x6b, 0x10, 0x02, 0x42, 0x27, 0x5a, 0x25, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x7a, 0x69, 0x74, 0x69, + 0x2f, 0x66, 0x61, 0x62, 0x72, 0x69, 0x63, 0x2f, 0x70, 0x62, 0x2f, 0x63, 0x74, 0x72, 0x6c, 0x5f, + 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2200,7 +2215,7 @@ func file_ctrl_proto_rawDescGZIP() []byte { } var file_ctrl_proto_enumTypes = make([]protoimpl.EnumInfo, 5) -var file_ctrl_proto_msgTypes = make([]protoimpl.MessageInfo, 31) +var file_ctrl_proto_msgTypes = make([]protoimpl.MessageInfo, 32) var file_ctrl_proto_goTypes = []interface{}{ (ContentType)(0), // 0: ziti.ctrl.pb.ContentType (SettingTypes)(0), // 1: ziti.ctrl.pb.SettingTypes @@ -2236,8 +2251,9 @@ var file_ctrl_proto_goTypes = []interface{}{ nil, // 31: ziti.ctrl.pb.Context.FieldsEntry (*Route_Egress)(nil), // 32: ziti.ctrl.pb.Route.Egress (*Route_Forward)(nil), // 33: ziti.ctrl.pb.Route.Forward - nil, // 34: ziti.ctrl.pb.Route.Egress.PeerDataEntry - (*InspectResponse_InspectValue)(nil), // 35: ziti.ctrl.pb.InspectResponse.InspectValue + nil, // 34: ziti.ctrl.pb.Route.TagsEntry + nil, // 35: ziti.ctrl.pb.Route.Egress.PeerDataEntry + (*InspectResponse_InspectValue)(nil), // 36: ziti.ctrl.pb.InspectResponse.InspectValue } var file_ctrl_proto_depIdxs = []int32{ 27, // 0: ziti.ctrl.pb.Settings.data:type_name -> ziti.ctrl.pb.Settings.DataEntry @@ -2253,15 +2269,16 @@ var file_ctrl_proto_depIdxs = []int32{ 32, // 10: ziti.ctrl.pb.Route.egress:type_name -> ziti.ctrl.pb.Route.Egress 33, // 11: ziti.ctrl.pb.Route.forwards:type_name -> ziti.ctrl.pb.Route.Forward 18, // 12: ziti.ctrl.pb.Route.context:type_name -> ziti.ctrl.pb.Context - 35, // 13: ziti.ctrl.pb.InspectResponse.values:type_name -> ziti.ctrl.pb.InspectResponse.InspectValue - 25, // 14: ziti.ctrl.pb.Listeners.listeners:type_name -> ziti.ctrl.pb.Listener - 34, // 15: ziti.ctrl.pb.Route.Egress.peerData:type_name -> ziti.ctrl.pb.Route.Egress.PeerDataEntry - 4, // 16: ziti.ctrl.pb.Route.Forward.dstType:type_name -> ziti.ctrl.pb.DestType - 17, // [17:17] is the sub-list for method output_type - 17, // [17:17] is the sub-list for method input_type - 17, // [17:17] is the sub-list for extension type_name - 17, // [17:17] is the sub-list for extension extendee - 0, // [0:17] is the sub-list for field type_name + 34, // 13: ziti.ctrl.pb.Route.tags:type_name -> ziti.ctrl.pb.Route.TagsEntry + 36, // 14: ziti.ctrl.pb.InspectResponse.values:type_name -> ziti.ctrl.pb.InspectResponse.InspectValue + 25, // 15: ziti.ctrl.pb.Listeners.listeners:type_name -> ziti.ctrl.pb.Listener + 35, // 16: ziti.ctrl.pb.Route.Egress.peerData:type_name -> ziti.ctrl.pb.Route.Egress.PeerDataEntry + 4, // 17: ziti.ctrl.pb.Route.Forward.dstType:type_name -> ziti.ctrl.pb.DestType + 18, // [18:18] is the sub-list for method output_type + 18, // [18:18] is the sub-list for method input_type + 18, // [18:18] is the sub-list for extension type_name + 18, // [18:18] is the sub-list for extension extendee + 0, // [0:18] is the sub-list for field type_name } func init() { file_ctrl_proto_init() } @@ -2570,7 +2587,7 @@ func file_ctrl_proto_init() { return nil } } - file_ctrl_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + file_ctrl_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*InspectResponse_InspectValue); i { case 0: return &v.state @@ -2589,7 +2606,7 @@ func file_ctrl_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_ctrl_proto_rawDesc, NumEnums: 5, - NumMessages: 31, + NumMessages: 32, NumExtensions: 0, NumServices: 0, }, diff --git a/pb/ctrl_pb/ctrl.proto b/pb/ctrl_pb/ctrl.proto index 27947b651..4627924e3 100644 --- a/pb/ctrl_pb/ctrl.proto +++ b/pb/ctrl_pb/ctrl.proto @@ -169,6 +169,7 @@ message Route { repeated Forward forwards = 4; Context context = 5; uint64 timeout = 6; + map tags = 7; } message Unroute { diff --git a/router/handler_ctrl/route.go b/router/handler_ctrl/route.go index 3656712cf..173470a44 100644 --- a/router/handler_ctrl/route.go +++ b/router/handler_ctrl/route.go @@ -157,8 +157,6 @@ func (rh *routeHandler) connectEgress(msg *channel.Message, attempt int, ch chan if factory, err := xgress.GlobalRegistry().Factory(route.Egress.Binding); err == nil { if dialer, err := factory.CreateDialer(rh.dialerCfg[route.Egress.Binding]); err == nil { - circuitId := &identity.TokenId{Token: route.CircuitId, Data: route.Egress.PeerData} - bindHandler := handler_xgress.NewBindHandler( handler_xgress.NewReceiveHandler(rh.forwarder), handler_xgress.NewCloseHandler(rh.ctrl, rh.forwarder), @@ -169,7 +167,8 @@ func (rh *routeHandler) connectEgress(msg *channel.Message, attempt int, ch chan time.Sleep(rh.forwarder.Options.XgressDialDwellTime) } - if peerData, err := dialer.Dial(route.Egress.Destination, circuitId, xgress.Address(route.Egress.Address), bindHandler, ctx, deadline); err == nil { + params := newDialParams(route, bindHandler, ctx, deadline) + if peerData, err := dialer.Dial(params); err == nil { rh.completeRoute(msg, attempt, route, peerData, log) } else { var errCode byte @@ -198,3 +197,49 @@ func (rh *routeHandler) connectEgress(msg *channel.Message, attempt int, ch chan rh.fail(msg, attempt, route, errors.Wrapf(err, "error creating route for [c/%s]", route.CircuitId), errCode, log) } } + +func newDialParams(route *ctrl_pb.Route, bindHandler xgress.BindHandler, logContext logcontext.Context, deadline time.Time) *dialParams { + return &dialParams{ + Route: route, + circuitId: &identity.TokenId{Token: route.CircuitId, Data: route.Egress.PeerData}, + bindHandler: bindHandler, + logContext: logContext, + deadline: deadline, + } +} + +type dialParams struct { + *ctrl_pb.Route + circuitId *identity.TokenId + bindHandler xgress.BindHandler + logContext logcontext.Context + deadline time.Time +} + +func (self *dialParams) GetDestination() string { + return self.Egress.Destination +} + +func (self *dialParams) GetCircuitId() *identity.TokenId { + return self.circuitId +} + +func (self *dialParams) GetAddress() xgress.Address { + return xgress.Address(self.Egress.Address) +} + +func (self *dialParams) GetBindHandler() xgress.BindHandler { + return self.bindHandler +} + +func (self *dialParams) GetLogContext() logcontext.Context { + return self.logContext +} + +func (self *dialParams) GetDeadline() time.Time { + return self.deadline +} + +func (self *dialParams) GetCircuitTags() map[string]string { + return self.Tags +} diff --git a/router/metrics/peekhandler.go b/router/metrics/peekhandler.go index 4c706dd56..98c17f7e4 100644 --- a/router/metrics/peekhandler.go +++ b/router/metrics/peekhandler.go @@ -171,10 +171,7 @@ func NewXgressPeekHandler(registry metrics.UsageRegistry) xgress.PeekHandler { egressTxMsgSizeHistogram: egressTxMsgSizeHistogram, egressRxMsgSizeHistogram: egressRxMsgSizeHistogram, - ingressRxUsageCounter: registry.IntervalCounter("usage.ingress.rx", time.Minute), - ingressTxUsageCounter: registry.IntervalCounter("usage.ingress.tx", time.Minute), - egressRxUsageCounter: registry.IntervalCounter("usage.egress.rx", time.Minute), - egressTxUsageCounter: registry.IntervalCounter("usage.egress.tx", time.Minute), + usageCounter: registry.UsageCounter("usage", time.Minute), } } @@ -193,21 +190,18 @@ type xgressPeekHandler struct { egressTxMsgSizeHistogram metrics.Histogram egressRxMsgSizeHistogram metrics.Histogram - ingressRxUsageCounter metrics.IntervalCounter - ingressTxUsageCounter metrics.IntervalCounter - egressRxUsageCounter metrics.IntervalCounter - egressTxUsageCounter metrics.IntervalCounter + usageCounter metrics.UsageCounter } func (handler *xgressPeekHandler) Rx(x *xgress.Xgress, payload *xgress.Payload) { msgSize := int64(len(payload.Data)) if x.Originator() == xgress.Initiator { - handler.ingressRxUsageCounter.Update(x.CircuitId(), time.Now(), uint64(msgSize)) + handler.usageCounter.Update(x, "ingress.rx", time.Now(), uint64(msgSize)) handler.ingressRxMsgMeter.Mark(1) handler.ingressRxBytesMeter.Mark(msgSize) handler.ingressRxMsgSizeHistogram.Update(msgSize) } else { - handler.egressRxUsageCounter.Update(x.CircuitId(), time.Now(), uint64(msgSize)) + handler.usageCounter.Update(x, "egress.rx", time.Now(), uint64(msgSize)) handler.egressRxMsgMeter.Mark(1) handler.egressRxBytesMeter.Mark(msgSize) handler.egressRxMsgSizeHistogram.Update(msgSize) @@ -217,12 +211,13 @@ func (handler *xgressPeekHandler) Rx(x *xgress.Xgress, payload *xgress.Payload) func (handler *xgressPeekHandler) Tx(x *xgress.Xgress, payload *xgress.Payload) { msgSize := int64(len(payload.Data)) if x.Originator() == xgress.Initiator { - handler.ingressTxUsageCounter.Update(x.CircuitId(), time.Now(), uint64(msgSize)) + handler.usageCounter.Update(x, "ingress.tx", time.Now(), uint64(msgSize)) + handler.ingressTxMsgMeter.Mark(1) handler.ingressTxBytesMeter.Mark(msgSize) handler.ingressTxMsgSizeHistogram.Update(msgSize) } else { - handler.egressTxUsageCounter.Update(x.CircuitId(), time.Now(), uint64(msgSize)) + handler.usageCounter.Update(x, "egress.tx", time.Now(), uint64(msgSize)) handler.egressTxMsgMeter.Mark(1) handler.egressTxBytesMeter.Mark(msgSize) handler.egressTxMsgSizeHistogram.Update(msgSize) diff --git a/router/xgress/ordering_test.go b/router/xgress/ordering_test.go index e51d97e2e..056ca3389 100644 --- a/router/xgress/ordering_test.go +++ b/router/xgress/ordering_test.go @@ -73,7 +73,7 @@ func Test_Ordering(t *testing.T) { closeNotify: make(chan struct{}), } - x := NewXgress(&identity.TokenId{Token: "test"}, "test", conn, Initiator, DefaultOptions()) + x := NewXgress(&identity.TokenId{Token: "test"}, "test", conn, Initiator, DefaultOptions(), nil) x.receiveHandler = noopReceiveHandler{} go x.tx() diff --git a/router/xgress/request.go b/router/xgress/request.go index 5fe27809c..e14b2e536 100644 --- a/router/xgress/request.go +++ b/router/xgress/request.go @@ -191,7 +191,9 @@ func CreateCircuit(ctrl CtrlChannel, peer Connection, request *Request, bindHand return &Response{Success: false, Message: err.Error()} } - x := NewXgress(circuitInfo.CircuitId, circuitInfo.Address, peer, Initiator, options) + x := NewXgress(circuitInfo.CircuitId, circuitInfo.Address, peer, Initiator, options, map[string]string{ + "serviceId": request.ServiceId, + }) bindHandler.HandleXgressBind(x) x.Start() diff --git a/router/xgress/xgress.go b/router/xgress/xgress.go index 81b09e263..a012df603 100644 --- a/router/xgress/xgress.go +++ b/router/xgress/xgress.go @@ -56,8 +56,18 @@ type Listener interface { Close() error } +type DialParams interface { + GetDestination() string + GetCircuitId() *identity.TokenId + GetAddress() Address + GetBindHandler() BindHandler + GetLogContext() logcontext.Context + GetDeadline() time.Time + GetCircuitTags() map[string]string +} + type Dialer interface { - Dial(destination string, circuitId *identity.TokenId, address Address, bindHandler BindHandler, context logcontext.Context, deadline time.Time) (xt.PeerData, error) + Dial(params DialParams) (xt.PeerData, error) IsTerminatorValid(id string, destination string) bool } @@ -132,9 +142,18 @@ type Xgress struct { peekHandlers []PeekHandler flags concurrenz.AtomicBitSet timeOfLastRxFromLink int64 + tags map[string]string } -func NewXgress(circuitId *identity.TokenId, address Address, peer Connection, originator Originator, options *Options) *Xgress { +func (self *Xgress) GetIntervalId() string { + return self.circuitId +} + +func (self *Xgress) GetTags() map[string]string { + return self.tags +} + +func NewXgress(circuitId *identity.TokenId, address Address, peer Connection, originator Originator, options *Options, tags map[string]string) *Xgress { result := &Xgress{ circuitId: circuitId.Token, address: address, @@ -146,6 +165,7 @@ func NewXgress(circuitId *identity.TokenId, address Address, peer Connection, or rxSequence: 0, linkRxBuffer: NewLinkReceiveBuffer(), timeOfLastRxFromLink: info.NowInMilliseconds(), + tags: tags, } result.payloadBuffer = NewLinkSendBuffer(result) return result diff --git a/router/xgress_transport/dialer.go b/router/xgress_transport/dialer.go index 14ab6c928..60c1bcb76 100644 --- a/router/xgress_transport/dialer.go +++ b/router/xgress_transport/dialer.go @@ -50,8 +50,11 @@ func newDialer(id *identity.TokenId, ctrl xgress.CtrlChannel, options *xgress.Op return txd, nil } -func (txd *dialer) Dial(destination string, circuitId *identity.TokenId, address xgress.Address, bindHandler xgress.BindHandler, ctx logcontext.Context, deadline time.Time) (xt.PeerData, error) { - log := pfxlog.ChannelLogger(logcontext.EstablishPath).Wire(ctx). +func (txd *dialer) Dial(params xgress.DialParams) (xt.PeerData, error) { + destination := params.GetDestination() + circuitId := params.GetCircuitId() + + log := pfxlog.ChannelLogger(logcontext.EstablishPath).Wire(params.GetLogContext()). WithField("binding", "transport"). WithField("destination", destination) @@ -63,7 +66,7 @@ func (txd *dialer) Dial(destination string, circuitId *identity.TokenId, address log.Debug("dialing") to := txd.options.ConnectTimeout - timeToDeadline := time.Until(deadline) + timeToDeadline := time.Until(params.GetDeadline()) if timeToDeadline > 0 && timeToDeadline < to { to = timeToDeadline } @@ -75,8 +78,8 @@ func (txd *dialer) Dial(destination string, circuitId *identity.TokenId, address log.Infof("successful connection to %v from %v", destination, peer.LocalAddr()) conn := &transportXgressConn{Conn: peer} - x := xgress.NewXgress(circuitId, address, conn, xgress.Terminator, txd.options) - bindHandler.HandleXgressBind(x) + x := xgress.NewXgress(circuitId, params.GetAddress(), conn, xgress.Terminator, txd.options, params.GetCircuitTags()) + params.GetBindHandler().HandleXgressBind(x) x.Start() peerData := xt.PeerData{ diff --git a/router/xgress_transport_udp/dialer.go b/router/xgress_transport_udp/dialer.go index cd9f81b92..8732d4069 100644 --- a/router/xgress_transport_udp/dialer.go +++ b/router/xgress_transport_udp/dialer.go @@ -29,8 +29,12 @@ import ( "github.com/openziti/identity" ) -func (txd *dialer) Dial(destination string, circuitId *identity.TokenId, address xgress.Address, bindHandler xgress.BindHandler, ctx logcontext.Context, deadline time.Time) (xt.PeerData, error) { - log := pfxlog.ChannelLogger(logcontext.EstablishPath).Wire(ctx). +func (txd *dialer) Dial(params xgress.DialParams) (xt.PeerData, error) { + destination := params.GetDestination() + circuitId := params.GetCircuitId() + address := params.GetAddress() + + log := pfxlog.ChannelLogger(logcontext.EstablishPath).Wire(params.GetLogContext()). WithField("binding", "transport_udp"). WithField("destination", destination) @@ -41,7 +45,7 @@ func (txd *dialer) Dial(destination string, circuitId *identity.TokenId, address } log.Debugf("dialing packet address [%v]", packetAddress) - deadlineTo := time.Until(deadline) + deadlineTo := time.Until(params.GetDeadline()) var conn net.Conn if deadlineTo > 0 { conn, err = net.DialTimeout(packetAddress.Network(), packetAddress.Address(), deadlineTo) @@ -54,8 +58,8 @@ func (txd *dialer) Dial(destination string, circuitId *identity.TokenId, address log.Infof("bound on [%v]", conn.LocalAddr()) - x := xgress.NewXgress(circuitId, address, newPacketConn(conn), xgress.Terminator, txd.options) - bindHandler.HandleXgressBind(x) + x := xgress.NewXgress(circuitId, address, newPacketConn(conn), xgress.Terminator, txd.options, params.GetCircuitTags()) + params.GetBindHandler().HandleXgressBind(x) x.Start() return nil, nil diff --git a/version b/version index caa4836d8..9f4eca259 100644 --- a/version +++ b/version @@ -1 +1 @@ -0.19 +0.20 From aafa99ae6f4f3a5578f14ba25e65d47decc41a05 Mon Sep 17 00:00:00 2001 From: Paul Lorenz Date: Wed, 14 Sep 2022 12:32:55 -0400 Subject: [PATCH 2/3] Fix some linting issues. svcId -> serviceId --- controller/api_impl/context.go | 6 +++--- controller/api_impl/metrics-api.go | 4 ++-- controller/config.go | 4 ++-- controller/handler_ctrl/circuit_request.go | 4 ++-- controller/handler_ctrl/verify_router.go | 2 +- controller/network/command_test.go | 9 --------- 6 files changed, 10 insertions(+), 19 deletions(-) diff --git a/controller/api_impl/context.go b/controller/api_impl/context.go index d28f8fe48..05444c84c 100644 --- a/controller/api_impl/context.go +++ b/controller/api_impl/context.go @@ -20,15 +20,15 @@ import ( "bytes" "github.com/openziti/fabric/controller/api" "github.com/openziti/fabric/controller/idgen" - "io/ioutil" + "io" "net/http" ) func NewRequestContext(rw http.ResponseWriter, r *http.Request) api.RequestContext { rid := idgen.New() - body, _ := ioutil.ReadAll(r.Body) - r.Body = ioutil.NopCloser(bytes.NewReader(body)) + body, _ := io.ReadAll(r.Body) + r.Body = io.NopCloser(bytes.NewReader(body)) requestContext := &api.RequestContextImpl{ Id: rid, diff --git a/controller/api_impl/metrics-api.go b/controller/api_impl/metrics-api.go index 9255ac358..76f8c1fc9 100644 --- a/controller/api_impl/metrics-api.go +++ b/controller/api_impl/metrics-api.go @@ -28,8 +28,8 @@ import ( "github.com/openziti/fabric/controller/xmgmt" "github.com/openziti/identity" "github.com/openziti/xweb/v2" - "io/ioutil" "net/http" + "os" "strings" ) @@ -77,7 +77,7 @@ func NewMetricsApiHandler(n *network.Network, options map[interface{}]interface{ if value, found := options["scrapeCert"]; found { if f, ok := value.(string); ok { - p, err := ioutil.ReadFile(f) + p, err := os.ReadFile(f) if nil != err { return nil, err } diff --git a/controller/config.go b/controller/config.go index 168b078ef..5fa126a38 100644 --- a/controller/config.go +++ b/controller/config.go @@ -33,7 +33,7 @@ import ( "github.com/openziti/transport/v2" "github.com/pkg/errors" "gopkg.in/yaml.v2" - "io/ioutil" + "os" "strings" "time" ) @@ -92,7 +92,7 @@ func (config *Config) Configure(sub config.Subconfig) error { } func LoadConfig(path string) (*Config, error) { - cfgBytes, err := ioutil.ReadFile(path) + cfgBytes, err := os.ReadFile(path) if err != nil { return nil, err } diff --git a/controller/handler_ctrl/circuit_request.go b/controller/handler_ctrl/circuit_request.go index 0ce621641..6112f7d4d 100644 --- a/controller/handler_ctrl/circuit_request.go +++ b/controller/handler_ctrl/circuit_request.go @@ -18,9 +18,9 @@ package handler_ctrl import ( "github.com/openziti/fabric/controller/xt" + "google.golang.org/protobuf/proto" "time" - "github.com/golang/protobuf/proto" "github.com/michaelquigley/pfxlog" "github.com/openziti/channel" "github.com/openziti/fabric/controller/network" @@ -128,7 +128,7 @@ func (self *circuitParams) GetClientId() *identity.TokenId { func (self *circuitParams) GetCircuitTags(xt.CostedTerminator) map[string]string { return map[string]string{ - "svcId": self.serviceId, + "serviceId": self.serviceId, } } diff --git a/controller/handler_ctrl/verify_router.go b/controller/handler_ctrl/verify_router.go index 99aa4ce90..83f90c302 100644 --- a/controller/handler_ctrl/verify_router.go +++ b/controller/handler_ctrl/verify_router.go @@ -17,12 +17,12 @@ package handler_ctrl import ( - "github.com/golang/protobuf/proto" "github.com/michaelquigley/pfxlog" "github.com/openziti/channel" "github.com/openziti/fabric/controller/network" "github.com/openziti/fabric/handler_common" "github.com/openziti/fabric/pb/ctrl_pb" + "google.golang.org/protobuf/proto" ) type verifyRouterHandler struct { diff --git a/controller/network/command_test.go b/controller/network/command_test.go index 8ad798ab3..09af77236 100644 --- a/controller/network/command_test.go +++ b/controller/network/command_test.go @@ -1,7 +1,6 @@ package network import ( - "github.com/golang/protobuf/proto" "github.com/openziti/fabric/controller/command" "github.com/openziti/fabric/controller/db" "github.com/openziti/fabric/controller/models" @@ -10,14 +9,6 @@ import ( "testing" ) -func testFactory[T proto.Message](msgType T) func([]byte) (T, error) { - return func(b []byte) (T, error) { - var msg T = proto.MessageV1(proto.MessageV2(msgType).ProtoReflect().New()).(T) - err := proto.Unmarshal(b, msg) - return msg, err - } -} - func TestProtobufFactory(t *testing.T) { ctx := db.NewTestContext(t) defer ctx.Cleanup() From 9bf630e5aea81b8fb1234ec094c3f18c41ca8429 Mon Sep 17 00:00:00 2001 From: Paul Lorenz Date: Fri, 16 Sep 2022 11:30:55 -0400 Subject: [PATCH 3/3] Convert fabric usage to usage counters as well --- router/metrics/peekhandler.go | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/router/metrics/peekhandler.go b/router/metrics/peekhandler.go index 98c17f7e4..4b6934abb 100644 --- a/router/metrics/peekhandler.go +++ b/router/metrics/peekhandler.go @@ -41,8 +41,7 @@ func NewChannelPeekHandler(linkId string, registry metrics.UsageRegistry) channe linkRxMsgMeter := registry.Meter("link." + linkId + ".rx.msgrate") linkRxMsgSizeHistogram := registry.Histogram("link." + linkId + ".rx.msgsize") - usageRxCounter := registry.IntervalCounter("usage.fabric.rx", time.Minute) - usageTxCounter := registry.IntervalCounter("usage.fabric.tx", time.Minute) + usageCounter := registry.UsageCounter("fabricUsage", time.Minute) closeHook := func() { linkTxBytesMeter.Dispose() @@ -67,8 +66,7 @@ func NewChannelPeekHandler(linkId string, registry metrics.UsageRegistry) channe linkRxBytesMeter: linkRxBytesMeter, linkRxMsgMeter: linkRxMsgMeter, linkRxMsgSizeHistogram: linkRxMsgSizeHistogram, - usageRxCounter: usageRxCounter, - usageTxCounter: usageTxCounter, + usageCounter: usageCounter, closeHook: closeHook, } } @@ -89,8 +87,7 @@ type channelPeekHandler struct { linkTxMsgSizeHistogram metrics.Histogram linkRxMsgSizeHistogram metrics.Histogram - usageRxCounter metrics.IntervalCounter - usageTxCounter metrics.IntervalCounter + usageCounter metrics.UsageCounter closeHook func() } @@ -109,9 +106,9 @@ func (h *channelPeekHandler) Rx(msg *channel.Message, _ channel.Channel) { if msg.ContentType == int32(xgress.ContentTypePayloadType) { if payload, err := xgress.UnmarshallPayload(msg); err != nil { - pfxlog.Logger().Errorf("Failed to unmarshal payload. Error: %v", err) + pfxlog.Logger().WithError(err).Error("Failed to unmarshal payload") } else { - h.usageRxCounter.Update(payload.CircuitId, time.Now(), uint64(len(payload.Data))) + h.usageCounter.Update(circuitUsageSource(payload.CircuitId), "fabric.rx", time.Now(), uint64(len(payload.Data))) } } } @@ -127,9 +124,9 @@ func (h *channelPeekHandler) Tx(msg *channel.Message, _ channel.Channel) { if msg.ContentType == int32(xgress.ContentTypePayloadType) { if payload, err := xgress.UnmarshallPayload(msg); err != nil { - pfxlog.Logger().Errorf("Failed to unmarshal payload. Error: %v", err) + pfxlog.Logger().WithError(err).Error("Failed to unmarshal payload") } else { - h.usageTxCounter.Update(payload.CircuitId, time.Now(), uint64(len(payload.Data))) + h.usageCounter.Update(circuitUsageSource(payload.CircuitId), "fabric.tx", time.Now(), uint64(len(payload.Data))) } } } @@ -175,6 +172,16 @@ func NewXgressPeekHandler(registry metrics.UsageRegistry) xgress.PeekHandler { } } +type circuitUsageSource string + +func (c circuitUsageSource) GetIntervalId() string { + return string(c) +} + +func (c circuitUsageSource) GetTags() map[string]string { + return nil +} + type xgressPeekHandler struct { ingressTxBytesMeter metrics.Meter ingressTxMsgMeter metrics.Meter