Merge pull request #1131 from openziti/merge-zitilab

Merge zitilab into zit and reorganize testing code
This commit is contained in:
Paul Lorenz
2023-06-06 11:53:35 -04:00
committed by GitHub
109 changed files with 6757 additions and 211 deletions
+2 -2
View File
@@ -119,7 +119,7 @@ jobs:
run: |
$(go env GOPATH)/bin/ziti-ci configure-git
$(go env GOPATH)/bin/ziti-ci generate-build-info common/version/info_generated.go version
pushd network-tests && go install ./... && popd
pushd zititest && go install ./... && popd
go install -tags=all,tests ./...
- name: Create Zitilab Bindings
@@ -148,7 +148,7 @@ jobs:
run: |
echo "ZITI_ROOT=$(go env GOPATH)/bin" >> "$GITHUB_ENV"
$(go env GOPATH)/bin/simple-transfer run
pushd network-tests && go test -v ./tests/... && popd
pushd zititest && go test -v ./tests/... && popd
- name: Test Ziti Command Teardown
if: always()
+9 -9
View File
@@ -21,16 +21,16 @@ require (
github.com/jedib0t/go-pretty/v6 v6.4.0
github.com/michaelquigley/pfxlog v0.6.10
github.com/openziti/agent v1.0.13
github.com/openziti/channel/v2 v2.0.78
github.com/openziti/edge v0.24.309
github.com/openziti/channel/v2 v2.0.79
github.com/openziti/edge v0.24.313
github.com/openziti/edge-api v0.25.24
github.com/openziti/fabric v0.23.29
github.com/openziti/foundation/v2 v2.0.24
github.com/openziti/identity v1.0.54
github.com/openziti/foundation/v2 v2.0.25
github.com/openziti/identity v1.0.55
github.com/openziti/runzmd v1.0.24
github.com/openziti/sdk-golang v0.20.51
github.com/openziti/storage v0.2.6
github.com/openziti/transport/v2 v2.0.88
github.com/openziti/sdk-golang v0.20.54
github.com/openziti/storage v0.2.7
github.com/openziti/transport/v2 v2.0.89
github.com/openziti/xweb/v2 v2.0.2
github.com/openziti/ziti-db-explorer v1.1.1
github.com/pkg/errors v0.9.1
@@ -41,7 +41,7 @@ require (
github.com/spf13/cobra v1.7.0
github.com/spf13/pflag v1.0.5
github.com/spf13/viper v1.10.0
github.com/stretchr/testify v1.8.3
github.com/stretchr/testify v1.8.4
go.etcd.io/bbolt v1.3.7
golang.org/x/net v0.10.0
google.golang.org/grpc v1.42.0
@@ -142,7 +142,7 @@ require (
github.com/opentracing/opentracing-go v1.2.0 // indirect
github.com/openziti/dilithium v0.3.3 // indirect
github.com/openziti/jwks v1.0.3 // indirect
github.com/openziti/metrics v1.2.25 // indirect
github.com/openziti/metrics v1.2.26 // indirect
github.com/openziti/secretstream v0.1.8 // indirect
github.com/openziti/x509-claims v1.0.3 // indirect
github.com/orcaman/concurrent-map/v2 v2.0.1 // indirect
+18 -18
View File
@@ -721,34 +721,34 @@ github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTm
github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
github.com/openziti/agent v1.0.13 h1:RptJCEANPb904cDqlP7IYfBI+he8EyosimYhG7bp9D0=
github.com/openziti/agent v1.0.13/go.mod h1:CRbwhhnpsoDw0BxZsCRyQUozoRnGzH7+wuQVp1h4qX8=
github.com/openziti/channel/v2 v2.0.78 h1:zY6olGzk0i7RdwnQQYV4J3aJmtuWqpTNUpbCKrghdFA=
github.com/openziti/channel/v2 v2.0.78/go.mod h1:yajD/OlGYESMURbogY+myEUZ49fWERPbIhU6kcDnQHE=
github.com/openziti/channel/v2 v2.0.79 h1:pjbMmllLu1K3RzvX3K+FJK09bewrL5ZJGEL2cZiPmuM=
github.com/openziti/channel/v2 v2.0.79/go.mod h1:NOwAKC9nTZi41njN/4iRNWpGpt4psu5jjhv8bA9FbwE=
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.24.309 h1:EGZZ7GqI6/2y8zoNc0Tb11DpHtDG3YTNMUChulFTDL4=
github.com/openziti/edge v0.24.309/go.mod h1:UDlCvgpuzQ6FFugSK0Sim7214c1O+7ahiOX5tvhJaP4=
github.com/openziti/edge v0.24.313 h1:r8Foxel03S4c9mlkbS5cSS0DxSVjEzpLkkX1nkvI+4Q=
github.com/openziti/edge v0.24.313/go.mod h1:5gH8JPtRYO867mhEPwWBqNqYnZXFIGDvmymn180nhKM=
github.com/openziti/edge-api v0.25.24 h1:XrF3AtF9mnJXgG7rSV2M50Dj/EKUkBUaDdb9/n2TDHI=
github.com/openziti/edge-api v0.25.24/go.mod h1:rmEkj8jAkBTUhhgE/GFXije6bpFbd2P9TzdxTqZlXI8=
github.com/openziti/fabric v0.23.29 h1:FbAeUhfkNGYPNCYo3BFzRByvMTKhscxJEQxYU0BJJdA=
github.com/openziti/fabric v0.23.29/go.mod h1:/M8URo+qloi39qG0QWvXTgtpiPPneNYOjR+VvywS0cw=
github.com/openziti/foundation/v2 v2.0.24 h1:cNJCbh4o9E+7mtSUDo7ZBuMoPjJAilDWgr7X8ntRz/Q=
github.com/openziti/foundation/v2 v2.0.24/go.mod h1:H0w/ldKyE0ynwpIwt68k2rhMwt874IVxPQcimMuHJ3s=
github.com/openziti/identity v1.0.54 h1:1O/i3hnm5oCuHlOXesx4+aC2bXeTGoT+Rg1l2xZF14Y=
github.com/openziti/identity v1.0.54/go.mod h1:ZhMiSF9okmA781kFl0m4BkeyAmf3XA20h1Dh1oz480I=
github.com/openziti/foundation/v2 v2.0.25 h1:tGb9wdu6KCpO49RJ3HX2ClOVHf8gdntplIh/7CEVaM4=
github.com/openziti/foundation/v2 v2.0.25/go.mod h1:EOqea8Q1wXd4hS9MxFYM6ngDgenKGxz8c+CJ8Svr7BI=
github.com/openziti/identity v1.0.55 h1:WwZhFyIfor27MafmfSPr/xsQoSqT3KOnIeqy3FC+n4w=
github.com/openziti/identity v1.0.55/go.mod h1:ZaB62FkLGPglM7cR/o2jRIDF6Apa1swNLad9NQ2sa7Q=
github.com/openziti/jwks v1.0.3 h1:hf8wkb+Cg4nH/HM0KROFd7u+C3DkRVcFZJ7tDV+4icc=
github.com/openziti/jwks v1.0.3/go.mod h1:t4xxq8vlXGsPn29kiQVnZBBDDnEoOFqtJoHibkJunQQ=
github.com/openziti/metrics v1.2.25 h1:acD/J/DcWgfbhmKS/s3HDvpt/1WS3QBZPeeGBZHbj94=
github.com/openziti/metrics v1.2.25/go.mod h1:s2r1FS+wUdJ3LXp1qJK6777iQ8gPWXE2HFfDsiJo1/Y=
github.com/openziti/metrics v1.2.26 h1:8q93bK1MYAdR9ODr0qNAJ1/BQpFtHYdxZiH0Fc9LLo8=
github.com/openziti/metrics v1.2.26/go.mod h1:Z1c9pNHQr+yZODDsOeim93rYg5Hw1kPsuHi3zdy70dA=
github.com/openziti/runzmd v1.0.24 h1:jSwfqpA6SLCtpDUzdQl92gECc08itE8eFeHYdaJu4tY=
github.com/openziti/runzmd v1.0.24/go.mod h1:NX3EPWMDZPIPNUztDOkLrV6akqdC/P/X0UUeAL63V58=
github.com/openziti/sdk-golang v0.20.51 h1:oVqo9kyh8OKtAAX4yrJIJa5nn6qZDvpfUqOlBPnqb14=
github.com/openziti/sdk-golang v0.20.51/go.mod h1:Ecgf8vgPSLOP7EgQgb3juv2UwsKbu37G1NHSqioTUCs=
github.com/openziti/sdk-golang v0.20.54 h1:c2PS+xOcCoDki5vAiCki4Zb0y6MddNZK2JuvmzL3Dbk=
github.com/openziti/sdk-golang v0.20.54/go.mod h1:xvjqDrrxy75g7y59MvKtzNbCzYbm1mpn3r91wsftmD4=
github.com/openziti/secretstream v0.1.8 h1:AgPHLDuXTiM1apHQmBvwvSW1vbQqAm7wUJDHqkQ/6Nk=
github.com/openziti/secretstream v0.1.8/go.mod h1:qcF8EmSX5SAT8k2pzsDI4bWugopv9AA+ltgWDrcAAEw=
github.com/openziti/storage v0.2.6 h1:/pbIRzDwrczMWRVkN75PfwAXFbArplIqhpRsUrsUOBc=
github.com/openziti/storage v0.2.6/go.mod h1:JnjCofrnPcajwn6VIB2CgI7pVVUFBL7evbezIsQ4AgA=
github.com/openziti/transport/v2 v2.0.88 h1:K2kIrDInbjFqXvzPg+EkyYZkUiy8rEkBnYRKshELuho=
github.com/openziti/transport/v2 v2.0.88/go.mod h1:1eh1lpeIvB3KgyEC+OykpLa8Dj2AUC5921iOd2ovkwE=
github.com/openziti/storage v0.2.7 h1:rQVVclnkCZyr4XXKMypIJf46HFGJX5KEYWEycUhWvtg=
github.com/openziti/storage v0.2.7/go.mod h1:bGhUs/0XDsEJnTtNTpFAIh1X4lfdKvHu0m+8Z1TFVyM=
github.com/openziti/transport/v2 v2.0.89 h1:XVggCrKAxFkNwW9/GLBZeqCDRWB+3T2jejPcK25W3+Q=
github.com/openziti/transport/v2 v2.0.89/go.mod h1:6JnNL8jsVBBDgphHHquPEl5aUsim2HYYE0Li5fzZqEQ=
github.com/openziti/x509-claims v1.0.3 h1:HNdQ8Nf1agB3lBs1gahcO6zfkeS4S5xoQ2/PkY4HRX0=
github.com/openziti/x509-claims v1.0.3/go.mod h1:Z0WIpBm6c4ecrpRKrou6Gk2wrLWxJO/+tuUwKh8VewE=
github.com/openziti/xweb/v2 v2.0.2 h1:XYlVFriTq/U1wcUrc+XPnWJGhXh9NJPhtQ7+r3aC0cU=
@@ -933,8 +933,8 @@ github.com/stretchr/testify v1.7.4/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY=
github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA=
-9
View File
@@ -1,9 +0,0 @@
package main
import (
"github.com/openziti/ziti/network-tests/utils/ziti-echo/cmd"
)
func main() {
cmd.Execute()
}
+48 -42
View File
@@ -1,23 +1,35 @@
module github.com/openziti/ziti/network-tests
module github.com/openziti/ziti/zititest
go 1.19
go 1.20
replace github.com/openziti/ziti => ../
require (
github.com/Jeffail/gabs v1.4.0
github.com/Jeffail/gabs/v2 v2.7.0
github.com/michaelquigley/pfxlog v0.6.10
github.com/openziti/edge v0.24.239
github.com/openziti/channel/v2 v2.0.79
github.com/openziti/edge v0.24.313
github.com/openziti/fablab v0.4.52
github.com/openziti/sdk-golang v0.18.76
github.com/openziti/zitilab v0.1.60
github.com/openziti/fabric v0.23.29
github.com/openziti/foundation/v2 v2.0.25
github.com/openziti/identity v1.0.55
github.com/openziti/sdk-golang v0.20.54
github.com/openziti/storage v0.2.7
github.com/openziti/transport/v2 v2.0.89
github.com/openziti/ziti v0.28.0
github.com/pkg/errors v0.9.1
github.com/sirupsen/logrus v1.9.2
github.com/spf13/cobra v1.7.0
github.com/stretchr/testify v1.8.3
github.com/stretchr/testify v1.8.4
go.etcd.io/bbolt v1.3.7
golang.org/x/net v0.10.0
google.golang.org/protobuf v1.30.0
gopkg.in/yaml.v3 v3.0.1
)
require (
github.com/AppsFlyer/go-sundheit v0.5.0 // indirect
github.com/Jeffail/gabs v1.4.0 // indirect
github.com/Jeffail/gabs/v2 v2.7.0 // indirect
github.com/MakeNowJust/heredoc v1.0.0 // indirect
github.com/MichaelMure/go-term-markdown v0.1.4 // indirect
github.com/MichaelMure/go-term-text v0.3.1 // indirect
@@ -31,13 +43,13 @@ require (
github.com/blang/semver v3.5.1+incompatible // indirect
github.com/boltdb/bolt v1.3.1 // indirect
github.com/c-bata/go-prompt v0.2.6 // indirect
github.com/cenkalti/backoff/v4 v4.2.0 // indirect
github.com/cenkalti/backoff/v4 v4.2.1 // indirect
github.com/coreos/go-iptables v0.6.0 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/dgryski/dgoogauth v0.0.0-20190221195224-5a805980a5f3 // indirect
github.com/dineshappavoo/basex v0.0.0-20170425072625-481a6f6dc663 // indirect
github.com/disintegration/imaging v1.6.2 // indirect
github.com/dlclark/regexp2 v1.9.0 // indirect
github.com/dlclark/regexp2 v1.10.0 // indirect
github.com/docker/go-units v0.5.0 // indirect
github.com/ef-ds/deque v1.0.4 // indirect
github.com/eliukblau/pixterm/pkg/ansimage v0.0.0-20191210081756-9fb6cf8c2f75 // indirect
@@ -55,8 +67,8 @@ require (
github.com/go-openapi/jsonpointer v0.19.6 // indirect
github.com/go-openapi/jsonreference v0.20.2 // indirect
github.com/go-openapi/loads v0.21.2 // indirect
github.com/go-openapi/runtime v0.25.0 // indirect
github.com/go-openapi/spec v0.20.8 // indirect
github.com/go-openapi/runtime v0.26.0 // indirect
github.com/go-openapi/spec v0.20.9 // indirect
github.com/go-openapi/strfmt v0.21.7 // indirect
github.com/go-openapi/swag v0.22.3 // indirect
github.com/go-openapi/validate v0.22.1 // indirect
@@ -68,6 +80,7 @@ require (
github.com/google/go-cmp v0.5.9 // indirect
github.com/google/uuid v1.3.0 // indirect
github.com/gorilla/handlers v1.5.1 // indirect
github.com/gorilla/mux v1.8.0 // indirect
github.com/gorilla/websocket v1.5.0 // indirect
github.com/hashicorp/go-hclog v1.5.0 // indirect
github.com/hashicorp/go-immutable-radix v1.3.1 // indirect
@@ -75,18 +88,19 @@ require (
github.com/hashicorp/golang-lru v0.6.0 // indirect
github.com/hashicorp/golang-lru/v2 v2.0.2 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/hashicorp/raft v1.4.0 // indirect
github.com/hashicorp/raft v1.5.0 // indirect
github.com/hashicorp/raft-boltdb v0.0.0-20220329195025-15018e9b97e0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d // indirect
github.com/jedib0t/go-pretty/v6 v6.4.6 // indirect
github.com/jessevdk/go-flags v1.5.0 // indirect
github.com/jinzhu/copier v0.3.5 // indirect
github.com/jmespath/go-jmespath v0.4.0 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/josharian/native v1.0.0 // indirect
github.com/josharian/native v1.1.0 // indirect
github.com/kataras/go-events v0.0.3 // indirect
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect
github.com/keybase/go-ps v0.0.0-20190827175125-91aafc93ba19 // indirect
github.com/klauspost/compress v1.16.5 // indirect
github.com/kr/fs v0.1.0 // indirect
github.com/kyokomi/emoji/v2 v2.2.12 // indirect
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
@@ -95,37 +109,30 @@ require (
github.com/magiconair/properties v1.8.5 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.18 // indirect
github.com/mattn/go-isatty v0.0.19 // indirect
github.com/mattn/go-runewidth v0.0.14 // indirect
github.com/mattn/go-tty v0.0.3 // indirect
github.com/mdlayher/netlink v1.7.1 // indirect
github.com/mdlayher/socket v0.4.0 // indirect
github.com/mdlayher/netlink v1.7.2 // indirect
github.com/mdlayher/socket v0.4.1 // indirect
github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect
github.com/michaelquigley/figlet v0.0.0-20191015203154-054d06db54b4 // indirect
github.com/miekg/dns v1.1.53 // indirect
github.com/miekg/dns v1.1.54 // indirect
github.com/miekg/pkcs11 v1.1.1 // indirect
github.com/mitchellh/go-ps v1.0.0 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/natefinch/lumberjack v2.0.0+incompatible // indirect
github.com/natefinch/npipe v0.0.0-20160621034901-c1b8fa8bdcce // indirect
github.com/netfoundry/secretstream v0.1.5 // indirect
github.com/oklog/ulid v1.3.1 // indirect
github.com/oliveagle/jsonpath v0.0.0-20180606110733-2e52cf6e6852 // indirect
github.com/opentracing/opentracing-go v1.2.0 // indirect
github.com/openziti/agent v1.0.10 // indirect
github.com/openziti/channel/v2 v2.0.58 // indirect
github.com/openziti/edge-api v0.25.11 // indirect
github.com/openziti/fabric v0.22.87 // indirect
github.com/openziti/foundation/v2 v2.0.24 // indirect
github.com/openziti/identity v1.0.45 // indirect
github.com/openziti/agent v1.0.13 // indirect
github.com/openziti/edge-api v0.25.24 // indirect
github.com/openziti/jwks v1.0.3 // indirect
github.com/openziti/metrics v1.2.19 // indirect
github.com/openziti/runzmd v1.0.20 // indirect
github.com/openziti/storage v0.1.49 // indirect
github.com/openziti/transport/v2 v2.0.72 // indirect
github.com/openziti/metrics v1.2.26 // indirect
github.com/openziti/runzmd v1.0.24 // indirect
github.com/openziti/secretstream v0.1.8 // indirect
github.com/openziti/x509-claims v1.0.3 // indirect
github.com/openziti/xweb/v2 v2.0.2 // indirect
github.com/openziti/ziti v0.27.9 // indirect
github.com/openziti/ziti-db-explorer v1.1.1 // indirect
github.com/orcaman/concurrent-map/v2 v2.0.1 // indirect
github.com/parallaxsecond/parsec-client-go v0.0.0-20221025095442-f0a77d263cf9 // indirect
@@ -134,12 +141,13 @@ require (
github.com/pkg/term v1.2.0-beta.2 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b // indirect
github.com/rabbitmq/amqp091-go v1.8.1 // indirect
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect
github.com/rivo/uniseg v0.4.4 // indirect
github.com/rodaine/table v1.0.1 // indirect
github.com/russross/blackfriday v1.5.2 // indirect
github.com/shirou/gopsutil/v3 v3.23.3 // indirect
github.com/shoenig/go-m1cpu v0.1.5 // indirect
github.com/shirou/gopsutil/v3 v3.23.4 // indirect
github.com/shoenig/go-m1cpu v0.1.6 // indirect
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e // indirect
github.com/speps/go-hashids v2.0.0+incompatible // indirect
github.com/spf13/afero v1.6.0 // indirect
@@ -156,28 +164,26 @@ require (
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
github.com/xeipuuv/gojsonschema v1.2.0 // indirect
github.com/yusufpapurcu/wmi v1.2.2 // indirect
go.etcd.io/bbolt v1.3.7 // indirect
go.mongodb.org/mongo-driver v1.11.4 // indirect
github.com/yusufpapurcu/wmi v1.2.3 // indirect
go.mongodb.org/mongo-driver v1.11.6 // indirect
go.mozilla.org/pkcs7 v0.0.0-20210826202110-33d05740a352 // indirect
go.opentelemetry.io/otel v1.14.0 // indirect
go.opentelemetry.io/otel/trace v1.14.0 // indirect
go.opentelemetry.io/otel v1.16.0 // indirect
go.opentelemetry.io/otel/metric v1.16.0 // indirect
go.opentelemetry.io/otel/trace v1.16.0 // indirect
golang.org/x/crypto v0.9.0 // indirect
golang.org/x/exp v0.0.0-20230321023759-10a507213a29 // indirect
golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 // indirect
golang.org/x/image v0.7.0 // indirect
golang.org/x/mod v0.8.0 // indirect
golang.org/x/net v0.10.0 // indirect
golang.org/x/sync v0.2.0 // indirect
golang.org/x/sys v0.8.0 // indirect
golang.org/x/term v0.8.0 // indirect
golang.org/x/text v0.9.0 // indirect
golang.org/x/tools v0.6.0 // indirect
google.golang.org/protobuf v1.30.0 // indirect
gopkg.in/AlecAivazis/survey.v1 v1.8.7 // indirect
gopkg.in/ini.v1 v1.66.2 // indirect
gopkg.in/resty.v1 v1.12.0 // indirect
gopkg.in/square/go-jose.v2 v2.5.1 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
nhooyr.io/websocket v1.8.7 // indirect
rsc.io/goversion v1.2.0 // indirect
)
+107 -69
View File
@@ -122,8 +122,8 @@ github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc/go.mod h1:paBW
github.com/c-bata/go-prompt v0.2.6 h1:POP+nrHE+DfLYx370bedwNhsqmpCUynWPxuHi0C5vZI=
github.com/c-bata/go-prompt v0.2.6/go.mod h1:/LMAke8wD2FsNu9EXNdHxNLbd9MedkPnCdfpU9wwHfY=
github.com/cenkalti/backoff/v4 v4.0.2/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8Bog/87DQnVg=
github.com/cenkalti/backoff/v4 v4.2.0 h1:HN5dHm3WBOgndBH6E8V0q2jIYIR3s9yglV8k/+MN3u4=
github.com/cenkalti/backoff/v4 v4.2.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=
github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
@@ -161,8 +161,8 @@ github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1
github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4=
github.com/dlclark/regexp2 v1.1.6/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
github.com/dlclark/regexp2 v1.9.0 h1:pTK/l/3qYIKaRXuHnEnIf7Y5NxfRPfpb7dis6/gdlVI=
github.com/dlclark/regexp2 v1.9.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
github.com/dlclark/regexp2 v1.10.0 h1:+/GIL799phkJqYW+3YbOd8LCcbHzT0Pbo8zl70MHsq0=
github.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
github.com/dnsimple/dnsimple-go v0.63.0/go.mod h1:O5TJ0/U6r7AfT8niYNlmohpLbCSG+c71tQlGr9SeGrg=
github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
@@ -200,6 +200,10 @@ github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbS
github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa h1:RDBNVkRviHZtvDvId8XSGPu3rmpmSe+wKRcEWNgsfWU=
github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14=
github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M=
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-cmd/cmd v1.0.5/go.mod h1:y8q8qlK5wQibcw63djSl/ntiHUHXHGdCkPk0j4QeW4s=
@@ -237,12 +241,12 @@ github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En
github.com/go-openapi/loads v0.21.1/go.mod h1:/DtAMXXneXFjbQMGEtbamCZb+4x7eGwkvZCvBmwUG+g=
github.com/go-openapi/loads v0.21.2 h1:r2a/xFIYeZ4Qd2TnGpWDIQNcP80dIaZgf704za8enro=
github.com/go-openapi/loads v0.21.2/go.mod h1:Jq58Os6SSGz0rzh62ptiu8Z31I+OTHqmULx5e/gJbNw=
github.com/go-openapi/runtime v0.25.0 h1:7yQTCdRbWhX8vnIjdzU8S00tBYf7Sg71EBeorlPHvhc=
github.com/go-openapi/runtime v0.25.0/go.mod h1:Ux6fikcHXyyob6LNWxtE96hWwjBPYF0DXgVFuMTneOs=
github.com/go-openapi/runtime v0.26.0 h1:HYOFtG00FM1UvqrcxbEJg/SwvDRvYLQKGhw2zaQjTcc=
github.com/go-openapi/runtime v0.26.0/go.mod h1:QgRGeZwrUcSHdeh4Ka9Glvo0ug1LC5WyE+EV88plZrQ=
github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I=
github.com/go-openapi/spec v0.20.6/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA=
github.com/go-openapi/spec v0.20.8 h1:ubHmXNY3FCIOinT8RNrrPfGc9t7I1qhPtdOGoG2AxRU=
github.com/go-openapi/spec v0.20.8/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA=
github.com/go-openapi/spec v0.20.9 h1:xnlYNQAwKd2VQRRfwTEI0DcK+2cbuvI/0c7jx3gA8/8=
github.com/go-openapi/spec v0.20.9/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.3/go.mod h1:k+RzNO0Da+k3FrrynSNN8F7n/peCmQQqbbXjtDfvmGg=
@@ -255,6 +259,13 @@ github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/
github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
github.com/go-openapi/validate v0.22.1 h1:G+c2ub6q47kfX1sOBLwIQwzBVt8qmOAARyo/9Fqs9NU=
github.com/go-openapi/validate v0.22.1/go.mod h1:rjnrwK57VJ7A8xqfpAOEKRH8yQSGUriMu5/zuPSQ1hg=
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q=
github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no=
github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY=
github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI=
github.com/go-resty/resty/v2 v2.1.1-0.20191201195748-d7b97669fe48/go.mod h1:dZGr0i9PLlaaTD4H/hoZIDjQ+r6xq8mgbRzHZf7f2J8=
github.com/go-resty/resty/v2 v2.7.0 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPrFY=
github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I=
@@ -284,6 +295,12 @@ github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWe
github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ=
github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0=
github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw=
github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0=
github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo=
github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8=
github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw=
github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo=
github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
@@ -376,6 +393,9 @@ github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH
github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q=
github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
@@ -418,8 +438,8 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO
github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
github.com/hashicorp/raft v1.1.0/go.mod h1:4Ak7FSPnuvmb0GV6vgIAJ4vYT4bek9bb6Q+7HVbyzqM=
github.com/hashicorp/raft v1.4.0 h1:tn28S/AWv0BtRQgwZv/1NELu8sCvI0FixqL8C8MYKeY=
github.com/hashicorp/raft v1.4.0/go.mod h1:nz64BIjXphDLATfKGG5RzHtNUPioLeKFsXEm88yTVew=
github.com/hashicorp/raft v1.5.0 h1:uNs9EfJ4FwiArZRxxfd/dQ5d33nV31/CdCHArH89hT8=
github.com/hashicorp/raft v1.5.0/go.mod h1:pKHB2mf/Y25u3AHNSXVRv+yT+WAnmeTX0BwVppVQV+M=
github.com/hashicorp/raft-boltdb v0.0.0-20220329195025-15018e9b97e0 h1:CO8dBMLH6dvE1jTn/30ZZw3iuPsNfajshWoJTnVc5cc=
github.com/hashicorp/raft-boltdb v0.0.0-20220329195025-15018e9b97e0/go.mod h1:nTakvJ4XYq45UXtn0DbwR4aU9ZdjlnIenpbs6Cd+FM0=
github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
@@ -432,6 +452,8 @@ github.com/iij/doapi v0.0.0-20190504054126-0bbf12d6d7df/go.mod h1:QMZY7/J/KSQEhK
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
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/jedib0t/go-pretty/v6 v6.4.6 h1:v6aG9h6Uby3IusSSEjHaZNXpHFhzqMmjXcPq1Rjl9Jw=
github.com/jedib0t/go-pretty/v6 v6.4.6/go.mod h1:Ndk3ase2CkQbXLLNf5QDHoYb6J9WtVfmHZu9n8rk2xs=
github.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc=
@@ -447,13 +469,14 @@ github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfC
github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
github.com/josharian/native v1.0.0 h1:Ts/E8zCSEsG17dUqv7joXJFybuMLjQfWE04tsBODTxk=
github.com/josharian/native v1.0.0/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w=
github.com/josharian/native v1.1.0 h1:uuaP0hAbW7Y4l0ZRQ6C9zfb7Mg1mbFKry/xzDAfmtLA=
github.com/josharian/native v1.1.0/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w=
github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
@@ -464,11 +487,12 @@ github.com/kataras/go-events v0.0.3 h1:o5YK53uURXtrlg7qE/vovxd/yKOJcLuFtPQbf1rYM
github.com/kataras/go-events v0.0.3/go.mod h1:bFBgtzwwzrag7kQmGuU1ZaVxhK2qseYPQomXoVEMsj4=
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
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.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.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
github.com/klauspost/compress v1.16.5 h1:IFV2oUNUzZaz+XyusxpLzpzS8Pt5rh0Z16For/djlyI=
github.com/klauspost/compress v1.16.5/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
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=
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
@@ -489,6 +513,8 @@ github.com/kyokomi/emoji/v2 v2.2.12 h1:sSVA5nH9ebR3Zji1o31wu3yOwD1zKXQA2z0zUyeit
github.com/kyokomi/emoji/v2 v2.2.12/go.mod h1:JUcn42DTdsXJo1SWanHh4HKDEyPaR5CqkmoirZZP9qE=
github.com/labbsr0x/bindman-dns-webhook v1.0.2/go.mod h1:p6b+VCXIR8NYKpDr8/dg1HKfQoRHCdcsROXKvmoehKA=
github.com/labbsr0x/goh v1.0.1/go.mod h1:8K2UhVoaWXcCU7Lxoa2omWnC8gyW8px7/lmO61c027w=
github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y=
github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
github.com/linode/linodego v0.21.0/go.mod h1:UTpq1JUZD0CZsJ8rt+0CRkqbzrp1MbGakVPt2DXY5Mk=
github.com/liquidweb/liquidweb-go v1.6.1/go.mod h1:UDcVnAMDkZxpw4Y7NOHkqoeiGacVLEIG/i5J9cyixzQ=
github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
@@ -526,8 +552,8 @@ github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOA
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.18 h1:DOKFKCQ7FNG2L1rbrmstDN4QVRdS89Nkh85u68Uwp98=
github.com/mattn/go-isatty v0.0.18/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
@@ -540,10 +566,10 @@ github.com/mattn/go-tty v0.0.0-20180219170247-931426f7535a/go.mod h1:XPvLUNfbS4f
github.com/mattn/go-tty v0.0.3 h1:5OfyWorkyO7xP52Mq7tB36ajHDG5OHrmBGIS/DtakQI=
github.com/mattn/go-tty v0.0.3/go.mod h1:ihxohKRERHTVzN+aSVRwACLCeqIoZAWpoICkkvrWyR0=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/mdlayher/netlink v1.7.1 h1:FdUaT/e33HjEXagwELR8R3/KL1Fq5x3G5jgHLp/BTmg=
github.com/mdlayher/netlink v1.7.1/go.mod h1:nKO5CSjE/DJjVhk/TNp6vCE1ktVxEA8VEh8drhZzxsQ=
github.com/mdlayher/socket v0.4.0 h1:280wsy40IC9M9q1uPGcLBwXpcTQDtoGwVt+BNoITxIw=
github.com/mdlayher/socket v0.4.0/go.mod h1:xxFqz5GRCUN3UEOm9CZqEJsAbe1C8OwSK46NlmWuVoc=
github.com/mdlayher/netlink v1.7.2 h1:/UtM3ofJap7Vl4QWCPDGXY8d3GIY2UGSDbK+QWmY8/g=
github.com/mdlayher/netlink v1.7.2/go.mod h1:xraEF7uJbxLhc5fpHL4cPe221LI2bdttWlU+ZGLfQSw=
github.com/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U=
github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA=
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI=
github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
@@ -553,8 +579,8 @@ github.com/michaelquigley/pfxlog v0.6.10 h1:IbC/H3MmSDcPlQHF1UZPQU13Dkrs0+ycWRyQ
github.com/michaelquigley/pfxlog v0.6.10/go.mod h1:gEiNTfKEX6cJHSwRpOuqBpc8oYrlhMiDK/xMk/gV7D0=
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
github.com/miekg/dns v1.1.53 h1:ZBkuHr5dxHtB1caEOlZTLPo7D3L3TWckgUUs/RHfDxw=
github.com/miekg/dns v1.1.53/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY=
github.com/miekg/dns v1.1.54 h1:5jon9mWcb0sFJGpnI99tOMhCPyJ+RPVz5b63MQG0VWI=
github.com/miekg/dns v1.1.54/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY=
github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU=
github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs=
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
@@ -573,9 +599,11 @@ github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR
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 h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
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=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/namedotcom/go v0.0.0-20180403034216-08470befbe04/go.mod h1:5sN+Lt1CaY4wsPvgQH/jsuJi4XO2ssZbdsIizr4CVC8=
@@ -584,8 +612,6 @@ github.com/natefinch/lumberjack v2.0.0+incompatible/go.mod h1:Wi9p2TTF5DG5oU+6Yf
github.com/natefinch/npipe v0.0.0-20160621034901-c1b8fa8bdcce h1:TqjP/BTDrwN7zP9xyXVuLsMBXYMt6LLYi55PlrIcq8U=
github.com/natefinch/npipe v0.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:ifHPsLndGGzvgzcaXUvzmt6LxKT4pJ+uzEhtnMt+f7A=
github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms=
github.com/netfoundry/secretstream v0.1.5 h1:iQ4brqUeZO7xNlSpwZDhekPW8d5LlRyHwvvevBOP1IM=
github.com/netfoundry/secretstream v0.1.5/go.mod h1:N6Mvl9Lk8xs84hFS9qZfjcJWiXmpzqaXW/L9W0JYfXY=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/nrdcg/auroradns v1.0.1/go.mod h1:y4pc0i9QXYlFCWrhWrUSIETnZgrf4KuwjDIWmmXo3JI=
github.com/nrdcg/desec v0.5.0/go.mod h1:2ejvMazkav1VdDbv2HeQO7w+Ta1CGHqzQr27ZBYTuEQ=
@@ -612,44 +638,42 @@ github.com/onsi/gomega v1.13.0 h1:7lLHu94wT9Ij0o6EWWclhu0aOh32VxhkwEJvzuWPeak=
github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs=
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
github.com/openziti/agent v1.0.10 h1:9oTmNXghlggD+O7BJdBp3PkD5kAZ1ssSC6IHZkMakzQ=
github.com/openziti/agent v1.0.10/go.mod h1:6APWgkPP6Uxf1/VyirdTVLAJxwam2vVyakrVw6yvs40=
github.com/openziti/channel/v2 v2.0.58 h1:j9baDM8nEAgHNhJ9n1h+WWbFSgCQCjvNB3KCr5x5q6c=
github.com/openziti/channel/v2 v2.0.58/go.mod h1:Wa3TS5o4pBFSGnDb9zRCGww29ZVXk0GnupwNpb/2DWE=
github.com/openziti/edge v0.24.239 h1:S7bAy/BfpGpKwXnfWuGgWpfjUEuJ5iwZojTxu9W8DO0=
github.com/openziti/edge v0.24.239/go.mod h1:G6PLbcyib36KH9hN6tMacr2UMin15EmZioSGPPptJ0U=
github.com/openziti/edge-api v0.25.11 h1:HHjDgoybPZGRZ+tM2udehI+U5Xv991iGED8E6CtDb9w=
github.com/openziti/edge-api v0.25.11/go.mod h1:PBFMYELgr7JUuaCqHobq1U+WESsutzgEDoELU/9qFOg=
github.com/openziti/agent v1.0.13 h1:RptJCEANPb904cDqlP7IYfBI+he8EyosimYhG7bp9D0=
github.com/openziti/agent v1.0.13/go.mod h1:CRbwhhnpsoDw0BxZsCRyQUozoRnGzH7+wuQVp1h4qX8=
github.com/openziti/channel/v2 v2.0.79 h1:pjbMmllLu1K3RzvX3K+FJK09bewrL5ZJGEL2cZiPmuM=
github.com/openziti/channel/v2 v2.0.79/go.mod h1:NOwAKC9nTZi41njN/4iRNWpGpt4psu5jjhv8bA9FbwE=
github.com/openziti/edge v0.24.313 h1:r8Foxel03S4c9mlkbS5cSS0DxSVjEzpLkkX1nkvI+4Q=
github.com/openziti/edge v0.24.313/go.mod h1:5gH8JPtRYO867mhEPwWBqNqYnZXFIGDvmymn180nhKM=
github.com/openziti/edge-api v0.25.24 h1:XrF3AtF9mnJXgG7rSV2M50Dj/EKUkBUaDdb9/n2TDHI=
github.com/openziti/edge-api v0.25.24/go.mod h1:rmEkj8jAkBTUhhgE/GFXije6bpFbd2P9TzdxTqZlXI8=
github.com/openziti/fablab v0.4.52 h1:X5+NaRnfPxbzhxUh9b4IQmVNVgYWFf8/Ck2sKNz77ho=
github.com/openziti/fablab v0.4.52/go.mod h1:aF8Fu3C8hnnaOJyAZz3AXGY4cMxQyBLhoIlSRJ/VVpc=
github.com/openziti/fabric v0.22.87 h1:Vc71NOFGLQapr8YZjx4p+f9+HHKm63o4kpt4LMjXTY4=
github.com/openziti/fabric v0.22.87/go.mod h1:w/cleYmpE/coUjjCzoRbpO648QWwSee0V4H8mfyqCdg=
github.com/openziti/foundation/v2 v2.0.24 h1:cNJCbh4o9E+7mtSUDo7ZBuMoPjJAilDWgr7X8ntRz/Q=
github.com/openziti/foundation/v2 v2.0.24/go.mod h1:H0w/ldKyE0ynwpIwt68k2rhMwt874IVxPQcimMuHJ3s=
github.com/openziti/identity v1.0.45 h1:e2kXoMCPcaUXy+k6GwasuKeGSJwavFEr+eOvUA228UY=
github.com/openziti/identity v1.0.45/go.mod h1:fQ5bjNu4L1Yqk011xNB1QXvsmBRHnm5d498fi1bhl24=
github.com/openziti/fabric v0.23.29 h1:FbAeUhfkNGYPNCYo3BFzRByvMTKhscxJEQxYU0BJJdA=
github.com/openziti/fabric v0.23.29/go.mod h1:/M8URo+qloi39qG0QWvXTgtpiPPneNYOjR+VvywS0cw=
github.com/openziti/foundation/v2 v2.0.25 h1:tGb9wdu6KCpO49RJ3HX2ClOVHf8gdntplIh/7CEVaM4=
github.com/openziti/foundation/v2 v2.0.25/go.mod h1:EOqea8Q1wXd4hS9MxFYM6ngDgenKGxz8c+CJ8Svr7BI=
github.com/openziti/identity v1.0.55 h1:WwZhFyIfor27MafmfSPr/xsQoSqT3KOnIeqy3FC+n4w=
github.com/openziti/identity v1.0.55/go.mod h1:ZaB62FkLGPglM7cR/o2jRIDF6Apa1swNLad9NQ2sa7Q=
github.com/openziti/jwks v1.0.3 h1:hf8wkb+Cg4nH/HM0KROFd7u+C3DkRVcFZJ7tDV+4icc=
github.com/openziti/jwks v1.0.3/go.mod h1:t4xxq8vlXGsPn29kiQVnZBBDDnEoOFqtJoHibkJunQQ=
github.com/openziti/metrics v1.2.19 h1:gQO3e2lUotRHBdGUXYBPWMIErIyyF5hw0EakwQbJzuM=
github.com/openziti/metrics v1.2.19/go.mod h1:ovvxTpDBxGLcVLHgPTFFvwT4ur8p4Z76BPUhIE5iwqc=
github.com/openziti/runzmd v1.0.20 h1:LzRPZRVO9AepAFzGTEsRGp2LRVtJp5vr+QOBl8KbN4w=
github.com/openziti/runzmd v1.0.20/go.mod h1:IXTk5dHAZxtqjg9WVHOiyXHqEHZdwaH5Wg80h5Ux3bQ=
github.com/openziti/sdk-golang v0.18.76 h1:D+UW1lpGHBBgfVrObpauq9RvJV/TFPdEEshfuPkiMcI=
github.com/openziti/sdk-golang v0.18.76/go.mod h1:kw/5rWDLwx52iwW/4a0VRQMUi7GPSI3aETx+G5TvdFQ=
github.com/openziti/storage v0.1.49 h1:luRsssYlGhpiJxjgc+FWF/yd2JLs9IKfeKID/5Hknrg=
github.com/openziti/storage v0.1.49/go.mod h1:Le2VFNL67YewLtaCnGNXPLH18Yrh/EMxeJ/eXxTOwak=
github.com/openziti/transport/v2 v2.0.72 h1:yjJtxy3Ckx5I4pDicmxILTdqQB6D18LSg2Zvsde0T00=
github.com/openziti/transport/v2 v2.0.72/go.mod h1:YuDvm+syZc9nfdhbdPZdtuL1Dfw+bELWhWVYAg73ups=
github.com/openziti/metrics v1.2.26 h1:8q93bK1MYAdR9ODr0qNAJ1/BQpFtHYdxZiH0Fc9LLo8=
github.com/openziti/metrics v1.2.26/go.mod h1:Z1c9pNHQr+yZODDsOeim93rYg5Hw1kPsuHi3zdy70dA=
github.com/openziti/runzmd v1.0.24 h1:jSwfqpA6SLCtpDUzdQl92gECc08itE8eFeHYdaJu4tY=
github.com/openziti/runzmd v1.0.24/go.mod h1:NX3EPWMDZPIPNUztDOkLrV6akqdC/P/X0UUeAL63V58=
github.com/openziti/sdk-golang v0.20.54 h1:c2PS+xOcCoDki5vAiCki4Zb0y6MddNZK2JuvmzL3Dbk=
github.com/openziti/sdk-golang v0.20.54/go.mod h1:xvjqDrrxy75g7y59MvKtzNbCzYbm1mpn3r91wsftmD4=
github.com/openziti/secretstream v0.1.8 h1:AgPHLDuXTiM1apHQmBvwvSW1vbQqAm7wUJDHqkQ/6Nk=
github.com/openziti/secretstream v0.1.8/go.mod h1:qcF8EmSX5SAT8k2pzsDI4bWugopv9AA+ltgWDrcAAEw=
github.com/openziti/storage v0.2.7 h1:rQVVclnkCZyr4XXKMypIJf46HFGJX5KEYWEycUhWvtg=
github.com/openziti/storage v0.2.7/go.mod h1:bGhUs/0XDsEJnTtNTpFAIh1X4lfdKvHu0m+8Z1TFVyM=
github.com/openziti/transport/v2 v2.0.89 h1:XVggCrKAxFkNwW9/GLBZeqCDRWB+3T2jejPcK25W3+Q=
github.com/openziti/transport/v2 v2.0.89/go.mod h1:6JnNL8jsVBBDgphHHquPEl5aUsim2HYYE0Li5fzZqEQ=
github.com/openziti/x509-claims v1.0.3 h1:HNdQ8Nf1agB3lBs1gahcO6zfkeS4S5xoQ2/PkY4HRX0=
github.com/openziti/x509-claims v1.0.3/go.mod h1:Z0WIpBm6c4ecrpRKrou6Gk2wrLWxJO/+tuUwKh8VewE=
github.com/openziti/xweb/v2 v2.0.2 h1:XYlVFriTq/U1wcUrc+XPnWJGhXh9NJPhtQ7+r3aC0cU=
github.com/openziti/xweb/v2 v2.0.2/go.mod h1:KQOOlnJk08EZT3TWkvDj/pbIUEVbgG0IrrNzl8gsi40=
github.com/openziti/ziti v0.27.9 h1:GsPqGFpHLLrvx4G+nXs7gKDyeSwl46D4GOLNFBmNI9c=
github.com/openziti/ziti v0.27.9/go.mod h1:tSF7cciowQXna3O++xyUSq2S7hPZwYnH+WUwSr2NNsA=
github.com/openziti/ziti-db-explorer v1.1.1 h1:G0eoTby+aIjjt5TxEfR+FMI2CWd4RvZFjzaIMX2lEBw=
github.com/openziti/ziti-db-explorer v1.1.1/go.mod h1:h76h7Tsb+khb0v+CqYKL6ifUfJbUMjGBFU2IvupfBE4=
github.com/openziti/zitilab v0.1.60 h1:uyg/1KXA5+dhg3ibgPqqvxrTRP5YvplTaSHj2w4/3oQ=
github.com/openziti/zitilab v0.1.60/go.mod h1:lNk7ss0dpBnowHdd0LX7S688a+DKFQigX0FVhbcm5LY=
github.com/oracle/oci-go-sdk v24.2.0+incompatible/go.mod h1:VQb79nF8Z2cwLkLS35ukwStZIg5F66tcBccjip/j888=
github.com/orcaman/concurrent-map/v2 v2.0.1 h1:jOJ5Pg2w1oeB6PeDurIYf6k9PQ+aTITr/6lP/L/zp6c=
github.com/orcaman/concurrent-map/v2 v2.0.1/go.mod h1:9Eq3TG2oBe5FirmYWQfYO5iH1q0Jv47PLaNK++uCdOM=
@@ -704,6 +728,8 @@ github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
github.com/rabbitmq/amqp091-go v1.8.1 h1:RejT1SBUim5doqcL6s7iN6SBmsQqyTgXb1xMlH0h1hA=
github.com/rabbitmq/amqp091-go v1.8.1/go.mod h1:+jPrT9iY2eLjRaMSRHUhc3z14E/l85kv/f+6luSD3pc=
github.com/rainycape/memcache v0.0.0-20150622160815-1031fa0ce2f2/go.mod h1:7tZKcyumwBO6qip7RNQ5r77yrssm9bfCowcLEBcU5IA=
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM=
@@ -727,13 +753,13 @@ github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb
github.com/sacloud/libsacloud v1.36.2/go.mod h1:P7YAOVmnIn3DKHqCZcUKYUXmSwGBm3yS7IBEjKVSrjg=
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
github.com/shirou/gopsutil/v3 v3.23.3 h1:Syt5vVZXUDXPEXpIBt5ziWsJ4LdSAAxF4l/xZeQgSEE=
github.com/shirou/gopsutil/v3 v3.23.3/go.mod h1:lSBNN6t3+D6W5e5nXTxc8KIMMVxAcS+6IJlffjRRlMU=
github.com/shoenig/go-m1cpu v0.1.4/go.mod h1:Wwvst4LR89UxjeFtLRMrpgRiyY4xPsejnVZym39dbAQ=
github.com/shoenig/go-m1cpu v0.1.5 h1:LF57Z/Fpb/WdGLjt2HZilNnmZOxg/q2bSKTQhgbrLrQ=
github.com/shirou/gopsutil/v3 v3.23.4 h1:hZwmDxZs7Ewt75DV81r4pFMqbq+di2cbt9FsQBqLD2o=
github.com/shirou/gopsutil/v3 v3.23.4/go.mod h1:ZcGxyfzAMRevhUR2+cfhXDH6gQdFYE/t8j1nsU4mPI8=
github.com/shoenig/go-m1cpu v0.1.5/go.mod h1:Wwvst4LR89UxjeFtLRMrpgRiyY4xPsejnVZym39dbAQ=
github.com/shoenig/test v0.6.3 h1:GVXWJFk9PiOjN0KoJ7VrJGH6uLPnqxR7/fe3HUPfE0c=
github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM=
github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ=
github.com/shoenig/test v0.6.3/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k=
github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU=
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
@@ -786,8 +812,8 @@ github.com/stretchr/testify v1.7.4/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY=
github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
github.com/teris-io/shortid v0.0.0-20201117134242-e59966efd125 h1:3SNcvBmEPE1YlB1JpVZouslJpI3GBNoiqW7+wb0Rz7w=
@@ -801,6 +827,10 @@ github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ
github.com/transip/gotransip/v6 v6.2.0/go.mod h1:pQZ36hWWRahCUXkFWlx9Hs711gLd8J4qdgLdRzmtY+g=
github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
github.com/uber-go/atomic v1.3.2/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g=
github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo=
github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs=
github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
@@ -825,8 +855,9 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg=
github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw=
github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ=
go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw=
go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
@@ -835,8 +866,8 @@ go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsX
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.10.0/go.mod h1:wsihk0Kdgv8Kqu1Anit4sfK+22vSFbUrAVEYRhCXrA8=
go.mongodb.org/mongo-driver v1.11.4 h1:4ayjakA013OdpGyL2K3ZqylTac/rMjrJOMZ1EHizXas=
go.mongodb.org/mongo-driver v1.11.4/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g=
go.mongodb.org/mongo-driver v1.11.6 h1:XM7G6PjiGAO5betLF13BIa5TlLUUE3uJ/2Ox3Lz1K+o=
go.mongodb.org/mongo-driver v1.11.6/go.mod h1:G9TgswdsWjX4tmDA5zfs2+6AEPpYJwqblyjsfuh8oXY=
go.mozilla.org/pkcs7 v0.0.0-20210826202110-33d05740a352 h1:CCriYyAfq1Br1aIYettdHZTy8mBTIPo7We18TuO/bak=
go.mozilla.org/pkcs7 v0.0.0-20210826202110-33d05740a352/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk=
go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
@@ -848,13 +879,17 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
go.opentelemetry.io/otel v1.14.0 h1:/79Huy8wbf5DnIPhemGB+zEPVwnN6fuQybr/SRXa6hM=
go.opentelemetry.io/otel v1.14.0/go.mod h1:o4buv+dJzx8rohcUeRmWUZhqupFvzWis188WlggnNeU=
go.opentelemetry.io/otel/sdk v1.11.1 h1:F7KmQgoHljhUuJyA+9BiU+EkJfyX5nVVF4wyzWZpKxs=
go.opentelemetry.io/otel/trace v1.14.0 h1:wp2Mmvj41tDsyAJXiWDWpfNsOiIyd38fy85pyKcFq/M=
go.opentelemetry.io/otel/trace v1.14.0/go.mod h1:8avnQLK+CG77yNLUae4ea2JDQ6iT+gozhnZjy/rw9G8=
go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s=
go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4=
go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo=
go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4=
go.opentelemetry.io/otel/sdk v1.14.0 h1:PDCppFRDq8A1jL9v6KMI6dYesaq+DFcDZvjsoGvxGzY=
go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs=
go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0=
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A=
go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4=
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
go.uber.org/ratelimit v0.0.0-20180316092928-c15da0234277/go.mod h1:2X8KaoNd1J0lZV+PxJk/5+DGbO/tpwLR1m++a7FnB/Y=
go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
@@ -889,8 +924,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
golang.org/x/exp v0.0.0-20230321023759-10a507213a29 h1:ooxPy7fPvB4kwsA2h+iBNHkAbp/4JxTSwCmvdjEYmug=
golang.org/x/exp v0.0.0-20230321023759-10a507213a29/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc=
golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 h1:k/i9J1pBpvlfR+9QsetwPyERsqu1GIbi967PQMq3Ivc=
golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
@@ -1089,6 +1124,7 @@ golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
@@ -1340,6 +1376,8 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g=
nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
rsc.io/goversion v1.2.0 h1:SPn+NLTiAG7w30IRK/DKp1BjvpWabYgxlLp/+kx5J8w=
rsc.io/goversion v1.2.0/go.mod h1:Eih9y/uIBS3ulggl7KNJ09xGSLcuNaLgmvvqa07sgfo=
@@ -8,9 +8,9 @@ import (
"github.com/openziti/fablab/kernel/lib/actions/host"
"github.com/openziti/fablab/kernel/lib/actions/semaphore"
"github.com/openziti/fablab/kernel/model"
zitilib_actions "github.com/openziti/zitilab/actions"
"github.com/openziti/zitilab/actions/edge"
"github.com/openziti/zitilab/models"
zitilib_actions "github.com/openziti/ziti/zititest/zitilab/actions"
"github.com/openziti/ziti/zititest/zitilab/actions/edge"
"github.com/openziti/ziti/zititest/zitilab/models"
)
type bootstrapAction struct{}
@@ -7,9 +7,9 @@ import (
"github.com/openziti/fablab/kernel/lib/actions/component"
"github.com/openziti/fablab/kernel/lib/actions/semaphore"
"github.com/openziti/fablab/kernel/model"
util_actions "github.com/openziti/ziti/network-tests/utils/actions"
zitilib_actions "github.com/openziti/zitilab/actions"
"github.com/openziti/zitilab/models"
util_actions "github.com/openziti/ziti/zititest/utils/actions"
zitilib_actions "github.com/openziti/ziti/zititest/zitilab/actions"
"github.com/openziti/ziti/zititest/zitilab/models"
)
func NewStartAction(metricbeat MetricbeatConfig, consul ConsulConfig) model.ActionBinder {
@@ -33,11 +33,11 @@ import (
"github.com/openziti/fablab/kernel/lib/runlevel/6_disposal/terraform"
"github.com/openziti/fablab/kernel/model"
"github.com/openziti/fablab/resources"
"github.com/openziti/ziti/network-tests/ha/actions"
"github.com/openziti/ziti/network-tests/test_resources"
"github.com/openziti/zitilab"
"github.com/openziti/zitilab/actions/edge"
zitilib_runlevel_1_configuration "github.com/openziti/zitilab/runlevel/1_configuration"
"github.com/openziti/ziti/zititest/models/ha/actions"
"github.com/openziti/ziti/zititest/models/test_resources"
"github.com/openziti/ziti/zititest/zitilab"
"github.com/openziti/ziti/zititest/zitilab/actions/edge"
zitilib_runlevel_1_configuration "github.com/openziti/ziti/zititest/zitilab/runlevel/1_configuration"
"github.com/sirupsen/logrus"
"os"
"time"
@@ -22,11 +22,11 @@ import (
"github.com/openziti/fablab/kernel/lib/runlevel/6_disposal/terraform"
"github.com/openziti/fablab/kernel/model"
"github.com/openziti/fablab/resources"
"github.com/openziti/ziti/network-tests/test_resources"
"github.com/openziti/zitilab"
"github.com/openziti/zitilab/actions/edge"
"github.com/openziti/zitilab/models"
zitilib_runlevel_1_configuration "github.com/openziti/zitilab/runlevel/1_configuration"
"github.com/openziti/ziti/zititest/models/test_resources"
"github.com/openziti/ziti/zititest/zitilab"
"github.com/openziti/ziti/zititest/zitilab/actions/edge"
"github.com/openziti/ziti/zititest/zitilab/models"
zitilib_runlevel_1_configuration "github.com/openziti/ziti/zititest/zitilab/runlevel/1_configuration"
"os"
"path"
"strings"
@@ -18,7 +18,7 @@ package main
import (
"github.com/openziti/fablab"
"github.com/openziti/ziti/network-tests/simple"
"github.com/openziti/ziti/zititest/models/simple"
)
func main() {
@@ -24,9 +24,9 @@ import (
"github.com/openziti/fablab/kernel/lib/actions/host"
"github.com/openziti/fablab/kernel/lib/actions/semaphore"
"github.com/openziti/fablab/kernel/model"
zitilib_actions "github.com/openziti/zitilab/actions"
"github.com/openziti/zitilab/actions/edge"
"github.com/openziti/zitilab/models"
zitilib_actions "github.com/openziti/ziti/zititest/zitilab/actions"
"github.com/openziti/ziti/zititest/zitilab/actions/edge"
"github.com/openziti/ziti/zititest/zitilab/models"
)
type bootstrapAction struct{}
@@ -61,11 +61,11 @@ func (a *bootstrapAction) bind(m *model.Model) model.Action {
workflow.AddAction(zitilib_actions.Edge("create", "service-edge-router-policy", "serp-all", "--service-roles", "#all", "--edge-router-roles", "#all"))
workflow.AddAction(zitilib_actions.Edge("create", "config", "files-host", "host.v2", `
workflow.AddAction(zitilib_actions.Edge("create", "config", "files-host", "host.v1", `
{
"terminators" : [
{ "address" : "ziti-smoketest-files.s3-us-west-1.amazonaws.com", "port" : 443, "protocol" : "tcp" }
]
"address" : "ziti-smoketest-files.s3-us-west-1.amazonaws.com",
"port" : 443,
"protocol" : "tcp"
}`))
workflow.AddAction(zitilib_actions.Edge("create", "config", "files-intercept-ert-unencrypted", "intercept.v1", `
@@ -96,14 +96,32 @@ func (a *bootstrapAction) bind(m *model.Model) model.Action {
"protocols": ["tcp"]
}`))
workflow.AddAction(zitilib_actions.Edge("create", "config", "files-intercept-ziti-tunnel-unencrypted", "intercept.v1", `
{
"addresses": ["ziti-files-ziti-tunnel-unencrypted.s3-us-west-1.amazonaws.ziti"],
"portRanges" : [ { "low": 443, "high": 443 } ],
"protocols": ["tcp"]
}`))
workflow.AddAction(zitilib_actions.Edge("create", "config", "files-intercept-ziti-tunnel", "intercept.v1", `
{
"addresses": ["ziti-files-ziti-tunnel.s3-us-west-1.amazonaws.ziti"],
"portRanges" : [ { "low": 443, "high": 443 } ],
"protocols": ["tcp"]
}`))
workflow.AddAction(zitilib_actions.Edge("create", "service", "ert-files-unencrypted", "-c", "files-host,files-intercept-ert-unencrypted", "-e", "OFF", "-a", "ert"))
workflow.AddAction(zitilib_actions.Edge("create", "service", "ert-files", "-c", "files-host,files-intercept-ert", "-a", "ert"))
workflow.AddAction(zitilib_actions.Edge("create", "service", "zet-files-unencrypted", "-c", "files-host,files-intercept-zet-unencrypted", "-e", "OFF", "-a", "zet"))
workflow.AddAction(zitilib_actions.Edge("create", "service", "zet-files", "-c", "files-host,files-intercept-zet", "-a", "zet"))
workflow.AddAction(zitilib_actions.Edge("create", "service", "ziti-tunnel-files-unencrypted", "-c", "files-host,files-intercept-ziti-tunnel-unencrypted", "-e", "OFF", "-a", "ziti-tunnel"))
workflow.AddAction(zitilib_actions.Edge("create", "service", "ziti-tunnel-files", "-c", "files-host,files-intercept-ziti-tunnel", "-a", "ziti-tunnel"))
workflow.AddAction(zitilib_actions.Edge("create", "service-policy", "ert-hosts", "Bind", "--service-roles", "#ert", "--identity-roles", "#ert-host"))
workflow.AddAction(zitilib_actions.Edge("create", "service-policy", "zet-hosts", "Bind", "--service-roles", "#zet", "--identity-roles", "#zet-host"))
workflow.AddAction(zitilib_actions.Edge("create", "service-policy", "ziti-tunnel-hosts", "Bind", "--service-roles", "#ziti-tunnel", "--identity-roles", "#ziti-tunnel-host"))
workflow.AddAction(zitilib_actions.Edge("create", "service-policy", "client-tunnelers", "Dial", "--service-roles", "#all", "--identity-roles", "#client"))
workflow.AddAction(zitilib_actions.Edge("create", "edge-router-policy", "client-routers", "--edge-router-roles", "#client", "--identity-roles", "#client"))
@@ -111,5 +129,16 @@ func (a *bootstrapAction) bind(m *model.Model) model.Action {
workflow.AddAction(component.Stop(models.ControllerTag))
workflow.AddAction(model.ActionFunc(func(m *model.Model) error {
cmds := []string{
"sudo sed -i 's/#DNS=/DNS=127.0.0.1/g' /etc/systemd/resolved.conf",
"sudo systemctl restart systemd-resolved",
}
return m.ForEachComponent(".ziti-tunnel", 2, func(c *model.Component) error {
return host.Exec(c.GetHost(), cmds...).Execute(c.GetModel())
})
}))
return workflow
}
@@ -25,9 +25,9 @@ import (
"github.com/openziti/fablab/kernel/lib/actions/component"
"github.com/openziti/fablab/kernel/lib/actions/semaphore"
"github.com/openziti/fablab/kernel/model"
util_actions "github.com/openziti/ziti/network-tests/utils/actions"
zitilib_actions "github.com/openziti/zitilab/actions"
"github.com/openziti/zitilab/models"
util_actions "github.com/openziti/ziti/zititest/utils/actions"
zitilib_actions "github.com/openziti/ziti/zititest/zitilab/actions"
"github.com/openziti/ziti/zititest/zitilab/models"
)
func NewStartAction(metricbeat MetricbeatConfig, consul ConsulConfig) model.ActionBinder {
@@ -32,12 +32,13 @@ import (
"github.com/openziti/fablab/kernel/lib/runlevel/6_disposal/terraform"
"github.com/openziti/fablab/kernel/model"
"github.com/openziti/fablab/resources"
actions2 "github.com/openziti/ziti/network-tests/simple/actions"
"github.com/openziti/ziti/network-tests/simple/stages/5_operation"
"github.com/openziti/ziti/network-tests/test_resources"
"github.com/openziti/zitilab"
"github.com/openziti/zitilab/actions/edge"
zitilib_runlevel_1_configuration "github.com/openziti/zitilab/runlevel/1_configuration"
actions2 "github.com/openziti/ziti/zititest/models/simple/actions"
"github.com/openziti/ziti/zititest/models/simple/stages/5_operation"
"github.com/openziti/ziti/zititest/models/test_resources"
"github.com/openziti/ziti/zititest/zitilab"
"github.com/openziti/ziti/zititest/zitilab/actions/edge"
zitilib_runlevel_1_configuration "github.com/openziti/ziti/zititest/zitilab/runlevel/1_configuration"
"github.com/openziti/ziti/zititest/zitilab/stageziti"
"github.com/sirupsen/logrus"
"os"
"time"
@@ -157,6 +158,21 @@ var Model = &model.Model{
},
},
},
"ziti-tunnel-client": {
Scope: model.Scope{Tags: model.Tags{"ziti-tunnel-client"}},
InstanceType: "t2.micro",
Components: model.Components{
"ziti-tunnel-client": {
Scope: model.Scope{Tags: model.Tags{"ziti-tunnel", "sdk-app", "client"}},
BinaryName: "ziti tunnel",
PublicIdentity: "ziti-tunnel-client",
RunWithSudo: true,
},
"consul": {
BinaryName: "consul",
},
},
},
},
},
"us-west-2": {
@@ -199,6 +215,20 @@ var Model = &model.Model{
},
},
},
"ziti-tunnel-host": {
InstanceType: "t2.micro",
Components: model.Components{
"ziti-tunnel-host": {
Scope: model.Scope{Tags: model.Tags{"ziti-tunnel", "sdk-app", "host", "ziti-tunnel-host"}},
BinaryName: "ziti tunnel",
PublicIdentity: "ziti-tunnel-host",
RunWithSudo: true,
},
"consul": {
BinaryName: "consul",
},
},
},
},
},
},
@@ -232,7 +262,7 @@ var Model = &model.Model{
),
config.Component(),
devkit.DevKitF(zitilab.ZitiRoot, []string{"ziti", "ziti-echo"}),
//stageziti.FetchZitiEdgeTunnel("v0.21.4"),
stageziti.FetchZitiEdgeTunnel("v0.21.4"),
},
Distribution: model.DistributionStages{
+41
View File
@@ -0,0 +1,41 @@
/*
Copyright 2020 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 main
import (
"github.com/openziti/fablab/kernel/model"
"github.com/openziti/ziti/zititest/models/smart/actions"
zitilab_actions "github.com/openziti/ziti/zititest/zitilab/actions"
"github.com/openziti/ziti/zititest/zitilab/console"
)
func newActionsFactory() model.Factory {
return &actionsFactory{}
}
func (_ *actionsFactory) Build(m *model.Model) error {
m.Actions = model.ActionBinders{
"bootstrap": actions.NewBootstrapAction(),
"start": actions.NewStartAction(),
"stop": actions.NewStopAction(),
"console": func(m *model.Model) model.Action { return console.Console() },
"logs": func(m *model.Model) model.Action { return zitilab_actions.Logs() },
}
return nil
}
type actionsFactory struct{}
@@ -0,0 +1,91 @@
/*
Copyright 2020 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 actions
import (
"fmt"
"github.com/openziti/fablab/kernel/lib/actions"
"github.com/openziti/fablab/kernel/lib/actions/component"
"github.com/openziti/fablab/kernel/lib/actions/host"
"github.com/openziti/fablab/kernel/lib/actions/semaphore"
"github.com/openziti/fablab/kernel/model"
zitilib_actions "github.com/openziti/ziti/zititest/zitilab/actions"
"github.com/openziti/ziti/zititest/zitilab/models"
"github.com/sirupsen/logrus"
"path/filepath"
"time"
)
func NewBootstrapAction() model.ActionBinder {
action := &bootstrapAction{}
return action.bind
}
func (self *bootstrapAction) bind(m *model.Model) model.Action {
workflow := actions.Workflow()
workflow.AddAction(component.Stop(models.ControllerTag))
workflow.AddAction(host.Exec(m.MustSelectHost(models.HasControllerComponent), "rm -f ~/ctrl.db"))
workflow.AddAction(component.Start(models.ControllerTag))
workflow.AddAction(semaphore.Sleep(2 * time.Second))
for _, router := range m.SelectComponents(models.RouterTag) {
cert := fmt.Sprintf("/intermediate/certs/%s-client.cert", router.PublicIdentity)
workflow.AddAction(zitilib_actions.Fabric("create", "router", filepath.Join(model.PkiBuild(), cert)))
}
serviceActions, err := self.createServiceActions(m)
if err != nil {
logrus.Fatalf("error creating service actions (%v)", err)
}
for _, serviceAction := range serviceActions {
workflow.AddAction(serviceAction)
}
sshUsername := m.MustStringVariable("credentials.ssh.username")
for _, h := range m.SelectHosts("*") {
workflow.AddAction(host.Exec(h, fmt.Sprintf("mkdir -p /home/%s/.ziti", sshUsername)))
workflow.AddAction(host.Exec(h, fmt.Sprintf("rm -f /home/%s/.ziti/identities.yml", sshUsername)))
workflow.AddAction(host.Exec(h, fmt.Sprintf("ln -s /home/%s/fablab/cfg/remote_identities.yml /home/%s/.ziti/identities.yml", sshUsername, sshUsername)))
}
workflow.AddAction(component.Stop(models.ControllerTag))
return workflow
}
func (_ *bootstrapAction) createServiceActions(m *model.Model) ([]model.Action, error) {
var serviceActions []model.Action
hosts, err := m.MustSelectHosts(models.LoopListenerTag, 1)
if err != nil {
return nil, err
}
router, err := m.SelectComponent(".router.terminator")
if err != nil {
return nil, err
}
for _, h := range hosts {
serviceActions = append(serviceActions, zitilib_actions.Fabric("create", "service", h.GetId()))
serviceActions = append(serviceActions, zitilib_actions.Fabric("create", "terminator", h.GetId(), router.PublicIdentity, "tcp:"+h.PrivateIp+":8171"))
}
return serviceActions, nil
}
type bootstrapAction struct{}
+42
View File
@@ -0,0 +1,42 @@
/*
Copyright 2020 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 actions
import (
"github.com/openziti/fablab/kernel/lib/actions"
"github.com/openziti/fablab/kernel/lib/actions/component"
"github.com/openziti/fablab/kernel/lib/actions/semaphore"
"github.com/openziti/fablab/kernel/model"
"github.com/openziti/ziti/zititest/zitilab/models"
"time"
)
func NewStartAction() model.ActionBinder {
action := startAction{}
return action.bind
}
func (self *startAction) bind(*model.Model) model.Action {
workflow := actions.Workflow()
workflow.AddAction(component.Start(models.ControllerTag))
workflow.AddAction(semaphore.Sleep(2 * time.Second))
workflow.AddAction(component.Start(models.RouterTag))
workflow.AddAction(semaphore.Sleep(2 * time.Second))
return workflow
}
type startAction struct{}
+41
View File
@@ -0,0 +1,41 @@
/*
Copyright 2020 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 actions
import (
"github.com/openziti/fablab/kernel/lib/actions"
"github.com/openziti/fablab/kernel/lib/actions/component"
"github.com/openziti/fablab/kernel/lib/actions/host"
"github.com/openziti/fablab/kernel/model"
"github.com/openziti/ziti/zititest/zitilab/models"
)
func NewStopAction() model.ActionBinder {
action := &stopAction{}
return action.bind
}
func (_ *stopAction) bind(m *model.Model) model.Action {
return actions.Workflow(
host.GroupKill(models.LoopDialerTag, "ziti-fabric-test"),
host.GroupKill(models.LoopListenerTag, "ziti-fabric-test"),
component.Stop(models.RouterTag),
component.Stop(models.ControllerTag),
)
}
type stopAction struct{}
@@ -0,0 +1,30 @@
# This is an example workloads definition for the loop2 tool.
#
workloads:
- name: chatter
concurrency: 10
dialer:
txRequests: 100
txPacing: 500
txMaxJitter: 500
rxTimeout: 15000
payloadMinBytes: 4096
payloadMaxBytes: 8192
listener:
txRequests: 100
txPacing: 500
txMaxJitter: 500
rxTimeout: 15000
payloadMinBytes: 4096
payloadMaxBytes: 8192
- name: big
concurrency: 1
dialer:
txRequests: 20
txPacing: 1000
txMaxJitter: 2500
payloadMinBytes: 51200000
payloadMaxBytes: 102400000
listener:
rxTimeout: 30000
@@ -0,0 +1,17 @@
workloads:
- name: chatter
concurrency: 4096
dialer:
txRequests: 2000000
txPacing: 30000
txMaxJitter: 10000
rxTimeout: 240000
payloadMinBytes: 64
payloadMaxBytes: 256
listener:
txRequests: 2000000
txPacing: 30000
txMaxJitter: 10000
rxTimeout: 240000
payloadMinBytes: 64
payloadMaxBytes: 256
+24
View File
@@ -0,0 +1,24 @@
v: 3
db: /home/{{ .Model.MustVariable "credentials.ssh.username" }}/ctrl.db
identity:
cert: /home/{{ .Model.MustVariable "credentials.ssh.username" }}/fablab/pki/intermediate/certs/{{ .Component.PublicIdentity }}-client.cert
server_cert: /home/{{ .Model.MustVariable "credentials.ssh.username" }}/fablab/pki/intermediate/certs/{{ .Component.PublicIdentity }}-server.cert
key: /home/{{ .Model.MustVariable "credentials.ssh.username" }}/fablab/pki/intermediate/keys/{{ .Component.PublicIdentity }}.key
ca: /home/{{ .Model.MustVariable "credentials.ssh.username" }}/fablab/pki/intermediate/certs/{{ .Component.PublicIdentity }}-server.chain.pem
# Disable smart routing for zitilib/characterization transit-less configuration
#
network:
cycleSeconds: 120
smart:
rerouteFraction: 0
rerouteCap: 0
# #
ctrl:
listener: tls:0.0.0.0:6262
mgmt:
listener: tls:0.0.0.0:10000
@@ -0,0 +1,30 @@
{{$ssh_username := .Model.MustVariable "credentials.ssh.username"}}
{{$identity := .Component.PublicIdentity}}
{{$protocol := .Model.MustVariable "zitilib.fabric.data_plane_protocol"}}
{{$ctrl_ip := publicIp "component.ctrl"}}
{{$router_ip := .Host.PublicIp}}
v: 3
forwarder:
latencyProbeInterval: 1000
identity:
cert: /home/{{$ssh_username}}/fablab/pki/intermediate/certs/{{$identity}}-client.cert
server_cert: /home/{{$ssh_username}}/fablab/pki/intermediate/certs/{{$identity}}-server.cert
key: /home/{{$ssh_username}}/fablab/pki/intermediate/keys/{{$identity}}.key
ca: /home/{{$ssh_username}}/fablab/pki/intermediate/certs/{{$identity}}-server.chain.pem
ctrl:
endpoint: tls:{{$ctrl_ip}}:6262
dialers:
- binding: transport
link:
listeners:
- binding: transport
bind: {{$protocol}}:0.0.0.0:6000
advertise: {{$protocol}}:{{$router_ip}}:6000
dialers:
- binding: transport
@@ -0,0 +1,42 @@
{{$ssh_username := .Model.MustVariable "credentials.ssh.username"}}
{{$identity := .Component.PublicIdentity}}
{{$protocol := .Model.MustVariable "zitilib.fabric.data_plane_protocol"}}
{{$ctrl_ip := publicIp "component.ctrl"}}
{{$router_ip := .Host.PublicIp}}
v: 3
forwarder:
latencyProbeInterval: 1000
identity:
cert: /home/{{$ssh_username}}/fablab/pki/intermediate/certs/{{$identity}}-client.cert
server_cert: /home/{{$ssh_username}}/fablab/pki/intermediate/certs/{{$identity}}-server.cert
key: /home/{{$ssh_username}}/fablab/pki/intermediate/keys/{{$identity}}.key
ca: /home/{{$ssh_username}}/fablab/pki/intermediate/certs/{{$identity}}-server.chain.pem
ctrl:
endpoint: tls:{{$ctrl_ip}}:6262
listeners:
- binding: proxy
address: tcp:0.0.0.0:7001
service: iperf
- binding: proxy_udp
address: udp:0.0.0.0:7001
service: iperf_udp
- binding: transport
address: tls:0.0.0.0:7002
dialers:
- binding: transport
link:
listeners:
- binding: transport
bind: {{$protocol}}:0.0.0.0:6000
advertise: {{$protocol}}:{{$router_ip}}:6000
dialers:
- binding: transport
@@ -0,0 +1,5 @@
default:
endpoint: tls:{{ publicIp "component.ctrl" }}:10000
cert: /home/ubuntu/fablab/pki/intermediate/certs/dotziti-client.cert
key: /home/ubuntu/fablab/pki/intermediate/keys/dotziti.key
caCert: /home/ubuntu/fablab/pki/intermediate/certs/dotziti-server.chain.pem
@@ -0,0 +1,27 @@
{{$ssh_username := .Model.MustVariable "credentials.ssh.username"}}
{{$identity := .Component.PublicIdentity}}
{{$protocol := .Model.MustVariable "zitilib.fabric.data_plane_protocol"}}
{{$ctrl_ip := publicIp "component.ctrl"}}
{{$router_ip := .Host.PublicIp}}
v: 3
forwarder:
latencyProbeInterval: 1000
identity:
cert: /home/{{$ssh_username}}/fablab/pki/intermediate/certs/{{$identity}}-client.cert
server_cert: /home/{{$ssh_username}}/fablab/pki/intermediate/certs/{{$identity}}-server.cert
key: /home/{{$ssh_username}}/fablab/pki/intermediate/keys/{{$identity}}.key
ca: /home/{{$ssh_username}}/fablab/pki/intermediate/certs/{{$identity}}-server.chain.pem
ctrl:
endpoint: tls:{{$ctrl_ip}}:6262
link:
listeners:
- binding: transport
bind: {{$protocol}}:0.0.0.0:6000
advertise: {{$protocol}}:{{$router_ip}}:6000
dialers:
- binding: transport
+63
View File
@@ -0,0 +1,63 @@
/*
Copyright 2020 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 main
import "github.com/openziti/fablab/kernel/model"
func newHostsFactory() model.Factory {
return &hostsFactory{}
}
func (_ *hostsFactory) Build(m *model.Model) error {
for _, host := range m.SelectHosts("*") {
if host.InstanceType == "" {
host.InstanceType = "t2.micro"
}
}
instanceType, found := m.GetStringVariable("instance_type")
if found {
for _, host := range m.SelectHosts("*") {
host.InstanceType = instanceType
}
}
instanceResourceType, found := m.GetStringVariable("instance_resource_type")
if found {
for _, host := range m.SelectHosts("*") {
host.InstanceResourceType = instanceResourceType
}
}
spotPrice, found := m.GetStringVariable("spot_price")
if found {
for _, host := range m.SelectHosts("*") {
host.SpotPrice = spotPrice
}
}
spotType, found := m.GetStringVariable("spot_type")
if found {
for _, host := range m.SelectHosts("*") {
host.SpotType = spotType
}
}
return nil
}
type hostsFactory struct{}
+184
View File
@@ -0,0 +1,184 @@
/*
Copyright 2019 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 main
import (
"embed"
"github.com/openziti/fablab"
"github.com/openziti/fablab/kernel/lib/binding"
"github.com/openziti/fablab/kernel/lib/runlevel/0_infrastructure/aws_ssh_key"
"github.com/openziti/fablab/kernel/model"
"github.com/openziti/fablab/resources"
"github.com/openziti/ziti/zititest/zitilab"
)
//go:embed config
var configs embed.FS
func init() {
model.AddBootstrapExtension(binding.AwsCredentialsLoader)
model.AddBootstrapExtension(aws_ssh_key.KeyManager)
}
var smartrouting = &model.Model{
Id: "smart-routing",
Resources: model.Resources{
resources.Configs: resources.SubFolder(configs, "config"),
resources.Terraform: resources.DefaultTerraformResources(),
},
Scope: model.Scope{
Defaults: model.Variables{
"zitilib.fabric.data_plane_protocol": "tls",
"credentials.ssh.username": "ubuntu",
"distribution": model.Variables{
"rsync_bin": "rsync",
"ssh_bin": "ssh",
},
"ziti_fabric_path": "ziti-fabric",
"instance_type": "t2.micro",
},
},
Factories: []model.Factory{
newHostsFactory(),
newActionsFactory(),
newStageFactory(),
},
Regions: model.Regions{
"initiator": {
Region: "us-east-1",
Site: "us-east-1a",
Hosts: model.Hosts{
"ctrl": {
Components: model.Components{
"ctrl": {
Scope: model.Scope{Tags: model.Tags{"ctrl"}},
BinaryName: "ziti-controller",
ConfigSrc: "ctrl.yml",
ConfigName: "ctrl.yml",
PublicIdentity: "ctrl",
},
},
},
"001": {
Scope: model.Scope{Tags: model.Tags{"iperf_server"}},
Components: model.Components{
"001": {
Scope: model.Scope{Tags: model.Tags{"initiator", "router"}},
BinaryName: "ziti-router",
ConfigSrc: "ingress_router.yml",
ConfigName: "001.yml",
PublicIdentity: "001",
},
},
},
"loop0": {
Scope: model.Scope{Tags: model.Tags{"loop-dialer"}},
},
"loop1": {
Scope: model.Scope{Tags: model.Tags{"loop-dialer"}},
},
"loop2": {
Scope: model.Scope{Tags: model.Tags{"loop-dialer"}},
},
"loop3": {
Scope: model.Scope{Tags: model.Tags{"loop-dialer"}},
},
},
},
"transitA": {
Region: "us-east-1",
Site: "us-east-1b",
Hosts: model.Hosts{
"002": {
Scope: model.Scope{Tags: model.Tags{"router"}},
Components: model.Components{
"002": {
BinaryName: "ziti-router",
ConfigSrc: "transit_router.yml",
ConfigName: "002.yml",
PublicIdentity: "002",
},
},
},
},
},
"transitB": {
Region: "us-east-1",
Site: "us-east-1c",
Hosts: model.Hosts{
"004": {
Components: model.Components{
"004": {
Scope: model.Scope{Tags: model.Tags{"router"}},
BinaryName: "ziti-router",
ConfigSrc: "transit_router.yml",
ConfigName: "004.yml",
PublicIdentity: "004",
},
},
},
},
},
"terminator": {
Region: "us-west-2",
Site: "us-west-2b",
Hosts: model.Hosts{
"003": {
Components: model.Components{
"003": {
Scope: model.Scope{Tags: model.Tags{"router", "terminator"}},
BinaryName: "ziti-router",
ConfigSrc: "egress_router.yml",
ConfigName: "003.yml",
PublicIdentity: "003",
},
},
},
"loop0": {
Scope: model.Scope{Tags: model.Tags{"loop-listener"}},
},
"loop1": {
Scope: model.Scope{Tags: model.Tags{"loop-listener"}},
},
"loop2": {
Scope: model.Scope{Tags: model.Tags{"loop-listener"}},
},
"loop3": {
Scope: model.Scope{Tags: model.Tags{"loop-listener"}},
},
},
},
},
}
func main() {
//smartrouting.VarConfig.EnableDebugLogger()
model.AddBootstrapExtension(
zitilab.BootstrapWithFallbacks(
&zitilab.BootstrapFromEnv{},
&zitilab.BootstrapFromFind{},
))
model.AddBootstrapExtension(binding.AwsCredentialsLoader)
model.AddBootstrapExtension(aws_ssh_key.KeyManager)
fablab.InitModel(smartrouting)
fablab.Run()
}
+160
View File
@@ -0,0 +1,160 @@
/*
Copyright 2019 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 main
import (
"fmt"
aws_ssh_keys0 "github.com/openziti/fablab/kernel/lib/runlevel/0_infrastructure/aws_ssh_key"
semaphore0 "github.com/openziti/fablab/kernel/lib/runlevel/0_infrastructure/semaphore"
terraform0 "github.com/openziti/fablab/kernel/lib/runlevel/0_infrastructure/terraform"
"github.com/openziti/fablab/kernel/lib/runlevel/1_configuration/config"
distribution "github.com/openziti/fablab/kernel/lib/runlevel/3_distribution"
"github.com/openziti/fablab/kernel/lib/runlevel/3_distribution/rsync"
fablib_5_operation "github.com/openziti/fablab/kernel/lib/runlevel/5_operation"
aws_ssh_keys6 "github.com/openziti/fablab/kernel/lib/runlevel/6_disposal/aws_ssh_key"
terraform6 "github.com/openziti/fablab/kernel/lib/runlevel/6_disposal/terraform"
"github.com/openziti/fablab/kernel/model"
"github.com/openziti/ziti/zititest/zitilab"
"github.com/openziti/ziti/zititest/zitilab/models"
zitilab_runlevel_1_configuration "github.com/openziti/ziti/zititest/zitilab/runlevel/1_configuration"
zitilab_5_operation "github.com/openziti/ziti/zititest/zitilab/runlevel/5_operation"
"time"
)
func newStageFactory() model.Factory {
return &stageFactory{}
}
// stageFactory is a model.Factory that is responsible for building and connecting the stages that
// represent the various phases of the model.
func (self *stageFactory) Build(m *model.Model) error {
// set up ssh keys (if configured), create the cloud infrastructure and restart all instances after they've been updated
m.Infrastructure = model.InfrastructureStages{
aws_ssh_keys0.Express(),
terraform0.Express(),
semaphore0.Restart(90 * time.Second),
}
// pull together the artifacts that will be distributed
// This includes
// 1. keys and certs
// 2. component configurations, which includes controller and router configurations
// 3. loop tester configurations
// 4. The actual binaries, including the controller, router, ziti-fabric CLI and the ziti-fabric-test tool
m.Configuration = model.ConfigurationStages{
zitilab_runlevel_1_configuration.IfNoPki(zitilab_runlevel_1_configuration.Fabric("smart.test")),
config.Component(),
config.Static([]config.StaticConfig{
{Src: "10-ambient.loop2.yml", Name: "10-ambient.loop2.yml"},
{Src: "4k-chatter.loop2.yml", Name: "4k-chatter.loop2.yml"},
{Src: "remote_identities.yml", Name: "remote_identities.yml"},
}),
zitilab.DefaultZitiBinaries(),
}
// Create log directories on hosts that need them
// Push the artifacts gather in the configuration stage up to the hosts
m.Distribution = model.DistributionStages{
distribution.Locations(models.HasControllerComponent, "logs"),
distribution.Locations(models.HasRouterComponent, "logs"),
distribution.Locations(models.LoopListenerTag, "logs"),
distribution.Locations(models.LoopDialerTag, "logs"),
rsync.Rsync(1),
}
// Run the bootstrap and start actions
// This will
// 1. reset the controller
// 2. enroll the routers
// 3. create the service and terminator
// 4. Create config files that the ziti-fabric-test loop tool can use to connect and send data
// 5. Ensure the controller and router are started
m.AddActivationActions("bootstrap", "start")
// In the operating phase, this model launches mesh structure polling, fabric metrics listening, and then creates the correct
// loop2 dialers and listeners that run against the model. When the dialers complete their operation, the joiner will
// join with them, invoking the closer and ending the mesh and metrics pollers. Finally, the instance state is
// persisted as a dump.
if err := self.addOperationStages(m); err != nil {
return err
}
// finally, dispose of the instances and remove any added keys
m.Disposal = model.DisposalStages{
terraform6.Dispose(),
aws_ssh_keys6.Dispose(),
}
return nil
}
func (self *stageFactory) addOperationStages(m *model.Model) error {
phase := fablib_5_operation.NewPhase()
m.AddOperatingStage(zitilab_5_operation.Mesh(phase.GetCloser()))
//m.AddOperatingStage(zitilab_5_operation.Metrics(phase.GetCloser()))
if err := self.addListenerStages(m); err != nil {
return fmt.Errorf("error creating listeners (%w)", err)
}
m.AddOperatingStage(fablib_5_operation.Timer(5*time.Second, nil))
if err := self.dialers(m, phase); err != nil {
return fmt.Errorf("error creating dialers (%w)", err)
}
m.AddOperatingStage(phase)
m.AddOperatingStage(fablib_5_operation.Persist())
return nil
}
func (_ *stageFactory) addListenerStages(m *model.Model) error {
hosts := m.SelectHosts(models.LoopListenerTag)
if len(hosts) < 1 {
return fmt.Errorf("no '%v' hosts in model", models.LoopListenerTag)
}
for _, host := range hosts {
m.AddOperatingStage(zitilab_5_operation.LoopListener(host, nil, "tcp:0.0.0.0:8171"))
}
return nil
}
func (_ *stageFactory) dialers(m *model.Model, phase fablib_5_operation.Phase) error {
initiator, err := m.SelectHost("component.initiator.router")
if err != nil {
return err
}
endpoint := fmt.Sprintf("tls:%s:7002", initiator.PublicIp)
hosts, err := m.MustSelectHosts(models.LoopDialerTag, 1)
if err != nil {
return err
}
for _, host := range hosts {
m.AddOperatingStage(zitilab_5_operation.LoopDialer(host, "10-ambient.loop2.yml", endpoint, phase.AddJoiner()))
}
return nil
}
type stageFactory struct{}
File diff suppressed because it is too large Load Diff
+101
View File
@@ -0,0 +1,101 @@
/*
Copyright 2020 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 main
import (
"github.com/openziti/fablab/kernel/lib/actions"
"github.com/openziti/fablab/kernel/lib/actions/component"
"github.com/openziti/fablab/kernel/lib/actions/host"
"github.com/openziti/fablab/kernel/lib/actions/semaphore"
"github.com/openziti/fablab/kernel/model"
zitilib_actions "github.com/openziti/ziti/zititest/zitilab/actions"
"github.com/openziti/ziti/zititest/zitilab/actions/edge"
"github.com/openziti/ziti/zititest/zitilab/models"
"time"
)
func NewBootstrapAction() model.ActionBinder {
action := &bootstrapAction{}
return action.bind
}
func (a *bootstrapAction) bind(m *model.Model) model.Action {
workflow := actions.Workflow()
workflow.AddAction(host.GroupExec("*", 25, "rm -f logs/*"))
workflow.AddAction(component.Stop("#ctrl"))
workflow.AddAction(edge.InitController("#ctrl"))
workflow.AddAction(component.Start("#ctrl"))
workflow.AddAction(semaphore.Sleep(2 * time.Second))
workflow.AddAction(edge.Login("#ctrl"))
workflow.AddAction(component.StopInParallel(models.EdgeRouterTag, 25))
workflow.AddAction(edge.InitEdgeRouters(models.EdgeRouterTag, 2))
workflow.AddAction(edge.InitIdentities(models.SdkAppTag, 2))
workflow.AddAction(zitilib_actions.Edge("create", "config", "test-host", "host.v2", `
{
"terminators" : [
{
"address" : "localhost",
"port" : 8171,
"protocol" : "tcp",
"portChecks" : [
{
"address" : "localhost:8172",
"interval" : "1s",
"timeout" : "100ms",
"actions" : [
{ "trigger" : "fail", "action" : "mark unhealthy" },
{ "trigger" : "pass", "action" : "mark healthy" }
]
}
]
}
]
}`))
workflow.AddAction(zitilib_actions.Edge("create", "config", "test-intercept", "intercept.v1", `
{
"addresses": ["test.service"],
"portRanges" : [
{ "low": 8171, "high": 8171 }
],
"protocols": ["tcp"]
}`))
workflow.AddAction(zitilib_actions.Edge("create", "service", "test", "--encryption", "on", "-c", "test-host,test-intercept"))
workflow.AddAction(zitilib_actions.Edge("create", "service", "metrics", "--encryption", "on"))
workflow.AddAction(zitilib_actions.Edge("create", "service-policy", "test-bind", "Bind", "--service-roles", "@test", "--identity-roles", "#terminator"))
workflow.AddAction(zitilib_actions.Edge("create", "service-policy", "test-dial", "Dial", "--service-roles", "@test", "--identity-roles", "#initiator,#client", "--semantic", "AnyOf"))
workflow.AddAction(zitilib_actions.Edge("create", "service-policy", "metrics-dial", "Dial", "--service-roles", "@metrics", "--identity-roles", "#client"))
workflow.AddAction(zitilib_actions.Edge("create", "service-policy", "metrics-bind", "Bind", "--service-roles", "@metrics", "--identity-roles", "#metrics-host"))
workflow.AddAction(zitilib_actions.Edge("create", "edge-router-policy", "metrics-routers", "--edge-router-roles", "@metrics-router", "--identity-roles", "#all"))
workflow.AddAction(zitilib_actions.Edge("create", "edge-router-policy", "test-routers", "--edge-router-roles", "@router-ap-0", "--identity-roles", "#client"))
workflow.AddAction(zitilib_actions.Edge("create", "service-edge-router-policy", "test", "--semantic", "AnyOf", "--service-roles", "@test", "--edge-router-roles", "#initiator,#terminator"))
workflow.AddAction(zitilib_actions.Edge("create", "service-edge-router-policy", "metrics", "--service-roles", "@metrics", "--edge-router-roles", "@metrics-router"))
workflow.AddAction(component.Stop(models.ControllerTag))
return workflow
}
type bootstrapAction struct{}
+41
View File
@@ -0,0 +1,41 @@
/*
Copyright 2020 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 main
import (
"github.com/openziti/fablab/kernel/lib/actions"
"github.com/openziti/fablab/kernel/lib/actions/component"
"github.com/openziti/fablab/kernel/lib/actions/semaphore"
"github.com/openziti/fablab/kernel/model"
"github.com/openziti/ziti/zititest/zitilab/models"
"time"
)
func NewStartAction() model.ActionBinder {
action := &startAction{}
return action.bind
}
func (a *startAction) bind(*model.Model) model.Action {
workflow := actions.Workflow()
workflow.AddAction(component.Start("#ctrl"))
workflow.AddAction(semaphore.Sleep(2 * time.Second))
workflow.AddAction(component.StartInParallel(models.EdgeRouterTag, 25))
return workflow
}
type startAction struct{}
@@ -0,0 +1,38 @@
/*
Copyright 2020 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 main
import (
"github.com/openziti/fablab/kernel/lib/actions"
"github.com/openziti/fablab/kernel/model"
"github.com/openziti/ziti/zititest/zitilab/actions/edge"
"github.com/openziti/ziti/zititest/zitilab/models"
)
func NewSyncModelEdgeStateAction() model.ActionBinder {
action := &syncModelEdgeStateAction{}
return action.bind
}
func (a *syncModelEdgeStateAction) bind(*model.Model) model.Action {
workflow := actions.Workflow()
workflow.AddAction(edge.Login("#ctrl"))
workflow.AddAction(edge.SyncModelEdgeState(models.EdgeRouterTag))
return workflow
}
type syncModelEdgeStateAction struct{}
+232
View File
@@ -0,0 +1,232 @@
v: 3
db: /home/{{ .Model.MustVariable "credentials.ssh.username" }}/fablab/ctrl.db
identity:
cert: /home/{{ .Model.MustVariable "credentials.ssh.username" }}/fablab/pki/intermediate/certs/{{ .Component.PublicIdentity }}-client.cert
server_cert: /home/{{ .Model.MustVariable "credentials.ssh.username" }}/fablab/pki/intermediate/certs/{{ .Component.PublicIdentity }}-server.cert
key: /home/{{ .Model.MustVariable "credentials.ssh.username" }}/fablab/pki/intermediate/keys/{{ .Component.PublicIdentity }}.key
ca: /home/{{ .Model.MustVariable "credentials.ssh.username" }}/fablab/pki/intermediate/certs/{{ .Component.PublicIdentity }}-server.chain.pem
#trace:
# path: ctrl.trace
profile:
# cpu:
# path: /home/plorenz/tmp/ctrl.cpu.pprof
# memory:
# path: ctrl.memprof
# the endpoint that routers will connect to the controller over.
ctrl:
listener: tls:0.0.0.0:6262
options:
# (optional) settings
# set the maximum number of connect requests that are buffered and waiting to be acknowledged (1 to 5000, default 1000)
#maxQueuedConnects: 50
# the maximum number of connects that have begun hello synchronization (1 to 1000, default 16)
#maxOutstandingConnects: 100
# the number of milliseconds to wait before a hello synchronization fails and closes the connection (30ms to 60000ms, default: 1000ms)
#connectTimeoutMs: 3000
# Sets the control channel write timeout. A write timeout will close the control channel, so the router will reconnect
#writeTimeout: 15s
# A listener address which will be sent to connecting routers in order to change their configured controller
# address. If defined, routers will update address configuration to immediately use the new address for future
# connections. The value of newListener must be resolvable both via DNS and validate via certificates
#newListener: tls:localhost:6262
# the endpoint that management tools connect to the controller over.
mgmt:
listener: tls:0.0.0.0:10000
#options:
# (optional) settings
# set the maximum number of connect requests that are buffered and waiting to be acknowledged (1 to 5000, default 1000)
#maxQueuedConnects: 50
# the maximum number of connects that have begun hello synchronization (1 to 1000, default 16)
#maxOutstandingConnects: 100
# the number of milliseconds to wait before a hello synchronization fails and closes the connection (30ms to 60000ms, default: 1000ms)
#connectTimeoutMs: 3000
#metrics:
#file:
#path: /tmp/ziti-controller-metrics.log
#maxsizemb: 100:wq
# Supported formats: json, plain
# Defaults to json
#format: plain
#influxdb:
#url: http://localhost:8086
#database: ziti
#events:
# jsonLogger:
# subscriptions:
# - type: fabric.routers
# - type: fabric.terminators
# - type: metrics
# sourceFilter: .*
# metricFilter: .*egress.*m1_rate*
# - type: fabric.circuits
# include:
# - created
# - type: edge.sessions
# include:
# - created
# - type: edge.apiSessions
# - type: fabric.usage
# - type: services
# - type: fabric.usage
# - type: edge.entityCounts
# interval: 5s
# handler:
# type: file
# format: json
# path: /tmp/ziti-events.log
# xctrl_example
#
#example:
# enabled: false
# delay: 5
healthChecks:
boltCheck:
# How often to try entering a bolt read tx. Defaults to 30 seconds
interval: 30s
# When to timeout the check. Defaults to 15 seconds
timeout: 15s
# How long to wait before starting the check. Defaults to 15 seconds
initialDelay: 15s
# By having an 'edge' section defined, the ziti-controller will attempt to parse the edge configuration. Removing this
# section, commenting out, or altering the name of the section will cause the edge to not run.
edge:
# This section represents the configuration of the Edge API that is served over HTTPS
api:
#(optional, default 90s) Alters how frequently heartbeat and last activity values are persisted
# activityUpdateInterval: 90s
#(optional, default 250) The number of API Sessions updated for last activity per transaction
# activityUpdateBatchSize: 250
# sessionTimeout - optional, default 10m
# The number of minutes before an Edge API session will timeout. Timeouts are reset by
# API requests and connections that are maintained to Edge Routers
sessionTimeout: 30m
# address - required
# The default address (host:port) to use for enrollment for the Client API. This value must match one of the addresses
# defined in a bind point's address field for the `edge-client` API in the web section.
address: {{.Host.PublicIp}}:1280
# enrollment - required
# A section containing settings pertaining to enrollment.
enrollment:
# signingCert - required
# A Ziti Identity configuration section that specifically makes use of the cert and key fields to define
# a signing certificate from the PKI that the Ziti environment is using to sign certificates. The signingCert.cert
# will be added to the /.well-known CA store that is used to bootstrap trust with the Ziti Controller.
signingCert:
cert: /home/{{ .Model.MustVariable "credentials.ssh.username" }}/fablab/pki/intermediate/certs/intermediate.cert
key: /home/{{ .Model.MustVariable "credentials.ssh.username" }}/fablab/pki/intermediate/keys/intermediate.key
# edgeIdentity - optional
# A section for identity enrollment specific settings
edgeIdentity:
# duration - optional, default 5m
# The length of time that a Ziti Edge Identity enrollment should remain valid. After
# this duration, the enrollment will expire and not longer be usable.
duration: 5m
# edgeRouter - Optional
# A section for edge router enrollment specific settings.
edgeRouter:
# duration - optional, default 5m
# The length of time that a Ziti Edge Router enrollment should remain valid. After
# this duration, the enrollment will expire and not longer be usable.
duration: 5m
# web - optional
# Defines webListeners that will be hosted by the controller. Each webListener can host many APIs and be bound to many
# bind points.
web:
# name - required
# Provides a name for this listener, used for logging output. Not required to be unique, but is highly suggested.
- name: all-apis-localhost
# bindPoints - required
# One or more bind points are required. A bind point specifies an interface (interface:port string) that defines
# where on the host machine the webListener will listen and the address (host:port) that should be used to
# publicly address the webListener(i.e. mydomain.com, localhost, 127.0.0.1). This public address may be used for
# incoming address resolution as well as used in responses in the API.
bindPoints:
#interface - required
# A host:port string on which network interface to listen on. 0.0.0.0 will listen on all interfaces
- interface: 0.0.0.0:1280
# address - required
# The public address that external incoming requests will be able to resolve. Used in request processing and
# response content that requires full host:port/path addresses.
address: {{.Host.PublicIp}}:1280
# newAddress - optional
# A host:port string which will be sent out as an HTTP header "ziti-new-address" if specified. If the header
# is present, clients should update location configuration to immediately use the new address for future
# connections. The value of newAddress must be resolvable both via DNS and validate via certificates
#newAddress: localhost:1280
# identity - optional
# Allows the webListener to have a specific identity instead of defaulting to the root `identity` section.
# identity:
# cert: ${ZITI_SOURCE}/ziti/etc/ca/intermediate/certs/ctrl-client.cert.pem
# server_cert: ${ZITI_SOURCE}/ziti/etc/ca/intermediate/certs/ctrl-server.cert.pem
# key: ${ZITI_SOURCE}/ziti/etc/ca/intermediate/private/ctrl.key.pem
# ca: ${ZITI_SOURCE}/ziti/etc/ca/intermediate/certs/ca-chain.cert.pem
# options - optional
# Allows the specification of webListener level options - mainly dealing with HTTP/TLS settings. These options are
# used for all http servers started by the current webListener.
options:
# idleTimeout - optional, default 5000ms
# The maximum amount of idle time in milliseconds allowed for pipelined HTTP requests. Setting this too high
# can cause resources on the host to be consumed as clients remain connected and idle. Lowering this value
# will cause clients to reconnect on subsequent HTTPs requests.
idleTimeout: 5000ms #http timeouts, new
# readTimeout - optional, default 5000ms
# The maximum amount of time in milliseconds http servers will wait to read the first incoming requests. A higher
# value risks consuming resources on the host with clients that are acting bad faith or suffering from high latency
# or packet loss. A lower value can risk losing connections to high latency/packet loss clients.
readTimeout: 5000ms
# writeTimeout - optional, default 10000ms
# The total maximum time in milliseconds that the http server will wait for a single requests to be received and
# responded too. A higher value can allow long running requests to consume resources on the host. A lower value
# can risk ending requests before the server has a chance to respond.
writeTimeout: 100000ms
# minTLSVersion - optional, default TSL1.2
# The minimum version of TSL to support
minTLSVersion: TLS1.2
# maxTLSVersion - optional, default TSL1.3
# The maximum version of TSL to support
maxTLSVersion: TLS1.3
# apis - required
# Allows one or more APIs to be bound to this webListener
apis:
# binding - required
# Specifies an API to bind to this webListener. Built-in APIs are
# - health-checks
# - edge-management
# - edge-client
# - fabric-management
- binding: health-checks
options: { }
- binding: fabric
- binding: edge-management
# options - variable optional/required
# This section is used to define values that are specified by the API they are associated with.
# These settings are per API. The example below is for the `edge-api` and contains both optional values and
# required values.
options: { }
- binding: edge-client
options: { }
+70
View File
@@ -0,0 +1,70 @@
{{$ssh_username := .Model.MustVariable "credentials.ssh.username"}}
{{$identity := .Component.PublicIdentity}}
{{$ctrl_ip := publicIp "component#ctrl"}}
{{$router_ip := .Host.PublicIp}}
v: 3
enableDebugOps: true
identity:
cert: /home/{{$ssh_username}}/fablab/pki/intermediate/certs/{{$identity}}-client.cert
server_cert: /home/{{$ssh_username}}/fablab/pki/intermediate/certs/{{$identity}}-server.cert
key: /home/{{$ssh_username}}/fablab/pki/intermediate/keys/{{$identity}}.key
ca: /home/{{$ssh_username}}/fablab/pki/intermediate/certs/{{$identity}}-server.chain.pem
ctrl:
endpoint: tls:{{$ctrl_ip}}:6262
healthChecks:
ctrlPingCheck:
# How often to ping the controller over the control channel. Defaults to 30 seconds
interval: 30s
# When to timeout the ping. Defaults to 15 seconds
timeout: 15s
# How long to wait before pinging the controller. Defaults to 15 seconds
initialDelay: 15s
metrics:
reportInterval: 15s
messageQueueSize: 10
link:
listeners:
- binding: transport
bind: tls:0.0.0.0:6000
advertise: tls:{{$router_ip}}:6000
dialers:
- binding: transport
listeners:
{{if .Component.HasTag "tunneler"}}
- binding: tunnel
options:
mode: tproxy
{{end}}
- binding: edge
address: tls:0.0.0.0:6262
options:
# (required) The public hostname and port combination that Ziti SDKs should connect on. Previously this was in the chanIngress section.
advertise: {{ .Host.PublicIp }}:6262
# By having an 'edge' section defined, the ziti-router will attempt to parse the edge configuration. Removing this
# section, commenting out, or altering the name of the section will cause the router to no longer operate as an Edge
# Router.
edge:
# (required) Information used to generate the initial registration CSR. For documentation on these fields please
# refer to the openssl documentation. These values MUST be supplied and have no defaults.
csr:
country: US
province: NC
locality: Charlotte
organization: NetFoundry
organizationalUnit: Ziti
# (required) SANs that this Gateways certs should contain. At least one IP or DNS SAN should be defined that matches
# the edge listeners "advertise" value from the "listeners" section.
sans:
ip:
- {{ .Host.PublicIp }}
@@ -0,0 +1,45 @@
workloads:
- name: chatter
# 100 * 20 = 2000 msgs/sec
# 2000 * 1k = 2MB/s
# 2MB/s * 3 hosts = 6 MB/s each directino
# 100 * 2 = 200 msgs/sec
# 200 * 10k = 2MB/s
# 2MB/s * 3 hosts = 6 MB/s each directino
concurrency: 5
# 5 client
# 50 msgs/sec * 10k = 0.5MB/s
# 0.5MB/s * 5 clients = 2.5 MB/s
# 52 * 2.5 = 130 MB/s
# 128 MB/s = 1 Gb/s
dialer:
txRequests: 10000000
txPacing: 0
txMaxJitter: 0
txPauseEvery: 0m
txPauseFor: 30s
rxTimeout: 240000
payloadMinBytes: 60000
payloadMaxBytes: 60000
latencyFrequency: 20
listener:
txRequests: 0
txPacing: 0
txMaxJitter: 0
rxPacing: 0ms
rxPauseEvery: 0s
rxPauseFor: 10s
rxTimeout: 240000
payloadMinBytes: 10240
payloadMaxBytes: 10240
latencyFrequency: 20
metrics:
service: metrics
interval: 15s
clientId: {{.Component.PublicIdentity}}
+211
View File
@@ -0,0 +1,211 @@
package main
import (
"embed"
_ "embed"
"github.com/openziti/fablab"
"github.com/openziti/fablab/kernel/lib/actions"
"github.com/openziti/fablab/kernel/lib/actions/component"
"github.com/openziti/fablab/kernel/lib/actions/host"
"github.com/openziti/fablab/kernel/lib/binding"
"github.com/openziti/fablab/kernel/lib/runlevel/0_infrastructure/aws_ssh_key"
"github.com/openziti/fablab/kernel/lib/runlevel/0_infrastructure/semaphore"
"github.com/openziti/fablab/kernel/lib/runlevel/0_infrastructure/terraform"
"github.com/openziti/fablab/kernel/lib/runlevel/1_configuration/config"
distribution "github.com/openziti/fablab/kernel/lib/runlevel/3_distribution"
"github.com/openziti/fablab/kernel/lib/runlevel/3_distribution/rsync"
aws_ssh_key2 "github.com/openziti/fablab/kernel/lib/runlevel/6_disposal/aws_ssh_key"
"github.com/openziti/fablab/kernel/lib/runlevel/6_disposal/terraform"
"github.com/openziti/fablab/kernel/model"
"github.com/openziti/fablab/resources"
"github.com/openziti/ziti/zititest/zitilab"
"github.com/openziti/ziti/zititest/zitilab/actions/edge"
zitilib_runlevel_1_configuration "github.com/openziti/ziti/zititest/zitilab/runlevel/1_configuration"
"os"
"time"
)
//go:embed configs
var configResource embed.FS
type scaleStrategy struct{}
func (self scaleStrategy) IsScaled(entity model.Entity) bool {
return entity.GetType() == model.EntityTypeHost && entity.GetScope().HasTag("scaled")
}
func (self scaleStrategy) GetEntityCount(entity model.Entity) uint32 {
if entity.GetType() == model.EntityTypeHost && entity.GetScope().HasTag("scaled") {
return 4
}
return 1
}
var m = &model.Model{
Id: "stall",
Scope: model.Scope{
Defaults: model.Variables{
"environment": "ziti-stall-test",
"credentials": model.Variables{
"ssh": model.Variables{
"username": "ubuntu",
},
"edge": model.Variables{
"username": "admin",
"password": "admin",
},
},
"metrics": model.Variables{
"influxdb": model.Variables{
"url": "http://localhost:8086",
"db": "ziti",
},
},
},
},
StructureFactories: []model.Factory{
model.NewScaleFactoryWithDefaultEntityFactory(scaleStrategy{}),
},
Factories: []model.Factory{
newStageFactory(),
},
Resources: model.Resources{
resources.Configs: resources.SubFolder(configResource, "configs"),
resources.Binaries: os.DirFS("/home/plorenz/go/bin"),
resources.Terraform: resources.DefaultTerraformResources(),
},
Regions: model.Regions{
"us-east-1": {
Region: "us-east-1",
Site: "us-east-1a",
Hosts: model.Hosts{
"ctrl": {
InstanceType: "c5.large",
Components: model.Components{
"ctrl": {
Scope: model.Scope{Tags: model.Tags{"ctrl"}},
BinaryName: "ziti-controller",
ConfigSrc: "ctrl.yml",
ConfigName: "ctrl.yml",
PublicIdentity: "ctrl",
},
},
},
"metrics-router": {
InstanceType: "c5.large",
Components: model.Components{
"metrics-router": {
Scope: model.Scope{Tags: model.Tags{"edge-router", "no-traversal"}},
BinaryName: "ziti-router",
ConfigSrc: "router.yml",
ConfigName: "metrics-router.yml",
PublicIdentity: "metrics-router",
},
},
},
},
},
"us-west-2": {
Region: "us-west-2",
Site: "us-west-2b",
Hosts: model.Hosts{
"router-west-{{ .ScaleIndex }}": {
Scope: model.Scope{Tags: model.Tags{"scaled"}},
InstanceType: "c5.large",
Components: model.Components{
"router-west-{{ .Host.ScaleIndex }}": {
Scope: model.Scope{Tags: model.Tags{"edge-router", "tunneler", "terminator"}},
BinaryName: "ziti-router",
ConfigSrc: "router.yml",
ConfigName: "router-west-{{ .Host.ScaleIndex }}.yml",
PublicIdentity: "router-west-{{ .Host.ScaleIndex }}",
RunWithSudo: true,
},
"loop-listener-{{ .Host.ScaleIndex }}": {
Scope: model.Scope{Tags: model.Tags{"sdk-app", "service"}},
BinaryName: "ziti-fabric-test",
PublicIdentity: "loop-listener-{{ .Host.ScaleIndex }}",
},
},
},
},
},
"ap-southeast-1": {
Region: "ap-southeast-1",
Site: "ap-southeast-1a",
Hosts: model.Hosts{
"router-ap-{{ .ScaleIndex }}": {
Scope: model.Scope{Tags: model.Tags{"scaled"}},
InstanceType: "c5.large",
Components: model.Components{
"router-ap-{{ .Host.ScaleIndex }}": {
Scope: model.Scope{Tags: model.Tags{"edge-router", "tunneler", "initiator"}},
BinaryName: "ziti-router",
ConfigSrc: "router.yml",
ConfigName: "router-ap-{{ .Host.ScaleIndex }}.yml",
PublicIdentity: "router-ap-{{ .Host.ScaleIndex }}",
RunWithSudo: true,
},
"loop-client-{{ .Host.ScaleIndex }}": {
Scope: model.Scope{Tags: model.Tags{"sdk-app", "client"}},
BinaryName: "ziti-fabric-test",
ConfigSrc: "test.loop3.yml",
ConfigName: "test.loop3.yml",
PublicIdentity: "loop-client-{{ .Host.ScaleIndex }}",
},
},
},
},
},
},
Actions: model.ActionBinders{
"bootstrap": NewBootstrapAction(),
"start": NewStartAction(),
"stop": model.Bind(component.StopInParallel("*", 15)),
"stopSdkApps": model.Bind(component.StopInParallel(".sdk-app", 15)),
"syncModelEdgeState": NewSyncModelEdgeStateAction(),
"clean": model.Bind(actions.Workflow(
component.StopInParallel("*", 15),
host.GroupExec("*", 25, "rm -f logs/*"),
)),
"login": model.Bind(edge.Login("#ctrl")),
},
Infrastructure: model.InfrastructureStages{
aws_ssh_key.Express(),
terraform_0.Express(),
semaphore_0.Restart(90 * time.Second),
},
Configuration: model.ConfigurationStages{
zitilib_runlevel_1_configuration.IfPkiNeedsRefresh(
zitilib_runlevel_1_configuration.Fabric("stall.test"),
),
config.Component(),
zitilab.DefaultZitiBinaries(),
},
Distribution: model.DistributionStages{
distribution.DistributeSshKey("*"),
distribution.Locations("*", "logs"),
rsync.RsyncStaged(),
},
Disposal: model.DisposalStages{
terraform.Dispose(),
aws_ssh_key2.Dispose(),
},
}
func main() {
m.AddActivationActions("stop", "bootstrap", "start", "syncModelEdgeState")
// m.VarConfig.EnableDebugLogger()
model.AddBootstrapExtension(&zitilab.BootstrapFromEnv{})
model.AddBootstrapExtension(binding.AwsCredentialsLoader)
model.AddBootstrapExtension(aws_ssh_key.KeyManager)
fablab.InitModel(m)
fablab.Run()
}
+101
View File
@@ -0,0 +1,101 @@
package main
import (
"fmt"
fablib_5_operation "github.com/openziti/fablab/kernel/lib/runlevel/5_operation"
"github.com/openziti/fablab/kernel/model"
"github.com/openziti/ziti/zititest/zitilab/models"
zitilib_5_operation "github.com/openziti/ziti/zititest/zitilab/runlevel/5_operation"
"strings"
"time"
)
func newStageFactory() model.Factory {
return &stageFactory{}
}
func (self *stageFactory) Build(m *model.Model) error {
// m.MetricsHandlers = append(m.MetricsHandlers, model.StdOutMetricsWriter{})
runPhase := fablib_5_operation.NewPhase()
//cleanupPhase := fablib_5_operation.NewPhase()
clientMetrics := zitilib_5_operation.NewClientMetricsWithIdMapper("metrics", runPhase.GetCloser(), func(s string) string {
return "component#" + s
})
m.AddActivationStage(clientMetrics)
m.AddOperatingActions("stopSdkApps", "syncModelEdgeState")
m.AddOperatingStage(fablib_5_operation.InfluxMetricsReporter())
//m.AddOperatingStage(zitilib_5_operation.Mesh(runPhase.GetCloser()))
m.AddOperatingStage(zitilib_5_operation.ModelMetricsWithIdMapper(runPhase.GetCloser(), func(id string) string {
if id == "ctrl" {
return "#ctrl"
}
id = strings.ReplaceAll(id, ".", ":")
return "component.edgeId:" + id
}))
m.AddOperatingStage(zitilib_5_operation.CircuitMetrics(5*time.Second, runPhase.GetCloser(), func(id string) string {
id = strings.ReplaceAll(id, ".", ":")
return "component.edgeId:" + id
}))
m.AddOperatingStage(clientMetrics)
//for _, host := range m.SelectHosts("*") {
// m.AddOperatingStage(fablib_5_operation.StreamSarMetrics(host, 5, 3, runPhase, cleanupPhase))
//}
if err := self.listeners(m); err != nil {
return fmt.Errorf("error creating listeners (%w)", err)
}
m.AddOperatingStage(fablib_5_operation.Timer(5*time.Second, nil))
if err := self.dialers(m, runPhase); err != nil {
return fmt.Errorf("error creating dialers (%w)", err)
}
m.AddOperatingStage(runPhase)
m.AddOperatingStage(fablib_5_operation.Persist())
return nil
}
func (_ *stageFactory) listeners(m *model.Model) error {
components := m.SelectComponents(models.ServiceTag)
if len(components) < 1 {
return fmt.Errorf("no '%v' components in model", "#loop.listener")
}
// only start 1 listener
c := components[0]
remoteConfigFile := fmt.Sprintf("/home/%v/fablab/cfg/%v.json", m.MustVariable("credentials.ssh.username"), c.PublicIdentity)
stage := zitilib_5_operation.Loop3Listener(c.GetHost(), nil, "tcp:0.0.0.0:8171",
"--config-file", remoteConfigFile, "--health-check-addr 127.0.0.1:8172")
m.AddOperatingStage(stage)
return nil
}
func (_ *stageFactory) dialers(m *model.Model, phase fablib_5_operation.Phase) error {
var components []*model.Component
components = m.SelectComponents(models.ClientTag)
if len(components) < 1 {
return fmt.Errorf("no '%v' components in model", models.ClientTag)
}
// only start 1 dialer
c := components[0]
remoteConfigFile := fmt.Sprintf("/home/%v/fablab/cfg/%v.json", m.MustVariable("credentials.ssh.username"), c.PublicIdentity)
stage := zitilib_5_operation.Loop3Dialer(c.GetHost(), c.ConfigName, "tcp:test.service:8171", phase.AddJoiner(), "--config-file", remoteConfigFile, "-d")
m.AddOperatingStage(stage)
return nil
}
type stageFactory struct{}
@@ -31,6 +31,12 @@ var hashes = map[string]string{
"20MB": "8f4e33f3dc3e414ff94e5fb6905cba8c",
}
var timeouts = map[string]time.Duration{
"1KB": 5 * time.Second,
"100KB": 5 * time.Second,
"20MB": 40 * time.Second,
}
type httpClient string
const (
@@ -39,20 +45,30 @@ const (
)
func TestCurlFiles(t *testing.T) {
for _, clientType := range []string{"ert"} { // add zet back
for _, hostType := range []string{"ert"} { // add zet back
for _, client := range []httpClient{ClientCurl, ClientWget} {
for _, encrypted := range []bool{true, false} {
for _, size := range []string{"1KB", "100KB", "20MB"} {
testFileDownload(t, clientType, client, hostType, encrypted, size, 20*time.Second)
for _, hostType := range []string{"ert", "zet", "ziti-tunnel"} {
for _, clientType := range []string{"ert", "zet", "ziti-tunnel"} {
for _, encrypted := range []bool{true, false} {
testFileDownload(t, clientType, ClientCurl, hostType, encrypted, "1KB")
}
}
}
for _, size := range []string{"100KB", "20MB"} {
for _, clientType := range []string{"ert", "zet"} {
for _, hostType := range []string{"ert", "zet"} {
for _, client := range []httpClient{ClientCurl, ClientWget} {
for _, encrypted := range []bool{true, false} {
testFileDownload(t, clientType, client, hostType, encrypted, size)
}
}
}
}
}
testFileDownload(t, "ziti-tunnel", ClientCurl, "ziti-tunnel", true, "20MB")
}
func testFileDownload(t *testing.T, hostSelector string, client httpClient, hostType string, encrypted bool, fileSize string, timeout time.Duration) {
func testFileDownload(t *testing.T, hostSelector string, client httpClient, hostType string, encrypted bool, fileSize string) {
encDesk := "encrypted"
if !encrypted {
encDesk = "unencrypted"
@@ -78,6 +94,7 @@ func testFileDownload(t *testing.T, hostSelector string, client httpClient, host
cmd = fmt.Sprintf(`set -o pipefail; wget --no-check-certificate --header "Host: ziti-smoketest-files.s3-us-west-1.amazonaws.com" -O - -t 5 -T 5 %s | md5sum`, url)
}
timeout := timeouts[fileSize]
o, err := lib.RemoteExecAllWithTimeout(sshConfigFactory, timeout, cmd)
req.NoError(err)
req.Equal(hashes[fileSize], o[0:32])
@@ -19,7 +19,7 @@ package tests
import (
"github.com/openziti/fablab"
"github.com/openziti/fablab/kernel/model"
"github.com/openziti/ziti/network-tests/simple"
"github.com/openziti/ziti/zititest/models/simple"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
)
@@ -3,7 +3,6 @@ package cmd
import (
"context"
"fmt"
"github.com/openziti/sdk-golang/ziti/config"
"io"
"log"
"net"
@@ -28,19 +27,11 @@ func init() {
}
func echoClient(cmd *cobra.Command, args []string) {
cfg, err := config.NewFromFile(identityFile)
zitiContext, err := ziti.NewContextFromFile(identityFile)
if err != nil {
log.Fatal(err)
}
zitiContext := ziti.NewContextWithConfig(cfg)
/*
zitiContext, err := ziti.NewContextFromFile(identityFile)
if err != nil {
log.Fatal(err)
}
*/
dial := func(_ context.Context, _, addr string) (net.Conn, error) {
service := strings.Split(addr, ":")[0]
return zitiContext.Dial(service)
@@ -1,7 +1,6 @@
package cmd
import (
"github.com/openziti/sdk-golang/ziti/config"
"log"
"net"
"net/http"
@@ -64,18 +63,10 @@ func (s *zitiEchoServer) ServeHTTP(rw http.ResponseWriter, r *http.Request) {
}
func (s *zitiEchoServer) run() (err error) {
config, err := config.NewFromFile(s.identityJson)
zitiContext, err := ziti.NewContextFromFile(s.identityJson)
if err != nil {
return err
}
zitiContext := ziti.NewContextWithConfig(config)
/*
zitiContext, err := ziti.NewContextFromFile(s.identityJson)
if err != nil {
return err
}
*/
if s.listener, err = zitiContext.Listen("echo"); err != nil {
return err
}
+9
View File
@@ -0,0 +1,9 @@
package main
import (
"github.com/openziti/ziti/zititest/utils/ziti-echo/cmd"
)
func main() {
cmd.Execute()
}
+41
View File
@@ -0,0 +1,41 @@
package zitilib_actions
import (
"fmt"
"github.com/openziti/fablab/kernel/lib"
"github.com/openziti/fablab/kernel/model"
"github.com/sirupsen/logrus"
)
type consulStart struct {
hostSpec string
consulServer string
configDir string
dataPath string
logFile string
}
func StartConsul(hostSpec, consulServer, configDir, dataPath, logFile string) model.Action {
return &consulStart{
hostSpec: hostSpec,
consulServer: consulServer,
configDir: configDir,
dataPath: dataPath,
logFile: logFile,
}
}
func (cs *consulStart) Execute(m *model.Model) error {
return m.ForEachHost(cs.hostSpec, 24, func(c *model.Host) error {
ssh := lib.NewSshConfigFactory(c)
cmd := fmt.Sprintf("screen -d -m nohup consul agent -join %s -config-dir %s -data-dir %s -log-file %s 2>&1 &", cs.consulServer, cs.configDir, cs.dataPath, cs.logFile)
if output, err := lib.RemoteExec(ssh, cmd); err != nil {
logrus.Errorf("error starting consul service [%s] (%v)", output, err)
return err
}
return nil
})
}
@@ -0,0 +1,77 @@
package edge
import (
"errors"
"fmt"
"github.com/openziti/fablab/kernel/lib"
"github.com/openziti/fablab/kernel/lib/actions/host"
"github.com/openziti/fablab/kernel/model"
)
func InitController(componentSpec string) model.Action {
return &edgeInit{
componentSpec: componentSpec,
}
}
func (init *edgeInit) Execute(m *model.Model) error {
username := m.MustStringVariable("credentials.edge.username")
password := m.MustStringVariable("credentials.edge.password")
if username == "" {
return errors.New("variable credentials/edge/username must be a string")
}
if password == "" {
return errors.New("variable credentials/edge/password must be a string")
}
for _, c := range m.SelectComponents(init.componentSpec) {
sshConfigFactory := lib.NewSshConfigFactory(c.GetHost())
tmpl := "rm -f /home/%v/fablab/ctrl.db && set -o pipefail; /home/%s/fablab/bin/%s --log-formatter pfxlog edge init /home/%s/fablab/cfg/%s -u %s -p %s 2>&1 | tee logs/%s.edge.init.log"
if err := host.Exec(c.GetHost(), fmt.Sprintf(tmpl, sshConfigFactory.User(), sshConfigFactory.User(), c.BinaryName, sshConfigFactory.User(), c.ConfigName, username, password, c.BinaryName)).Execute(m); err != nil {
return err
}
}
return nil
}
type edgeInit struct {
componentSpec string
}
func InitRaftController(componentSpec string) model.Action {
return &raftInit{
componentSpec: componentSpec,
}
}
func (init *raftInit) Execute(m *model.Model) error {
username := m.MustStringVariable("credentials.edge.username")
password := m.MustStringVariable("credentials.edge.password")
if username == "" {
return errors.New("variable credentials/edge/username must be a string")
}
if password == "" {
return errors.New("variable credentials/edge/password must be a string")
}
for _, c := range m.SelectComponents(init.componentSpec) {
sshConfigFactory := lib.NewSshConfigFactory(c.GetHost())
tmpl := "set -o pipefail; /home/%s/fablab/bin/ziti agent controller init %s %s default.admin 2>&1 | tee logs/controller.edge.init.log"
if err := host.Exec(c.GetHost(), fmt.Sprintf(tmpl, sshConfigFactory.User(), username, password)).Execute(m); err != nil {
return err
}
}
return nil
}
type raftInit struct {
componentSpec string
}
@@ -0,0 +1,38 @@
package edge
import (
"fmt"
"github.com/Jeffail/gabs"
"github.com/openziti/fablab/kernel/model"
"github.com/openziti/ziti/zititest/zitilab/cli"
"github.com/pkg/errors"
)
func GetEntityId(m *model.Model, entityType string, name string) (string, error) {
output, err := cli.Exec(m, "edge", "list", entityType, "--output-json",
fmt.Sprintf(`name="%v" limit none`, name))
if err != nil {
return "", err
}
l, err := gabs.ParseJSON([]byte(output))
if err != nil {
return "", err
}
data := l.Path("data")
if data == nil {
return "", nil
}
entities, err := data.Children()
if err != nil {
return "", err
}
for _, entity := range entities {
return entity.S("id").Data().(string), nil
}
return "", errors.Errorf("no entity of type %v found with name %v", entityType, name)
}
@@ -0,0 +1,57 @@
package edge
import (
"github.com/openziti/fablab/kernel/lib"
"github.com/openziti/fablab/kernel/model"
zitilib_actions "github.com/openziti/ziti/zititest/zitilab/actions"
"github.com/openziti/ziti/zititest/zitilab/cli"
"path/filepath"
"strings"
)
func InitIdentities(componentSpec string, concurrency int) model.Action {
return &initIdentitiesAction{
componentSpec: componentSpec,
concurrency: concurrency,
}
}
func (action *initIdentitiesAction) Execute(m *model.Model) error {
return m.ForEachComponent(action.componentSpec, action.concurrency, func(c *model.Component) error {
if err := zitilib_actions.EdgeExec(m, "delete", "identity", c.PublicIdentity); err != nil {
return err
}
return action.createAndEnrollIdentity(c)
})
}
func (action *initIdentitiesAction) createAndEnrollIdentity(c *model.Component) error {
ssh := lib.NewSshConfigFactory(c.GetHost())
jwtFileName := filepath.Join(model.ConfigBuild(), c.PublicIdentity+".jwt")
err := zitilib_actions.EdgeExec(c.GetModel(), "create", "identity", "service", c.PublicIdentity,
"--jwt-output-file", jwtFileName,
"-a", strings.Join(c.Tags, ","))
if err != nil {
return err
}
configFileName := filepath.Join(model.ConfigBuild(), c.PublicIdentity+".json")
_, err = cli.Exec(c.GetModel(), "edge", "enroll", "--jwt", jwtFileName, "--out", configFileName)
if err != nil {
return err
}
remoteConfigFile := "/home/ubuntu/fablab/cfg/" + c.PublicIdentity + ".json"
return lib.SendFile(ssh, configFileName, remoteConfigFile)
}
type initIdentitiesAction struct {
componentSpec string
concurrency int
}
@@ -0,0 +1,85 @@
package edge
import (
"fmt"
"github.com/michaelquigley/pfxlog"
"github.com/openziti/fablab/kernel/lib"
"github.com/openziti/fablab/kernel/lib/actions/host"
"github.com/openziti/fablab/kernel/model"
zitilib_actions "github.com/openziti/ziti/zititest/zitilab/actions"
"path/filepath"
"strings"
)
func InitEdgeRouters(componentSpec string, concurrency int) model.Action {
return &initEdgeRoutersAction{
componentSpec: componentSpec,
concurrency: concurrency,
}
}
func (action *initEdgeRoutersAction) Execute(m *model.Model) error {
return m.ForEachComponent(action.componentSpec, action.concurrency, func(c *model.Component) error {
if err := zitilib_actions.EdgeExec(m, "delete", "edge-router", c.PublicIdentity); err != nil {
pfxlog.Logger().
WithError(err).
WithField("router", c.PublicIdentity).
Warn("unable to delete router (may not be present")
}
return action.createAndEnrollRouter(c)
})
}
func (action *initEdgeRoutersAction) createAndEnrollRouter(c *model.Component) error {
ssh := lib.NewSshConfigFactory(c.GetHost())
jwtFileName := filepath.Join(model.ConfigBuild(), c.PublicIdentity+".jwt")
attributes := strings.Join(c.Tags, ",")
args := []string{"create", "edge-router", c.PublicIdentity, "-j", "--jwt-output-file", jwtFileName, "-a", attributes}
isTunneler := c.HasLocalOrAncestralTag("tunneler")
if isTunneler {
args = append(args, "--tunneler-enabled")
}
if c.HasLocalOrAncestralTag("no-traversal") {
args = append(args, "--no-traversal")
}
if err := zitilib_actions.EdgeExec(c.GetModel(), args...); err != nil {
return err
}
if isTunneler {
if err := zitilib_actions.EdgeExec(c.GetModel(), "update", "identity", c.PublicIdentity, "-a", attributes); err != nil {
return err
}
}
remoteJwt := "/home/ubuntu/fablab/cfg/" + c.PublicIdentity + ".jwt"
if err := lib.SendFile(ssh, jwtFileName, remoteJwt); err != nil {
return err
}
tmpl := "set -o pipefail; /home/ubuntu/fablab/bin/%s enroll /home/ubuntu/fablab/cfg/%s -j %s 2>&1 | tee /home/ubuntu/logs/%s.router.enroll.log "
cmds := []string{
"mkdir -p /home/ubuntu/logs",
fmt.Sprintf(tmpl, c.BinaryName, c.ConfigName, remoteJwt, c.ConfigName),
}
if isTunneler {
cmds = append(cmds,
"sudo sed -i 's/#DNS=/DNS=127.0.0.1/g' /etc/systemd/resolved.conf",
"sudo systemctl restart systemd-resolved")
}
return host.Exec(c.GetHost(), cmds...).Execute(c.GetModel())
}
type initEdgeRoutersAction struct {
componentSpec string
concurrency int
}
+51
View File
@@ -0,0 +1,51 @@
package edge
import (
"errors"
"github.com/openziti/fablab/kernel/model"
"github.com/openziti/ziti/ziti/cmd/common"
"github.com/openziti/ziti/zititest/zitilab/cli"
"path/filepath"
)
func Login(componentSelector string) model.Action {
return &login{
componentSelector: componentSelector,
}
}
func (l *login) Execute(m *model.Model) error {
ctrl, err := m.SelectComponent(l.componentSelector)
if err != nil {
return err
}
username := m.MustStringVariable("credentials.edge.username")
password := m.MustStringVariable("credentials.edge.password")
edgeApiBaseUrl := ctrl.Host.PublicIp + ":1280"
caChain := filepath.Join(model.PkiBuild(), ctrl.PublicIdentity, "certs", ctrl.PublicIdentity+".cert")
if username == "" {
return errors.New("variable credentials/edge/username must be a string")
}
if password == "" {
return errors.New("variable credentials/edge/password must be a string")
}
if _, err = cli.Exec(m, "edge", "login", edgeApiBaseUrl, "-i", model.ActiveInstanceId(), "--ca", caChain, "-u", username, "-p", password); err != nil {
return err
}
if _, err = cli.Exec(m, "edge", "use", model.ActiveInstanceId()); err != nil {
return err
}
common.CliIdentity = model.ActiveInstanceId()
return nil
}
type login struct {
componentSelector string
}
@@ -0,0 +1,36 @@
package edge
import (
"fmt"
"github.com/openziti/fablab/kernel/lib"
"github.com/openziti/fablab/kernel/lib/actions/host"
"github.com/openziti/fablab/kernel/model"
"github.com/pkg/errors"
)
func RaftJoin(componentSpec string) model.Action {
return &raftJoin{
componentSpec: componentSpec,
}
}
type raftJoin struct {
componentSpec string
}
func (self *raftJoin) Execute(m *model.Model) error {
ctrls := m.SelectComponents(self.componentSpec)
if len(ctrls) < 1 {
return errors.Errorf("no controllers found with spec '%v'", self.componentSpec)
}
primary := ctrls[0]
sshConfigFactory := lib.NewSshConfigFactory(primary.GetHost())
for _, c := range ctrls[1:] {
tmpl := "/home/%s/fablab/bin/ziti agent cluster add %v --id %v"
if err := host.Exec(primary.GetHost(), fmt.Sprintf(tmpl, sshConfigFactory.User(), "tls:"+c.Host.PublicIp+":6262", c.PublicIdentity)).Execute(m); err != nil {
return err
}
}
return nil
}
@@ -0,0 +1,59 @@
package edge
import (
"fmt"
"github.com/openziti/fablab/kernel/lib"
"github.com/openziti/fablab/kernel/lib/actions/host"
"github.com/openziti/fablab/kernel/model"
zitilib_actions "github.com/openziti/ziti/zititest/zitilab/actions"
"path/filepath"
)
func ReEnrollEdgeRouters(componentSpec string, concurrency int) model.Action {
return &reEnrollEdgeRoutersAction{
componentSpec: componentSpec,
concurrency: concurrency,
}
}
func (action *reEnrollEdgeRoutersAction) Execute(m *model.Model) error {
return m.ForEachComponent(action.componentSpec, action.concurrency, func(c *model.Component) error {
return action.reEnrollRouter(c)
})
}
func (action *reEnrollEdgeRoutersAction) reEnrollRouter(c *model.Component) error {
ssh := lib.NewSshConfigFactory(c.GetHost())
jwtFileName := filepath.Join(model.ConfigBuild(), c.PublicIdentity+".jwt")
args := []string{"re-enroll", "edge-router", c.PublicIdentity, "-j", "--jwt-output-file", jwtFileName}
if err := zitilib_actions.EdgeExec(c.GetModel(), args...); err != nil {
return err
}
remoteJwt := "/home/ubuntu/fablab/cfg/" + c.PublicIdentity + ".jwt"
if err := lib.SendFile(ssh, jwtFileName, remoteJwt); err != nil {
return err
}
tmpl := "set -o pipefail; /home/ubuntu/fablab/bin/%s enroll /home/ubuntu/fablab/cfg/%s -j %s 2>&1 | tee /home/ubuntu/logs/%s.router.enroll.log "
cmds := []string{
"mkdir -p /home/ubuntu/logs",
fmt.Sprintf(tmpl, c.BinaryName, c.ConfigName, remoteJwt, c.ConfigName),
}
if c.HasLocalOrAncestralTag("tunneler") {
cmds = append(cmds,
"sudo sed -i 's/#DNS=/DNS=127.0.0.1/g' /etc/systemd/resolved.conf",
"sudo systemctl restart systemd-resolved")
}
return host.Exec(c.GetHost(), cmds...).Execute(c.GetModel())
}
type reEnrollEdgeRoutersAction struct {
componentSpec string
concurrency int
}
@@ -0,0 +1,60 @@
package edge
import (
"github.com/Jeffail/gabs"
"github.com/openziti/fablab/kernel/model"
zitilib_actions "github.com/openziti/ziti/zititest/zitilab/actions"
"github.com/pkg/errors"
"strings"
)
func SyncModelEdgeState(componentSpec string) model.Action {
return &syncModelEdgeStateAction{
componentSpec: componentSpec,
}
}
func (action *syncModelEdgeStateAction) Execute(m *model.Model) error {
routerComponents := m.SelectComponents(action.componentSpec)
if len(routerComponents) == 0 {
return errors.Errorf("no router components found for selector '%v'", action.componentSpec)
}
output, err := zitilib_actions.EdgeExecWithOutput(m, "list", "edge-routers", "--output-json", "true limit none")
if err != nil {
return err
}
l, err := gabs.ParseJSON([]byte(output))
if err != nil {
return err
}
data := l.Path("data")
if data == nil {
return nil
}
routers, err := data.Children()
if err != nil {
return err
}
for _, router := range routers {
routerId := router.S("id").Data().(string)
routerName := router.S("name").Data().(string)
for _, c := range routerComponents {
if c.PublicIdentity == routerName {
routerId = strings.ReplaceAll(routerId, ".", ":")
c.Tags = append(c.Tags, "edgeId:"+routerId)
}
}
}
return nil
}
type syncModelEdgeStateAction struct {
componentSpec string
}
+45
View File
@@ -0,0 +1,45 @@
/*
Copyright 2019 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 zitilib_actions
import (
"github.com/openziti/fablab/kernel/model"
"github.com/openziti/ziti/zititest/zitilab/cli"
)
func Edge(args ...string) model.Action {
return &edge{
args: args,
}
}
func (a *edge) Execute(m *model.Model) error {
return EdgeExec(m, a.args...)
}
type edge struct {
args []string
}
func EdgeExec(m *model.Model, args ...string) error {
_, err := EdgeExecWithOutput(m, args...)
return err
}
func EdgeExecWithOutput(m *model.Model, args ...string) (string, error) {
return cli.Exec(m, append([]string{"edge", "-i", model.ActiveInstanceId()}, args...)...)
}
+37
View File
@@ -0,0 +1,37 @@
/*
Copyright 2019 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 zitilib_actions
import (
"github.com/openziti/fablab/kernel/model"
"github.com/openziti/ziti/zititest/zitilab/cli"
)
func Fabric(args ...string) model.Action {
return &fabric{
args: args,
}
}
func (a *fabric) Execute(m *model.Model) error {
_, err := cli.Exec(m, append([]string{"fabric", "-i", model.ActiveInstanceId()}, a.args...)...)
return err
}
type fabric struct {
args []string
}
+106
View File
@@ -0,0 +1,106 @@
/*
Copyright 2020 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 zitilib_actions
import (
"fmt"
"os"
"path/filepath"
"github.com/openziti/fablab/kernel/lib"
"github.com/openziti/fablab/kernel/model"
"github.com/openziti/foundation/v2/info"
"github.com/sirupsen/logrus"
)
func Logs() model.Action {
return &logs{}
}
func (self *logs) Execute(m *model.Model) error {
if !m.IsBound() {
return fmt.Errorf("model not bound")
}
snapshot := fmt.Sprintf("%d", info.NowInMilliseconds())
for rn, r := range m.Regions {
for hn, h := range r.Hosts {
ssh := lib.NewSshConfigFactory(h)
if err := self.forHost(snapshot, rn, hn, ssh); err != nil {
return fmt.Errorf("error retrieving logs for [%s/%s] (%w)", rn, hn, err)
}
}
}
return nil
}
func (self *logs) forHost(snapshot, rn, hn string, ssh lib.SshConfigFactory) error {
path := filepath.Join(model.AllocateForensicScenario(snapshot, "logs"), rn, hn)
if err := os.MkdirAll(path, os.ModePerm); err != nil {
return fmt.Errorf("error creating logs path [%s] for host [%s/%s] (%w)", path, rn, hn, err)
}
logrus.Infof("=> [%s]", path)
fis, err := lib.RemoteFileList(ssh, ".")
if err != nil {
return fmt.Errorf("error retrieving home directory for host [%s/%s] (%w)", rn, hn, err)
}
hasLogs := false
for _, fi := range fis {
if fi.Name() == "logs" && fi.IsDir() {
hasLogs = true
break
}
}
if hasLogs {
if err := self.forHostDir(path, "logs", ssh); err != nil {
return fmt.Errorf("error retrieving files from host [%s/%s] (%w)", rn, hn, err)
}
}
return nil
}
func (self *logs) forHostDir(localPath, remotePath string, ssh lib.SshConfigFactory) error {
fis, err := lib.RemoteFileList(ssh, remotePath)
if err != nil {
return err
}
var paths []string
for _, fi := range fis {
if fi.IsDir() {
nextLocalPath := filepath.Join(localPath, fi.Name())
if err := os.MkdirAll(nextLocalPath, os.ModePerm); err != nil {
return fmt.Errorf("error creating local path [%s] (%w)", nextLocalPath, err)
}
nextRemotePath := filepath.Join(remotePath, fi.Name())
if err := self.forHostDir(nextLocalPath, nextRemotePath, ssh); err != nil {
return fmt.Errorf("error recursing into tree (%w)", err)
}
} else {
paths = append(paths, filepath.Join(remotePath, fi.Name()))
}
}
if err := lib.RetrieveRemoteFiles(ssh, localPath, paths...); err != nil {
return fmt.Errorf("error retrieving from [%s] (%w)", localPath, err)
}
return nil
}
type logs struct{}
+39
View File
@@ -0,0 +1,39 @@
package zitilib_actions
import (
"fmt"
"github.com/openziti/fablab/kernel/lib"
"github.com/openziti/fablab/kernel/model"
"github.com/sirupsen/logrus"
)
type metricbeatStart struct {
hostSpec string
configPath string
dataPath string
logPath string
}
func StartMetricbeat(hostSpec, configPath, dataPath, logPath string) model.Action {
return &metricbeatStart{
hostSpec: hostSpec,
configPath: configPath,
dataPath: dataPath,
logPath: logPath,
}
}
func (mbs *metricbeatStart) Execute(m *model.Model) error {
return m.ForEachHost(mbs.hostSpec, 24, func(c *model.Host) error {
ssh := lib.NewSshConfigFactory(c)
cmd := fmt.Sprintf("screen -d -m nohup metricbeat --path.config %s --path.data %s --path.logs %s 2>&1 &", mbs.configPath, mbs.dataPath, mbs.logPath)
if output, err := lib.RemoteExec(ssh, cmd); err != nil {
logrus.Errorf("error starting metricbeat service [%s] (%v)", output, err)
return err
}
return nil
})
}
+131
View File
@@ -0,0 +1,131 @@
/*
Copyright 2019 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 zitilab
import (
"fmt"
"os"
"os/exec"
"path"
"github.com/openziti/fablab/kernel/model"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
)
type bootstrapWithFallbacks struct {
fns []model.BootstrapExtension
}
func BootstrapWithFallbacks(boostrapFns ...model.BootstrapExtension) *bootstrapWithFallbacks {
return &bootstrapWithFallbacks{
fns: boostrapFns,
}
}
func (bootstrap *bootstrapWithFallbacks) Bootstrap(m *model.Model) (retErr error) {
var err error
defer func() {
if retErr == nil && err != nil {
logrus.WithError(err).Info("Bootstrap succeeded, but had to use a fallback")
}
}()
for _, f := range bootstrap.fns {
e := f.Bootstrap(m)
if e == nil {
return nil
}
if err == nil {
err = e
continue
}
err = errors.Wrap(err, e.Error())
}
return err
}
type BootstrapFromEnv struct{}
func (bootstrap *BootstrapFromEnv) Bootstrap(m *model.Model) error {
logrus.Infof("Bootstraping from Env")
zitiRoot = os.Getenv("ZITI_ROOT")
if zitiRoot == "" {
if zitiPath, err := exec.LookPath("ziti"); err == nil {
zitiRoot = path.Dir(zitiPath)
} else {
return fmt.Errorf("ZITI_PATH not set and ziti executable not found in path. please set 'ZITI_ROOT'")
}
}
if fi, err := os.Stat(zitiRoot); err == nil {
if !fi.IsDir() {
return fmt.Errorf("invalid 'ZITI_ROOT' (!directory)")
}
} else {
return fmt.Errorf("non-existent 'ZITI_ROOT', given %s", zitiRoot)
}
logrus.Debugf("ZITI_ROOT = [%s]", zitiRoot)
return nil
}
type bootstrapFromDir struct {
sourcePath string
destPath string
}
func BootstrapFromDir(sourcePath, destPath string) *bootstrapFromDir {
return &bootstrapFromDir{
sourcePath: sourcePath,
destPath: destPath,
}
}
func (b *bootstrapFromDir) Bootstrap(m *model.Model) error {
logrus.Infof("Bootstraping from Dir")
zitiRoot = b.sourcePath
if _, err := os.Stat(zitiRoot); err != nil {
return fmt.Errorf("non-existent 'ZITI_ROOT', given %s", zitiRoot)
}
logrus.Debugf("ZITI_ROOT = [%s]", zitiRoot)
return nil
}
type BootstrapFromFind struct{}
func (bootstrap *BootstrapFromFind) Bootstrap(m *model.Model) error {
logrus.Infof("Bootstraping from Find")
if zitiPath, err := exec.LookPath("ziti"); err == nil {
zitiRoot = path.Dir(path.Dir(zitiPath))
} else {
return fmt.Errorf("ZITI_PATH not set and ziti executable not found in path. please set 'ZITI_ROOT'")
}
if fi, err := os.Stat(zitiRoot); err == nil {
if !fi.IsDir() {
return fmt.Errorf("invalid 'ZITI_ROOT' (!directory)")
}
} else {
return fmt.Errorf("non-existent 'ZITI_ROOT', given %s", zitiRoot)
}
logrus.Debugf("ZITI_ROOT = [%s]", zitiRoot)
return nil
}
+46
View File
@@ -0,0 +1,46 @@
/*
Copyright 2019 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 cli
import (
"bytes"
"errors"
"os"
"strings"
"github.com/openziti/fablab/kernel/model"
"github.com/openziti/ziti/ziti/cmd"
"github.com/sirupsen/logrus"
)
func Exec(m *model.Model, args ...string) (string, error) {
if !m.IsBound() {
return "", errors.New("model not bound")
}
var cliOut bytes.Buffer
var cliErr bytes.Buffer
ziticli := cmd.NewRootCommand(os.Stdin, &cliOut, &cliErr)
ziticli.SetArgs(args)
logrus.Infof("executing: %s", strings.Join(args, " "))
if err := ziticli.Execute(); err != nil {
logrus.Errorf("err executing command, err:[%e]", err)
}
return cliOut.String(), nil
}
+45
View File
@@ -0,0 +1,45 @@
/*
Copyright 2019 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 console
import (
"embed"
"github.com/openziti/fablab/kernel/model"
"io/fs"
"net/http"
)
//go:embed webroot
var webroot embed.FS
func Console() model.Action {
return &console{}
}
func (consoleAction *console) Execute(m *model.Model) error {
server := NewServer()
go server.Listen()
unprefixedWebroot, err := fs.Sub(webroot, "webroot")
if err != nil {
return err
}
http.Handle("/", http.FileServer(http.FS(unprefixedWebroot)))
return http.ListenAndServe(":8080", nil)
}
type console struct{}
+76
View File
@@ -0,0 +1,76 @@
/*
Copyright 2019 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 console
import (
"github.com/sirupsen/logrus"
"golang.org/x/net/websocket"
)
func NewClient(ws *websocket.Conn, server *Server) *Client {
nextId++
return &Client{
id: nextId,
ws: ws,
server: server,
ch: make(chan *Message, chBufSize),
doneCh: make(chan struct{}),
}
}
func (client *Client) Conn() *websocket.Conn {
return client.ws
}
func (client *Client) Write(msg *Message) {
select {
case client.ch <- msg:
default:
}
}
func (client *Client) Listen() {
client.listenWrite()
}
func (client *Client) listenWrite() {
for {
select {
case msg := <-client.ch:
if err := websocket.JSON.Send(client.ws, msg); err != nil {
logrus.Errorf("error sending to client [#%d] (%v)", client.id, err)
}
case <-client.doneCh:
client.server.Del(client)
close(client.doneCh)
return
}
}
}
type Client struct {
id int
ws *websocket.Conn
server *Server
ch chan *Message
doneCh chan struct{}
}
var nextId int = 0
const chBufSize = 100
+35
View File
@@ -0,0 +1,35 @@
/*
Copyright 2019 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 console
type Message struct {
Source string `json:"source"`
Routers []string `json:"routers"`
Links []*Link `json:"links"`
Metrics []*Metric `json:"metrics"`
}
type Link struct {
Id string `json:"id"`
Src string `json:"src"`
Dst string `json:"dst"`
}
type Metric struct {
Key string `json:"key"`
Value string `json:"value"`
}
+117
View File
@@ -0,0 +1,117 @@
/*
Copyright 2019 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 console
import (
"github.com/sirupsen/logrus"
"golang.org/x/net/websocket"
"net/http"
)
func NewServer() *Server {
return &Server{
clients: make(map[int]*Client),
addCh: make(chan *Client),
delCh: make(chan *Client),
sendAllCh: make(chan *Message),
doneCh: make(chan struct{}),
errCh: make(chan error),
routers: make(map[string]bool),
links: make(map[string]*Link),
}
}
func (server *Server) Add(c *Client) {
server.addCh <- c
}
func (server *Server) Del(c *Client) {
server.delCh <- c
}
func (server *Server) Done() {
close(server.doneCh)
}
func (server *Server) SendAll(msg *Message) {
server.sendAllCh <- msg
}
func (server *Server) sendAll(msg *Message) {
for _, c := range server.clients {
c.Write(msg)
}
}
func (server *Server) Listen() {
logrus.Infof("listening")
onConnected := func(ws *websocket.Conn) {
defer func() {
if err := ws.Close(); err != nil {
server.errCh <- err
}
}()
client := NewClient(ws, server)
server.Add(client)
client.Listen()
}
http.Handle("/metrics", websocket.Handler(onConnected))
for {
select {
case client := <-server.addCh:
server.clients[client.id] = client
server.sendNetwork(client)
case client := <-server.delCh:
delete(server.clients, client.id)
case msg := <-server.sendAllCh:
server.sendAll(msg)
case err := <-server.errCh:
logrus.Errorf("error (%v)", err)
case <-server.doneCh:
return
}
}
}
func (server *Server) sendNetwork(c *Client) {
msg := &Message{}
for id := range server.routers {
msg.Routers = append(msg.Routers, id)
}
for _, link := range server.links {
msg.Links = append(msg.Links, link)
}
c.Write(msg)
}
type Server struct {
clients map[int]*Client
addCh chan *Client
delCh chan *Client
sendAllCh chan *Message
doneCh chan struct{}
errCh chan error
routers map[string]bool
links map[string]*Link
}
@@ -0,0 +1,34 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<title>zitilib console</title>
<style>
.node {
fill: #ccc;
stroke: #fff;
stroke-width: 1px;
}
.node-label {
font: 12px sans-serif;
text-anchor: middle;
dominant-baseline: middle;
}
.link {
stroke: #777;
stroke-width: 2px;
}
</style>
</head>
<body>
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://d3js.org/d3.v4.min.js"></script>
<script src="https://d3js.org/d3-force.v2.min.js"></script>
<script src="https://d3js.org/d3-dispatch.v1.min.js"></script>
<script src="https://d3js.org/d3-quadtree.v1.min.js"></script>
<script src="https://d3js.org/d3-timer.v1.min.js"></script>
<script src="js/network.js"></script>
<script src="js/ws.js"></script>
</body>
</html>
@@ -0,0 +1,126 @@
let width = window.innerWidth,
height = window.innerHeight;
let network = {
"routers": [
],
"links": [
]
};
let svg = d3.select('body').append('svg')
.attr('width', width)
.attr('height', height);
let nodes = network.routers,
links = network.links;
let simulation = d3.forceSimulation(nodes)
.force('charge', d3.forceManyBody().strength(-2999))
.force('center', d3.forceCenter(width / 2, height / 2))
.force('link', d3.forceLink(links).distance(() => { return 360; }));
function processMessage(msg) {
let networkChanged = false;
let deleteList;
if(msg.routers != null) {
console.log("merging routers", msg.routers);
msg.routers.forEach(id => {
if(!network.routers.find(o => o.id === id)) {
network.routers.push({"id": id, "x": 0, "y": 0});
console.log("added router [" + id + "]");
}
});
deleteList = [];
network.routers.forEach(r => {
if(!msg.routers.find(o => o === r.id)) {
deleteList.push(r.id);
}
});
deleteList.forEach(id => {
let i = network.routers.findIndex(v => v.id === id);
if(i > -1) {
network.routers.splice(i, 1);
console.log("removed router [" + id + "]");
}
});
console.log("networks.routers", network.routers);
networkChanged = true;
}
if (msg.links != null) {
console.log("merging links", msg.links);
msg.links.forEach(l => {
if (!network.links.find(o => o.id === l.id)) {
src = network.routers.findIndex(r => r.id === l.src);
dst = network.routers.findIndex(r => r.id === l.dst);
if (src > -1 && dst > -1) {
network.links.push({"id": l.id, "source": src, "target": dst, "x": 0, "y": 0});
console.log("added link [" + l.id + "]");
}
}
});
deleteList = [];
network.links.forEach(l => {
if (!msg.links.find(o => o.id === l.id)) {
deleteList.push(l.id);
}
});
deleteList.forEach(id => {
let i = network.links.findIndex(v => v.id === id);
if (i > -1) {
network.links.splice(i, 1);
console.log("removed link [" + id + "]");
}
});
console.log("networks.links", network.links);
networkChanged = true;
}
if (msg.metrics != null) {
console.log("source", msg.source, "metrics", msg.metrics);
}
if(networkChanged) {
updateSimulation();
}
}
function updateSimulation() {
let linkElements = svg.selectAll('line').data(links, link => link.id);
linkElements.exit().remove();
let linkEnter = linkElements.enter().append('line').attr('class', 'link');
linkElements = linkElements.merge(linkEnter);
let nodeElements = svg.selectAll('circle').data(nodes);
nodeElements.exit().remove();
let nodeEnter = nodeElements.enter().append('circle').attr('r', 25).attr('class', 'node');
nodeElements = nodeElements.merge(nodeEnter);
nodeElements.raise();
let textElements = svg.selectAll('text').data(nodes);
textElements.exit().remove();
let textEnter = textElements.enter()
.append('text')
.text(node => node.id)
.attr('dx', 0)
.attr('dy', 0)
.attr('class', 'node-label');
textElements = textElements.merge(textEnter);
textElements.raise();
simulation.nodes(nodes).on('tick', () => {
nodeElements.attr('cx', node => node.x).attr('cy', node => node.y);
textElements.attr('x', node => node.x).attr('y', node => node.y);
linkElements
.attr('x1', link => link.source.x)
.attr('y1', link => link.source.y)
.attr('x2', link => link.target.x)
.attr('y2', link => link.target.y);
});
simulation.force('link').links(network.links);
simulation.alpha(1).restart();
}
updateSimulation();
+26
View File
@@ -0,0 +1,26 @@
var webSocket;
function openWebSocket() {
if (webSocket !== undefined && webSocket.readyState !== WebSocket.CLOSED) {
return;
}
webSocket = new WebSocket("ws://localhost:8080/metrics");
webSocket.onmessage = function (event) {
let msg = $.parseJSON(event.data);
processMessage(msg);
};
webSocket.onclose = function (event) {
console.log("connection closed");
};
}
$(window).on('beforeunload', function(){
webSocket.close();
console.log("closed websocket");
});
(function () {
openWebSocket();
})();
+22
View File
@@ -0,0 +1,22 @@
package models
const (
RemoteId = "#remote"
LocalId = "#local"
ServiceTag = ".service"
ClientTag = ".client"
ControllerTag = ".ctrl"
RouterTag = ".router"
EdgeRouterTag = ".edge-router"
SdkAppTag = ".sdk-app"
LoopListenerTag = ".loop-listener"
LoopDialerTag = ".loop-dialer"
TerminatorTag = ".terminator"
HasControllerComponent = "component.ctrl"
HasRouterComponent = "component.router"
)
+137
View File
@@ -0,0 +1,137 @@
package models
import (
"fmt"
"github.com/openziti/edge/controller/persistence"
"github.com/openziti/fablab/kernel/model"
"github.com/openziti/fabric/controller/db"
"github.com/openziti/fabric/controller/network"
"github.com/openziti/storage/boltz"
"github.com/pkg/errors"
"go.etcd.io/bbolt"
"strings"
)
type ZitiDbBuilderStrategy interface {
GetDbFile() string
GetSite(router *persistence.EdgeRouter) (string, bool)
PostProcess(router *persistence.EdgeRouter, c *model.Component)
}
type ZitiDbBuilder struct {
Strategy ZitiDbBuilderStrategy
}
type dbProvider struct {
zitiDb boltz.Db
stores *db.Stores
}
func (self *dbProvider) GetDb() boltz.Db {
return self.zitiDb
}
func (self *dbProvider) GetStores() *db.Stores {
return self.stores
}
func (self *dbProvider) GetManagers() *network.Managers {
panic("should not be needed")
}
func (self *ZitiDbBuilder) Build(m *model.Model) error {
dbFile := self.Strategy.GetDbFile()
zitiDb, err := db.Open(dbFile)
if err != nil {
return errors.Wrapf(err, "unable to open ziti bbolt db [%v]", dbFile)
}
defer func() {
if err = zitiDb.Close(); err != nil {
panic(err)
}
}()
fabricStore, err := db.InitStores(zitiDb)
if err != nil {
return errors.Wrapf(err, "unable to init fabric stores using db [%v]", dbFile)
}
provider := &dbProvider{
zitiDb: zitiDb,
stores: fabricStore,
}
edgeStores, err := persistence.NewBoltStores(provider)
if err != nil {
return errors.Wrapf(err, "unable to init edge stores using db [%v]", dbFile)
}
err = zitiDb.View(func(tx *bbolt.Tx) error {
ids, _, err := edgeStores.EdgeRouter.QueryIds(tx, "true limit none")
if err != nil {
return err
}
for _, id := range ids {
er, err := edgeStores.EdgeRouter.LoadOneById(tx, id)
if err != nil {
return err
}
if site, useEdgeRouter := self.Strategy.GetSite(er); useEdgeRouter {
regionId := site[:len(site)-1]
var region *model.Region
for _, r := range m.Regions {
if r.Site == site {
region = r
break
}
}
if region == nil {
if _, found := m.Regions[site]; found {
return errors.Errorf("trying to add region for site %v, but one exists, with different site", site)
}
region = &model.Region{
Scope: model.Scope{Tags: model.Tags{}},
Region: regionId,
Site: site,
Hosts: model.Hosts{},
}
m.Regions[site] = region
}
host := &model.Host{
Scope: model.Scope{Tags: model.Tags{}},
Region: region,
Components: model.Components{},
}
id := strings.ReplaceAll(er.Id, ".", "_")
region.Hosts["router_"+id] = host
component := &model.Component{
Scope: model.Scope{Tags: model.Tags{}},
ConfigSrc: "router.yml",
ConfigName: fmt.Sprintf("router-%v.yml", er.Id),
BinaryName: "ziti router",
Host: host,
}
host.Components[er.Id] = component
self.Strategy.PostProcess(er, component)
}
}
return nil
})
return err
}
func (self *ZitiDbBuilder) DefaultGetSite(er *persistence.EdgeRouter) (string, bool) {
if val, found := er.Tags["fablab.site"]; found {
return fmt.Sprintf("%v", val), true
}
return "", false
}
+38
View File
@@ -0,0 +1,38 @@
/*
Copyright 2019 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 zitilab
import (
"github.com/openziti/fablab/kernel/lib/runlevel/2_kitting/devkit"
"github.com/openziti/fablab/kernel/model"
)
func ZitiRoot() string {
return zitiRoot
}
func DefaultZitiBinaries() model.ConfigurationStage {
zitiBinaries := []string{
"ziti",
"ziti-controller",
"ziti-router",
}
return devkit.DevKitF(ZitiRoot, zitiBinaries)
}
var zitiRoot string
@@ -0,0 +1,41 @@
package zitilib_runlevel_0_infrastructure
import (
"fmt"
"github.com/openziti/fablab/kernel/lib"
"github.com/openziti/fablab/kernel/model"
"github.com/sirupsen/logrus"
)
type installConsul struct {
hostSpec string
}
func InstallConsul(hostSpec string) model.InfrastructureStage {
return &installConsul{
hostSpec: hostSpec,
}
}
func (imb *installConsul) Express(run model.Run) error {
return run.GetModel().ForEachHost(imb.hostSpec, 25, func(host *model.Host) error {
ssh := lib.NewSshConfigFactory(host)
if output, err := lib.RemoteExec(ssh, "curl --fail --silent --show-error --location https://apt.releases.hashicorp.com/gpg | gpg --dearmor | sudo dd of=/usr/share/keyrings/hashicorp-archive-keyring.gpg"); err != nil {
return fmt.Errorf("error getting hashicorp gpg key on host [%s] %s (%s)", host.PublicIp, output, err)
}
if output, err := lib.RemoteExec(ssh, "echo \"deb [arch=amd64 signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main\" | sudo tee -a /etc/apt/sources.list.d/hashicorp.list"); err != nil {
return fmt.Errorf("error adding hashicorp repo to apt on host [%s] %s (%s)", host.PublicIp, output, err)
}
cmd := "sudo apt-get update && sudo apt-get install consul -y"
if output, err := lib.RemoteExec(ssh, cmd); err != nil {
return fmt.Errorf("error installing Consul on host [%s] %s (%s)", host.PublicIp, output, err)
}
logrus.Infof("%s => %s", host.PublicIp, "installing Consul")
return nil
})
}
@@ -0,0 +1,50 @@
package zitilib_runlevel_0_infrastructure
import (
"fmt"
"github.com/openziti/fablab/kernel/lib"
"github.com/openziti/fablab/kernel/model"
"github.com/sirupsen/logrus"
)
const RECCOMENDED_METRICBEAT_VERSION = "8.3.2"
type installMetricbeat struct {
hostSpec string
version string
}
func InstallMetricbeat(hostSpec, version string) model.InfrastructureStage {
return &installMetricbeat{
hostSpec: hostSpec,
version: version,
}
}
func (imb *installMetricbeat) Express(run model.Run) error {
return run.GetModel().ForEachHost(imb.hostSpec, 25, func(host *model.Host) error {
ssh := lib.NewSshConfigFactory(host)
if output, err := lib.RemoteExec(ssh, "wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -"); err != nil {
return fmt.Errorf("error getting elastic gpg key on host [%s] %s (%s)", host.PublicIp, output, err)
}
if output, err := lib.RemoteExec(ssh, "echo \"deb https://artifacts.elastic.co/packages/8.x/apt stable main\" | sudo tee -a /etc/apt/sources.list.d/elastic-8.x.list"); err != nil {
return fmt.Errorf("error adding elastic repo to apt on host [%s] %s (%s)", host.PublicIp, output, err)
}
cmd := fmt.Sprintf("sudo apt-get update && sudo apt-get install metricbeat%s -y", func() string {
if imb.version != "" {
return fmt.Sprintf("=%s", imb.version)
}
return ""
}())
if output, err := lib.RemoteExec(ssh, cmd); err != nil {
return fmt.Errorf("error installing metricbeat on host [%s] %s (%s)", host.PublicIp, output, err)
}
logrus.Infof("%s => %s", host.PublicIp, "installing metricbeat")
return nil
})
}
@@ -0,0 +1,93 @@
/*
Copyright 2019 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 zitilib_runlevel_1_configuration
import (
"bytes"
"fmt"
"strings"
"github.com/openziti/fablab/kernel/model"
"github.com/openziti/ziti/ziti/cmd"
"github.com/sirupsen/logrus"
)
func generateCa(trustDomain string) error {
if caExists, err := hasExistingCA("root"); caExists || err != nil {
return err
}
var pkiOut bytes.Buffer
var pkiErr bytes.Buffer
ziticli := cmd.NewRootCommand(nil, &pkiOut, &pkiErr)
args := []string{"pki", "create", "ca", "--pki-root", model.PkiBuild(), "--ca-name", "root", "--ca-file", "root", "--trust-domain", trustDomain, "--"}
ziticli.SetArgs(args)
logrus.Infof("%v", args)
if err := ziticli.Execute(); err != nil {
logrus.Errorf("stdOut [%s], stdErr [%s]", strings.Trim(pkiOut.String(), " \t\r\n"), strings.Trim(pkiErr.String(), " \t\r\n"))
return fmt.Errorf("error generating key (%s)", err)
}
return nil
}
func generateSigningCert(name string) error {
logrus.Infof("generating signing certificate [%s]", name)
var pkiOut bytes.Buffer
var pkiErr bytes.Buffer
ziticli := cmd.NewRootCommand(nil, &pkiOut, &pkiErr)
args := []string{"pki", "create", "intermediate", "--pki-root", model.PkiBuild(), "--ca-name", "root",
"--intermediate-file", name, "--intermediate-name", name + " signing cert"}
ziticli.SetArgs(args)
logrus.Infof("%v", args)
if err := ziticli.Execute(); err != nil {
logrus.Errorf("stdOut [%s], stdErr [%s]", strings.Trim(pkiOut.String(), " \t\r\n"), strings.Trim(pkiErr.String(), " \t\r\n"))
return fmt.Errorf("error generating key (%s)", err)
}
return nil
}
func generateCert(name, ip, spiffeId string) error {
logrus.Infof("generating server certificate [%s:%s]", name, ip)
var pkiOut bytes.Buffer
var pkiErr bytes.Buffer
ziticli := cmd.NewRootCommand(nil, &pkiOut, &pkiErr)
args := []string{"pki", "create", "server",
"--server-name", name,
"--pki-root", model.PkiBuild(),
"--ca-name", name,
"--server-file", fmt.Sprintf("%s-server", name),
"--ip", ip}
if spiffeId != "" {
args = append(args, "--spiffe-id", spiffeId)
}
logrus.Infof("%v", args)
ziticli.SetArgs(args)
if err := ziticli.Execute(); err != nil {
logrus.Errorf("stdOut [%s], stdErr [%s]", strings.Trim(pkiOut.String(), " \t\r\n"), strings.Trim(pkiErr.String(), " \t\r\n"))
return fmt.Errorf("error generating server certificate (%s)", err)
}
return nil
}
@@ -0,0 +1,176 @@
/*
Copyright 2019 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 zitilib_runlevel_1_configuration
import (
"fmt"
"github.com/openziti/fablab/kernel/model"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
"gopkg.in/yaml.v3"
"os"
"path"
"strings"
)
func Fabric(trustDomain string, componentSpecs ...string) model.ConfigurationStage {
if len(componentSpecs) == 0 {
componentSpecs = []string{"*"}
}
return &fabric{
trustDomain: trustDomain,
componentSpecs: componentSpecs,
}
}
type fabric struct {
trustDomain string
componentSpecs []string
}
func (f *fabric) getSpiffeId(c *model.Component, id string) string {
for _, tag := range c.Tags {
if strings.HasPrefix(tag, "spiffe:") {
prefix := tag[len("spiffe:"):]
return prefix + "/" + id
}
}
return id
}
func (f *fabric) Configure(run model.Run) error {
m := run.GetModel()
if err := generateCa(f.trustDomain); err != nil {
return fmt.Errorf("error generating ca (%s)", err)
}
ips := map[string]string{}
processedComponents := map[*model.Component]struct{}{}
for _, spec := range f.componentSpecs {
for _, component := range m.SelectComponents(spec) {
if _, found := processedComponents[component]; found {
continue
}
processedComponents[component] = struct{}{}
if component.PublicIdentity != "" {
logrus.Infof("generating public ip identity [%s/%s] on [%s/%s]", component.Id, component.PublicIdentity, component.Region().Id, component.Host.Id)
if err := generateSigningCert(component.PublicIdentity); err != nil {
return errors.Wrapf(err, "error generating public identity [%s/%s]", component.Id, component.PublicIdentity)
}
if err := generateCert(component.PublicIdentity, component.Host.PublicIp, f.getSpiffeId(component, component.PublicIdentity)); err != nil {
return fmt.Errorf("error generating public identity [%s/%s]", component.Id, component.PublicIdentity)
}
ips[component.GetPathId()+".public"] = component.Host.PublicIp
}
if component.PrivateIdentity != "" {
logrus.Infof("generating private ip identity [%s/%s] on [%s/%s]", component.Id, component.PrivateIdentity, component.Region().Id, component.Host.Id)
if err := generateSigningCert(component.PrivateIdentity); err != nil {
return errors.Wrapf(err, "error generating private identity [%s/%s]", component.Id, component.PublicIdentity)
}
if err := generateCert(component.PrivateIdentity, component.Host.PrivateIp, f.getSpiffeId(component, component.PrivateIdentity)); err != nil {
return fmt.Errorf("error generating private identity [%s/%s]", component.Id, component.PrivateIdentity)
}
ips[component.GetPathId()+".private"] = component.Host.PrivateIp
}
}
}
return storeIps(ips)
}
func haveIpsChanged(m *model.Model) (bool, error) {
ipFile := path.Join(model.PkiBuild(), "ips")
ips := map[string]string{}
if _, err := os.Stat(ipFile); err == nil {
ipData, err := os.ReadFile(ipFile)
if err != nil {
return false, err
}
if err = yaml.Unmarshal(ipData, &ips); err != nil {
return false, err
}
}
for _, c := range m.SelectComponents("*") {
pubIdKey := c.GetPathId() + ".public"
if c.PublicIdentity != "" {
if ip, found := ips[pubIdKey]; found {
if ip == c.Host.PublicIp {
delete(ips, pubIdKey)
} else {
logrus.Infof("public ip for %v/%v has changed from %v -> %v. rebuilding pki", c.Id, c.PublicIdentity, c.Host.PublicIp, ip)
return true, nil
}
} else {
logrus.Infof("missing cert public identity of %v/%v. rebuilding pki", c.Id, c.PublicIdentity)
return true, nil
}
}
privIdKey := c.GetPathId() + ".private"
if c.PrivateIdentity != "" {
if ip, found := ips[privIdKey]; found {
if ip == c.Host.PrivateIp {
delete(ips, privIdKey)
} else {
logrus.Infof("private ip for %v/%v has changed from %v -> %v. rebuilding pki", c.Id, c.PrivateIdentity, c.Host.PrivateIp, ip)
return true, nil
}
} else {
logrus.Infof("missing cert for private identity of %v/%v. rebuilding pki", c.Id, c.PrivateIdentity)
}
}
}
return false, nil
}
func storeIps(ips map[string]string) error {
ipFile := path.Join(model.PkiBuild(), "ips")
data, err := yaml.Marshal(ips)
if err != nil {
return err
}
return os.WriteFile(ipFile, data, 0600)
}
func hasExisitingPki() (bool, error) {
if _, err := os.Stat(model.PkiBuild()); err != nil {
if os.IsNotExist(err) {
return false, nil
}
return true, err
}
return true, nil
}
func hasExistingCA(name string) (bool, error) {
if _, err := os.Stat(path.Join(model.PkiBuild(), name)); err != nil {
if os.IsNotExist(err) {
return false, nil
}
return true, err
}
return true, nil
}

Some files were not shown because too many files have changed in this diff Show More