From 0900e2460039469a96edfb4d8c6bd197fa272358 Mon Sep 17 00:00:00 2001 From: Paul Lorenz Date: Thu, 1 Feb 2024 14:18:03 -0500 Subject: [PATCH 1/7] Fix entity event processing panic. Fixes #1725 --- controller/events/dispatcher_entity_change.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/controller/events/dispatcher_entity_change.go b/controller/events/dispatcher_entity_change.go index 54e35874b..712660493 100644 --- a/controller/events/dispatcher_entity_change.go +++ b/controller/events/dispatcher_entity_change.go @@ -354,7 +354,7 @@ func (self *entityChangeEventFilter) AcceptEntityChangeEvent(evt *event.EntityCh return } - if *evt.IsParentEvent && !self.includeParentEvents { + if evt.IsParentEvent != nil && *evt.IsParentEvent && !self.includeParentEvents { return } } From 6c2088c5f5e08663dbd02d881966a203dd756861 Mon Sep 17 00:00:00 2001 From: Paul Lorenz Date: Thu, 1 Feb 2024 14:21:26 -0500 Subject: [PATCH 2/7] Fix some hosting logging. Fixes #1726 --- router/xgress_edge/hosted.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/router/xgress_edge/hosted.go b/router/xgress_edge/hosted.go index 09faf7bdf..e2c8e03ae 100644 --- a/router/xgress_edge/hosted.go +++ b/router/xgress_edge/hosted.go @@ -112,7 +112,7 @@ func (self *hostedServiceRegistry) scanForRetries() { } func (self *hostedServiceRegistry) tryEstablish(terminator *edgeTerminator) { - log := pfxlog.Logger().WithField("terminatorId", terminator.Id()). + log := pfxlog.Logger().WithField("terminatorId", terminator.terminatorId.Load()). WithField("token", terminator.token). WithField("state", terminator.state.Load().String()) @@ -233,10 +233,17 @@ func (self *hostedServiceRegistry) establishTerminatorWithRetry(terminator *edge return backoff.Permanent(fmt.Errorf("edge link is closed, stopping terminator creation for terminator %s", terminator.terminatorId.Load())) } - if state := terminator.state.Load(); state != TerminatorStateEstablishing { + + state := terminator.state.Load() + if state == TerminatorStateEstablished { // terminator already established + return nil + } + + if state != TerminatorStateEstablishing { return backoff.Permanent(fmt.Errorf("terminator state is %v, stopping terminator creation for terminator %s", state.String(), terminator.terminatorId.Load())) } + if terminator.terminatorId.Load() == "" { return backoff.Permanent(fmt.Errorf("terminator has been closed, stopping terminator creation")) } From 3aace85a97d7738fcb4f475cf55eff5255644733 Mon Sep 17 00:00:00 2001 From: Paul Lorenz Date: Fri, 2 Feb 2024 10:23:39 -0500 Subject: [PATCH 3/7] Refactor terminator state machine to be more like links state machine. Fixes #1733 Fixes #1734 --- common/pb/edge_cmd_pb/edge_cmd.pb.go | 2 +- common/pb/edge_ctrl_pb/edge_ctrl.pb.go | 8 +- common/pb/edge_ctrl_pb/edge_ctrl.proto | 1 + controller/command/rate_limiter.go | 9 + controller/command/rate_limiter_test.go | 9 + controller/config.go | 1 + .../handler_edge_ctrl/create_terminator_v2.go | 5 + go.mod | 8 +- go.sum | 18 +- router/xgress_edge/dialer.go | 7 - router/xgress_edge/fabric.go | 25 +- router/xgress_edge/factory.go | 5 +- router/xgress_edge/hosted.go | 236 +++++++++--------- router/xgress_edge/listener.go | 2 + router/xgress_edge/terminator_heap.go | 45 ++++ zititest/models/zrok-test/main.go | 18 +- zititest/zitilab/component_zrok_controller.go | 2 - zititest/zitilab/component_zrok_frontend.go | 11 - zititest/zitilab/component_zrok_looptest.go | 32 ++- 19 files changed, 262 insertions(+), 182 deletions(-) create mode 100644 router/xgress_edge/terminator_heap.go diff --git a/common/pb/edge_cmd_pb/edge_cmd.pb.go b/common/pb/edge_cmd_pb/edge_cmd.pb.go index 59347934e..b00cde58d 100644 --- a/common/pb/edge_cmd_pb/edge_cmd.pb.go +++ b/common/pb/edge_cmd_pb/edge_cmd.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.31.0 -// protoc v4.23.4 +// protoc v3.21.12 // source: edge_cmd.proto package edge_cmd_pb diff --git a/common/pb/edge_ctrl_pb/edge_ctrl.pb.go b/common/pb/edge_ctrl_pb/edge_ctrl.pb.go index 6d20665fc..58f08c066 100644 --- a/common/pb/edge_ctrl_pb/edge_ctrl.pb.go +++ b/common/pb/edge_ctrl_pb/edge_ctrl.pb.go @@ -381,6 +381,7 @@ const ( CreateTerminatorResult_Success CreateTerminatorResult = 0 CreateTerminatorResult_FailedIdConflict CreateTerminatorResult = 1 CreateTerminatorResult_FailedOther CreateTerminatorResult = 2 + CreateTerminatorResult_FailedBusy CreateTerminatorResult = 3 ) // Enum value maps for CreateTerminatorResult. @@ -389,11 +390,13 @@ var ( 0: "Success", 1: "FailedIdConflict", 2: "FailedOther", + 3: "FailedBusy", } CreateTerminatorResult_value = map[string]int32{ "Success": 0, "FailedIdConflict": 1, "FailedOther": 2, + "FailedBusy": 3, } ) @@ -4081,12 +4084,13 @@ var file_edge_ctrl_proto_rawDesc = []byte{ 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, 0x4c, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, + 0x64, 0x10, 0x02, 0x2a, 0x5c, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x49, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x10, - 0x02, 0x42, 0x2a, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x42, 0x75, 0x73, 0x79, 0x10, + 0x03, 0x42, 0x2a, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x7a, 0x69, 0x74, 0x69, 0x2f, 0x65, 0x64, 0x67, 0x65, 0x2f, 0x70, 0x62, 0x2f, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, diff --git a/common/pb/edge_ctrl_pb/edge_ctrl.proto b/common/pb/edge_ctrl_pb/edge_ctrl.proto index bce25d9de..72c672a30 100644 --- a/common/pb/edge_ctrl_pb/edge_ctrl.proto +++ b/common/pb/edge_ctrl_pb/edge_ctrl.proto @@ -241,6 +241,7 @@ enum CreateTerminatorResult { Success = 0; FailedIdConflict = 1; FailedOther = 2; + FailedBusy = 3; } message CreateTerminatorV2Response { diff --git a/controller/command/rate_limiter.go b/controller/command/rate_limiter.go index 9ddf08846..1ce31d186 100644 --- a/controller/command/rate_limiter.go +++ b/controller/command/rate_limiter.go @@ -18,6 +18,7 @@ package command import ( "fmt" + "github.com/openziti/foundation/v2/errorz" "github.com/openziti/metrics" "github.com/openziti/ziti/controller/apierror" "github.com/pkg/errors" @@ -372,3 +373,11 @@ type noOpRateLimitControl struct{} func (noOpRateLimitControl) Success() {} func (noOpRateLimitControl) Timeout() {} + +func WasRateLimited(err error) bool { + var apiErr *errorz.ApiError + if errors.As(err, &apiErr) { + return apiErr.Code == apierror.ServerTooManyRequestsCode + } + return false +} diff --git a/controller/command/rate_limiter_test.go b/controller/command/rate_limiter_test.go index 3e9692798..31937f71a 100644 --- a/controller/command/rate_limiter_test.go +++ b/controller/command/rate_limiter_test.go @@ -25,6 +25,7 @@ import ( "github.com/openziti/metrics" "github.com/openziti/sdk-golang/ziti" "github.com/openziti/ziti/controller/apierror" + "github.com/stretchr/testify/assert" "sync" "sync/atomic" "testing" @@ -146,3 +147,11 @@ func Test_AuthFlood(t *testing.T) { countdown.Wait() } + +func Test_WasApiRateLimited(t *testing.T) { + err := errors.New("hello") + assert.False(t, WasRateLimited(err)) + + err = apierror.NewTooManyUpdatesError() + assert.True(t, WasRateLimited(err)) +} diff --git a/controller/config.go b/controller/config.go index 43d6b46dc..62ca4bec5 100644 --- a/controller/config.go +++ b/controller/config.go @@ -462,6 +462,7 @@ func LoadConfig(path string) (*Config, error) { } } + controllerConfig.CommandRateLimiter.Enabled = true controllerConfig.CommandRateLimiter.QueueSize = command.DefaultLimiterSize if value, found := cfgmap["commandRateLimiter"]; found { diff --git a/controller/handler_edge_ctrl/create_terminator_v2.go b/controller/handler_edge_ctrl/create_terminator_v2.go index 119ef87e1..26e8a9d82 100644 --- a/controller/handler_edge_ctrl/create_terminator_v2.go +++ b/controller/handler_edge_ctrl/create_terminator_v2.go @@ -23,6 +23,7 @@ import ( "github.com/openziti/channel/v2/protobufs" "github.com/openziti/ziti/common" "github.com/openziti/ziti/common/pb/edge_ctrl_pb" + "github.com/openziti/ziti/controller/command" "github.com/openziti/ziti/controller/db" "github.com/openziti/ziti/controller/env" "github.com/openziti/ziti/controller/fields" @@ -153,6 +154,10 @@ func (self *createTerminatorV2Handler) CreateTerminatorV2(ctx *CreateTerminatorV return } } else { + if command.WasRateLimited(err) { + self.returnError(ctx, edge_ctrl_pb.CreateTerminatorResult_FailedBusy, err, logger) + return + } self.returnError(ctx, edge_ctrl_pb.CreateTerminatorResult_FailedOther, err, logger) return } diff --git a/go.mod b/go.mod index b0dd48b64..e528be485 100644 --- a/go.mod +++ b/go.mod @@ -47,14 +47,14 @@ require ( github.com/mitchellh/mapstructure v1.5.0 github.com/natefinch/lumberjack v2.0.0+incompatible github.com/openziti/agent v1.0.16 - github.com/openziti/channel/v2 v2.0.117 + github.com/openziti/channel/v2 v2.0.112 github.com/openziti/edge-api v0.26.10 github.com/openziti/foundation/v2 v2.0.36 github.com/openziti/identity v1.0.69 github.com/openziti/jwks v1.0.3 - github.com/openziti/metrics v1.2.43 + github.com/openziti/metrics v1.2.42 github.com/openziti/runzmd v1.0.37 - github.com/openziti/sdk-golang v0.22.21 + github.com/openziti/sdk-golang v0.22.4 github.com/openziti/secretstream v0.1.16 github.com/openziti/storage v0.2.28 github.com/openziti/transport/v2 v2.0.121 @@ -83,7 +83,7 @@ require ( golang.org/x/sync v0.6.0 golang.org/x/sys v0.16.0 golang.org/x/text v0.14.0 - google.golang.org/protobuf v1.32.0 + google.golang.org/protobuf v1.31.0 gopkg.in/AlecAivazis/survey.v1 v1.8.7 gopkg.in/resty.v1 v1.12.0 gopkg.in/square/go-jose.v2 v2.6.0 diff --git a/go.sum b/go.sum index 5b48fe567..9b2e84592 100644 --- a/go.sum +++ b/go.sum @@ -403,8 +403,6 @@ github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1 github.com/jedib0t/go-pretty/v6 v6.5.3 h1:GIXn6Er/anHTkVUoufs7ptEvxdD6KIhR7Axa2wYCPF0= github.com/jedib0t/go-pretty/v6 v6.5.3/go.mod h1:5LQIxa52oJ/DlDSLv0HEkWOFMDGoWkJb9ss5KqPpJBg= github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= -github.com/jeremija/gosubmit v0.2.7 h1:At0OhGCFGPXyjPYAsCchoBUhE099pcBXmsb4iZqROIc= -github.com/jeremija/gosubmit v0.2.7/go.mod h1:Ui+HS073lCFREXBbdfrJzMB57OI/bdxTiLtrDHHhFPI= github.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc= github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8= @@ -565,8 +563,8 @@ github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYr github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= github.com/openziti/agent v1.0.16 h1:9Saji+8hFE1NpzP2XzDhsVJbCrDlhixoLHfOpFt5Z+U= github.com/openziti/agent v1.0.16/go.mod h1:zfm53+PVWoGFzjGGgQdKby5749G6VRYHe+eQJmoVKy4= -github.com/openziti/channel/v2 v2.0.117 h1:9EUNJIA4NCosn+Uci0gYNiDMsGBX52Jd34wpziW+zPA= -github.com/openziti/channel/v2 v2.0.117/go.mod h1:RADBBOkbwpFMmbznU3bZmUsBB646seqZnQ7GPI6Chjg= +github.com/openziti/channel/v2 v2.0.112 h1:w7HYZ5RG+bLcsrGt19WjcEoogD9Qn0dLXYZJds1THGo= +github.com/openziti/channel/v2 v2.0.112/go.mod h1:abw0qwT0MzWvh1eI2P6D6CD17PRHL8EEo1d3DHCyCdM= github.com/openziti/dilithium v0.3.3 h1:PLgQ6PMNLSTzCFbX/h98cmudgz/cU6TmjdSv5NAPD8k= github.com/openziti/dilithium v0.3.3/go.mod h1:vsCjI2AU/hon9e+dLhUFbCNGesJDj2ASgkySOcpmvjo= github.com/openziti/edge-api v0.26.10 h1:LEDuJHZsExi0PBVO9iVuIdZWJ7eFo/i4TJhXoSFmfOU= @@ -577,12 +575,12 @@ github.com/openziti/identity v1.0.69 h1:wNgQomnv8ar2S1wge9jQK1jpqE2virOKKG8GyfTi github.com/openziti/identity v1.0.69/go.mod h1:+7hQNAG5nUUdz0165OubWpMHkP/ZVJB3nv9HUXXi9H8= github.com/openziti/jwks v1.0.3 h1:hf8wkb+Cg4nH/HM0KROFd7u+C3DkRVcFZJ7tDV+4icc= github.com/openziti/jwks v1.0.3/go.mod h1:t4xxq8vlXGsPn29kiQVnZBBDDnEoOFqtJoHibkJunQQ= -github.com/openziti/metrics v1.2.43 h1:DSrmpLhoA45DlLVNdKOn2lBfCM0/r6wKz+3SDXe8X7Y= -github.com/openziti/metrics v1.2.43/go.mod h1:+RY4avT60Vbxb9wyfvRD0msrARyYCB5+heb8VIZzCm8= +github.com/openziti/metrics v1.2.42 h1:JRRwIIRkcMj/a03lRM1xej+DZ44NNQde/2YU3juySSo= +github.com/openziti/metrics v1.2.42/go.mod h1:4f31ogWZzkHieDbpWeVhKiADa2GZeVlHILA0cqDbljw= github.com/openziti/runzmd v1.0.37 h1:qj2r9z4t7OAdmIXMdGbP9Su6TqA0bLdD2RMjJ71LRS0= github.com/openziti/runzmd v1.0.37/go.mod h1:eKhqJsGoLeDHex/o5Mw6TcNJxlVljafSVm7ZU+bX5G8= -github.com/openziti/sdk-golang v0.22.21 h1:rj8gCq9SPcRpStPX0GUL8X2vkCQNUn+nk2WbyY82b/Y= -github.com/openziti/sdk-golang v0.22.21/go.mod h1:w3M9yAVnW7IAU1dpYtiFB/mIYLiU7l4tB+c4coqWRwo= +github.com/openziti/sdk-golang v0.22.4 h1:W9HYVE5vvE3u4yhpL4ArF5z0iAlBwKWniBUmKgTHiF4= +github.com/openziti/sdk-golang v0.22.4/go.mod h1:ErUmL+w2QEvPHXDg4UMg6dfOLlFVJYbKmulq1D+mNpg= github.com/openziti/secretstream v0.1.16 h1:tVanF7OpJL1MJ1gvWaRlR2i+kAbrGsxr3q6EXFOS08U= github.com/openziti/secretstream v0.1.16/go.mod h1:bvjGBUW/0e5MzD5S3FW3rhGASRNWAi+kTkTENZ9qRDE= github.com/openziti/storage v0.2.28 h1:qHnsSF4RgQpT23hOXlwkAvJ0gO5PLmvTqyBy13dm3Rc= @@ -1291,8 +1289,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= -google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/AlecAivazis/survey.v1 v1.8.7 h1:oBJqtgsyBLg9K5FK9twNUbcPnbCPoh+R9a+7nag3qJM= gopkg.in/AlecAivazis/survey.v1 v1.8.7/go.mod h1:iBNOmqKz/NUbZx3bA+4hAGLRC7fSK7tgtVDT4tB22XA= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= diff --git a/router/xgress_edge/dialer.go b/router/xgress_edge/dialer.go index 27bdb094f..13a31b6c2 100644 --- a/router/xgress_edge/dialer.go +++ b/router/xgress_edge/dialer.go @@ -45,13 +45,6 @@ func (dialer *dialer) InspectTerminator(id string, destination string, fixInvali pfxlog.Logger().Debug("looking up hosted service conn") terminator, found := dialer.factory.hostedServices.Get(terminatorAddress) if found && terminator.terminatorId.Load() == id { - updated := terminator.state.CompareAndSwap(TerminatorStateEstablishing, TerminatorStateEstablished) || - terminator.state.CompareAndSwap(TerminatorStatePendingEstablishment, TerminatorStateEstablished) - - if updated { - dialer.factory.hostedServices.notifyTerminatorCreated(id) - } - result, err := terminator.inspect(fixInvalid) if err != nil { return true, err.Error() diff --git a/router/xgress_edge/fabric.go b/router/xgress_edge/fabric.go index 4d5c7c006..24b5bd1fa 100644 --- a/router/xgress_edge/fabric.go +++ b/router/xgress_edge/fabric.go @@ -27,6 +27,7 @@ import ( "github.com/pkg/errors" "io" "math" + "math/rand" "sync/atomic" "time" ) @@ -80,7 +81,29 @@ type edgeTerminator struct { v2 bool state concurrenz.AtomicValue[terminatorState] postValidate bool - notifyEstablished bool + nextAttempt time.Time + retryDelay time.Duration + establishActive atomic.Bool + createTime time.Time +} + +func (self *edgeTerminator) calculateRetry(queueFailed bool) { + retryDelay := time.Second + + if !queueFailed { + if self.retryDelay < time.Second { + self.retryDelay = time.Second + } else { + self.retryDelay = self.retryDelay * 2 + if self.retryDelay > 30*time.Second { + self.retryDelay = 30 * time.Second + } + } + retryDelay = self.retryDelay + } + + actualDelay := (float64(retryDelay.Milliseconds()) * 1.5) - float64(rand.Intn(int(retryDelay.Milliseconds()))) + self.nextAttempt = time.Now().Add(time.Millisecond * time.Duration(actualDelay)) } func (self *edgeTerminator) inspect(fixInvalidTerminators bool) (*edge.InspectResult, error) { diff --git a/router/xgress_edge/factory.go b/router/xgress_edge/factory.go index 20785b327..e2ff6de04 100644 --- a/router/xgress_edge/factory.go +++ b/router/xgress_edge/factory.go @@ -70,7 +70,10 @@ func (factory *Factory) BindChannel(binding channel.Binding) error { binding.AddTypedReceiveHandler(handler_edge_ctrl.NewExtendEnrollmentCertsHandler(factory.env.GetRouterId(), func() { factory.certChecker.CertsUpdated() })) - binding.AddReceiveHandlerF(int32(edge_ctrl_pb.ContentType_CreateTerminatorV2ResponseType), factory.hostedServices.HandleCreateTerminatorResponse) + binding.AddTypedReceiveHandler(&channel.AsyncFunctionReceiveAdapter{ + Type: int32(edge_ctrl_pb.ContentType_CreateTerminatorV2ResponseType), + Handler: factory.hostedServices.HandleCreateTerminatorResponse, + }) return nil } diff --git a/router/xgress_edge/hosted.go b/router/xgress_edge/hosted.go index e2c8e03ae..4580703e0 100644 --- a/router/xgress_edge/hosted.go +++ b/router/xgress_edge/hosted.go @@ -17,15 +17,14 @@ package xgress_edge import ( + "container/heap" "fmt" - "github.com/cenkalti/backoff/v4" "github.com/michaelquigley/pfxlog" "github.com/openziti/channel/v2" "github.com/openziti/channel/v2/protobufs" "github.com/openziti/sdk-golang/ziti/edge" "github.com/openziti/ziti/common/pb/edge_ctrl_pb" routerEnv "github.com/openziti/ziti/router/env" - cmap "github.com/orcaman/concurrent-map/v2" "github.com/pkg/errors" "github.com/sirupsen/logrus" "google.golang.org/protobuf/proto" @@ -35,22 +34,22 @@ import ( func newHostedServicesRegistry(env routerEnv.RouterEnv) *hostedServiceRegistry { result := &hostedServiceRegistry{ - services: sync.Map{}, - events: make(chan terminatorEvent), - env: env, - retriesPending: false, - waits: cmap.New[chan struct{}](), + services: sync.Map{}, + events: make(chan terminatorEvent), + env: env, + retriesPending: false, + terminatorQueue: &terminatorHeap{}, } go result.run() return result } type hostedServiceRegistry struct { - services sync.Map - events chan terminatorEvent - env routerEnv.RouterEnv - retriesPending bool - waits cmap.ConcurrentMap[string, chan struct{}] + services sync.Map + events chan terminatorEvent + env routerEnv.RouterEnv + retriesPending bool + terminatorQueue *terminatorHeap } type terminatorEvent interface { @@ -58,13 +57,16 @@ type terminatorEvent interface { } func (self *hostedServiceRegistry) run() { - retryTicker := time.NewTicker(50 * time.Millisecond) - defer retryTicker.Stop() + queueCheckTicker := time.NewTicker(100 * time.Millisecond) + defer queueCheckTicker.Stop() + + longQueueCheckTicker := time.NewTicker(time.Second) + defer longQueueCheckTicker.Stop() for { var retryChan <-chan time.Time if self.retriesPending { - retryChan = retryTicker.C + retryChan = queueCheckTicker.C } select { @@ -73,31 +75,66 @@ func (self *hostedServiceRegistry) run() { case event := <-self.events: event.handle(self) case <-retryChan: + self.evaluateLinkStateQueue() + case <-longQueueCheckTicker.C: self.scanForRetries() } } } +func (self *hostedServiceRegistry) evaluateLinkStateQueue() { + now := time.Now() + for len(*self.terminatorQueue) > 0 { + next := (*self.terminatorQueue)[0] + if now.Before(next.nextAttempt) { + return + } + heap.Pop(self.terminatorQueue) + self.evaluateTerminator(next) + } + self.retriesPending = false +} + type establishTerminatorEvent struct { terminator *edgeTerminator } func (self *establishTerminatorEvent) handle(registry *hostedServiceRegistry) { - registry.tryEstablish(self.terminator) + registry.evaluateTerminator(self.terminator) +} + +type calculateRetry struct { + terminator *edgeTerminator + queueFailed bool +} + +func (self *calculateRetry) handle(registry *hostedServiceRegistry) { + self.terminator.calculateRetry(self.queueFailed) + registry.retriesPending = true } func (self *hostedServiceRegistry) EstablishTerminator(terminator *edgeTerminator) { - event := &establishTerminatorEvent{ - terminator: terminator, - } - self.Put(terminator.terminatorId.Load(), terminator) + self.queue(&establishTerminatorEvent{ + terminator: terminator, + }) +} +func (self *hostedServiceRegistry) queue(event terminatorEvent) { select { - case <-self.env.GetCloseNotify(): - pfxlog.Logger().WithField("terminatorId", terminator.terminatorId.Load()). - Error("unable to establish terminator, hosted service registry has been shutdown") case self.events <- event: + case <-self.env.GetCloseNotify(): + pfxlog.Logger().Error("unable to queue terminator event, hosted service registry has been shutdown") + } +} + +func (self *hostedServiceRegistry) scheduleRetry(terminator *edgeTerminator, queueFailed bool) { + terminator.establishActive.Store(false) + if terminator.state.CompareAndSwap(TerminatorStateEstablished, TerminatorStatePendingEstablishment) { + self.queue(&calculateRetry{ + terminator: terminator, + queueFailed: queueFailed, + }) } } @@ -105,31 +142,12 @@ func (self *hostedServiceRegistry) scanForRetries() { self.services.Range(func(key, value any) bool { terminator := value.(*edgeTerminator) if terminator.state.Load() == TerminatorStatePendingEstablishment { - self.tryEstablish(terminator) + self.evaluateTerminator(terminator) } return true }) } -func (self *hostedServiceRegistry) tryEstablish(terminator *edgeTerminator) { - log := pfxlog.Logger().WithField("terminatorId", terminator.terminatorId.Load()). - WithField("token", terminator.token). - WithField("state", terminator.state.Load().String()) - - if !terminator.state.CompareAndSwap(TerminatorStatePendingEstablishment, TerminatorStateEstablishing) { - log.Info("terminator not pending, not going to try to establish") - return - } - - err := self.env.GetRateLimiterPool().QueueOrError(func() { - self.establishTerminatorWithRetry(terminator) - }) - if err != nil { - log.Info("rate limited: unable to queue to establish") - self.retriesPending = true - } -} - func (self *hostedServiceRegistry) Put(hostId string, conn *edgeTerminator) { self.services.Store(hostId, conn) } @@ -218,56 +236,45 @@ func (self *hostedServiceRegistry) getRelatedTerminators(sessionToken string, pr return result } -func (self *hostedServiceRegistry) establishTerminatorWithRetry(terminator *edgeTerminator) { +func (self *hostedServiceRegistry) evaluateTerminator(terminator *edgeTerminator) { log := logrus. WithField("terminatorId", terminator.terminatorId.Load()). + WithField("state", terminator.state.Load()). WithField("token", terminator.token) - if state := terminator.state.Load(); state != TerminatorStateEstablishing { - log.WithField("state", state.String()).Info("not attempting to establish terminator, not in establishing state") + if terminator.edgeClientConn.ch.IsClosed() { + log.Info("terminator sdk channel closed, not trying to establish") return } - operation := func() error { - if terminator.edgeClientConn.ch.IsClosed() { - return backoff.Permanent(fmt.Errorf("edge link is closed, stopping terminator creation for terminator %s", - terminator.terminatorId.Load())) - } - - state := terminator.state.Load() - if state == TerminatorStateEstablished { // terminator already established - return nil - } - - if state != TerminatorStateEstablishing { - return backoff.Permanent(fmt.Errorf("terminator state is %v, stopping terminator creation for terminator %s", - state.String(), terminator.terminatorId.Load())) - } - - if terminator.terminatorId.Load() == "" { - return backoff.Permanent(fmt.Errorf("terminator has been closed, stopping terminator creation")) - } - - err := self.establishTerminator(terminator) - if err != nil && terminator.state.Load() != TerminatorStateEstablishing { - return backoff.Permanent(err) - } - return err + if terminator.terminatorId.Load() == "" { + log.Info("terminator has been closed, not trying to establish") + return } - expBackoff := backoff.NewExponentialBackOff() - expBackoff.InitialInterval = 5 * time.Second - expBackoff.MaxInterval = 5 * time.Minute + tryEstablish := terminator.state.Load() == TerminatorStatePendingEstablishment && terminator.nextAttempt.Before(time.Now()) - if err := backoff.Retry(operation, expBackoff); err != nil { - log.WithError(err).Error("stopping attempts to establish terminator, see error") - } else if terminator.postValidate { - if result, err := terminator.inspect(true); err != nil { - log.WithError(err).Error("error validating terminator after create") - } else if result.Type != edge.ConnTypeBind { - log.WithError(err).Error("terminator invalid in sdk after create, closed") - } else { - log.Info("terminator validated successfully") + if tryEstablish && terminator.establishActive.CompareAndSwap(false, true) { + if !terminator.state.CompareAndSwap(TerminatorStatePendingEstablishment, TerminatorStateEstablishing) { + log.Infof("terminator in state %s, not pending establishment, not queueing", terminator.state.Load()) + return + } + + log.Info("queuing terminator to send create") + + err := self.env.GetRateLimiterPool().QueueOrError(func() { + defer func() { + self.scheduleRetry(terminator, false) + }() + + if err := self.establishTerminator(terminator); err != nil { + log.WithError(err).Error("error establishing terminator") + } + }) + + if err != nil { + log.Info("rate limited: unable to queue to establish") + self.scheduleRetry(terminator, true) } } } @@ -306,18 +313,7 @@ func (self *hostedServiceRegistry) establishTerminator(terminator *edgeTerminato log.Info("sending create terminator v2 request") - err := protobufs.MarshalTyped(request).WithTimeout(timeout).SendAndWaitForWire(ctrlCh) - if err != nil { - return err - } - - if self.waitForTerminatorCreated(terminatorId, 10*time.Second) { - return nil - } - - // return an error to indicate that we need to check if a response has come back after the next interval, - // and if not, re-send - return errors.Errorf("timeout waiting for response to create terminator request for terminator %v", terminator.terminatorId.Load()) + return protobufs.MarshalTyped(request).WithTimeout(timeout).SendAndWaitForWire(ctrlCh) } func (self *hostedServiceRegistry) HandleCreateTerminatorResponse(msg *channel.Message, _ channel.Channel) { @@ -338,47 +334,43 @@ func (self *hostedServiceRegistry) HandleCreateTerminatorResponse(msg *channel.M return } + log = log.WithField("lifetime", time.Since(terminator.createTime)) + + if response.Result == edge_ctrl_pb.CreateTerminatorResult_FailedBusy { + log.Info("controller too busy to handle create terminator, retrying later") + return + } + if response.Result != edge_ctrl_pb.CreateTerminatorResult_Success { terminator.close(true, response.Msg) return } if terminator.state.CompareAndSwap(TerminatorStateEstablishing, TerminatorStateEstablished) { - self.notifyTerminatorCreated(response.TerminatorId) log.Info("received terminator created notification") } else { log.Info("received additional terminator created notification") } - if terminator.notifyEstablished { - go func() { - notifyMsg := channel.NewMessage(edge.ContentTypeBindSuccess, nil) - notifyMsg.PutUint32Header(edge.ConnIdHeader, terminator.MsgChannel.Id()) - - if err := notifyMsg.WithTimeout(time.Second * 30).Send(terminator.MsgChannel.Channel); err != nil { - log.WithError(err).Error("failed to send bind success") - } - }() + isValid := true + if terminator.postValidate { + if result, err := terminator.inspect(true); err != nil { + log.WithError(err).Error("error validating terminator after create") + } else if result.Type != edge.ConnTypeBind { + log.WithError(err).Error("terminator invalid in sdk after create, closed") + isValid = false + } else { + log.Info("terminator validated successfully") + } } -} -func (self *hostedServiceRegistry) waitForTerminatorCreated(id string, timeout time.Duration) bool { - notifyC := make(chan struct{}) - defer self.waits.Remove(id) + if isValid && terminator.notifyEstablished { + notifyMsg := channel.NewMessage(edge.ContentTypeBindSuccess, nil) + notifyMsg.PutUint32Header(edge.ConnIdHeader, terminator.MsgChannel.Id()) - self.waits.Set(id, notifyC) - select { - case <-notifyC: - return true - case <-time.After(timeout): - return false - } -} - -func (self *hostedServiceRegistry) notifyTerminatorCreated(id string) { - notifyC, _ := self.waits.Get(id) - if notifyC != nil { - close(notifyC) + if err := notifyMsg.WithTimeout(time.Second * 30).Send(terminator.MsgChannel.Channel); err != nil { + log.WithError(err).Error("failed to send bind success") + } } } diff --git a/router/xgress_edge/listener.go b/router/xgress_edge/listener.go index ae3e8c515..4d18789d3 100644 --- a/router/xgress_edge/listener.go +++ b/router/xgress_edge/listener.go @@ -260,6 +260,7 @@ func (self *edgeClientConn) processBindV1(req *channel.Message, ch channel.Chann edgeClientConn: self, token: token, assignIds: assignIds, + createTime: time.Now(), } // need to remove session remove listener on close @@ -402,6 +403,7 @@ func (self *edgeClientConn) processBindV2(req *channel.Message, ch channel.Chann v2: true, postValidate: postValidate, notifyEstablished: notifyEstablished, + createTime: time.Now(), } terminator.terminatorId.Store(terminatorId) terminator.state.Store(TerminatorStatePendingEstablishment) diff --git a/router/xgress_edge/terminator_heap.go b/router/xgress_edge/terminator_heap.go new file mode 100644 index 000000000..da0e72b00 --- /dev/null +++ b/router/xgress_edge/terminator_heap.go @@ -0,0 +1,45 @@ +/* + (c) Copyright NetFoundry Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package xgress_edge + +type terminatorHeap []*edgeTerminator + +func (self terminatorHeap) Len() int { + return len(self) +} + +func (self terminatorHeap) Less(i, j int) bool { + return self[i].nextAttempt.Before(self[j].nextAttempt) +} + +func (self terminatorHeap) Swap(i, j int) { + tmp := self[i] + self[i] = self[j] + self[j] = tmp +} + +func (self *terminatorHeap) Push(x any) { + *self = append(*self, x.(*edgeTerminator)) +} + +func (self *terminatorHeap) Pop() any { + old := *self + n := len(old) + pm := old[n-1] + *self = old[0 : n-1] + return pm +} diff --git a/zititest/models/zrok-test/main.go b/zititest/models/zrok-test/main.go index d70d14eda..426f7235f 100644 --- a/zititest/models/zrok-test/main.go +++ b/zititest/models/zrok-test/main.go @@ -40,6 +40,7 @@ import ( "github.com/openziti/ziti/zititest/zitilab/models" "os" "path" + "strings" "time" ) @@ -53,6 +54,7 @@ const TargetZrokVersion = "" const iterations = 100_000 const pacing = 10 * time.Millisecond +const loopers = 2 //go:embed configs var configResource embed.FS @@ -66,9 +68,15 @@ func (self scaleStrategy) IsScaled(entity model.Entity) bool { func (self scaleStrategy) GetEntityCount(entity model.Entity) uint32 { if entity.GetType() == model.EntityTypeHost { if entity.GetScope().HasTag("router") { - return 2 + if strings.Contains(entity.GetId(), "us-east") { + return 1 + } + return 0 } else if entity.GetScope().HasTag("client") { - return 3 + if strings.Contains(entity.GetId(), "us-east") { + return 3 + } + return 0 } } @@ -194,6 +202,7 @@ var m = &model.Model{ Version: TargetZrokVersion, Pacing: pacing, Iterations: iterations, + Loopers: loopers, }, }, }, @@ -225,6 +234,7 @@ var m = &model.Model{ Version: TargetZrokVersion, Pacing: pacing, Iterations: iterations, + Loopers: loopers, }, }, }, @@ -256,6 +266,7 @@ var m = &model.Model{ Version: TargetZrokVersion, Pacing: pacing, Iterations: iterations, + Loopers: loopers, }, }, }, @@ -288,6 +299,7 @@ var m = &model.Model{ Version: TargetZrokVersion, Pacing: pacing, Iterations: iterations, + Loopers: loopers, }, }, }, @@ -323,7 +335,7 @@ var m = &model.Model{ workflow.AddAction(component.Start("#zrokFront")) workflow.AddAction(semaphore.Sleep(2 * time.Second)) - workflow.AddAction(component.ExecInParallelF(".client", 200, (*zitilab.ZrokLoopTestType).Init)) + workflow.AddAction(component.ExecInParallelF(".client", 10, (*zitilab.ZrokLoopTestType).Init)) return workflow }), "clean": model.Bind(actions.Workflow( diff --git a/zititest/zitilab/component_zrok_controller.go b/zititest/zitilab/component_zrok_controller.go index 728c5d4d0..42a49797c 100644 --- a/zititest/zitilab/component_zrok_controller.go +++ b/zititest/zitilab/component_zrok_controller.go @@ -35,7 +35,6 @@ var _ model.FileStagingComponent = (*ZrokControllerType)(nil) var _ model.ActionsComponent = (*ZrokControllerType)(nil) const ( - ZrokControllerActionInit = "init" ZrokControllerActionPreCreateAccounts = "preCreateAccounts" ) @@ -54,7 +53,6 @@ func (self *ZrokControllerType) InitType(*model.Component) { func (self *ZrokControllerType) GetActions() map[string]model.ComponentAction { return map[string]model.ComponentAction{ - ZrokControllerActionInit: model.ComponentActionF(self.Init), ZrokControllerActionPreCreateAccounts: model.ComponentActionF(self.PreCreateAccounts), } } diff --git a/zititest/zitilab/component_zrok_frontend.go b/zititest/zitilab/component_zrok_frontend.go index 579a44a16..e11412042 100644 --- a/zititest/zitilab/component_zrok_frontend.go +++ b/zititest/zitilab/component_zrok_frontend.go @@ -35,11 +35,6 @@ import ( var _ model.ComponentType = (*ZrokFrontendType)(nil) var _ model.ServerComponent = (*ZrokFrontendType)(nil) var _ model.FileStagingComponent = (*ZrokFrontendType)(nil) -var _ model.ActionsComponent = (*ZrokFrontendType)(nil) - -const ( - ZrokFrontendActionInit = "init" -) type ZrokFrontendType struct { ConfigSourceFS fs.FS @@ -58,12 +53,6 @@ func (self *ZrokFrontendType) InitType(*model.Component) { } } -func (self *ZrokFrontendType) GetActions() map[string]model.ComponentAction { - return map[string]model.ComponentAction{ - ZrokFrontendActionInit: model.ComponentActionF(self.Init), - } -} - func (self *ZrokFrontendType) Dump() any { return map[string]string{ "type_id": "zrok-frontend", diff --git a/zititest/zitilab/component_zrok_looptest.go b/zititest/zitilab/component_zrok_looptest.go index c6da9cea4..47fff244e 100644 --- a/zititest/zitilab/component_zrok_looptest.go +++ b/zititest/zitilab/component_zrok_looptest.go @@ -30,11 +30,6 @@ import ( var _ model.ComponentType = (*ZrokLoopTestType)(nil) var _ model.ServerComponent = (*ZrokLoopTestType)(nil) var _ model.FileStagingComponent = (*ZrokLoopTestType)(nil) -var _ model.ActionsComponent = (*ZrokLoopTestType)(nil) - -const ( - ZrokLoopTestActionInit = "init" -) type ZrokLoopTestType struct { Version string @@ -54,12 +49,6 @@ func (self *ZrokLoopTestType) InitType(*model.Component) { } } -func (self *ZrokLoopTestType) GetActions() map[string]model.ComponentAction { - return map[string]model.ComponentAction{ - ZrokFrontendActionInit: model.ComponentActionF(self.Init), - } -} - func (self *ZrokLoopTestType) Dump() any { return map[string]string{ "type_id": "zrok-test-loop", @@ -122,14 +111,21 @@ func (self *ZrokLoopTestType) getUnixUser(c *model.Component) string { return fmt.Sprintf("zrok%v", c.ScaleIndex) } -func (self *ZrokLoopTestType) Init(run model.Run, c *model.Component) error { +func (self *ZrokLoopTestType) InitializeHost(_ model.Run, c *model.Component) error { userId := self.getUnixUser(c) - // this will error on first run - _ = c.GetHost().ExecLogOnlyOnError(fmt.Sprintf("sudo deluser %s --remove-home", userId)) - if err := c.GetHost().ExecLogOnlyOnError(fmt.Sprintf("sudo useradd %s -m -g ubuntu ", userId)); err != nil { - return err + if _, err := c.GetHost().ExecLogged(fmt.Sprintf("id -u %s", userId)); err != nil { + cmd := fmt.Sprintf("sudo useradd %s -m -g ubuntu ", userId) + pfxlog.Logger().Info(cmd) + if err = c.GetHost().ExecLogOnlyOnError(fmt.Sprintf("sudo useradd %s -m -g ubuntu ", userId)); err != nil { + return err + } } + return nil +} + +func (self *ZrokLoopTestType) Init(run model.Run, c *model.Component) error { + userId := self.getUnixUser(c) binaryPath := getBinaryPath(c, constants.ZROK, self.Version) val, ok := c.Data["token"] @@ -138,8 +134,8 @@ func (self *ZrokLoopTestType) Init(run model.Run, c *model.Component) error { } token := fmt.Sprintf("%v", val) zrokApiEndpoint := run.GetModel().MustSelectHost("zrokCtrl").PublicIp + ":1280" - tmpl := "set -o pipefail; sudo -u %s ZROK_API_ENDPOINT=http://%s %s enable %s" - cmd := fmt.Sprintf(tmpl, userId, zrokApiEndpoint, binaryPath, token) + tmpl := "set -o pipefail; sudo -u %s rm -rf /home/%s/.zrok && sudo -u %s ZROK_API_ENDPOINT=http://%s %s enable %s" + cmd := fmt.Sprintf(tmpl, userId, userId, userId, zrokApiEndpoint, binaryPath, token) pfxlog.Logger().Info(cmd) return c.GetHost().ExecLogOnlyOnError(cmd) } From e438f89c1dcb46ba67d93449979b871f0d165993 Mon Sep 17 00:00:00 2001 From: Paul Lorenz Date: Mon, 5 Feb 2024 18:23:07 -0500 Subject: [PATCH 4/7] Don't return response to listen until terminator is established --- router/xgress_edge/fabric.go | 41 +++++++++-------- router/xgress_edge/hosted.go | 20 ++++----- router/xgress_edge/listener.go | 82 ++++++++++++++++++++-------------- 3 files changed, 81 insertions(+), 62 deletions(-) diff --git a/router/xgress_edge/fabric.go b/router/xgress_edge/fabric.go index 24b5bd1fa..e1e35a981 100644 --- a/router/xgress_edge/fabric.go +++ b/router/xgress_edge/fabric.go @@ -85,6 +85,7 @@ type edgeTerminator struct { retryDelay time.Duration establishActive atomic.Bool createTime time.Time + establishCallback func(ok bool, msg string) } func (self *edgeTerminator) calculateRetry(queueFailed bool) { @@ -115,7 +116,7 @@ func (self *edgeTerminator) inspect(fixInvalidTerminators bool) (*edge.InspectRe } result, err := edge.UnmarshalInspectResult(resp) if result != nil && result.Type != edge.ConnTypeBind && fixInvalidTerminators { - self.close(true, "terminator invalid") + self.close(true, true, "terminator invalid") } return result, err } @@ -129,13 +130,13 @@ func (self *edgeTerminator) nextDialConnId() uint32 { return nextId } -func (self *edgeTerminator) close(notify bool, reason string) { +func (self *edgeTerminator) close(notifySdk bool, notifyCtrl bool, reason string) { logger := pfxlog.Logger(). WithField("terminatorId", self.terminatorId.Load()). WithField("token", self.token). WithField("reason", reason) - if notify && !self.IsClosed() { + if notifySdk && !self.IsClosed() { // Notify edge client of close logger.Debug("sending closed to SDK client") closeMsg := edge.NewStateClosedMsg(self.Id(), reason) @@ -152,6 +153,24 @@ func (self *edgeTerminator) close(notify bool, reason string) { self.state.Store(TerminatorStateDeleting) self.edgeClientConn.listener.factory.hostedServices.Delete(terminatorId) + if notifyCtrl { + logger.Info("removing terminator on controller") + ctrlCh := self.edgeClientConn.listener.factory.ctrls.AnyCtrlChannel() + if ctrlCh == nil { + logger.Error("no controller available, unable to remove terminator") + } else if err := self.edgeClientConn.removeTerminator(ctrlCh, self.token, terminatorId); err != nil { + logger.WithError(err).Error("failed to remove terminator") + } else { + logger.Info("Successfully removed terminator") + } + } + } else { + logger.Warn("edge terminator closing, but no terminator id set, so can't remove on controller") + } + } + } else { + if notifyCtrl { + if terminatorId := self.terminatorId.Load(); terminatorId != "" { logger.Info("removing terminator on controller") ctrlCh := self.edgeClientConn.listener.factory.ctrls.AnyCtrlChannel() if ctrlCh == nil { @@ -159,26 +178,12 @@ func (self *edgeTerminator) close(notify bool, reason string) { } else if err := self.edgeClientConn.removeTerminator(ctrlCh, self.token, terminatorId); err != nil { logger.WithError(err).Error("failed to remove terminator") } else { - logger.Info("Successfully removed terminator") + logger.Info("successfully removed terminator") } } else { logger.Warn("edge terminator closing, but no terminator id set, so can't remove on controller") } } - } else { - if terminatorId := self.terminatorId.Load(); terminatorId != "" { - logger.Info("removing terminator on controller") - ctrlCh := self.edgeClientConn.listener.factory.ctrls.AnyCtrlChannel() - if ctrlCh == nil { - logger.Error("no controller available, unable to remove terminator") - } else if err := self.edgeClientConn.removeTerminator(ctrlCh, self.token, terminatorId); err != nil { - logger.WithError(err).Error("failed to remove terminator") - } else { - logger.Info("successfully removed terminator") - } - } else { - logger.Warn("edge terminator closing, but no terminator id set, so can't remove on controller") - } logger.Debug("removing terminator on router") self.edgeClientConn.listener.factory.hostedServices.Delete(self.token) diff --git a/router/xgress_edge/hosted.go b/router/xgress_edge/hosted.go index 4580703e0..ab19dbe2f 100644 --- a/router/xgress_edge/hosted.go +++ b/router/xgress_edge/hosted.go @@ -182,7 +182,7 @@ func (self *hostedServiceRegistry) cleanupServices(proxy *edgeClientConn) { self.services.Range(func(key, value interface{}) bool { terminator := value.(*edgeTerminator) if terminator.edgeClientConn == proxy { - terminator.close(false, "") // don't notify, channel is already closed, we can't send messages + terminator.close(false, true, "channel closed") // don't notify, channel is already closed, we can't send messages self.services.Delete(key) } return true @@ -193,7 +193,7 @@ func (self *hostedServiceRegistry) cleanupDuplicates(newest *edgeTerminator) { self.services.Range(func(key, value interface{}) bool { terminator := value.(*edgeTerminator) if terminator != newest && newest.token == terminator.token && newest.instance == terminator.instance { - terminator.close(false, "duplicate terminator") // don't notify, channel is already closed, we can't send messages + terminator.close(false, true, "duplicate terminator") // don't notify, channel is already closed, we can't send messages self.services.Delete(key) pfxlog.Logger().WithField("routerId", terminator.edgeClientConn.listener.id.Token). WithField("token", terminator.token). @@ -211,7 +211,7 @@ func (self *hostedServiceRegistry) unbindSession(connId uint32, sessionToken str self.services.Range(func(key, value interface{}) bool { terminator := value.(*edgeTerminator) if terminator.MsgChannel.Id() == connId && terminator.token == sessionToken && terminator.edgeClientConn == proxy { - terminator.close(false, "unbind successful") // don't notify, sdk asked us to unbind + terminator.close(false, true, "unbind successful") // don't notify, sdk asked us to unbind self.services.Delete(key) pfxlog.Logger().WithField("routerId", terminator.edgeClientConn.listener.id.Token). WithField("token", sessionToken). @@ -342,7 +342,10 @@ func (self *hostedServiceRegistry) HandleCreateTerminatorResponse(msg *channel.M } if response.Result != edge_ctrl_pb.CreateTerminatorResult_Success { - terminator.close(true, response.Msg) + if terminator.establishCallback != nil { + terminator.establishCallback(false, response.Msg) + } + terminator.close(true, false, response.Msg) return } @@ -364,13 +367,8 @@ func (self *hostedServiceRegistry) HandleCreateTerminatorResponse(msg *channel.M } } - if isValid && terminator.notifyEstablished { - notifyMsg := channel.NewMessage(edge.ContentTypeBindSuccess, nil) - notifyMsg.PutUint32Header(edge.ConnIdHeader, terminator.MsgChannel.Id()) - - if err := notifyMsg.WithTimeout(time.Second * 30).Send(terminator.MsgChannel.Channel); err != nil { - log.WithError(err).Error("failed to send bind success") - } + if isValid && terminator.establishCallback != nil { + terminator.establishCallback(true, "terminator established") } } diff --git a/router/xgress_edge/listener.go b/router/xgress_edge/listener.go index 4d18789d3..3fec41ef3 100644 --- a/router/xgress_edge/listener.go +++ b/router/xgress_edge/listener.go @@ -265,7 +265,7 @@ func (self *edgeClientConn) processBindV1(req *channel.Message, ch channel.Chann // need to remove session remove listener on close messageSink.onClose = self.listener.factory.stateManager.AddEdgeSessionRemovedListener(token, func(token string) { - messageSink.close(true, "session ended") + messageSink.close(true, true, "session ended") }) self.listener.factory.hostedServices.Put(token, messageSink) @@ -290,7 +290,7 @@ func (self *edgeClientConn) processBindV1(req *channel.Message, ch channel.Chann responseMsg, err := protobufs.MarshalTyped(request).WithTimeout(timeout).SendForReply(ctrlCh) if err = xgress_common.CheckForFailureResult(responseMsg, err, edge_ctrl_pb.ContentType_CreateTerminatorResponseType); err != nil { log.WithError(err).Warn("error creating terminator") - messageSink.close(false, "") // don't notify here, as we're notifying next line with a response + messageSink.close(false, false, "") // don't notify here, as we're notifying next line with a response self.sendStateClosedReply(err.Error(), req) return } @@ -301,7 +301,7 @@ func (self *edgeClientConn) processBindV1(req *channel.Message, ch channel.Chann if messageSink.MsgChannel.IsClosed() { log.Warn("edge channel closed while setting up terminator. cleaning up terminator now") - messageSink.close(false, "edge channel closed") + messageSink.close(false, true, "edge channel closed") return } @@ -391,43 +391,59 @@ func (self *edgeClientConn) processBindV2(req *channel.Message, ch channel.Chann notifyEstablished, _ := req.GetBoolHeader(edge.SupportsBindSuccessHeader) terminator := &edgeTerminator{ - MsgChannel: *edge.NewEdgeMsgChannel(self.ch, connId), - edgeClientConn: self, - token: token, - cost: cost, - precedence: precedence, - instance: terminatorInstance, - instanceSecret: terminatorInstanceSecret, - hostData: hostData, - assignIds: assignIds, - v2: true, - postValidate: postValidate, - notifyEstablished: notifyEstablished, - createTime: time.Now(), + MsgChannel: *edge.NewEdgeMsgChannel(self.ch, connId), + edgeClientConn: self, + token: token, + cost: cost, + precedence: precedence, + instance: terminatorInstance, + instanceSecret: terminatorInstanceSecret, + hostData: hostData, + assignIds: assignIds, + v2: true, + postValidate: postValidate, + createTime: time.Now(), } + + terminator.establishCallback = func(ok bool, msg string) { + if ok { + self.sendStateConnectedReply(req, nil) + + if notifyEstablished { + notifyMsg := channel.NewMessage(edge.ContentTypeBindSuccess, nil) + notifyMsg.PutUint32Header(edge.ConnIdHeader, terminator.MsgChannel.Id()) + + if err := notifyMsg.WithTimeout(time.Second * 30).Send(terminator.MsgChannel.Channel); err != nil { + log.WithError(err).Error("failed to send bind success") + } + } + } else { + self.sendStateClosedReply(msg, req) + } + } + terminator.terminatorId.Store(terminatorId) terminator.state.Store(TerminatorStatePendingEstablishment) - // need to remove session remove listener on close - terminator.onClose = self.listener.factory.stateManager.AddEdgeSessionRemovedListener(token, func(token string) { - terminator.close(true, "session ended") - }) - - // If the session was recently removed, the call to AddEdgeSessionRemovedListener will have asynchronously closed - // the terminator if self.listener.factory.stateManager.WasSessionRecentlyRemoved(token) { log.Info("invalid session, not establishing terminator") - } else { - log.Info("establishing terminator") - - self.sendStateConnectedReply(req, nil) - - self.listener.factory.hostedServices.EstablishTerminator(terminator) - if listenerId == "" { - // only removed dupes with a scan if we don't have an sdk provided key - self.listener.factory.hostedServices.cleanupDuplicates(terminator) - } + terminator.establishCallback(false, "invalid session") + return } + + // need to remove session remove listener on close + terminator.onClose = self.listener.factory.stateManager.AddEdgeSessionRemovedListener(token, func(token string) { + terminator.close(true, true, "session ended") + }) + + log.Info("establishing terminator") + + self.listener.factory.hostedServices.EstablishTerminator(terminator) + if listenerId == "" { + // only removed dupes with a scan if we don't have an sdk provided key + self.listener.factory.hostedServices.cleanupDuplicates(terminator) + } + } func (self *edgeClientConn) processUnbind(req *channel.Message, _ channel.Channel) { From 9f8739e249787b3f5cc442a1e6f5309ae96daa86 Mon Sep 17 00:00:00 2001 From: Paul Lorenz Date: Mon, 5 Feb 2024 18:23:54 -0500 Subject: [PATCH 5/7] Zitilab changes to try improve raft bootstrapping --- zititest/models/links-test/main.go | 1 + zititest/models/zrok-test/main.go | 13 ++------ zititest/zitilab/actions/edge/ctrl_init.go | 9 ++++-- zititest/zitilab/actions/edge/raft_join.go | 15 +++++++--- zititest/zitilab/component_controller.go | 33 +++++++++++++++++---- zititest/zitilab/component_zrok_looptest.go | 2 +- 6 files changed, 50 insertions(+), 23 deletions(-) diff --git a/zititest/models/links-test/main.go b/zititest/models/links-test/main.go index 7861a52c5..86d892b3e 100644 --- a/zititest/models/links-test/main.go +++ b/zititest/models/links-test/main.go @@ -224,6 +224,7 @@ var m = &model.Model{ workflow.AddAction(host.GroupExec("component.ctrl", 5, "rm -rf ./fablab/ctrldata")) workflow.AddAction(component.Start(".ctrl")) + workflow.AddAction(semaphore.Sleep(2 * time.Second)) workflow.AddAction(edge.RaftJoin(".ctrl")) workflow.AddAction(semaphore.Sleep(2 * time.Second)) workflow.AddAction(edge.InitRaftController("#ctrl1")) diff --git a/zititest/models/zrok-test/main.go b/zititest/models/zrok-test/main.go index 426f7235f..662239f38 100644 --- a/zititest/models/zrok-test/main.go +++ b/zititest/models/zrok-test/main.go @@ -40,7 +40,6 @@ import ( "github.com/openziti/ziti/zititest/zitilab/models" "os" "path" - "strings" "time" ) @@ -68,15 +67,9 @@ func (self scaleStrategy) IsScaled(entity model.Entity) bool { func (self scaleStrategy) GetEntityCount(entity model.Entity) uint32 { if entity.GetType() == model.EntityTypeHost { if entity.GetScope().HasTag("router") { - if strings.Contains(entity.GetId(), "us-east") { - return 1 - } - return 0 + return 1 } else if entity.GetScope().HasTag("client") { - if strings.Contains(entity.GetId(), "us-east") { - return 3 - } - return 0 + return 3 } } @@ -119,7 +112,7 @@ var m = &model.Model{ model.FactoryFunc(func(m *model.Model) error { return m.ForEachHost("component.ctrl", 1, func(host *model.Host) error { if host.InstanceType == "" { - host.InstanceType = "c5.large" + host.InstanceType = "c5.2xlarge" } return nil }) diff --git a/zititest/zitilab/actions/edge/ctrl_init.go b/zititest/zitilab/actions/edge/ctrl_init.go index fa4cb0faf..b5ae84051 100644 --- a/zititest/zitilab/actions/edge/ctrl_init.go +++ b/zititest/zitilab/actions/edge/ctrl_init.go @@ -43,10 +43,13 @@ func (init *raftInit) Execute(run model.Run) error { } for _, c := range m.SelectComponents(init.componentSpec) { - sshConfigFactory := c.GetHost().NewSshConfigFactory() + ctrlType, ok := c.Type.(*zitilab.ControllerType) + if !ok { + return errors.Errorf("component %s is not a controller", c.Id) + } - tmpl := "set -o pipefail; /home/%s/fablab/bin/ziti agent controller init %s %s default.admin 2>&1 | tee logs/controller.edge.init.log" - if err := host.Exec(c.GetHost(), fmt.Sprintf(tmpl, sshConfigFactory.User(), username, password)).Execute(run); err != nil { + tmpl := "set -o pipefail; %s agent controller init %s %s default.admin 2>&1 | tee logs/controller.edge.init.log" + if err := host.Exec(c.GetHost(), fmt.Sprintf(tmpl, ctrlType.GetBinaryPath(c), username, password)).Execute(run); err != nil { return err } } diff --git a/zititest/zitilab/actions/edge/raft_join.go b/zititest/zitilab/actions/edge/raft_join.go index ffca42194..d788633d9 100644 --- a/zititest/zitilab/actions/edge/raft_join.go +++ b/zititest/zitilab/actions/edge/raft_join.go @@ -2,8 +2,9 @@ package edge import ( "fmt" - "github.com/openziti/fablab/kernel/lib/actions/host" + "github.com/michaelquigley/pfxlog" "github.com/openziti/fablab/kernel/model" + "github.com/openziti/ziti/zititest/zitilab" "github.com/pkg/errors" ) @@ -23,10 +24,16 @@ func (self *raftJoin) Execute(run model.Run) error { return errors.Errorf("no controllers found with spec '%v'", self.componentSpec) } primary := ctrls[0] - sshConfigFactory := primary.GetHost().NewSshConfigFactory() + ctrlType, ok := primary.Type.(*zitilab.ControllerType) + if !ok { + return errors.Errorf("component %s is not a controller", primary.Id) + } + log := pfxlog.Logger().WithField("component", primary.Id) for _, c := range ctrls[1:] { - tmpl := "/home/%s/fablab/bin/ziti agent cluster add %v --id %v" - if err := host.Exec(primary.GetHost(), fmt.Sprintf(tmpl, sshConfigFactory.User(), "tls:"+c.Host.PublicIp+":6262", c.Id)).Execute(run); err != nil { + tmpl := "%s agent cluster add %v --id %v" + cmd := fmt.Sprintf(tmpl, ctrlType.GetBinaryPath(primary), "tls:"+c.Host.PublicIp+":6262", c.Id) + log.Info(cmd) + if err := primary.GetHost().ExecLogOnlyOnError(cmd); err != nil { return err } } diff --git a/zititest/zitilab/component_controller.go b/zititest/zitilab/component_controller.go index 6447c4125..d7ded6f76 100644 --- a/zititest/zitilab/component_controller.go +++ b/zititest/zitilab/component_controller.go @@ -112,6 +112,10 @@ func (self *ControllerType) Stop(_ model.Run, c *model.Component) error { return c.GetHost().KillProcesses("-TERM", self.getProcessFilter(c)) } +func (self *ControllerType) GetBinaryPath(c *model.Component) string { + return getZitiBinaryPath(c, self.Version) +} + func (self *ControllerType) InitStandalone(run model.Run, c *model.Component) error { username := c.MustStringVariable("credentials.edge.username") password := c.MustStringVariable("credentials.edge.password") @@ -126,11 +130,6 @@ func (self *ControllerType) InitStandalone(run model.Run, c *model.Component) er factory := c.GetHost().NewSshConfigFactory() - binaryName := "ziti" - if self.Version != "" { - binaryName += "-" + self.Version - } - binaryPath := getZitiBinaryPath(c, self.Version) configPath := fmt.Sprintf("/home/%s/fablab/cfg/%s", factory.User(), self.getConfigName(c)) @@ -138,3 +137,27 @@ func (self *ControllerType) InitStandalone(run model.Run, c *model.Component) er cmd := fmt.Sprintf(tmpl, factory.User(), binaryPath, configPath, username, password) return host.Exec(c.GetHost(), cmd).Execute(run) } + +func (self *ControllerType) InitRaft(run model.Run, c *model.Component) error { + count := 0 + err := run.GetModel().ForEachComponent("*", 1, func(other *model.Component) error { + if _, ok := c.Type.(*ControllerType); ok { + binaryPath := getZitiBinaryPath(c, self.Version) + tmpl := "%s agent cluster add %v --id %v" + cmd := fmt.Sprintf(tmpl, binaryPath, "tls:"+other.Host.PublicIp+":6262", other.Id) + count++ + return c.GetHost().ExecLogOnlyOnError(cmd) + } + return nil + }) + + if err != nil { + return err + } + + if count < 1 { + return errors.New("no other controllers found") + } + + return nil +} diff --git a/zititest/zitilab/component_zrok_looptest.go b/zititest/zitilab/component_zrok_looptest.go index 47fff244e..478aaa155 100644 --- a/zititest/zitilab/component_zrok_looptest.go +++ b/zititest/zitilab/component_zrok_looptest.go @@ -134,7 +134,7 @@ func (self *ZrokLoopTestType) Init(run model.Run, c *model.Component) error { } token := fmt.Sprintf("%v", val) zrokApiEndpoint := run.GetModel().MustSelectHost("zrokCtrl").PublicIp + ":1280" - tmpl := "set -o pipefail; sudo -u %s rm -rf /home/%s/.zrok && sudo -u %s ZROK_API_ENDPOINT=http://%s %s enable %s" + tmpl := "set -o pipefail; sudo -u %s rm -rf /home/%s/.zrok && sudo -u %s ZROK_API_ENDPOINT=http://%s %s enable --headless %s" cmd := fmt.Sprintf(tmpl, userId, userId, userId, zrokApiEndpoint, binaryPath, token) pfxlog.Logger().Info(cmd) return c.GetHost().ExecLogOnlyOnError(cmd) From 744ae68bbd54bfa0b9f00ab069bea265b787220a Mon Sep 17 00:00:00 2001 From: Paul Lorenz Date: Thu, 8 Feb 2024 21:45:23 -0500 Subject: [PATCH 6/7] Fix controller crash. Fixes #1736 --- common/capabilities/consts.go | 1 + common/ctrl_msg/messages.go | 107 ++++++++++++++ common/pb/edge_ctrl_pb/edge_ctrl.pb.go | 138 ++++++++++-------- common/pb/edge_ctrl_pb/edge_ctrl.proto | 2 + common/pb/edge_ctrl_pb/messages.go | 2 +- controller/controller.go | 1 + controller/handler_edge_ctrl/common.go | 1 - .../handler_edge_ctrl/create_circuit.go | 137 +++++++++++------ controller/server/controller.go | 7 +- router/xgress/link_send_buffer.go | 4 +- router/xgress_edge/listener.go | 62 +++++++- router/xgress_edge_tunnel/factory.go | 41 +++++- zititest/models/zrok-test/main.go | 15 ++ zititest/zitilab/component_zrok_looptest.go | 15 +- 14 files changed, 403 insertions(+), 130 deletions(-) diff --git a/common/capabilities/consts.go b/common/capabilities/consts.go index ad29acf53..6fb478767 100644 --- a/common/capabilities/consts.go +++ b/common/capabilities/consts.go @@ -19,4 +19,5 @@ package capabilities const ( ControllerCreateTerminatorV2 int = 1 ControllerSingleRouterLinkSource int = 2 + ControllerCreateCircuitV2 int = 3 ) diff --git a/common/ctrl_msg/messages.go b/common/ctrl_msg/messages.go index 5bed2ad4b..2b7191c44 100644 --- a/common/ctrl_msg/messages.go +++ b/common/ctrl_msg/messages.go @@ -17,7 +17,10 @@ package ctrl_msg import ( + "errors" + "fmt" "github.com/openziti/channel/v2" + "github.com/openziti/ziti/common/pb/edge_ctrl_pb" ) const ( @@ -42,6 +45,16 @@ const ( ErrorTypeMisconfiguredTerminator = 2 ErrorTypeDialTimedOut = 3 ErrorTypeConnectionRefused = 4 + + CreateCircuitPeerDataHeader = 10 + + CreateCircuitReqSessionTokenHeader = 11 + CreateCircuitReqFingerprintsHeader = 12 + CreateCircuitReqTerminatorInstanceIdHeader = 13 + + CreateCircuitRespCircuitId = 11 + CreateCircuitRespAddress = 12 + CreateCircuitRespTagsHeader = 13 ) func NewCircuitSuccessMsg(sessionId, address string) *channel.Message { @@ -68,3 +81,97 @@ func NewRouteResultFailedMessage(sessionId string, attempt int, rerr string) *ch msg.Headers[RouteResultErrorHeader] = []byte(rerr) return msg } + +type CreateCircuitRequest struct { + SessionToken string + Fingerprints []string + TerminatorInstanceId string + PeerData map[uint32][]byte +} + +func (self *CreateCircuitRequest) GetSessionToken() string { + return self.SessionToken +} + +func (self *CreateCircuitRequest) GetFingerprints() []string { + return self.Fingerprints +} + +func (self *CreateCircuitRequest) GetTerminatorInstanceId() string { + return self.TerminatorInstanceId +} + +func (self *CreateCircuitRequest) GetPeerData() map[uint32][]byte { + return self.PeerData +} + +func (self *CreateCircuitRequest) ToMessage() *channel.Message { + msg := channel.NewMessage(int32(edge_ctrl_pb.ContentType_CreateCircuitV2RequestType), nil) + msg.PutStringHeader(CreateCircuitReqSessionTokenHeader, self.SessionToken) + msg.PutStringSliceHeader(CreateCircuitReqFingerprintsHeader, self.Fingerprints) + msg.PutStringHeader(CreateCircuitReqTerminatorInstanceIdHeader, self.TerminatorInstanceId) + msg.PutU32ToBytesMapHeader(CreateCircuitPeerDataHeader, self.PeerData) + return msg +} + +func DecodeCreateCircuitRequest(m *channel.Message) (*CreateCircuitRequest, error) { + sessionToken, _ := m.GetStringHeader(CreateCircuitReqSessionTokenHeader) + if len(sessionToken) == 0 { + return nil, errors.New("no session token provided in create circuit request") + } + + fingerprints, _, err := m.GetStringSliceHeader(CreateCircuitReqFingerprintsHeader) + if err != nil { + return nil, fmt.Errorf("unable to get create circuit request fingerprints (%w)", err) + } + + terminatorInstanceId, _ := m.GetStringHeader(CreateCircuitReqTerminatorInstanceIdHeader) + peerData, _, err := m.GetU32ToBytesMapHeader(CreateCircuitPeerDataHeader) + if err != nil { + return nil, fmt.Errorf("unable to get create circuit request peer data (%w)", err) + } + + return &CreateCircuitRequest{ + SessionToken: sessionToken, + Fingerprints: fingerprints, + TerminatorInstanceId: terminatorInstanceId, + PeerData: peerData, + }, nil +} + +type CreateCircuitResponse struct { + CircuitId string + Address string + PeerData map[uint32][]byte + Tags map[string]string +} + +func (self *CreateCircuitResponse) ToMessage() *channel.Message { + msg := channel.NewMessage(int32(edge_ctrl_pb.ContentType_CreateCircuitV2ResponseType), nil) + msg.PutStringHeader(CreateCircuitRespCircuitId, self.CircuitId) + msg.PutStringHeader(CreateCircuitRespAddress, self.Address) + msg.PutU32ToBytesMapHeader(CreateCircuitPeerDataHeader, self.PeerData) + msg.PutStringToStringMapHeader(CreateCircuitRespTagsHeader, self.Tags) + return msg +} + +func DecodeCreateCircuitResponse(m *channel.Message) (*CreateCircuitResponse, error) { + circuitId, _ := m.GetStringHeader(CreateCircuitRespCircuitId) + address, _ := m.GetStringHeader(CreateCircuitRespAddress) + peerData, _, err := m.GetU32ToBytesMapHeader(CreateCircuitPeerDataHeader) + if err != nil { + return nil, fmt.Errorf("unable to get create circuit response peer data (%w)", err) + } + + tags, _, err := m.GetStringToStringMapHeader(CreateCircuitRespTagsHeader) + if err != nil { + return nil, fmt.Errorf("unable to get create circuit response tags (%w)", err) + } + + return &CreateCircuitResponse{ + CircuitId: circuitId, + Address: address, + PeerData: peerData, + Tags: tags, + }, nil +} diff --git a/common/pb/edge_ctrl_pb/edge_ctrl.pb.go b/common/pb/edge_ctrl_pb/edge_ctrl.pb.go index 58f08c066..bee4f94d5 100644 --- a/common/pb/edge_ctrl_pb/edge_ctrl.pb.go +++ b/common/pb/edge_ctrl_pb/edge_ctrl.pb.go @@ -48,6 +48,8 @@ const ( ContentType_SigningCertAddedType ContentType = 20215 ContentType_CreateTerminatorV2RequestType ContentType = 20216 ContentType_CreateTerminatorV2ResponseType ContentType = 20217 + ContentType_CreateCircuitV2RequestType ContentType = 20218 + ContentType_CreateCircuitV2ResponseType ContentType = 20219 ContentType_EnrollType ContentType = 20300 ContentType_EnrollmentCertsResponseType ContentType = 20301 ContentType_EnrollmentExtendRouterRequestType ContentType = 20302 @@ -93,6 +95,8 @@ var ( 20215: "SigningCertAddedType", 20216: "CreateTerminatorV2RequestType", 20217: "CreateTerminatorV2ResponseType", + 20218: "CreateCircuitV2RequestType", + 20219: "CreateCircuitV2ResponseType", 20300: "EnrollType", 20301: "EnrollmentCertsResponseType", 20302: "EnrollmentExtendRouterRequestType", @@ -135,6 +139,8 @@ var ( "SigningCertAddedType": 20215, "CreateTerminatorV2RequestType": 20216, "CreateTerminatorV2ResponseType": 20217, + "CreateCircuitV2RequestType": 20218, + "CreateCircuitV2ResponseType": 20219, "EnrollType": 20300, "EnrollmentCertsResponseType": 20301, "EnrollmentExtendRouterRequestType": 20302, @@ -3988,7 +3994,7 @@ var file_edge_ctrl_proto_rawDesc = []byte{ 0x69, 0x66, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, - 0x2a, 0xaf, 0x0a, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, + 0x2a, 0xf4, 0x0a, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x5a, 0x65, 0x72, 0x6f, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x54, 0x79, 0x70, 0x65, 0x10, 0xa0, 0x9c, 0x01, 0x12, 0x15, 0x0a, 0x0f, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x6c, 0x6c, 0x6f, @@ -4031,69 +4037,73 @@ var file_edge_ctrl_proto_rawDesc = []byte{ 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf8, 0x9d, 0x01, 0x12, 0x24, 0x0a, 0x1e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x32, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf9, 0x9d, 0x01, 0x12, 0x10, 0x0a, - 0x0a, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x10, 0xcc, 0x9e, 0x01, 0x12, - 0x21, 0x0a, 0x1b, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, - 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xcd, - 0x9e, 0x01, 0x12, 0x27, 0x0a, 0x21, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, - 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xce, 0x9e, 0x01, 0x12, 0x2d, 0x0a, 0x27, 0x45, - 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x52, - 0x6f, 0x75, 0x74, 0x65, 0x72, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xcf, 0x9e, 0x01, 0x12, 0x21, 0x0a, 0x1b, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb0, 0x9f, 0x01, 0x12, 0x22, 0x0a, - 0x1c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb1, 0x9f, - 0x01, 0x12, 0x28, 0x0a, 0x22, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, - 0x69, 0x74, 0x46, 0x6f, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb2, 0x9f, 0x01, 0x12, 0x29, 0x0a, 0x23, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x10, 0xb3, 0x9f, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x10, 0xb4, 0x9f, 0x01, 0x12, 0x15, 0x0a, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x4c, 0x69, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb5, 0x9f, 0x01, 0x12, 0x27, 0x0a, 0x21, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, - 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x10, 0xb6, 0x9f, 0x01, 0x12, 0x28, 0x0a, 0x22, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, - 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb7, 0x9f, 0x01, 0x12, - 0x27, 0x0a, 0x21, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, - 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x54, 0x79, 0x70, 0x65, 0x10, 0xb8, 0x9f, 0x01, 0x12, 0x28, 0x0a, 0x22, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, - 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb9, - 0x9f, 0x01, 0x12, 0x27, 0x0a, 0x21, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x75, 0x6e, 0x6e, - 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xba, 0x9f, 0x01, 0x12, 0x28, 0x0a, 0x22, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, - 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x10, 0xbb, 0x9f, 0x01, 0x12, 0x1b, 0x0a, 0x15, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x48, - 0x65, 0x61, 0x6c, 0x74, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xbc, - 0x9f, 0x01, 0x2a, 0x21, 0x0a, 0x0b, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x69, 0x61, 0x6c, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x42, - 0x69, 0x6e, 0x64, 0x10, 0x01, 0x2a, 0x3d, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, - 0x0e, 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5a, 0x65, 0x72, 0x6f, 0x10, 0x00, 0x12, - 0x11, 0x0a, 0x0c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x10, - 0xfe, 0x07, 0x12, 0x10, 0x0a, 0x0b, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x61, 0x73, 0x73, 0x65, - 0x64, 0x10, 0xff, 0x07, 0x2a, 0x2e, 0x0a, 0x0a, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x64, 0x64, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x65, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x10, 0x02, 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, 0x5c, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, - 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x0b, 0x0a, - 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x46, 0x61, - 0x69, 0x6c, 0x65, 0x64, 0x49, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x10, 0x01, - 0x12, 0x0f, 0x0a, 0x0b, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x10, - 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x42, 0x75, 0x73, 0x79, 0x10, - 0x03, 0x42, 0x2a, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x6f, 0x70, 0x65, 0x6e, 0x7a, 0x69, 0x74, 0x69, 0x2f, 0x65, 0x64, 0x67, 0x65, 0x2f, 0x70, 0x62, - 0x2f, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf9, 0x9d, 0x01, 0x12, 0x20, 0x0a, + 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x56, 0x32, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xfa, 0x9d, 0x01, 0x12, + 0x21, 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, + 0x56, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xfb, + 0x9d, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, + 0x10, 0xcc, 0x9e, 0x01, 0x12, 0x21, 0x0a, 0x1b, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, + 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x10, 0xcd, 0x9e, 0x01, 0x12, 0x27, 0x0a, 0x21, 0x45, 0x6e, 0x72, 0x6f, 0x6c, + 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xce, 0x9e, 0x01, + 0x12, 0x2d, 0x0a, 0x27, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xcf, 0x9e, 0x01, 0x12, + 0x21, 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb0, + 0x9f, 0x01, 0x12, 0x22, 0x0a, 0x1c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x10, 0xb1, 0x9f, 0x01, 0x12, 0x28, 0x0a, 0x22, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb2, 0x9f, 0x01, + 0x12, 0x29, 0x0a, 0x23, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, + 0x74, 0x46, 0x6f, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb3, 0x9f, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x4c, + 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb4, 0x9f, 0x01, 0x12, 0x15, 0x0a, 0x0f, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb5, 0x9f, + 0x01, 0x12, 0x27, 0x0a, 0x21, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, + 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb6, 0x9f, 0x01, 0x12, 0x28, 0x0a, 0x22, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, + 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x10, 0xb7, 0x9f, 0x01, 0x12, 0x27, 0x0a, 0x21, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x75, + 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb8, 0x9f, 0x01, 0x12, 0x28, 0x0a, + 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, + 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x10, 0xb9, 0x9f, 0x01, 0x12, 0x27, 0x0a, 0x21, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xba, 0x9f, 0x01, + 0x12, 0x28, 0x0a, 0x22, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, + 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xbb, 0x9f, 0x01, 0x12, 0x1b, 0x0a, 0x15, 0x54, 0x75, + 0x6e, 0x6e, 0x65, 0x6c, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x10, 0xbc, 0x9f, 0x01, 0x2a, 0x21, 0x0a, 0x0b, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x69, 0x61, 0x6c, 0x10, 0x00, + 0x12, 0x08, 0x0a, 0x04, 0x42, 0x69, 0x6e, 0x64, 0x10, 0x01, 0x2a, 0x3d, 0x0a, 0x06, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5a, 0x65, + 0x72, 0x6f, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, + 0x6f, 0x72, 0x49, 0x64, 0x10, 0xfe, 0x07, 0x12, 0x10, 0x0a, 0x0b, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x50, 0x61, 0x73, 0x73, 0x65, 0x64, 0x10, 0xff, 0x07, 0x2a, 0x2e, 0x0a, 0x0a, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x64, 0x64, 0x10, 0x00, + 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, + 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x10, 0x02, 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, 0x5c, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x10, 0x00, 0x12, + 0x14, 0x0a, 0x10, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x49, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x6c, + 0x69, 0x63, 0x74, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, + 0x74, 0x68, 0x65, 0x72, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, + 0x42, 0x75, 0x73, 0x79, 0x10, 0x03, 0x42, 0x2a, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x7a, 0x69, 0x74, 0x69, 0x2f, 0x65, 0x64, + 0x67, 0x65, 0x2f, 0x70, 0x62, 0x2f, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x5f, + 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/common/pb/edge_ctrl_pb/edge_ctrl.proto b/common/pb/edge_ctrl_pb/edge_ctrl.proto index 72c672a30..c2512ad8a 100644 --- a/common/pb/edge_ctrl_pb/edge_ctrl.proto +++ b/common/pb/edge_ctrl_pb/edge_ctrl.proto @@ -30,6 +30,8 @@ enum ContentType { SigningCertAddedType = 20215; CreateTerminatorV2RequestType = 20216; CreateTerminatorV2ResponseType = 20217; + CreateCircuitV2RequestType = 20218; + CreateCircuitV2ResponseType = 20219; EnrollType = 20300; EnrollmentCertsResponseType = 20301; diff --git a/common/pb/edge_ctrl_pb/messages.go b/common/pb/edge_ctrl_pb/messages.go index 40474905a..75a34a0be 100644 --- a/common/pb/edge_ctrl_pb/messages.go +++ b/common/pb/edge_ctrl_pb/messages.go @@ -2,8 +2,8 @@ package edge_ctrl_pb import ( "github.com/openziti/edge-api/rest_model" - "github.com/openziti/ziti/controller/xt" "github.com/openziti/sdk-golang/ziti" + "github.com/openziti/ziti/controller/xt" ) func (m *ClientHello) GetContentType() int32 { diff --git a/controller/controller.go b/controller/controller.go index 5c3cf0eab..8b9058800 100644 --- a/controller/controller.go +++ b/controller/controller.go @@ -265,6 +265,7 @@ func (c *Controller) Run() error { capabilityMask := &big.Int{} capabilityMask.SetBit(capabilityMask, capabilities.ControllerCreateTerminatorV2, 1) capabilityMask.SetBit(capabilityMask, capabilities.ControllerSingleRouterLinkSource, 1) + capabilityMask.SetBit(capabilityMask, capabilities.ControllerCreateCircuitV2, 1) headers := map[int32][]byte{ channel.HelloVersionHeader: versionHeader, int32(ctrl_pb.ControlHeaders_CapabilitiesHeader): capabilityMask.Bytes(), diff --git a/controller/handler_edge_ctrl/common.go b/controller/handler_edge_ctrl/common.go index ea93243f4..a33918393 100644 --- a/controller/handler_edge_ctrl/common.go +++ b/controller/handler_edge_ctrl/common.go @@ -27,7 +27,6 @@ type requestHandler interface { getAppEnv() *env.AppEnv getNetwork() *network.Network getChannel() channel.Channel - ContentType() int32 Label() string } diff --git a/controller/handler_edge_ctrl/create_circuit.go b/controller/handler_edge_ctrl/create_circuit.go index a012da9c5..9e34f85d0 100644 --- a/controller/handler_edge_ctrl/create_circuit.go +++ b/controller/handler_edge_ctrl/create_circuit.go @@ -17,11 +17,14 @@ package handler_edge_ctrl import ( + "fmt" "github.com/michaelquigley/pfxlog" "github.com/openziti/channel/v2" + "github.com/openziti/ziti/common/ctrl_msg" "github.com/openziti/ziti/common/pb/edge_ctrl_pb" "github.com/openziti/ziti/controller/db" "github.com/openziti/ziti/controller/env" + "github.com/openziti/ziti/controller/network" "google.golang.org/protobuf/proto" ) @@ -30,39 +33,36 @@ type createCircuitHandler struct { } func NewCreateCircuitHandler(appEnv *env.AppEnv, ch channel.Channel) channel.TypedReceiveHandler { - return &createCircuitHandler{ + handler := &createCircuitHandler{ baseRequestHandler: baseRequestHandler{ ch: ch, appEnv: appEnv, }, } + return &channel.AsyncFunctionReceiveAdapter{ + Type: int32(edge_ctrl_pb.ContentType_CreateCircuitRequestType), + Handler: handler.HandleReceiveCreateCircuitV1, + } } -func (self *createCircuitHandler) ContentType() int32 { - return int32(edge_ctrl_pb.ContentType_CreateCircuitRequestType) +func NewCreateCircuitV2Handler(appEnv *env.AppEnv, ch channel.Channel) channel.TypedReceiveHandler { + handler := &createCircuitHandler{ + baseRequestHandler: baseRequestHandler{ + ch: ch, + appEnv: appEnv, + }, + } + return &channel.AsyncFunctionReceiveAdapter{ + Type: int32(edge_ctrl_pb.ContentType_CreateCircuitV2RequestType), + Handler: handler.HandleReceiveCreateCircuitV2, + } } func (self *createCircuitHandler) Label() string { return "create.circuit" } -func (self *createCircuitHandler) sendResponse(ctx *CreateCircuitRequestContext, response *edge_ctrl_pb.CreateCircuitResponse) { - log := pfxlog.ContextLogger(self.ch.Label()) - - body, err := proto.Marshal(response) - if err != nil { - log.WithError(err).WithField("token", ctx.req.SessionToken).Error("failed to marshal create circuit response") - return - } - - responseMsg := channel.NewMessage(response.GetContentType(), body) - responseMsg.ReplyTo(ctx.msg) - if err = self.ch.Send(responseMsg); err != nil { - log.WithError(err).WithField("token", ctx.req.SessionToken).Error("failed to send create circuit response") - } -} - -func (self *createCircuitHandler) HandleReceive(msg *channel.Message, ch channel.Channel) { +func (self *createCircuitHandler) HandleReceiveCreateCircuitV1(msg *channel.Message, ch channel.Channel) { req := &edge_ctrl_pb.CreateCircuitRequest{} if err := proto.Unmarshal(msg.Body, req); err != nil { pfxlog.ContextLogger(ch.Label()).WithError(err).Error("could not unmarshal CreateCircuitRequest") @@ -74,27 +74,10 @@ func (self *createCircuitHandler) HandleReceive(msg *channel.Message, ch channel req: req, } - go self.CreateCircuit(ctx) + self.CreateCircuit(ctx, self.CreateCircuitV1Response) } -func (self *createCircuitHandler) CreateCircuit(ctx *CreateCircuitRequestContext) { - if !ctx.loadRouter() { - return - } - ctx.loadSession(ctx.req.SessionToken) - ctx.checkSessionType(db.SessionTypeDial) - ctx.checkSessionFingerprints(ctx.req.Fingerprints) - ctx.verifyEdgeRouterAccess() - ctx.loadService() - circuitInfo, peerData := ctx.createCircuit(ctx.req.TerminatorInstanceId, ctx.req.PeerData) - - if ctx.err != nil { - self.returnError(ctx, ctx.err) - return - } - - log := pfxlog.ContextLogger(self.ch.Label()).WithField("token", ctx.req.SessionToken) - +func (self *createCircuitHandler) CreateCircuitV1Response(circuitInfo *network.Circuit, peerData map[uint32][]byte) (*channel.Message, error) { response := &edge_ctrl_pb.CreateCircuitResponse{ CircuitId: circuitInfo.Id, Address: circuitInfo.Path.IngressId, @@ -102,15 +85,85 @@ func (self *createCircuitHandler) CreateCircuit(ctx *CreateCircuitRequestContext Tags: circuitInfo.Tags, } + body, err := proto.Marshal(response) + if err != nil { + return nil, fmt.Errorf("failed to marshal protobuf create circuit response (%w)", err) + } + responseMsg := channel.NewMessage(response.GetContentType(), body) + return responseMsg, nil +} + +func (self *createCircuitHandler) HandleReceiveCreateCircuitV2(msg *channel.Message, ch channel.Channel) { + req, err := ctrl_msg.DecodeCreateCircuitRequest(msg) + if err != nil { + pfxlog.ContextLogger(ch.Label()).WithError(err).Error("could not decode CreateCircuitRequest") + return + } + + ctx := &CreateCircuitRequestContext{ + baseSessionRequestContext: baseSessionRequestContext{handler: self, msg: msg}, + req: req, + } + + self.CreateCircuit(ctx, self.CreateCircuitV2Response) +} + +func (self *createCircuitHandler) CreateCircuitV2Response(circuitInfo *network.Circuit, peerData map[uint32][]byte) (*channel.Message, error) { + response := &ctrl_msg.CreateCircuitResponse{ + CircuitId: circuitInfo.Id, + Address: circuitInfo.Path.IngressId, + PeerData: peerData, + Tags: circuitInfo.Tags, + } + + return response.ToMessage(), nil +} + +func (self *createCircuitHandler) CreateCircuit(ctx *CreateCircuitRequestContext, f createCircuitResponseFactory) { + if !ctx.loadRouter() { + return + } + ctx.loadSession(ctx.req.GetSessionToken()) + ctx.checkSessionType(db.SessionTypeDial) + ctx.checkSessionFingerprints(ctx.req.GetFingerprints()) + ctx.verifyEdgeRouterAccess() + ctx.loadService() + circuitInfo, peerData := ctx.createCircuit(ctx.req.GetTerminatorInstanceId(), ctx.req.GetPeerData()) + + if ctx.err != nil { + self.returnError(ctx, ctx.err) + return + } + + log := pfxlog.ContextLogger(self.ch.Label()).WithField("token", ctx.req.GetSessionToken()) + responseMsg, err := f(circuitInfo, peerData) + if err != nil { + log.WithError(err).Error("error generating create circuit response") + } log.Debugf("responding with successful circuit setup") - self.sendResponse(ctx, response) + + responseMsg.ReplyTo(ctx.msg) + if err = self.ch.Send(responseMsg); err != nil { + log.WithError(err).WithField("token", ctx.req.GetSessionToken()).Error("failed to send create circuit response") + } +} + +type createCircuitResponseFactory func(*network.Circuit, map[uint32][]byte) (*channel.Message, error) + +var _ CreateCircuitRequest = (*edge_ctrl_pb.CreateCircuitRequest)(nil) + +type CreateCircuitRequest interface { + GetSessionToken() string + GetFingerprints() []string + GetTerminatorInstanceId() string + GetPeerData() map[uint32][]byte } type CreateCircuitRequestContext struct { baseSessionRequestContext - req *edge_ctrl_pb.CreateCircuitRequest + req CreateCircuitRequest } func (self *CreateCircuitRequestContext) GetSessionToken() string { - return self.req.SessionToken + return self.req.GetSessionToken() } diff --git a/controller/server/controller.go b/controller/server/controller.go index c82917537..579b86eb4 100644 --- a/controller/server/controller.go +++ b/controller/server/controller.go @@ -21,9 +21,9 @@ import ( "github.com/openziti/channel/v2" "github.com/openziti/ziti/common/pb/edge_ctrl_pb" runner2 "github.com/openziti/ziti/common/runner" + "github.com/openziti/ziti/controller/api_impl" "github.com/openziti/ziti/controller/handler_edge_mgmt" sync2 "github.com/openziti/ziti/controller/sync_strats" - "github.com/openziti/ziti/controller/api_impl" "os" "sync" "time" @@ -31,13 +31,13 @@ import ( "github.com/openziti/ziti/controller/internal/policy" "github.com/michaelquigley/pfxlog" + "github.com/openziti/storage/boltz" + "github.com/openziti/ziti/common/config" edgeconfig "github.com/openziti/ziti/controller/config" "github.com/openziti/ziti/controller/env" "github.com/openziti/ziti/controller/handler_edge_ctrl" _ "github.com/openziti/ziti/controller/internal/routes" "github.com/openziti/ziti/controller/model" - "github.com/openziti/ziti/common/config" - "github.com/openziti/storage/boltz" ) type Controller struct { @@ -153,6 +153,7 @@ func (c *Controller) GetCtrlHandlers(binding channel.Binding) []channel.TypedRec result := []channel.TypedReceiveHandler{ handler_edge_ctrl.NewSessionHeartbeatHandler(c.AppEnv), handler_edge_ctrl.NewCreateCircuitHandler(c.AppEnv, ch), + handler_edge_ctrl.NewCreateCircuitV2Handler(c.AppEnv, ch), handler_edge_ctrl.NewCreateTerminatorHandler(c.AppEnv, ch), handler_edge_ctrl.NewCreateTerminatorV2Handler(c.AppEnv, ch), handler_edge_ctrl.NewUpdateTerminatorHandler(c.AppEnv, ch), diff --git a/router/xgress/link_send_buffer.go b/router/xgress/link_send_buffer.go index 7c2763c6e..f862c33a4 100644 --- a/router/xgress/link_send_buffer.go +++ b/router/xgress/link_send_buffer.go @@ -99,7 +99,9 @@ func (self *txPayload) isRetransmittable() bool { } func NewLinkSendBuffer(x *Xgress) *LinkSendBuffer { - logrus.Debugf("txPortalStartSize = %d", x.Options.TxPortalStartSize) + logrus.Debugf("txPortalStartSize = %d, txPortalMinSize = %d", + x.Options.TxPortalStartSize, + x.Options.TxPortalMinSize) // newlyBuffered should be size 0, otherwise payloads can be sent and acks received before the payload is // processed by the LinkSendBuffer diff --git a/router/xgress_edge/listener.go b/router/xgress_edge/listener.go index 3fec41ef3..630e7d803 100644 --- a/router/xgress_edge/listener.go +++ b/router/xgress_edge/listener.go @@ -19,6 +19,7 @@ package xgress_edge import ( "encoding/binary" "fmt" + "github.com/openziti/ziti/common/ctrl_msg" "time" "github.com/openziti/ziti/common/capabilities" @@ -166,18 +167,15 @@ func (self *edgeClientConn) processConnect(req *channel.Message, ch channel.Chan terminatorIdentity, _ := req.GetStringHeader(edge.TerminatorIdentityHeader) - request := &edge_ctrl_pb.CreateCircuitRequest{ + request := &ctrl_msg.CreateCircuitRequest{ SessionToken: token, Fingerprints: self.fingerprints.Prints(), TerminatorInstanceId: terminatorIdentity, PeerData: peerData, } - response := &edge_ctrl_pb.CreateCircuitResponse{} - timeout := self.listener.options.Options.GetCircuitTimeout - responseMsg, err := protobufs.MarshalTyped(request).WithTimeout(timeout).SendForReply(ctrlCh) - - if err = getResultOrFailure(responseMsg, err, response); err != nil { + response, err := self.sendCreateCircuitRequest(request, ctrlCh) + if err != nil { log.WithError(err).Warn("failed to dial fabric") self.sendStateClosedReply(err.Error(), req) conn.close(false, "failed to dial fabric") @@ -192,6 +190,58 @@ func (self *edgeClientConn) processConnect(req *channel.Message, ch channel.Chan x.Start() } +func (self *edgeClientConn) sendCreateCircuitRequest(req *ctrl_msg.CreateCircuitRequest, ctrlCh channel.Channel) (*ctrl_msg.CreateCircuitResponse, error) { + if capabilities.IsCapable(ctrlCh, capabilities.ControllerCreateCircuitV2) { + return self.sendCreateCircuitRequestV2(req, ctrlCh) + } + return self.sendCreateCircuitRequestV1(req, ctrlCh) +} + +func (self *edgeClientConn) sendCreateCircuitRequestV1(req *ctrl_msg.CreateCircuitRequest, ctrlCh channel.Channel) (*ctrl_msg.CreateCircuitResponse, error) { + request := &edge_ctrl_pb.CreateCircuitRequest{ + SessionToken: req.SessionToken, + Fingerprints: req.Fingerprints, + TerminatorInstanceId: req.TerminatorInstanceId, + PeerData: req.PeerData, + } + + response := &edge_ctrl_pb.CreateCircuitResponse{} + timeout := self.listener.options.Options.GetCircuitTimeout + responseMsg, err := protobufs.MarshalTyped(request).WithTimeout(timeout).SendForReply(ctrlCh) + if err = getResultOrFailure(responseMsg, err, response); err != nil { + return nil, err + } + + return &ctrl_msg.CreateCircuitResponse{ + CircuitId: response.CircuitId, + Address: response.Address, + PeerData: response.PeerData, + Tags: response.Tags, + }, nil +} + +func (self *edgeClientConn) sendCreateCircuitRequestV2(req *ctrl_msg.CreateCircuitRequest, ctrlCh channel.Channel) (*ctrl_msg.CreateCircuitResponse, error) { + timeout := self.listener.options.Options.GetCircuitTimeout + msg, err := req.ToMessage().WithTimeout(timeout).SendForReply(ctrlCh) + if err != nil { + return nil, err + } + if msg.ContentType == int32(edge_ctrl_pb.ContentType_ErrorType) { + msg := string(msg.Body) + if msg == "" { + msg = "error state returned from controller with no message" + } + return nil, errors.New(msg) + } + + if msg.ContentType != int32(edge_ctrl_pb.ContentType_CreateCircuitV2ResponseType) { + return nil, errors.Errorf("unexpected response type %v to request. expected %v", + msg.ContentType, edge_ctrl_pb.ContentType_CreateCircuitV2ResponseType) + } + + return ctrl_msg.DecodeCreateCircuitResponse(msg) +} + func (self *edgeClientConn) processBind(req *channel.Message, ch channel.Channel) { ctrlCh := self.listener.factory.ctrls.AnyCtrlChannel() if ctrlCh == nil { diff --git a/router/xgress_edge_tunnel/factory.go b/router/xgress_edge_tunnel/factory.go index 7cf5128d0..6cfb435d8 100644 --- a/router/xgress_edge_tunnel/factory.go +++ b/router/xgress_edge_tunnel/factory.go @@ -17,17 +17,18 @@ package xgress_edge_tunnel import ( + "fmt" "github.com/michaelquigley/pfxlog" "github.com/openziti/channel/v2" - "github.com/openziti/ziti/common/pb/edge_ctrl_pb" - "github.com/openziti/ziti/router/fabric" - "github.com/openziti/ziti/router/handler_edge_ctrl" - "github.com/openziti/ziti/router" - "github.com/openziti/ziti/router/env" - "github.com/openziti/ziti/router/xgress" "github.com/openziti/foundation/v2/stringz" "github.com/openziti/identity" "github.com/openziti/metrics" + "github.com/openziti/ziti/common/pb/edge_ctrl_pb" + "github.com/openziti/ziti/router" + "github.com/openziti/ziti/router/env" + "github.com/openziti/ziti/router/fabric" + "github.com/openziti/ziti/router/handler_edge_ctrl" + "github.com/openziti/ziti/router/xgress" "github.com/pkg/errors" "strings" "time" @@ -107,6 +108,9 @@ func (self *Factory) CreateListener(optionsData xgress.OptionsData) (xgress.List return nil, err } self.tunneler.listenOptions = options + + pfxlog.Logger().Debugf("xgress edge tunnel options: %v", options.ToLoggableString()) + return self.tunneler, nil } @@ -234,3 +238,28 @@ func (options *Options) load(data xgress.OptionsData) error { return nil } + +func (options *Options) ToLoggableString() string { + buf := strings.Builder{} + buf.WriteString(fmt.Sprintf("mtu=%v\n", options.Mtu)) + buf.WriteString(fmt.Sprintf("randomDrops=%v\n", options.RandomDrops)) + buf.WriteString(fmt.Sprintf("drop1InN=%v\n", options.Drop1InN)) + buf.WriteString(fmt.Sprintf("txQueueSize=%v\n", options.TxQueueSize)) + buf.WriteString(fmt.Sprintf("txPortalStartSize=%v\n", options.TxPortalStartSize)) + buf.WriteString(fmt.Sprintf("txPortalMaxSize=%v\n", options.TxPortalMaxSize)) + buf.WriteString(fmt.Sprintf("txPortalMinSize=%v\n", options.TxPortalMinSize)) + buf.WriteString(fmt.Sprintf("txPortalIncreaseThresh=%v\n", options.TxPortalIncreaseThresh)) + buf.WriteString(fmt.Sprintf("txPortalIncreaseScale=%v\n", options.TxPortalIncreaseScale)) + buf.WriteString(fmt.Sprintf("txPortalRetxThresh=%v\n", options.TxPortalRetxThresh)) + buf.WriteString(fmt.Sprintf("txPortalRetxScale=%v\n", options.TxPortalRetxScale)) + buf.WriteString(fmt.Sprintf("txPortalDupAckThresh=%v\n", options.TxPortalDupAckThresh)) + buf.WriteString(fmt.Sprintf("txPortalDupAckScale=%v\n", options.TxPortalDupAckScale)) + buf.WriteString(fmt.Sprintf("rxBufferSize=%v\n", options.RxBufferSize)) + buf.WriteString(fmt.Sprintf("retxStartMs=%v\n", options.RetxStartMs)) + buf.WriteString(fmt.Sprintf("retxScale=%v\n", options.RetxScale)) + buf.WriteString(fmt.Sprintf("retxAddMs=%v\n", options.RetxAddMs)) + buf.WriteString(fmt.Sprintf("maxCloseWait=%v\n", options.MaxCloseWait)) + buf.WriteString(fmt.Sprintf("getCircuitTimeout=%v\n", options.GetCircuitTimeout)) + + return buf.String() +} diff --git a/zititest/models/zrok-test/main.go b/zititest/models/zrok-test/main.go index 662239f38..afee2b059 100644 --- a/zititest/models/zrok-test/main.go +++ b/zititest/models/zrok-test/main.go @@ -335,6 +335,21 @@ var m = &model.Model{ component.StopInParallelHostExclusive("*", 15), host.GroupExec("*", 25, "rm -f logs/*"), )), + "startServers": model.Bind(actions.Workflow( + component.StopInParallelHostExclusive("*", 200), + component.Start(".ctrl"), + component.Start(".router"), + component.Start(".zrokCtrl"), + component.Start(".zrokFront"), + )), + "restartServers": model.Bind(actions.Workflow( + host.GroupExec("*", 50, "find fablab -type d -exec chmod 755 {} \\;"), + component.StopInParallelHostExclusive("*", 200), + component.Start(".ctrl"), + component.Start(".router"), + component.Start(".zrokCtrl"), + component.Start(".zrokFront"), + )), "login": model.Bind(edge.Login("#ctrl1")), }, diff --git a/zititest/zitilab/component_zrok_looptest.go b/zititest/zitilab/component_zrok_looptest.go index 478aaa155..6b529ee5e 100644 --- a/zititest/zitilab/component_zrok_looptest.go +++ b/zititest/zitilab/component_zrok_looptest.go @@ -61,16 +61,17 @@ func (self *ZrokLoopTestType) StageFiles(r model.Run, c *model.Component) error return stageziti.StageZrokOnce(r, c, self.Version, self.LocalPath) } -func (self *ZrokLoopTestType) getProcessFilter() func(string) bool { +func (self *ZrokLoopTestType) getProcessFilter(c *model.Component) func(string) bool { return func(s string) bool { return strings.Contains(s, "zrok") && strings.Contains(s, " test loop public") && - !strings.Contains(s, "sudo") + !strings.Contains(s, "sudo") && + strings.Contains(s, fmt.Sprintf("--max-dwell-ms %d", 1000+c.ScaleIndex)) } } func (self *ZrokLoopTestType) IsRunning(_ model.Run, c *model.Component) (bool, error) { - pids, err := c.GetHost().FindProcesses(self.getProcessFilter()) + pids, err := c.GetHost().FindProcesses(self.getProcessFilter(c)) if err != nil { return false, err } @@ -84,8 +85,10 @@ func (self *ZrokLoopTestType) Start(_ model.Run, c *model.Component) error { binaryPath := getBinaryPath(c, constants.ZROK, self.Version) logsPath := fmt.Sprintf("/home/%s/logs/%s.log", user, c.Id) - serviceCmd := fmt.Sprintf("nohup sudo -u %s %s test loop public --iterations %v --loopers %v --min-pacing-ms %v --max-pacing-ms %v 2>&1 &> %s &", - userId, binaryPath, self.Iterations, self.Loopers, self.Pacing.Milliseconds(), self.Pacing.Milliseconds(), logsPath) + maxDwell := 1000 + c.ScaleIndex + serviceCmd := fmt.Sprintf("nohup sudo -u %s %s test loop public --iterations %v --loopers %v --min-pacing-ms %v --max-pacing-ms %v "+ + "--max-dwell-ms %d 2>&1 &> %s &", + userId, binaryPath, self.Iterations, self.Loopers, self.Pacing.Milliseconds(), self.Pacing.Milliseconds(), maxDwell, logsPath) if quiet, _ := c.GetBoolVariable("quiet_startup"); !quiet { logrus.Info(serviceCmd) @@ -104,7 +107,7 @@ func (self *ZrokLoopTestType) Start(_ model.Run, c *model.Component) error { } func (self *ZrokLoopTestType) Stop(_ model.Run, c *model.Component) error { - return c.GetHost().KillProcesses("-TERM", self.getProcessFilter()) + return c.GetHost().KillProcesses("-TERM", self.getProcessFilter(c)) } func (self *ZrokLoopTestType) getUnixUser(c *model.Component) string { From b9e8a1a903481265a5722a9232d9ca5985cd7aee Mon Sep 17 00:00:00 2001 From: Paul Lorenz Date: Mon, 5 Feb 2024 18:30:25 -0500 Subject: [PATCH 7/7] Update deps and changelog --- CHANGELOG.md | 28 +++++++++++++++++++++++++ go.mod | 26 ++++++++++++------------ go.sum | 54 +++++++++++++++++++++++++------------------------ zititest/go.mod | 24 +++++++++++----------- zititest/go.sum | 48 +++++++++++++++++++++---------------------- 5 files changed, 105 insertions(+), 75 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a238c178..43d19e9d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,31 @@ +# Release 0.32.2 + +## What's New + +* Terminator performance improvements +* API Rate Limiter enabled by default + +## Component Updates and Bug Fixes + +* github.com/openziti/channel/v2: [v2.0.117 -> v2.0.119](https://github.com/openziti/channel/compare/v2.0.117...v2.0.119) + * [Issue #127](https://github.com/openziti/channel/issues/127) - Support some additional types in message headers + +* github.com/openziti/foundation/v2: [v2.0.36 -> v2.0.37](https://github.com/openziti/foundation/compare/v2.0.36...v2.0.37) +* github.com/openziti/identity: [v1.0.69 -> v1.0.70](https://github.com/openziti/identity/compare/v1.0.69...v1.0.70) +* github.com/openziti/metrics: [v1.2.43 -> v1.2.45](https://github.com/openziti/metrics/compare/v1.2.43...v1.2.45) +* github.com/openziti/runzmd: [v1.0.37 -> v1.0.38](https://github.com/openziti/runzmd/compare/v1.0.37...v1.0.38) +* github.com/openziti/sdk-golang: [v0.22.21 -> v0.22.28](https://github.com/openziti/sdk-golang/compare/v0.22.21...v0.22.28) + * [Issue #495](https://github.com/openziti/sdk-golang/issues/495) - Refresh edge session if listen attempt fails, to ensure that session is still valid + +* github.com/openziti/storage: [v0.2.28 -> v0.2.30](https://github.com/openziti/storage/compare/v0.2.28...v0.2.30) +* github.com/openziti/transport/v2: [v2.0.121 -> v2.0.122](https://github.com/openziti/transport/compare/v2.0.121...v2.0.122) +* github.com/openziti/ziti: [v0.32.1 -> v0.32.2](https://github.com/openziti/ziti/compare/v0.32.1...v0.32.2) + * [Issue #1736](https://github.com/openziti/ziti/issues/1736) - controller crashes generating create circuit responses + * [Issue #1733](https://github.com/openziti/ziti/issues/1733) - Improve terminator creation performance + * [Issue #1734](https://github.com/openziti/ziti/issues/1734) - Make API rate limiter enabled by default + * [Issue #1726](https://github.com/openziti/ziti/issues/1726) - Fix some sdk hosting logging + * [Issue #1725](https://github.com/openziti/ziti/issues/1725) - Fix panic in entity event processing + # Release 0.32.1 ## What's New diff --git a/go.mod b/go.mod index e528be485..1e441d78a 100644 --- a/go.mod +++ b/go.mod @@ -28,7 +28,7 @@ require ( github.com/golang-jwt/jwt/v5 v5.2.0 github.com/google/go-cmp v0.6.0 github.com/google/gopacket v1.1.19 - github.com/google/uuid v1.5.0 + github.com/google/uuid v1.6.0 github.com/gorilla/handlers v1.5.2 github.com/gorilla/mux v1.8.1 github.com/gorilla/websocket v1.5.1 @@ -47,17 +47,17 @@ require ( github.com/mitchellh/mapstructure v1.5.0 github.com/natefinch/lumberjack v2.0.0+incompatible github.com/openziti/agent v1.0.16 - github.com/openziti/channel/v2 v2.0.112 + github.com/openziti/channel/v2 v2.0.119 github.com/openziti/edge-api v0.26.10 - github.com/openziti/foundation/v2 v2.0.36 - github.com/openziti/identity v1.0.69 + github.com/openziti/foundation/v2 v2.0.37 + github.com/openziti/identity v1.0.70 github.com/openziti/jwks v1.0.3 - github.com/openziti/metrics v1.2.42 - github.com/openziti/runzmd v1.0.37 - github.com/openziti/sdk-golang v0.22.4 + github.com/openziti/metrics v1.2.45 + github.com/openziti/runzmd v1.0.38 + github.com/openziti/sdk-golang v0.22.28 github.com/openziti/secretstream v0.1.16 - github.com/openziti/storage v0.2.28 - github.com/openziti/transport/v2 v2.0.121 + github.com/openziti/storage v0.2.30 + github.com/openziti/transport/v2 v2.0.122 github.com/openziti/x509-claims v1.0.3 github.com/openziti/xweb/v2 v2.1.0 github.com/openziti/ziti-db-explorer v1.1.3 @@ -66,7 +66,7 @@ require ( github.com/rabbitmq/amqp091-go v1.8.1 github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 github.com/russross/blackfriday v1.6.0 - github.com/shirou/gopsutil/v3 v3.23.12 + github.com/shirou/gopsutil/v3 v3.24.1 github.com/sirupsen/logrus v1.9.3 github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e github.com/spf13/cobra v1.8.0 @@ -81,9 +81,9 @@ require ( golang.org/x/crypto v0.18.0 golang.org/x/net v0.20.0 golang.org/x/sync v0.6.0 - golang.org/x/sys v0.16.0 + golang.org/x/sys v0.17.0 golang.org/x/text v0.14.0 - google.golang.org/protobuf v1.31.0 + google.golang.org/protobuf v1.32.0 gopkg.in/AlecAivazis/survey.v1 v1.8.7 gopkg.in/resty.v1 v1.12.0 gopkg.in/square/go-jose.v2 v2.6.0 @@ -184,7 +184,7 @@ require ( golang.org/x/image v0.13.0 // indirect golang.org/x/mod v0.14.0 // indirect golang.org/x/oauth2 v0.16.0 // indirect - golang.org/x/term v0.16.0 // indirect + golang.org/x/term v0.17.0 // indirect golang.org/x/tools v0.16.0 // indirect google.golang.org/appengine v1.6.8 // indirect gopkg.in/ini.v1 v1.67.0 // indirect diff --git a/go.sum b/go.sum index 9b2e84592..67e5bd68c 100644 --- a/go.sum +++ b/go.sum @@ -324,8 +324,8 @@ github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= -github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= @@ -403,6 +403,8 @@ github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1 github.com/jedib0t/go-pretty/v6 v6.5.3 h1:GIXn6Er/anHTkVUoufs7ptEvxdD6KIhR7Axa2wYCPF0= github.com/jedib0t/go-pretty/v6 v6.5.3/go.mod h1:5LQIxa52oJ/DlDSLv0HEkWOFMDGoWkJb9ss5KqPpJBg= github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= +github.com/jeremija/gosubmit v0.2.7 h1:At0OhGCFGPXyjPYAsCchoBUhE099pcBXmsb4iZqROIc= +github.com/jeremija/gosubmit v0.2.7/go.mod h1:Ui+HS073lCFREXBbdfrJzMB57OI/bdxTiLtrDHHhFPI= github.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc= github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8= @@ -563,30 +565,30 @@ github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYr github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= github.com/openziti/agent v1.0.16 h1:9Saji+8hFE1NpzP2XzDhsVJbCrDlhixoLHfOpFt5Z+U= github.com/openziti/agent v1.0.16/go.mod h1:zfm53+PVWoGFzjGGgQdKby5749G6VRYHe+eQJmoVKy4= -github.com/openziti/channel/v2 v2.0.112 h1:w7HYZ5RG+bLcsrGt19WjcEoogD9Qn0dLXYZJds1THGo= -github.com/openziti/channel/v2 v2.0.112/go.mod h1:abw0qwT0MzWvh1eI2P6D6CD17PRHL8EEo1d3DHCyCdM= +github.com/openziti/channel/v2 v2.0.119 h1:stfSrnDqoTi78LMvQA3+NSivHjQnRrYKrgij5NaOENI= +github.com/openziti/channel/v2 v2.0.119/go.mod h1:lSRJwqmbkE34DgXYEmUhVCzwcQcx65vZGE8nuBNK458= github.com/openziti/dilithium v0.3.3 h1:PLgQ6PMNLSTzCFbX/h98cmudgz/cU6TmjdSv5NAPD8k= github.com/openziti/dilithium v0.3.3/go.mod h1:vsCjI2AU/hon9e+dLhUFbCNGesJDj2ASgkySOcpmvjo= github.com/openziti/edge-api v0.26.10 h1:LEDuJHZsExi0PBVO9iVuIdZWJ7eFo/i4TJhXoSFmfOU= github.com/openziti/edge-api v0.26.10/go.mod h1:FQLjav9AfqxQYSL0xKPDZ/JWTSZXApkk7jM2/iczGXM= -github.com/openziti/foundation/v2 v2.0.36 h1:ogEIvsWur8/9mUzf9NOB4hRUyx372Uy6AmnHRcurIkY= -github.com/openziti/foundation/v2 v2.0.36/go.mod h1:MdK2oAJSwo7iCfvVdG16ZGz47qP7nG97ovnqEdXW2kQ= -github.com/openziti/identity v1.0.69 h1:wNgQomnv8ar2S1wge9jQK1jpqE2virOKKG8GyfTiHMQ= -github.com/openziti/identity v1.0.69/go.mod h1:+7hQNAG5nUUdz0165OubWpMHkP/ZVJB3nv9HUXXi9H8= +github.com/openziti/foundation/v2 v2.0.37 h1:7pa4vWrlwllEoLXaK2rx91AffLQJ8k5pvc92oWANavA= +github.com/openziti/foundation/v2 v2.0.37/go.mod h1:2NxzCnJbMw35U9RrFcdEaiXdxIMfBHOUNPngpyhvKeY= +github.com/openziti/identity v1.0.70 h1:JNwtJHmIS0DcXookm2xuXyh4z92T1O21GQvuO8PmHWs= +github.com/openziti/identity v1.0.70/go.mod h1:jsKBL4G1BsmDSCIfhK4jha5B3Sevgy1jyZq0GtFKhSk= github.com/openziti/jwks v1.0.3 h1:hf8wkb+Cg4nH/HM0KROFd7u+C3DkRVcFZJ7tDV+4icc= github.com/openziti/jwks v1.0.3/go.mod h1:t4xxq8vlXGsPn29kiQVnZBBDDnEoOFqtJoHibkJunQQ= -github.com/openziti/metrics v1.2.42 h1:JRRwIIRkcMj/a03lRM1xej+DZ44NNQde/2YU3juySSo= -github.com/openziti/metrics v1.2.42/go.mod h1:4f31ogWZzkHieDbpWeVhKiADa2GZeVlHILA0cqDbljw= -github.com/openziti/runzmd v1.0.37 h1:qj2r9z4t7OAdmIXMdGbP9Su6TqA0bLdD2RMjJ71LRS0= -github.com/openziti/runzmd v1.0.37/go.mod h1:eKhqJsGoLeDHex/o5Mw6TcNJxlVljafSVm7ZU+bX5G8= -github.com/openziti/sdk-golang v0.22.4 h1:W9HYVE5vvE3u4yhpL4ArF5z0iAlBwKWniBUmKgTHiF4= -github.com/openziti/sdk-golang v0.22.4/go.mod h1:ErUmL+w2QEvPHXDg4UMg6dfOLlFVJYbKmulq1D+mNpg= +github.com/openziti/metrics v1.2.45 h1:+3zqszLWyFdTgzbsQD90V0yJcC9Ek77qKaIGMQXkAXs= +github.com/openziti/metrics v1.2.45/go.mod h1:g6CgAEbFes2UtdfGrsR8AKkuoBVL5dkU61843uQvllM= +github.com/openziti/runzmd v1.0.38 h1:0eFWAf7R9Thx99ue7Gql2dBavsqv4jldU8W5AIZJ8wo= +github.com/openziti/runzmd v1.0.38/go.mod h1:WiQi+YIXxZBH1bwjr+eo/e3ftfTLEABpN0i2QIhBI9w= +github.com/openziti/sdk-golang v0.22.28 h1:s159CT42dXug4GiJiN/kM6/ol+N2LFZ2tUk6bOpbgiI= +github.com/openziti/sdk-golang v0.22.28/go.mod h1:BLaLvcLqAgf3JFoDPWLTj3j3X5rndo6ZejdDdkMlihQ= github.com/openziti/secretstream v0.1.16 h1:tVanF7OpJL1MJ1gvWaRlR2i+kAbrGsxr3q6EXFOS08U= github.com/openziti/secretstream v0.1.16/go.mod h1:bvjGBUW/0e5MzD5S3FW3rhGASRNWAi+kTkTENZ9qRDE= -github.com/openziti/storage v0.2.28 h1:qHnsSF4RgQpT23hOXlwkAvJ0gO5PLmvTqyBy13dm3Rc= -github.com/openziti/storage v0.2.28/go.mod h1:ahdvsmmdQWFsZXeExvXeA8MHUXPLrwuDFBJDTztLY5E= -github.com/openziti/transport/v2 v2.0.121 h1:9WB1/9YMFed2UuefqZq+odUYYkoFOr+8aBIAZEC1MNE= -github.com/openziti/transport/v2 v2.0.121/go.mod h1:hS7TzoyTIwm4lVEsGyjQkoEg+vA+6dAOR8S4FZmWIj4= +github.com/openziti/storage v0.2.30 h1:15o8rSSgtcNCSBONt81ZRASQXJHh2L9Y0aWcHoQ81dE= +github.com/openziti/storage v0.2.30/go.mod h1:ltsgk2G0c3jVZVTK5bHkRtblGdFFoSJ3fOMur/0iFKg= +github.com/openziti/transport/v2 v2.0.122 h1:XWwZ6JcSO1nvbZgfp6kdf8aR5LEEN343mpZlhSihirk= +github.com/openziti/transport/v2 v2.0.122/go.mod h1:07Ak2jMsyZmi7/ECxGNfMXk8cF1Vj5qtKj90FoAnK8A= github.com/openziti/x509-claims v1.0.3 h1:HNdQ8Nf1agB3lBs1gahcO6zfkeS4S5xoQ2/PkY4HRX0= github.com/openziti/x509-claims v1.0.3/go.mod h1:Z0WIpBm6c4ecrpRKrou6Gk2wrLWxJO/+tuUwKh8VewE= github.com/openziti/xweb/v2 v2.1.0 h1:Xhh3C2pZkq/Prr65V+SfFSibLDYteoc4f62KQCcTZF4= @@ -671,8 +673,8 @@ github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6g github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/shirou/gopsutil/v3 v3.23.12 h1:z90NtUkp3bMtmICZKpC4+WaknU1eXtp5vtbQ11DgpE4= -github.com/shirou/gopsutil/v3 v3.23.12/go.mod h1:1FrWgea594Jp7qmjHUUPlJDTPgcsb9mGnXDxavtikzM= +github.com/shirou/gopsutil/v3 v3.24.1 h1:R3t6ondCEvmARp3wxODhXMTLC/klMa87h2PHUw5m7QI= +github.com/shirou/gopsutil/v3 v3.24.1/go.mod h1:UU7a2MSBQa+kW1uuDq8DeEBS8kmrnQwsv2b5O513rwU= github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= @@ -1076,17 +1078,17 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= -golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1289,8 +1291,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/AlecAivazis/survey.v1 v1.8.7 h1:oBJqtgsyBLg9K5FK9twNUbcPnbCPoh+R9a+7nag3qJM= gopkg.in/AlecAivazis/survey.v1 v1.8.7/go.mod h1:iBNOmqKz/NUbZx3bA+4hAGLRC7fSK7tgtVDT4tB22XA= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= diff --git a/zititest/go.mod b/zititest/go.mod index 39604580e..5aab44155 100644 --- a/zititest/go.mod +++ b/zititest/go.mod @@ -9,18 +9,18 @@ require ( github.com/Jeffail/gabs/v2 v2.7.0 github.com/go-openapi/runtime v0.27.1 github.com/google/go-cmp v0.6.0 - github.com/google/uuid v1.5.0 + github.com/google/uuid v1.6.0 github.com/gorilla/websocket v1.5.1 github.com/michaelquigley/pfxlog v0.6.10 github.com/openziti/agent v1.0.16 - github.com/openziti/channel/v2 v2.0.117 + github.com/openziti/channel/v2 v2.0.119 github.com/openziti/edge-api v0.26.10 github.com/openziti/fablab v0.5.42 - github.com/openziti/foundation/v2 v2.0.36 - github.com/openziti/identity v1.0.69 - github.com/openziti/sdk-golang v0.22.21 - github.com/openziti/storage v0.2.28 - github.com/openziti/transport/v2 v2.0.121 + github.com/openziti/foundation/v2 v2.0.37 + github.com/openziti/identity v1.0.70 + github.com/openziti/sdk-golang v0.22.28 + github.com/openziti/storage v0.2.30 + github.com/openziti/transport/v2 v2.0.122 github.com/openziti/ziti v0.28.3 github.com/pkg/errors v0.9.1 github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 @@ -136,8 +136,8 @@ require ( github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/openziti/dilithium v0.3.3 // indirect github.com/openziti/jwks v1.0.3 // indirect - github.com/openziti/metrics v1.2.43 // indirect - github.com/openziti/runzmd v1.0.37 // indirect + github.com/openziti/metrics v1.2.45 // indirect + github.com/openziti/runzmd v1.0.38 // indirect github.com/openziti/secretstream v0.1.16 // indirect github.com/openziti/x509-claims v1.0.3 // indirect github.com/openziti/xweb/v2 v2.1.0 // indirect @@ -156,7 +156,7 @@ require ( github.com/russross/blackfriday v1.6.0 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect - github.com/shirou/gopsutil/v3 v3.23.12 // indirect + github.com/shirou/gopsutil/v3 v3.24.1 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e // indirect github.com/sourcegraph/conc v0.3.0 // indirect @@ -190,8 +190,8 @@ require ( golang.org/x/mod v0.14.0 // indirect golang.org/x/oauth2 v0.16.0 // indirect golang.org/x/sync v0.6.0 // indirect - golang.org/x/sys v0.16.0 // indirect - golang.org/x/term v0.16.0 // indirect + golang.org/x/sys v0.17.0 // indirect + golang.org/x/term v0.17.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/tools v0.16.0 // indirect google.golang.org/appengine v1.6.8 // indirect diff --git a/zititest/go.sum b/zititest/go.sum index 5af3fb4b8..99527bc9c 100644 --- a/zititest/go.sum +++ b/zititest/go.sum @@ -327,8 +327,8 @@ github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= -github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= @@ -587,32 +587,32 @@ github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYr github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= github.com/openziti/agent v1.0.16 h1:9Saji+8hFE1NpzP2XzDhsVJbCrDlhixoLHfOpFt5Z+U= github.com/openziti/agent v1.0.16/go.mod h1:zfm53+PVWoGFzjGGgQdKby5749G6VRYHe+eQJmoVKy4= -github.com/openziti/channel/v2 v2.0.117 h1:9EUNJIA4NCosn+Uci0gYNiDMsGBX52Jd34wpziW+zPA= -github.com/openziti/channel/v2 v2.0.117/go.mod h1:RADBBOkbwpFMmbznU3bZmUsBB646seqZnQ7GPI6Chjg= +github.com/openziti/channel/v2 v2.0.119 h1:stfSrnDqoTi78LMvQA3+NSivHjQnRrYKrgij5NaOENI= +github.com/openziti/channel/v2 v2.0.119/go.mod h1:lSRJwqmbkE34DgXYEmUhVCzwcQcx65vZGE8nuBNK458= github.com/openziti/dilithium v0.3.3 h1:PLgQ6PMNLSTzCFbX/h98cmudgz/cU6TmjdSv5NAPD8k= github.com/openziti/dilithium v0.3.3/go.mod h1:vsCjI2AU/hon9e+dLhUFbCNGesJDj2ASgkySOcpmvjo= github.com/openziti/edge-api v0.26.10 h1:LEDuJHZsExi0PBVO9iVuIdZWJ7eFo/i4TJhXoSFmfOU= github.com/openziti/edge-api v0.26.10/go.mod h1:FQLjav9AfqxQYSL0xKPDZ/JWTSZXApkk7jM2/iczGXM= github.com/openziti/fablab v0.5.42 h1:vENJKfEba2T4sSLwlKDL/IzBYfY8iHnhc4umf6IESiY= github.com/openziti/fablab v0.5.42/go.mod h1:HDT06y1QX8kO8ZQrgHvZmJsvc8iRybESGtlDLDII4ks= -github.com/openziti/foundation/v2 v2.0.36 h1:ogEIvsWur8/9mUzf9NOB4hRUyx372Uy6AmnHRcurIkY= -github.com/openziti/foundation/v2 v2.0.36/go.mod h1:MdK2oAJSwo7iCfvVdG16ZGz47qP7nG97ovnqEdXW2kQ= -github.com/openziti/identity v1.0.69 h1:wNgQomnv8ar2S1wge9jQK1jpqE2virOKKG8GyfTiHMQ= -github.com/openziti/identity v1.0.69/go.mod h1:+7hQNAG5nUUdz0165OubWpMHkP/ZVJB3nv9HUXXi9H8= +github.com/openziti/foundation/v2 v2.0.37 h1:7pa4vWrlwllEoLXaK2rx91AffLQJ8k5pvc92oWANavA= +github.com/openziti/foundation/v2 v2.0.37/go.mod h1:2NxzCnJbMw35U9RrFcdEaiXdxIMfBHOUNPngpyhvKeY= +github.com/openziti/identity v1.0.70 h1:JNwtJHmIS0DcXookm2xuXyh4z92T1O21GQvuO8PmHWs= +github.com/openziti/identity v1.0.70/go.mod h1:jsKBL4G1BsmDSCIfhK4jha5B3Sevgy1jyZq0GtFKhSk= github.com/openziti/jwks v1.0.3 h1:hf8wkb+Cg4nH/HM0KROFd7u+C3DkRVcFZJ7tDV+4icc= github.com/openziti/jwks v1.0.3/go.mod h1:t4xxq8vlXGsPn29kiQVnZBBDDnEoOFqtJoHibkJunQQ= -github.com/openziti/metrics v1.2.43 h1:DSrmpLhoA45DlLVNdKOn2lBfCM0/r6wKz+3SDXe8X7Y= -github.com/openziti/metrics v1.2.43/go.mod h1:+RY4avT60Vbxb9wyfvRD0msrARyYCB5+heb8VIZzCm8= -github.com/openziti/runzmd v1.0.37 h1:qj2r9z4t7OAdmIXMdGbP9Su6TqA0bLdD2RMjJ71LRS0= -github.com/openziti/runzmd v1.0.37/go.mod h1:eKhqJsGoLeDHex/o5Mw6TcNJxlVljafSVm7ZU+bX5G8= -github.com/openziti/sdk-golang v0.22.21 h1:rj8gCq9SPcRpStPX0GUL8X2vkCQNUn+nk2WbyY82b/Y= -github.com/openziti/sdk-golang v0.22.21/go.mod h1:w3M9yAVnW7IAU1dpYtiFB/mIYLiU7l4tB+c4coqWRwo= +github.com/openziti/metrics v1.2.45 h1:+3zqszLWyFdTgzbsQD90V0yJcC9Ek77qKaIGMQXkAXs= +github.com/openziti/metrics v1.2.45/go.mod h1:g6CgAEbFes2UtdfGrsR8AKkuoBVL5dkU61843uQvllM= +github.com/openziti/runzmd v1.0.38 h1:0eFWAf7R9Thx99ue7Gql2dBavsqv4jldU8W5AIZJ8wo= +github.com/openziti/runzmd v1.0.38/go.mod h1:WiQi+YIXxZBH1bwjr+eo/e3ftfTLEABpN0i2QIhBI9w= +github.com/openziti/sdk-golang v0.22.28 h1:s159CT42dXug4GiJiN/kM6/ol+N2LFZ2tUk6bOpbgiI= +github.com/openziti/sdk-golang v0.22.28/go.mod h1:BLaLvcLqAgf3JFoDPWLTj3j3X5rndo6ZejdDdkMlihQ= github.com/openziti/secretstream v0.1.16 h1:tVanF7OpJL1MJ1gvWaRlR2i+kAbrGsxr3q6EXFOS08U= github.com/openziti/secretstream v0.1.16/go.mod h1:bvjGBUW/0e5MzD5S3FW3rhGASRNWAi+kTkTENZ9qRDE= -github.com/openziti/storage v0.2.28 h1:qHnsSF4RgQpT23hOXlwkAvJ0gO5PLmvTqyBy13dm3Rc= -github.com/openziti/storage v0.2.28/go.mod h1:ahdvsmmdQWFsZXeExvXeA8MHUXPLrwuDFBJDTztLY5E= -github.com/openziti/transport/v2 v2.0.121 h1:9WB1/9YMFed2UuefqZq+odUYYkoFOr+8aBIAZEC1MNE= -github.com/openziti/transport/v2 v2.0.121/go.mod h1:hS7TzoyTIwm4lVEsGyjQkoEg+vA+6dAOR8S4FZmWIj4= +github.com/openziti/storage v0.2.30 h1:15o8rSSgtcNCSBONt81ZRASQXJHh2L9Y0aWcHoQ81dE= +github.com/openziti/storage v0.2.30/go.mod h1:ltsgk2G0c3jVZVTK5bHkRtblGdFFoSJ3fOMur/0iFKg= +github.com/openziti/transport/v2 v2.0.122 h1:XWwZ6JcSO1nvbZgfp6kdf8aR5LEEN343mpZlhSihirk= +github.com/openziti/transport/v2 v2.0.122/go.mod h1:07Ak2jMsyZmi7/ECxGNfMXk8cF1Vj5qtKj90FoAnK8A= github.com/openziti/x509-claims v1.0.3 h1:HNdQ8Nf1agB3lBs1gahcO6zfkeS4S5xoQ2/PkY4HRX0= github.com/openziti/x509-claims v1.0.3/go.mod h1:Z0WIpBm6c4ecrpRKrou6Gk2wrLWxJO/+tuUwKh8VewE= github.com/openziti/xweb/v2 v2.1.0 h1:Xhh3C2pZkq/Prr65V+SfFSibLDYteoc4f62KQCcTZF4= @@ -699,8 +699,8 @@ github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6g github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/shirou/gopsutil/v3 v3.23.12 h1:z90NtUkp3bMtmICZKpC4+WaknU1eXtp5vtbQ11DgpE4= -github.com/shirou/gopsutil/v3 v3.23.12/go.mod h1:1FrWgea594Jp7qmjHUUPlJDTPgcsb9mGnXDxavtikzM= +github.com/shirou/gopsutil/v3 v3.24.1 h1:R3t6ondCEvmARp3wxODhXMTLC/klMa87h2PHUw5m7QI= +github.com/shirou/gopsutil/v3 v3.24.1/go.mod h1:UU7a2MSBQa+kW1uuDq8DeEBS8kmrnQwsv2b5O513rwU= github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= @@ -1105,17 +1105,17 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= -golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=