From 644742b8e65129beb76d6b22030bf30adb191a33 Mon Sep 17 00:00:00 2001 From: Paul Lorenz Date: Tue, 26 Apr 2022 16:10:08 -0400 Subject: [PATCH] Update changelog and deps --- CHANGELOG.md | 19 +- etc/ctrl.with.edge.yml | 8 + etc/ctrl.yml | 9 +- go.mod | 22 +-- go.sum | 168 +++--------------- ziti-fabric-test/subcmd/loop3/pb/loop3.pb.go | 135 +++++++++----- ziti-fabric-test/subcmd/loop3/pb/loop3.proto | 30 ++-- ziti-fabric-test/subcmd/loop3/protocol.go | 77 +++++--- ziti-fabric-test/subcmd/loop3/scenario.go | 42 +++-- ziti-router/subcmd/root.go | 4 +- ziti-router/subcmd/run.go | 18 +- ziti/cmd/ziti/cmd/agent.go | 1 + ziti/cmd/ziti/cmd/agent_router_forget_link.go | 107 +++++++++++ ziti/cmd/ziti/cmd/common/options.go | 12 ++ .../ziti/cmd/config_templates/controller.yml | 48 ++++- ziti/cmd/ziti/cmd/demo/echo-notes.txt | 6 + ziti/cmd/ziti/cmd/demo/root.go | 1 + .../setup-multi-tunneler-hosted-service.go | 86 +++++++++ .../multi-router-tunneler-hosted.md | 1 + .../setup-scripts/multi-tunneler-hosted.md | 99 +++++++++++ .../single-router-tunneler-hosted.md | 3 +- ziti/cmd/ziti/cmd/edge/list.go | 5 +- ziti/cmd/ziti/cmd/edge/show.go | 24 +-- ziti/cmd/ziti/cmd/edge/traceroute.go | 14 +- ziti/cmd/ziti/cmd/fabric/inspect.go | 56 +++++- 25 files changed, 703 insertions(+), 292 deletions(-) create mode 100644 ziti/cmd/ziti/cmd/agent_router_forget_link.go create mode 100644 ziti/cmd/ziti/cmd/demo/setup-multi-tunneler-hosted-service.go create mode 100644 ziti/cmd/ziti/cmd/demo/setup-scripts/multi-tunneler-hosted.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 11b1c25a8..747c22505 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,10 +30,27 @@ * Enhancement: `ziti db explore ` command has been added to explore offline database files * Enhancement: The mgmt API is now available via websocket. The stream commands are now available on `ziti fabric` * Enhancement: Most list commands have been updated with tabular output -* Enhancement: `ziti edge show` is now available with subcommands `config-definition` and `config-type-schema` +* Enhancement: `ziti edge show` is now available with subcommands `config` and `config-type` + * `ziti edge list configs` no longer shows the associated json. It can be viewed using `ziti edge show config ` * Enhancement: `ziti edge update config-type` is now available * Enhancement: `ziti edge create|update identity` now supports `--external-id` * Bug fix: Fixes an issue where the router config would use hostname instead of the DNS name +* Bug fix: When establishing links, a link could be closed while being registered, leading the controlller and router to get out of sync +* Enhancement: Add min router cost. Helps to minimize unnecessary hops. + * Defaults to 10, configurable in the controller config with the minRouterCost value under `network:` +* Enhancement: Can now see xgress instance and link send buffer pointer values in circuit inspections. This allows correlating to stackdumps +* Enhancement: Can now see xgress related goroutines by using `ziti fabric inspect '.*' circuitAndStacks:` +* Enhancement: If a router connects to the controller but is already connected, the new connection now takes precedence + * There is a configurable churn limit, which limits how often this can happen. + * The default is 1 minute and is settable via `routerConnectChurnLimit` under `network` +* Enhancement: Flow control changes + * Duplicate acks won't shrink window. Duplicate acks imply retransmits and the retransmits already affect the window size + * Drop min round trip time scaling to 1.5 as will get scaled up as needed by duplicate ack detection + * Drop round trip time addition to 0 from 100ms and rely purely on scaling + * Avoid potential stall by always allowing at least one payload into sender side, even when receiver is full. + * This way if receiver signal to sender is lost, we'll still having something trying to send +* Enhancement: When router reconnects to controller, re-establish any embedded tunneler hosting on that router to ensure router and controller are in sync + ## External JWT Signer Issuer & Audience Validation diff --git a/etc/ctrl.with.edge.yml b/etc/ctrl.with.edge.yml index 8c892d5a3..f926847f7 100644 --- a/etc/ctrl.with.edge.yml +++ b/etc/ctrl.with.edge.yml @@ -1,5 +1,13 @@ v: 3 +network: + # Sets router minimum cost. Defaults to 10 + minRouterCost: 10 + + # Sets how often a new control channel connection can take over for a router with an existing control channel connection + # Defaults to 1 minute + routerConnectChurnLimit: 1m + #trace: # path: ctrl.trace diff --git a/etc/ctrl.yml b/etc/ctrl.yml index 9d54fd146..62b67fd12 100644 --- a/etc/ctrl.yml +++ b/etc/ctrl.yml @@ -44,7 +44,14 @@ identity: # running on the network. # cycleSeconds: 15 - # + + # Sets router minimum cost. Defaults to 10 + minRouterCost: 10 + + # Sets how often a new control channel connection can take over for a router with an existing control channel connection + # Defaults to 1 minute + routerConnectChurnLimit: 1m + #smart: # # Defines the fractional upper limit of underperforming circuits that are candidates to be re-routed. If diff --git a/go.mod b/go.mod index f878590e6..2bd36eecd 100644 --- a/go.mod +++ b/go.mod @@ -27,20 +27,20 @@ require ( github.com/fatih/color v1.13.0 github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa github.com/go-acme/lego/v4 v4.2.0 - github.com/go-openapi/runtime v0.23.3 + github.com/go-openapi/runtime v0.24.0 github.com/go-openapi/strfmt v0.21.2 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b github.com/golang/protobuf v1.5.2 - github.com/google/go-cmp v0.5.7 + github.com/google/go-cmp v0.5.8 github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d github.com/jedib0t/go-pretty/v6 v6.2.4 github.com/keybase/go-ps v0.0.0-20190827175125-91aafc93ba19 github.com/michaelquigley/pfxlog v0.6.9 - github.com/openziti/channel v0.18.28 - github.com/openziti/edge v0.21.196 - github.com/openziti/fabric v0.17.105 + github.com/openziti/channel v0.18.29 + github.com/openziti/edge v0.21.200 + github.com/openziti/fabric v0.17.116 github.com/openziti/foundation v0.17.22 - github.com/openziti/sdk-golang v0.16.52 + github.com/openziti/sdk-golang v0.16.55 github.com/openziti/storage v0.1.4 github.com/openziti/transport v0.1.5 github.com/openziti/ziti-db-explorer v1.1.1 @@ -84,7 +84,7 @@ require ( github.com/docker/go-units v0.4.0 // indirect github.com/ef-ds/deque v1.0.4 // indirect github.com/eliukblau/pixterm/pkg/ansimage v0.0.0-20191210081756-9fb6cf8c2f75 // indirect - github.com/emirpasic/gods v1.12.0 // indirect + github.com/emirpasic/gods v1.18.1 // indirect github.com/felixge/httpsnoop v1.0.1 // indirect github.com/fsnotify/fsnotify v1.5.1 // indirect github.com/go-ole/go-ole v1.2.6 // indirect @@ -93,7 +93,7 @@ require ( github.com/go-openapi/jsonpointer v0.19.5 // indirect github.com/go-openapi/jsonreference v0.20.0 // indirect github.com/go-openapi/loads v0.21.1 // indirect - github.com/go-openapi/spec v0.20.5 // indirect + github.com/go-openapi/spec v0.20.6 // indirect github.com/go-openapi/swag v0.21.1 // indirect github.com/go-openapi/validate v0.21.0 // indirect github.com/go-stack/stack v1.8.1 // indirect @@ -127,7 +127,7 @@ require ( github.com/miekg/dns v1.1.48 // indirect github.com/miekg/pkcs11 v1.1.1 // indirect github.com/mitchellh/go-ps v1.0.0 // indirect - github.com/mitchellh/mapstructure v1.4.3 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/natefinch/lumberjack v2.0.0+incompatible // indirect github.com/netfoundry/secretstream v0.1.2 // indirect github.com/oklog/ulid v1.3.1 // indirect @@ -155,11 +155,11 @@ require ( github.com/yusufpapurcu/wmi v1.2.2 // indirect go.mongodb.org/mongo-driver v1.8.3 // indirect go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1 // indirect - golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 // indirect + golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f // indirect golang.org/x/image v0.0.0-20191206065243-da761ea9ff43 // indirect golang.org/x/mod v0.5.1 // indirect golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect - golang.org/x/sys v0.0.0-20220412211240-33da011f77ad // indirect + golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba // indirect golang.org/x/term v0.0.0-20220411215600-e5f449aeb171 // indirect golang.org/x/text v0.3.7 // indirect golang.org/x/tools v0.1.7 // indirect diff --git a/go.sum b/go.sum index c840d9bbc..ccf5bae23 100644 --- a/go.sum +++ b/go.sum @@ -55,7 +55,6 @@ dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBr dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= -github.com/AppsFlyer/go-sundheit v0.4.0/go.mod h1:iZ8zWMS7idcvmqewf5mEymWWgoOiG/0WD4+aeh+heX4= github.com/AppsFlyer/go-sundheit v0.5.0 h1:/VxpyigCfJrq1r97mn9HPiAB2qrhcTFHwNIIDr15CZM= github.com/AppsFlyer/go-sundheit v0.5.0/go.mod h1:2ZM0BnfqT/mljBQO224VbL5XH06TgWuQ6Cn+cTtCpTY= github.com/Azure/azure-sdk-for-go v32.4.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= @@ -90,12 +89,10 @@ github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8 h1:xzYJEypr/85nB github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8/go.mod h1:oX5x61PbNXchhh0oikYAH+4Pcfw5LKv21+Jnpr6r6Pc= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/OpenDNS/vegadns2client v0.0.0-20180418235048-a3fa4a771d87/go.mod h1:iGLljf5n9GjT6kc0HBvyI1nOKnGQbNB66VzSNbK5iks= -github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= github.com/akamai/AkamaiOPEN-edgegrid-golang v0.9.18/go.mod h1:L+HB2uBoDgi3+r1pJEJcbGwyyHhd2QXaGsKLbDwtm8Q= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38 h1:smF2tmSOzy2Mm+0dGI2AIUHY+w0BUc+4tn40djz7+6U= @@ -114,7 +111,6 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/aliyun/alibaba-cloud-sdk-go v1.61.458/go.mod h1:pUKYbK5JQ+1Dfxk80P0qxGqe5dkxDoabbZS7zOcouyA= -github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY= github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= @@ -129,15 +125,10 @@ github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= -github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ= github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/aws/aws-sdk-go v1.30.20/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= -github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= @@ -222,7 +213,6 @@ github.com/dlclark/regexp2 v1.1.6/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55k github.com/dlclark/regexp2 v1.4.0 h1:F1rxgk7p4uKjwIQxBs9oAXe5CqrXlCduYEJvrF4u93E= github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dnsimple/dnsimple-go v0.63.0/go.mod h1:O5TJ0/U6r7AfT8niYNlmohpLbCSG+c71tQlGr9SeGrg= -github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= @@ -233,8 +223,9 @@ github.com/ef-ds/deque v1.0.4 h1:iFAZNmveMT9WERAkqLJ+oaABF9AcVQ5AjXem/hroniI= github.com/ef-ds/deque v1.0.4/go.mod h1:gXDnTC3yqvBcHbq2lcExjtAcVrOnJCbMcZXmuj8Z4tg= github.com/eliukblau/pixterm/pkg/ansimage v0.0.0-20191210081756-9fb6cf8c2f75 h1:vbix8DDQ/rfatfFr/8cf/sJfIL69i4BcZfjrVOxsMqk= github.com/eliukblau/pixterm/pkg/ansimage v0.0.0-20191210081756-9fb6cf8c2f75/go.mod h1:0gZuvTO1ikSA5LtTI6E13LEOdWQNjIo5MTQOvrV0eFg= -github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= +github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= +github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -270,8 +261,6 @@ github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/go-acme/lego/v4 v4.2.0 h1:zEvpcDLqvzOlNUGBMA0MCKPpb9UBbnBzgWwCIbTEt2g= github.com/go-acme/lego/v4 v4.2.0/go.mod h1:jmhqxBaangB8txXZKjRLTPXFXUwPCTU2fU8S9/eQzBI= github.com/go-chi/chi v4.0.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= @@ -287,112 +276,33 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= -github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= -github.com/go-openapi/analysis v0.19.4/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= -github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= -github.com/go-openapi/analysis v0.19.10/go.mod h1:qmhS3VNFxBlquFJ0RGoDtylO9y4pgTAUNE9AEEMdlJQ= -github.com/go-openapi/analysis v0.19.16/go.mod h1:GLInF007N83Ad3m8a/CbQ5TPzdnGT7workfHwuVjNVk= -github.com/go-openapi/analysis v0.20.0/go.mod h1:BMchjvaHDykmRMsK40iPtvyOfFdMMxlOmQr9FBZk+Og= -github.com/go-openapi/analysis v0.20.1/go.mod h1:BMchjvaHDykmRMsK40iPtvyOfFdMMxlOmQr9FBZk+Og= github.com/go-openapi/analysis v0.21.2 h1:hXFrOYFHUAMQdu6zwAiKKJHJQ8kqZs1ux/ru1P1wLJU= github.com/go-openapi/analysis v0.21.2/go.mod h1:HZwRk4RRisyG8vx2Oe6aqeSQcoxRp47Xkp3+K6q+LdY= -github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= -github.com/go-openapi/errors v0.19.3/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= -github.com/go-openapi/errors v0.19.6/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= -github.com/go-openapi/errors v0.19.7/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= github.com/go-openapi/errors v0.19.8/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= github.com/go-openapi/errors v0.19.9/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= -github.com/go-openapi/errors v0.20.1/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= github.com/go-openapi/errors v0.20.2 h1:dxy7PGTqEh94zj2E3h1cUmQQWiM1+aeCROfAr02EmK8= github.com/go-openapi/errors v0.20.2/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= -github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= -github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= -github.com/go-openapi/loads v0.19.3/go.mod h1:YVfqhUCdahYwR3f3iiwQLhicVRvLlU/WO5WPaZvcvSI= -github.com/go-openapi/loads v0.19.5/go.mod h1:dswLCAdonkRufe/gSUC3gN8nTSaB9uaS2es0x5/IbjY= -github.com/go-openapi/loads v0.19.6/go.mod h1:brCsvE6j8mnbmGBh103PT/QLHfbyDxA4hsKvYBNEGVc= -github.com/go-openapi/loads v0.19.7/go.mod h1:brCsvE6j8mnbmGBh103PT/QLHfbyDxA4hsKvYBNEGVc= -github.com/go-openapi/loads v0.20.0/go.mod h1:2LhKquiE513rN5xC6Aan6lYOSddlL8Mp20AW9kpviM4= -github.com/go-openapi/loads v0.20.2/go.mod h1:hTVUotJ+UonAMMZsvakEgmWKgtulweO9vYP2bQYKA/o= -github.com/go-openapi/loads v0.21.0/go.mod h1:rHYve9nZrQ4CJhyeIIFJINGCg1tQpx2yJrrNo8sf1ws= github.com/go-openapi/loads v0.21.1 h1:Wb3nVZpdEzDTcly8S4HMkey6fjARRzb7iEaySimlDW0= github.com/go-openapi/loads v0.21.1/go.mod h1:/DtAMXXneXFjbQMGEtbamCZb+4x7eGwkvZCvBmwUG+g= -github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= -github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= -github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= -github.com/go-openapi/runtime v0.19.15/go.mod h1:dhGWCTKRXlAfGnQG0ONViOZpjfg0m2gUt9nTQPQZuoo= -github.com/go-openapi/runtime v0.19.16/go.mod h1:5P9104EJgYcizotuXhEuUrzVc+j1RiSjahULvYmlv98= -github.com/go-openapi/runtime v0.19.24/go.mod h1:Lm9YGCeecBnUUkFTxPC4s1+lwrkJ0pthx8YvyjCfkgk= -github.com/go-openapi/runtime v0.21.0/go.mod h1:aQg+kaIQEn+A2CRSY1TxbM8+sT9g2V3aLc1FbIAnbbs= -github.com/go-openapi/runtime v0.23.3 h1:/dxjx4KCOQI5ImBMz036F6v/DzZ2NUjSRvbLJs1rgoE= -github.com/go-openapi/runtime v0.23.3/go.mod h1:AKurw9fNre+h3ELZfk6ILsfvPN+bvvlaU/M9q/r9hpk= -github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/spec v0.19.6/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= -github.com/go-openapi/spec v0.19.8/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= -github.com/go-openapi/spec v0.19.15/go.mod h1:+81FIL1JwC5P3/Iuuozq3pPE9dXdIEGxFutcFKaVbmU= -github.com/go-openapi/spec v0.20.0/go.mod h1:+81FIL1JwC5P3/Iuuozq3pPE9dXdIEGxFutcFKaVbmU= -github.com/go-openapi/spec v0.20.1/go.mod h1:93x7oh+d+FQsmsieroS4cmR3u0p/ywH649a3qwC9OsQ= -github.com/go-openapi/spec v0.20.3/go.mod h1:gG4F8wdEDN+YPBMVnzE85Rbhf+Th2DTvA9nFPQ5AYEg= +github.com/go-openapi/runtime v0.24.0 h1:vTgDijpGLCgJOJTdAp5kG+O+nRsVCbH417YQ3O0iZo0= +github.com/go-openapi/runtime v0.24.0/go.mod h1:AKurw9fNre+h3ELZfk6ILsfvPN+bvvlaU/M9q/r9hpk= github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I= -github.com/go-openapi/spec v0.20.5 h1:skHa8av4VnAtJU5zyAUXrrdK/NDiVX8lchbG+BfcdrE= -github.com/go-openapi/spec v0.20.5/go.mod h1:QbfOSIVt3/sac+a1wzmKbbcLXm5NdZnyBZYtCijp43o= -github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= -github.com/go-openapi/strfmt v0.19.2/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= -github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= -github.com/go-openapi/strfmt v0.19.4/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= -github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= -github.com/go-openapi/strfmt v0.19.11/go.mod h1:UukAYgTaQfqJuAFlNxxMWNvMYiwiXtLsF2VwmoFtbtc= -github.com/go-openapi/strfmt v0.20.0/go.mod h1:UukAYgTaQfqJuAFlNxxMWNvMYiwiXtLsF2VwmoFtbtc= -github.com/go-openapi/strfmt v0.20.2/go.mod h1:43urheQI9dNtE5lTZQfuFJvjYJKPrxicATpEfZwHUNk= +github.com/go-openapi/spec v0.20.6 h1:ich1RQ3WDbfoeTqTAb+5EIxNmpKVJZWBNah9RAT0jIQ= +github.com/go-openapi/spec v0.20.6/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= github.com/go-openapi/strfmt v0.21.0/go.mod h1:ZRQ409bWMj+SOgXofQAGTIo2Ebu72Gs+WaRADcS5iNg= github.com/go-openapi/strfmt v0.21.1/go.mod h1:I/XVKeLc5+MM5oPNN7P6urMOpuLXEcNrCX/rPGuWb0k= github.com/go-openapi/strfmt v0.21.2 h1:5NDNgadiX1Vhemth/TH4gCGopWSTdDjxl60H3B7f+os= github.com/go-openapi/strfmt v0.21.2/go.mod h1:I/XVKeLc5+MM5oPNN7P6urMOpuLXEcNrCX/rPGuWb0k= -github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.7/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= -github.com/go-openapi/swag v0.19.9/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= -github.com/go-openapi/swag v0.19.12/go.mod h1:eFdyEBkTdoAf/9RXBvj4cr1nH7GD8Kzo5HTt47gr72M= -github.com/go-openapi/swag v0.19.13/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag v0.21.1 h1:wm0rhTb5z7qpJRHBdPOMuY4QjVUMbF6/kwoYeRAOrKU= github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= -github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= -github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo= -github.com/go-openapi/validate v0.19.10/go.mod h1:RKEZTUWDkxKQxN2jDT7ZnZi2bhZlbNMAuKvKB+IaGx8= -github.com/go-openapi/validate v0.19.12/go.mod h1:Rzou8hA/CBw8donlS6WNEUQupNvUZ0waH08tGe6kAQ4= -github.com/go-openapi/validate v0.19.15/go.mod h1:tbn/fdOwYHgrhPBzidZfJC2MIVvs9GA7monOmWBbeCI= -github.com/go-openapi/validate v0.20.1/go.mod h1:b60iJT+xNNLfaQJUqLI7946tYiFEOuE9E4k54HpKcJ0= -github.com/go-openapi/validate v0.20.3/go.mod h1:goDdqVGiigM3jChcrYJxD2joalke3ZXeftD16byIjA4= github.com/go-openapi/validate v0.21.0 h1:+Wqk39yKOhfpLqNLEC0/eViCkzM5FVXVqrvt526+wcI= github.com/go-openapi/validate v0.21.0/go.mod h1:rjnrwK57VJ7A8xqfpAOEKRH8yQSGUriMu5/zuPSQ1hg= github.com/go-resty/resty/v2 v2.1.1-0.20191201195748-d7b97669fe48/go.mod h1:dZGr0i9PLlaaTD4H/hoZIDjQ+r6xq8mgbRzHZf7f2J8= @@ -491,8 +401,9 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-licenses v0.0.0-20201026145851-73411c8fa237/go.mod h1:g1VOUGKZYIqe8lDq2mL7plhAWXqrEaGUs7eIjthN1sk= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= @@ -602,7 +513,7 @@ github.com/iij/doapi v0.0.0-20190504054126-0bbf12d6d7df/go.mod h1:QMZY7/J/KSQEhK github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/influxdb-client-go/v2 v2.2.2/go.mod h1:fa/d1lAdUHxuc1jedx30ZfNG573oQTQmUni3N6pcW+0= -github.com/influxdata/influxdb-client-go/v2 v2.8.1/go.mod h1:x7Jo5UHHl+w8wu8UnGiNobDDHygojXwJX4mx7rXGKMk= +github.com/influxdata/influxdb-client-go/v2 v2.8.2/go.mod h1:x7Jo5UHHl+w8wu8UnGiNobDDHygojXwJX4mx7rXGKMk= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d h1:/WZQPMZNsjZ7IlCpsLGdQBINg5bxKQ1K1sh6awxLtkA= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= @@ -618,8 +529,6 @@ github.com/jinzhu/copier v0.3.5 h1:GlvfUwHk62RokgqVNvYsku0TATCF7bAHVwEXoBh3iJg= github.com/jinzhu/copier v0.3.5/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= @@ -646,10 +555,8 @@ github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT github.com/keybase/go-ps v0.0.0-20190827175125-91aafc93ba19 h1:WjT3fLi9n8YWh/Ih8Q1LHAPsTqGddPcHqscN+PJ3i68= github.com/keybase/go-ps v0.0.0-20190827175125-91aafc93ba19/go.mod h1:hY+WOq6m2FpbvyrI93sMaypsttvaIL5nhVR92dTMUcQ= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/kolo/xmlrpc v0.0.0-20200310150728-e0350524596b/go.mod h1:o03bZfuBwAXHetKXuInt4S7omeXUu62/A845kiycsSQ= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -661,7 +568,6 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/pty v1.1.8 h1:AkaSdXYQOWeaO3neb8EM634ahkXXe3jYbVh/F9lq+GI= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= @@ -687,11 +593,9 @@ github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czP github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= @@ -763,12 +667,11 @@ github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS4 github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs= github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= @@ -815,18 +718,18 @@ github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+ github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/openziti/channel v0.18.28 h1:LTsp+ywYp9uIr0OIPzeUBYoAIKA70CU0QsJqXa+YkJA= -github.com/openziti/channel v0.18.28/go.mod h1:YDGdH2I8tJ76WQgHTprgHX6dV9MBlrc1nOYpMY8h8+A= +github.com/openziti/channel v0.18.29 h1:5di0d9tRg/leuN7o7gQwIVQuPZSnETjcUDIF5x5USM8= +github.com/openziti/channel v0.18.29/go.mod h1:YDGdH2I8tJ76WQgHTprgHX6dV9MBlrc1nOYpMY8h8+A= 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 v0.21.196 h1:xTYkL2eiWB2QTtNJclKgIU7lu4M3Syz9XdM/bMj784s= -github.com/openziti/edge v0.21.196/go.mod h1:+lFaGB00kayZir8egSqJRJMB4Cp6174twkM3lx4X7ZA= -github.com/openziti/fabric v0.17.105 h1:8gjvAHBDZuLLtaqkSux4rEvKPrifZSwj2Y7ILsgKYG0= -github.com/openziti/fabric v0.17.105/go.mod h1:aWW8KTuitUrwpRo2d2IAXVip2L1+kgIbGjdT2sdTPtI= +github.com/openziti/edge v0.21.200 h1:V9EA2LrMeFLEtTdQfbU2A2dK1S8LyG0n6pO/yGdhXts= +github.com/openziti/edge v0.21.200/go.mod h1:6VxiwFTllM7Kns725R43wReUE8/ZDJe4gdzScfpQ4zs= +github.com/openziti/fabric v0.17.116 h1:CqhgO5QfXLFwWoxLteQY6z64LP0N25oK6U3gmxBFXg0= +github.com/openziti/fabric v0.17.116/go.mod h1:2FQTFPTFuObsu1xsMw3ZPnFH3HlEXHuG/k186y4ND/E= github.com/openziti/foundation v0.17.22 h1:zFfgNHdLocEcoBqtognpJnYsVQaTm28EwqMNjBw8avk= github.com/openziti/foundation v0.17.22/go.mod h1:Nnr0vsqovHJimkdBHf2s4ZJAgvNhg6UdVqP+s0nY3P4= -github.com/openziti/sdk-golang v0.16.52 h1:qUKJo8nGDJ1ebxlUNasf4wdWbDxbJsadXhFuj/D+s6U= -github.com/openziti/sdk-golang v0.16.52/go.mod h1:j64mu7eVc3M2qJoIYxRl4V/gDBWSLqCGak5TPHZthNg= +github.com/openziti/sdk-golang v0.16.55 h1:LwIMjtwzTL37TuJN4OOZ3P7YO55rFG8HFc3EgDY8Uek= +github.com/openziti/sdk-golang v0.16.55/go.mod h1:kqMVnWbBx1OT9HCr/VeZX4JHspzrSVTCmGmjAEjrXZI= github.com/openziti/storage v0.1.4 h1:horz3P0fABJH6R2Orvl2OLksmhXHpCaHP+0TCKfbGPM= github.com/openziti/storage v0.1.4/go.mod h1:aMf2fqWAyXjXH7N0CxfpeGMrlLIDCT7nRSR3cGrsEoI= github.com/openziti/transport v0.1.5 h1:+MgLyUDOsDdixm7GT9TgHd2pBIREf2AHsPa2D6mMNhY= @@ -853,7 +756,6 @@ github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM= @@ -1031,7 +933,6 @@ github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPU github.com/valyala/fasttemplate v1.1.0/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= github.com/vultr/govultr/v2 v2.0.0/go.mod h1:2PsEeg+gs3p/Fo5Pw8F9mv+DUBEOlrNZ8GmCTGmhOhs= @@ -1039,8 +940,6 @@ github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0B github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= -github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= -github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= @@ -1067,14 +966,6 @@ go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3 go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs= -go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.3.0/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= -go.mongodb.org/mongo-driver v1.3.4/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= -go.mongodb.org/mongo-driver v1.4.3/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc= -go.mongodb.org/mongo-driver v1.4.4/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc= -go.mongodb.org/mongo-driver v1.4.6/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc= -go.mongodb.org/mongo-driver v1.5.1/go.mod h1:gRXCHX4Jo7J0IJ1oDQyUxF7jfy19UfxniMS4xxMmUqw= go.mongodb.org/mongo-driver v1.7.3/go.mod h1:NqaYOwnXWr5Pm7AOpO5QFxKJ503nbMse/R79oO62zWg= go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4xhp5Zvxng= go.mongodb.org/mongo-driver v1.8.3 h1:TDKlTkGDKm9kkJVUOAXDK5/fkqKHJVwYQSpoRfB43R4= @@ -1112,15 +1003,11 @@ golang.org/x/crypto v0.0.0-20190123085648-057139ce5d2b/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190422183909-d864b10871cd/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= @@ -1138,8 +1025,9 @@ golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWP golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220321153916-2c7772ba3064/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 h1:kUhD7nTDoI3fVd9G4ORWrbV5NY0liEs/Jg2pv5f+bBA= golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f h1:OeJjE6G4dgCY4PIXvIRQbE8+RX+uXZyGhUy/ksMGJoc= +golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1185,7 +1073,6 @@ golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1197,7 +1084,6 @@ golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -1207,7 +1093,6 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191119073136-fc4aabc6c914/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1224,7 +1109,6 @@ golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= @@ -1233,7 +1117,6 @@ golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= @@ -1303,7 +1186,6 @@ golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1312,7 +1194,6 @@ golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1390,8 +1271,9 @@ golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad h1:ntjMns5wyP/fN65tdBD4g8J5w8n015+iIIs9rtjXkY0= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba h1:AyHWHCBVlIYI5rgEM3o+1PLd0sLPcIAoaUckGQMaWtw= +golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= 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= @@ -1418,9 +1300,7 @@ golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -1434,8 +1314,6 @@ golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= diff --git a/ziti-fabric-test/subcmd/loop3/pb/loop3.pb.go b/ziti-fabric-test/subcmd/loop3/pb/loop3.pb.go index 0d9811339..2894c28c9 100644 --- a/ziti-fabric-test/subcmd/loop3/pb/loop3.pb.go +++ b/ziti-fabric-test/subcmd/loop3/pb/loop3.pb.go @@ -27,18 +27,22 @@ type Test struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` TxRequests int32 `protobuf:"varint,2,opt,name=txRequests,proto3" json:"txRequests,omitempty"` - TxPacing int32 `protobuf:"varint,3,opt,name=txPacing,proto3" json:"txPacing,omitempty"` - TxMaxJitter int32 `protobuf:"varint,4,opt,name=txMaxJitter,proto3" json:"txMaxJitter,omitempty"` - RxRequests int32 `protobuf:"varint,5,opt,name=rxRequests,proto3" json:"rxRequests,omitempty"` - RxTimeout int32 `protobuf:"varint,6,opt,name=rxTimeout,proto3" json:"rxTimeout,omitempty"` - PayloadMinBytes int32 `protobuf:"varint,7,opt,name=payloadMinBytes,proto3" json:"payloadMinBytes,omitempty"` - PayloadMaxBytes int32 `protobuf:"varint,8,opt,name=payloadMaxBytes,proto3" json:"payloadMaxBytes,omitempty"` - LatencyFrequency int32 `protobuf:"varint,9,opt,name=latencyFrequency,proto3" json:"latencyFrequency,omitempty"` - TxBlockType string `protobuf:"bytes,10,opt,name=txBlockType,proto3" json:"txBlockType,omitempty"` - RxBlockType string `protobuf:"bytes,11,opt,name=rxBlockType,proto3" json:"rxBlockType,omitempty"` - RxSeqBlockSize int32 `protobuf:"varint,12,opt,name=rxSeqBlockSize,proto3" json:"rxSeqBlockSize,omitempty"` - RxPacing string `protobuf:"bytes,13,opt,name=rxPacing,proto3" json:"rxPacing,omitempty"` - RxMaxJitter string `protobuf:"bytes,14,opt,name=rxMaxJitter,proto3" json:"rxMaxJitter,omitempty"` + TxPacing string `protobuf:"bytes,3,opt,name=txPacing,proto3" json:"txPacing,omitempty"` + TxMaxJitter string `protobuf:"bytes,4,opt,name=txMaxJitter,proto3" json:"txMaxJitter,omitempty"` + TxPauseEvery string `protobuf:"bytes,5,opt,name=txPauseEvery,proto3" json:"txPauseEvery,omitempty"` + TxPauseFor string `protobuf:"bytes,6,opt,name=txPauseFor,proto3" json:"txPauseFor,omitempty"` + RxRequests int32 `protobuf:"varint,7,opt,name=rxRequests,proto3" json:"rxRequests,omitempty"` + RxTimeout int32 `protobuf:"varint,8,opt,name=rxTimeout,proto3" json:"rxTimeout,omitempty"` + RxPauseEvery string `protobuf:"bytes,9,opt,name=rxPauseEvery,proto3" json:"rxPauseEvery,omitempty"` + RxPauseFor string `protobuf:"bytes,10,opt,name=rxPauseFor,proto3" json:"rxPauseFor,omitempty"` + PayloadMinBytes int32 `protobuf:"varint,11,opt,name=payloadMinBytes,proto3" json:"payloadMinBytes,omitempty"` + PayloadMaxBytes int32 `protobuf:"varint,12,opt,name=payloadMaxBytes,proto3" json:"payloadMaxBytes,omitempty"` + LatencyFrequency int32 `protobuf:"varint,13,opt,name=latencyFrequency,proto3" json:"latencyFrequency,omitempty"` + TxBlockType string `protobuf:"bytes,14,opt,name=txBlockType,proto3" json:"txBlockType,omitempty"` + RxBlockType string `protobuf:"bytes,15,opt,name=rxBlockType,proto3" json:"rxBlockType,omitempty"` + RxSeqBlockSize int32 `protobuf:"varint,16,opt,name=rxSeqBlockSize,proto3" json:"rxSeqBlockSize,omitempty"` + RxPacing string `protobuf:"bytes,17,opt,name=rxPacing,proto3" json:"rxPacing,omitempty"` + RxMaxJitter string `protobuf:"bytes,18,opt,name=rxMaxJitter,proto3" json:"rxMaxJitter,omitempty"` } func (x *Test) Reset() { @@ -87,18 +91,32 @@ func (x *Test) GetTxRequests() int32 { return 0 } -func (x *Test) GetTxPacing() int32 { +func (x *Test) GetTxPacing() string { if x != nil { return x.TxPacing } - return 0 + return "" } -func (x *Test) GetTxMaxJitter() int32 { +func (x *Test) GetTxMaxJitter() string { if x != nil { return x.TxMaxJitter } - return 0 + return "" +} + +func (x *Test) GetTxPauseEvery() string { + if x != nil { + return x.TxPauseEvery + } + return "" +} + +func (x *Test) GetTxPauseFor() string { + if x != nil { + return x.TxPauseFor + } + return "" } func (x *Test) GetRxRequests() int32 { @@ -115,6 +133,20 @@ func (x *Test) GetRxTimeout() int32 { return 0 } +func (x *Test) GetRxPauseEvery() string { + if x != nil { + return x.RxPauseEvery + } + return "" +} + +func (x *Test) GetRxPauseFor() string { + if x != nil { + return x.RxPauseFor + } + return "" +} + func (x *Test) GetPayloadMinBytes() int32 { if x != nil { return x.PayloadMinBytes @@ -175,42 +207,51 @@ var File_loop3_proto protoreflect.FileDescriptor var file_loop3_proto_rawDesc = []byte{ 0x0a, 0x0b, 0x6c, 0x6f, 0x6f, 0x70, 0x33, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x7a, - 0x69, 0x74, 0x69, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x33, 0x2e, 0x70, 0x62, 0x22, 0xe0, 0x03, 0x0a, + 0x69, 0x74, 0x69, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x33, 0x2e, 0x70, 0x62, 0x22, 0xe8, 0x04, 0x0a, 0x04, 0x54, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x78, 0x50, - 0x61, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x74, 0x78, 0x50, + 0x61, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x78, 0x50, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x74, 0x78, 0x4d, 0x61, 0x78, 0x4a, 0x69, - 0x74, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x74, 0x78, 0x4d, 0x61, - 0x78, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x78, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x78, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x78, 0x54, 0x69, 0x6d, - 0x65, 0x6f, 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x78, 0x54, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, - 0x4d, 0x69, 0x6e, 0x42, 0x79, 0x74, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, - 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x69, 0x6e, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, - 0x28, 0x0a, 0x0f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x61, 0x78, 0x42, 0x79, 0x74, - 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, - 0x64, 0x4d, 0x61, 0x78, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x6c, 0x61, 0x74, - 0x65, 0x6e, 0x63, 0x79, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x10, 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x46, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x74, 0x78, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x54, 0x79, 0x70, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x78, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x78, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x78, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x78, 0x53, - 0x65, 0x71, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0e, 0x72, 0x78, 0x53, 0x65, 0x71, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x69, 0x7a, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x78, 0x50, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x78, 0x50, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x12, 0x20, 0x0a, - 0x0b, 0x72, 0x78, 0x4d, 0x61, 0x78, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x0e, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x72, 0x78, 0x4d, 0x61, 0x78, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x42, - 0x44, 0x5a, 0x42, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, - 0x65, 0x6e, 0x7a, 0x69, 0x74, 0x69, 0x2f, 0x7a, 0x69, 0x74, 0x69, 0x2f, 0x7a, 0x69, 0x74, 0x69, - 0x2d, 0x66, 0x61, 0x62, 0x72, 0x69, 0x63, 0x2d, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x73, 0x75, 0x62, - 0x63, 0x6d, 0x64, 0x2f, 0x6c, 0x6f, 0x6f, 0x70, 0x33, 0x2f, 0x70, 0x62, 0x2f, 0x6c, 0x6f, 0x6f, - 0x70, 0x33, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x78, 0x4d, 0x61, + 0x78, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0c, 0x74, 0x78, 0x50, 0x61, 0x75, + 0x73, 0x65, 0x45, 0x76, 0x65, 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, + 0x78, 0x50, 0x61, 0x75, 0x73, 0x65, 0x45, 0x76, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x74, + 0x78, 0x50, 0x61, 0x75, 0x73, 0x65, 0x46, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x74, 0x78, 0x50, 0x61, 0x75, 0x73, 0x65, 0x46, 0x6f, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x72, + 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0a, 0x72, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x72, + 0x78, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, + 0x72, 0x78, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x72, 0x78, 0x50, + 0x61, 0x75, 0x73, 0x65, 0x45, 0x76, 0x65, 0x72, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x72, 0x78, 0x50, 0x61, 0x75, 0x73, 0x65, 0x45, 0x76, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x0a, + 0x0a, 0x72, 0x78, 0x50, 0x61, 0x75, 0x73, 0x65, 0x46, 0x6f, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x72, 0x78, 0x50, 0x61, 0x75, 0x73, 0x65, 0x46, 0x6f, 0x72, 0x12, 0x28, 0x0a, + 0x0f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x69, 0x6e, 0x42, 0x79, 0x74, 0x65, 0x73, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x4d, + 0x69, 0x6e, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x61, 0x79, 0x6c, 0x6f, + 0x61, 0x64, 0x4d, 0x61, 0x78, 0x42, 0x79, 0x74, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x61, 0x78, 0x42, 0x79, 0x74, 0x65, + 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x46, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6c, 0x61, 0x74, + 0x65, 0x6e, 0x63, 0x79, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x20, 0x0a, + 0x0b, 0x74, 0x78, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x18, 0x0e, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x74, 0x78, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x20, 0x0a, 0x0b, 0x72, 0x78, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x18, 0x0f, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x78, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x78, 0x53, 0x65, 0x71, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x53, + 0x69, 0x7a, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x72, 0x78, 0x53, 0x65, 0x71, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x78, 0x50, + 0x61, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x78, 0x50, + 0x61, 0x63, 0x69, 0x6e, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x78, 0x4d, 0x61, 0x78, 0x4a, 0x69, + 0x74, 0x74, 0x65, 0x72, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x78, 0x4d, 0x61, + 0x78, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x42, 0x44, 0x5a, 0x42, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x7a, 0x69, 0x74, 0x69, 0x2f, 0x7a, + 0x69, 0x74, 0x69, 0x2f, 0x7a, 0x69, 0x74, 0x69, 0x2d, 0x66, 0x61, 0x62, 0x72, 0x69, 0x63, 0x2d, + 0x74, 0x65, 0x73, 0x74, 0x2f, 0x73, 0x75, 0x62, 0x63, 0x6d, 0x64, 0x2f, 0x6c, 0x6f, 0x6f, 0x70, + 0x33, 0x2f, 0x70, 0x62, 0x2f, 0x6c, 0x6f, 0x6f, 0x70, 0x33, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/ziti-fabric-test/subcmd/loop3/pb/loop3.proto b/ziti-fabric-test/subcmd/loop3/pb/loop3.proto index 6b7a9d07d..f7f2d2af6 100644 --- a/ziti-fabric-test/subcmd/loop3/pb/loop3.proto +++ b/ziti-fabric-test/subcmd/loop3/pb/loop3.proto @@ -6,16 +6,22 @@ option go_package = "github.com/openziti/ziti/ziti-fabric-test/subcmd/loop3/pb/l message Test { string name = 1; int32 txRequests = 2; - int32 txPacing = 3; - int32 txMaxJitter = 4; - int32 rxRequests = 5; - int32 rxTimeout = 6; - int32 payloadMinBytes = 7; - int32 payloadMaxBytes = 8; - int32 latencyFrequency = 9; - string txBlockType = 10; - string rxBlockType = 11; - int32 rxSeqBlockSize = 12; - string rxPacing = 13; - string rxMaxJitter = 14; + string txPacing = 3; + string txMaxJitter = 4; + string txPauseEvery = 5; + string txPauseFor = 6; + + int32 rxRequests = 7; + int32 rxTimeout = 8; + string rxPauseEvery = 9; + string rxPauseFor = 10; + + int32 payloadMinBytes = 11; + int32 payloadMaxBytes = 12; + int32 latencyFrequency = 13; + string txBlockType = 14; + string rxBlockType = 15; + int32 rxSeqBlockSize = 16; + string rxPacing = 17; + string rxMaxJitter = 18; } \ No newline at end of file diff --git a/ziti-fabric-test/subcmd/loop3/protocol.go b/ziti-fabric-test/subcmd/loop3/protocol.go index 6be1c246a..ebd61e122 100644 --- a/ziti-fabric-test/subcmd/loop3/protocol.go +++ b/ziti-fabric-test/subcmd/loop3/protocol.go @@ -32,18 +32,24 @@ import ( ) type protocol struct { - test *loop3_pb.Test - blocks chan Block - rxSequence uint64 - rxPacing time.Duration - rxMaxJitter time.Duration - peer io.ReadWriteCloser - rxBlocks chan Block - txCount int32 - rxCount int32 - lastRx int64 - latencies chan *time.Time - errors chan error + test *loop3_pb.Test + blocks chan Block + rxSequence uint64 + txPacing time.Duration + txMaxJitter time.Duration + txPauseEvery time.Duration + txPauseFor time.Duration + rxPacing time.Duration + rxMaxJitter time.Duration + rxPauseEvery time.Duration + rxPauseFor time.Duration + peer io.ReadWriteCloser + rxBlocks chan Block + txCount int32 + rxCount int32 + lastRx int64 + latencies chan *time.Time + errors chan error } var MagicHeader = []byte{0xCA, 0xFE, 0xF0, 0x0D} @@ -86,17 +92,23 @@ func (p *protocol) run(test *loop3_pb.Test) error { panic(errors.Errorf("unknown rx block type %v", test.RxBlockType)) } - rxPacing, err := time.ParseDuration(p.test.RxPacing) - if err != nil { - panic(err) + parseTime := func(val string) time.Duration { + t, err := time.ParseDuration(val) + if err != nil { + panic(err) + } + return t } - p.rxPacing = rxPacing - rxMaxJitter, err := time.ParseDuration(p.test.RxMaxJitter) - if err != nil { - panic(err) - } - p.rxMaxJitter = rxMaxJitter + p.txPacing = parseTime(p.test.TxPacing) + p.txMaxJitter = parseTime(p.test.TxMaxJitter) + p.txPauseEvery = parseTime(p.test.TxPauseEvery) + p.txPauseFor = parseTime(p.test.TxPauseFor) + + p.rxPacing = parseTime(p.test.RxPacing) + p.rxMaxJitter = parseTime(p.test.RxMaxJitter) + p.rxPauseEvery = parseTime(p.test.RxPauseEvery) + p.rxPauseFor = parseTime(p.test.RxPauseFor) rxerDone := make(chan bool) go p.rxer(rxerDone, rxBlock) @@ -125,18 +137,23 @@ func (p *protocol) txer(done chan bool) { defer log.Debug("complete") var lastSend time.Time + lastPause := time.Now() for p.txCount < p.test.TxRequests { + now := time.Now() + if p.txPauseEvery > 0 && now.Sub(lastPause) > p.txPauseEvery { + time.Sleep(p.txPauseFor) + lastPause = time.Now() + } select { case block := <-p.blocks: if block != nil { - if p.test.TxPacing > 0 { - jitter := 0 - if p.test.TxMaxJitter > 0 { - jitter = rand.Intn(int(p.test.TxMaxJitter)) + if p.txPacing > 0 { + jitter := time.Duration(0) + if p.txMaxJitter > 0 { + jitter = time.Duration(rand.Intn(int(p.txMaxJitter))) } - nextSend := lastSend.Add(time.Duration(int(p.test.TxPacing)+jitter) * time.Millisecond) - now := time.Now() + nextSend := lastSend.Add(p.txPacing + jitter) if nextSend.After(now) { time.Sleep(nextSend.Sub(now)) lastSend = nextSend @@ -170,7 +187,13 @@ func (p *protocol) rxer(done chan bool, rxBlock func() (Block, error)) { defer log.Debug("complete") lastRx := time.Now() + lastPause := time.Now() for p.rxCount < p.test.RxRequests { + now := time.Now() + if p.rxPauseEvery > 0 && now.Sub(lastPause) > p.rxPauseEvery { + time.Sleep(p.rxPauseFor) + lastPause = time.Now() + } block, err := rxBlock() if err != nil { p.errors <- err diff --git a/ziti-fabric-test/subcmd/loop3/scenario.go b/ziti-fabric-test/subcmd/loop3/scenario.go index 774fcdaf5..c8e42f4a9 100644 --- a/ziti-fabric-test/subcmd/loop3/scenario.go +++ b/ziti-fabric-test/subcmd/loop3/scenario.go @@ -37,27 +37,37 @@ type Workload struct { } type Test struct { - TxRequests int32 `yaml:"txRequests"` - TxPacing int32 `yaml:"txPacing"` - TxMaxJitter int32 `yaml:"txMaxJitter"` - RxTimeout int32 `yaml:"rxTimeout"` - RxPacing time.Duration `yaml:"rxPacing"` - RxMaxJitter time.Duration `yaml:"rxMaxJitter"` - PayloadMinBytes int32 `yaml:"payloadMinBytes"` - PayloadMaxBytes int32 `yaml:"payloadMaxBytes"` - LatencyFrequency int32 `yaml:"latencyFrequency"` - BlockType string `yaml:"blockType"` + TxRequests int32 `yaml:"txRequests"` + TxPacing time.Duration `yaml:"txPacing"` + TxMaxJitter time.Duration `yaml:"txMaxJitter"` + TxPauseEvery time.Duration `yaml:"txPauseEvery"` + TxPauseFor time.Duration `yaml:"txPauseFor"` + + RxTimeout int32 `yaml:"rxTimeout"` + RxPacing time.Duration `yaml:"rxPacing"` + RxMaxJitter time.Duration `yaml:"rxMaxJitter"` + RxPauseEvery time.Duration `yaml:"rxPauseEvery"` + RxPauseFor time.Duration `yaml:"rxPauseFor"` + + PayloadMinBytes int32 `yaml:"payloadMinBytes"` + PayloadMaxBytes int32 `yaml:"payloadMaxBytes"` + LatencyFrequency int32 `yaml:"latencyFrequency"` + BlockType string `yaml:"blockType"` } func (workload *Workload) GetTests() (*loop3_pb.Test, *loop3_pb.Test) { local := &loop3_pb.Test{ Name: workload.Name, TxRequests: workload.Dialer.TxRequests, - TxPacing: workload.Dialer.TxPacing, - TxMaxJitter: workload.Dialer.TxMaxJitter, + TxPacing: workload.Dialer.TxPacing.String(), + TxMaxJitter: workload.Dialer.TxMaxJitter.String(), + TxPauseEvery: workload.Dialer.TxPauseEvery.String(), + TxPauseFor: workload.Dialer.TxPauseFor.String(), RxRequests: workload.Listener.TxRequests, RxPacing: workload.Dialer.RxPacing.String(), RxMaxJitter: workload.Dialer.RxMaxJitter.String(), + RxPauseEvery: workload.Dialer.RxPauseEvery.String(), + RxPauseFor: workload.Dialer.RxPauseFor.String(), RxTimeout: workload.Dialer.RxTimeout, RxSeqBlockSize: workload.Listener.PayloadMinBytes, PayloadMinBytes: workload.Dialer.PayloadMinBytes, @@ -70,12 +80,16 @@ func (workload *Workload) GetTests() (*loop3_pb.Test, *loop3_pb.Test) { remote := &loop3_pb.Test{ Name: workload.Name, TxRequests: workload.Listener.TxRequests, - TxPacing: workload.Listener.TxPacing, - TxMaxJitter: workload.Listener.TxMaxJitter, + TxPacing: workload.Listener.TxPacing.String(), + TxMaxJitter: workload.Listener.TxMaxJitter.String(), + TxPauseEvery: workload.Listener.TxPauseEvery.String(), + TxPauseFor: workload.Listener.TxPauseFor.String(), RxRequests: workload.Dialer.TxRequests, RxPacing: workload.Listener.RxPacing.String(), RxMaxJitter: workload.Listener.RxMaxJitter.String(), RxTimeout: workload.Listener.RxTimeout, + RxPauseEvery: workload.Listener.RxPauseEvery.String(), + RxPauseFor: workload.Listener.RxPauseFor.String(), RxSeqBlockSize: workload.Dialer.PayloadMinBytes, PayloadMinBytes: workload.Listener.PayloadMinBytes, PayloadMaxBytes: workload.Listener.PayloadMaxBytes, diff --git a/ziti-router/subcmd/root.go b/ziti-router/subcmd/root.go index 1b57f1488..b7b0253f5 100644 --- a/ziti-router/subcmd/root.go +++ b/ziti-router/subcmd/root.go @@ -30,7 +30,7 @@ func init() { root.PersistentFlags().StringVar(&logFormatter, "log-formatter", "", "Specify log formatter [json|pfxlog|text]") root.PersistentFlags().BoolVar(&cliAgentEnabled, "cli-agent", true, "Enable/disable CLI Agent (enabled by default)") root.PersistentFlags().StringVar(&cliAgentAddr, "cli-agent-addr", "", "Specify where CLI Agent should list (ex: unix:/tmp/myfile.sock or tcp:127.0.0.1:10001)") - root.PersistentFlags().BoolVar(&debugOpsEnabled, "debug-ops", false, "Enable/disable debug agent operations (disabled by default)") + root.PersistentFlags().BoolVar(&enableDebugOps, "debug-ops", false, "Enable/disable debug agent operations (disabled by default)") } var root = &cobra.Command{ @@ -59,7 +59,7 @@ var root = &cobra.Command{ var verbose bool var logFormatter string var cliAgentEnabled bool -var debugOpsEnabled bool +var enableDebugOps bool var cliAgentAddr string func Execute() { diff --git a/ziti-router/subcmd/run.go b/ziti-router/subcmd/run.go index 7dc5fe5f3..b3061da65 100644 --- a/ziti-router/subcmd/run.go +++ b/ziti-router/subcmd/run.go @@ -97,15 +97,17 @@ func run(cmd *cobra.Command, args []string) { if cliAgentEnabled { options := agent.Options{Addr: cliAgentAddr} - if debugOpsEnabled { - r.RegisterDefaultDebugOps() - debugops.RegisterEdgeRouterDebugOps(r, stateManager) - options.CustomOps = map[byte]func(conn net.Conn) error{ - agent.CustomOp: func(conn net.Conn) error { - return r.HandleDebug(conn) - }, - } + if config.EnableDebugOps { + enableDebugOps = true } + r.RegisterDefaultAgentOps(enableDebugOps) + debugops.RegisterEdgeRouterAgentOps(r, stateManager, enableDebugOps) + + options.CustomOps = map[byte]func(conn net.Conn) error{ + agent.CustomOp: r.HandleAgentOp, + agent.CustomOpAsync: r.HandleAgentAsyncOp, + } + if err := agent.Listen(options); err != nil { pfxlog.Logger().WithError(err).Error("unable to start CLI agent") } diff --git a/ziti/cmd/ziti/cmd/agent.go b/ziti/cmd/ziti/cmd/agent.go index 7ca2b332a..8b5fec8fe 100644 --- a/ziti/cmd/ziti/cmd/agent.go +++ b/ziti/cmd/ziti/cmd/agent.go @@ -65,6 +65,7 @@ func NewAgentCmd(p common.OptionsProvider) *cobra.Command { routerCmd.AddCommand(NewSimpleAgentCustomCmd("reconnect", AgentAppRouter, router.OpenControlChannel, p)) routerCmd.AddCommand(NewSimpleAgentCustomCmd("dump-api-sessions", AgentAppRouter, debugops.DumpApiSessions, p)) routerCmd.AddCommand(NewSimpleAgentCustomCmd("dump-links", AgentAppRouter, router.DumpLinks, p)) + routerCmd.AddCommand(NewForgetLinkAgentCmd(p)) return agentCmd } diff --git a/ziti/cmd/ziti/cmd/agent_router_forget_link.go b/ziti/cmd/ziti/cmd/agent_router_forget_link.go new file mode 100644 index 000000000..728e38d2b --- /dev/null +++ b/ziti/cmd/ziti/cmd/agent_router_forget_link.go @@ -0,0 +1,107 @@ +/* + 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 cmd + +import ( + "fmt" + "github.com/openziti/channel" + "github.com/openziti/fabric/pb/mgmt_pb" + "github.com/openziti/fabric/router" + "github.com/openziti/foundation/agent" + "github.com/openziti/foundation/identity/identity" + "github.com/openziti/ziti/ziti/cmd/ziti/cmd/agentcli" + "github.com/openziti/ziti/ziti/cmd/ziti/cmd/common" + cmdhelper "github.com/openziti/ziti/ziti/cmd/ziti/cmd/helpers" + "github.com/spf13/cobra" + "net" + "time" +) + +type ForgetLinkAgentAction struct { + agentcli.AgentOptions +} + +func NewForgetLinkAgentCmd(p common.OptionsProvider) *cobra.Command { + options := &ForgetLinkAgentAction{ + AgentOptions: agentcli.AgentOptions{ + CommonOptions: p(), + }, + } + + cmd := &cobra.Command{ + Args: cobra.RangeArgs(1, 2), + Use: "forget-link ", + Run: func(cmd *cobra.Command, args []string) { + options.Cmd = cmd + options.Args = args + err := options.Run() + cmdhelper.CheckErr(err) + }, + } + + return cmd +} + +// Run implements the command +func (self *ForgetLinkAgentAction) Run() error { + var addr string + var err error + if len(self.Args) == 2 { + addr, err = agent.ParseGopsAddress(self.Args) + if err != nil { + return err + } + } + + return agent.MakeRequestF(addr, agent.CustomOpAsync, []byte{router.AgentAppId}, self.makeRequest) +} + +func (self *ForgetLinkAgentAction) makeRequest(conn net.Conn) error { + options := channel.DefaultOptions() + options.ConnectTimeout = time.Second + dialer := channel.NewExistingConnDialer(&identity.TokenId{Token: "agent"}, conn, nil) + ch, err := channel.NewChannel("agent", dialer, nil, options) + if err != nil { + return err + } + + linkId := self.Args[0] + if len(self.Args) == 2 { + linkId = self.Args[1] + } + + msg := channel.NewMessage(int32(mgmt_pb.ContentType_RouterDebugForgetLinkRequestType), []byte(linkId)) + reply, err := msg.WithTimeout(5 * time.Second).SendForReply(ch) + if err != nil { + return err + } + if reply.ContentType == channel.ContentTypeResultType { + result := channel.UnmarshalResult(reply) + if result.Success { + if len(result.Message) > 0 { + fmt.Printf("success: %v\n", result.Message) + } else { + fmt.Println("success") + } + } else { + fmt.Printf("error: %v\n", result.Message) + } + } else { + fmt.Printf("unexpected response type %v\n", reply.ContentType) + } + return nil +} diff --git a/ziti/cmd/ziti/cmd/common/options.go b/ziti/cmd/ziti/cmd/common/options.go index 4c95314bd..34db5f6e1 100644 --- a/ziti/cmd/ziti/cmd/common/options.go +++ b/ziti/cmd/ziti/cmd/common/options.go @@ -60,6 +60,18 @@ func (options *CommonOptions) TimeoutContext() (context.Context, context.CancelF return context.WithTimeout(context.Background(), timeout) } +func (options *CommonOptions) GetFilter() *string { + if len(options.Args) > 0 { + return &options.Args[0] + } + return nil +} + +func (options *CommonOptions) GetContext() context.Context { + ctx, _ := context.WithTimeout(context.Background(), time.Second*time.Duration(options.Timeout)) + return ctx +} + func (options *CommonOptions) Printf(format string, args ...interface{}) { if _, err := fmt.Fprintf(options.Out, format, args...); err != nil { panic(err) diff --git a/ziti/cmd/ziti/cmd/config_templates/controller.yml b/ziti/cmd/ziti/cmd/config_templates/controller.yml index 384e6941a..9c166c64d 100644 --- a/ziti/cmd/ziti/cmd/config_templates/controller.yml +++ b/ziti/cmd/ziti/cmd/config_templates/controller.yml @@ -15,6 +15,52 @@ identity: key: "{{ .Controller.IdentityKey }}" ca: "{{ .Controller.IdentityCA }}" +# Network Configuration +# +# Configure how the controller will establish and manage the overlay network, and routing operations on top of +# the network. +# +#network: + + # routeTimeoutSeconds controls the number of seconds the controller will wait for a route attempt to succeed. + #routeTimeoutSeconds: 10 + + # createCircuitRetries controls the number of retries that will be attempted to create a path (and terminate it) + # for new circuits. + #createCircuitRetries: 2 + + # pendingLinkTimeoutSeconds controls how long we'll wait before creating a new link between routers where + # there isn't an established link, but a link request has been sent + #pendingLinkTimeoutSeconds: 10 + + # Defines the period that the controller re-evaluates the performance of all of the circuits + # running on the network. + # + #cycleSeconds: 15 + + # Sets router minimum cost. Defaults to 10 + #minRouterCost: 10 + + # Sets how often a new control channel connection can take over for a router with an existing control channel connection + # Defaults to 1 minute + #routerConnectChurnLimit: 1m + + #smart: + # + # Defines the fractional upper limit of underperforming circuits that are candidates to be re-routed. If + # smart routing detects 100 circuits that are underperforming, and `smart.rerouteFraction` is set to `0.02`, + # then the upper limit of circuits that will be re-routed in this `cycleSeconds` period will be limited to + # 2 (2% of 100). + # + #rerouteFraction: 0.02 + # + # Defines the hard upper limit of underperforming circuits that are candidates to be re-routed. If smart + # routing detects 100 circuits that are underperforming, and `smart.rerouteCap` is set to `1`, and + # `smart.rerouteFraction` is set to `0.02`, then the upper limit of circuits that will be re-routed in this + # `cycleSeconds` period will be limited to 1. + # + #rerouteCap: 4 + # the endpoint that routers will connect to the controller over. ctrl: #options: @@ -169,4 +215,4 @@ web: - binding: edge-client options: { } - binding: fabric - options: { } \ No newline at end of file + options: { } diff --git a/ziti/cmd/ziti/cmd/demo/echo-notes.txt b/ziti/cmd/ziti/cmd/demo/echo-notes.txt index 0eb6a8b8e..3ad48a954 100644 --- a/ziti/cmd/ziti/cmd/demo/echo-notes.txt +++ b/ziti/cmd/ziti/cmd/demo/echo-notes.txt @@ -28,6 +28,7 @@ Part 2 - multi-router, single server Part 3 - multi-router, multi-server, SDK hosted, HS 1. Do sdk demo 2. Show terminators + a. show updating precedence cost from inside sdk app 3. Do sdk demo again with addressable terminators 4. Show terminators a. Because it's the initiating router, cost will be lower to terminate on the same router @@ -42,4 +43,9 @@ Part 5 - multi-router, multi-server, tunneler hosted, HS 3. Show with addressable 4. Show with precedences +Part 6 - ziti-tunnel +1. Talk through like SDK hosted + router/tunneler hosted. Need identity and configs +2. Talk about how config is different b/c tunneler is usually co-located with server app +3. Show + diff --git a/ziti/cmd/ziti/cmd/demo/root.go b/ziti/cmd/ziti/cmd/demo/root.go index 6edac7f47..02d26fdb7 100644 --- a/ziti/cmd/ziti/cmd/demo/root.go +++ b/ziti/cmd/ziti/cmd/demo/root.go @@ -74,6 +74,7 @@ func NewDemoCmd(p common.OptionsProvider) *cobra.Command { echoCmd.AddCommand(newMultiSdkHostedCmd(p)) echoCmd.AddCommand(newSingleRouterTunnelerHostedCmd(p)) echoCmd.AddCommand(newMultiRouterTunnelerHostedCmd(p)) + echoCmd.AddCommand(newMultiTunnelerHostedCmd(p)) echoCmd.AddCommand(newUpdateConfigAddressableCmd(p)) echoCmd.AddCommand(newUpdateConfigHACmd(p)) diff --git a/ziti/cmd/ziti/cmd/demo/setup-multi-tunneler-hosted-service.go b/ziti/cmd/ziti/cmd/demo/setup-multi-tunneler-hosted-service.go new file mode 100644 index 000000000..5b1e79c1b --- /dev/null +++ b/ziti/cmd/ziti/cmd/demo/setup-multi-tunneler-hosted-service.go @@ -0,0 +1,86 @@ +/* + 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 demo + +import ( + _ "embed" + "github.com/openziti/ziti/ziti/cmd/ziti/cmd/api" + "github.com/openziti/ziti/ziti/cmd/ziti/cmd/common" + cmdhelper "github.com/openziti/ziti/ziti/cmd/ziti/cmd/helpers" + tutorial2 "github.com/openziti/ziti/ziti/cmd/ziti/cmd/tutorial" + "github.com/openziti/ziti/ziti/cmd/ziti/cmd/tutorial/actions" + "github.com/openziti/ziti/ziti/cmd/ziti/tutorial" + "github.com/spf13/cobra" + "time" +) + +//go:embed setup-scripts/multi-tunneler-hosted.md +var multiTunnelerHostedScriptSource []byte + +type multiTunnelerHosted struct { + api.Options + tutorial2.TutorialOptions + interactive bool +} + +func newMultiTunnelerHostedCmd(p common.OptionsProvider) *cobra.Command { + options := &multiTunnelerHosted{ + Options: api.Options{ + CommonOptions: p(), + }, + } + + cmd := &cobra.Command{ + Use: "multi-tunneler-hosted", + Short: "Walks you through hosting configuration for a simple echo service, hosted by tunnelers and multiple applications", + Args: cobra.ExactArgs(0), + Run: func(cmd *cobra.Command, args []string) { + options.Cmd = cmd + options.Args = args + err := options.run() + cmdhelper.CheckErr(err) + }, + SuggestFor: []string{}, + } + + // allow interspersing positional args and flags + cmd.Flags().SetInterspersed(true) + cmd.Flags().StringVar(&options.ControllerUrl, "controller-url", "", "The Ziti controller URL to use") + cmd.Flags().StringVarP(&options.Username, "username", "u", "", "The Ziti controller username to use") + cmd.Flags().StringVarP(&options.Password, "password", "p", "", "The Ziti controller password to use") + cmd.Flags().DurationVar(&options.NewlinePause, "newline-pause", time.Millisecond*10, "How long to pause between lines when scrolling") + cmd.Flags().BoolVar(&options.interactive, "interactive", false, "Interactive mode, waiting for user input") + options.AddCommonFlags(cmd) + + return cmd +} + +func (self *multiTunnelerHosted) run() error { + t := tutorial.NewRunner() + t.NewLinePause = self.NewlinePause + t.AssumeDefault = !self.interactive + + t.RegisterActionHandler("ziti", &actions.ZitiRunnerAction{}) + t.RegisterActionHandler("ziti-login", &actions.ZitiEnsureLoggedIn{ + LoginParams: &self.TutorialOptions, + }) + t.RegisterActionHandler("keep-session-alive", &actions.KeepSessionAliveAction{}) + t.RegisterActionHandler("ziti-create-config", &actions.ZitiCreateConfigAction{}) + t.RegisterActionHandler("ziti-for-each", &actions.ZitiForEach{}) + + return t.Run(multiTunnelerHostedScriptSource) +} diff --git a/ziti/cmd/ziti/cmd/demo/setup-scripts/multi-router-tunneler-hosted.md b/ziti/cmd/ziti/cmd/demo/setup-scripts/multi-router-tunneler-hosted.md index efc3d4f06..76ea998a2 100644 --- a/ziti/cmd/ziti/cmd/demo/setup-scripts/multi-router-tunneler-hosted.md +++ b/ziti/cmd/ziti/cmd/demo/setup-scripts/multi-router-tunneler-hosted.md @@ -79,6 +79,7 @@ ziti edge create service echo -c echo-host -a echo ## Update edge-routers Make sure demo edge routers are tunneler enabled and the associated identity has the `echo-host` attribute +Only routers with the `demo` role attribute will be updated. ```action:ziti-for-each type=edge-routers minCount=1 maxCount=2 filter='anyOf(roleAttributes)="demo"' ziti edge update edge-router ${entityName} --tunneler-enabled diff --git a/ziti/cmd/ziti/cmd/demo/setup-scripts/multi-tunneler-hosted.md b/ziti/cmd/ziti/cmd/demo/setup-scripts/multi-tunneler-hosted.md new file mode 100644 index 000000000..114ce13e8 --- /dev/null +++ b/ziti/cmd/ziti/cmd/demo/setup-scripts/multi-tunneler-hosted.md @@ -0,0 +1,99 @@ +# Purpose + +This script sets up hosting for an echo service which is hosted by multiple router-embedded tunneler and +multiple applications. + +# Prerequisites + +You need at least one controller and an edge router running. for this to work. +You can use the quick-start script found [here](https://github.com/openziti/ziti/tree/release-next/quickstart). + +# Setup + +## Ensure we're logged into the controller. + +```action:ziti-login allowRetry=true +ziti edge login +``` + + + +## Remove any entities from previous runs. + +```action:ziti +ziti edge delete service echo +ziti edge delete config echo-host +ziti edge delete identities echo-host-1 echo-host-2 +ziti edge delete service-policies echo-bind +ziti edge delete edge-router-policies echo +ziti edge delete service-edge-router-policies echo +``` + +```action:ziti-for-each type=edge-routers minCount=1 maxCount=2 filter='anyOf(roleAttributes)="demo"' +ziti edge update edge-router ${entityName} --tunneler-enabled +ziti edge update identity ${entityName} --role-attributes not-hosting +``` + +## Create the echo-host config + +```action:ziti-create-config name=echo-host type=host.v2 +{ + "terminators" : [ + { + "address" : "localhost", + "port" : 1234, + "protocol" : "tcp", + "portChecks" : [ + { + "address" : "localhost:2234", + "interval" : "1s", + "timeout" : "100ms", + "actions" : [ + { "trigger" : "fail", "action" : "mark unhealthy" }, + { "trigger" : "pass", "action" : "mark healthy" } + ] + } + ] + } + ] +} +``` + +## Create the echo service + +```action:ziti +ziti edge create service echo -c echo-host -a echo +``` + +## Create and enroll the hosting identities + +```action:ziti +ziti edge create identity service echo-host-1 -a echo,echo-host -o echo-host-1.jwt +ziti edge enroll --rm echo-host-1.jwt + +ziti edge create identity service echo-host-2 -a echo,echo-host -o echo-host-2.jwt +ziti edge enroll --rm echo-host-2.jwt +``` + +## Configure policies + +```action:ziti +ziti edge create service-policy echo-bind Bind --service-roles @echo --identity-roles #echo-host +ziti edge create edge-router-policy echo --identity-roles #echo --edge-router-roles #all +ziti edge create service-edge-router-policy echo --service-roles @echo --edge-router-roles #all +``` + +## Summary + +You should now be to run two instances of the echo server with + +``` +ziti demo echo-server -p 1234 --health-check-addr 0.0.0.0:2234 +ziti demo echo-server -p 1235 --health-check-addr 0.0.0.0:2235 +``` + +and the zcat client using + +``` +ziti demo zcat -i zcat.json ziti:echo +``` diff --git a/ziti/cmd/ziti/cmd/demo/setup-scripts/single-router-tunneler-hosted.md b/ziti/cmd/ziti/cmd/demo/setup-scripts/single-router-tunneler-hosted.md index 19e686911..f08476fa2 100644 --- a/ziti/cmd/ziti/cmd/demo/setup-scripts/single-router-tunneler-hosted.md +++ b/ziti/cmd/ziti/cmd/demo/setup-scripts/single-router-tunneler-hosted.md @@ -50,7 +50,8 @@ ziti edge create service echo -c echo-host -a echo ## Update edge-routers -Make sure demo edge routers are tunneler enabled and the associated identity has the `echo-host` attribute +Make sure demo edge routers are tunneler enabled and the associated identity has the `echo-host` attribute. +Only routers with the `demo` role attribute will be updated. ```action:ziti-for-each type=edge-routers minCount=1 maxCount=2 filter='anyOf(roleAttributes)="demo"' ziti edge update edge-router ${entityName} --tunneler-enabled diff --git a/ziti/cmd/ziti/cmd/edge/list.go b/ziti/cmd/ziti/cmd/edge/list.go index c1b6d1764..e09845cb5 100644 --- a/ziti/cmd/ziti/cmd/edge/list.go +++ b/ziti/cmd/ziti/cmd/edge/list.go @@ -614,7 +614,7 @@ func outputServicePolicies(o *api.Options, children []*gabs.Container, pagingInf t := table.NewWriter() t.SetStyle(table.StyleRounded) - t.AppendHeader(table.Row{"ID", "Name", "Service Roles", "Identity Roles", "Posture Check Roles"}) + t.AppendHeader(table.Row{"ID", "Name", "Semantic", "Service Roles", "Identity Roles", "Posture Check Roles"}) for _, entity := range children { wrapper := api.Wrap(entity) @@ -637,6 +637,7 @@ func outputServicePolicies(o *api.Options, children []*gabs.Container, pagingInf t.AppendRow(table.Row{ wrapper.String("id"), wrapper.String("name"), + wrapper.String("semantic"), strings.Join(serviceRoles, " "), strings.Join(identityRoles, " "), strings.Join(postureCheckRoles, " "), @@ -717,7 +718,7 @@ func outputIdentities(o *api.Options, children []*gabs.Container, pagingInfo *ap wrapper.String("id"), wrapper.String("name"), wrapper.String("type.name"), - strings.Join(wrapper.StringSlice("roleAttributes"), "\n")}) + strings.Join(wrapper.StringSlice("roleAttributes"), ",")}) } api.RenderTable(o, t, pagingInfo) diff --git a/ziti/cmd/ziti/cmd/edge/show.go b/ziti/cmd/ziti/cmd/edge/show.go index e23dec971..ed4a46743 100644 --- a/ziti/cmd/ziti/cmd/edge/show.go +++ b/ziti/cmd/ziti/cmd/edge/show.go @@ -37,13 +37,13 @@ func newShowCmd(out io.Writer, errOut io.Writer) *cobra.Command { }, } - showCmd.AddCommand(newShowConfigTypeSchemaAction(out, errOut)) - showCmd.AddCommand(newShowConfigDefAction(out, errOut)) + showCmd.AddCommand(newShowConfigTypeAction(out, errOut)) + showCmd.AddCommand(newShowConfigAction(out, errOut)) return showCmd } -func newShowConfigDefAction(out io.Writer, errOut io.Writer) *cobra.Command { - action := &showConfigDefAction{ +func newShowConfigAction(out io.Writer, errOut io.Writer) *cobra.Command { + action := &showConfigAction{ Options: api.Options{ CommonOptions: common.CommonOptions{ Out: out, @@ -53,7 +53,7 @@ func newShowConfigDefAction(out io.Writer, errOut io.Writer) *cobra.Command { } showConfigDefCmd := &cobra.Command{ - Use: "config-definition ", + Use: "config ", Short: "displays the JSON config definition for a given config", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { @@ -68,11 +68,11 @@ func newShowConfigDefAction(out io.Writer, errOut io.Writer) *cobra.Command { return showConfigDefCmd } -type showConfigDefAction struct { +type showConfigAction struct { api.Options } -func (self *showConfigDefAction) run(command *cobra.Command, args []string) error { +func (self *showConfigAction) run(_ *cobra.Command, args []string) error { id, err := mapNameToID("configs", args[0], self.Options) if err != nil { return err @@ -98,8 +98,8 @@ func (self *showConfigDefAction) run(command *cobra.Command, args []string) erro return nil } -func newShowConfigTypeSchemaAction(out io.Writer, errOut io.Writer) *cobra.Command { - action := &showConfigTypeSchemaAction{ +func newShowConfigTypeAction(out io.Writer, errOut io.Writer) *cobra.Command { + action := &showConfigTypeAction{ Options: api.Options{ CommonOptions: common.CommonOptions{ Out: out, @@ -109,7 +109,7 @@ func newShowConfigTypeSchemaAction(out io.Writer, errOut io.Writer) *cobra.Comma } showConfigTypeSchemaCmd := &cobra.Command{ - Use: "config-type-schema ", + Use: "config-type ", Short: "displays the JSON schema for a given config type", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { @@ -124,11 +124,11 @@ func newShowConfigTypeSchemaAction(out io.Writer, errOut io.Writer) *cobra.Comma return showConfigTypeSchemaCmd } -type showConfigTypeSchemaAction struct { +type showConfigTypeAction struct { api.Options } -func (self *showConfigTypeSchemaAction) run(command *cobra.Command, args []string) error { +func (self *showConfigTypeAction) run(_ *cobra.Command, args []string) error { id, err := mapNameToID("config-types", args[0], self.Options) if err != nil { return err diff --git a/ziti/cmd/ziti/cmd/edge/traceroute.go b/ziti/cmd/ziti/cmd/edge/traceroute.go index 8c49a10e4..3f2396a88 100644 --- a/ziti/cmd/ziti/cmd/edge/traceroute.go +++ b/ziti/cmd/ziti/cmd/edge/traceroute.go @@ -95,7 +95,7 @@ func (o *traceRouteOptions) Run() error { return err } - if result.Hops > 0 { + if result.Hops > 0 && result.Error == "" { break } @@ -110,13 +110,21 @@ func (o *traceRouteOptions) Run() error { } } + hopErr := "" + if result.Error != "" { + hopErr = fmt.Sprintf("ERROR=%v", result.Error) + } + if hopLabel == "" { - fmt.Printf("%2v %25v %6v \n", currentHop, result.HopType, result.Time) + fmt.Printf("%2v %25v %6v %v\n", currentHop, result.HopType, result.Time, hopErr) } else { - fmt.Printf("%2v %25v %6v \n", currentHop, fmt.Sprintf("%v[%v]", result.HopType, hopLabel), result.Time) + fmt.Printf("%2v %25v %6v %v\n", currentHop, fmt.Sprintf("%v[%v]", result.HopType, hopLabel), result.Time, hopErr) } currentHop++ + if hopErr != "" { + break + } } if routerNameLookupsFailed { diff --git a/ziti/cmd/ziti/cmd/fabric/inspect.go b/ziti/cmd/ziti/cmd/fabric/inspect.go index c17406ddc..3e87394f6 100644 --- a/ziti/cmd/ziti/cmd/fabric/inspect.go +++ b/ziti/cmd/ziti/cmd/fabric/inspect.go @@ -10,19 +10,22 @@ import ( "github.com/openziti/ziti/ziti/cmd/ziti/cmd/common" "github.com/openziti/ziti/ziti/cmd/ziti/util" "github.com/spf13/cobra" + "sort" + "strings" ) // newListCmd creates a command object for the "controller list" command func newInspectCmd(p common.OptionsProvider) *cobra.Command { - listCmd := &ListCmd{Options: api.Options{CommonOptions: p()}} + listCmd := &InspectCmd{Options: api.Options{CommonOptions: p()}} return listCmd.newCobraCmd() } -type ListCmd struct { +type InspectCmd struct { api.Options + prettyPrint bool } -func (self *ListCmd) newCobraCmd() *cobra.Command { +func (self *InspectCmd) newCobraCmd() *cobra.Command { cmd := &cobra.Command{ Use: "inspect", Short: "Inspect runtime application values", @@ -33,7 +36,7 @@ func (self *ListCmd) newCobraCmd() *cobra.Command { return cmd } -func (self *ListCmd) run(cmd *cobra.Command, args []string) error { +func (self *InspectCmd) run(_ *cobra.Command, args []string) error { client, err := util.NewFabricManagementClient(self) if err != nil { return err @@ -60,7 +63,8 @@ func (self *ListCmd) run(cmd *cobra.Command, args []string) error { fmt.Printf("\nResults: (%d)\n", len(result.Values)) for _, value := range result.Values { fmt.Printf("%v.%v\n", stringz.OrEmpty(value.AppID), stringz.OrEmpty(value.Name)) - fmt.Printf("%+v\n\n", value.Value) + self.prettyPrintOutput(value.Value, 0) + fmt.Printf("\n") } } else { fmt.Printf("\nEncountered errors: (%d)\n", len(result.Errors)) @@ -71,3 +75,45 @@ func (self *ListCmd) run(cmd *cobra.Command, args []string) error { return nil } + +func (self *InspectCmd) prettyPrintOutput(val interface{}, indent int) { + if mapVal, ok := val.(map[string]interface{}); ok { + fmt.Printf("\n") + var sortedKeys []string + for k := range mapVal { + sortedKeys = append(sortedKeys, k) + } + sort.Strings(sortedKeys) + for _, k := range sortedKeys { + for i := 0; i < indent; i++ { + fmt.Printf(" ") + } + fmt.Printf("%v: ", k) + self.prettyPrintOutput(mapVal[k], indent+4) + } + } else if sliceVal, ok := val.([]interface{}); ok { + fmt.Println() + for _, v := range sliceVal { + for i := 0; i < indent; i++ { + fmt.Printf(" ") + } + fmt.Printf(" - ") + self.prettyPrintOutput(v, indent+6) + } + } else if strVal, ok := val.(string); ok { + if strings.IndexByte(strVal, '\n') > 0 { + lines := strings.Split(strVal, "\n") + fmt.Println(lines[0]) + for _, line := range lines[1:] { + for i := 0; i < indent; i++ { + fmt.Printf(" ") + } + fmt.Println(line) + } + } else { + fmt.Printf("%v\n", val) + } + } else { + fmt.Printf("%v\n", val) + } +}