diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index fbace0e06..672bb521a 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -5,6 +5,7 @@ on:
branches:
- main
- release-v*
+ - release-next
pull_request:
workflow_dispatch:
@@ -28,6 +29,8 @@ env:
jobs:
mac-os-build:
name: Build Mac OS binaries
+ # allow fors to opt-out of time-consuming macOS builds
+ if: vars.ZITI_SKIP_MACOS_BUILD != 'true'
runs-on: macos-11
steps:
- name: Git Checkout
@@ -41,7 +44,7 @@ jobs:
go-version: '1.20.x'
- name: Install Ziti CI
- uses: netfoundry/ziti-ci@v1
+ uses: openziti/ziti-ci@v1
- name: Build and Test
run: |
@@ -58,6 +61,8 @@ jobs:
windows-build:
name: Build Windows binaries
+ # allow fors to opt-out of time-consuming Windows builds
+ if: vars.ZITI_SKIP_WINDOWS_BUILD != 'true'
runs-on: windows-2019
steps:
- name: Git Checkout
@@ -71,7 +76,7 @@ jobs:
go-version: '1.20.x'
- name: Install Ziti CI
- uses: netfoundry/ziti-ci@v1
+ uses: openziti/ziti-ci@v1
- name: Build and Test
shell: bash
@@ -89,6 +94,7 @@ jobs:
fablab-smoketest:
name: Fablab Smoketest
+ # not applicable to forks
if: github.repository_owner == 'openziti'
runs-on: ubuntu-20.04
steps:
@@ -103,7 +109,7 @@ jobs:
go-version: '1.20.x'
- name: Install Ziti CI
- uses: netfoundry/ziti-ci@v1
+ uses: openziti/ziti-ci@v1
- name: Build and Test
env:
@@ -111,12 +117,10 @@ jobs:
ziti_ci_gpg_key: ${{ secrets.ZITI_CI_GPG_KEY }}
ziti_ci_gpg_key_id: ${{ secrets.ZITI_CI_GPG_KEY_ID }}
run: |
- mkdir -p dist/bin
$(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 network-tests && go build -o ../dist/bin/ ./utils/... && popd
- go build -tags=all,tests -o dist/bin/ ./...
+ go install -tags=all,tests ./...
- name: Create Zitilab Bindings
run: |
@@ -134,19 +138,22 @@ jobs:
echo "ziti_version: $($(go env GOPATH)/bin/ziti-ci -q get-current-version)" >> ~/.fablab/bindings.yml
cat ~/.fablab/bindings.yml
- - name: Test Ziti Command
- env:
- ZITI_ROOT: dist/bin/
+ - name: Create Test Environment
run: |
+ echo "ZITI_ROOT=$(go env GOPATH)/bin" >> "$GITHUB_ENV"
$(go env GOPATH)/bin/simple-transfer create
$(go env GOPATH)/bin/simple-transfer up
+
+ - name: Test Ziti Command
+ 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
- name: Test Ziti Command Teardown
if: always()
- env:
- ZITI_ROOT: dist/bin/
run: |
+ echo "ZITI_ROOT=$(go env GOPATH)/bin" >> "$GITHUB_ENV"
$(go env GOPATH)/bin/simple-transfer dispose
$(go env GOPATH)/bin/simple-transfer clean
@@ -154,6 +161,13 @@ jobs:
publish:
name: Publish Binaries
+ # - always() allows evaluating further conditional expressions even if
+ # needed jobs were skipped
+ if: |
+ always()
+ && (needs.mac-os-build.result == 'success' || needs.mac-os-build.result == 'skipped')
+ && (needs.windows-build.result == 'success' || needs.windows-build.result == 'skipped')
+ && (needs.fablab-smoketest.result == 'success' || needs.fablab-smoketest.result == 'skipped')
runs-on: ubuntu-20.04
needs: [ mac-os-build, windows-build, fablab-smoketest ]
outputs:
@@ -175,7 +189,7 @@ jobs:
python-version: '3.7'
- name: Install Ziti CI
- uses: netfoundry/ziti-ci@v1
+ uses: openziti/ziti-ci@v1
- name: Build and Test
env:
@@ -201,19 +215,21 @@ jobs:
retention-days: 5
- name: Download darwin release artifact
+ if: needs.mac-os-build.result == 'success'
uses: actions/download-artifact@v3
with:
name: darwin-release-${{ github.run_id }}
path: release/
- name: Download windows release artifact
+ if: needs.windows-build.result == 'success'
uses: actions/download-artifact@v3
with:
name: windows-release-${{ github.run_id }}
path: release/
- name: Install Jfrog CLI
- uses: jfrog/setup-jfrog-cli@v2
+ uses: jfrog/setup-jfrog-cli@v3
with:
version: 1.51.1
@@ -276,9 +292,28 @@ jobs:
with:
ziti-version: ${{ needs.publish.outputs.ZITI_VERSION }}
- call-publish-docker-images:
- if: github.ref == 'refs/heads/main'
- name: Publish Docker Images
+ call-publish-prerelease-docker-images:
+ # always() re-enables evaluating conditionals in forks even if Windows or
+ # macOS builds were skipped
+ if: |
+ always()
+ && needs.publish.result == 'success'
+ && github.ref == 'refs/heads/release-next'
+ name: Publish Pre-Release Docker Images
+ needs: publish
+ uses: ./.github/workflows/publish-docker-images.yml
+ secrets: inherit
+ with:
+ ziti-version: release-next
+
+ call-publish-release-docker-images:
+ # always() re-enables evaluating conditionals in forks even if Windows or
+ # macOS builds were skipped
+ if: |
+ always()
+ && needs.publish.result == 'success'
+ && github.ref == 'refs/heads/main'
+ name: Publish Release Docker Images
needs: publish
uses: ./.github/workflows/publish-docker-images.yml
secrets: inherit
diff --git a/.github/workflows/publish-docker-images.yml b/.github/workflows/publish-docker-images.yml
index 5e572a429..fc9fce4c2 100644
--- a/.github/workflows/publish-docker-images.yml
+++ b/.github/workflows/publish-docker-images.yml
@@ -4,7 +4,7 @@ on:
workflow_call:
inputs:
ziti-version:
- description: 'Ziti Release Version'
+ description: 'Tag or Branch Ref to Publish'
type: string
required: true
@@ -13,6 +13,10 @@ jobs:
runs-on: ubuntu-latest
env:
ZITI_VERSION: ${{ inputs.ziti-version || github.event.inputs.ziti-version }}
+ ZITI_CLI_IMAGE: ${{ vars.ZITI_CLI_IMAGE || 'docker.io/openziti/ziti-cli' }}
+ ZITI_CONTROLLER_IMAGE: ${{ vars.ZITI_CONTROLLER_IMAGE || 'docker.io/openziti/ziti-controller' }}
+ ZITI_ROUTER_IMAGE: ${{ vars.ZITI_ROUTER_IMAGE || 'docker.io/openziti/ziti-router' }}
+ ZITI_TUNNEL_IMAGE: ${{ vars.ZITI_TUNNEL_IMAGE || 'docker.io/openziti/ziti-tunnel' }}
steps:
- name: Checkout Workspace
uses: actions/checkout@v3
@@ -35,16 +39,21 @@ jobs:
- name: Login to Docker Hub
uses: docker/login-action@v2
with:
- username: ${{ secrets.DOCKER_HUB_API_USER }}
+ # it is preferable to obtain the username from a var so that
+ # recurrences of the same string are not masked in CI output
+ username: ${{ vars.DOCKER_HUB_API_USER || secrets.DOCKER_HUB_API_USER }}
password: ${{ secrets.DOCKER_HUB_API_TOKEN }}
- name: Set Up Container Image Tags for Base CLI Container
env:
- RELEASE_REPO: openziti/ziti-cli
+ IMAGE_REPO: ${{ env.ZITI_CLI_IMAGE }}
id: tagprep_cli
run: |
DOCKER_TAGS=""
- DOCKER_TAGS="${RELEASE_REPO}:${ZITI_VERSION},${RELEASE_REPO}:latest"
+ DOCKER_TAGS="${IMAGE_REPO}:${ZITI_VERSION}"
+ if [[ "${{ github.ref }}" == "refs/heads/main" ]]; then
+ DOCKER_TAGS+=",${IMAGE_REPO}:latest"
+ fi
echo "DEBUG: DOCKER_TAGS=${DOCKER_TAGS}"
echo DOCKER_TAGS="${DOCKER_TAGS}" >> $GITHUB_OUTPUT
@@ -65,11 +74,14 @@ jobs:
- name: Set Up Container Image Tags for Controller Container
env:
- RELEASE_REPO: openziti/ziti-controller
+ IMAGE_REPO: ${{ env. ZITI_CONTROLLER_IMAGE }}
id: tagprep_ctrl
run: |
DOCKER_TAGS=""
- DOCKER_TAGS="${RELEASE_REPO}:${ZITI_VERSION},${RELEASE_REPO}:latest"
+ DOCKER_TAGS="${IMAGE_REPO}:${ZITI_VERSION}"
+ if [[ "${{ github.ref }}" == "refs/heads/main" ]]; then
+ DOCKER_TAGS+=",${IMAGE_REPO}:latest"
+ fi
echo "DEBUG: DOCKER_TAGS=${DOCKER_TAGS}"
echo DOCKER_TAGS="${DOCKER_TAGS}" >> $GITHUB_OUTPUT
@@ -85,15 +97,19 @@ jobs:
tags: ${{ steps.tagprep_ctrl.outputs.DOCKER_TAGS }}
build-args: |
ZITI_VERSION=${{ env.ZITI_VERSION }}
+ ZITI_CLI_IMAGE=${{ env.ZITI_CLI_IMAGE }}
push: true
- name: Set Up Container Image Tags for Router Container
env:
- RELEASE_REPO: openziti/ziti-router
+ IMAGE_REPO: ${{ env.ZITI_ROUTER_IMAGE }}
id: tagprep_router
run: |
DOCKER_TAGS=""
- DOCKER_TAGS="${RELEASE_REPO}:${ZITI_VERSION},${RELEASE_REPO}:latest"
+ DOCKER_TAGS="${IMAGE_REPO}:${ZITI_VERSION}"
+ if [[ "${{ github.ref }}" == "refs/heads/main" ]]; then
+ DOCKER_TAGS+=",${IMAGE_REPO}:latest"
+ fi
echo "DEBUG: DOCKER_TAGS=${DOCKER_TAGS}"
echo DOCKER_TAGS="${DOCKER_TAGS}" >> $GITHUB_OUTPUT
@@ -106,17 +122,21 @@ jobs:
tags: ${{ steps.tagprep_router.outputs.DOCKER_TAGS }}
build-args: |
ZITI_VERSION=${{ env.ZITI_VERSION }}
+ ZITI_CLI_IMAGE=${{ env.ZITI_CLI_IMAGE }}
push: true
- name: Set Up Container Image Tags for Go Tunneler Container
env:
- SNAPSHOT_REPO: netfoundry/ziti-tunnel
- RELEASE_REPO: openziti/ziti-tunnel
+ IMAGE_REPO: ${{ env.ZITI_TUNNEL_IMAGE }}
+ LEGACY_REPO: netfoundry/ziti-tunnel
id: tagprep_tun
run: |
DOCKER_TAGS=""
- for REPO in ${SNAPSHOT_REPO} ${RELEASE_REPO}; do
- DOCKER_TAGS+=",${REPO}:${ZITI_VERSION},${REPO}:latest"
+ for REPO in ${LEGACY_REPO} ${IMAGE_REPO}; do
+ DOCKER_TAGS="${IMAGE_REPO}:${ZITI_VERSION}"
+ if [[ "${{ github.ref }}" == "refs/heads/main" ]]; then
+ DOCKER_TAGS+=",${IMAGE_REPO}:latest"
+ fi
done
DOCKER_TAGS=${DOCKER_TAGS#,} # drop leading comma char
echo "DEBUG: DOCKER_TAGS=${DOCKER_TAGS}"
@@ -131,4 +151,5 @@ jobs:
tags: ${{ steps.tagprep_tun.outputs.DOCKER_TAGS }}
build-args: |
ZITI_VERSION=${{ env.ZITI_VERSION }}
+ ZITI_CLI_IMAGE=${{ env.ZITI_CLI_IMAGE }}
push: true
diff --git a/.github/workflows/push-quickstart.yml b/.github/workflows/push-quickstart.yml
index a17d8bcb4..9cebda1ea 100644
--- a/.github/workflows/push-quickstart.yml
+++ b/.github/workflows/push-quickstart.yml
@@ -8,9 +8,9 @@ jobs:
steps:
- uses: actions/checkout@v3
- name: Login to Docker Hub
- uses: docker/login-action@v1
+ uses: docker/login-action@v2
with:
- username: ${{ secrets.DOCKER_HUB_API_USER }}
+ username: ${{ vars.DOCKER_HUB_API_USER || secrets.DOCKER_HUB_API_USER }}
password: ${{ secrets.DOCKER_HUB_API_TOKEN }}
- name: Push to Docker
run: ./quickstart/docker/pushLatestDocker.sh
diff --git a/ADOPTERS.md b/ADOPTERS.md
index ecc6b584d..8720ae692 100644
--- a/ADOPTERS.md
+++ b/ADOPTERS.md
@@ -18,9 +18,12 @@ If you're interested in getting your project added to the list either:
Here's the list of projects using and adopting OpenZiti
-| Project Name | Project Link | Logo | Description |
-|---------------------------|-----------------------------------------------|----------|-----------------|
-| NetFoundry | https://nfconsole.io/signup | | NetFoundry SaaS provides management, orchestrations, support, and SLAs for OpenZiti networks. |
-| HackBunker | https://www.hackbunker.com/ | | To open up a Zero Trust conversation in the C-Suite and Boardrooms of Blue-chip companies with a suite of products. |
-| DeltaSecure GmbH | https://deltasecure.de/ | | To provide Managed Security Operations Center services for small and medium-sized enterprises. Ziti overlay forms the basis for secure data transmission of customer data and within the SOC infrastructure. |
-| Resulticks | https://www.resulticks.com/ | | Resulticks Zero Trust API delivery network which forms the core of Resulticks' omnichannel marketing automation platform is built on OpenZiti to form a private dark mesh network. |
+| Project Name | Project Link | Logo | Description |
+|----------------------------------|-----------------------------------------------|----------|-----------------|
+| NetFoundry | https://nfconsole.io/signup | | NetFoundry SaaS provides management, orchestrations, support, and SLAs for OpenZiti networks. |
+| HackBunker | https://www.hackbunker.com/ | | To open up a Zero Trust conversation in the C-Suite and Boardrooms of Blue-chip companies with a suite of products. |
+| DeltaSecure GmbH | https://deltasecure.de/ | | To provide Managed Security Operations Center services for small and medium-sized enterprises. Ziti overlay forms the basis for secure data transmission of customer data and within the SOC infrastructure. |
+| Resulticks | https://www.resulticks.com/ | | Resulticks Zero Trust API delivery network which forms the core of Resulticks' omnichannel marketing automation platform is built on OpenZiti to form a private dark mesh network. |
+| KubeZT - Zero Trust Kubernetes | https://KubeZT.com/ | | KubeZT is an on-demand Kubernetes environment that enables developers to build and deploy highly secure applications for high-compliance organizations. |
+| Analytics HQ | https://AnalyticsHQ.com/ | | Analytics HQ is a next-generation unified platform built for modern data management and advanced analytics. |
+| PITS Global Data Recovery Services | https://www.pitsdatarecovery.net/ | | PITS Global Data Recovery Services is a data recovery company in the United States that offers services for recovering data from hard drives, SSDs, flash drives, RAID arrays and more. |
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6be2fda5d..881899f4f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,308 +1,246 @@
-# Release 0.27.9
+# Release 0.28.0
## What's New
-* Refactored the websocket transport to fix a concurrency issue
-* v0.27.6 changed delete behaviors to error if the entity was not found. This release reverts that behavior.
+* Event changes
+ * Added AMQP event writter for events
+ * Add entity change events for auditing or external integration
+ * Add usage event filtering
+ * Add annotations to circuit events
+* CLI additions for `ziti` to login with certificates or external-jwt-signers
+* NOTE: ziti edge login flag changes:
+ * `-c` flag has been changed to map to `--client-cert`
+ * `--cert` is now `--ca` and has no short flag representation
+ * `-e/--ext-jwt` allows a user to supply a file containing a jwt used with ext-jwt-signers to login
+ * `-c/--client-cert` allows a certificate to be supplied to login (used with `-k/--client-key`)
+ * `-k/--client-key` allows a key to be supplied to login (used with `-c/--client-cert`)
+* Config type changes
+ * address fields in `intercept.v1`, `host.v1`, and `host.v2` config types now permit hostnames with underscores.
+* Edge Router/Tunneler now supports setting default UDP idle timeout/check interval
+
+## Event Changes
+
+### AMPQ Event Writer
+Previously events could only be emitted to a file. They can now also be emitted to an AMQP endpoint.
+
+Example configuration:
+```
+events:
+ jsonLogger:
+ subscriptions:
+ - type: fabric.circuits
+ handler:
+ type: amqp
+ format: json
+ url: "amqp://localhost:5672"
+ queue: ziti
+ durable: true //default:true
+ autoDelete: false //default:false
+ exclusive: false //default:false
+ noWait: false //default:false
+```
+
+### Entity Change Events
+OpenZiti can now be configured to emit entity change events. These events describe the changes when entities stored in the
+bbolt database are created, updated or deleted.
+
+Note that events are emitted during the transaction. They are emitted at the end, so it's unlikely, but possible that an event will be emitted for a change which is rolled back. For this reason a following event will emitted when the change is committed. If a system crashes after commit, but before the committed event can be emitted, it will be emitted on the next startup.
+
+Example configuration:
+
+```
+events:
+ jsonLogger:
+ subscriptions:
+ - type: entityChange
+ include:
+ - services
+ - identities
+ handler:
+ type: file
+ format: json
+ path: /tmp/ziti-events.log
+```
+
+See the related issue for discussion: https://github.com/openziti/fabric/issues/562
+
+Example output:
+
+```
+{
+ "namespace": "entityChange",
+ "eventId": "326faf6c-8123-42ae-9ed8-6fd9560eb567",
+ "eventType": "created",
+ "timestamp": "2023-05-11T21:41:47.128588927-04:00",
+ "metadata": {
+ "author": {
+ "type": "identity",
+ "id": "ji2Rt8KJ4",
+ "name": "Default Admin"
+ },
+ "source": {
+ "type": "rest",
+ "auth": "edge",
+ "localAddr": "localhost:1280",
+ "remoteAddr": "127.0.0.1:37578",
+ "method": "POST"
+ },
+ "version": "v0.0.0"
+ },
+ "entityType": "services",
+ "isParentEvent": false,
+ "initialState": null,
+ "finalState": {
+ "id": "6S0bCGWb6yrAutXwSQaLiv",
+ "createdAt": "2023-05-12T01:41:47.128138887Z",
+ "updatedAt": "2023-05-12T01:41:47.128138887Z",
+ "tags": {},
+ "isSystem": false,
+ "name": "test",
+ "terminatorStrategy": "smartrouting",
+ "roleAttributes": [
+ "goodbye",
+ "hello"
+ ],
+ "configs": null,
+ "encryptionRequired": true
+ }
+}
+
+{
+ "namespace": "entityChange",
+ "eventId": "326faf6c-8123-42ae-9ed8-6fd9560eb567",
+ "eventType": "committed",
+ "timestamp": "2023-05-11T21:41:47.129235443-04:00"
+}
+```
+
+### Usage Event Filtering
+Usage events, version 3, can now be filtered based on type.
+
+The valid types include:
+
+* ingress.rx
+* ingress.tx
+* egress.rx
+* egress.tx
+* fabric.rx
+* fabric.tx
+
+Example configuration:
+
+```
+events:
+ jsonLogger:
+ subscriptions:
+ - type: fabric.usage
+ version: 3
+ include:
+ - ingress.rx
+ - egress.rx
+```
+
+### Circuit Event Annotations
+Circuit events initiated from the edge are now annotated with clientId, hostId and serviceId, to match usage events. The client and host ids are identity ids.
+
+Example output:
+
+```
+ {
+ "namespace": "fabric.circuits",
+ "version": 2,
+ "event_type": "created",
+ "circuit_id": "0CEjWYiw6",
+ "timestamp": "2023-05-05T11:44:03.242399585-04:00",
+ "client_id": "clhaq7u7600o4ucgdpxy9i4t1",
+ "service_id": "QARLLTKjqfLZytmSsIqba",
+ "terminator_id": "7ddcd421-2b00-4b49-9ac0-8c78fe388c30",
+ "instance_id": "",
+ "creation_timespan": 1014280,
+ "path": {
+ "nodes": [
+ "U7OwPtfjg",
+ "a4rC9DrZ3"
+ ],
+ "links": [
+ "7Ru3hoxsssZzUNOyvd8Jcb"
+ ],
+ "ingress_id": "K9lD",
+ "egress_id": "rQLK",
+ "initiator_local_addr": "100.64.0.1:1234",
+ "initiator_remote_addr": "100.64.0.1:37640",
+ "terminator_local_addr": "127.0.0.1:45566",
+ "terminator_remote_addr": "127.0.0.1:1234"
+ },
+ "link_count": 1,
+ "path_cost": 392151,
+ "tags": {
+ "clientId": "U7OwPtfjg",
+ "hostId": "a4rC9DrZ3",
+ "serviceId": "QARLLTKjqfLZytmSsIqba"
+ }
+}
+```
+
+## ER/T UDP Settings
+
+The edge router tunneler now allows configuring a timeout and check interval for tproxy UDP intercepts. By default intercepted UDP
+connections will be closed after five minutes of no traffic, checking every thirty seconds. The configuration is done in the router
+config file, in the options for the tunnel module. Note that these configuration options only apply to tproxy intercepts, not to
+proxy or host side UDP connections.
+
+Example configuration:
+
+```yaml
+listeners:
+ - binding: tunnel
+ options:
+ mode: tproxy
+ udpIdleTimeout: 10s
+ udpCheckInterval: 5s
+```
## Component Updates and Bug Fixes
+* github.com/openziti/agent: [v1.0.10 -> v1.0.13](https://github.com/openziti/agent/compare/v1.0.10...v1.0.13)
+* github.com/openziti/channel/v2: [v2.0.58 -> v2.0.78](https://github.com/openziti/channel/compare/v2.0.58...v2.0.78)
+ * [Issue #98](https://github.com/openziti/channel/issues/98) - Set default connect timeout to 5 seconds
+
+* github.com/openziti/edge: [v0.24.239 -> v0.24.309](https://github.com/openziti/edge/compare/v0.24.239...v0.24.309)
+ * [Issue #1503](https://github.com/openziti/edge/issues/1503) - Support configurable UDP idle timeout and check interval for tproxy in edge router tunneler
+ * [Issue #1471](https://github.com/openziti/edge/issues/1471) - UDP intercept connections report incorrect local/remote addresses, making confusing events
+ * [Issue #629](https://github.com/openziti/edge/issues/629) - emit entity change events
+ * [Issue #1295](https://github.com/openziti/edge/issues/1295) - Ensure DB migrations work properly in a clustered setup (edge)
+ * [Issue #1418](https://github.com/openziti/edge/issues/1418) - Checks for session edge router availablility are inefficient
+
+* github.com/openziti/edge-api: [v0.25.11 -> v0.25.24](https://github.com/openziti/edge-api/compare/v0.25.11...v0.25.24)
+* github.com/openziti/fabric: [v0.22.87 -> v0.23.29](https://github.com/openziti/fabric/compare/v0.22.87...v0.23.29)
+ * [Issue #724](https://github.com/openziti/fabric/issues/724) - Controller should be notified of forwarding faults on links
+ * [Issue #725](https://github.com/openziti/fabric/issues/725) - If reroute fails, circuit should be torn down
+ * [Issue #706](https://github.com/openziti/fabric/issues/706) - Fix panic in link close
+ * [Issue #700](https://github.com/openziti/fabric/issues/700) - Additional Health Checks exposed on Edge Router
+ * [Issue #595](https://github.com/openziti/fabric/issues/595) - Add include filtering for V3 usage metrics
+ * [Issue #684](https://github.com/openziti/fabric/issues/684) - Add tag annotations to circuit events, similar to usage events
+ * [Issue #562](https://github.com/openziti/fabric/issues/562) - Add entity change events
+ * [Issue #677](https://github.com/openziti/fabric/issues/677) - Rework raft startup
+ * [Issue #582](https://github.com/openziti/fabric/issues/582) - Ensure DB migrations work properly in a clustered setup (fabric)
+ * [Issue #668](https://github.com/openziti/fabric/issues/668) - Add network.Run watchdog, to warn if processing is delayed
+
+* github.com/openziti/foundation/v2: [v2.0.21 -> v2.0.24](https://github.com/openziti/foundation/compare/v2.0.21...v2.0.24)
+* github.com/openziti/identity: [v1.0.45 -> v1.0.54](https://github.com/openziti/identity/compare/v1.0.45...v1.0.54)
+* github.com/openziti/runzmd: [v1.0.20 -> v1.0.24](https://github.com/openziti/runzmd/compare/v1.0.20...v1.0.24)
+* github.com/openziti/sdk-golang: [v0.18.76 -> v0.20.51](https://github.com/openziti/sdk-golang/compare/v0.18.76...v0.20.51)
+ * [Issue #407](https://github.com/openziti/sdk-golang/issues/407) - Allowing filtering which edge router urls the sdk uses
+ * [Issue #394](https://github.com/openziti/sdk-golang/issues/394) - SDK does not recover from API session expiration (during app/computer suspend)
+
+* github.com/openziti/storage: [v0.1.49 -> v0.2.6](https://github.com/openziti/storage/compare/v0.1.49...v0.2.6)
+* github.com/openziti/transport/v2: [v2.0.72 -> v2.0.88](https://github.com/openziti/transport/compare/v2.0.72...v2.0.88)
+* github.com/openziti/metrics: [v1.2.19 -> v1.2.25](https://github.com/openziti/metrics/compare/v1.2.19...v1.2.25)
+* github.com/openziti/secretstream: v0.1.8 (new)
+* github.com/openziti/ziti: [v0.27.9 -> v0.28.0](https://github.com/openziti/ziti/compare/v0.27.9...v0.28.0)
+ * [Issue #1112](https://github.com/openziti/ziti/issues/1112) - `ziti pki create` creates CA's and intermediates w/ the same DN
+ * [Issue #1087](https://github.com/openziti/ziti/issues/1087) - re-enable CI in forks
+ * [Issue #1013](https://github.com/openziti/ziti/issues/1013) - docker env password is renewed at each `docker-compose up`
+ * [Issue #1077](https://github.com/openziti/ziti/issues/1077) - Show auth-policy name on identity list instead of id
+ * [Issue #1119](https://github.com/openziti/ziti/issues/1119) - intercept.v1 config should permit underscores in the address
+ * [Issue #1123](https://github.com/openziti/ziti/issues/1123) - cannot update config types with ziti cli
-* github.com/openziti/channel/v2: [v2.0.53 -> v2.0.58](https://github.com/openziti/channel/compare/v2.0.53...v2.0.58)
-* github.com/openziti/edge: [v0.24.228 -> v0.24.239](https://github.com/openziti/edge/compare/v0.24.228...v0.24.239)
- * [Issue #1391](https://github.com/openziti/edge/issues/1391) - AuthPolicies for identities is missing a reference link
-
-* github.com/openziti/edge-api: [v0.25.9 -> v0.25.11](https://github.com/openziti/edge-api/compare/v0.25.9...v0.25.11)
-* github.com/openziti/fabric: [v0.22.77 -> v0.22.87](https://github.com/openziti/fabric/compare/v0.22.77...v0.22.87)
-* github.com/openziti/foundation/v2: [v2.0.18 -> v2.0.21](https://github.com/openziti/foundation/compare/v2.0.18...v2.0.21)
-* github.com/openziti/identity: [v1.0.42 -> v1.0.45](https://github.com/openziti/identity/compare/v1.0.42...v1.0.45)
-* github.com/openziti/runzmd: [v1.0.18 -> v1.0.20](https://github.com/openziti/runzmd/compare/v1.0.18...v1.0.20)
-* github.com/openziti/storage: [v0.1.46 -> v0.1.49](https://github.com/openziti/storage/compare/v0.1.46...v0.1.49)
-* github.com/openziti/transport/v2: [v2.0.68 -> v2.0.72](https://github.com/openziti/transport/compare/v2.0.68...v2.0.72)
-* github.com/openziti/metrics: [v1.2.16 -> v1.2.19](https://github.com/openziti/metrics/compare/v1.2.16...v1.2.19)
-* github.com/openziti/ziti: [v0.27.8 -> v0.27.9](https://github.com/openziti/ziti/compare/v0.27.8...v0.27.9)
-
-# Release 0.27.8
-
-## What's New
-
-* CLI additions for auth policies and external JWT signers
-* Performance improvements for listing services
-
-## Component Updates and Bug Fixes
-
-* github.com/openziti/edge: [v0.24.224 -> v0.24.228](https://github.com/openziti/edge/compare/v0.24.224...v0.24.228)
- * [Issue #1388](https://github.com/openziti/edge/issues/1388) - Make better use of identity service indexes for service list
- * [Issue #1386](https://github.com/openziti/edge/issues/1386) - PUT on identities results in an error and internal PANIC
-
-* github.com/openziti/fabric: [v0.22.76 -> v0.22.77](https://github.com/openziti/fabric/compare/v0.22.76...v0.22.77)
-* github.com/openziti/storage: [v0.1.45 -> v0.1.46](https://github.com/openziti/storage/compare/v0.1.45...v0.1.46)
-* github.com/openziti/ziti: [v0.27.7 -> v0.27.8](https://github.com/openziti/ziti/compare/v0.27.7...v0.27.8)
- * [Issue #1064](https://github.com/openziti/ziti/issues/1064) - Support auth-policy assignments on identities via the CLI
- * [Issue #1058](https://github.com/openziti/ziti/issues/1058) - Allow Auth Policy Create/Update/Delete via CLI
- * [Issue #1059](https://github.com/openziti/ziti/issues/1059) - Expose Delete for Ext JWT Signers in CLI
-
-# Release 0.27.7
-
-## What's New
-
-* This release updates the build to use Go 1.20
-
-# Release 0.27.6
-
-## What's New
-
-* Makes inspect CLI more discoverable by adding subcommands for inspectable values
-* Adds new inspection allowing configs to be retrieved: `ziti fabric inspect config`
-* Many improvements to edge-router/tunneler hosting performance with large numbers of hosted services
- * Routers should no longer overwhelm controller while setting up or reestablishing hosting
-* Adds ability to disable router
-* Adds CLI command to compact offline bbolt database: `ziti ops db compact `
-* Adds CLI command to re-enroll edge routers: `ziti edge re-enroll edge-router`
-* Routers can now be disabled. Connections to the controller from disabled routers will be rejected.
- * Disable with: `ziti fabric update router --disabled`
- * Enable with: `ziti fabric update router --disabled=false`
-
-## Component Updates and Bug Fixes
-
-* github.com/openziti/agent: [v1.0.8 -> v1.0.10](https://github.com/openziti/agent/compare/v1.0.8...v1.0.10)
-* github.com/openziti/channel/v2: [v2.0.27 -> v2.0.53](https://github.com/openziti/channel/compare/v2.0.27...v2.0.53)
- * [Issue #83](https://github.com/openziti/channel/issues/83) - Improve protocol mismatch error(s)
- * [Issue #93](https://github.com/openziti/channel/issues/93) - Fix atomic 64-bit alignment error on arm devices
-
-* github.com/openziti/edge: [v0.24.125 -> v0.24.224](https://github.com/openziti/edge/compare/v0.24.125...v0.24.224)
- * [Issue #1373](https://github.com/openziti/edge/issues/1373) - Add support for disabled flag to edge and transit routers
- * [Issue #1374](https://github.com/openziti/edge/issues/1374) - Multiple MFA enrollments cannot be cleaned up by administrators
- * [Issue #1336](https://github.com/openziti/edge/issues/1336) - xgress_edge_tunnel shouldn't stop/start host on control channel reconnect
- * [Issue #1369](https://github.com/openziti/edge/issues/1369) - Add missing entity type id for TransitRouter
- * [Issue #1366](https://github.com/openziti/edge/issues/1366) - Error message incorrectly state 'invalid api session' when it's an invalid session
- * [Issue #1364](https://github.com/openziti/edge/issues/1364) - Cache api-sessions for tunneler router so we don't need to unnecessarily create new sessions
- * [Issue #1362](https://github.com/openziti/edge/issues/1362) - Rate limit terminator creates for router/tunneler
- * [Issue #1359](https://github.com/openziti/edge/issues/1359) - Sessions creates should be idempotent
- * [Issue #1355](https://github.com/openziti/edge/issues/1355) - Handle duplicate create terminator requests if create terminator fails
- * [Issue #1350](https://github.com/openziti/edge/issues/1350) - Router event processing can deadlock
- * [Issue #1329](https://github.com/openziti/edge/issues/1329) - UDP connections can drop data if datagrams are > 10k in size
- * [Issue #1310](https://github.com/openziti/edge/issues/1310) - Creating a cert backed ext-jwt-signer causes nil dereference
-
-* github.com/openziti/edge-api: [v0.25.6 -> v0.25.9](https://github.com/openziti/edge-api/compare/v0.25.6...v0.25.9)
-* github.com/openziti/fabric: [v0.22.24 -> v0.22.76](https://github.com/openziti/fabric/compare/v0.22.24...v0.22.76)
- * [Issue #651](https://github.com/openziti/fabric/issues/651) - Add router enable/disable mechanism
- * [Issue #648](https://github.com/openziti/fabric/issues/648) - Add rate limiter pool to router for operations with potential to flood the controller
- * [Issue #610](https://github.com/openziti/fabric/issues/610) - Fix router disconnect when endpoint removed from cluster
- * [Issue #622](https://github.com/openziti/fabric/issues/622) - fatal error: concurrent map iteration and map write in logContext.WireEntry
- * [Issue #507](https://github.com/openziti/fabric/issues/507) - Add configuration for control channel heartbeat
- * [Issue #584](https://github.com/openziti/fabric/issues/584) - Add cluster events
- * [Issue #599](https://github.com/openziti/fabric/issues/599) - Add release and transfer leadership commands
- * [Issue #606](https://github.com/openziti/fabric/issues/606) - Ensure consistent use of peer address
- * [Issue #598](https://github.com/openziti/fabric/issues/598) - Add support to fabric inspect to propagate inspect to other controllers
- * [Issue #597](https://github.com/openziti/fabric/issues/597) - Make raft settings configurable
- * [Issue #604](https://github.com/openziti/fabric/issues/604) - Don't create link dropped msg metric until channel bind time
- * [Issue #638](https://github.com/openziti/fabric/issues/638) - Fix atomic 64-bit alignment error on arm devices
-
-* github.com/openziti/foundation/v2: [v2.0.10 -> v2.0.18](https://github.com/openziti/foundation/compare/v2.0.10...v2.0.18)
-* github.com/openziti/identity: [v1.0.30 -> v1.0.42](https://github.com/openziti/identity/compare/v1.0.30...v1.0.42)
-* github.com/openziti/runzmd: [v1.0.9 -> v1.0.18](https://github.com/openziti/runzmd/compare/v1.0.9...v1.0.18)
-* github.com/openziti/sdk-golang: [v0.18.28 -> v0.18.76](https://github.com/openziti/sdk-golang/compare/v0.18.28...v0.18.76)
- * [Issue #356](https://github.com/openziti/sdk-golang/issues/356) - sdk connections should respect net.Conn deadline related API specifications
-
-* github.com/openziti/storage: [v0.1.34 -> v0.1.45](https://github.com/openziti/storage/compare/v0.1.34...v0.1.45)
-* github.com/openziti/transport/v2: [v2.0.51 -> v2.0.68](https://github.com/openziti/transport/compare/v2.0.51...v2.0.68)
-* github.com/openziti/jwks: [v1.0.2 -> v1.0.3](https://github.com/openziti/jwks/compare/v1.0.2...v1.0.3)
-* github.com/openziti/metrics: [v1.2.3 -> v1.2.16](https://github.com/openziti/metrics/compare/v1.2.3...v1.2.16)
-* github.com/openziti/ziti: [v0.27.5 -> v0.27.6](https://github.com/openziti/ziti/compare/v0.27.5...v0.27.6)
- * [Issue #1041](https://github.com/openziti/ziti/issues/1041) - Add ziti compact command to CLI
- * [Issue #1032](https://github.com/openziti/ziti/issues/1032) - ziti edge create service fails silently if config names don't exist
- * [Issue #1031](https://github.com/openziti/ziti/issues/1031) - Fixed quickstart bug with arm and arm64 ambiguity when running quickstart on arm architecture
-
-# Release 0.27.5
-
-## What's New
-
-* Fixes an issue with `ziti` CLI when using a globally trusted CA
-* Fixes bug where `ziti agent stack` was calling `ziti agent stats`
-* ziti controller/router no longer compare the running version with
- the latest from github by default. Set ZITI_CHECK_VERSION=true to
- enable this behavior
-
-## Component Updates and Bug Fixes
-
-* github.com/openziti/edge: [v0.24.121 -> v0.24.125](https://github.com/openziti/edge/compare/v0.24.121...v0.24.125)
-* github.com/openziti/fabric: [v0.22.20 -> v0.22.24](https://github.com/openziti/fabric/compare/v0.22.20...v0.22.24)
- * [Issue #601](https://github.com/openziti/fabric/issues/601) - Only use endpoints file in router once endpoints have changed
- * [Issue #583](https://github.com/openziti/fabric/issues/583) - Compress raft snapshots
-
-* github.com/openziti/sdk-golang: [v0.18.27 -> v0.18.28](https://github.com/openziti/sdk-golang/compare/v0.18.27...v0.18.28)
-* github.com/openziti/storage: [v0.1.33 -> v0.1.34](https://github.com/openziti/storage/compare/v0.1.33...v0.1.34)
-* github.com/openziti/ziti: [v0.27.4 -> v0.27.5](https://github.com/openziti/ziti/compare/v0.27.4...v0.27.5)
-
-# Release 0.27.4
-
-## What's New
-
-This release contains a fix for a controller deadlock
-
-## Component Updates and Bug Fixes
-
-* github.com/openziti/channel/v2: [v2.0.26 -> v2.0.27](https://github.com/openziti/channel/compare/v2.0.26...v2.0.27)
-* github.com/openziti/edge: [v0.24.115 -> v0.24.121](https://github.com/openziti/edge/compare/v0.24.115...v0.24.121)
- * [Issue #1303](https://github.com/openziti/edge/issues/1303) - Fix deadlock when flushing api session heartbeats
-
-* github.com/openziti/fabric: [v0.22.19 -> v0.22.20](https://github.com/openziti/fabric/compare/v0.22.19...v0.22.20)
-* github.com/openziti/sdk-golang: [v0.18.26 -> v0.18.27](https://github.com/openziti/sdk-golang/compare/v0.18.26...v0.18.27)
-* github.com/openziti/transport/v2: [v2.0.50 -> v2.0.51](https://github.com/openziti/transport/compare/v2.0.50...v2.0.51)
-* github.com/openziti/ziti: [v0.27.3 -> v0.27.4](https://github.com/openziti/ziti/compare/v0.27.3...v0.27.4)
-
-# Release 0.27.3
-
-## What's New
-
-* Docker images for `ziti` CLI
-
-* New Raft interaction commands
- * `raft-leave` allows removal of controllers from the raft cluster
- * `raft-list` lists all connected controllers and their version/connected status
- * `fabric raft list-members` same info as the agent command, but over rest
-
-## Component Updates and Bug Fixes
-
-* github.com/openziti/agent: [v1.0.7 -> v1.0.8](https://github.com/openziti/agent/compare/v1.0.7...v1.0.8)
-* github.com/openziti/channel/v2: [v2.0.25 -> v2.0.26](https://github.com/openziti/channel/compare/v2.0.25...v2.0.26)
-* github.com/openziti/edge: [v0.24.95 -> v0.24.115](https://github.com/openziti/edge/compare/v0.24.95...v0.24.115)
- * [Issue #1292](https://github.com/openziti/edge/issues/1292) - Support alternative tproxy configuration methods
-
-* github.com/openziti/edge-api: v0.25.6 (new)
-* github.com/openziti/fabric: [v0.22.7 -> v0.22.19](https://github.com/openziti/fabric/compare/v0.22.7...v0.22.19)
- * [Issue #592](https://github.com/openziti/fabric/issues/592) - Incoming "gateway" connections should be logged at a socket level
- * [Issue #588](https://github.com/openziti/fabric/issues/588) - Make service events more consistent
- * [Issue #589](https://github.com/openziti/fabric/issues/589) - Add duration to circuit updated and deleted events
- * [Issue #508](https://github.com/openziti/fabric/issues/508) - Refactor router debug ops for multiple controllers
-
-* github.com/openziti/identity: [v1.0.29 -> v1.0.30](https://github.com/openziti/identity/compare/v1.0.29...v1.0.30)
-* github.com/openziti/runzmd: [v1.0.7 -> v1.0.9](https://github.com/openziti/runzmd/compare/v1.0.7...v1.0.9)
-* github.com/openziti/sdk-golang: [v0.18.21 -> v0.18.26](https://github.com/openziti/sdk-golang/compare/v0.18.21...v0.18.26)
-* github.com/openziti/storage: [v0.1.31 -> v0.1.33](https://github.com/openziti/storage/compare/v0.1.31...v0.1.33)
-* github.com/openziti/transport/v2: [v2.0.49 -> v2.0.50](https://github.com/openziti/transport/compare/v2.0.49...v2.0.50)
-* github.com/openziti/ziti: [v0.27.2 -> v0.27.3](https://github.com/openziti/ziti/compare/v0.27.2...v0.27.3)
- * [Issue #974](https://github.com/openziti/ziti/issues/974) - tunnel "host" and "proxy" modes shouldn't run the nameserver
- * [Issue #972](https://github.com/openziti/ziti/issues/972) - tunnel segfault
-
-# Release 0.27.2
-
-## What's New
-
-* Bug fixes
-
-## Component Updates and Bug Fixes
-
-* github.com/openziti/channel/v2: [v2.0.24 -> v2.0.25](https://github.com/openziti/channel/compare/v2.0.24...v2.0.25)
-* github.com/openziti/edge: [v0.24.86 -> v0.24.95](https://github.com/openziti/edge/compare/v0.24.86...v0.24.95)
- * [Issue #1282](https://github.com/openziti/edge/issues/1282) - Ensure entity count events can be configured to only be emitted on the leader
- * [Issue #1279](https://github.com/openziti/edge/issues/1279) - Constrain config-type schema to accept only object types
-
-* github.com/openziti/fabric: [v0.22.1 -> v0.22.7](https://github.com/openziti/fabric/compare/v0.22.1...v0.22.7)
- * [Issue #573](https://github.com/openziti/fabric/issues/573) - Ensure specific events aren't duplicated in raft cluster
- * [Issue #577](https://github.com/openziti/fabric/issues/577) - JSON Event formatter isn't putting events on their own line
- * [Issue #571](https://github.com/openziti/fabric/issues/571) - Move raft.advertiseAddress to ctrl for consistency
- * [Issue #569](https://github.com/openziti/fabric/issues/569) - Support automatic migration and agent based migration
- * [Issue #567](https://github.com/openziti/fabric/issues/567) - Remove link dropped_msg metrics for closed links
- * [Issue #566](https://github.com/openziti/fabric/issues/566) - Link listeners aren't properly configuring channel out queue size
-
-* github.com/openziti/foundation/v2: [v2.0.9 -> v2.0.10](https://github.com/openziti/foundation/compare/v2.0.9...v2.0.10)
-* github.com/openziti/identity: [v1.0.28 -> v1.0.29](https://github.com/openziti/identity/compare/v1.0.28...v1.0.29)
-* github.com/openziti/sdk-golang: [v0.18.19 -> v0.18.21](https://github.com/openziti/sdk-golang/compare/v0.18.19...v0.18.21)
-* github.com/openziti/storage: [v0.1.30 -> v0.1.31](https://github.com/openziti/storage/compare/v0.1.30...v0.1.31)
-* github.com/openziti/transport/v2: [v2.0.48 -> v2.0.49](https://github.com/openziti/transport/compare/v2.0.48...v2.0.49)
-* github.com/openziti/metrics: [v1.2.2 -> v1.2.3](https://github.com/openziti/metrics/compare/v1.2.2...v1.2.3)
-* github.com/openziti/ziti: [v0.27.1 -> v0.27.2](https://github.com/openziti/ziti/compare/v0.27.1...v0.27.2)
- * [Issue #916](https://github.com/openziti/ziti/issues/916) - Allow defining resource tags via json in the cli
-
-
-# Release 0.27.1
-
-## What's New
-
-* Event streaming over websocket
- * `ziti fabric stream events`
- * Events use same JSON formatting as the file based streaming
- * Plain Text formatting removed
- * Individual streaming of metrics/circuits removed in favor of unified events streaming
-* Improvements to router/tunneler terminator creation
- * Create terminator requests are now idempotent, so repeated requests will not result in multiple terminators
- * Create terminator requests are now asynchronous, so responses will no longer get timed out
- * There is new timer metric from routers, timing how long terminator creates take: `xgress_edge_tunnel.terminator.create_timer`
-
-## Component Updates and Bug Fixes
-
-* github.com/openziti/edge: [v0.24.75 -> v0.24.86](https://github.com/openziti/edge/compare/v0.24.75...v0.24.86)
- * [Issue #1272](https://github.com/openziti/edge/issues/1272) - Mark xgress_edge and xgress_edge_tunnel created terminators as system entity
- * [Issue #1270](https://github.com/openziti/edge/issues/1270) - Make xgress_edge_tunnel service hosting more scalabe
- * [Issue #1268](https://github.com/openziti/edge/issues/1268) - session deletion can get stalled by restarts
-
-* github.com/openziti/fabric: [v0.21.36 -> v0.22.1](https://github.com/openziti/fabric/compare/v0.21.36...v0.22.1)
- * [Issue #563](https://github.com/openziti/fabric/issues/563) - Allow streaming events over webscocket, replacing stream circuits and stream metrics
- * [Issue #552](https://github.com/openziti/fabric/issues/552) - Add minimum cost delta for smart routing
- * [Issue #558](https://github.com/openziti/fabric/issues/558) - Allow terminators to be marked as system entities
-
-* github.com/openziti/ziti: [v0.27.0 -> v0.27.1](https://github.com/openziti/ziti/compare/v0.27.0...v0.27.1)
- * [Issue #928](https://github.com/openziti/ziti/issues/928) - ziti fabric update terminator should not require setting router
- * [Issue #929](https://github.com/openziti/ziti/issues/929) - zit fabric list terminators isn't showing cost or dynamic cost
-
-# Release 0.27.0
-
-## What's New
-
-* Ziti CLI
- * The CLI has been cleaned up and unused, unusable and underused components have been removed or hidden
- * Add create/delete transit-router CLI commands
- * [Issue-706](https://github.com/openziti/ziti/issues/706) - Add port check to quickstart
-
-## Ziti CLI
-
-* The update command has been removed. It was non-functional, so this should not affect anyone
-* The adhoc, ping and playbook commands have been removed. These were ansible and vagrant commands that were not widely used.
-* Make the art command hidden, doesn't need to be removed, leave it as an easter egg
-* Move ziti ps command under ziti agent. Remove all ziti ps subcommands, as they already exist as ziti agent subcommands
-* Add `ziti controller` and `ziti router` commands
- * They should work exactly the same as `ziti-controller` and `ziti router`
- * The standalone binaries for `ziti-controller` and `ziti-router` are deprecated and will be removed in a future release
-* Add hidden `ziti tunnel` command
- * Should work exactly the same as `ziti-tunnel`
- * Is hidden as `ziti-edge-tunnel` is the preferred tunnelling application
- * The standalone binary `ziti-tunnel` is deprecated and will be removed in a future release
-* The db, log-format and unwrap commands have been moved under a new ops command
-* ziti executable download management has been deprecated
- * The init and uninstall commands have been removed
- * The install, upgrade, use and version commands have been hidden and will be hidden once tests using them are updated or replaced
-* The demo and tutorial commands have been moved under the new learn subcommand
-* `ziti edge enroll` now has a verbose option for additional debugging
-* The `ziti edge` CLI now support create/delete transit-router. This allows transit/fabric routers to be provisioned using an enrollment process, rather than requiring certs to be created externally. Note that this requires that the fabric router config file has a `csr` section.
-
-## Component Updates and Bug Fixes
-
-* github.com/openziti/agent: [v1.0.5 -> v1.0.7](https://github.com/openziti/agent/compare/v1.0.5...v1.0.7)
-* github.com/openziti/channel/v2: [v2.0.12 -> v2.0.24](https://github.com/openziti/channel/compare/v2.0.12...v2.0.24)
-* github.com/openziti/edge: [v0.24.36 -> v0.24.75](https://github.com/openziti/edge/compare/v0.24.36...v0.24.75)
- * [Issue #1253](https://github.com/openziti/edge/issues/1253) - Panic in controller getting hello from edge router
- * [Issue #1233](https://github.com/openziti/edge/issues/1233) - edge-routers ref link in identities endpoint is incorrectly keyed
- * [Issue #1234](https://github.com/openziti/edge/issues/1234) - identities missing service-config link ref
- * [Issue #1232](https://github.com/openziti/edge/issues/1232) - edge management api identity-types endpoint produces incorrect links
-
-* github.com/openziti/fabric: [v0.21.17 -> v0.21.36](https://github.com/openziti/fabric/compare/v0.21.17...v0.21.36)
- * [Issue #525](https://github.com/openziti/fabric/issues/525) - Update metrics message propagation from router to controller for HA
-
-* github.com/openziti/foundation/v2: [v2.0.7 -> v2.0.9](https://github.com/openziti/foundation/compare/v2.0.7...v2.0.9)
-* github.com/openziti/identity: [v1.0.20 -> v1.0.28](https://github.com/openziti/identity/compare/v1.0.20...v1.0.28)
-* github.com/openziti/runzmd: [v1.0.3 -> v1.0.7](https://github.com/openziti/runzmd/compare/v1.0.3...v1.0.7)
-* github.com/openziti/sdk-golang: [v0.16.146 -> v0.18.19](https://github.com/openziti/sdk-golang/compare/v0.16.146...v0.18.19)
-* github.com/openziti/storage: [v0.1.26 -> v0.1.30](https://github.com/openziti/storage/compare/v0.1.26...v0.1.30)
-* github.com/openziti/transport/v2: [v2.0.38 -> v2.0.48](https://github.com/openziti/transport/compare/v2.0.38...v2.0.48)
-* github.com/openziti/metrics: [v1.1.5 -> v1.2.2](https://github.com/openziti/metrics/compare/v1.1.5...v1.2.2)
-* github.com/openziti/ziti: [v0.26.11 -> v0.26.12](https://github.com/openziti/ziti/compare/v0.26.11...v0.26.12)
- * [Issue #892](https://github.com/openziti/ziti/issues/892) - Add timeout to ziti agent controller snapshot-db command
- * [Issue #917](https://github.com/openziti/ziti/issues/917) - ZITI_BIN_ROOT is incorrect in docker env
- * [Issue #912](https://github.com/openziti/ziti/issues/912) - Binaries not updated in docker-compose env with new image
- * [Issue #897](https://github.com/openziti/ziti/issues/897) - Add CLI options to manage /edge/v1/transit-routers
- * [Issue #706](https://github.com/openziti/ziti/issues/706) - Add port check to quickstart
-
-# Older Changelogs
-
-Changelogs for previous releases can be found in [changelogs](./changelogs).
diff --git a/changelogs/CHANGELOG.0.27.md b/changelogs/CHANGELOG.0.27.md
new file mode 100644
index 000000000..6be2fda5d
--- /dev/null
+++ b/changelogs/CHANGELOG.0.27.md
@@ -0,0 +1,308 @@
+# Release 0.27.9
+
+## What's New
+
+* Refactored the websocket transport to fix a concurrency issue
+* v0.27.6 changed delete behaviors to error if the entity was not found. This release reverts that behavior.
+
+## Component Updates and Bug Fixes
+
+* github.com/openziti/channel/v2: [v2.0.53 -> v2.0.58](https://github.com/openziti/channel/compare/v2.0.53...v2.0.58)
+* github.com/openziti/edge: [v0.24.228 -> v0.24.239](https://github.com/openziti/edge/compare/v0.24.228...v0.24.239)
+ * [Issue #1391](https://github.com/openziti/edge/issues/1391) - AuthPolicies for identities is missing a reference link
+
+* github.com/openziti/edge-api: [v0.25.9 -> v0.25.11](https://github.com/openziti/edge-api/compare/v0.25.9...v0.25.11)
+* github.com/openziti/fabric: [v0.22.77 -> v0.22.87](https://github.com/openziti/fabric/compare/v0.22.77...v0.22.87)
+* github.com/openziti/foundation/v2: [v2.0.18 -> v2.0.21](https://github.com/openziti/foundation/compare/v2.0.18...v2.0.21)
+* github.com/openziti/identity: [v1.0.42 -> v1.0.45](https://github.com/openziti/identity/compare/v1.0.42...v1.0.45)
+* github.com/openziti/runzmd: [v1.0.18 -> v1.0.20](https://github.com/openziti/runzmd/compare/v1.0.18...v1.0.20)
+* github.com/openziti/storage: [v0.1.46 -> v0.1.49](https://github.com/openziti/storage/compare/v0.1.46...v0.1.49)
+* github.com/openziti/transport/v2: [v2.0.68 -> v2.0.72](https://github.com/openziti/transport/compare/v2.0.68...v2.0.72)
+* github.com/openziti/metrics: [v1.2.16 -> v1.2.19](https://github.com/openziti/metrics/compare/v1.2.16...v1.2.19)
+* github.com/openziti/ziti: [v0.27.8 -> v0.27.9](https://github.com/openziti/ziti/compare/v0.27.8...v0.27.9)
+
+# Release 0.27.8
+
+## What's New
+
+* CLI additions for auth policies and external JWT signers
+* Performance improvements for listing services
+
+## Component Updates and Bug Fixes
+
+* github.com/openziti/edge: [v0.24.224 -> v0.24.228](https://github.com/openziti/edge/compare/v0.24.224...v0.24.228)
+ * [Issue #1388](https://github.com/openziti/edge/issues/1388) - Make better use of identity service indexes for service list
+ * [Issue #1386](https://github.com/openziti/edge/issues/1386) - PUT on identities results in an error and internal PANIC
+
+* github.com/openziti/fabric: [v0.22.76 -> v0.22.77](https://github.com/openziti/fabric/compare/v0.22.76...v0.22.77)
+* github.com/openziti/storage: [v0.1.45 -> v0.1.46](https://github.com/openziti/storage/compare/v0.1.45...v0.1.46)
+* github.com/openziti/ziti: [v0.27.7 -> v0.27.8](https://github.com/openziti/ziti/compare/v0.27.7...v0.27.8)
+ * [Issue #1064](https://github.com/openziti/ziti/issues/1064) - Support auth-policy assignments on identities via the CLI
+ * [Issue #1058](https://github.com/openziti/ziti/issues/1058) - Allow Auth Policy Create/Update/Delete via CLI
+ * [Issue #1059](https://github.com/openziti/ziti/issues/1059) - Expose Delete for Ext JWT Signers in CLI
+
+# Release 0.27.7
+
+## What's New
+
+* This release updates the build to use Go 1.20
+
+# Release 0.27.6
+
+## What's New
+
+* Makes inspect CLI more discoverable by adding subcommands for inspectable values
+* Adds new inspection allowing configs to be retrieved: `ziti fabric inspect config`
+* Many improvements to edge-router/tunneler hosting performance with large numbers of hosted services
+ * Routers should no longer overwhelm controller while setting up or reestablishing hosting
+* Adds ability to disable router
+* Adds CLI command to compact offline bbolt database: `ziti ops db compact `
+* Adds CLI command to re-enroll edge routers: `ziti edge re-enroll edge-router`
+* Routers can now be disabled. Connections to the controller from disabled routers will be rejected.
+ * Disable with: `ziti fabric update router --disabled`
+ * Enable with: `ziti fabric update router --disabled=false`
+
+## Component Updates and Bug Fixes
+
+* github.com/openziti/agent: [v1.0.8 -> v1.0.10](https://github.com/openziti/agent/compare/v1.0.8...v1.0.10)
+* github.com/openziti/channel/v2: [v2.0.27 -> v2.0.53](https://github.com/openziti/channel/compare/v2.0.27...v2.0.53)
+ * [Issue #83](https://github.com/openziti/channel/issues/83) - Improve protocol mismatch error(s)
+ * [Issue #93](https://github.com/openziti/channel/issues/93) - Fix atomic 64-bit alignment error on arm devices
+
+* github.com/openziti/edge: [v0.24.125 -> v0.24.224](https://github.com/openziti/edge/compare/v0.24.125...v0.24.224)
+ * [Issue #1373](https://github.com/openziti/edge/issues/1373) - Add support for disabled flag to edge and transit routers
+ * [Issue #1374](https://github.com/openziti/edge/issues/1374) - Multiple MFA enrollments cannot be cleaned up by administrators
+ * [Issue #1336](https://github.com/openziti/edge/issues/1336) - xgress_edge_tunnel shouldn't stop/start host on control channel reconnect
+ * [Issue #1369](https://github.com/openziti/edge/issues/1369) - Add missing entity type id for TransitRouter
+ * [Issue #1366](https://github.com/openziti/edge/issues/1366) - Error message incorrectly state 'invalid api session' when it's an invalid session
+ * [Issue #1364](https://github.com/openziti/edge/issues/1364) - Cache api-sessions for tunneler router so we don't need to unnecessarily create new sessions
+ * [Issue #1362](https://github.com/openziti/edge/issues/1362) - Rate limit terminator creates for router/tunneler
+ * [Issue #1359](https://github.com/openziti/edge/issues/1359) - Sessions creates should be idempotent
+ * [Issue #1355](https://github.com/openziti/edge/issues/1355) - Handle duplicate create terminator requests if create terminator fails
+ * [Issue #1350](https://github.com/openziti/edge/issues/1350) - Router event processing can deadlock
+ * [Issue #1329](https://github.com/openziti/edge/issues/1329) - UDP connections can drop data if datagrams are > 10k in size
+ * [Issue #1310](https://github.com/openziti/edge/issues/1310) - Creating a cert backed ext-jwt-signer causes nil dereference
+
+* github.com/openziti/edge-api: [v0.25.6 -> v0.25.9](https://github.com/openziti/edge-api/compare/v0.25.6...v0.25.9)
+* github.com/openziti/fabric: [v0.22.24 -> v0.22.76](https://github.com/openziti/fabric/compare/v0.22.24...v0.22.76)
+ * [Issue #651](https://github.com/openziti/fabric/issues/651) - Add router enable/disable mechanism
+ * [Issue #648](https://github.com/openziti/fabric/issues/648) - Add rate limiter pool to router for operations with potential to flood the controller
+ * [Issue #610](https://github.com/openziti/fabric/issues/610) - Fix router disconnect when endpoint removed from cluster
+ * [Issue #622](https://github.com/openziti/fabric/issues/622) - fatal error: concurrent map iteration and map write in logContext.WireEntry
+ * [Issue #507](https://github.com/openziti/fabric/issues/507) - Add configuration for control channel heartbeat
+ * [Issue #584](https://github.com/openziti/fabric/issues/584) - Add cluster events
+ * [Issue #599](https://github.com/openziti/fabric/issues/599) - Add release and transfer leadership commands
+ * [Issue #606](https://github.com/openziti/fabric/issues/606) - Ensure consistent use of peer address
+ * [Issue #598](https://github.com/openziti/fabric/issues/598) - Add support to fabric inspect to propagate inspect to other controllers
+ * [Issue #597](https://github.com/openziti/fabric/issues/597) - Make raft settings configurable
+ * [Issue #604](https://github.com/openziti/fabric/issues/604) - Don't create link dropped msg metric until channel bind time
+ * [Issue #638](https://github.com/openziti/fabric/issues/638) - Fix atomic 64-bit alignment error on arm devices
+
+* github.com/openziti/foundation/v2: [v2.0.10 -> v2.0.18](https://github.com/openziti/foundation/compare/v2.0.10...v2.0.18)
+* github.com/openziti/identity: [v1.0.30 -> v1.0.42](https://github.com/openziti/identity/compare/v1.0.30...v1.0.42)
+* github.com/openziti/runzmd: [v1.0.9 -> v1.0.18](https://github.com/openziti/runzmd/compare/v1.0.9...v1.0.18)
+* github.com/openziti/sdk-golang: [v0.18.28 -> v0.18.76](https://github.com/openziti/sdk-golang/compare/v0.18.28...v0.18.76)
+ * [Issue #356](https://github.com/openziti/sdk-golang/issues/356) - sdk connections should respect net.Conn deadline related API specifications
+
+* github.com/openziti/storage: [v0.1.34 -> v0.1.45](https://github.com/openziti/storage/compare/v0.1.34...v0.1.45)
+* github.com/openziti/transport/v2: [v2.0.51 -> v2.0.68](https://github.com/openziti/transport/compare/v2.0.51...v2.0.68)
+* github.com/openziti/jwks: [v1.0.2 -> v1.0.3](https://github.com/openziti/jwks/compare/v1.0.2...v1.0.3)
+* github.com/openziti/metrics: [v1.2.3 -> v1.2.16](https://github.com/openziti/metrics/compare/v1.2.3...v1.2.16)
+* github.com/openziti/ziti: [v0.27.5 -> v0.27.6](https://github.com/openziti/ziti/compare/v0.27.5...v0.27.6)
+ * [Issue #1041](https://github.com/openziti/ziti/issues/1041) - Add ziti compact command to CLI
+ * [Issue #1032](https://github.com/openziti/ziti/issues/1032) - ziti edge create service fails silently if config names don't exist
+ * [Issue #1031](https://github.com/openziti/ziti/issues/1031) - Fixed quickstart bug with arm and arm64 ambiguity when running quickstart on arm architecture
+
+# Release 0.27.5
+
+## What's New
+
+* Fixes an issue with `ziti` CLI when using a globally trusted CA
+* Fixes bug where `ziti agent stack` was calling `ziti agent stats`
+* ziti controller/router no longer compare the running version with
+ the latest from github by default. Set ZITI_CHECK_VERSION=true to
+ enable this behavior
+
+## Component Updates and Bug Fixes
+
+* github.com/openziti/edge: [v0.24.121 -> v0.24.125](https://github.com/openziti/edge/compare/v0.24.121...v0.24.125)
+* github.com/openziti/fabric: [v0.22.20 -> v0.22.24](https://github.com/openziti/fabric/compare/v0.22.20...v0.22.24)
+ * [Issue #601](https://github.com/openziti/fabric/issues/601) - Only use endpoints file in router once endpoints have changed
+ * [Issue #583](https://github.com/openziti/fabric/issues/583) - Compress raft snapshots
+
+* github.com/openziti/sdk-golang: [v0.18.27 -> v0.18.28](https://github.com/openziti/sdk-golang/compare/v0.18.27...v0.18.28)
+* github.com/openziti/storage: [v0.1.33 -> v0.1.34](https://github.com/openziti/storage/compare/v0.1.33...v0.1.34)
+* github.com/openziti/ziti: [v0.27.4 -> v0.27.5](https://github.com/openziti/ziti/compare/v0.27.4...v0.27.5)
+
+# Release 0.27.4
+
+## What's New
+
+This release contains a fix for a controller deadlock
+
+## Component Updates and Bug Fixes
+
+* github.com/openziti/channel/v2: [v2.0.26 -> v2.0.27](https://github.com/openziti/channel/compare/v2.0.26...v2.0.27)
+* github.com/openziti/edge: [v0.24.115 -> v0.24.121](https://github.com/openziti/edge/compare/v0.24.115...v0.24.121)
+ * [Issue #1303](https://github.com/openziti/edge/issues/1303) - Fix deadlock when flushing api session heartbeats
+
+* github.com/openziti/fabric: [v0.22.19 -> v0.22.20](https://github.com/openziti/fabric/compare/v0.22.19...v0.22.20)
+* github.com/openziti/sdk-golang: [v0.18.26 -> v0.18.27](https://github.com/openziti/sdk-golang/compare/v0.18.26...v0.18.27)
+* github.com/openziti/transport/v2: [v2.0.50 -> v2.0.51](https://github.com/openziti/transport/compare/v2.0.50...v2.0.51)
+* github.com/openziti/ziti: [v0.27.3 -> v0.27.4](https://github.com/openziti/ziti/compare/v0.27.3...v0.27.4)
+
+# Release 0.27.3
+
+## What's New
+
+* Docker images for `ziti` CLI
+
+* New Raft interaction commands
+ * `raft-leave` allows removal of controllers from the raft cluster
+ * `raft-list` lists all connected controllers and their version/connected status
+ * `fabric raft list-members` same info as the agent command, but over rest
+
+## Component Updates and Bug Fixes
+
+* github.com/openziti/agent: [v1.0.7 -> v1.0.8](https://github.com/openziti/agent/compare/v1.0.7...v1.0.8)
+* github.com/openziti/channel/v2: [v2.0.25 -> v2.0.26](https://github.com/openziti/channel/compare/v2.0.25...v2.0.26)
+* github.com/openziti/edge: [v0.24.95 -> v0.24.115](https://github.com/openziti/edge/compare/v0.24.95...v0.24.115)
+ * [Issue #1292](https://github.com/openziti/edge/issues/1292) - Support alternative tproxy configuration methods
+
+* github.com/openziti/edge-api: v0.25.6 (new)
+* github.com/openziti/fabric: [v0.22.7 -> v0.22.19](https://github.com/openziti/fabric/compare/v0.22.7...v0.22.19)
+ * [Issue #592](https://github.com/openziti/fabric/issues/592) - Incoming "gateway" connections should be logged at a socket level
+ * [Issue #588](https://github.com/openziti/fabric/issues/588) - Make service events more consistent
+ * [Issue #589](https://github.com/openziti/fabric/issues/589) - Add duration to circuit updated and deleted events
+ * [Issue #508](https://github.com/openziti/fabric/issues/508) - Refactor router debug ops for multiple controllers
+
+* github.com/openziti/identity: [v1.0.29 -> v1.0.30](https://github.com/openziti/identity/compare/v1.0.29...v1.0.30)
+* github.com/openziti/runzmd: [v1.0.7 -> v1.0.9](https://github.com/openziti/runzmd/compare/v1.0.7...v1.0.9)
+* github.com/openziti/sdk-golang: [v0.18.21 -> v0.18.26](https://github.com/openziti/sdk-golang/compare/v0.18.21...v0.18.26)
+* github.com/openziti/storage: [v0.1.31 -> v0.1.33](https://github.com/openziti/storage/compare/v0.1.31...v0.1.33)
+* github.com/openziti/transport/v2: [v2.0.49 -> v2.0.50](https://github.com/openziti/transport/compare/v2.0.49...v2.0.50)
+* github.com/openziti/ziti: [v0.27.2 -> v0.27.3](https://github.com/openziti/ziti/compare/v0.27.2...v0.27.3)
+ * [Issue #974](https://github.com/openziti/ziti/issues/974) - tunnel "host" and "proxy" modes shouldn't run the nameserver
+ * [Issue #972](https://github.com/openziti/ziti/issues/972) - tunnel segfault
+
+# Release 0.27.2
+
+## What's New
+
+* Bug fixes
+
+## Component Updates and Bug Fixes
+
+* github.com/openziti/channel/v2: [v2.0.24 -> v2.0.25](https://github.com/openziti/channel/compare/v2.0.24...v2.0.25)
+* github.com/openziti/edge: [v0.24.86 -> v0.24.95](https://github.com/openziti/edge/compare/v0.24.86...v0.24.95)
+ * [Issue #1282](https://github.com/openziti/edge/issues/1282) - Ensure entity count events can be configured to only be emitted on the leader
+ * [Issue #1279](https://github.com/openziti/edge/issues/1279) - Constrain config-type schema to accept only object types
+
+* github.com/openziti/fabric: [v0.22.1 -> v0.22.7](https://github.com/openziti/fabric/compare/v0.22.1...v0.22.7)
+ * [Issue #573](https://github.com/openziti/fabric/issues/573) - Ensure specific events aren't duplicated in raft cluster
+ * [Issue #577](https://github.com/openziti/fabric/issues/577) - JSON Event formatter isn't putting events on their own line
+ * [Issue #571](https://github.com/openziti/fabric/issues/571) - Move raft.advertiseAddress to ctrl for consistency
+ * [Issue #569](https://github.com/openziti/fabric/issues/569) - Support automatic migration and agent based migration
+ * [Issue #567](https://github.com/openziti/fabric/issues/567) - Remove link dropped_msg metrics for closed links
+ * [Issue #566](https://github.com/openziti/fabric/issues/566) - Link listeners aren't properly configuring channel out queue size
+
+* github.com/openziti/foundation/v2: [v2.0.9 -> v2.0.10](https://github.com/openziti/foundation/compare/v2.0.9...v2.0.10)
+* github.com/openziti/identity: [v1.0.28 -> v1.0.29](https://github.com/openziti/identity/compare/v1.0.28...v1.0.29)
+* github.com/openziti/sdk-golang: [v0.18.19 -> v0.18.21](https://github.com/openziti/sdk-golang/compare/v0.18.19...v0.18.21)
+* github.com/openziti/storage: [v0.1.30 -> v0.1.31](https://github.com/openziti/storage/compare/v0.1.30...v0.1.31)
+* github.com/openziti/transport/v2: [v2.0.48 -> v2.0.49](https://github.com/openziti/transport/compare/v2.0.48...v2.0.49)
+* github.com/openziti/metrics: [v1.2.2 -> v1.2.3](https://github.com/openziti/metrics/compare/v1.2.2...v1.2.3)
+* github.com/openziti/ziti: [v0.27.1 -> v0.27.2](https://github.com/openziti/ziti/compare/v0.27.1...v0.27.2)
+ * [Issue #916](https://github.com/openziti/ziti/issues/916) - Allow defining resource tags via json in the cli
+
+
+# Release 0.27.1
+
+## What's New
+
+* Event streaming over websocket
+ * `ziti fabric stream events`
+ * Events use same JSON formatting as the file based streaming
+ * Plain Text formatting removed
+ * Individual streaming of metrics/circuits removed in favor of unified events streaming
+* Improvements to router/tunneler terminator creation
+ * Create terminator requests are now idempotent, so repeated requests will not result in multiple terminators
+ * Create terminator requests are now asynchronous, so responses will no longer get timed out
+ * There is new timer metric from routers, timing how long terminator creates take: `xgress_edge_tunnel.terminator.create_timer`
+
+## Component Updates and Bug Fixes
+
+* github.com/openziti/edge: [v0.24.75 -> v0.24.86](https://github.com/openziti/edge/compare/v0.24.75...v0.24.86)
+ * [Issue #1272](https://github.com/openziti/edge/issues/1272) - Mark xgress_edge and xgress_edge_tunnel created terminators as system entity
+ * [Issue #1270](https://github.com/openziti/edge/issues/1270) - Make xgress_edge_tunnel service hosting more scalabe
+ * [Issue #1268](https://github.com/openziti/edge/issues/1268) - session deletion can get stalled by restarts
+
+* github.com/openziti/fabric: [v0.21.36 -> v0.22.1](https://github.com/openziti/fabric/compare/v0.21.36...v0.22.1)
+ * [Issue #563](https://github.com/openziti/fabric/issues/563) - Allow streaming events over webscocket, replacing stream circuits and stream metrics
+ * [Issue #552](https://github.com/openziti/fabric/issues/552) - Add minimum cost delta for smart routing
+ * [Issue #558](https://github.com/openziti/fabric/issues/558) - Allow terminators to be marked as system entities
+
+* github.com/openziti/ziti: [v0.27.0 -> v0.27.1](https://github.com/openziti/ziti/compare/v0.27.0...v0.27.1)
+ * [Issue #928](https://github.com/openziti/ziti/issues/928) - ziti fabric update terminator should not require setting router
+ * [Issue #929](https://github.com/openziti/ziti/issues/929) - zit fabric list terminators isn't showing cost or dynamic cost
+
+# Release 0.27.0
+
+## What's New
+
+* Ziti CLI
+ * The CLI has been cleaned up and unused, unusable and underused components have been removed or hidden
+ * Add create/delete transit-router CLI commands
+ * [Issue-706](https://github.com/openziti/ziti/issues/706) - Add port check to quickstart
+
+## Ziti CLI
+
+* The update command has been removed. It was non-functional, so this should not affect anyone
+* The adhoc, ping and playbook commands have been removed. These were ansible and vagrant commands that were not widely used.
+* Make the art command hidden, doesn't need to be removed, leave it as an easter egg
+* Move ziti ps command under ziti agent. Remove all ziti ps subcommands, as they already exist as ziti agent subcommands
+* Add `ziti controller` and `ziti router` commands
+ * They should work exactly the same as `ziti-controller` and `ziti router`
+ * The standalone binaries for `ziti-controller` and `ziti-router` are deprecated and will be removed in a future release
+* Add hidden `ziti tunnel` command
+ * Should work exactly the same as `ziti-tunnel`
+ * Is hidden as `ziti-edge-tunnel` is the preferred tunnelling application
+ * The standalone binary `ziti-tunnel` is deprecated and will be removed in a future release
+* The db, log-format and unwrap commands have been moved under a new ops command
+* ziti executable download management has been deprecated
+ * The init and uninstall commands have been removed
+ * The install, upgrade, use and version commands have been hidden and will be hidden once tests using them are updated or replaced
+* The demo and tutorial commands have been moved under the new learn subcommand
+* `ziti edge enroll` now has a verbose option for additional debugging
+* The `ziti edge` CLI now support create/delete transit-router. This allows transit/fabric routers to be provisioned using an enrollment process, rather than requiring certs to be created externally. Note that this requires that the fabric router config file has a `csr` section.
+
+## Component Updates and Bug Fixes
+
+* github.com/openziti/agent: [v1.0.5 -> v1.0.7](https://github.com/openziti/agent/compare/v1.0.5...v1.0.7)
+* github.com/openziti/channel/v2: [v2.0.12 -> v2.0.24](https://github.com/openziti/channel/compare/v2.0.12...v2.0.24)
+* github.com/openziti/edge: [v0.24.36 -> v0.24.75](https://github.com/openziti/edge/compare/v0.24.36...v0.24.75)
+ * [Issue #1253](https://github.com/openziti/edge/issues/1253) - Panic in controller getting hello from edge router
+ * [Issue #1233](https://github.com/openziti/edge/issues/1233) - edge-routers ref link in identities endpoint is incorrectly keyed
+ * [Issue #1234](https://github.com/openziti/edge/issues/1234) - identities missing service-config link ref
+ * [Issue #1232](https://github.com/openziti/edge/issues/1232) - edge management api identity-types endpoint produces incorrect links
+
+* github.com/openziti/fabric: [v0.21.17 -> v0.21.36](https://github.com/openziti/fabric/compare/v0.21.17...v0.21.36)
+ * [Issue #525](https://github.com/openziti/fabric/issues/525) - Update metrics message propagation from router to controller for HA
+
+* github.com/openziti/foundation/v2: [v2.0.7 -> v2.0.9](https://github.com/openziti/foundation/compare/v2.0.7...v2.0.9)
+* github.com/openziti/identity: [v1.0.20 -> v1.0.28](https://github.com/openziti/identity/compare/v1.0.20...v1.0.28)
+* github.com/openziti/runzmd: [v1.0.3 -> v1.0.7](https://github.com/openziti/runzmd/compare/v1.0.3...v1.0.7)
+* github.com/openziti/sdk-golang: [v0.16.146 -> v0.18.19](https://github.com/openziti/sdk-golang/compare/v0.16.146...v0.18.19)
+* github.com/openziti/storage: [v0.1.26 -> v0.1.30](https://github.com/openziti/storage/compare/v0.1.26...v0.1.30)
+* github.com/openziti/transport/v2: [v2.0.38 -> v2.0.48](https://github.com/openziti/transport/compare/v2.0.38...v2.0.48)
+* github.com/openziti/metrics: [v1.1.5 -> v1.2.2](https://github.com/openziti/metrics/compare/v1.1.5...v1.2.2)
+* github.com/openziti/ziti: [v0.26.11 -> v0.26.12](https://github.com/openziti/ziti/compare/v0.26.11...v0.26.12)
+ * [Issue #892](https://github.com/openziti/ziti/issues/892) - Add timeout to ziti agent controller snapshot-db command
+ * [Issue #917](https://github.com/openziti/ziti/issues/917) - ZITI_BIN_ROOT is incorrect in docker env
+ * [Issue #912](https://github.com/openziti/ziti/issues/912) - Binaries not updated in docker-compose env with new image
+ * [Issue #897](https://github.com/openziti/ziti/issues/897) - Add CLI options to manage /edge/v1/transit-routers
+ * [Issue #706](https://github.com/openziti/ziti/issues/706) - Add port check to quickstart
+
+# Older Changelogs
+
+Changelogs for previous releases can be found in [changelogs](./changelogs).
diff --git a/common/enrollment/enroll.go b/common/enrollment/enroll.go
index 8010f9fb4..1ba66d9f9 100644
--- a/common/enrollment/enroll.go
+++ b/common/enrollment/enroll.go
@@ -19,6 +19,8 @@ package enrollment
import (
"encoding/json"
"fmt"
+ "github.com/openziti/identity/engines"
+ "github.com/openziti/sdk-golang/ziti"
"github.com/openziti/ziti/ziti/cmd/common"
"io/ioutil"
"os"
@@ -26,8 +28,6 @@ import (
"github.com/michaelquigley/pfxlog"
"github.com/openziti/foundation/v2/term"
- "github.com/openziti/identity/certtools"
- "github.com/openziti/sdk-golang/ziti/config"
"github.com/openziti/sdk-golang/ziti/enroll"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
@@ -48,7 +48,7 @@ const outFlag = "out"
type EnrollOptions struct {
common.CommonOptions
RemoveJwt bool
- KeyAlg config.KeyAlgVar
+ KeyAlg ziti.KeyAlgVar
JwtPath string
OutputPath string
KeyPath string
@@ -117,9 +117,9 @@ func NewEnrollCommand(p common.OptionsProvider) *cobra.Command {
enrollSubCmd.Flags().VarP(&action.KeyAlg, "keyAlg", "a", "Crypto algorithm to use when generating private key")
var keyDesc = ""
- engines := certtools.ListEngines()
- if len(engines) > 0 {
- keyDesc = fmt.Sprintf("The key to use with the certificate. Optionally specify the engine to use. supported engines: %v", engines)
+ certEngines := engines.ListEngines()
+ if len(certEngines) > 0 {
+ keyDesc = fmt.Sprintf("The key to use with the certificate. Optionally specify the engine to use. supported engines: %v", certEngines)
} else {
keyDesc = "The key to use with the certificate."
}
diff --git a/common/getziti/github.go b/common/getziti/github.go
new file mode 100644
index 000000000..aa56d9186
--- /dev/null
+++ b/common/getziti/github.go
@@ -0,0 +1,213 @@
+package getziti
+
+import (
+ "fmt"
+ "github.com/blang/semver"
+ "github.com/go-resty/resty/v2"
+ "github.com/michaelquigley/pfxlog"
+ "github.com/pkg/errors"
+ "net/http"
+ "os"
+ "path/filepath"
+ "sort"
+ "strings"
+ "time"
+)
+
+// GitHubReleasesData is used to parse the '/releases/latest' response from GitHub
+type GitHubReleasesData struct {
+ Version string `json:"tag_name"`
+ SemVer semver.Version
+ Assets []struct {
+ BrowserDownloadURL string `json:"browser_download_url"`
+ }
+}
+
+func (self *GitHubReleasesData) GetDownloadUrl(appName string, targetOS, targetArch string) (string, error) {
+ arches := []string{targetArch}
+ if strings.ToLower(targetArch) == "amd64" {
+ arches = append(arches, "x86_64")
+ }
+
+ for _, asset := range self.Assets {
+ ok := false
+ for _, arch := range arches {
+ if strings.Contains(strings.ToLower(asset.BrowserDownloadURL), arch) {
+ ok = true
+ }
+ }
+
+ ok = ok && strings.Contains(strings.ToLower(asset.BrowserDownloadURL), targetOS)
+ if ok {
+ return asset.BrowserDownloadURL, nil
+ }
+ }
+
+ return "", errors.Errorf("no download URL found for os/arch %s/%s for '%s'", targetOS, targetArch, appName)
+}
+
+func NewClient() *resty.Client {
+ // Use a 2-second timeout with a retry count of 5
+ return resty.
+ New().
+ SetTimeout(2 * time.Second).
+ SetRetryCount(5).
+ SetRedirectPolicy(resty.FlexibleRedirectPolicy(15))
+}
+
+func getRequest(verbose bool) *resty.Request {
+ return NewClient().
+ SetDebug(verbose).
+ R()
+}
+
+func GetLatestGitHubReleaseVersion(zitiApp string, verbose bool) (semver.Version, error) {
+ var result semver.Version
+ release, err := GetHighestVersionGitHubReleaseInfo(zitiApp, verbose)
+ if release != nil {
+ result = release.SemVer
+ }
+ return result, err
+}
+
+func GetHighestVersionGitHubReleaseInfo(appName string, verbose bool) (*GitHubReleasesData, error) {
+ resp, err := getRequest(verbose).
+ SetQueryParams(map[string]string{}).
+ SetHeader("Accept", "application/vnd.github.v3+json").
+ SetResult([]*GitHubReleasesData{}).
+ Get("https://api.github.com/repos/openziti/" + appName + "/releases")
+
+ if err != nil {
+ return nil, errors.Wrapf(err, "unable to get latest version for '%s'", appName)
+ }
+
+ if resp.StatusCode() == http.StatusNotFound {
+ return nil, errors.Errorf("unable to get latest version for '%s'; Not Found (invalid URL)", appName)
+ }
+ if resp.StatusCode() != http.StatusOK {
+ return nil, errors.Errorf("unable to get latest version for '%s'; return status=%s", appName, resp.Status())
+ }
+
+ result := *resp.Result().(*[]*GitHubReleasesData)
+ return GetHighestVersionRelease(appName, result)
+}
+
+func GetHighestVersionRelease(appName string, releases []*GitHubReleasesData) (*GitHubReleasesData, error) {
+ for _, release := range releases {
+ v, err := semver.ParseTolerant(release.Version)
+ if err != nil {
+ return nil, errors.Wrapf(err, "unable to parse version %v for '%v'", release.Version, appName)
+ }
+ release.SemVer = v
+ }
+ sort.Slice(releases, func(i, j int) bool {
+ return releases[i].SemVer.GT(releases[j].SemVer) // sort in reverse order
+ })
+ if len(releases) == 0 {
+ return nil, errors.Errorf("no releases found for '%v'", appName)
+ }
+ return releases[0], nil
+}
+
+func GetLatestGitHubReleaseAsset(appName string, appGitHub string, version string, verbose bool) (*GitHubReleasesData, error) {
+ if version != "latest" {
+ if appName == "ziti-prox-c" {
+ version = strings.TrimPrefix(version, "v")
+ }
+
+ if appName == "ziti-edge-tunnel" {
+ if !strings.HasPrefix(version, "v") {
+ version = "v" + version
+ }
+ }
+ }
+
+ if version != "latest " {
+ version = "tags/" + version
+ }
+
+ resp, err := getRequest(verbose).
+ SetQueryParams(map[string]string{}).
+ SetHeader("Accept", "application/vnd.github.v3+json").
+ SetResult(&GitHubReleasesData{}).
+ Get("https://api.github.com/repos/openziti/" + appGitHub + "/releases/" + version)
+
+ if err != nil {
+ return nil, fmt.Errorf("unable to get latest version for '%s'; %s", appName, err)
+ }
+
+ if resp.StatusCode() == http.StatusNotFound {
+ return nil, fmt.Errorf("unable to get latest version for '%s'; Not Found", appName)
+ }
+ if resp.StatusCode() != http.StatusOK {
+ return nil, fmt.Errorf("unable to get latest version for '%s'; %s", appName, resp.Status())
+ }
+
+ result := resp.Result().(*GitHubReleasesData)
+ return result, nil
+}
+
+// DownloadGitHubReleaseAsset will download a file from the given GitHUb release area
+func DownloadGitHubReleaseAsset(fullUrl string, filepath string) (err error) {
+ resp, err := getRequest(false).
+ SetOutput(filepath).
+ Get(fullUrl)
+
+ if err != nil {
+ return fmt.Errorf("unable to download '%s', %s", fullUrl, err)
+ }
+
+ if resp.IsError() {
+ return fmt.Errorf("unable to download file, error HTTP status code [%d] returned for url [%s]", resp.StatusCode(), fullUrl)
+ }
+
+ return nil
+}
+
+func FindVersionAndInstallGitHubRelease(zitiApp string, zitiAppGitHub string, targetOS, targetArch string, binDir string, version string, verbose bool) error {
+ if version != "" {
+ if _, err := semver.Make(strings.TrimPrefix(version, "v")); err != nil {
+ return err
+ }
+ } else {
+ version = "latest"
+ }
+
+ release, err := GetLatestGitHubReleaseAsset(zitiApp, zitiAppGitHub, version, verbose)
+ if err != nil {
+ return err
+ }
+ return InstallGitHubRelease(zitiApp, release, binDir, targetOS, targetArch)
+}
+
+func InstallGitHubRelease(zitiApp string, release *GitHubReleasesData, binDir string, targetOS, targetArch string) error {
+ fileName := zitiApp
+ if targetOS == "windows" {
+ fileName += ".exe"
+ }
+
+ fullPath := filepath.Join(binDir, fileName)
+ ext := ".zip"
+ zipFile := fullPath + ext
+
+ releaseUrl, err := release.GetDownloadUrl(zitiApp, targetOS, targetArch)
+ if err != nil {
+ return err
+ }
+
+ err = DownloadGitHubReleaseAsset(releaseUrl, zipFile)
+ if err != nil {
+ return err
+ }
+
+ err = Unzip(zipFile, binDir)
+ if err != nil {
+ return err
+ }
+ err = os.Remove(zipFile)
+ if err != nil {
+ return err
+ }
+ pfxlog.Logger().Infof("Successfully installed '%s' version '%s'", zitiApp, release.Version)
+ return os.Chmod(fullPath, 0755)
+}
diff --git a/common/getziti/install_ziti_edge_tunnel.go b/common/getziti/install_ziti_edge_tunnel.go
new file mode 100644
index 000000000..bf5770597
--- /dev/null
+++ b/common/getziti/install_ziti_edge_tunnel.go
@@ -0,0 +1,26 @@
+package getziti
+
+import (
+ "fmt"
+ "github.com/blang/semver"
+ c "github.com/openziti/ziti/ziti/constants"
+ "strings"
+)
+
+func InstallZitiEdgeTunnel(targetVersion, targetOS, targetArch, binDir string, verbose bool) error {
+ var newVersion semver.Version
+
+ if targetVersion != "" {
+ newVersion = semver.MustParse(strings.TrimPrefix(targetVersion, "v"))
+ } else {
+ v, err := GetLatestGitHubReleaseVersion(c.ZITI_EDGE_TUNNEL_GITHUB, verbose)
+ if err != nil {
+ return err
+ }
+ newVersion = v
+ }
+
+ fmt.Println("Attempting to install '" + c.ZITI_EDGE_TUNNEL + "' version: " + newVersion.String())
+ return FindVersionAndInstallGitHubRelease(
+ c.ZITI_EDGE_TUNNEL, c.ZITI_EDGE_TUNNEL_GITHUB, targetOS, targetArch, binDir, newVersion.String(), verbose)
+}
diff --git a/common/getziti/unzip.go b/common/getziti/unzip.go
new file mode 100644
index 000000000..7770442da
--- /dev/null
+++ b/common/getziti/unzip.go
@@ -0,0 +1,74 @@
+package getziti
+
+import (
+ "archive/zip"
+ "fmt"
+ "io"
+ "os"
+ "path/filepath"
+ "strings"
+)
+
+func Unzip(src, dest string) error {
+ r, err := zip.OpenReader(src)
+ if err != nil {
+ return err
+ }
+ defer func() {
+ if err := r.Close(); err != nil {
+ panic(err)
+ }
+ }()
+
+ os.MkdirAll(dest, 0755)
+
+ // Closure to address file descriptors issue with all the deferred .Close() methods
+ extractAndWriteFile := func(f *zip.File) error {
+ rc, err := f.Open()
+ if err != nil {
+ return err
+ }
+ defer func() {
+ if err := rc.Close(); err != nil {
+ panic(err)
+ }
+ }()
+
+ path := filepath.Join(dest, f.Name)
+
+ // Check for ZipSlip (Directory traversal)
+ if !strings.HasPrefix(path, filepath.Clean(dest)+string(os.PathSeparator)) {
+ return fmt.Errorf("illegal file path: %s", path)
+ }
+
+ if f.FileInfo().IsDir() {
+ os.MkdirAll(path, f.Mode())
+ } else {
+ os.MkdirAll(filepath.Dir(path), f.Mode())
+ f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
+ if err != nil {
+ return err
+ }
+ defer func() {
+ if err := f.Close(); err != nil {
+ panic(err)
+ }
+ }()
+
+ _, err = io.Copy(f, rc)
+ if err != nil {
+ return err
+ }
+ }
+ return nil
+ }
+
+ for _, f := range r.File {
+ err := extractAndWriteFile(f)
+ if err != nil {
+ return err
+ }
+ }
+
+ return nil
+}
diff --git a/docker-images/ziti-cli/Dockerfile b/docker-images/ziti-cli/Dockerfile
index 1e0967260..0a006e7ce 100644
--- a/docker-images/ziti-cli/Dockerfile
+++ b/docker-images/ziti-cli/Dockerfile
@@ -18,6 +18,9 @@ ARG TARGETOS
# e.g. arm64
ARG TARGETARCH
+ARG ZUID=2171
+ARG ZGID=2171
+
### Required OpenShift Labels
LABEL name="openziti/ziti-cli" \
maintainer="developers@openziti.org" \
@@ -28,7 +31,7 @@ LABEL name="openziti/ziti-cli" \
USER root
### install packages
-RUN INSTALL_PKGS="python38 python38-pip tar" && \
+RUN INSTALL_PKGS="python38 python38-pip tar bash-completion vim-minimal less shadow-utils" && \
microdnf -y update --setopt=install_weak_deps=0 --setopt=tsflags=nodocs && \
microdnf -y install --setopt=install_weak_deps=0 --setopt=tsflags=nodocs ${INSTALL_PKGS}
@@ -40,15 +43,23 @@ RUN INSTALL_PKGS="python38 python38-pip tar" && \
COPY --from=bitnami-kubectl /opt/bitnami/kubectl/bin/kubectl /usr/local/bin/
### add license in the path prescribed by OpenShift
-RUN mkdir -m0755 /licenses
+RUN mkdir -p -m0755 /licenses
COPY ./LICENSE /licenses/apache.txt
+RUN groupadd --gid ${ZGID} ziggy \
+ && adduser --uid ${ZUID} --gid ${ZGID} --system --home /home/ziggy --shell /bin/bash ziggy \
+ && mkdir -p /home/ziggy \
+ && chown -R ${ZUID}:${ZGID} /home/ziggy \
+ && chmod -R g+rwX /home/ziggy
RUN mkdir -p /usr/local/bin
COPY ${ARTIFACTS_DIR}/${TARGETARCH}/${TARGETOS}/ziti /usr/local/bin/
RUN chmod 0755 /usr/local/bin/ziti
+RUN /usr/local/bin/ziti completion bash > /etc/bash_completion.d/ziti_cli
+
COPY ${DOCKER_BUILD_DIR}/entrypoint.sh /
RUN chmod +x /entrypoint.sh
-USER nobody
+USER ziggy
+COPY ${DOCKER_BUILD_DIR}/bashrc /home/ziggy/.bashrc
ENTRYPOINT [ "/entrypoint.sh" ]
CMD [ "ziti" ]
diff --git a/docker-images/ziti-cli/bashrc b/docker-images/ziti-cli/bashrc
new file mode 100644
index 000000000..82f366d9e
--- /dev/null
+++ b/docker-images/ziti-cli/bashrc
@@ -0,0 +1,21 @@
+# this script addresses the problem of /etc/profile not being sourced
+# because ziggy's BASH shell is not a "login shell." /etc/profile is
+# intended to be sourced only once by the first shell, but it never runs
+# automatically upon login because the first shell isn't invoked as a login
+# shell. .bashrc runs for all interactive shells, so we can use it to
+# replace the current shell process with a login shell.
+
+set -euo pipefail
+USER="${USER:-$( id -u )}"
+SHELL="${SHELL:-$( getent passwd "${USER}" | cut -d : -f 7 )}"
+if [ -z "${SHELL}" ] ; then
+ echo 1>&2 "${0}: can't set SHELL; giving up"
+ exit 1
+fi
+HOME="${HOME:-$( getent passwd "${USER}" | cut -d : -f 6 )}"
+if [ -z "${HOME}" ] ; then
+ echo 1>&2 "${0}: can't set HOME; giving up"
+ exit 1
+fi
+cd "${HOME}"
+SHELL="${SHELL}" exec -a "-${SHELL##*/}" "${SHELL}"
diff --git a/docker-images/ziti-controller/Dockerfile b/docker-images/ziti-controller/Dockerfile
index 900b59ab5..71fe158fd 100644
--- a/docker-images/ziti-controller/Dockerfile
+++ b/docker-images/ziti-controller/Dockerfile
@@ -1,6 +1,7 @@
ARG ZITI_VERSION="latest"
+ARG ZITI_CLI_IMAGE="docker.io/openziti/ziti-cli"
# this builds docker.io/openziti/ziti-controller
-FROM docker.io/openziti/ziti-cli:${ZITI_VERSION}
+FROM ${ZITI_CLI_IMAGE}:${ZITI_VERSION}
# This build stage grabs artifacts that are copied into the final image.
# It uses the same base as the final image to maximize docker cache hits.
@@ -15,6 +16,6 @@ LABEL name="openziti/ziti-controller" \
USER root
COPY ./entrypoint.sh /
RUN chmod +x /entrypoint.sh
-USER nobody
+USER ziggy
ENTRYPOINT [ "/entrypoint.sh" ]
CMD [ "run" ]
diff --git a/docker-images/ziti-router/Dockerfile b/docker-images/ziti-router/Dockerfile
index 5dba0585f..eb6b1c682 100644
--- a/docker-images/ziti-router/Dockerfile
+++ b/docker-images/ziti-router/Dockerfile
@@ -1,6 +1,7 @@
ARG ZITI_VERSION="latest"
+ARG ZITI_CLI_IMAGE="docker.io/openziti/ziti-cli"
# this builds docker.io/openziti/ziti-router
-FROM docker.io/openziti/ziti-cli:${ZITI_VERSION}
+FROM ${ZITI_CLI_IMAGE}:${ZITI_VERSION}
# This build stage grabs artifacts that are copied into the final image.
# It uses the same base as the final image to maximize docker cache hits.
@@ -15,6 +16,6 @@ LABEL name="openziti/ziti-router" \
USER root
COPY ./entrypoint.sh /
RUN chmod +x /entrypoint.sh
-USER nobody
+USER ziggy
ENTRYPOINT [ "/entrypoint.sh" ]
CMD [ "run" ]
diff --git a/docker-images/ziti-tunnel/Dockerfile b/docker-images/ziti-tunnel/Dockerfile
index f041bf102..a8139dee4 100644
--- a/docker-images/ziti-tunnel/Dockerfile
+++ b/docker-images/ziti-tunnel/Dockerfile
@@ -1,6 +1,8 @@
ARG ZITI_VERSION="latest"
+ARG ZITI_CLI_IMAGE="docker.io/openziti/ziti-cli"
# this builds docker.io/openziti/ziti-tunnel, the legacy tunneler. The preferred tunneler is openziti/ziti-edge-tunnel documented in https://docs.openziti.io/docs/reference/tunnelers/linux/container/
-FROM docker.io/openziti/ziti-cli:${ZITI_VERSION}
+# this builds docker.io/openziti/ziti-router
+FROM ${ZITI_CLI_IMAGE}:${ZITI_VERSION}
# This build stage grabs artifacts that are copied into the final image.
# It uses the same base as the final image to maximize docker cache hits.
diff --git a/etc/ctrl.with.edge.yml b/etc/ctrl.with.edge.yml
index db3c6d02f..fb4a90fe1 100644
--- a/etc/ctrl.with.edge.yml
+++ b/etc/ctrl.with.edge.yml
@@ -50,6 +50,10 @@ ctrl:
#events:
# jsonLogger:
# subscriptions:
+# - type: entityChange
+# include:
+# - services
+# - identities
# - type: fabric.circuits
# - type: fabric.links
# - type: fabric.routers
@@ -60,6 +64,10 @@ ctrl:
# - type: edge.sessions
# - type: edge.apiSessions
# - type: fabric.usage
+# version: 3
+# include:
+# - ingress.rx
+# - egress.rx
# - type: services
# - type: edge.entityCounts
# interval: 5s
@@ -67,6 +75,19 @@ ctrl:
# type: file
# format: json
# path: /tmp/ziti-events.log
+# usageLogger:
+# subscriptions:
+# - type: fabric.usage
+# interval: 5s
+# handler:
+# type: amqp
+# format: json
+# url: "amqp://localhost:5672"
+# queue: ziti
+# durable: true //default:true
+# autoDelete: false //default:false
+# exclusive: false //default:false
+# noWait: false //default:false
# xctrl_example
#
diff --git a/go.mod b/go.mod
index 3a7d9d9e0..726e1bf45 100644
--- a/go.mod
+++ b/go.mod
@@ -1,6 +1,6 @@
module github.com/openziti/ziti
-go 1.19
+go 1.20
require (
github.com/Jeffail/gabs v1.4.0
@@ -11,39 +11,39 @@ require (
github.com/fatih/color v1.15.0
github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa
github.com/go-acme/lego/v4 v4.2.0
- github.com/go-openapi/runtime v0.25.0
+ github.com/go-openapi/runtime v0.26.0
github.com/go-openapi/strfmt v0.21.7
+ github.com/go-resty/resty/v2 v2.7.0
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b
github.com/golang/protobuf v1.5.2
github.com/google/go-cmp v0.5.9
github.com/gorilla/websocket v1.5.0
github.com/jedib0t/go-pretty/v6 v6.4.0
- github.com/keybase/go-ps v0.0.0-20190827175125-91aafc93ba19
github.com/michaelquigley/pfxlog v0.6.10
- github.com/openziti/agent v1.0.10
- github.com/openziti/channel/v2 v2.0.58
- github.com/openziti/edge v0.24.239
- github.com/openziti/edge-api v0.25.11
- github.com/openziti/fabric v0.22.87
- github.com/openziti/foundation/v2 v2.0.21
- github.com/openziti/identity v1.0.45
- github.com/openziti/runzmd v1.0.20
- github.com/openziti/sdk-golang v0.18.76
- github.com/openziti/storage v0.1.49
- github.com/openziti/transport/v2 v2.0.72
+ 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/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/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/xweb/v2 v2.0.2
github.com/openziti/ziti-db-explorer v1.1.1
github.com/pkg/errors v0.9.1
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475
github.com/russross/blackfriday v1.5.2
- github.com/shirou/gopsutil/v3 v3.23.3
- github.com/sirupsen/logrus v1.9.0
+ github.com/shirou/gopsutil/v3 v3.23.4
+ github.com/sirupsen/logrus v1.9.2
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.2
+ github.com/stretchr/testify v1.8.3
go.etcd.io/bbolt v1.3.7
- golang.org/x/net v0.9.0
+ golang.org/x/net v0.10.0
google.golang.org/grpc v1.42.0
google.golang.org/protobuf v1.30.0
gopkg.in/AlecAivazis/survey.v1 v1.8.7
@@ -66,15 +66,15 @@ require (
github.com/biogo/store v0.0.0-20200525035639-8c94ae1e7c9c // 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/creack/pty v1.1.11 // 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/docker/distribution v2.8.1+incompatible // indirect
+ github.com/dlclark/regexp2 v1.10.0 // indirect
+ github.com/docker/distribution v2.8.2+incompatible // indirect
github.com/docker/go-connections v0.4.0 // indirect
github.com/docker/go-units v0.5.0 // indirect
github.com/ef-ds/deque v1.0.4 // indirect
@@ -90,10 +90,9 @@ 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/spec v0.20.8 // indirect
+ github.com/go-openapi/spec v0.20.9 // indirect
github.com/go-openapi/swag v0.22.3 // indirect
github.com/go-openapi/validate v0.22.1 // indirect
- github.com/go-resty/resty/v2 v2.7.0 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang-jwt/jwt v3.2.2+incompatible // indirect
github.com/gomarkdown/markdown v0.0.0-20230322041520-c84983bdbf2a // indirect
@@ -106,15 +105,16 @@ 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/jessevdk/go-flags v1.5.0 // indirect
github.com/jinzhu/copier v0.3.5 // 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/klauspost/compress v1.16.5 // indirect
github.com/kr/pty v1.1.8 // indirect
github.com/kyokomi/emoji/v2 v2.2.12 // indirect
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
@@ -123,27 +123,27 @@ 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/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/moby/term v0.0.0-20221120202655-abb19827d345 // indirect
github.com/morikuni/aec v1.0.0 // indirect
github.com/natefinch/lumberjack v2.0.0+incompatible // indirect
- github.com/netfoundry/secretstream v0.1.5 // indirect
github.com/oklog/ulid v1.3.1 // indirect
github.com/opencontainers/go-digest v1.0.0 // indirect
github.com/opencontainers/image-spec v1.0.2 // indirect
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.19 // indirect
+ github.com/openziti/metrics v1.2.25 // 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
github.com/parallaxsecond/parsec-client-go v0.0.0-20221025095442-f0a77d263cf9 // indirect
@@ -151,9 +151,10 @@ 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/rivo/uniseg v0.4.4 // indirect
github.com/rodaine/table v1.0.1 // indirect
- github.com/shoenig/go-m1cpu v0.1.5 // 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
@@ -168,22 +169,24 @@ 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.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
- golang.org/x/crypto v0.8.0 // indirect
- golang.org/x/exp v0.0.0-20230321023759-10a507213a29 // 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-20230522175609-2e198f4a06a1 // indirect
golang.org/x/image v0.7.0 // indirect
golang.org/x/mod v0.8.0 // indirect
- golang.org/x/sync v0.1.0 // indirect
- golang.org/x/sys v0.7.0 // indirect
- golang.org/x/term v0.7.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/genproto v0.0.0-20211208223120-3a66f561d7aa // indirect
gopkg.in/ini.v1 v1.66.2 // indirect
gopkg.in/square/go-jose.v2 v2.5.1 // indirect
gotest.tools/v3 v3.4.0 // indirect
+ nhooyr.io/websocket v1.8.7 // indirect
)
diff --git a/go.sum b/go.sum
index 491946f31..8a255f275 100644
--- a/go.sum
+++ b/go.sum
@@ -135,8 +135,8 @@ github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7
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 v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
@@ -191,11 +191,11 @@ 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/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68=
-github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
+github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8=
+github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
github.com/docker/docker v20.10.24+incompatible h1:Ugvxm7a8+Gz6vqQYQQ2W7GYq5EUPaAiuPgIfVyI3dYE=
github.com/docker/docker v20.10.24+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ=
@@ -243,6 +243,10 @@ github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa h1:RDBNVkRviHZtvD
github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA=
github.com/getkin/kin-openapi v0.13.0/go.mod h1:WGRs2ZMM1Q8LR1QBEwUxC6RJEfaBcD0s+pcEVXFuAjw=
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/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
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=
@@ -282,12 +286,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=
@@ -300,6 +304,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=
@@ -329,6 +340,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=
@@ -432,6 +449,7 @@ github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2z
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.4.2/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=
@@ -480,8 +498,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=
@@ -509,13 +527,14 @@ github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqx
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
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=
@@ -526,12 +545,13 @@ 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.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
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=
@@ -556,6 +576,8 @@ github.com/labbsr0x/bindman-dns-webhook v1.0.2/go.mod h1:p6b+VCXIR8NYKpDr8/dg1HK
github.com/labbsr0x/goh v1.0.1/go.mod h1:8K2UhVoaWXcCU7Lxoa2omWnC8gyW8px7/lmO61c027w=
github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g=
github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k=
+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/lucas-clemente/quic-go v0.18.0/go.mod h1:yXttHsSNxQi8AWijC/vLP+OJczXqzHSOcJrM5ITUlCg=
@@ -603,8 +625,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=
@@ -617,10 +639,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=
@@ -630,8 +652,8 @@ github.com/michaelquigley/pfxlog v0.6.10/go.mod h1:gEiNTfKEX6cJHSwRpOuqBpc8oYrlh
github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4=
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=
@@ -652,9 +674,11 @@ github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR
github.com/moby/term v0.0.0-20221120202655-abb19827d345 h1:J9c53/kxIH+2nTKBEfZYFMlhghtHpIHSXpm5VRGHSnU=
github.com/moby/term v0.0.0-20221120202655-abb19827d345/go.mod h1:15ce4BGCFxt7I5NQKT+HV0yEDxmf6fSysfEDiVo3zFM=
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/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
@@ -665,8 +689,6 @@ github.com/natefinch/lumberjack v2.0.0+incompatible/go.mod h1:Wi9p2TTF5DG5oU+6Yf
github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms=
github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo=
github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM=
-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=
@@ -697,34 +719,36 @@ github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8=
github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
-github.com/openziti/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/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/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.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/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.21 h1:3EDDmSunsbd2DlULuY/vqj12LHRZOknH/m3lf6Ws5Nw=
-github.com/openziti/foundation/v2 v2.0.21/go.mod h1:02GW3jFSSlfLwYwuTIldP/S4w7eCKqlzL6ajFSGHNPA=
-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/edge v0.24.309 h1:EGZZ7GqI6/2y8zoNc0Tb11DpHtDG3YTNMUChulFTDL4=
+github.com/openziti/edge v0.24.309/go.mod h1:UDlCvgpuzQ6FFugSK0Sim7214c1O+7ahiOX5tvhJaP4=
+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/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.25 h1:acD/J/DcWgfbhmKS/s3HDvpt/1WS3QBZPeeGBZHbj94=
+github.com/openziti/metrics v1.2.25/go.mod h1:s2r1FS+wUdJ3LXp1qJK6777iQ8gPWXE2HFfDsiJo1/Y=
+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/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/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=
@@ -793,6 +817,8 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT
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/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
+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=
@@ -816,13 +842,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/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY=
github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM=
github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0=
@@ -852,8 +878,8 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
-github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
-github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
+github.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=
+github.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0=
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M=
github.com/skratchdot/open-golang v0.0.0-20160302144031-75fb7ed4208c/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog=
@@ -906,8 +932,9 @@ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1F
github.com/stretchr/testify v1.7.4/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
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 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
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/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=
@@ -923,6 +950,10 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1
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=
@@ -952,8 +983,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.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ=
go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw=
@@ -963,8 +995,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.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA=
@@ -977,15 +1009,19 @@ 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.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.4.0/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.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
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=
@@ -1018,8 +1054,8 @@ golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPh
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
-golang.org/x/crypto v0.8.0 h1:pd9TJtTueMTVQXzk8E2XESSMQDj/U7OUu0PqJqPXQjQ=
-golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
+golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g=
+golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -1030,8 +1066,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=
@@ -1121,8 +1157,8 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
-golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM=
-golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
+golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
+golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -1151,8 +1187,9 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI=
+golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180606202747-9527bec2660b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180622082034-63fc586f45fe/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1241,14 +1278,15 @@ 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 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
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=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
-golang.org/x/term v0.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ=
-golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
+golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols=
+golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1517,6 +1555,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=
diff --git a/network-tests/go.mod b/network-tests/go.mod
index 5705fc89d..e4acc2949 100644
--- a/network-tests/go.mod
+++ b/network-tests/go.mod
@@ -3,25 +3,29 @@ module github.com/openziti/ziti/network-tests
go 1.19
require (
- github.com/openziti/fablab v0.4.23
- github.com/openziti/sdk-golang v0.18.26
- github.com/openziti/zitilab v0.1.21
- github.com/sirupsen/logrus v1.9.0
- github.com/spf13/cobra v1.6.1
+ github.com/michaelquigley/pfxlog v0.6.10
+ github.com/openziti/edge v0.24.239
+ github.com/openziti/fablab v0.4.52
+ github.com/openziti/sdk-golang v0.18.76
+ github.com/openziti/zitilab v0.1.60
+ 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
)
require (
github.com/AppsFlyer/go-sundheit v0.5.0 // indirect
github.com/Jeffail/gabs v1.4.0 // indirect
- github.com/Jeffail/gabs/v2 v2.6.1 // 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
github.com/alecthomas/chroma v0.10.0 // indirect
- github.com/andybalholm/brotli v1.0.4 // indirect
+ github.com/andybalholm/brotli v1.0.5 // indirect
github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20211106181442-e4c1a74c66bd // indirect
- github.com/armon/go-metrics v0.3.10 // indirect
- github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d // indirect
+ github.com/armon/go-metrics v0.4.1 // indirect
+ github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
github.com/aws/aws-sdk-go v1.44.118 // indirect
github.com/biogo/store v0.0.0-20200525035639-8c94ae1e7c9c // indirect
github.com/blang/semver v3.5.1+incompatible // indirect
@@ -33,17 +37,17 @@ require (
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.8.0 // indirect
+ github.com/dlclark/regexp2 v1.9.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
github.com/emirpasic/gods v1.18.1 // indirect
- github.com/fatih/color v1.14.1 // indirect
+ github.com/fatih/color v1.15.0 // indirect
github.com/felixge/httpsnoop v1.0.1 // indirect
github.com/fsnotify/fsnotify v1.6.0 // indirect
github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa // indirect
github.com/go-acme/lego/v4 v4.2.0 // indirect
- github.com/go-logr/logr v1.2.3 // indirect
+ github.com/go-logr/logr v1.2.4 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-ole/go-ole v1.2.6 // indirect
github.com/go-openapi/analysis v0.21.4 // indirect
@@ -53,90 +57,89 @@ require (
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/strfmt v0.21.3 // 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
github.com/go-resty/resty/v2 v2.7.0 // indirect
github.com/golang-jwt/jwt v3.2.2+incompatible // indirect
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect
github.com/golang/protobuf v1.5.2 // indirect
- github.com/gomarkdown/markdown v0.0.0-20221013030248-663e2500819c // indirect
+ github.com/gomarkdown/markdown v0.0.0-20230322041520-c84983bdbf2a // indirect
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/websocket v1.5.0 // indirect
- github.com/hashicorp/go-hclog v1.4.0 // indirect
+ github.com/hashicorp/go-hclog v1.5.0 // indirect
github.com/hashicorp/go-immutable-radix v1.3.1 // indirect
github.com/hashicorp/go-msgpack v0.5.5 // indirect
github.com/hashicorp/golang-lru v0.6.0 // indirect
- github.com/hashicorp/golang-lru/v2 v2.0.1 // indirect
+ github.com/hashicorp/golang-lru/v2 v2.0.2 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
- github.com/hashicorp/raft v1.3.11 // indirect
+ github.com/hashicorp/raft v1.4.0 // indirect
github.com/hashicorp/raft-boltdb v0.0.0-20220329195025-15018e9b97e0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
- github.com/jedib0t/go-pretty/v6 v6.4.4 // 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/kataras/go-events v0.0.3-0.20201007151548-c411dc70c0a6 // 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/kr/fs v0.1.0 // indirect
- github.com/kyokomi/emoji/v2 v2.2.11 // indirect
+ github.com/kyokomi/emoji/v2 v2.2.12 // indirect
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
github.com/lucsky/cuid v1.2.1 // indirect
- github.com/lufia/plan9stats v0.0.0-20230110061619-bbe2e5e100de // indirect
+ github.com/lufia/plan9stats v0.0.0-20230326075908-cb1d2100619a // indirect
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.17 // indirect
+ github.com/mattn/go-isatty v0.0.18 // 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/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect
github.com/michaelquigley/figlet v0.0.0-20191015203154-054d06db54b4 // indirect
- github.com/michaelquigley/pfxlog v0.6.9 // indirect
- github.com/miekg/dns v1.1.50 // indirect
+ github.com/miekg/dns v1.1.53 // 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.2 // 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.8 // indirect
- github.com/openziti/channel/v2 v2.0.26 // indirect
- github.com/openziti/edge v0.24.95 // indirect
- github.com/openziti/fabric v0.22.7 // indirect
- github.com/openziti/foundation/v2 v2.0.10 // indirect
- github.com/openziti/identity v1.0.30 // indirect
- github.com/openziti/jwks v1.0.2 // indirect
- github.com/openziti/metrics v1.2.3 // indirect
- github.com/openziti/runzmd v1.0.9 // indirect
- github.com/openziti/storage v0.1.33 // indirect
- github.com/openziti/transport/v2 v2.0.50 // 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/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/x509-claims v1.0.3 // indirect
github.com/openziti/xweb/v2 v2.0.2 // indirect
- github.com/openziti/ziti v0.27.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
github.com/pelletier/go-toml v1.9.4 // indirect
- github.com/pkg/errors v0.9.1 // indirect
github.com/pkg/sftp v1.13.5 // indirect
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/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect
- github.com/rivo/uniseg v0.4.3 // 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.1 // indirect
+ github.com/shirou/gopsutil/v3 v3.23.3 // indirect
+ github.com/shoenig/go-m1cpu v0.1.5 // 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
@@ -144,7 +147,6 @@ require (
github.com/spf13/jwalterweatherman v1.1.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/spf13/viper v1.10.0 // indirect
- github.com/stretchr/testify v1.8.1 // indirect
github.com/subosito/gotenv v1.2.0 // indirect
github.com/teris-io/shortid v0.0.0-20201117134242-e59966efd125 // indirect
github.com/tklauser/go-sysconf v0.3.11 // indirect
@@ -156,21 +158,21 @@ require (
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.1 // indirect
+ go.mongodb.org/mongo-driver v1.11.4 // indirect
go.mozilla.org/pkcs7 v0.0.0-20210826202110-33d05740a352 // indirect
- go.opentelemetry.io/otel v1.11.2 // indirect
- go.opentelemetry.io/otel/trace v1.11.2 // indirect
- golang.org/x/crypto v0.5.0 // indirect
- golang.org/x/exp v0.0.0-20230202163644-54bba9f4231b // indirect
- golang.org/x/image v0.5.0 // indirect
- golang.org/x/mod v0.6.0 // indirect
- golang.org/x/net v0.7.0 // indirect
- golang.org/x/sync v0.1.0 // indirect
- golang.org/x/sys v0.5.0 // indirect
- golang.org/x/term v0.5.0 // indirect
- golang.org/x/text v0.7.0 // indirect
- golang.org/x/tools v0.2.0 // indirect
- google.golang.org/protobuf v1.28.1 // indirect
+ go.opentelemetry.io/otel v1.14.0 // indirect
+ go.opentelemetry.io/otel/trace v1.14.0 // indirect
+ golang.org/x/crypto v0.9.0 // indirect
+ golang.org/x/exp v0.0.0-20230321023759-10a507213a29 // 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
diff --git a/network-tests/go.sum b/network-tests/go.sum
index 5146eb36f..45a9d74a8 100644
--- a/network-tests/go.sum
+++ b/network-tests/go.sum
@@ -60,8 +60,8 @@ github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3
github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
github.com/Jeffail/gabs v1.4.0 h1://5fYRRTq1edjfIrQGvdkcd22pkYUrHZ5YC/H2GJVAo=
github.com/Jeffail/gabs v1.4.0/go.mod h1:6xMvQMK4k33lb7GUUpaAPh6nKMmemQeg5d4gn7/bOXc=
-github.com/Jeffail/gabs/v2 v2.6.1 h1:wwbE6nTQTwIMsMxzi6XFQQYRZ6wDc1mSdxoAN+9U4Gk=
-github.com/Jeffail/gabs/v2 v2.6.1/go.mod h1:xCn81vdHKxFUuWWAaD5jCTQDNPBMh5pPs9IJ+NcziBI=
+github.com/Jeffail/gabs/v2 v2.7.0 h1:Y2edYaTcE8ZpRsR2AtmPu5xQdFDIthFG0jYhu5PY8kg=
+github.com/Jeffail/gabs/v2 v2.7.0/go.mod h1:dp5ocw1FvBBQYssgHsG7I1WYsiLRtkUaB1FEtSwvNUw=
github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ=
github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE=
github.com/MichaelMure/go-term-markdown v0.1.4 h1:Ir3kBXDUtOX7dEv0EaQV8CNPpH+T7AfTh0eniMOtNcs=
@@ -88,8 +88,8 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/aliyun/alibaba-cloud-sdk-go v1.61.458/go.mod h1:pUKYbK5JQ+1Dfxk80P0qxGqe5dkxDoabbZS7zOcouyA=
-github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY=
-github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
+github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs=
+github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20211106181442-e4c1a74c66bd h1:fjJY1LimH0wVCvOHLX35SCX/MbWomAglET1H2kvz7xc=
github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20211106181442-e4c1a74c66bd/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY=
@@ -98,12 +98,12 @@ github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hC
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQhVx52RsWOnlkpikZr01T/yAVN2gn0861vByNg=
github.com/armon/go-metrics v0.3.8/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc=
-github.com/armon/go-metrics v0.3.10 h1:FR+drcQStOe+32sYyJYyZ7FIdgoGGBnwLl+flodp8Uo=
-github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc=
+github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=
+github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
-github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ=
-github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
+github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so=
+github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
github.com/aws/aws-sdk-go v1.30.20/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0=
github.com/aws/aws-sdk-go v1.44.118 h1:FJOqIRTukf7+Ulp047/k7JB6eqMXNnj7eb+coORThHQ=
github.com/aws/aws-sdk-go v1.44.118/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
@@ -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.8.0 h1:rJD5HeGIT/2b5CDk63FVCwZA3qgYElfg+oQK7uH5pfE=
-github.com/dlclark/regexp2 v1.8.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
+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/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=
@@ -186,8 +186,8 @@ github.com/exoscale/egoscale v0.23.0/go.mod h1:hRo78jkjkCDKpivQdRBEpNYF5+cVpCJCP
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
-github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w=
-github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg=
+github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs=
+github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw=
github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ=
github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
@@ -212,8 +212,8 @@ github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
-github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
-github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ=
+github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
@@ -245,8 +245,9 @@ github.com/go-openapi/spec v0.20.8 h1:ubHmXNY3FCIOinT8RNrrPfGc9t7I1qhPtdOGoG2AxR
github.com/go-openapi/spec v0.20.8/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 h1:xwhj5X6CjXEZZHMWy1zKJxvW9AfHC9pkyUjLvHtKG7o=
github.com/go-openapi/strfmt v0.21.3/go.mod h1:k+RzNO0Da+k3FrrynSNN8F7n/peCmQQqbbXjtDfvmGg=
+github.com/go-openapi/strfmt v0.21.7 h1:rspiXgNWgeUzhjo1YU01do6qsahtJNByjLVbPLNHb8k=
+github.com/go-openapi/strfmt v0.21.7/go.mod h1:adeGTkxE44sPyLk0JV235VQAO/ZXUr8KAzYjclFs3ew=
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
@@ -325,8 +326,8 @@ github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/gomarkdown/markdown v0.0.0-20191123064959-2c17d62f5098/go.mod h1:aii0r/K0ZnHv7G0KF7xy1v0A7s2Ljrb5byB7MO5p6TU=
-github.com/gomarkdown/markdown v0.0.0-20221013030248-663e2500819c h1:iyaGYbCmcYK0Ja9a3OUa2Fo+EaN0cbLu0eKpBwPFzc8=
-github.com/gomarkdown/markdown v0.0.0-20221013030248-663e2500819c/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA=
+github.com/gomarkdown/markdown v0.0.0-20230322041520-c84983bdbf2a h1:AWZzzFrqyjYlRloN6edwTLTUbKxf5flLXNuTBDm3Ews=
+github.com/gomarkdown/markdown v0.0.0-20230322041520-c84983bdbf2a/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
@@ -387,8 +388,8 @@ github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtng
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
github.com/hashicorp/go-hclog v0.9.1/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ=
github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ=
-github.com/hashicorp/go-hclog v1.4.0 h1:ctuWFGrhFha8BnnzxqeRGidlEcQkDyL5u8J8t5eA11I=
-github.com/hashicorp/go-hclog v1.4.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=
+github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c=
+github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=
github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=
github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
@@ -409,16 +410,16 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.6.0 h1:uL2shRDx7RTrOrTCUZEGP/wJUFiUI8QT6E7z5o8jga4=
github.com/hashicorp/golang-lru v0.6.0/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
-github.com/hashicorp/golang-lru/v2 v2.0.1 h1:5pv5N1lT1fjLg2VQ5KWc7kmucp2x/kvFOnxuVTqZ6x4=
-github.com/hashicorp/golang-lru/v2 v2.0.1/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
+github.com/hashicorp/golang-lru/v2 v2.0.2 h1:Dwmkdr5Nc/oBiXgJS3CDHNhJtIHkuZ3DZF5twqnfBdU=
+github.com/hashicorp/golang-lru/v2 v2.0.2/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
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.3.11 h1:p3v6gf6l3S797NnK5av3HcczOC1T5CLoaRvg0g9ys4A=
-github.com/hashicorp/raft v1.3.11/go.mod h1:J8naEwc6XaaCfts7+28whSeRvCqTd6e20BlCU3LtEO4=
+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-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=
@@ -429,11 +430,10 @@ github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/iij/doapi v0.0.0-20190504054126-0bbf12d6d7df/go.mod h1:QMZY7/J/KSQEhKWFeDesPjMj+wCHReeknARU3wqlyN4=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
-github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
-github.com/jedib0t/go-pretty/v6 v6.4.4 h1:N+gz6UngBPF4M288kiMURPHELDMIhF/Em35aYuKrsSc=
-github.com/jedib0t/go-pretty/v6 v6.4.4/go.mod h1:MgmISkTWDSFu0xOqiZ0mKNntMQ2mDgOcwOkwBEkMDJI=
+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=
github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4=
github.com/jinzhu/copier v0.3.5 h1:GlvfUwHk62RokgqVNvYsku0TATCF7bAHVwEXoBh3iJg=
@@ -460,8 +460,8 @@ github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfV
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4=
github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA=
-github.com/kataras/go-events v0.0.3-0.20201007151548-c411dc70c0a6 h1:XXnySN8wVet8S4UlcXHjh8Oa7618Eu7z92HxU5cIfhA=
-github.com/kataras/go-events v0.0.3-0.20201007151548-c411dc70c0a6/go.mod h1:6IxMW59VJdEIqj3bjFGJvGLRdb0WHtrlxPZy9qXctcg=
+github.com/kataras/go-events v0.0.3 h1:o5YK53uURXtrlg7qE/vovxd/yKOJcLuFtPQbf1rYMC4=
+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=
@@ -485,8 +485,8 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/kyokomi/emoji/v2 v2.2.8/go.mod h1:JUcn42DTdsXJo1SWanHh4HKDEyPaR5CqkmoirZZP9qE=
-github.com/kyokomi/emoji/v2 v2.2.11 h1:Pf/ZWVTbnAVkHOLJLWjPxM/FmgyPe+d85cv/OLP5Yus=
-github.com/kyokomi/emoji/v2 v2.2.11/go.mod h1:JUcn42DTdsXJo1SWanHh4HKDEyPaR5CqkmoirZZP9qE=
+github.com/kyokomi/emoji/v2 v2.2.12 h1:sSVA5nH9ebR3Zji1o31wu3yOwD1zKXQA2z0zUyeit60=
+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/linode/linodego v0.21.0/go.mod h1:UTpq1JUZD0CZsJ8rt+0CRkqbzrp1MbGakVPt2DXY5Mk=
@@ -497,8 +497,8 @@ github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i
github.com/lucsky/cuid v1.2.1 h1:MtJrL2OFhvYufUIn48d35QGXyeTC8tn0upumW9WwTHg=
github.com/lucsky/cuid v1.2.1/go.mod h1:QaaJqckboimOmhRSJXSx/+IT+VTfxfPGSo/6mfgUfmE=
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I=
-github.com/lufia/plan9stats v0.0.0-20230110061619-bbe2e5e100de h1:V53FWzU6KAZVi1tPp5UIsMoUWJ2/PNwYIDXnu7QuBCE=
-github.com/lufia/plan9stats v0.0.0-20230110061619-bbe2e5e100de/go.mod h1:JKx41uQRwqlTZabZc+kILPrO/3jlKnQ2Z8b7YiVw5cE=
+github.com/lufia/plan9stats v0.0.0-20230326075908-cb1d2100619a h1:N9zuLhTvBSRt0gWSiJswwQ2HqDmtX/ZCDJURnKUt1Ik=
+github.com/lufia/plan9stats v0.0.0-20230326075908-cb1d2100619a/go.mod h1:JKx41uQRwqlTZabZc+kILPrO/3jlKnQ2Z8b7YiVw5cE=
github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls=
github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
@@ -526,8 +526,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.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng=
-github.com/mattn/go-isatty v0.0.17/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-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=
@@ -549,12 +549,12 @@ github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQ
github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
github.com/michaelquigley/figlet v0.0.0-20191015203154-054d06db54b4 h1:O0aAES+Hu4tySETys37Xd1wMcUohr5X7yM3qaRSHKRw=
github.com/michaelquigley/figlet v0.0.0-20191015203154-054d06db54b4/go.mod h1:ZgenLagNkpruEGzNeXiQH9RtZedSLKw1WlDTJWPZzpk=
-github.com/michaelquigley/pfxlog v0.6.9 h1:K/weH6ARu58aEDQi0ccinItvV958CeO6Ri4jqeFwd/w=
-github.com/michaelquigley/pfxlog v0.6.9/go.mod h1:D2vg1tPyPdSXWWkSnGk6Fomwh5b3clwVJDUh71tq8Sk=
+github.com/michaelquigley/pfxlog v0.6.10 h1:IbC/H3MmSDcPlQHF1UZPQU13Dkrs0+ycWRyQd2ihnjw=
+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.50 h1:DQUfb9uc6smULcREF09Uc+/Gd46YWqJd5DbpPE9xkcA=
-github.com/miekg/dns v1.1.50/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME=
+github.com/miekg/dns v1.1.53 h1:ZBkuHr5dxHtB1caEOlZTLPo7D3L3TWckgUUs/RHfDxw=
+github.com/miekg/dns v1.1.53/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=
@@ -584,8 +584,8 @@ 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.2 h1:NgqrYytDnjKbOfWI29TT0SJM+RwB3yf9MIkJVJaU+J0=
-github.com/netfoundry/secretstream v0.1.2/go.mod h1:uasYkYSp0MmNSlKOWJ2sVzxPms8e58TS4ENq4yro86k=
+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,42 +612,44 @@ 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.8 h1:qB4zQO9dz3PL8qbeyzCWbwTrtHZPEZlYtjkJJ78SJPo=
-github.com/openziti/agent v1.0.8/go.mod h1:6APWgkPP6Uxf1/VyirdTVLAJxwam2vVyakrVw6yvs40=
-github.com/openziti/channel/v2 v2.0.26 h1:IIEnno26FuywcyCwCie1U7OHoB8HzuG95EzEnvtKmio=
-github.com/openziti/channel/v2 v2.0.26/go.mod h1:zZO0bgVYY9FCDs2EMRakDl6wIfyOWuzgPzPL8EvQ5Ks=
-github.com/openziti/edge v0.24.95 h1:Lj7ycWVOXbqt3TK6NSGPWXj5bp3/5rX7rA+bR5wA8Nc=
-github.com/openziti/edge v0.24.95/go.mod h1:nVamtrBekK372q8bbKK/D6t0W7LBqQ+Miu0YE1u3od4=
-github.com/openziti/fablab v0.4.23 h1:GKbSceX8hphBfY0RtYkrq7LTilnV61w4JCb4hh70Zio=
-github.com/openziti/fablab v0.4.23/go.mod h1:ff6XCI4YryKcyhblK3zNVkiEH0JXDhO6ZkHQN4N0wDE=
-github.com/openziti/fabric v0.22.7 h1:o0k/QnCpVZPiC77fh/NoUVCoeQNhfBm4oOICcJsdkWc=
-github.com/openziti/fabric v0.22.7/go.mod h1:NITYnGTCeu0ENixTd7qXFzGyIDm5GkyJhxKYTnmFzjk=
-github.com/openziti/foundation/v2 v2.0.10 h1:IeOkcPbgBpBTw4JrWz8s9Z76vO/m+i2uIE0cMZ0C2DM=
-github.com/openziti/foundation/v2 v2.0.10/go.mod h1:Z0gnQsGJb/H/B+pixLtmCIpw1dBllD4QoT6LeD35WzA=
-github.com/openziti/identity v1.0.30 h1:N2WDdK7MpeXuHCRjMo6N/QMtUXUkenUEqfKWXFNu2oE=
-github.com/openziti/identity v1.0.30/go.mod h1:SPZAaqvDToS2jtae4D2fvO9IsR6G6FKNZ8WTqAwKKJE=
-github.com/openziti/jwks v1.0.2 h1:32BGXIAnefS+v7uXKPb1x8/cQ7srek6Ai06dsrMTY4E=
-github.com/openziti/jwks v1.0.2/go.mod h1:KwO0x9FBG0aoJS5f6nH5xeHoplyR1H143SMI9kF0mC8=
-github.com/openziti/metrics v1.2.3 h1:h9+mSU673QLSMOb3YibD1vNgE0yIDZ5leiUqDwN5szE=
-github.com/openziti/metrics v1.2.3/go.mod h1:jK8BfZ9nXMhO+LPcUPpN/sebrLfIeF4uaHlm5JIF7BY=
-github.com/openziti/runzmd v1.0.9 h1:gQnZT5cACuVpcBBBHWIaN9Vmwv8KUNa7LBLG8Xi13/U=
-github.com/openziti/runzmd v1.0.9/go.mod h1:s6amx7gbzewUqlnq8dcvJ50eb0ryjQtknPYubOHuIug=
-github.com/openziti/sdk-golang v0.18.26 h1:Wk2s88R9b5SeP3D3uEpqE31ffY20Y1v2ZSyYfgud/BA=
-github.com/openziti/sdk-golang v0.18.26/go.mod h1:QCoDwqjGm8qxcIDboY+jglfjZVdz8gREquRMpX7jz8I=
-github.com/openziti/storage v0.1.33 h1:c3jdiJPIthYC51Ye2VOBGuz3g1DGVzmjGIlgPs1BcOg=
-github.com/openziti/storage v0.1.33/go.mod h1:G4swa9DU8oG+B+tv4X7X5QjtI8nxbXhEUKlDbwNowBY=
-github.com/openziti/transport/v2 v2.0.50 h1:bMk0CeQhg61vaCpAUANlu+hZTqyZSa7IFX3ZYFi1tns=
-github.com/openziti/transport/v2 v2.0.50/go.mod h1:I3qtYJhHzEzydqqdIq8IZStwPV7ybynK0mJP17MB/q0=
+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/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/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/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.2 h1:OPNwVOy2OzucFrThOckWxr7GaD5CTBXsY2dZA23W5a4=
-github.com/openziti/ziti v0.27.2/go.mod h1:ZnXzNonbbJPd+mmkeEY6moICdfNrdOs1DD8zdWDNMcc=
+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.21 h1:ZZEq86qMvOAtzcgL1b2CqmZDnGqBH8cZ1nXcHdd3I+E=
-github.com/openziti/zitilab v0.1.21/go.mod h1:CwMY50NZENpbVuSZMq+n8OngRVtoVe7qnZB/dEbmvcE=
+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=
@@ -658,7 +660,6 @@ github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FI
github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=
github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=
-github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g=
github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE=
github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM=
@@ -709,8 +710,8 @@ github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5X
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
-github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw=
-github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
+github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis=
+github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
github.com/rodaine/table v1.0.1 h1:U/VwCnUxlVYxw8+NJiLIuCxA/xa6jL38MY3FYysVWWQ=
github.com/rodaine/table v1.0.1/go.mod h1:UVEtfBsflpeEcD56nF4F5AocNFta0ZuolpSVdPtlmP4=
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
@@ -726,16 +727,21 @@ 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.1 h1:a9KKO+kGLKEvcPIs4W62v0nu3sciVDOOOPUD0Hz7z/4=
-github.com/shirou/gopsutil/v3 v3.23.1/go.mod h1:NN6mnm5/0k8jw4cBfCnJtr5L7ErOTg18tMNpgFkn0hA=
+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/shoenig/go-m1cpu v0.1.5/go.mod h1:Wwvst4LR89UxjeFtLRMrpgRiyY4xPsejnVZym39dbAQ=
+github.com/shoenig/test v0.6.3 h1:GVXWJFk9PiOjN0KoJ7VrJGH6uLPnqxR7/fe3HUPfE0c=
+github.com/shoenig/test v0.6.3/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k=
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=
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
-github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
-github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
+github.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=
+github.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0=
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M=
github.com/skratchdot/open-golang v0.0.0-20160302144031-75fb7ed4208c/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog=
@@ -751,8 +757,8 @@ github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA=
github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk=
-github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA=
-github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY=
+github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I=
+github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0=
github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=
github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
@@ -778,8 +784,10 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
github.com/stretchr/testify v1.7.4/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
-github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
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/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=
@@ -827,8 +835,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.1 h1:QP0znIRTuL0jf1oBQoAoM0C6ZJfBK4kx0Uumtv1A7w8=
-go.mongodb.org/mongo-driver v1.11.1/go.mod h1:s7p5vEtfbeR1gYi6pnj3c3/urpbLv2T5Sfd6Rp2HBB8=
+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.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=
@@ -840,11 +848,11 @@ 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.11.2 h1:YBZcQlsVekzFsFbjygXMOXSs6pialIZxcjfO/mBDmR0=
-go.opentelemetry.io/otel v1.11.2/go.mod h1:7p4EUV+AqgdlNV9gL97IgUZiVR3yrFXYo53f9BM3tRI=
+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.11.2 h1:Xf7hWSF2Glv0DE3MH7fBHvtpSBsjcBUe5MYAmZM/+y0=
-go.opentelemetry.io/otel/trace v1.11.2/go.mod h1:4N+yC7QEz7TTsG9BSRLNAa63eg5E06ObSbKPmxQ/pKA=
+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.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/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
@@ -863,15 +871,14 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191202143827-86a70503ff7e/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20200204104054-c9f3fb736b72/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE=
-golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU=
+golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
+golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g=
+golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -882,14 +889,14 @@ 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-20230202163644-54bba9f4231b h1:EqBVA+nNsObCwQoBEHy4wLU0pi7i8a4AL3pbItPdPkE=
-golang.org/x/exp v0.0.0-20230202163644-54bba9f4231b/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc=
+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/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=
golang.org/x/image v0.0.0-20191206065243-da761ea9ff43/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
-golang.org/x/image v0.5.0 h1:5JMiNunQeQw++mMOz48/ISeNu3Iweh/JaZU8ZLqHRrI=
-golang.org/x/image v0.5.0/go.mod h1:FVC7BI/5Ym8R25iw5OLsgshdUBbT1h5jZTpA+mvAdZ4=
+golang.org/x/image v0.7.0 h1:gzS29xtG1J5ybQlv0PuyfE3nmc6R4qB73m6LUUmvFuw=
+golang.org/x/image v0.7.0/go.mod h1:nd/q4ef1AKKYl/4kft7g+6UyGbdiqWqTP1ZAbRoV7Rg=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -914,8 +921,8 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
-golang.org/x/mod v0.6.0 h1:b9gGHsz9/HhJ3HF5DHQytPpuwocVTChQJK3AvoLRD5I=
-golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI=
+golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8=
+golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -963,13 +970,14 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v
golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM=
-golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
-golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g=
-golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
+golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
+golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
+golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
+golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -995,8 +1003,9 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI=
+golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180606202747-9527bec2660b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180622082034-63fc586f45fe/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1076,14 +1085,18 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+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.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
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.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=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
-golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY=
+golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
+golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols=
+golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1093,8 +1106,10 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
-golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo=
+golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
+golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -1158,10 +1173,9 @@ golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4f
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
-golang.org/x/tools v0.2.0 h1:G6AHpWxTMGY1KyEYoAQ5WTtIekUUvDNjan3ugu60JvE=
-golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA=
+golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM=
+golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -1271,8 +1285,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
-google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
-google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng=
+google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
gopkg.in/AlecAivazis/survey.v1 v1.8.7 h1:oBJqtgsyBLg9K5FK9twNUbcPnbCPoh+R9a+7nag3qJM=
gopkg.in/AlecAivazis/survey.v1 v1.8.7/go.mod h1:iBNOmqKz/NUbZx3bA+4hAGLRC7fSK7tgtVDT4tB22XA=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
diff --git a/network-tests/simple-transfer/actions/bootstrap.go b/network-tests/ha/actions/bootstrap.go
similarity index 82%
rename from network-tests/simple-transfer/actions/bootstrap.go
rename to network-tests/ha/actions/bootstrap.go
index d5936781b..0b853da87 100644
--- a/network-tests/simple-transfer/actions/bootstrap.go
+++ b/network-tests/ha/actions/bootstrap.go
@@ -23,13 +23,17 @@ func NewBootstrapAction() model.ActionBinder {
func (a *bootstrapAction) bind(m *model.Model) model.Action {
workflow := actions.Workflow()
+ workflow.AddAction(component.Stop(".ctrl"))
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(host.GroupExec(".ctrl", 5, "rf -rf ./fablab/ctrldata"))
+ workflow.AddAction(component.Start(".ctrl"))
workflow.AddAction(semaphore.Sleep(2 * time.Second))
+ workflow.AddAction(edge.RaftJoin(".ctrl"))
+ workflow.AddAction(semaphore.Sleep(2 * time.Second))
+ workflow.AddAction(edge.InitRaftController("#ctrl1"))
+ workflow.AddAction(semaphore.Sleep(time.Second))
- workflow.AddAction(edge.Login("#ctrl"))
+ workflow.AddAction(edge.Login("#ctrl1"))
workflow.AddAction(component.StopInParallel(models.EdgeRouterTag, 25))
workflow.AddAction(edge.InitEdgeRouters(models.EdgeRouterTag, 2))
@@ -45,7 +49,5 @@ func (a *bootstrapAction) bind(m *model.Model) model.Action {
workflow.AddAction(zitilib_actions.Edge("create", "service-edge-router-policy", "echo", "--semantic", "AnyOf", "--service-roles", "@echo", "--edge-router-roles", "#all"))
- workflow.AddAction(component.Stop(models.ControllerTag))
-
return workflow
}
diff --git a/network-tests/simple-transfer/actions/start.go b/network-tests/ha/actions/start.go
similarity index 100%
rename from network-tests/simple-transfer/actions/start.go
rename to network-tests/ha/actions/start.go
diff --git a/network-tests/simple-transfer/configs/consul.hcl b/network-tests/ha/configs/consul.hcl
similarity index 100%
rename from network-tests/simple-transfer/configs/consul.hcl
rename to network-tests/ha/configs/consul.hcl
diff --git a/network-tests/ha/configs/ctrl.yml.tmpl b/network-tests/ha/configs/ctrl.yml.tmpl
new file mode 100644
index 000000000..b5add84e4
--- /dev/null
+++ b/network-tests/ha/configs/ctrl.yml.tmpl
@@ -0,0 +1,196 @@
+v: 3
+
+raft:
+ minClusterSize: 3
+ dataDir: /home/{{ .Model.MustVariable "credentials.ssh.username" }}/fablab/ctrldata
+
+identity:
+ cert: /home/{{ .Model.MustVariable "credentials.ssh.username" }}/fablab/pki/{{ .Component.PublicIdentity }}/certs/{{ .Component.PublicIdentity }}-server.cert
+ key: /home/{{ .Model.MustVariable "credentials.ssh.username" }}/fablab/pki/{{ .Component.PublicIdentity }}/keys/{{ .Component.PublicIdentity }}-server.key
+ ca: /home/{{ .Model.MustVariable "credentials.ssh.username" }}/fablab/pki/{{ .Component.PublicIdentity }}/certs/{{ .Component.PublicIdentity }}-server.chain.pem
+
+# the endpoint that routers will connect to the controller over.
+ctrl:
+ listener: tls:0.0.0.0:6262
+ options:
+ advertiseAddress: tls:{{.Host.PublicIp}}:6262
+ # (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
+
+#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
+
+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/{{ .Component.PublicIdentity }}/certs/{{ .Component.PublicIdentity }}.cert
+ key: /home/{{ .Model.MustVariable "credentials.ssh.username" }}/fablab/pki/{{ .Component.PublicIdentity }}/keys/{{ .Component.PublicIdentity }}.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: {}
diff --git a/network-tests/simple-transfer/configs/metricbeat.yml b/network-tests/ha/configs/metricbeat.yml
similarity index 100%
rename from network-tests/simple-transfer/configs/metricbeat.yml
rename to network-tests/ha/configs/metricbeat.yml
diff --git a/network-tests/ha/configs/router.yml.tmpl b/network-tests/ha/configs/router.yml.tmpl
new file mode 100644
index 000000000..4cb9afca5
--- /dev/null
+++ b/network-tests/ha/configs/router.yml.tmpl
@@ -0,0 +1,70 @@
+{{$ssh_username := .Model.MustVariable "credentials.ssh.username"}}
+{{$identity := .Component.PublicIdentity}}
+{{$router_ip := .Host.PublicIp}}
+
+v: 3
+
+enableDebugOps: true
+
+identity:
+ cert: /home/{{$ssh_username}}/fablab/cfg/{{$identity}}-client.cert
+ server_cert: /home/{{$ssh_username}}/fablab/cfg/{{$identity}}-server.cert
+ key: /home/{{$ssh_username}}/fablab/cfg/{{$identity}}.key
+ ca: /home/{{$ssh_username}}/fablab/cfg/{{$identity}}-server.chain.pem
+
+ctrl:
+ endpoints: {{ range $host := .Model.MustSelectHosts "component.ctrl" 1 }}
+ - tls:{{ $host.PublicIp }}:6262{{end}}
+
+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 }}
+
diff --git a/network-tests/simple-transfer/configs/ziti.hcl b/network-tests/ha/configs/ziti.hcl
similarity index 100%
rename from network-tests/simple-transfer/configs/ziti.hcl
rename to network-tests/ha/configs/ziti.hcl
diff --git a/network-tests/ha/main.go b/network-tests/ha/main.go
new file mode 100644
index 000000000..3b78e4c8a
--- /dev/null
+++ b/network-tests/ha/main.go
@@ -0,0 +1,298 @@
+/*
+ (c) Copyright NetFoundry Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+package main
+
+import (
+ "embed"
+ "fmt"
+ "github.com/openziti/fablab"
+ "github.com/openziti/fablab/kernel/lib/actions/component"
+ "github.com/openziti/fablab/kernel/lib/binding"
+ "github.com/openziti/fablab/kernel/lib/runlevel/0_infrastructure/aws_ssh_key"
+ semaphore0 "github.com/openziti/fablab/kernel/lib/runlevel/0_infrastructure/semaphore"
+ terraform_0 "github.com/openziti/fablab/kernel/lib/runlevel/0_infrastructure/terraform"
+ "github.com/openziti/fablab/kernel/lib/runlevel/1_configuration/config"
+ "github.com/openziti/fablab/kernel/lib/runlevel/2_kitting/devkit"
+ 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/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/sirupsen/logrus"
+ "os"
+ "time"
+)
+
+//go:embed configs
+var configResource embed.FS
+
+func getConfigData(filePath string) []byte {
+ data, err := configResource.ReadFile(fmt.Sprintf("configs/%s", filePath))
+ if err != nil {
+ logrus.Errorf("Unable to read config data from %s: [%s]", filePath, err)
+ }
+ return data
+}
+
+var m = &model.Model{
+ Id: "ha",
+ Scope: model.Scope{
+ Defaults: model.Variables{
+ "environment": "ha-smoketest",
+ "credentials": model.Variables{
+ "ssh": model.Variables{
+ "username": "ubuntu",
+ },
+ "edge": model.Variables{
+ "username": "admin",
+ "password": "admin",
+ },
+ },
+ },
+ },
+
+ Resources: model.Resources{
+ resources.Configs: resources.SubFolder(configResource, "configs"),
+ resources.Terraform: test_resources.TerraformResources(),
+ },
+
+ Regions: model.Regions{
+ "us-east-1": {
+ Region: "us-east-1",
+ Site: "us-east-1a",
+ Hosts: model.Hosts{
+ "ctrl1": {
+ InstanceType: "t3.micro",
+ Components: model.Components{
+ "ctrl1": {
+ Scope: model.Scope{Tags: model.Tags{"ctrl", "spiffe:controller"}},
+ BinaryName: "ziti controller",
+ ConfigSrc: "ctrl.yml.tmpl",
+ ConfigName: "ctrl1.yml",
+ PublicIdentity: "ctrl1",
+ },
+ "consul": {
+ BinaryName: "consul",
+ },
+ },
+ },
+ "ctrl2": {
+ InstanceType: "t3.micro",
+ Components: model.Components{
+ "ctrl2": {
+ Scope: model.Scope{Tags: model.Tags{"ctrl", "spiffe:controller"}},
+ BinaryName: "ziti controller",
+ ConfigSrc: "ctrl.yml.tmpl",
+ ConfigName: "ctrl2.yml",
+ PublicIdentity: "ctrl2",
+ },
+ "consul": {
+ BinaryName: "consul",
+ },
+ },
+ },
+
+ "router-east": {
+ InstanceType: "t2.micro",
+ Components: model.Components{
+ "router-east": {
+ Scope: model.Scope{Tags: model.Tags{"edge-router", "terminator"}},
+ BinaryName: "ziti router",
+ ConfigSrc: "router.yml.tmpl",
+ ConfigName: "router-east.yml",
+ PublicIdentity: "router-east",
+ },
+ "echo-server": {
+ Scope: model.Scope{Tags: model.Tags{"sdk-app", "service"}},
+ BinaryName: "echo-server",
+ PublicIdentity: "echo-server",
+ },
+ "consul": {
+ BinaryName: "consul",
+ },
+ },
+ },
+ },
+ },
+ "us-west-2": {
+ Region: "us-west-2",
+ Site: "us-west-2b",
+ Hosts: model.Hosts{
+ "ctrl3": {
+ InstanceType: "t3.micro",
+ Components: model.Components{
+ "ctrl3": {
+ Scope: model.Scope{Tags: model.Tags{"ctrl", "spiffe:controller"}},
+ BinaryName: "ziti controller",
+ ConfigSrc: "ctrl.yml.tmpl",
+ ConfigName: "ctrl3.yml",
+ PublicIdentity: "ctrl3",
+ },
+ "consul": {
+ BinaryName: "consul",
+ },
+ },
+ },
+
+ "router-west": {
+ Scope: model.Scope{Tags: model.Tags{}},
+ InstanceType: "t2.micro",
+ Components: model.Components{
+ "router-west": {
+ Scope: model.Scope{Tags: model.Tags{"edge-router", "terminator"}},
+ BinaryName: "ziti router",
+ ConfigSrc: "router.yml.tmpl",
+ ConfigName: "router-west.yml",
+ PublicIdentity: "router-west",
+ },
+ "echo-client": {
+ Scope: model.Scope{Tags: model.Tags{"sdk-app", "client"}},
+ BinaryName: "echo-client",
+ PublicIdentity: "echo-client",
+ },
+ "consul": {
+ BinaryName: "consul",
+ },
+ },
+ },
+ },
+ },
+ },
+
+ Actions: model.ActionBinders{
+ "bootstrap": actions.NewBootstrapAction(),
+ "start": actions.NewStartAction(actions.MetricbeatConfig{
+ ConfigPath: "metricbeat",
+ DataPath: "metricbeat/data",
+ LogPath: "metricbeat/logs",
+ },
+ actions.ConsulConfig{
+ ServerAddr: os.Getenv("CONSUL_ENDPOINT"),
+ ConfigDir: "consul",
+ DataPath: "consul/data",
+ LogPath: "consul/log.out",
+ }),
+ "stop": model.Bind(component.StopInParallel("*", 15)),
+ "login": model.Bind(edge.Login("#ctrl1")),
+ },
+
+ Infrastructure: model.InfrastructureStages{
+ aws_ssh_key.Express(),
+ terraform_0.Express(),
+ semaphore0.Ready(time.Minute),
+ },
+
+ Configuration: model.ConfigurationStages{
+ zitilib_runlevel_1_configuration.IfPkiNeedsRefresh(
+ zitilib_runlevel_1_configuration.Fabric("simple-transfer.test", ".ctrl"),
+ ),
+ config.Component(),
+ devkit.DevKitF(zitilab.ZitiRoot, []string{"ziti", "ziti-echo"}),
+ },
+
+ Distribution: model.DistributionStages{
+ distribution.DistributeSshKey("*"),
+ distribution.Locations("*", "logs"),
+ distribution.DistributeDataWithReplaceCallbacks(
+ "*",
+ string(getConfigData("metricbeat.yml")),
+ "metricbeat/metricbeat.yml",
+ os.FileMode(0644),
+ map[string]func(*model.Host) string{
+ "${host}": func(h *model.Host) string {
+ return os.Getenv("ELASTIC_ENDPOINT")
+ },
+ "${user}": func(h *model.Host) string {
+ return os.Getenv("ELASTIC_USERNAME")
+ },
+ "${password}": func(h *model.Host) string {
+ return os.Getenv("ELASTIC_PASSWORD")
+ },
+ "${build_number}": func(h *model.Host) string {
+ return os.Getenv("BUILD_NUMBER")
+ },
+ "${ziti_version}": func(h *model.Host) string {
+ return h.MustStringVariable("ziti_version")
+ },
+ },
+ ),
+
+ distribution.DistributeDataWithReplaceCallbacks(
+ "*",
+ string(getConfigData("consul.hcl")),
+ "consul/consul.hcl",
+ os.FileMode(0644),
+ map[string]func(*model.Host) string{
+ "${public_ip}": func(h *model.Host) string {
+ return h.PublicIp
+ },
+ "${encryption_key}": func(h *model.Host) string {
+ return os.Getenv("CONSUL_ENCRYPTION_KEY")
+ },
+ "${build_number}": func(h *model.Host) string {
+ return os.Getenv("BUILD_NUMBER")
+ },
+ "${ziti_version}": func(h *model.Host) string {
+ return h.MustStringVariable("ziti_version")
+ },
+ },
+ ),
+ distribution.DistributeDataWithReplaceCallbacks(
+ "#ctrl",
+ string(getConfigData("ziti.hcl")),
+ "consul/ziti.hcl",
+ os.FileMode(0644),
+ map[string]func(*model.Host) string{
+ "${build_number}": func(h *model.Host) string {
+ return os.Getenv("BUILD_NUMBER")
+ },
+ "${ziti_version}": func(h *model.Host) string {
+ return h.MustStringVariable("ziti_version")
+ },
+ }),
+ distribution.DistributeData(
+ "*",
+ []byte(os.Getenv("CONSUL_AGENT_CERT")),
+ "consul/consul-agent-ca.pem"),
+ rsync.RsyncStaged(),
+ },
+
+ Disposal: model.DisposalStages{
+ terraform.Dispose(),
+ aws_ssh_key2.Dispose(),
+ },
+}
+
+func main() {
+ m.AddActivationActions("stop", "bootstrap", "start")
+
+ model.AddBootstrapExtension(
+ zitilab.BootstrapWithFallbacks(
+ &zitilab.BootstrapFromEnv{},
+ ))
+ model.AddBootstrapExtension(binding.AwsCredentialsLoader)
+ model.AddBootstrapExtension(aws_ssh_key.KeyManager)
+
+ fablab.InitModel(m)
+ fablab.Run()
+}
diff --git a/network-tests/router-test/configs/ctrl.yml b/network-tests/router-test/configs/ctrl.yml
new file mode 100644
index 000000000..093df1c1f
--- /dev/null
+++ b/network-tests/router-test/configs/ctrl.yml
@@ -0,0 +1,194 @@
+v: 3
+
+db: /home/{{ .Model.MustVariable "credentials.ssh.username" }}/fablab/ctrl.db
+
+identity:
+ cert: /home/{{ .Model.MustVariable "credentials.ssh.username" }}/fablab/pki/ctrl/certs/{{ .Component.PublicIdentity }}-server.cert
+ key: /home/{{ .Model.MustVariable "credentials.ssh.username" }}/fablab/pki/ctrl/keys/{{ .Component.PublicIdentity }}-server.key
+ ca: /home/{{ .Model.MustVariable "credentials.ssh.username" }}/fablab/pki/ctrl/certs/{{ .Component.PublicIdentity }}-server.chain.pem
+
+# the endpoint that routers will connect to the controller over.
+ctrl:
+ listener: tls:0.0.0.0:6262
+ options:
+ advertiseAddress: tls:{{.Host.PublicIp}}:6262
+ # (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
+
+#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
+
+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/ctrl/certs/ctrl.cert
+ key: /home/{{ .Model.MustVariable "credentials.ssh.username" }}/fablab/pki/ctrl/keys/ctrl.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: {}
diff --git a/network-tests/router-test/configs/router.yml b/network-tests/router-test/configs/router.yml
new file mode 100644
index 000000000..a2a203737
--- /dev/null
+++ b/network-tests/router-test/configs/router.yml
@@ -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/cfg/{{$identity}}-client.cert
+ server_cert: /home/{{$ssh_username}}/fablab/cfg/{{$identity}}-server.cert
+ key: /home/{{$ssh_username}}/fablab/cfg/{{$identity}}.key
+ ca: /home/{{$ssh_username}}/fablab/cfg/{{$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}}
+
diff --git a/network-tests/router-test/main.go b/network-tests/router-test/main.go
new file mode 100644
index 000000000..1e73bd7bb
--- /dev/null
+++ b/network-tests/router-test/main.go
@@ -0,0 +1,197 @@
+package main
+
+import (
+ "embed"
+ _ "embed"
+ "github.com/michaelquigley/pfxlog"
+ "github.com/openziti/edge/controller/persistence"
+ "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/actions/semaphore"
+ "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"
+ "github.com/openziti/fablab/kernel/lib/runlevel/2_kitting/devkit"
+ 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/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"
+ "os"
+ "path"
+ "strings"
+ "time"
+)
+
+func getDbFile() string {
+ dbFile := os.Getenv("ZITI_DB")
+ if dbFile == "" {
+ pfxlog.Logger().Fatal("required env var ZITI_DB not set")
+ }
+ return dbFile
+}
+
+//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
+}
+
+type dbStrategy struct{}
+
+func (d dbStrategy) GetDbFile() string {
+ return getDbFile()
+}
+
+func (d dbStrategy) GetSite(router *persistence.EdgeRouter) (string, bool) {
+ for _, attr := range router.RoleAttributes {
+ if strings.Contains(attr, "Hosted") {
+ return "us-west-2b", true
+ }
+ }
+ return "us-west-1c", true
+}
+
+func (d dbStrategy) PostProcess(router *persistence.EdgeRouter, c *model.Component) {
+ c.PublicIdentity = router.Id
+ if router.IsTunnelerEnabled {
+ c.Scope.Tags = append(c.Scope.Tags, "tunneler")
+ c.RunWithSudo = true
+ }
+ c.Scope.Tags = append(c.Scope.Tags, "edge-router")
+ c.Scope.Tags = append(c.Scope.Tags, "pre-created")
+ c.Host.InstanceType = "c5.large"
+}
+
+var m = &model.Model{
+ Id: "router-test",
+ Scope: model.Scope{
+ Defaults: model.Variables{
+ "environment": "router-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{}),
+ &models.ZitiDbBuilder{Strategy: dbStrategy{}},
+ },
+ Resources: model.Resources{
+ resources.Configs: resources.SubFolder(configResource, "configs"),
+ resources.Binaries: os.DirFS(path.Join(os.Getenv("GOPATH"), "bin")),
+ resources.Terraform: test_resources.TerraformResources(),
+ },
+ 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",
+ },
+ },
+ },
+ },
+ },
+ },
+
+ Actions: model.ActionBinders{
+ "bootstrap": model.ActionBinder(func(m *model.Model) model.Action {
+ workflow := actions.Workflow()
+
+ workflow.AddAction(component.Stop("*"))
+ workflow.AddAction(host.GroupExec("*", 25, "rm -f logs/*"))
+
+ workflow.AddAction(component.Start("#ctrl"))
+ workflow.AddAction(semaphore.Sleep(2 * time.Second))
+
+ workflow.AddAction(edge.Login("#ctrl"))
+
+ workflow.AddAction(edge.ReEnrollEdgeRouters(".pre-created", 2))
+ return workflow
+ }),
+ "stop": model.Bind(component.StopInParallel("*", 15)),
+ "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.Ready(90 * time.Second),
+ },
+
+ Configuration: model.ConfigurationStages{
+ zitilib_runlevel_1_configuration.IfPkiNeedsRefresh(
+ zitilib_runlevel_1_configuration.Fabric("router.test", ".ctrl"),
+ ),
+ config.Component(),
+ devkit.DevKitF(zitilab.ZitiRoot, []string{"ziti"}),
+ },
+
+ Distribution: model.DistributionStages{
+ distribution.DistributeSshKey("*"),
+ distribution.Locations("*", "logs"),
+ rsync.RsyncStaged(),
+ rsync.NewRsyncHost("#ctrl", getDbFile(), "/home/ubuntu/fablab/ctrl.db"),
+ },
+
+ Disposal: model.DisposalStages{
+ terraform.Dispose(),
+ aws_ssh_key2.Dispose(),
+ },
+}
+
+func main() {
+ m.AddActivationActions("stop", "bootstrap")
+
+ model.AddBootstrapExtension(&zitilab.BootstrapFromEnv{})
+ model.AddBootstrapExtension(binding.AwsCredentialsLoader)
+ model.AddBootstrapExtension(aws_ssh_key.KeyManager)
+
+ fablab.InitModel(m)
+ fablab.Run()
+}
diff --git a/network-tests/simple-transfer/main.go b/network-tests/simple-transfer/main.go
index 416cde24a..5c17bd8cc 100644
--- a/network-tests/simple-transfer/main.go
+++ b/network-tests/simple-transfer/main.go
@@ -1,271 +1,28 @@
-package main
-
-import (
- "embed"
- "fmt"
- "github.com/openziti/fablab"
- "github.com/openziti/fablab/kernel/lib/actions/component"
- "github.com/openziti/fablab/kernel/lib/binding"
- "github.com/openziti/fablab/kernel/lib/runlevel/0_infrastructure/aws_ssh_key"
- semaphore0 "github.com/openziti/fablab/kernel/lib/runlevel/0_infrastructure/semaphore"
- terraform_0 "github.com/openziti/fablab/kernel/lib/runlevel/0_infrastructure/terraform"
- "github.com/openziti/fablab/kernel/lib/runlevel/1_configuration/config"
- "github.com/openziti/fablab/kernel/lib/runlevel/2_kitting/devkit"
- 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/network-tests/simple-transfer/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/sirupsen/logrus"
- "os"
- "time"
-)
-
-//go:embed configs
-var configResource embed.FS
-
-type scaleStrategy struct{}
-
-func (s scaleStrategy) IsScaled(entity model.Entity) bool {
- return entity.GetType() == model.EntityTypeHost && entity.GetScope().HasTag("scaled")
-}
-
-func (s scaleStrategy) GetEntityCount(entity model.Entity) uint32 {
- if entity.GetType() == model.EntityTypeHost && entity.GetScope().HasTag("scaled") {
- return 4
- }
- return 1
-}
-
-func getConfigData(filePath string) []byte {
- data, err := configResource.ReadFile(fmt.Sprintf("configs/%s", filePath))
- if err != nil {
- logrus.Errorf("Unable to read config data from %s: [%s]", filePath, err)
- }
- return data
-}
+/*
+ (c) Copyright NetFoundry Inc.
-var m = &model.Model{
- Id: "simple-transfer",
- Scope: model.Scope{
- Defaults: model.Variables{
- "environment": "simple-transfer-smoketest",
- "credentials": model.Variables{
- "ssh": model.Variables{
- "username": "ubuntu",
- },
- "edge": model.Variables{
- "username": "admin",
- "password": "admin",
- },
- },
- },
- },
+ 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
- StructureFactories: []model.Factory{
- model.NewScaleFactoryWithDefaultEntityFactory(scaleStrategy{}),
- },
+ https://www.apache.org/licenses/LICENSE-2.0
- Factories: []model.Factory{
- newStageFactory(),
- },
+ 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.
+*/
- Resources: model.Resources{
- resources.Configs: resources.SubFolder(configResource, "configs"),
- resources.Terraform: test_resources.TerraformResources(),
- },
-
- Regions: model.Regions{
- "us-east-1": {
- Region: "us-east-1",
- Site: "us-east-1a",
- Hosts: model.Hosts{
- "ctrl": {
- InstanceType: "t2.micro",
- Components: model.Components{
- "ctrl": {
- Scope: model.Scope{Tags: model.Tags{"ctrl"}},
- BinaryName: "ziti controller",
- ConfigSrc: "ctrl.yml",
- ConfigName: "ctrl.yml",
- PublicIdentity: "ctrl",
- },
- "consul": {
- BinaryName: "consul",
- },
- },
- },
- "router-east": {
- InstanceType: "t2.micro",
- Components: model.Components{
- "router-east": {
- Scope: model.Scope{Tags: model.Tags{"edge-router", "terminator"}},
- BinaryName: "ziti router",
- ConfigSrc: "router.yml",
- ConfigName: "router-east.yml",
- PublicIdentity: "router-east",
- },
- "echo-server": {
- Scope: model.Scope{Tags: model.Tags{"sdk-app", "service"}},
- BinaryName: "echo-server",
- PublicIdentity: "echo-server",
- },
- "consul": {
- BinaryName: "consul",
- },
- },
- },
- },
- },
- "us-west-2": {
- Region: "us-west-2",
- Site: "us-west-2b",
- Hosts: model.Hosts{
- "router-west": {
- Scope: model.Scope{Tags: model.Tags{}},
- InstanceType: "t2.micro",
- Components: model.Components{
- "router-west": {
- Scope: model.Scope{Tags: model.Tags{"edge-router", "terminator"}},
- BinaryName: "ziti router",
- ConfigSrc: "router.yml",
- ConfigName: "router-west.yml",
- PublicIdentity: "router-west",
- },
- "echo-client": {
- Scope: model.Scope{Tags: model.Tags{"sdk-app", "client"}},
- BinaryName: "echo-client",
- PublicIdentity: "echo-client",
- },
- "consul": {
- BinaryName: "consul",
- },
- },
- },
- },
- },
- },
-
- Actions: model.ActionBinders{
- "bootstrap": actions.NewBootstrapAction(),
- "start": actions.NewStartAction(actions.MetricbeatConfig{
- ConfigPath: "metricbeat",
- DataPath: "metricbeat/data",
- LogPath: "metricbeat/logs",
- },
- actions.ConsulConfig{
- ServerAddr: os.Getenv("CONSUL_ENDPOINT"),
- ConfigDir: "consul",
- DataPath: "consul/data",
- LogPath: "consul/log.out",
- }),
- "stop": model.Bind(component.StopInParallel("*", 15)),
- "login": model.Bind(edge.Login("#ctrl")),
- },
-
- Infrastructure: model.InfrastructureStages{
- aws_ssh_key.Express(),
- terraform_0.Express(),
- semaphore0.Ready(time.Minute),
- },
-
- Configuration: model.ConfigurationStages{
- zitilib_runlevel_1_configuration.IfPkiNeedsRefresh(
- zitilib_runlevel_1_configuration.Fabric("simple-transfer.test", "#ctrl"),
- ),
- config.Component(),
- devkit.DevKitF(zitilab.ZitiRoot, []string{"ziti", "ziti-echo"}),
- },
-
- Distribution: model.DistributionStages{
- distribution.DistributeSshKey("*"),
- distribution.Locations("*", "logs"),
- distribution.DistributeDataWithReplaceCallbacks(
- "*",
- string(getConfigData("metricbeat.yml")),
- "metricbeat/metricbeat.yml",
- os.FileMode(0644),
- map[string]func(*model.Host) string{
- "${host}": func(h *model.Host) string {
- return os.Getenv("ELASTIC_ENDPOINT")
- },
- "${user}": func(h *model.Host) string {
- return os.Getenv("ELASTIC_USERNAME")
- },
- "${password}": func(h *model.Host) string {
- return os.Getenv("ELASTIC_PASSWORD")
- },
- "${build_number}": func(h *model.Host) string {
- return os.Getenv("BUILD_NUMBER")
- },
- "${ziti_version}": func(h *model.Host) string {
- return h.MustStringVariable("ziti_version")
- },
- },
- ),
-
- distribution.DistributeDataWithReplaceCallbacks(
- "*",
- string(getConfigData("consul.hcl")),
- "consul/consul.hcl",
- os.FileMode(0644),
- map[string]func(*model.Host) string{
- "${public_ip}": func(h *model.Host) string {
- return h.PublicIp
- },
- "${encryption_key}": func(h *model.Host) string {
- return os.Getenv("CONSUL_ENCRYPTION_KEY")
- },
- "${build_number}": func(h *model.Host) string {
- return os.Getenv("BUILD_NUMBER")
- },
- "${ziti_version}": func(h *model.Host) string {
- return h.MustStringVariable("ziti_version")
- },
- },
- ),
- distribution.DistributeDataWithReplaceCallbacks(
- "#ctrl",
- string(getConfigData("ziti.hcl")),
- "consul/ziti.hcl",
- os.FileMode(0644),
- map[string]func(*model.Host) string{
- "${build_number}": func(h *model.Host) string {
- return os.Getenv("BUILD_NUMBER")
- },
- "${ziti_version}": func(h *model.Host) string {
- return h.MustStringVariable("ziti_version")
- },
- }),
- distribution.DistributeData(
- "*",
- []byte(os.Getenv("CONSUL_AGENT_CERT")),
- "consul/consul-agent-ca.pem"),
- rsync.RsyncStaged(),
- },
+package main
- Disposal: model.DisposalStages{
- terraform.Dispose(),
- aws_ssh_key2.Dispose(),
- },
-}
+import (
+ "github.com/openziti/fablab"
+ "github.com/openziti/ziti/network-tests/simple"
+)
func main() {
- m.AddActivationActions("stop", "bootstrap", "start")
-
- model.AddBootstrapExtension(
- zitilab.BootstrapWithFallbacks(
- &zitilab.BootstrapFromEnv{},
- ))
- model.AddBootstrapExtension(binding.AwsCredentialsLoader)
- model.AddBootstrapExtension(aws_ssh_key.KeyManager)
-
- fablab.InitModel(m)
+ simple.InitBootstrapExtensions()
+ fablab.InitModel(simple.Model)
fablab.Run()
}
diff --git a/network-tests/simple-transfer/stages.go b/network-tests/simple-transfer/stages.go
deleted file mode 100644
index 724ca93cb..000000000
--- a/network-tests/simple-transfer/stages.go
+++ /dev/null
@@ -1,25 +0,0 @@
-package main
-
-import (
- "crypto/rand"
- "net/url"
-
- "github.com/openziti/fablab/kernel/model"
- runlevel_5_operation "github.com/openziti/ziti/network-tests/simple-transfer/stages/5_operation"
-)
-
-type stageFactory struct{}
-
-func newStageFactory() model.Factory {
- return &stageFactory{}
-}
-
-func (sf *stageFactory) Build(m *model.Model) error {
- //generate 10k random bytes
- data := make([]byte, 10000)
- rand.Read(data)
-
- m.AddOperatingStage(runlevel_5_operation.AssertEcho("#echo-client", url.QueryEscape(string(data))))
-
- return nil
-}
diff --git a/network-tests/simple/actions/bootstrap.go b/network-tests/simple/actions/bootstrap.go
new file mode 100644
index 000000000..8f8afd2f1
--- /dev/null
+++ b/network-tests/simple/actions/bootstrap.go
@@ -0,0 +1,115 @@
+/*
+ (c) Copyright NetFoundry Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+package actions
+
+import (
+ "time"
+
+ "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/zitilab/actions"
+ "github.com/openziti/zitilab/actions/edge"
+ "github.com/openziti/zitilab/models"
+)
+
+type bootstrapAction struct{}
+
+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", "service", "echo"))
+
+ workflow.AddAction(zitilib_actions.Edge("create", "service-policy", "echo-servers", "Bind", "--service-roles", "@echo", "--identity-roles", "#service"))
+ workflow.AddAction(zitilib_actions.Edge("create", "service-policy", "echo-client", "Dial", "--service-roles", "@echo", "--identity-roles", "#client"))
+
+ workflow.AddAction(zitilib_actions.Edge("create", "edge-router-policy", "echo-servers", "--edge-router-roles", "#host", "--identity-roles", "#service"))
+ workflow.AddAction(zitilib_actions.Edge("create", "edge-router-policy", "echo-clients", "--edge-router-roles", "#client", "--identity-roles", "#client"))
+
+ 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", `
+ {
+ "terminators" : [
+ { "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", `
+ {
+ "addresses": ["ziti-files-ert-unencrypted.s3-us-west-1.amazonaws.ziti"],
+ "portRanges" : [ { "low": 443, "high": 443 } ],
+ "protocols": ["tcp"]
+ }`))
+
+ workflow.AddAction(zitilib_actions.Edge("create", "config", "files-intercept-ert", "intercept.v1", `
+ {
+ "addresses": ["ziti-files-ert.s3-us-west-1.amazonaws.ziti"],
+ "portRanges" : [ { "low": 443, "high": 443 } ],
+ "protocols": ["tcp"]
+ }`))
+
+ workflow.AddAction(zitilib_actions.Edge("create", "config", "files-intercept-zet-unencrypted", "intercept.v1", `
+ {
+ "addresses": ["ziti-files-zet-unencrypted.s3-us-west-1.amazonaws.ziti"],
+ "portRanges" : [ { "low": 443, "high": 443 } ],
+ "protocols": ["tcp"]
+ }`))
+
+ workflow.AddAction(zitilib_actions.Edge("create", "config", "files-intercept-zet", "intercept.v1", `
+ {
+ "addresses": ["ziti-files-zet.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-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", "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"))
+ workflow.AddAction(zitilib_actions.Edge("create", "edge-router-policy", "host-routers", "--edge-router-roles", "#host", "--identity-roles", "#host"))
+
+ workflow.AddAction(component.Stop(models.ControllerTag))
+
+ return workflow
+}
diff --git a/network-tests/simple/actions/start.go b/network-tests/simple/actions/start.go
new file mode 100644
index 000000000..eb3aba464
--- /dev/null
+++ b/network-tests/simple/actions/start.go
@@ -0,0 +1,85 @@
+/*
+ (c) Copyright NetFoundry Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+package actions
+
+import (
+ "fmt"
+ "github.com/openziti/fablab/kernel/lib"
+ "time"
+
+ "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"
+ util_actions "github.com/openziti/ziti/network-tests/utils/actions"
+ zitilib_actions "github.com/openziti/zitilab/actions"
+ "github.com/openziti/zitilab/models"
+)
+
+func NewStartAction(metricbeat MetricbeatConfig, consul ConsulConfig) model.ActionBinder {
+ action := &startAction{
+ Metricbeat: metricbeat,
+ Consul: consul,
+ }
+ return action.bind
+}
+
+func (a *startAction) bind(m *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))
+
+ workflow.AddAction(semaphore.Sleep(2 * time.Second))
+ workflow.AddAction(zitilib_actions.StartMetricbeat("*", a.Metricbeat.ConfigPath, a.Metricbeat.DataPath, a.Metricbeat.LogPath))
+ workflow.AddAction(zitilib_actions.StartConsul("*", a.Consul.ServerAddr, a.Consul.ConfigDir, a.Consul.DataPath, a.Consul.LogPath))
+ workflow.AddAction(semaphore.Sleep(2 * time.Second))
+ workflow.AddAction(util_actions.StartEchoServers("#echo-server"))
+ workflow.AddAction(semaphore.Sleep(2 * time.Second))
+
+ workflow.AddAction(model.ActionFunc(func(m *model.Model) error {
+ return m.ForEachComponent(".sdk-app", 5, func(c *model.Component) error {
+ factory := lib.NewSshConfigFactory(c.GetHost())
+
+ serviceCmd := fmt.Sprintf("nohup sudo /home/%s/fablab/bin/%s run -i /home/%s/fablab/cfg/%s > logs/%s.log 2>&1 &",
+ factory.User(), c.BinaryName, factory.User(), c.PublicIdentity+".json", c.PublicIdentity)
+
+ _, err := lib.RemoteExec(factory, serviceCmd)
+ return err
+ })
+ }))
+
+ return workflow
+}
+
+type startAction struct {
+ Metricbeat MetricbeatConfig
+ Consul ConsulConfig
+}
+
+type MetricbeatConfig struct {
+ ConfigPath string
+ DataPath string
+ LogPath string
+}
+
+type ConsulConfig struct {
+ ConfigDir string
+ ServerAddr string
+ DataPath string
+ LogPath string
+}
diff --git a/network-tests/simple/configs/consul.hcl b/network-tests/simple/configs/consul.hcl
new file mode 100644
index 000000000..0f333bb3b
--- /dev/null
+++ b/network-tests/simple/configs/consul.hcl
@@ -0,0 +1,24 @@
+datacenter = "ziti-build-metrics"
+data_dir = "/opt/consul"
+encrypt = "${encryption_key}"
+advertise_addr="${public_ip}"
+
+
+tls {
+ defaults {
+ verify_incoming = false
+ verify_outgoing = true
+
+ ca_file="consul/consul-agent-ca.pem"
+ }
+}
+
+auto_encrypt {
+ tls = true
+}
+
+acl {
+ enabled = true
+ default_policy = "allow"
+ enable_token_persistence = true
+}
diff --git a/network-tests/simple-transfer/configs/ctrl.yml b/network-tests/simple/configs/ctrl.yml
similarity index 100%
rename from network-tests/simple-transfer/configs/ctrl.yml
rename to network-tests/simple/configs/ctrl.yml
diff --git a/network-tests/simple-transfer/configs/elasticsearch.repo b/network-tests/simple/configs/elasticsearch.repo
similarity index 100%
rename from network-tests/simple-transfer/configs/elasticsearch.repo
rename to network-tests/simple/configs/elasticsearch.repo
diff --git a/network-tests/simple/configs/metricbeat.yml b/network-tests/simple/configs/metricbeat.yml
new file mode 100644
index 000000000..35c1cc9f6
--- /dev/null
+++ b/network-tests/simple/configs/metricbeat.yml
@@ -0,0 +1,53 @@
+fields_under_root: true
+fields:
+ build_number: ${build_number}
+ ziti_version: ${ziti_version}
+
+processors:
+ - add_cloud_metadata: ~
+
+metricbeat.modules:
+- module: system
+ metricsets:
+ - cpu # CPU usage
+ - load # CPU load averages
+ - memory # Memory usage
+ - network # Network IO
+ enabled: true
+ period: 30s
+ cpu.metrics: ["percentages"] # The other available options are normalized_percentages and ticks.
+ core.metrics: ["percentages"] # The other available option is ticks.
+#- module: docker
+# metricsets:
+# - "container"
+# - "cpu"
+# - "diskio"
+# - "healthcheck"
+# - "info"
+# - "image"
+# - "memory"
+# - "network"
+# hosts: ["unix:///var/run/docker.sock"]
+# period: 30s
+# enabled: true
+# # If set to true, replace dots in labels with `_`.
+# labels.dedot: true
+
+
+output.elasticsearch:
+ # Array of hosts to connect to.
+ hosts: ["${host}"]
+
+ # Optional protocol and basic auth credentials.
+ protocol: "https"
+ username: "${user}"
+ password: "${password}"
+ index: 'zt-%{[agent.version]}-%{+yyyy.MM.dd}'
+
+setup.template.enabled: true
+setup.template.name: 'zt-%{[agent.version]}'
+setup.template.pattern: 'zt-%{[agent.version]}-*'
+setup.template.fields: "/etc/metricbeat/fields.yml"
+setup.template.settings:
+ index.number_of_shards: 1
+ index.codec: best_compression
\ No newline at end of file
diff --git a/network-tests/simple-transfer/configs/router.yml b/network-tests/simple/configs/router.yml
similarity index 100%
rename from network-tests/simple-transfer/configs/router.yml
rename to network-tests/simple/configs/router.yml
diff --git a/network-tests/simple/configs/ziti.hcl b/network-tests/simple/configs/ziti.hcl
new file mode 100644
index 000000000..4af438cc0
--- /dev/null
+++ b/network-tests/simple/configs/ziti.hcl
@@ -0,0 +1,9 @@
+service {
+ name = "ziti"
+ id = "ziti"
+ port = 6262
+ meta {
+ build_number= "${build_number}"
+ ziti_version= "${ziti_version}"
+ }
+}
\ No newline at end of file
diff --git a/network-tests/simple/simple.go b/network-tests/simple/simple.go
new file mode 100644
index 000000000..91a27688a
--- /dev/null
+++ b/network-tests/simple/simple.go
@@ -0,0 +1,318 @@
+/*
+ (c) Copyright NetFoundry Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+package simple
+
+import (
+ "embed"
+ "fmt"
+ "github.com/openziti/fablab/kernel/lib/actions/component"
+ "github.com/openziti/fablab/kernel/lib/binding"
+ "github.com/openziti/fablab/kernel/lib/runlevel/0_infrastructure/aws_ssh_key"
+ semaphore0 "github.com/openziti/fablab/kernel/lib/runlevel/0_infrastructure/semaphore"
+ terraform_0 "github.com/openziti/fablab/kernel/lib/runlevel/0_infrastructure/terraform"
+ "github.com/openziti/fablab/kernel/lib/runlevel/1_configuration/config"
+ "github.com/openziti/fablab/kernel/lib/runlevel/2_kitting/devkit"
+ 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"
+ 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"
+ "github.com/sirupsen/logrus"
+ "os"
+ "time"
+)
+
+//go:embed configs
+var configResource embed.FS
+
+func getConfigData(filePath string) []byte {
+ data, err := configResource.ReadFile(fmt.Sprintf("configs/%s", filePath))
+ if err != nil {
+ logrus.Errorf("Unable to read config data from %s: [%s]", filePath, err)
+ }
+ return data
+}
+
+var Model = &model.Model{
+ Id: "simple-transfer",
+ Scope: model.Scope{
+ Defaults: model.Variables{
+ "environment": "simple-transfer-smoketest",
+ "credentials": model.Variables{
+ "ssh": model.Variables{
+ "username": "ubuntu",
+ },
+ "edge": model.Variables{
+ "username": "admin",
+ "password": "admin",
+ },
+ },
+ },
+ },
+
+ Factories: []model.Factory{
+ model.FactoryFunc(func(m *model.Model) error {
+ m.AddActivationActions("stop", "bootstrap", "start")
+ m.AddOperatingStage(runlevel_5_operation.AssertEcho("#echo-client"))
+
+ return nil
+ }),
+ },
+
+ Resources: model.Resources{
+ resources.Configs: resources.SubFolder(configResource, "configs"),
+ resources.Terraform: test_resources.TerraformResources(),
+ },
+
+ Regions: model.Regions{
+ "us-east-1": {
+ Region: "us-east-1",
+ Site: "us-east-1a",
+ Hosts: model.Hosts{
+ "ctrl": {
+ InstanceType: "t2.micro",
+ Components: model.Components{
+ "ctrl": {
+ Scope: model.Scope{Tags: model.Tags{"ctrl"}},
+ BinaryName: "ziti controller",
+ ConfigSrc: "ctrl.yml",
+ ConfigName: "ctrl.yml",
+ PublicIdentity: "ctrl",
+ },
+ "consul": {
+ BinaryName: "consul",
+ },
+ },
+ },
+ "router-east-1": {
+ Scope: model.Scope{Tags: model.Tags{"ert-client"}},
+ InstanceType: "t2.micro",
+ Components: model.Components{
+ "router-east-1": {
+ Scope: model.Scope{Tags: model.Tags{"edge-router", "terminator", "tunneler", "client"}},
+ BinaryName: "ziti router",
+ ConfigSrc: "router.yml",
+ ConfigName: "router-east-1.yml",
+ PublicIdentity: "router-east-1",
+ RunWithSudo: true,
+ },
+ "echo-client": {
+ Scope: model.Scope{Tags: model.Tags{"sdk-app", "client"}},
+ BinaryName: "echo-client",
+ PublicIdentity: "echo-client",
+ },
+ "consul": {
+ BinaryName: "consul",
+ },
+ },
+ },
+ "router-east-2": {
+ InstanceType: "t2.micro",
+ Components: model.Components{
+ "router-east-2": {
+ Scope: model.Scope{Tags: model.Tags{"edge-router", "initiator"}},
+ BinaryName: "ziti router",
+ ConfigSrc: "router.yml",
+ ConfigName: "router-east-2.yml",
+ PublicIdentity: "router-east-2",
+ },
+ "consul": {
+ BinaryName: "consul",
+ },
+ },
+ },
+ "ziti-edge-tunnel-client": {
+ Scope: model.Scope{Tags: model.Tags{"zet-client"}},
+ InstanceType: "t2.micro",
+ Components: model.Components{
+ "ziti-edge-tunnel-client": {
+ Scope: model.Scope{Tags: model.Tags{"sdk-app", "client"}},
+ BinaryName: "ziti-edge-tunnel",
+ PublicIdentity: "ziti-edge-tunnel-client",
+ RunWithSudo: true,
+ },
+ "consul": {
+ BinaryName: "consul",
+ },
+ },
+ },
+ },
+ },
+ "us-west-2": {
+ Region: "us-west-2",
+ Site: "us-west-2b",
+ Hosts: model.Hosts{
+ "router-west": {
+ Scope: model.Scope{Tags: model.Tags{}},
+ InstanceType: "t2.micro",
+ Components: model.Components{
+ "router-west": {
+ Scope: model.Scope{Tags: model.Tags{"edge-router", "tunneler", "host", "ert-host"}},
+ BinaryName: "ziti router",
+ ConfigSrc: "router.yml",
+ ConfigName: "router-west.yml",
+ PublicIdentity: "router-west",
+ RunWithSudo: true,
+ },
+ "echo-server": {
+ Scope: model.Scope{Tags: model.Tags{"sdk-app", "service"}},
+ BinaryName: "echo-server",
+ PublicIdentity: "echo-server",
+ },
+ "consul": {
+ BinaryName: "consul",
+ },
+ },
+ },
+ "ziti-edge-tunnel-host": {
+ InstanceType: "t2.micro",
+ Components: model.Components{
+ "ziti-edge-tunnel-host": {
+ Scope: model.Scope{Tags: model.Tags{"sdk-app", "host", "zet-host"}},
+ BinaryName: "ziti-edge-tunnel",
+ PublicIdentity: "ziti-edge-tunnel-host",
+ RunWithSudo: true,
+ },
+ "consul": {
+ BinaryName: "consul",
+ },
+ },
+ },
+ },
+ },
+ },
+
+ Actions: model.ActionBinders{
+ "bootstrap": actions2.NewBootstrapAction(),
+ "start": actions2.NewStartAction(actions2.MetricbeatConfig{
+ ConfigPath: "metricbeat",
+ DataPath: "metricbeat/data",
+ LogPath: "metricbeat/logs",
+ },
+ actions2.ConsulConfig{
+ ServerAddr: os.Getenv("CONSUL_ENDPOINT"),
+ ConfigDir: "consul",
+ DataPath: "consul/data",
+ LogPath: "consul/log.out",
+ }),
+ "stop": model.Bind(component.StopInParallel("*", 15)),
+ "login": model.Bind(edge.Login("#ctrl")),
+ },
+
+ Infrastructure: model.InfrastructureStages{
+ aws_ssh_key.Express(),
+ terraform_0.Express(),
+ semaphore0.Ready(time.Minute),
+ },
+
+ Configuration: model.ConfigurationStages{
+ zitilib_runlevel_1_configuration.IfPkiNeedsRefresh(
+ zitilib_runlevel_1_configuration.Fabric("simple-transfer.test", "#ctrl"),
+ ),
+ config.Component(),
+ devkit.DevKitF(zitilab.ZitiRoot, []string{"ziti", "ziti-echo"}),
+ //stageziti.FetchZitiEdgeTunnel("v0.21.4"),
+ },
+
+ Distribution: model.DistributionStages{
+ distribution.DistributeSshKey("*"),
+ distribution.Locations("*", "logs"),
+ distribution.DistributeDataWithReplaceCallbacks(
+ "*",
+ string(getConfigData("metricbeat.yml")),
+ "metricbeat/metricbeat.yml",
+ os.FileMode(0644),
+ map[string]func(*model.Host) string{
+ "${host}": func(h *model.Host) string {
+ return os.Getenv("ELASTIC_ENDPOINT")
+ },
+ "${user}": func(h *model.Host) string {
+ return os.Getenv("ELASTIC_USERNAME")
+ },
+ "${password}": func(h *model.Host) string {
+ return os.Getenv("ELASTIC_PASSWORD")
+ },
+ "${build_number}": func(h *model.Host) string {
+ return os.Getenv("BUILD_NUMBER")
+ },
+ "${ziti_version}": func(h *model.Host) string {
+ return h.MustStringVariable("ziti_version")
+ },
+ },
+ ),
+
+ distribution.DistributeDataWithReplaceCallbacks(
+ "*",
+ string(getConfigData("consul.hcl")),
+ "consul/consul.hcl",
+ os.FileMode(0644),
+ map[string]func(*model.Host) string{
+ "${public_ip}": func(h *model.Host) string {
+ return h.PublicIp
+ },
+ "${encryption_key}": func(h *model.Host) string {
+ return os.Getenv("CONSUL_ENCRYPTION_KEY")
+ },
+ "${build_number}": func(h *model.Host) string {
+ return os.Getenv("BUILD_NUMBER")
+ },
+ "${ziti_version}": func(h *model.Host) string {
+ return h.MustStringVariable("ziti_version")
+ },
+ },
+ ),
+ distribution.DistributeDataWithReplaceCallbacks(
+ "#ctrl",
+ string(getConfigData("ziti.hcl")),
+ "consul/ziti.hcl",
+ os.FileMode(0644),
+ map[string]func(*model.Host) string{
+ "${build_number}": func(h *model.Host) string {
+ return os.Getenv("BUILD_NUMBER")
+ },
+ "${ziti_version}": func(h *model.Host) string {
+ return h.MustStringVariable("ziti_version")
+ },
+ }),
+ distribution.DistributeData(
+ "*",
+ []byte(os.Getenv("CONSUL_AGENT_CERT")),
+ "consul/consul-agent-ca.pem"),
+ rsync.RsyncStaged(),
+ },
+
+ Disposal: model.DisposalStages{
+ terraform.Dispose(),
+ aws_ssh_key2.Dispose(),
+ },
+}
+
+func InitBootstrapExtensions() {
+ model.AddBootstrapExtension(
+ zitilab.BootstrapWithFallbacks(
+ &zitilab.BootstrapFromEnv{},
+ ))
+ model.AddBootstrapExtension(binding.AwsCredentialsLoader)
+ model.AddBootstrapExtension(aws_ssh_key.KeyManager)
+}
diff --git a/network-tests/simple-transfer/stages/5_operation/echo_client.go b/network-tests/simple/stages/5_operation/echo_client.go
similarity index 80%
rename from network-tests/simple-transfer/stages/5_operation/echo_client.go
rename to network-tests/simple/stages/5_operation/echo_client.go
index a753185af..4ae6f01aa 100644
--- a/network-tests/simple-transfer/stages/5_operation/echo_client.go
+++ b/network-tests/simple/stages/5_operation/echo_client.go
@@ -1,7 +1,9 @@
package runlevel_5_operation
import (
+ "crypto/rand"
"fmt"
+ "net/url"
"strings"
"github.com/openziti/fablab/kernel/lib"
@@ -14,10 +16,13 @@ type echoClient struct {
message string
}
-func AssertEcho(componentSpec, message string) model.OperatingStage {
+func AssertEcho(componentSpec string) model.OperatingStage {
+ data := make([]byte, 10000)
+ _, _ = rand.Read(data)
+
return &echoClient{
componentSpec: componentSpec,
- message: message,
+ message: url.QueryEscape(string(data)),
}
}
@@ -36,7 +41,7 @@ func (ec *echoClient) Operate(run model.Run) error {
//trim the newline ssh added
output = strings.TrimRight(output, "\n")
if output != ec.message {
- return fmt.Errorf("Got message [%s] expected [%s]", output, ec.message)
+ return fmt.Errorf("got message [%s] expected [%s]", output, ec.message)
}
}
return nil
diff --git a/network-tests/simple-transfer/stages/5_operation/echo_server.go b/network-tests/simple/stages/5_operation/echo_server.go
similarity index 100%
rename from network-tests/simple-transfer/stages/5_operation/echo_server.go
rename to network-tests/simple/stages/5_operation/echo_server.go
diff --git a/network-tests/tests/files_test.go b/network-tests/tests/files_test.go
new file mode 100644
index 000000000..8d3559533
--- /dev/null
+++ b/network-tests/tests/files_test.go
@@ -0,0 +1,85 @@
+/*
+ (c) Copyright NetFoundry Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+package tests
+
+import (
+ "fmt"
+ "github.com/openziti/fablab/kernel/lib"
+ "github.com/openziti/fablab/kernel/model"
+ "github.com/stretchr/testify/require"
+ "testing"
+ "time"
+)
+
+var hashes = map[string]string{
+ "1KB": "0f343b0931126a20f133d67c2b018a3b",
+ "100KB": "4c6426ac7ef186464ecbb0d81cbfcb1e",
+ "20MB": "8f4e33f3dc3e414ff94e5fb6905cba8c",
+}
+
+type httpClient string
+
+const (
+ ClientCurl httpClient = "curl"
+ ClientWget httpClient = "wget"
+)
+
+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)
+ }
+ }
+ }
+ }
+ }
+}
+
+func testFileDownload(t *testing.T, hostSelector string, client httpClient, hostType string, encrypted bool, fileSize string, timeout time.Duration) {
+ encDesk := "encrypted"
+ if !encrypted {
+ encDesk = "unencrypted"
+ }
+
+ t.Run(fmt.Sprintf("%v-(%s->%s)-%s-%v", client, hostSelector, hostType, fileSize, encDesk), func(t *testing.T) {
+ host, err := model.GetModel().SelectHost("." + hostSelector + "-client")
+ req := require.New(t)
+ req.NoError(err)
+
+ urlExtra := ""
+ if !encrypted {
+ urlExtra = "-unencrypted"
+ }
+
+ url := fmt.Sprintf("https://ziti-files-%s%s.s3-us-west-1.amazonaws.ziti/%s.zip", hostType, urlExtra, fileSize)
+ sshConfigFactory := lib.NewSshConfigFactory(host)
+
+ var cmd string
+ if client == ClientCurl {
+ cmd = fmt.Sprintf(`set -o pipefail; curl -k --header "Host: ziti-smoketest-files.s3-us-west-1.amazonaws.com" -fSL -o - %s | md5sum`, url)
+ } else if client == ClientWget {
+ 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)
+ }
+
+ o, err := lib.RemoteExecAllWithTimeout(sshConfigFactory, timeout, cmd)
+ req.NoError(err)
+ req.Equal(hashes[fileSize], o[0:32])
+ })
+}
diff --git a/network-tests/tests/matrix.md b/network-tests/tests/matrix.md
new file mode 100644
index 000000000..66c2e9595
--- /dev/null
+++ b/network-tests/tests/matrix.md
@@ -0,0 +1,32 @@
+# Test Matrix
+
+## Services
+
+* File transfer
+* IPerf
+* Fortio
+* ziti-fabric-test loop
+
+## Clients
+
+* File Transfer
+ * curl ER/T
+ * curl ziti-edge-tunnel
+ * sdk
+* IPerf
+ * ER/T
+ * ziti-edge-tunnnel
+* Fortio
+ * ER/T
+ * ziti-edge-tunnel
+ * sdk?
+* ziti-fabric-test loop
+ * ziti-fabric-test loop
+
+## Hosting Options
+
+* Edge Router/Tunneler - encrypted and non-encrypted
+* ziti-edge-tunnel - encrypted and non-encyrpted
+* router
+
+
diff --git a/network-tests/tests/model_test.go b/network-tests/tests/model_test.go
new file mode 100644
index 000000000..ee3589479
--- /dev/null
+++ b/network-tests/tests/model_test.go
@@ -0,0 +1,48 @@
+/*
+ (c) Copyright NetFoundry Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+package tests
+
+import (
+ "github.com/openziti/fablab"
+ "github.com/openziti/fablab/kernel/model"
+ "github.com/openziti/ziti/network-tests/simple"
+ "github.com/pkg/errors"
+ "github.com/sirupsen/logrus"
+)
+
+var run model.Run
+
+func init() {
+ cfg := model.GetConfig()
+ instance, found := cfg.Instances[cfg.GetSelectedInstanceId()]
+ if !found {
+ panic(errors.Errorf("no instance found for current instance id %v", cfg.GetSelectedInstanceId()))
+ }
+
+ if instance.Model == simple.Model.Id {
+ simple.InitBootstrapExtensions()
+ fablab.InitModel(simple.Model)
+ } else {
+ panic(errors.Errorf("unsupported model for network tests [%v]", instance.Model))
+ }
+
+ if err := model.Bootstrap(); err != nil {
+ logrus.Fatalf("unable to bootstrap (%s)", err)
+ }
+
+ run = model.NewRun()
+}
diff --git a/network-tests/utils/ziti-echo/cmd/client.go b/network-tests/utils/ziti-echo/cmd/client.go
index b6e43b82b..36928b60b 100644
--- a/network-tests/utils/ziti-echo/cmd/client.go
+++ b/network-tests/utils/ziti-echo/cmd/client.go
@@ -3,6 +3,7 @@ package cmd
import (
"context"
"fmt"
+ "github.com/openziti/sdk-golang/ziti/config"
"io"
"log"
"net"
@@ -11,7 +12,6 @@ import (
"strings"
"github.com/openziti/sdk-golang/ziti"
- "github.com/openziti/sdk-golang/ziti/config"
"github.com/spf13/cobra"
)
@@ -34,6 +34,12 @@ func echoClient(cmd *cobra.Command, args []string) {
}
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]
diff --git a/network-tests/utils/ziti-echo/cmd/server.go b/network-tests/utils/ziti-echo/cmd/server.go
index 8ae90af3d..05f9c1c88 100644
--- a/network-tests/utils/ziti-echo/cmd/server.go
+++ b/network-tests/utils/ziti-echo/cmd/server.go
@@ -1,6 +1,7 @@
package cmd
import (
+ "github.com/openziti/sdk-golang/ziti/config"
"log"
"net"
"net/http"
@@ -10,7 +11,6 @@ import (
"time"
"github.com/openziti/sdk-golang/ziti"
- "github.com/openziti/sdk-golang/ziti/config"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)
@@ -70,6 +70,12 @@ func (s *zitiEchoServer) run() (err error) {
}
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
}
diff --git a/quickstart/docker/.env b/quickstart/docker/.env
index af21b1eff..577d31807 100644
--- a/quickstart/docker/.env
+++ b/quickstart/docker/.env
@@ -12,6 +12,9 @@ ZITI_CONTROLLER_RAWNAME=ziti-controller
#ZITI_CONTROLLER_HOSTNAME=advertised.address
#ZITI_CTRL_PORT=8440
+# Leave password blank to have a unique value generated or set the password explicitly
+ZITI_PWD=
+
ZITI_EDGE_CONTROLLER_RAWNAME=ziti-edge-controller
#ZITI_EDGE_CONTROLLER_HOSTNAME=advertised.address
#ZITI_EDGE_CONTROLLER_PORT=8441
diff --git a/quickstart/docker/docker-compose.yml b/quickstart/docker/docker-compose.yml
index 7cff37dce..cdd600793 100644
--- a/quickstart/docker/docker-compose.yml
+++ b/quickstart/docker/docker-compose.yml
@@ -10,6 +10,7 @@ services:
environment:
- ZITI_EDGE_IDENTITY_ENROLLMENT_DURATION=${ZITI_EDGE_IDENTITY_ENROLLMENT_DURATION}
- ZITI_EDGE_ROUTER_ENROLLMENT_DURATION=${ZITI_EDGE_ROUTER_ENROLLMENT_DURATION}
+ - ZITI_PWD=${ZITI_PWD}
networks:
zitiblue:
aliases:
diff --git a/quickstart/docker/image/run-controller.sh b/quickstart/docker/image/run-controller.sh
index 21a0c34b3..93ec7bd60 100755
--- a/quickstart/docker/image/run-controller.sh
+++ b/quickstart/docker/image/run-controller.sh
@@ -7,8 +7,11 @@ export ZITI_EDGE_CONTROLLER_RAWNAME=ziti-edge-controller
. "${ZITI_SCRIPTS}/ziti-cli-functions.sh"
-generateEnvFile
-. ${ZITI_HOME}/ziti.env
+# access-control.init is created by ziti-controller-init-container after initial controller startup
+if [ ! -f "${ZITI_HOME}/access-control.init" ]; then
+ generateEnvFile
+fi
+. "${ZITI_HOME}/ziti.env"
# create pki
createPki
diff --git a/quickstart/docker/image/ziti-cli-functions.sh b/quickstart/docker/image/ziti-cli-functions.sh
index 1520ba7bd..f408c7f48 100755
--- a/quickstart/docker/image/ziti-cli-functions.sh
+++ b/quickstart/docker/image/ziti-cli-functions.sh
@@ -2,14 +2,6 @@
set -uo pipefail
-# the default ZITI_NETWORK (network name) is the short hostname
-: "${DEFAULT_ZITI_NETWORK:="$(hostname -s)"}"
-
-# shellcheck disable=SC2155
-export DEFAULT_ZITI_HOME_LOCATION="${HOME}/.ziti/quickstart/${DEFAULT_ZITI_NETWORK}"
-
-export ZITI_QUICKSTART_ENVROOT="${HOME}/.ziti/quickstart"
-
ASCI_WHITE='\033[01;37m'
ASCI_RESTORE='\033[0m'
ASCI_RED='\033[00;31m'
@@ -44,8 +36,40 @@ function BLUE {
echo "${ASCI_BLUE}${1-}${ASCI_RESTORE}"
}
+function checkPrereqs {
+ commands_to_test=(curl jq tar hostname)
+ missing_requirements=""
+ # verify all the commands required in the automation exist before trying to run the full suite
+ for cmd in "${commands_to_test[@]}"
+ do
+ # checking all commands are on the path before continuing...
+ if ! [[ -x "$(command -v "${cmd}")" ]]; then
+ missing_requirements="${missing_requirements} * ${cmd}
+"
+ fi
+ done
+ # are requirements ? if yes, stop here and help 'em out
+ if ! [[ "" = "${missing_requirements}" ]]; then
+ echo " "
+ echo "You're missing one or more commands that are used in this script."
+ echo "Please ensure the commands listed are on the path and then try again."
+ echo "${missing_requirements}"
+ echo " "
+ return 1
+ fi
+}
+
+checkPrereqs
+
+# the default ZITI_NETWORK (network name) is the short hostname
+: "${DEFAULT_ZITI_NETWORK:="$(hostname -s)"}"
+
+# shellcheck disable=SC2155
+export DEFAULT_ZITI_HOME_LOCATION="${HOME}/.ziti/quickstart/${DEFAULT_ZITI_NETWORK}"
+export ZITI_QUICKSTART_ENVROOT="${HOME}/.ziti/quickstart"
+
function zitiLogin {
- "${ZITI_BIN_DIR-}/ziti" edge login "${ZITI_EDGE_CTRL_ADVERTISED}" -u "${ZITI_USER-}" -p "${ZITI_PWD}" -c "${ZITI_PKI_OS_SPECIFIC}/${ZITI_EDGE_CONTROLLER_ROOTCA_NAME}/certs/${ZITI_EDGE_CONTROLLER_INTERMEDIATE_NAME}.cert"
+ "${ZITI_BIN_DIR-}/ziti" edge login "${ZITI_EDGE_CTRL_ADVERTISED}" -u "${ZITI_USER-}" -p "${ZITI_PWD}" -y
}
function cleanZitiController {
checkEnvVariable ZITI_HOME
@@ -275,31 +299,6 @@ function getZiti {
fi
}
-function checkPrereqs {
- commands_to_test=(curl jq)
- missing_requirements=""
- # verify all the commands required in the automation exist before trying to run the full suite
- for cmd in "${commands_to_test[@]}"
- do
- # checking all commands are on the path before continuing...
- if ! [[ -x "$(command -v "${cmd}")" ]]; then
- missing_requirements="${missing_requirements} * ${cmd}"
- fi
- done
- # are requirements ? if yes, stop here and help 'em out
- if ! [[ "" = "${missing_requirements}" ]]; then
- echo " "
- echo "You're missing one or more commands that are used in this script."
- echo "Please ensure the commands listed are on the path and then try again."
- echo "${missing_requirements}"
- echo " "
- echo " "
- return 1
- else
- echo -e "$(GREEN "Prerequisites confirmed")"
- fi
-}
-
function _portCheck {
if [[ "${1-}" == "" ]] || [[ "${2-}" == "" ]]; then
echo -e "_portCheck Usage: _portCheck "
@@ -1146,8 +1145,7 @@ function ziti_createEnvFile {
echo "export PFXLOG_NO_JSON=true" >> "${ENV_FILE}"
echo "alias zec='ziti edge'" >> "${ENV_FILE}"
- echo "alias zlogin='ziti edge login \"\${ZITI_EDGE_CTRL_ADVERTISED}\" -u \"\${ZITI_USER-}\" -p \"\${ZITI_PWD}\" -c \"\${ZITI_PKI}/\${ZITI_EDGE_CONTROLLER_INTERMEDIATE_NAME}/certs/\${ZITI_EDGE_CONTROLLER_INTERMEDIATE_NAME}.cert\"'" >> "${ENV_FILE}"
- echo "alias zitiLogin='ziti edge login \"\${ZITI_EDGE_CTRL_ADVERTISED}\" -u \"\${ZITI_USER-}\" -p \"\${ZITI_PWD}\" -c \"\${ZITI_PKI}/\${ZITI_EDGE_CONTROLLER_INTERMEDIATE_NAME}/certs/\${ZITI_EDGE_CONTROLLER_INTERMEDIATE_NAME}.cert\"'" >> "${ENV_FILE}"
+ echo "alias zitiLogin='ziti edge login \"\${ZITI_EDGE_CTRL_ADVERTISED}\" -u \"\${ZITI_USER-}\" -p \"\${ZITI_PWD}\" -y'" >> "${ENV_FILE}"
echo "alias psz='ps -ef | grep ziti'" >> "${ENV_FILE}"
#when sourcing the emitted file add the bin folder to the path
diff --git a/quickstart/docker/simplified-docker-compose.yml b/quickstart/docker/simplified-docker-compose.yml
index 407beb3eb..bc9d20e13 100644
--- a/quickstart/docker/simplified-docker-compose.yml
+++ b/quickstart/docker/simplified-docker-compose.yml
@@ -10,6 +10,7 @@ services:
environment:
- ZITI_EDGE_IDENTITY_ENROLLMENT_DURATION=${ZITI_EDGE_IDENTITY_ENROLLMENT_DURATION}
- ZITI_EDGE_ROUTER_ENROLLMENT_DURATION=${ZITI_EDGE_ROUTER_ENROLLMENT_DURATION}
+ - ZITI_PWD=${ZITI_PWD}
networks:
zitiblue:
aliases:
diff --git a/quickstart/local/add-zcat.sh b/quickstart/local/add-zcat.sh
index 22cf2ecd7..0a159558a 100644
--- a/quickstart/local/add-zcat.sh
+++ b/quickstart/local/add-zcat.sh
@@ -1,4 +1,4 @@
-ziti edge login "${ZITI_EDGE_CONTROLLER_API}" -u "${ZITI_USER}" -p "${ZITI_PWD}" -c "${ZITI_PKI}/${ZITI_EDGE_CONTROLLER_ROOTCA_NAME}/certs/${ZITI_EDGE_CONTROLLER_INTERMEDIATE_NAME}.cert"
+ziti edge login "${ZITI_EDGE_CONTROLLER_API}" -u "${ZITI_USER}" -p "${ZITI_PWD}" -y
ziti edge delete service zcatsvc
ziti edge delete config zcatconfig
diff --git a/quickstart/local/newid.sh b/quickstart/local/newid.sh
index 54f063ab1..52f318a9d 100755
--- a/quickstart/local/newid.sh
+++ b/quickstart/local/newid.sh
@@ -1,7 +1,7 @@
suffix=$(date +"%b-%d-%H%M")
idname="User${suffix}"
-ziti edge login "${ZITI_EDGE_CONTROLLER_API}" -u "${ZITI_USER}" -p "${ZITI_PWD}" -c "${ZITI_PKI}/${ZITI_EDGE_CONTROLLER_ROOTCA_NAME}/certs/${ZITI_EDGE_CONTROLLER_INTERMEDIATE_NAME}.cert"
+ziti edge login "${ZITI_EDGE_CONTROLLER_API}" -u "${ZITI_USER}" -p "${ZITI_PWD}" -y
ziti edge delete identity "${idname}"
ziti edge create identity device "${idname}" -o "${ZITI_HOME}/test_identity".jwt
diff --git a/quickstart/local/test-ziti.sh b/quickstart/local/test-ziti.sh
index cb8ac4f9a..44f6b7935 100755
--- a/quickstart/local/test-ziti.sh
+++ b/quickstart/local/test-ziti.sh
@@ -1,4 +1,4 @@
-ziti edge controller login "${ZITI_EDGE_CONTROLLER_API}" -u "${ZITI_USER}" -p "${ZITI_PWD}" -c "${ZITI_PKI}/${ZITI_EDGE_CONTROLLER_ROOTCA_NAME}/certs/${ZITI_EDGE_CONTROLLER_INTERMEDIATE_NAME}.cert"
+ziti edge controller login "${ZITI_EDGE_CONTROLLER_API}" -u "${ZITI_USER}" -p "${ZITI_PWD}" -y
ziti edge delete service netcatsvc
ziti edge delete service zcatsvc
diff --git a/quickstart/test/quickstart_test.go b/quickstart/test/quickstart_test.go
index f0e2a8883..12379cb2f 100644
--- a/quickstart/test/quickstart_test.go
+++ b/quickstart/test/quickstart_test.go
@@ -24,7 +24,6 @@ import (
"github.com/openziti/edge-api/rest_model"
"github.com/openziti/edge-api/rest_util"
"github.com/openziti/sdk-golang/ziti"
- sdk_config "github.com/openziti/sdk-golang/ziti/config"
"github.com/openziti/sdk-golang/ziti/enroll"
"github.com/pkg/errors"
log "github.com/sirupsen/logrus"
@@ -407,7 +406,7 @@ func TestSimpleWebService(t *testing.T) {
assert.Equal(t, 200, resp.StatusCode, fmt.Sprintf("Expected successful HTTP status code 200, received %d instead", resp.StatusCode))
}
-func enrollIdentity(client *rest_management_api_client.ZitiEdgeManagement, identityID string) *sdk_config.Config {
+func enrollIdentity(client *rest_management_api_client.ZitiEdgeManagement, identityID string) *ziti.Config {
// Get the identity object
params := &identity.DetailIdentityParams{
Context: context.Background(),
@@ -447,11 +446,14 @@ func Dial(_ context.Context, _ string, addr string) (net.Conn, error) {
}
func createZitifiedHttpClient(idFile string) http.Client {
- cfg, err := sdk_config.NewFromFile(idFile)
+ cfg, err := ziti.NewConfigFromFile(idFile)
+ if err != nil {
+ panic(err)
+ }
+ zitiContext, err = ziti.NewContext(cfg)
if err != nil {
panic(err)
}
- zitiContext = ziti.NewContextWithConfig(cfg)
zitiTransport := http.DefaultTransport.(*http.Transport).Clone() // copy default transport
zitiTransport.DialContext = Dial //zitiDialContext.Dial
return http.Client{Transport: zitiTransport}
diff --git a/version b/version
index 5a9e6bda2..4950f07e4 100644
--- a/version
+++ b/version
@@ -1 +1 @@
-0.27
+0.28
diff --git a/ziti-fabric-test/subcmd/loop2/dialer.go b/ziti-fabric-test/subcmd/loop2/dialer.go
index 0603f719c..19cea5dba 100644
--- a/ziti-fabric-test/subcmd/loop2/dialer.go
+++ b/ziti-fabric-test/subcmd/loop2/dialer.go
@@ -20,10 +20,9 @@ import (
"fmt"
"github.com/michaelquigley/pfxlog"
"github.com/openziti/fabric/router/xgress_transport"
- "github.com/openziti/identity/dotziti"
"github.com/openziti/identity"
+ "github.com/openziti/identity/dotziti"
"github.com/openziti/sdk-golang/ziti"
- "github.com/openziti/sdk-golang/ziti/config"
"github.com/openziti/transport/v2"
"github.com/openziti/ziti/ziti-fabric-test/subcmd/loop2/pb"
"github.com/spf13/cobra"
@@ -162,13 +161,17 @@ func (cmd *dialerCmd) connect() net.Conn {
var context ziti.Context
if cmd.edgeConfigFile != "" {
- zitiCfg, err := config.NewFromFile(cmd.edgeConfigFile)
+ zitiCfg, err := ziti.NewConfigFromFile(cmd.edgeConfigFile)
if err != nil {
log.Fatalf("failed to load ziti configuration from %s: %v", cmd.edgeConfigFile, err)
}
- context = ziti.NewContextWithConfig(zitiCfg)
+
+ context, err = ziti.NewContext(zitiCfg)
+ if err != nil {
+ log.Fatalf("failed to load ziti context fromt configuration: %v", err)
+ }
} else {
- context = ziti.NewContext()
+ log.Fatal("no configuration file provided")
}
service := strings.TrimPrefix(cmd.endpoint, "edge:")
diff --git a/ziti-fabric-test/subcmd/loop2/listener.go b/ziti-fabric-test/subcmd/loop2/listener.go
index 84e0daa95..f4487617e 100644
--- a/ziti-fabric-test/subcmd/loop2/listener.go
+++ b/ziti-fabric-test/subcmd/loop2/listener.go
@@ -18,10 +18,9 @@ package loop2
import (
"github.com/michaelquigley/pfxlog"
- "github.com/openziti/identity/dotziti"
"github.com/openziti/identity"
+ "github.com/openziti/identity/dotziti"
"github.com/openziti/sdk-golang/ziti"
- "github.com/openziti/sdk-golang/ziti/config"
"github.com/openziti/transport/v2"
"github.com/openziti/ziti/ziti-fabric-test/subcmd/loop2/pb"
"github.com/spf13/cobra"
@@ -85,13 +84,17 @@ func (cmd *listenerCmd) listenEdge() {
var context ziti.Context
if cmd.edgeConfigFile != "" {
- zitiCfg, err := config.NewFromFile(cmd.edgeConfigFile)
+ zitiCfg, err := ziti.NewConfigFromFile(cmd.edgeConfigFile)
if err != nil {
log.Fatalf("failed to load ziti configuration from %s: %v", cmd.edgeConfigFile, err)
}
- context = ziti.NewContextWithConfig(zitiCfg)
+
+ context, err = ziti.NewContext(zitiCfg)
+ if err != nil {
+ log.Fatalf("failed to load ziti context from cofnig: %v", err)
+ }
} else {
- context = ziti.NewContext()
+ log.Fatal("no configuration file provided")
}
service := strings.TrimPrefix(cmd.bindAddress, "edge:")
diff --git a/ziti-fabric-test/subcmd/loop3/dialer.go b/ziti-fabric-test/subcmd/loop3/dialer.go
index 0a1160ee9..ef47515c9 100644
--- a/ziti-fabric-test/subcmd/loop3/dialer.go
+++ b/ziti-fabric-test/subcmd/loop3/dialer.go
@@ -19,12 +19,11 @@ package loop3
import (
"fmt"
"github.com/michaelquigley/pfxlog"
- "github.com/openziti/fabric/router/xgress_transport"
"github.com/openziti/agent"
- "github.com/openziti/identity/dotziti"
+ "github.com/openziti/fabric/router/xgress_transport"
"github.com/openziti/identity"
+ "github.com/openziti/identity/dotziti"
"github.com/openziti/sdk-golang/ziti"
- "github.com/openziti/sdk-golang/ziti/config"
"github.com/openziti/transport/v2"
"github.com/spf13/cobra"
"net"
@@ -158,13 +157,17 @@ func (cmd *dialerCmd) connect() net.Conn {
if strings.HasPrefix(cmd.endpoint, "edge:") {
var context ziti.Context
if cmd.edgeConfigFile != "" {
- zitiCfg, err := config.NewFromFile(cmd.edgeConfigFile)
+ zitiCfg, err := ziti.NewConfigFromFile(cmd.edgeConfigFile)
if err != nil {
log.Fatalf("failed to load ziti configuration from %s: %v", cmd.edgeConfigFile, err)
}
- context = ziti.NewContextWithConfig(zitiCfg)
+ context, err = ziti.NewContext(zitiCfg)
+
+ if err != nil {
+ log.Fatalf("failed to load ziti context from config: %v", err)
+ }
} else {
- context = ziti.NewContext()
+ log.Fatal("no configuration provided")
}
service := strings.TrimPrefix(cmd.endpoint, "edge:")
diff --git a/ziti-fabric-test/subcmd/loop3/listener.go b/ziti-fabric-test/subcmd/loop3/listener.go
index e000fb09b..37cde75a9 100644
--- a/ziti-fabric-test/subcmd/loop3/listener.go
+++ b/ziti-fabric-test/subcmd/loop3/listener.go
@@ -20,10 +20,9 @@ import (
"errors"
"github.com/michaelquigley/pfxlog"
"github.com/openziti/agent"
- "github.com/openziti/identity/dotziti"
"github.com/openziti/identity"
+ "github.com/openziti/identity/dotziti"
"github.com/openziti/sdk-golang/ziti"
- "github.com/openziti/sdk-golang/ziti/config"
"github.com/openziti/transport/v2"
loop3_pb "github.com/openziti/ziti/ziti-fabric-test/subcmd/loop3/pb"
"github.com/sirupsen/logrus"
@@ -138,13 +137,17 @@ func (cmd *listenerCmd) listenEdge() {
var context ziti.Context
if cmd.edgeConfigFile != "" {
- zitiCfg, err := config.NewFromFile(cmd.edgeConfigFile)
+ zitiCfg, err := ziti.NewConfigFromFile(cmd.edgeConfigFile)
if err != nil {
log.Fatalf("failed to load ziti configuration from %s: %v", cmd.edgeConfigFile, err)
}
- context = ziti.NewContextWithConfig(zitiCfg)
+ context, err = ziti.NewContext(zitiCfg)
+
+ if err != nil {
+ log.Fatalf("failed to load ziti context from config: %v", err)
+ }
} else {
- context = ziti.NewContext()
+ log.Fatal("no configuration provided")
}
service := strings.TrimPrefix(cmd.bindAddress, "edge:")
diff --git a/ziti-fabric-test/subcmd/loop3/metrics.go b/ziti-fabric-test/subcmd/loop3/metrics.go
index b748746d3..b538fb48d 100644
--- a/ziti-fabric-test/subcmd/loop3/metrics.go
+++ b/ziti-fabric-test/subcmd/loop3/metrics.go
@@ -5,7 +5,6 @@ import (
"github.com/michaelquigley/pfxlog"
"github.com/openziti/fabric/pb/mgmt_pb"
"github.com/openziti/sdk-golang/ziti"
- "github.com/openziti/sdk-golang/ziti/config"
"github.com/pkg/errors"
"github.com/rcrowley/go-metrics"
"google.golang.org/protobuf/proto"
@@ -69,13 +68,17 @@ func (r *zitiMetricsReporter) run(reportInterval time.Duration) {
var client ziti.Context
if r.configFile != "" {
- sdkConfig, err := config.NewFromFile(r.configFile)
+ sdkConfig, err := ziti.NewConfigFromFile(r.configFile)
+ if err != nil {
+ panic(err)
+ }
+ client, err = ziti.NewContext(sdkConfig)
+
if err != nil {
panic(err)
}
- client = ziti.NewContextWithConfig(sdkConfig)
} else {
- client = ziti.NewContext()
+ panic("no configuration file provided")
}
conn, err := client.Dial(r.service)
diff --git a/ziti/cmd/agentcli/agent.go b/ziti/cmd/agentcli/agent.go
index 57e11ee09..b18291a57 100644
--- a/ziti/cmd/agentcli/agent.go
+++ b/ziti/cmd/agentcli/agent.go
@@ -91,6 +91,7 @@ func NewAgentCmd(p common.OptionsProvider) *cobra.Command {
agentCmd.AddCommand(routerCmd)
routerCmd.AddCommand(NewRouteCmd(p))
+ routerCmd.AddCommand(NewUnrouteCmd(p))
routerCmd.AddCommand(NewSimpleAgentCustomCmd("dump-api-sessions", AgentAppRouter, debugops.DumpApiSessions, p))
routerCmd.AddCommand(NewSimpleChAgentCustomCmd("dump-routes", AgentAppRouter, int32(mgmt_pb.ContentType_RouterDebugDumpForwarderTablesRequestType), p))
routerCmd.AddCommand(NewSimpleChAgentCustomCmd("dump-links", AgentAppRouter, int32(mgmt_pb.ContentType_RouterDebugDumpLinksRequestType), p))
@@ -202,15 +203,7 @@ func (self *AgentOptions) RunCopyOut(op byte, params []byte, out io.Writer) erro
})
}
- if len(self.Args) == 0 {
- return self.MakeRequest(op, params, self.CopyToWriter(out))
- }
-
- addr, err := agent.ParseGopsAddress(self.Args)
- if err != nil {
- return err
- }
- return agent.MakeRequest(addr, op, params, os.Stdout)
+ return self.MakeRequest(op, params, self.CopyToWriter(out))
}
func NewAgentChannel(conn net.Conn) (channel.Channel, error) {
diff --git a/ziti/cmd/agentcli/agent_ps.go b/ziti/cmd/agentcli/agent_ps.go
index f88bb48e0..71587e33b 100644
--- a/ziti/cmd/agentcli/agent_ps.go
+++ b/ziti/cmd/agentcli/agent_ps.go
@@ -19,20 +19,21 @@ package agentcli
import (
"bytes"
"fmt"
- "github.com/keybase/go-ps"
- "github.com/openziti/ziti/ziti/cmd/common"
- cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers"
- "github.com/pkg/errors"
- "github.com/spf13/cobra"
"os"
"os/user"
"path/filepath"
"regexp"
- goversion "rsc.io/goversion/version"
"runtime"
"strconv"
"strings"
"sync"
+
+ "github.com/openziti/ziti/ziti/cmd/common"
+ cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers"
+ "github.com/pkg/errors"
+ "github.com/shirou/gopsutil/v3/process"
+ "github.com/spf13/cobra"
+ goversion "rsc.io/goversion/version"
)
type AgentPsAction struct {
@@ -149,7 +150,7 @@ type P struct {
// FindAll returns all the Ziti processes currently running on this host.
func FindAll() []P {
- pss, err := ps.Processes()
+ pss, err := process.Processes()
// fmt.Println("FindAll, err is: %s", err)
if err != nil {
@@ -172,11 +173,19 @@ func FindAll() []P {
if !ok {
return
}
+ ppid, err := pr.Ppid()
+ if err != nil {
+ return
+ }
+ name, err := pr.Name()
+ if err != nil {
+ return
+ }
if isZiti(pr) {
found <- P{
- PID: pr.Pid(),
- PPID: pr.PPid(),
- Exec: pr.Executable(),
+ PID: int(pr.Pid),
+ PPID: int(ppid),
+ Exec: name,
Path: path,
BuildVersion: version,
Agent: agent,
@@ -199,12 +208,12 @@ func FindAll() []P {
// in the process' binary and determines if the process
// if a Go process or not. If the process is a Go process,
// it reports PID, binary name and full path of the binary.
-func isGo(pr ps.Process) (path, version string, agent, ok bool, err error) {
- if pr.Pid() == 0 {
+func isGo(pr *process.Process) (path, version string, agent, ok bool, err error) {
+ if pr.Pid == 0 {
// ignore system process
return
}
- path, err = pr.Path()
+ path, err = pr.Exe()
if err != nil {
return
}
@@ -215,7 +224,7 @@ func isGo(pr ps.Process) (path, version string, agent, ok bool, err error) {
}
ok = true
version = versionInfo.Release
- pidfile, err := PIDFile(pr.Pid())
+ pidfile, err := PIDFile(int(pr.Pid))
if err == nil {
_, err := os.Stat(pidfile)
agent = err == nil
@@ -256,6 +265,10 @@ func PIDFile(pid int) (string, error) {
return fmt.Sprintf("%s/%d", gopsdir, pid), nil
}
-func isZiti(pr ps.Process) (ok bool) {
- return strings.HasPrefix(pr.Executable(), "ziti")
+func isZiti(pr *process.Process) (ok bool) {
+ name, err := pr.Name()
+ if err != nil {
+ return false
+ }
+ return strings.HasPrefix(name, "ziti")
}
diff --git a/ziti/cmd/agentcli/agent_router_add_route.go b/ziti/cmd/agentcli/agent_router_add_route.go
index 71e338ed5..d88bcc11f 100644
--- a/ziti/cmd/agentcli/agent_router_add_route.go
+++ b/ziti/cmd/agentcli/agent_router_add_route.go
@@ -39,7 +39,7 @@ func NewRouteCmd(p common.OptionsProvider) *cobra.Command {
}
cmd := &cobra.Command{
- Args: cobra.RangeArgs(3, 4),
+ Args: cobra.ExactArgs(4),
Use: "route ",
RunE: func(cmd *cobra.Command, args []string) error {
action.Cmd = cmd
diff --git a/ziti/cmd/agentcli/agent_router_unroute.go b/ziti/cmd/agentcli/agent_router_unroute.go
new file mode 100644
index 000000000..777ec5b3b
--- /dev/null
+++ b/ziti/cmd/agentcli/agent_router_unroute.go
@@ -0,0 +1,88 @@
+/*
+ Copyright NetFoundry Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+package agentcli
+
+import (
+ "fmt"
+ "github.com/openziti/channel/v2"
+ "github.com/openziti/fabric/pb/ctrl_pb"
+ "github.com/openziti/fabric/pb/mgmt_pb"
+ "github.com/openziti/fabric/router"
+ "github.com/openziti/ziti/ziti/cmd/common"
+ "github.com/spf13/cobra"
+ "google.golang.org/protobuf/proto"
+)
+
+type AgentUnrouteAction struct {
+ AgentOptions
+}
+
+func NewUnrouteCmd(p common.OptionsProvider) *cobra.Command {
+ action := &AgentUnrouteAction{
+ AgentOptions: AgentOptions{
+ CommonOptions: p(),
+ },
+ }
+
+ cmd := &cobra.Command{
+ Args: cobra.ExactArgs(1),
+ Use: "unroute ",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ action.Cmd = cmd
+ action.Args = args
+ return action.MakeChannelRequest(router.AgentAppId, action.makeRequest)
+ },
+ }
+
+ action.AddAgentOptions(cmd)
+
+ return cmd
+}
+
+func (self *AgentUnrouteAction) makeRequest(ch channel.Channel) error {
+ route := &ctrl_pb.Unroute{
+ CircuitId: self.Args[0],
+ Now: true,
+ }
+
+ buf, err := proto.Marshal(route)
+ if err != nil {
+ return err
+ }
+
+ msg := channel.NewMessage(int32(mgmt_pb.ContentType_RouterDebugUnrouteRequestType), buf)
+ reply, err := msg.WithTimeout(self.timeout).SendForReply(ch)
+ if err != nil {
+ return err
+ }
+
+ if reply.ContentType == channel.ContentTypeResultType {
+ result := channel.UnmarshalResult(reply)
+ if result.Success {
+ if len(result.Message) > 0 {
+ fmt.Printf("success: %v\n", result.Message)
+ } else {
+ fmt.Println("success")
+ }
+ } else {
+ fmt.Printf("error: %v\n", result.Message)
+ }
+ } else {
+ fmt.Printf("unexpected response type %v\n", reply.ContentType)
+ }
+ return nil
+}
diff --git a/ziti/cmd/agentcli/agent_set_channel_log_level.go b/ziti/cmd/agentcli/agent_set_channel_log_level.go
index fe8ba3f71..0fb5a1d0d 100644
--- a/ziti/cmd/agentcli/agent_set_channel_log_level.go
+++ b/ziti/cmd/agentcli/agent_set_channel_log_level.go
@@ -43,9 +43,9 @@ func NewSetChannelLogLevelCmd(p common.OptionsProvider) *cobra.Command {
}
cmd := &cobra.Command{
- Use: "set-channel-log-level target channel log-level (panic, fatal, error, warn, info, debug, trace)",
+ Use: "set-channel-log-level channel log-level (panic, fatal, error, warn, info, debug, trace)",
Short: "Sets a channel-specific log level in the target application",
- Args: cobra.MinimumNArgs(2),
+ Args: cobra.ExactArgs(2),
Run: func(cmd *cobra.Command, args []string) {
action.Cmd = cmd
action.Args = args
@@ -68,15 +68,8 @@ func (self *AgentSetChannelLogLevelAction) Run() error {
})
}
- var channelArg string
- var levelArg string
- if len(self.Args) == 2 {
- channelArg = self.Args[0]
- levelArg = self.Args[1]
- } else {
- channelArg = self.Args[1]
- levelArg = self.Args[2]
- }
+ channelArg := self.Args[0]
+ levelArg := self.Args[1]
var level logrus.Level
var found bool
@@ -98,13 +91,5 @@ func (self *AgentSetChannelLogLevelAction) Run() error {
buf.Write([]byte(channelArg))
buf.WriteByte(byte(level))
- if len(self.Args) == 2 {
- return self.MakeRequest(agent.SetChannelLogLevel, buf.Bytes(), self.CopyToWriter(os.Stdout))
- }
-
- addr, err := agent.ParseGopsAddress(self.Args)
- if err != nil {
- return err
- }
- return agent.MakeRequest(addr, agent.SetChannelLogLevel, buf.Bytes(), os.Stdout)
+ return self.MakeRequest(agent.SetChannelLogLevel, buf.Bytes(), self.CopyToWriter(os.Stdout))
}
diff --git a/ziti/cmd/agentcli/agent_set_log_level.go b/ziti/cmd/agentcli/agent_set_log_level.go
index 0c1d08bc5..9fe369417 100644
--- a/ziti/cmd/agentcli/agent_set_log_level.go
+++ b/ziti/cmd/agentcli/agent_set_log_level.go
@@ -41,9 +41,9 @@ func NewSetLogLevelCmd(p common.OptionsProvider) *cobra.Command {
}
cmd := &cobra.Command{
- Use: "set-log-level target log-level (panic, fatal, error, warn, info, debug, trace)",
+ Use: "set-log-level log-level (panic, fatal, error, warn, info, debug, trace)",
Short: "Sets the global logrus logging level in the target application",
- Args: cobra.MinimumNArgs(1),
+ Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {
action.Cmd = cmd
action.Args = args
@@ -66,12 +66,7 @@ func (self *AgentSetLogLevelAction) Run() error {
})
}
- var levelArg string
- if len(self.Args) == 1 {
- levelArg = self.Args[0]
- } else {
- levelArg = self.Args[1]
- }
+ levelArg := self.Args[0]
var level logrus.Level
var found bool
@@ -87,14 +82,5 @@ func (self *AgentSetLogLevelAction) Run() error {
}
buf := []byte{byte(level)}
-
- if len(self.Args) == 1 {
- return self.MakeRequest(agent.SetLogLevel, buf, self.CopyToWriter(os.Stdout))
- }
-
- addr, err := agent.ParseGopsAddress(self.Args)
- if err != nil {
- return err
- }
- return agent.MakeRequest(addr, agent.SetLogLevel, buf, os.Stdout)
+ return self.MakeRequest(agent.SetLogLevel, buf, self.CopyToWriter(os.Stdout))
}
diff --git a/ziti/cmd/agentcli/agent_setgc.go b/ziti/cmd/agentcli/agent_setgc.go
index 3d6176e53..824c8df52 100644
--- a/ziti/cmd/agentcli/agent_setgc.go
+++ b/ziti/cmd/agentcli/agent_setgc.go
@@ -40,9 +40,9 @@ func NewSetGcCmd(p common.OptionsProvider) *cobra.Command {
}
cmd := &cobra.Command{
- Use: "setgc target gc-percentage",
+ Use: "setgc gc-percentage",
Short: "Sets the GC percentage in the target application",
- Args: cobra.MinimumNArgs(1),
+ Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {
action.Cmd = cmd
action.Args = args
@@ -65,12 +65,7 @@ func (self *AgentSetGcAction) Run() error {
})
}
- var pctArg string
- if len(self.Args) == 1 {
- pctArg = self.Args[0]
- } else {
- pctArg = self.Args[1]
- }
+ pctArg := self.Args[0]
perc, err := strconv.ParseInt(pctArg, 10, strconv.IntSize)
if err != nil {
@@ -79,14 +74,5 @@ func (self *AgentSetGcAction) Run() error {
buf := make([]byte, binary.MaxVarintLen64)
binary.PutVarint(buf, perc)
- if len(self.Args) == 1 {
- return self.MakeRequest(agent.SetGCPercent, buf, self.CopyToWriter(os.Stdout))
- }
-
- addr, err := agent.ParseGopsAddress(self.Args)
- if err != nil {
- return err
- }
-
- return agent.MakeRequest(addr, agent.SetGCPercent, buf, os.Stdout)
+ return self.MakeRequest(agent.SetGCPercent, buf, self.CopyToWriter(os.Stdout))
}
diff --git a/ziti/cmd/agentcli/agent_simple.go b/ziti/cmd/agentcli/agent_simple.go
index ff8f0dc4c..35c9febe6 100644
--- a/ziti/cmd/agentcli/agent_simple.go
+++ b/ziti/cmd/agentcli/agent_simple.go
@@ -36,8 +36,8 @@ func NewSimpleAgentCmd(name string, op byte, p common.OptionsProvider, desc stri
}
cmd := &cobra.Command{
- Args: cobra.MaximumNArgs(1),
- Use: name + " ",
+ Args: cobra.ExactArgs(0),
+ Use: name,
Short: desc,
RunE: func(cmd *cobra.Command, args []string) error {
action.Cmd = cmd
@@ -59,8 +59,8 @@ func NewSimpleAgentCustomCmd(name string, appId AgentAppId, op byte, p common.Op
}
cmd := &cobra.Command{
- Args: cobra.MaximumNArgs(1),
- Use: name + " ",
+ Args: cobra.ExactArgs(0),
+ Use: name,
Run: func(cmd *cobra.Command, args []string) {
action.Cmd = cmd
action.Args = args
diff --git a/ziti/cmd/agentcli/agent_stack.go b/ziti/cmd/agentcli/agent_stack.go
index afa1e3ffa..beccd997a 100644
--- a/ziti/cmd/agentcli/agent_stack.go
+++ b/ziti/cmd/agentcli/agent_stack.go
@@ -39,8 +39,8 @@ func NewStackCmd(p common.OptionsProvider) *cobra.Command {
}
cmd := &cobra.Command{
- Args: cobra.MaximumNArgs(1),
- Use: "stack []",
+ Args: cobra.ExactArgs(0),
+ Use: "stack",
Short: "Emits a go-routine stack dump from the target application",
Run: func(cmd *cobra.Command, args []string) {
action.Cmd = cmd
diff --git a/ziti/cmd/demo/echo_server.go b/ziti/cmd/demo/echo_server.go
index bfc304060..768b05606 100644
--- a/ziti/cmd/demo/echo_server.go
+++ b/ziti/cmd/demo/echo_server.go
@@ -24,7 +24,6 @@ import (
"github.com/openziti/channel/v2"
"github.com/openziti/identity"
"github.com/openziti/sdk-golang/ziti"
- "github.com/openziti/sdk-golang/ziti/config"
"github.com/openziti/sdk-golang/ziti/edge"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
@@ -131,7 +130,7 @@ func (self *echoServer) run(*cobra.Command, []string) {
}
if self.configFile != "" {
- zitiConfig, err := config.NewFromFile(self.configFile)
+ zitiConfig, err := ziti.NewConfigFromFile(self.configFile)
if err != nil {
log.WithError(err).Fatalf("ziti: unable to load ziti identity from [%v]", self.configFile)
}
@@ -140,7 +139,11 @@ func (self *echoServer) run(*cobra.Command, []string) {
log.WithError(err).Fatalf("ziti: unable to create ziti identity from [%v]", self.configFile)
}
- zitiContext := ziti.NewContextWithConfig(zitiConfig)
+ zitiContext, err := ziti.NewContext(zitiConfig)
+
+ if err != nil {
+ log.WithError(err).Fatal("unable to get create ziti context from config")
+ }
zitiIdentity, err := zitiContext.GetCurrentIdentity()
if err != nil {
@@ -149,20 +152,20 @@ func (self *echoServer) run(*cobra.Command, []string) {
listenOptions := ziti.DefaultListenOptions()
listenOptions.BindUsingEdgeIdentity = self.bindWithIdentity
- listenOptions.Cost = zitiIdentity.DefaultHostingCost
- listenOptions.Precedence = ziti.GetPrecedenceForLabel(zitiIdentity.DefaultHostingPrecedence)
+ listenOptions.Cost = uint16(*zitiIdentity.DefaultHostingCost)
+ listenOptions.Precedence = ziti.GetPrecedenceForLabel(string(zitiIdentity.DefaultHostingPrecedence))
svc, found := zitiContext.GetService(self.service)
if !found {
log.WithError(err).Fatalf("ziti: unable to lookup service [%v]", self.service)
}
- if cost, found := zitiIdentity.ServiceHostingCosts[svc.Id]; found {
- listenOptions.Cost = uint16(cost.(float64))
+ if cost, found := zitiIdentity.ServiceHostingCosts[*svc.ID]; found {
+ listenOptions.Cost = uint16(*cost)
}
- if precedence, found := zitiIdentity.ServiceHostingPrecedences[svc.Id]; found {
- listenOptions.Precedence = ziti.GetPrecedenceForLabel(precedence.(string))
+ if precedence, found := zitiIdentity.ServiceHostingPrecedences[*svc.ID]; found {
+ listenOptions.Precedence = ziti.GetPrecedenceForLabel(string(precedence))
}
log.Infof("ziti: hosting %v with addressable=%v, cost=%v, precedence=%v",
diff --git a/ziti/cmd/demo/zcat.go b/ziti/cmd/demo/zcat.go
index fda7d7ff9..3635cbc66 100644
--- a/ziti/cmd/demo/zcat.go
+++ b/ziti/cmd/demo/zcat.go
@@ -20,7 +20,6 @@ import (
"github.com/michaelquigley/pfxlog"
"github.com/openziti/foundation/v2/info"
"github.com/openziti/sdk-golang/ziti"
- "github.com/openziti/sdk-golang/ziti/config"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"io"
@@ -97,7 +96,7 @@ func (self *zcatAction) run(_ *cobra.Command, args []string) {
if network == "tcp" || network == "udp" {
conn, err = net.Dial(network, addr)
} else if network == "ziti" {
- zitiConfig, cfgErr := config.NewFromFile(self.configFile)
+ zitiConfig, cfgErr := ziti.NewConfigFromFile(self.configFile)
if cfgErr != nil {
log.WithError(cfgErr).Fatalf("unable to load ziti identity from [%v]", self.configFile)
}
@@ -108,7 +107,11 @@ func (self *zcatAction) run(_ *cobra.Command, args []string) {
addr = addr[atIdx+1:]
}
- zitiContext := ziti.NewContextWithConfig(zitiConfig)
+ zitiContext, ctxErr := ziti.NewContext(zitiConfig)
+ if ctxErr != nil {
+ pfxlog.Logger().WithError(err).Fatal("could not create sdk context from config")
+ }
+
dialOptions := &ziti.DialOptions{
ConnectTimeout: 5 * time.Second,
Identity: dialIdentifier,
diff --git a/ziti/cmd/edge/list.go b/ziti/cmd/edge/list.go
index 623f2da7c..f5a7a28b8 100644
--- a/ziti/cmd/edge/list.go
+++ b/ziti/cmd/edge/list.go
@@ -983,12 +983,18 @@ func outputIdentities(o *api.Options, children []*gabs.Container, pagingInfo *ap
for _, entity := range children {
wrapper := api.Wrap(entity)
+ authPolicy := wrapper.String("authPolicy.name")
+
+ if authPolicy == "" {
+ authPolicy = wrapper.String("authPolicyId")
+ }
+
t.AppendRow(table.Row{
wrapper.String("id"),
wrapper.String("name"),
wrapper.String("type.name"),
strings.Join(wrapper.StringSlice("roleAttributes"), ","),
- wrapper.String("authPolicyId")})
+ authPolicy})
}
api.RenderTable(o, t, pagingInfo)
diff --git a/ziti/cmd/edge/login.go b/ziti/cmd/edge/login.go
index 572a3970e..58cdfe428 100644
--- a/ziti/cmd/edge/login.go
+++ b/ziti/cmd/edge/login.go
@@ -17,6 +17,7 @@
package edge
import (
+ "crypto/tls"
"fmt"
"github.com/Jeffail/gabs"
"github.com/openziti/foundation/v2/term"
@@ -27,14 +28,16 @@ import (
"github.com/pkg/errors"
"github.com/spf13/cobra"
"io"
+ "net/http"
"net/url"
+ "os"
"path/filepath"
"strings"
"time"
)
-// loginOptions are the flags for login commands
-type loginOptions struct {
+// LoginOptions are the flags for login commands
+type LoginOptions struct {
api.Options
Username string
Password string
@@ -43,11 +46,14 @@ type loginOptions struct {
ReadOnly bool
Yes bool
IgnoreConfig bool
+ ClientCert string
+ ClientKey string
+ ExtJwt string
}
// newLoginCmd creates the command
func newLoginCmd(out io.Writer, errOut io.Writer) *cobra.Command {
- options := &loginOptions{
+ options := &LoginOptions{
Options: api.Options{
CommonOptions: common.CommonOptions{Out: out, Err: errOut},
},
@@ -73,17 +79,21 @@ func newLoginCmd(out io.Writer, errOut io.Writer) *cobra.Command {
cmd.Flags().StringVarP(&options.Username, "username", "u", "", "username to use for authenticating to the Ziti Edge Controller ")
cmd.Flags().StringVarP(&options.Password, "password", "p", "", "password to use for authenticating to the Ziti Edge Controller, if -u is supplied and -p is not, a value will be prompted for")
cmd.Flags().StringVarP(&options.Token, "token", "t", "", "if an api token has already been acquired, it can be set in the config with this option. This will set the session to read only by default")
- cmd.Flags().StringVarP(&options.CaCert, "cert", "c", "", "additional root certificates used by the Ziti Edge Controller")
+ cmd.Flags().StringVarP(&options.CaCert, "ca", "", "", "additional root certificates used by the Ziti Edge Controller")
cmd.Flags().BoolVar(&options.ReadOnly, "read-only", false, "marks this login as read-only. Note: this is not a guarantee that nothing can be changed on the server. Care should still be taken!")
cmd.Flags().BoolVarP(&options.Yes, "yes", "y", false, "If set, responds to prompts with yes. This will result in untrusted certs being accepted or updated.")
cmd.Flags().BoolVar(&options.IgnoreConfig, "ignore-config", false, "If set, does not use value from the config file for hostname or username. Values must be entered or will be prompted for.")
+ cmd.Flags().StringVarP(&options.ClientCert, "client-cert", "c", "", "A certificate used to authenticate")
+ cmd.Flags().StringVarP(&options.ClientKey, "client-key", "k", "", "The key to use with certificate authentication")
+ cmd.Flags().StringVarP(&options.ExtJwt, "ext-jwt", "e", "", "A JWT from an external provider used to authenticate")
+
options.AddCommonFlags(cmd)
return cmd
}
// Run implements this command
-func (o *loginOptions) Run() error {
+func (o *LoginOptions) Run() error {
config, configFile, err := util.LoadRestClientConfig()
if err != nil {
return err
@@ -140,7 +150,8 @@ func (o *loginOptions) Run() error {
o.Println("NOTE: When using --token the saved identity will be marked as read-only unless --read-only=false is provided")
}
- if o.Token == "" {
+ body := "{}"
+ if o.Token == "" && o.ClientCert == "" && o.ExtJwt == "" {
for o.Username == "" {
if defaultId := config.EdgeIdentities[id]; defaultId != nil && defaultId.Username != "" && !o.IgnoreConfig {
o.Username = defaultId.Username
@@ -160,28 +171,28 @@ func (o *loginOptions) Run() error {
_, _ = container.SetP(o.Username, "username")
_, _ = container.SetP(o.Password, "password")
- body := container.String()
+ body = container.String()
+ }
- jsonParsed, err := util.EdgeControllerLogin(host, o.CaCert, body, o.Out, o.OutputJSONResponse, o.Options.Timeout, o.Options.Verbose)
+ jsonParsed, err := login(o, host, body)
- if err != nil {
- return err
- }
+ if err != nil {
+ return err
+ }
- if !jsonParsed.ExistsP("data.token") {
- return fmt.Errorf("no session token returned from login request to %v. Received: %v", host, jsonParsed.String())
- }
+ if !jsonParsed.ExistsP("data.token") {
+ return fmt.Errorf("no session token returned from login request to %v. Received: %v", host, jsonParsed.String())
+ }
- var ok bool
- o.Token, ok = jsonParsed.Path("data.token").Data().(string)
+ var ok bool
+ o.Token, ok = jsonParsed.Path("data.token").Data().(string)
- if !ok {
- return fmt.Errorf("session token returned from login request to %v is not in the expected format. Received: %v", host, jsonParsed.String())
- }
+ if !ok {
+ return fmt.Errorf("session token returned from login request to %v is not in the expected format. Received: %v", host, jsonParsed.String())
+ }
- if !o.OutputJSONResponse {
- o.Printf("Token: %v\n", o.Token)
- }
+ if !o.OutputJSONResponse {
+ o.Printf("Token: %v\n", o.Token)
}
loginIdentity := &util.RestClientEdgeIdentity{
@@ -201,7 +212,7 @@ func (o *loginOptions) Run() error {
return err
}
-func (o *loginOptions) ConfigureCerts(host string, ctrlUrl *url.URL) error {
+func (o *LoginOptions) ConfigureCerts(host string, ctrlUrl *url.URL) error {
isServerTrusted, err := util.IsServerTrusted(host)
if err != nil {
return err
@@ -275,7 +286,7 @@ func (o *loginOptions) ConfigureCerts(host string, ctrlUrl *url.URL) error {
return nil
}
-func (o *loginOptions) askYesNo(prompt string) (bool, error) {
+func (o *LoginOptions) askYesNo(prompt string) (bool, error) {
filter := &yesNoFilter{}
if _, err := o.ask(prompt, filter.Accept); err != nil {
return false, err
@@ -283,7 +294,7 @@ func (o *loginOptions) askYesNo(prompt string) (bool, error) {
return filter.result, nil
}
-func (o *loginOptions) ask(prompt string, f func(string) bool) (string, error) {
+func (o *LoginOptions) ask(prompt string, f func(string) bool) (string, error) {
for {
val, err := term.Prompt(prompt)
if err != nil {
@@ -314,3 +325,64 @@ func (self *yesNoFilter) Accept(s string) bool {
return false
}
+
+// EdgeControllerLogin will authenticate to the given Edge Controller
+func login(o *LoginOptions, url string, authentication string) (*gabs.Container, error) {
+ client := util.NewClient()
+ cert := o.CaCert
+ out := o.Out
+ logJSON := o.OutputJSONResponse
+ timeout := o.Timeout
+ verbose := o.Verbose
+ method := "password"
+ if cert != "" {
+ client.SetRootCertificate(cert)
+ }
+ authHeader := ""
+ if o.ExtJwt != "" {
+ auth, err := os.ReadFile(o.ExtJwt)
+ if err != nil {
+ return nil, fmt.Errorf("couldn't load jwt file at %s: %v", o.ExtJwt, err)
+ }
+ method = "ext-jwt"
+ authHeader = "Bearer " + string(auth)
+ client.SetHeader("Authorization", authHeader)
+ } else {
+ if o.ClientCert != "" {
+ clientCert, err := tls.LoadX509KeyPair(o.ClientCert, o.ClientKey)
+ if err != nil {
+ return nil, fmt.Errorf("can't load client certificate: %s with key %s: %v", o.ClientCert, o.ClientKey, err)
+ }
+ client.SetCertificates(clientCert)
+ method = "cert"
+ }
+ }
+
+ resp, err := client.
+ SetTimeout(time.Duration(time.Duration(timeout)*time.Second)).
+ SetDebug(verbose).
+ R().
+ SetQueryParam("method", method).
+ SetHeader("Content-Type", "application/json").
+ SetBody(authentication).
+ Post(url + "/authenticate")
+
+ if err != nil {
+ return nil, fmt.Errorf("unable to authenticate to %v. Error: %v", url, err)
+ }
+
+ if resp.StatusCode() != http.StatusOK {
+ return nil, fmt.Errorf("unable to authenticate to %v. Status code: %v, Server returned: %v", url, resp.Status(), util.PrettyPrintResponse(resp))
+ }
+
+ if logJSON {
+ util.OutputJson(out, resp.Body())
+ }
+
+ jsonParsed, err := gabs.ParseJSON(resp.Body())
+ if err != nil {
+ return nil, fmt.Errorf("unable to parse response from %v. Server returned: %v", url, resp.String())
+ }
+
+ return jsonParsed, nil
+}
diff --git a/ziti/cmd/edge/traceroute.go b/ziti/cmd/edge/traceroute.go
index 25fe33c5b..3ca982079 100644
--- a/ziti/cmd/edge/traceroute.go
+++ b/ziti/cmd/edge/traceroute.go
@@ -3,10 +3,10 @@ package edge
import (
"fmt"
"github.com/openziti/sdk-golang/ziti"
- "github.com/openziti/sdk-golang/ziti/config"
"github.com/openziti/ziti/ziti/cmd/api"
"github.com/openziti/ziti/ziti/cmd/common"
cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers"
+ "github.com/pkg/errors"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"io"
@@ -60,13 +60,16 @@ func newTraceRouteCmd(out io.Writer, errOut io.Writer) *cobra.Command {
func (o *traceRouteOptions) Run() error {
var ctx ziti.Context
if o.configFile != "" {
- cfg, err := config.NewFromFile(o.configFile)
+ cfg, err := ziti.NewConfigFromFile(o.configFile)
+ if err != nil {
+ return err
+ }
+ ctx, err = ziti.NewContext(cfg)
if err != nil {
return err
}
- ctx = ziti.NewContextWithConfig(cfg)
} else {
- ctx = ziti.NewContext()
+ return errors.New("invalid configuration file")
}
conn, err := ctx.Dial(o.Args[0])
diff --git a/ziti/cmd/edge/update_config_type.go b/ziti/cmd/edge/update_config_type.go
index ab93d9a28..26323fc35 100644
--- a/ziti/cmd/edge/update_config_type.go
+++ b/ziti/cmd/edge/update_config_type.go
@@ -68,7 +68,7 @@ func newUpdateConfigTypeCmd(out io.Writer, errOut io.Writer) *cobra.Command {
// runUpdateConfigType update a new config on the Ziti Edge Controller
func (self *updateConfigTypeAction) run() error {
- id, err := mapNameToID("configs", self.Args[0], self.Options)
+ id, err := mapNameToID("config-types", self.Args[0], self.Options)
if err != nil {
return err
}
@@ -108,7 +108,7 @@ func (self *updateConfigTypeAction) run() error {
fmt.Printf("Failing parsing JSON: %+v\n", err)
return errors.Errorf("unable to parse data as json: %v", err)
}
- api.SetJSONValue(entityData, dataMap, "data")
+ api.SetJSONValue(entityData, dataMap, "schema")
change = true
}
@@ -116,7 +116,7 @@ func (self *updateConfigTypeAction) run() error {
return errors.New("no change specified. must specify at least one attribute to change")
}
- _, err = patchEntityOfType(fmt.Sprintf("configs/%v", id), entityData.String(), &self.Options)
+ _, err = patchEntityOfType(fmt.Sprintf("config-types/%v", id), entityData.String(), &self.Options)
return err
}
diff --git a/ziti/cmd/install/common_install.go b/ziti/cmd/install/common_install.go
index bcc915817..c004079ef 100644
--- a/ziti/cmd/install/common_install.go
+++ b/ziti/cmd/install/common_install.go
@@ -19,6 +19,7 @@ package install
import (
"fmt"
"github.com/blang/semver"
+ "github.com/openziti/ziti/common/getziti"
c "github.com/openziti/ziti/ziti/constants"
"github.com/openziti/ziti/ziti/internal/log"
"github.com/openziti/ziti/ziti/util"
@@ -197,17 +198,13 @@ func (o *InstallOptions) getLatestTerraformProviderVersion(branch string, provid
func (o *InstallOptions) getLatestGitHubReleaseVersion(zitiApp string) (semver.Version, error) {
var result semver.Version
- release, err := util.GetHighestVersionGitHubReleaseInfo(o.Verbose, zitiApp)
+ release, err := getziti.GetHighestVersionGitHubReleaseInfo(zitiApp, o.Verbose)
if release != nil {
result = release.SemVer
}
return result, err
}
-func (o *InstallOptions) getHighestVersionGitHubReleaseInfo(zitiApp string) (*util.GitHubReleasesData, error) {
- return util.GetHighestVersionGitHubReleaseInfo(o.Verbose, zitiApp)
-}
-
func (o *InstallOptions) getCurrentZitiSnapshotList() ([]string, error) {
children, err := util.GetCurrentSnapshotListFromArtifactory(o.Verbose)
@@ -330,70 +327,15 @@ func (o *InstallOptions) installTerraformProvider(branch string, provider string
return os.Chmod(fileToChmod, 0755)
}
-func (o *InstallOptions) findVersionAndInstallGitHubRelease(zitiApp string, zitiAppGitHub string, upgrade bool, version string) error {
- var latestVersion semver.Version
- var err error
- if version != "" {
- if strings.Contains(version, "*") {
- latestRelease, err := util.GetHighestVersionGitHubReleaseInfo(o.Verbose, zitiAppGitHub)
- if err != nil {
- return err
- }
- latestVersion = latestRelease.SemVer
- version = latestVersion.String()
- } else {
- latestVersion, err = semver.Make(version)
- if err != nil {
- return err
- }
- }
- }
-
- release, err := util.GetLatestGitHubReleaseAsset(o.Staging, zitiAppGitHub)
- if err != nil {
- return err
- }
- return o.installGitHubRelease(zitiApp, upgrade, release)
-}
-
-func (o *InstallOptions) installGitHubRelease(zitiApp string, upgrade bool, release *util.GitHubReleasesData) error {
+func (o *InstallOptions) FindVersionAndInstallGitHubRelease(upgrade bool, zitiApp string, zitiAppGitHub string, version string) error {
binDir, err := util.BinaryLocation()
if err != nil {
return err
}
- binary := zitiApp
- fileName := binary
-
if !upgrade {
- f, flag, err := o.shouldInstallBinary(binDir, binary)
- if err != nil || !flag {
+ if _, download, err := o.shouldInstallBinary(binDir, zitiApp); err != nil || !download {
return err
}
- fileName = f
- }
-
- fullPath := filepath.Join(binDir, fileName)
- ext := ".zip"
- zipFile := fullPath + ext
-
- releaseUrl, err := release.GetDownloadUrl(zitiApp)
- if err != nil {
- return err
}
-
- err = util.DownloadGitHubReleaseAsset(releaseUrl, zipFile)
- if err != nil {
- return err
- }
-
- err = util.Unzip(zipFile, binDir)
- if err != nil {
- return err
- }
- err = os.Remove(zipFile)
- if err != nil {
- return err
- }
- log.Infof("Successfully installed '%s' version '%s'\n", zitiApp, release.SemVer)
- return os.Chmod(fullPath, 0755)
+ return getziti.FindVersionAndInstallGitHubRelease(zitiApp, zitiAppGitHub, runtime.GOOS, runtime.GOARCH, binDir, version, o.Verbose)
}
diff --git a/ziti/cmd/install/install_ziti_edge_tunnel.go b/ziti/cmd/install/install_ziti_edge_tunnel.go
index bf42c6143..74725f3b3 100644
--- a/ziti/cmd/install/install_ziti_edge_tunnel.go
+++ b/ziti/cmd/install/install_ziti_edge_tunnel.go
@@ -17,15 +17,16 @@
package install
import (
+ "github.com/blang/semver"
+ "github.com/openziti/ziti/common/getziti"
"github.com/openziti/ziti/ziti/cmd/common"
cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers"
"github.com/openziti/ziti/ziti/cmd/templates"
- "io"
-
- "github.com/blang/semver"
c "github.com/openziti/ziti/ziti/constants"
"github.com/openziti/ziti/ziti/internal/log"
"github.com/spf13/cobra"
+ "io"
+ "strings"
)
var (
@@ -77,19 +78,20 @@ func NewCmdInstallZitiEdgeTunnel(out io.Writer, errOut io.Writer) *cobra.Command
// Run implements the command
func (o *InstallOptions) installZitiEdgeTunnel(targetVersion string) error {
- newVersion, err := o.getLatestGitHubReleaseVersion(c.ZITI_EDGE_TUNNEL_GITHUB)
- if err != nil {
- return err
- }
+ var newVersion semver.Version
if targetVersion != "" {
- newVersion, err = semver.Make(targetVersion)
+ newVersion = semver.MustParse(strings.TrimPrefix(targetVersion, "v"))
+ } else {
+ v, err := getziti.GetLatestGitHubReleaseVersion(c.ZITI_EDGE_TUNNEL_GITHUB, o.Verbose)
+ if err != nil {
+ return err
+ }
+ newVersion = v
}
log.Infoln("Attempting to install '" + c.ZITI_EDGE_TUNNEL + "' version: " + newVersion.String())
-
- return o.findVersionAndInstallGitHubRelease(c.ZITI_EDGE_TUNNEL, c.ZITI_EDGE_TUNNEL_GITHUB, false, newVersion.String())
-
+ return o.FindVersionAndInstallGitHubRelease(false, c.ZITI_EDGE_TUNNEL, c.ZITI_EDGE_TUNNEL_GITHUB, newVersion.String())
}
// Run implements the command
diff --git a/ziti/cmd/install/install_ziti_prox_c.go b/ziti/cmd/install/install_ziti_prox_c.go
index 50de6ff70..ec79a4bb2 100644
--- a/ziti/cmd/install/install_ziti_prox_c.go
+++ b/ziti/cmd/install/install_ziti_prox_c.go
@@ -17,15 +17,16 @@
package install
import (
+ "github.com/blang/semver"
+ "github.com/openziti/ziti/common/getziti"
"github.com/openziti/ziti/ziti/cmd/common"
cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers"
"github.com/openziti/ziti/ziti/cmd/templates"
c "github.com/openziti/ziti/ziti/constants"
"github.com/openziti/ziti/ziti/internal/log"
- "io"
-
- "github.com/blang/semver"
"github.com/spf13/cobra"
+ "io"
+ "strings"
)
var (
@@ -76,20 +77,20 @@ func NewCmdInstallZitiProxC(out io.Writer, errOut io.Writer) *cobra.Command {
}
func (o *InstallOptions) installZitiProxC(targetVersion string) error {
+ var newVersion semver.Version
+
if targetVersion != "" {
- version, err := semver.Make(targetVersion)
+ newVersion = semver.MustParse(strings.TrimPrefix(targetVersion, "v"))
+ } else {
+ v, err := getziti.GetLatestGitHubReleaseVersion(c.ZITI_SDK_C_GITHUB, o.Verbose)
if err != nil {
return err
}
- return o.findVersionAndInstallGitHubRelease(c.ZITI_PROX_C, c.ZITI_SDK_C_GITHUB, false, version.String())
+ newVersion = v
}
- release, err := o.getHighestVersionGitHubReleaseInfo(c.ZITI_SDK_C_GITHUB)
- if err != nil {
- return err
- }
- log.Infoln("Attempting to install '" + c.ZITI_PROX_C + "' version: " + release.SemVer.String())
- return o.installGitHubRelease(c.ZITI_PROX_C, false, release)
+ log.Infoln("Attempting to install '" + c.ZITI_PROX_C + "' version: " + newVersion.String())
+ return o.FindVersionAndInstallGitHubRelease(false, c.ZITI_PROX_C, c.ZITI_SDK_C_GITHUB, newVersion.String())
}
// Run implements the command
diff --git a/ziti/cmd/install/upgrade_ziti_controller.go b/ziti/cmd/install/upgrade_ziti_controller.go
index b42e3aa80..ed2a3720b 100644
--- a/ziti/cmd/install/upgrade_ziti_controller.go
+++ b/ziti/cmd/install/upgrade_ziti_controller.go
@@ -17,25 +17,8 @@
package install
import (
- "github.com/openziti/ziti/ziti/cmd/common"
- "io"
-
"github.com/openziti/ziti/common/version"
- cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers"
- "github.com/openziti/ziti/ziti/cmd/templates"
c "github.com/openziti/ziti/ziti/constants"
- "github.com/spf13/cobra"
-)
-
-var (
- upgradeZitiControllerLong = templates.LongDesc(`
- Upgrades the Ziti Controller app if there is a newer release
-`)
-
- upgradeZitiControllerExample = templates.Examples(`
- # Upgrades the Ziti Controller app
- ziti upgrade ziti-controller
- `)
)
// UpgradeZitiControllerOptions the options for the upgrade ziti-controller command
@@ -45,35 +28,6 @@ type UpgradeZitiControllerOptions struct {
Version string
}
-// NewCmdUpgradeZitiController defines the command
-func NewCmdUpgradeZitiController(out io.Writer, errOut io.Writer) *cobra.Command {
- options := &UpgradeZitiControllerOptions{
- InstallOptions: InstallOptions{
- CommonOptions: common.CommonOptions{
- Out: out,
- Err: errOut,
- },
- },
- }
-
- cmd := &cobra.Command{
- Use: "ziti-controller",
- Short: "Upgrades the Ziti Controller app - if there is a new version available",
- Aliases: []string{"controller", "ctrl", "zc"},
- Long: upgradeZitiControllerLong,
- Example: upgradeZitiControllerExample,
- Run: func(cmd *cobra.Command, args []string) {
- options.Cmd = cmd
- options.Args = args
- err := options.Run()
- cmdhelper.CheckErr(err)
- },
- }
- cmd.Flags().StringVarP(&options.Version, "version", "v", "", "The specific version to upgrade to")
- options.AddCommonFlags(cmd)
- return cmd
-}
-
// Run implements the command
func (o *UpgradeZitiControllerOptions) Run() error {
newVersion, err := o.getLatestZitiAppVersion(version.GetBranch(), c.ZITI_CONTROLLER)
diff --git a/ziti/cmd/install/upgrade_ziti_edge_tunnel.go b/ziti/cmd/install/upgrade_ziti_edge_tunnel.go
index 0bd73af45..1794669a1 100644
--- a/ziti/cmd/install/upgrade_ziti_edge_tunnel.go
+++ b/ziti/cmd/install/upgrade_ziti_edge_tunnel.go
@@ -17,24 +17,7 @@
package install
import (
- "github.com/openziti/ziti/ziti/cmd/common"
- "io"
-
- cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers"
- "github.com/openziti/ziti/ziti/cmd/templates"
c "github.com/openziti/ziti/ziti/constants"
- "github.com/spf13/cobra"
-)
-
-var (
- upgradeZitiEdgeTunnelLong = templates.LongDesc(`
- Upgrades the Ziti Edge Tunnel app if there is a newer release
-`)
-
- upgradeZitiEdgeTunnelExample = templates.Examples(`
- # Upgrades the Ziti Edge Tunnel app
- ziti upgrade ziti-edge-tunnel
- `)
)
// UpgradeZitiEdgeTunnelOptions the options for the upgrade ziti-edge-tunnel command
@@ -44,35 +27,6 @@ type UpgradeZitiEdgeTunnelOptions struct {
Version string
}
-// NewCmdUpgradeZitiEdgeTunnel defines the command
-func NewCmdUpgradeZitiEdgeTunnel(out io.Writer, errOut io.Writer) *cobra.Command {
- options := &UpgradeZitiEdgeTunnelOptions{
- InstallOptions: InstallOptions{
- CommonOptions: common.CommonOptions{
- Out: out,
- Err: errOut,
- },
- },
- }
-
- cmd := &cobra.Command{
- Use: "ziti-edge-tunnel",
- Short: "Upgrades the Ziti Edge Tunnel app - if there is a new version available",
- Aliases: []string{"edge-tunnel", "et"},
- Long: upgradeZitiEdgeTunnelLong,
- Example: upgradeZitiEdgeTunnelExample,
- Run: func(cmd *cobra.Command, args []string) {
- options.Cmd = cmd
- options.Args = args
- err := options.Run()
- cmdhelper.CheckErr(err)
- },
- }
- cmd.Flags().StringVarP(&options.Version, "version", "v", "", "The specific version to upgrade to")
- options.AddCommonFlags(cmd)
- return cmd
-}
-
// Run implements the command
func (o *UpgradeZitiEdgeTunnelOptions) Run() error {
newVersion, err := o.getLatestGitHubReleaseVersion(c.ZITI_EDGE_TUNNEL_GITHUB)
@@ -88,5 +42,5 @@ func (o *UpgradeZitiEdgeTunnelOptions) Run() error {
o.deleteInstalledBinary(c.ZITI_EDGE_TUNNEL)
- return o.findVersionAndInstallGitHubRelease(c.ZITI_EDGE_TUNNEL, c.ZITI_EDGE_TUNNEL_GITHUB, true, newVersionStr)
+ return o.FindVersionAndInstallGitHubRelease(true, c.ZITI_EDGE_TUNNEL, c.ZITI_EDGE_TUNNEL_GITHUB, newVersionStr)
}
diff --git a/ziti/cmd/install/upgrade_ziti_prox_c.go b/ziti/cmd/install/upgrade_ziti_prox_c.go
index db6ae533f..620ac1cf3 100644
--- a/ziti/cmd/install/upgrade_ziti_prox_c.go
+++ b/ziti/cmd/install/upgrade_ziti_prox_c.go
@@ -17,24 +17,7 @@
package install
import (
- "github.com/openziti/ziti/ziti/cmd/common"
- "io"
-
- cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers"
- "github.com/openziti/ziti/ziti/cmd/templates"
c "github.com/openziti/ziti/ziti/constants"
- "github.com/spf13/cobra"
-)
-
-var (
- upgradeZitiProxCLong = templates.LongDesc(`
- Upgrades the Ziti ProxC app if there is a newer release
-`)
-
- upgradeZitiProxCExample = templates.Examples(`
- # Upgrades the Ziti ProxC app
- ziti upgrade ziti-prox-c
- `)
)
// UpgradeZitiProxCOptions the options for the upgrade ziti-prox-c command
@@ -44,35 +27,6 @@ type UpgradeZitiProxCOptions struct {
Version string
}
-// NewCmdUpgradeZitiProxC defines the command
-func NewCmdUpgradeZitiProxC(out io.Writer, errOut io.Writer) *cobra.Command {
- options := &UpgradeZitiProxCOptions{
- InstallOptions: InstallOptions{
- CommonOptions: common.CommonOptions{
- Out: out,
- Err: errOut,
- },
- },
- }
-
- cmd := &cobra.Command{
- Use: "ziti-prox-c",
- Short: "Upgrades the Ziti ProxC app - if there is a new version available",
- Aliases: []string{"proxc"},
- Long: upgradeZitiProxCLong,
- Example: upgradeZitiProxCExample,
- Run: func(cmd *cobra.Command, args []string) {
- options.Cmd = cmd
- options.Args = args
- err := options.Run()
- cmdhelper.CheckErr(err)
- },
- }
- cmd.Flags().StringVarP(&options.Version, "version", "v", "", "The specific version to upgrade to")
- options.AddCommonFlags(cmd)
- return cmd
-}
-
// Run implements the command
func (o *UpgradeZitiProxCOptions) Run() error {
newVersion, err := o.getLatestGitHubReleaseVersion(c.ZITI_SDK_C_GITHUB)
@@ -88,5 +42,5 @@ func (o *UpgradeZitiProxCOptions) Run() error {
o.deleteInstalledBinary(c.ZITI_PROX_C)
- return o.findVersionAndInstallGitHubRelease(c.ZITI_PROX_C, c.ZITI_SDK_C_GITHUB, true, newVersionStr)
+ return o.FindVersionAndInstallGitHubRelease(true, c.ZITI_PROX_C, c.ZITI_SDK_C_GITHUB, newVersionStr)
}
diff --git a/ziti/cmd/install/upgrade_ziti_router.go b/ziti/cmd/install/upgrade_ziti_router.go
index 43aaabfc3..e584f694c 100644
--- a/ziti/cmd/install/upgrade_ziti_router.go
+++ b/ziti/cmd/install/upgrade_ziti_router.go
@@ -17,25 +17,8 @@
package install
import (
- "github.com/openziti/ziti/ziti/cmd/common"
- "io"
-
"github.com/openziti/ziti/common/version"
- cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers"
- "github.com/openziti/ziti/ziti/cmd/templates"
c "github.com/openziti/ziti/ziti/constants"
- "github.com/spf13/cobra"
-)
-
-var (
- upgradeZitiRouterLong = templates.LongDesc(`
- Upgrades the Ziti Router app if there is a newer release
-`)
-
- upgradeZitiRouterExample = templates.Examples(`
- # Upgrades the Ziti Router app
- ziti upgrade ziti-router
- `)
)
// UpgradeZitiRouterOptions the options for the upgrade ziti-router command
@@ -45,35 +28,6 @@ type UpgradeZitiRouterOptions struct {
Version string
}
-// NewCmdUpgradeZitiRouter defines the command
-func NewCmdUpgradeZitiRouter(out io.Writer, errOut io.Writer) *cobra.Command {
- options := &UpgradeZitiRouterOptions{
- InstallOptions: InstallOptions{
- CommonOptions: common.CommonOptions{
- Out: out,
- Err: errOut,
- },
- },
- }
-
- cmd := &cobra.Command{
- Use: "ziti-router",
- Short: "Upgrades the Ziti Router app - if there is a new version available",
- Aliases: []string{"router", "rtr", "r"},
- Long: upgradeZitiRouterLong,
- Example: upgradeZitiRouterExample,
- Run: func(cmd *cobra.Command, args []string) {
- options.Cmd = cmd
- options.Args = args
- err := options.Run()
- cmdhelper.CheckErr(err)
- },
- }
- cmd.Flags().StringVarP(&options.Version, "version", "v", "", "The specific version to upgrade to")
- options.AddCommonFlags(cmd)
- return cmd
-}
-
// Run implements the command
func (o *UpgradeZitiRouterOptions) Run() error {
newVersion, err := o.getLatestZitiAppVersion(version.GetBranch(), c.ZITI_ROUTER)
diff --git a/ziti/cmd/install/upgrade_ziti_tunnel.go b/ziti/cmd/install/upgrade_ziti_tunnel.go
index 6cd16cc35..254a2d27c 100644
--- a/ziti/cmd/install/upgrade_ziti_tunnel.go
+++ b/ziti/cmd/install/upgrade_ziti_tunnel.go
@@ -17,25 +17,8 @@
package install
import (
- "github.com/openziti/ziti/ziti/cmd/common"
- "io"
-
"github.com/openziti/ziti/common/version"
- cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers"
- "github.com/openziti/ziti/ziti/cmd/templates"
c "github.com/openziti/ziti/ziti/constants"
- "github.com/spf13/cobra"
-)
-
-var (
- upgradeZitiTunnelLong = templates.LongDesc(`
- Upgrades the Ziti Tunnel app if there is a newer release
-`)
-
- upgradeZitiTunnelExample = templates.Examples(`
- # Upgrades the Ziti Tunnel app
- ziti upgrade ziti-tunnel
- `)
)
// UpgradeZitiTunnelOptions the options for the upgrade ziti-tunnel command
@@ -45,35 +28,6 @@ type UpgradeZitiTunnelOptions struct {
Version string
}
-// NewCmdUpgradeZitiTunnel defines the command
-func NewCmdUpgradeZitiTunnel(out io.Writer, errOut io.Writer) *cobra.Command {
- options := &UpgradeZitiTunnelOptions{
- InstallOptions: InstallOptions{
- CommonOptions: common.CommonOptions{
- Out: out,
- Err: errOut,
- },
- },
- }
-
- cmd := &cobra.Command{
- Use: "ziti-tunnel",
- Short: "Upgrades the Ziti Tunnel app - if there is a new version available",
- Aliases: []string{"tunnel", "rtr", "r"},
- Long: upgradeZitiTunnelLong,
- Example: upgradeZitiTunnelExample,
- Run: func(cmd *cobra.Command, args []string) {
- options.Cmd = cmd
- options.Args = args
- err := options.Run()
- cmdhelper.CheckErr(err)
- },
- }
- cmd.Flags().StringVarP(&options.Version, "version", "v", "", "The specific version to upgrade to")
- options.AddCommonFlags(cmd)
- return cmd
-}
-
// Run implements the command
func (o *UpgradeZitiTunnelOptions) Run() error {
newVersion, err := o.getLatestZitiAppVersion(version.GetBranch(), c.ZITI_TUNNEL)
diff --git a/ziti/cmd/pki_create_ca.go b/ziti/cmd/pki_create_ca.go
index c263ef0ba..9f1f4e187 100644
--- a/ziti/cmd/pki_create_ca.go
+++ b/ziti/cmd/pki_create_ca.go
@@ -17,6 +17,7 @@
package cmd
import (
+ "github.com/openziti/fabric/controller/idgen"
cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers"
"github.com/openziti/ziti/ziti/internal/log"
"github.com/openziti/ziti/ziti/pki/certificate"
@@ -62,10 +63,12 @@ func NewCmdPKICreateCA(out io.Writer, errOut io.Writer) *cobra.Command {
return cmd
}
+const FlagCaName = "ca-name"
+
func (o *PKICreateCAOptions) addPKICreateCAFlags(cmd *cobra.Command) {
cmd.Flags().StringVarP(&o.Flags.PKIRoot, "pki-root", "", "", "Directory in which PKI resides")
cmd.Flags().StringVarP(&o.Flags.CAFile, "ca-file", "", "", "Dir/File name (within PKI_ROOT) in which to store new CA")
- cmd.Flags().StringVarP(&o.Flags.CAName, "ca-name", "", "NetFoundry Inc. Certificate Authority", "Name of CA")
+ cmd.Flags().StringVarP(&o.Flags.CAName, FlagCaName, "", "NetFoundry Inc. Certificate Authority", "Name of CA")
cmd.Flags().IntVarP(&o.Flags.CAExpire, "expire-limit", "", 3650, "Expiration limit in days")
cmd.Flags().IntVarP(&o.Flags.CAMaxpath, "max-path-len", "", -1, "Intermediate maximum path length")
cmd.Flags().IntVarP(&o.Flags.CAPrivateKeySize, "private-key-size", "", 4096, "Size of the private key")
@@ -88,6 +91,11 @@ func (o *PKICreateCAOptions) Run() error {
return err
}
+ if !o.Cmd.Flags().Changed(FlagCaName) {
+ //default name, ensure uniqueness by adding a random id
+ o.Flags.CAName = o.Flags.CAName + " " + idgen.New()
+ }
+
commonName := o.Flags.CAName
filename := o.ObtainFileName(cafile, commonName)
diff --git a/ziti/cmd/pki_create_client.go b/ziti/cmd/pki_create_client.go
index 8ed3c145c..4d4f70aaf 100644
--- a/ziti/cmd/pki_create_client.go
+++ b/ziti/cmd/pki_create_client.go
@@ -17,6 +17,7 @@
package cmd
import (
+ "github.com/openziti/fabric/controller/idgen"
cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers"
"github.com/openziti/ziti/ziti/internal/log"
"github.com/openziti/ziti/ziti/pki/certificate"
@@ -62,12 +63,14 @@ func NewCmdPKICreateClient(out io.Writer, errOut io.Writer) *cobra.Command {
return cmd
}
+const FlagCaClientName = "client-name"
+
func (o *PKICreateClientOptions) addPKICreateClientFlags(cmd *cobra.Command) {
cmd.Flags().StringVarP(&o.Flags.PKIRoot, "pki-root", "", "", "Directory in which PKI resides")
cmd.Flags().StringVarP(&o.Flags.CAName, "ca-name", "", "intermediate", "Name of Intermediate CA (within PKI_ROOT) to use to sign the new Client certificate")
cmd.Flags().StringVarP(&o.Flags.ClientFile, "client-file", "", "client", "Name of file (under chosen CA) in which to store new Client certificate and private key")
cmd.Flags().StringVarP(&o.Flags.KeyFile, "key-file", "", "", "Name of file (under chosen CA) containing private key to use when generating Client certificate")
- cmd.Flags().StringVarP(&o.Flags.ClientName, "client-name", "", "NetFoundry Inc. Client", "Common Name (CN) to use for new Client certificate")
+ cmd.Flags().StringVarP(&o.Flags.ClientName, FlagCaClientName, "", "NetFoundry Inc. Client", "Common Name (CN) to use for new Client certificate")
cmd.Flags().StringSliceVar(&o.Flags.Email, "email", []string{}, "Email addr(s) to add to Subject Alternate Name (SAN) for new Client certificate")
cmd.Flags().IntVarP(&o.Flags.CAExpire, "expire-limit", "", 365, "Expiration limit in days")
cmd.Flags().IntVarP(&o.Flags.CAMaxpath, "max-path-len", "", -1, "Intermediate maximum path length")
@@ -86,6 +89,10 @@ func (o *PKICreateClientOptions) Run() error {
local := o.Flags.PKI.Store.(*store.Local)
local.Root = pkiroot
+ if !o.Cmd.Flags().Changed(FlagCaClientName) {
+ o.Flags.ClientName = o.Flags.ClientName + " " + idgen.New()
+ }
+
commonName := o.Flags.ClientName
clientCertFile, err := o.ObtainClientCertFile()
diff --git a/ziti/cmd/pki_create_intermediate.go b/ziti/cmd/pki_create_intermediate.go
index eb921a6cf..0b1648204 100644
--- a/ziti/cmd/pki_create_intermediate.go
+++ b/ziti/cmd/pki_create_intermediate.go
@@ -17,6 +17,7 @@
package cmd
import (
+ "github.com/openziti/fabric/controller/idgen"
cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers"
"github.com/openziti/ziti/ziti/internal/log"
"github.com/openziti/ziti/ziti/pki/certificate"
@@ -61,11 +62,13 @@ func NewCmdPKICreateIntermediate(out io.Writer, errOut io.Writer) *cobra.Command
return cmd
}
+const FlagCaIntermediateName = "intermediate-name"
+
func (o *PKICreateIntermediateOptions) addPKICreateIntermediateFlags(cmd *cobra.Command) {
cmd.Flags().StringVarP(&o.Flags.PKIRoot, "pki-root", "", "", "Directory in which PKI resides")
cmd.Flags().StringVarP(&o.Flags.CAName, "ca-name", "", "ca", "Name of CA (within PKI_ROOT) to use to sign the new Intermediate CA")
cmd.Flags().StringVarP(&o.Flags.IntermediateFile, "intermediate-file", "", "intermediate", "Dir/File name (within PKI_ROOT) in which to store new Intermediate CA")
- cmd.Flags().StringVarP(&o.Flags.IntermediateName, "intermediate-name", "", "NetFoundry Inc. Intermediate CA", "Common Name (CN) to use for new Intermediate CA")
+ cmd.Flags().StringVarP(&o.Flags.IntermediateName, FlagCaIntermediateName, "", "NetFoundry Inc. Intermediate CA", "Common Name (CN) to use for new Intermediate CA")
cmd.Flags().IntVarP(&o.Flags.CAExpire, "expire-limit", "", 3650, "Expiration limit in days")
cmd.Flags().IntVarP(&o.Flags.CAMaxpath, "max-path-len", "", 0, "Intermediate maximum path length")
cmd.Flags().IntVarP(&o.Flags.CAPrivateKeySize, "private-key-size", "", 4096, "Size of the private key")
@@ -87,6 +90,10 @@ func (o *PKICreateIntermediateOptions) Run() error {
return err
}
+ if !o.Cmd.Flags().Changed(FlagCaIntermediateName) {
+ o.Flags.IntermediateName = o.Flags.IntermediateName + " " + idgen.New()
+ }
+
commonName := o.Flags.IntermediateName
filename := o.ObtainFileName(intermediatefile, commonName)
diff --git a/ziti/cmd/pki_create_server.go b/ziti/cmd/pki_create_server.go
index 59e959189..7a3e5995e 100644
--- a/ziti/cmd/pki_create_server.go
+++ b/ziti/cmd/pki_create_server.go
@@ -17,6 +17,7 @@
package cmd
import (
+ "github.com/openziti/fabric/controller/idgen"
cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers"
"github.com/openziti/ziti/ziti/internal/log"
"github.com/openziti/ziti/ziti/pki/certificate"
@@ -62,12 +63,14 @@ func NewCmdPKICreateServer(out io.Writer, errOut io.Writer) *cobra.Command {
return cmd
}
+const FlagCaServerName = "server-name"
+
func (o *PKICreateServerOptions) addPKICreateServerFlags(cmd *cobra.Command) {
cmd.Flags().StringVarP(&o.Flags.PKIRoot, "pki-root", "", "", "Directory in which PKI resides")
cmd.Flags().StringVarP(&o.Flags.CAName, "ca-name", "", "intermediate", "Name of Intermediate CA (within PKI_ROOT) to use to sign the new Server certificate")
cmd.Flags().StringVarP(&o.Flags.ServerFile, "server-file", "", "server", "Name of file (under chosen CA) in which to store new Server certificate and private key")
cmd.Flags().StringVarP(&o.Flags.KeyFile, "key-file", "", "", "Name of file (under chosen CA) containing private key to use when generating Server certificate")
- cmd.Flags().StringVarP(&o.Flags.ServerName, "server-name", "", "NetFoundry Inc. Server", "Common Name (CN) to use for new Server certificate")
+ cmd.Flags().StringVarP(&o.Flags.ServerName, FlagCaServerName, "", "NetFoundry Inc. Server", "Common Name (CN) to use for new Server certificate")
cmd.Flags().StringSliceVar(&o.Flags.DNSName, "dns", []string{}, "DNS name(s) to add to Subject Alternate Name (SAN) for new Server certificate")
cmd.Flags().StringSliceVar(&o.Flags.IP, "ip", []string{}, "IP addr(s) to add to Subject Alternate Name (SAN) for new Server certificate")
cmd.Flags().IntVarP(&o.Flags.CAExpire, "expire-limit", "", 365, "Expiration limit in days")
@@ -92,6 +95,10 @@ func (o *PKICreateServerOptions) Run() error {
local := o.Flags.PKI.Store.(*store.Local)
local.Root = pkiroot
+ if !o.Cmd.Flags().Changed(FlagCaServerName) {
+ o.Flags.ServerName = o.Flags.ServerName + " " + idgen.New()
+ }
+
commonName := o.Flags.ServerName
serverCertFile, err := o.ObtainServerCertFile()
diff --git a/ziti/cmd/tutorial/ziti_echo_client.go b/ziti/cmd/tutorial/ziti_echo_client.go
index dca6c0fca..df698d7e1 100644
--- a/ziti/cmd/tutorial/ziti_echo_client.go
+++ b/ziti/cmd/tutorial/ziti_echo_client.go
@@ -21,7 +21,6 @@ import (
"fmt"
"github.com/fatih/color"
"github.com/openziti/sdk-golang/ziti"
- "github.com/openziti/sdk-golang/ziti/config"
"io"
"net"
"net/http"
@@ -31,12 +30,16 @@ import (
)
func NewZitiEchoClient(identityJson string) (*zitiEchoClient, error) {
- config, err := config.NewFromFile(identityJson)
+ config, err := ziti.NewConfigFromFile(identityJson)
if err != nil {
return nil, err
}
- zitiContext := ziti.NewContextWithConfig(config)
+ zitiContext, err := ziti.NewContext(config)
+
+ if err != nil {
+ return nil, err
+ }
dial := func(_ context.Context, _ string, addr string) (net.Conn, error) {
service := strings.Split(addr, ":")[0] // assume host is service
diff --git a/ziti/cmd/tutorial/ziti_echo_server.go b/ziti/cmd/tutorial/ziti_echo_server.go
index a5d451e10..aa786d048 100644
--- a/ziti/cmd/tutorial/ziti_echo_server.go
+++ b/ziti/cmd/tutorial/ziti_echo_server.go
@@ -23,7 +23,6 @@ import (
"github.com/fatih/color"
"github.com/openziti/sdk-golang/ziti"
- "github.com/openziti/sdk-golang/ziti/config"
)
type zitiEchoServer struct {
@@ -43,12 +42,17 @@ func (s *zitiEchoServer) ServeHTTP(rw http.ResponseWriter, r *http.Request) {
}
func (s *zitiEchoServer) run() (err error) {
- config, err := config.NewFromFile(s.identityJson)
+ config, err := ziti.NewConfigFromFile(s.identityJson)
if err != nil {
return err
}
- zitiContext := ziti.NewContextWithConfig(config)
+ zitiContext, err := ziti.NewContext(config)
+
+ if err != nil {
+ panic(err)
+ }
+
if s.listener, err = zitiContext.Listen("echo"); err != nil {
return err
}
diff --git a/ziti/controller/delete_sessions.go b/ziti/controller/delete_sessions.go
index 6524f99c9..c88b8c389 100644
--- a/ziti/controller/delete_sessions.go
+++ b/ziti/controller/delete_sessions.go
@@ -181,10 +181,8 @@ func deleteSessions(db boltz.Db) {
pfxlog.Logger().Errorf("could not read databse stats: %v", err)
}
- err = db.Update(func(tx *bbolt.Tx) error {
-
- root := tx.Bucket([]byte("ziti"))
-
+ err = db.Update(nil, func(ctx boltz.MutateContext) error {
+ root := ctx.Tx().Bucket([]byte("ziti"))
if root == nil {
return errors.New("root 'ziti' bucket not found")
}
diff --git a/ziti/router/enrollgw.go b/ziti/router/enrollgw.go
index 58b39b062..fd0175ff4 100644
--- a/ziti/router/enrollgw.go
+++ b/ziti/router/enrollgw.go
@@ -20,14 +20,14 @@ import (
"github.com/michaelquigley/pfxlog"
"github.com/openziti/edge/router/enroll"
"github.com/openziti/fabric/router"
- "github.com/openziti/sdk-golang/ziti/config"
+ "github.com/openziti/sdk-golang/ziti"
"github.com/spf13/cobra"
"io/ioutil"
)
var jwtPath *string
var engine *string
-var keyAlg config.KeyAlgVar
+var keyAlg ziti.KeyAlgVar
func NewEnrollGwCmd() *cobra.Command {
var enrollEdgeRouterCmd = &cobra.Command{
diff --git a/ziti/tunnel/root.go b/ziti/tunnel/root.go
index 5b0291f96..4f7d51b3b 100644
--- a/ziti/tunnel/root.go
+++ b/ziti/tunnel/root.go
@@ -17,11 +17,13 @@
package tunnel
import (
+ "github.com/openziti/sdk-golang/ziti/sdkinfo"
"github.com/openziti/ziti/ziti/cmd/common"
"github.com/openziti/ziti/ziti/constants"
"github.com/openziti/ziti/ziti/util"
"os"
"path/filepath"
+ "strings"
"time"
"github.com/michaelquigley/pfxlog"
@@ -31,7 +33,6 @@ import (
"github.com/openziti/edge/tunnel/entities"
"github.com/openziti/edge/tunnel/intercept"
"github.com/openziti/sdk-golang/ziti"
- "github.com/openziti/sdk-golang/ziti/config"
"github.com/openziti/ziti/common/enrollment"
"github.com/openziti/ziti/common/version"
"github.com/sirupsen/logrus"
@@ -124,7 +125,7 @@ func rootPostRun(cmd *cobra.Command, _ []string) {
}
}
- ziti.SetApplication("ziti-tunnel", version.GetVersion())
+ sdkinfo.SetApplication("ziti-tunnel", version.GetVersion())
resolverConfig := cmd.Flag(resolverCfgFlag).Value.String()
resolver := dns.NewResolver(resolverConfig)
@@ -167,7 +168,7 @@ func startIdentity(cmd *cobra.Command, serviceListenerGroup *intercept.ServiceLi
log := pfxlog.Logger()
log.Infof("loading identity: %v", identityJson)
- zitiCfg, err := config.NewFromFile(identityJson)
+ zitiCfg, err := ziti.NewConfigFromFile(identityJson)
if err != nil {
log.Fatalf("failed to load ziti configuration from %s: %v", identityJson, err)
}
@@ -188,9 +189,16 @@ func startIdentity(cmd *cobra.Command, serviceListenerGroup *intercept.ServiceLi
serviceListener.HandleProviderReady(tunnel.NewContextProvider(ctx))
},
OnServiceUpdate: serviceListener.HandleServicesChange,
+ EdgeRouterUrlFilter: func(url string) bool {
+ return strings.HasPrefix(url, "tls:")
+ },
}
- rootPrivateContext := ziti.NewContextWithOpts(zitiCfg, options)
+ rootPrivateContext, err := ziti.NewContextWithOpts(zitiCfg, options)
+
+ if err != nil {
+ pfxlog.Logger().WithError(err).Fatal("could not create ziti sdk context")
+ }
for {
if err = rootPrivateContext.Authenticate(); err != nil {
diff --git a/ziti/tunnel/run.go b/ziti/tunnel/run.go
index 55a2841b7..2f544015a 100644
--- a/ziti/tunnel/run.go
+++ b/ziti/tunnel/run.go
@@ -50,7 +50,7 @@ func run(cmd *cobra.Command, args []string) {
_ = cmd.Flag("identity").Value.Set(args[0])
}
- tProxyInterceptor, err = tproxy.New("")
+ tProxyInterceptor, err = tproxy.New(tproxy.Config{})
if err != nil {
log.Infof("tproxy initialization failed: %v", err)
} else {
diff --git a/ziti/tunnel/tproxy.go b/ziti/tunnel/tproxy.go
index 0b6994df1..05842777d 100644
--- a/ziti/tunnel/tproxy.go
+++ b/ziti/tunnel/tproxy.go
@@ -48,7 +48,7 @@ func runTProxy(cmd *cobra.Command, _ []string) error {
return err
}
- interceptor, err = tproxy.New(lanIf)
+ interceptor, err = tproxy.New(tproxy.Config{LanIf: lanIf})
if err != nil {
return fmt.Errorf("failed to initialize tproxy interceptor: %v", err)
}
diff --git a/ziti/util/identities.go b/ziti/util/identities.go
index b63b3da7c..22d233359 100644
--- a/ziti/util/identities.go
+++ b/ziti/util/identities.go
@@ -7,9 +7,9 @@ import (
"fmt"
httptransport "github.com/go-openapi/runtime/client"
"github.com/openziti/edge-api/rest_management_api_client"
+ "github.com/openziti/edge/controller/env"
fabric_rest_client "github.com/openziti/fabric/rest_client"
"github.com/openziti/identity"
- "github.com/openziti/sdk-golang/ziti/constants"
"github.com/openziti/ziti/ziti/cmd/common"
"github.com/pkg/errors"
"gopkg.in/resty.v1"
@@ -102,7 +102,7 @@ func (self *RestClientEdgeIdentity) NewTlsClientConfig() (*tls.Config, error) {
}
func (self *RestClientEdgeIdentity) NewClient(timeout time.Duration, verbose bool) (*resty.Client, error) {
- client := newClient()
+ client := NewClient()
if self.CaCert != "" {
client.SetRootCertificate(self.CaCert)
}
@@ -113,7 +113,7 @@ func (self *RestClientEdgeIdentity) NewClient(timeout time.Duration, verbose boo
func (self *RestClientEdgeIdentity) NewRequest(client *resty.Client) *resty.Request {
r := client.R()
- r.SetHeader(constants.ZitiSession, self.Token)
+ r.SetHeader(env.ZitiSession, self.Token)
return r
}
@@ -173,7 +173,7 @@ func (self *RestClientEdgeIdentity) NewFabricManagementClient(clientOpts ClientO
func (self *RestClientEdgeIdentity) NewWsHeader() http.Header {
result := http.Header{}
- result.Set(constants.ZitiSession, self.Token)
+ result.Set(env.ZitiSession, self.Token)
return result
}
@@ -198,7 +198,7 @@ func (self *RestClientFabricIdentity) NewClient(timeout time.Duration, verbose b
if err != nil {
return nil, errors.Wrap(err, "unable to load identity")
}
- client := newClient()
+ client := NewClient()
client.SetTLSClientConfig(id.ClientTLSConfig())
client.SetTimeout(timeout)
client.SetDebug(verbose)
diff --git a/ziti/util/rest.go b/ziti/util/rest.go
index a9aa17155..9d2416f7b 100644
--- a/ziti/util/rest.go
+++ b/ziti/util/rest.go
@@ -18,7 +18,6 @@ package util
import (
"archive/tar"
- "archive/zip"
"bytes"
"compress/gzip"
"encoding/json"
@@ -33,7 +32,6 @@ import (
"github.com/openziti/ziti/common/version"
cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers"
c "github.com/openziti/ziti/ziti/constants"
- "github.com/pkg/errors"
"gopkg.in/resty.v1"
"io"
"net/http"
@@ -42,7 +40,6 @@ import (
"path"
"path/filepath"
"runtime"
- "sort"
"strconv"
"strings"
"text/template"
@@ -81,7 +78,7 @@ func DownloadFile(filepath string, url string) (err error) {
}
// Use a 2-second timeout with a retry count of 5
-func newClient() *resty.Client {
+func NewClient() *resty.Client {
return resty.
New().
SetTimeout(2 * time.Second).
@@ -90,7 +87,7 @@ func newClient() *resty.Client {
}
func getRequest(verbose bool) *resty.Request {
- return newClient().
+ return NewClient().
SetDebug(verbose).
R()
}
@@ -154,116 +151,6 @@ func GetLatestVersionFromArtifactory(verbose bool, staging bool, branch string,
return semver.Make(strings.TrimPrefix(result.Version, "v"))
}
-// Used to parse the '/releases/latest' response from GitHub
-type GitHubReleasesData struct {
- Version string `json:"tag_name"`
- SemVer semver.Version
- Assets []struct {
- BrowserDownloadURL string `json:"browser_download_url"`
- }
-}
-
-func (self *GitHubReleasesData) GetDownloadUrl(appName string) (string, error) {
- arches := []string{runtime.GOARCH}
- if strings.ToLower(runtime.GOARCH) == "amd64" {
- arches = append(arches, "x86_64")
- }
-
- for _, asset := range self.Assets {
- ok := false
- for _, arch := range arches {
- if strings.Contains(strings.ToLower(asset.BrowserDownloadURL), arch) {
- ok = true
- }
- }
-
- ok = ok && strings.Contains(strings.ToLower(asset.BrowserDownloadURL), runtime.GOOS)
- if ok {
- return asset.BrowserDownloadURL, nil
- }
- }
-
- return "", errors.Errorf("no download URL found for os/arch %v/%v for '%v'", runtime.GOOS, runtime.GOARCH, appName)
-}
-
-func GetHighestVersionGitHubReleaseInfo(verbose bool, appName string) (*GitHubReleasesData, error) {
- resp, err := getRequest(verbose).
- SetQueryParams(map[string]string{}).
- SetHeader("Accept", "application/vnd.github.v3+json").
- SetResult([]*GitHubReleasesData{}).
- Get("https://api.github.com/repos/openziti/" + appName + "/releases")
-
- if err != nil {
- return nil, errors.Wrapf(err, "unable to get latest version for '%s'", appName)
- }
-
- if resp.StatusCode() == http.StatusNotFound {
- return nil, errors.Errorf("unable to get latest version for '%s'; Not Found (invalid URL)", appName)
- }
- if resp.StatusCode() != http.StatusOK {
- return nil, errors.Errorf("unable to get latest version for '%s'; return status=%s", appName, resp.Status())
- }
-
- result := *resp.Result().(*[]*GitHubReleasesData)
- return getHighestVersionRelease(appName, result)
-}
-
-func getHighestVersionRelease(appName string, releases []*GitHubReleasesData) (*GitHubReleasesData, error) {
- for _, release := range releases {
- v, err := semver.ParseTolerant(release.Version)
- if err != nil {
- return nil, errors.Wrapf(err, "unable to parse version %v for '%v'", release.Version, appName)
- }
- release.SemVer = v
- }
- sort.Slice(releases, func(i, j int) bool {
- return releases[i].SemVer.GT(releases[j].SemVer) // sort in reverse order
- })
- if len(releases) == 0 {
- return nil, errors.Errorf("no releases found for '%v'", appName)
- }
- return releases[0], nil
-}
-
-func GetLatestGitHubReleaseAsset(verbose bool, appName string) (*GitHubReleasesData, error) {
- resp, err := getRequest(verbose).
- SetQueryParams(map[string]string{}).
- SetHeader("Accept", "application/vnd.github.v3+json").
- SetResult(&GitHubReleasesData{}).
- Get("https://api.github.com/repos/openziti/" + appName + "/releases/latest")
-
- if err != nil {
- return nil, fmt.Errorf("unable to get latest version for '%s'; %s", appName, err)
- }
-
- if resp.StatusCode() == http.StatusNotFound {
- return nil, fmt.Errorf("unable to get latest version for '%s'; Not Found", appName)
- }
- if resp.StatusCode() != http.StatusOK {
- return nil, fmt.Errorf("unable to get latest version for '%s'; %s", appName, resp.Status())
- }
-
- result := resp.Result().(*GitHubReleasesData)
- return result, nil
-}
-
-// DownloadGitHubReleaseAsset will download a file from the given GitHUb release area
-func DownloadGitHubReleaseAsset(fullUrl string, filepath string) (err error) {
- resp, err := getRequest(false).
- SetOutput(filepath).
- Get(fullUrl)
-
- if err != nil {
- return fmt.Errorf("unable to download '%s', %s", fullUrl, err)
- }
-
- if resp.IsError() {
- return fmt.Errorf("unable to download file, error HTTP status code [%d] returned for url [%s]", resp.StatusCode(), fullUrl)
- }
-
- return nil
-}
-
// Used to parse the '/api/search/aql' response from Artifactory
type AQLResult struct {
Repo string
@@ -505,108 +392,7 @@ func UnTargz(tarball, target string, onlyFiles []string) error {
return nil
}
-func Unzip(src, dest string) error {
- r, err := zip.OpenReader(src)
- if err != nil {
- return err
- }
- defer func() {
- if err := r.Close(); err != nil {
- panic(err)
- }
- }()
-
- os.MkdirAll(dest, 0755)
-
- // Closure to address file descriptors issue with all the deferred .Close() methods
- extractAndWriteFile := func(f *zip.File) error {
- rc, err := f.Open()
- if err != nil {
- return err
- }
- defer func() {
- if err := rc.Close(); err != nil {
- panic(err)
- }
- }()
-
- path := filepath.Join(dest, f.Name)
-
- // Check for ZipSlip (Directory traversal)
- if !strings.HasPrefix(path, filepath.Clean(dest)+string(os.PathSeparator)) {
- return fmt.Errorf("illegal file path: %s", path)
- }
-
- if f.FileInfo().IsDir() {
- os.MkdirAll(path, f.Mode())
- } else {
- os.MkdirAll(filepath.Dir(path), f.Mode())
- f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
- if err != nil {
- return err
- }
- defer func() {
- if err := f.Close(); err != nil {
- panic(err)
- }
- }()
-
- _, err = io.Copy(f, rc)
- if err != nil {
- return err
- }
- }
- return nil
- }
-
- for _, f := range r.File {
- err := extractAndWriteFile(f)
- if err != nil {
- return err
- }
- }
-
- return nil
-}
-
-// EdgeControllerLogin will authenticate to the given Edge Controller
-func EdgeControllerLogin(url string, cert string, authentication string, out io.Writer, logJSON bool, timeout int, verbose bool) (*gabs.Container, error) {
- client := newClient()
-
- if cert != "" {
- client.SetRootCertificate(cert)
- }
-
- resp, err := client.
- SetTimeout(time.Duration(time.Duration(timeout)*time.Second)).
- SetDebug(verbose).
- R().
- SetQueryParam("method", "password").
- SetHeader("Content-Type", "application/json").
- SetBody(authentication).
- Post(url + "/authenticate")
-
- if err != nil {
- return nil, fmt.Errorf("unable to authenticate to %v. Error: %v", url, err)
- }
-
- if resp.StatusCode() != http.StatusOK {
- return nil, fmt.Errorf("unable to authenticate to %v. Status code: %v, Server returned: %v", url, resp.Status(), prettyPrintResponse(resp))
- }
-
- if logJSON {
- outputJson(out, resp.Body())
- }
-
- jsonParsed, err := gabs.ParseJSON(resp.Body())
- if err != nil {
- return nil, fmt.Errorf("unable to parse response from %v. Server returned: %v", url, resp.String())
- }
-
- return jsonParsed, nil
-}
-
-func prettyPrintResponse(resp *resty.Response) string {
+func PrettyPrintResponse(resp *resty.Response) string {
out := resp.String()
var prettyJSON bytes.Buffer
if err := json.Indent(&prettyJSON, []byte(out), "", " "); err == nil {
@@ -615,7 +401,7 @@ func prettyPrintResponse(resp *resty.Response) string {
return out
}
-func outputJson(out io.Writer, data []byte) {
+func OutputJson(out io.Writer, data []byte) {
var prettyJSON bytes.Buffer
if err := json.Indent(&prettyJSON, data, "", " "); err == nil {
if _, err := fmt.Fprint(out, prettyJSON.String()); err != nil {
@@ -654,11 +440,11 @@ func ControllerDetailEntity(api API, entityType, entityId string, logJSON bool,
if resp.StatusCode() != http.StatusOK {
return nil, fmt.Errorf("error listing %v in Ziti Edge Controller. Status code: %v, Server returned: %v",
- queryUrl, resp.Status(), prettyPrintResponse(resp))
+ queryUrl, resp.Status(), PrettyPrintResponse(resp))
}
if logJSON {
- outputJson(out, resp.Body())
+ OutputJson(out, resp.Body())
}
jsonParsed, err := gabs.ParseJSON(resp.Body())
@@ -715,11 +501,11 @@ func ControllerList(api API, path string, params url.Values, logJSON bool, out i
if resp.StatusCode() != http.StatusOK {
return nil, fmt.Errorf("error listing %v in Ziti Edge Controller. Status code: %v, Server returned: %v",
- queryUrl, resp.Status(), prettyPrintResponse(resp))
+ queryUrl, resp.Status(), PrettyPrintResponse(resp))
}
if logJSON {
- outputJson(out, resp.Body())
+ OutputJson(out, resp.Body())
}
jsonParsed, err := gabs.ParseJSON(resp.Body())
@@ -850,7 +636,7 @@ func ControllerCreate(api API, entityType string, body string, out io.Writer, lo
url := baseUrl + "/" + entityType
if logRequestJson {
fmt.Printf("%v to %v\n", "POST", url)
- outputJson(out, []byte(body))
+ OutputJson(out, []byte(body))
fmt.Println()
}
@@ -862,11 +648,11 @@ func ControllerCreate(api API, entityType string, body string, out io.Writer, lo
if resp.StatusCode() != http.StatusCreated {
return nil, fmt.Errorf("error creating %v instance in Ziti Edge Controller at %v. Status code: %v, Server returned: %v",
- entityType, baseUrl, resp.Status(), prettyPrintResponse(resp))
+ entityType, baseUrl, resp.Status(), PrettyPrintResponse(resp))
}
if logResponseJson {
- outputJson(out, resp.Body())
+ OutputJson(out, resp.Body())
}
jsonParsed, err := gabs.ParseJSON(resp.Body())
@@ -900,7 +686,7 @@ func ControllerDelete(api API, entityType string, id string, body string, out io
if logRequestJson {
fmt.Printf("%v to %v\n", "POST", fullUrl)
- outputJson(out, []byte(body))
+ OutputJson(out, []byte(body))
fmt.Println()
}
@@ -916,11 +702,11 @@ func ControllerDelete(api API, entityType string, id string, body string, out io
if resp.StatusCode() != http.StatusOK {
return fmt.Errorf("error deleting %v instance in Ziti Edge Controller at %v. Status code: %v, Server returned: %v",
- entityPath, baseUrl, resp.Status(), prettyPrintResponse(resp))
+ entityPath, baseUrl, resp.Status(), PrettyPrintResponse(resp))
}
if logResponseJson {
- outputJson(out, resp.Body())
+ OutputJson(out, resp.Body())
}
return nil
@@ -947,7 +733,7 @@ func ControllerUpdate(api API, entityType string, body string, out io.Writer, me
if logRequestJson {
fmt.Printf("%v to %v\n", method, url)
- outputJson(out, []byte(body))
+ OutputJson(out, []byte(body))
fmt.Println()
}
@@ -959,11 +745,11 @@ func ControllerUpdate(api API, entityType string, body string, out io.Writer, me
if resp.StatusCode() != http.StatusOK && resp.StatusCode() != http.StatusAccepted {
return nil, fmt.Errorf("error updating %v instance in Ziti Edge Controller at %v. Status code: %v, Server returned: %v",
- entityType, baseUrl, resp.Status(), prettyPrintResponse(resp))
+ entityType, baseUrl, resp.Status(), PrettyPrintResponse(resp))
}
if logResponseJSON {
- outputJson(out, resp.Body())
+ OutputJson(out, resp.Body())
}
if len(resp.Body()) == 0 {
@@ -1009,11 +795,11 @@ func EdgeControllerVerify(entityType, id, body string, out io.Writer, logJSON bo
if resp.StatusCode() != http.StatusOK {
return fmt.Errorf("error verifying %v instance (%v) in Ziti Edge Controller at %v. Status code: %v, Server returned: %v",
- entityType, id, baseUrl, resp.Status(), prettyPrintResponse(resp))
+ entityType, id, baseUrl, resp.Status(), PrettyPrintResponse(resp))
}
if logJSON {
- outputJson(out, resp.Body())
+ OutputJson(out, resp.Body())
}
return nil
@@ -1043,11 +829,11 @@ func EdgeControllerRequest(entityType string, out io.Writer, logJSON bool, timeo
if resp.StatusCode() != http.StatusOK {
return nil, fmt.Errorf("error performing request [%s] %v instance in Ziti Edge Controller at %v. Status code: %v, Server returned: %v",
- request.Method, entityType, baseUrl, resp.Status(), prettyPrintResponse(resp))
+ request.Method, entityType, baseUrl, resp.Status(), PrettyPrintResponse(resp))
}
if logJSON {
- outputJson(out, resp.Body())
+ OutputJson(out, resp.Body())
}
if resp.Body() == nil {
@@ -1068,7 +854,7 @@ func EdgeControllerRequest(entityType string, out io.Writer, logJSON bool, timeo
// on the version of the Edge Controller the API may be monolith on `/edge/` and `/` or split into
// `/edge/management/` and `/edge/client/`.
func EdgeControllerGetManagementApiBasePath(host string, cert string) string {
- client := newClient()
+ client := NewClient()
client.SetHostURL(host)
diff --git a/ziti/util/updates.go b/ziti/util/updates.go
index 52239faae..2c94c4694 100644
--- a/ziti/util/updates.go
+++ b/ziti/util/updates.go
@@ -18,6 +18,7 @@ package util
import (
"fmt"
+ "github.com/openziti/ziti/common/getziti"
"github.com/openziti/ziti/ziti/constants"
"os"
"strings"
@@ -29,12 +30,12 @@ import (
"github.com/openziti/ziti/common/version"
)
-func LogReleaseVersionCheck(ziti_component string) {
+func LogReleaseVersionCheck(zitiComponent string) {
logger := pfxlog.Logger()
if strings.ToLower(os.Getenv("ZITI_CHECK_VERSION")) == "true" {
logger.Debug("ZITI_CHECK_VERSION is true. starting version check")
developmentSemver, _ := semver.Parse("0.0.0")
- latestGithubRelease, err := GetHighestVersionGitHubReleaseInfo(false, constants.ZITI)
+ latestGithubRelease, err := getziti.GetHighestVersionGitHubReleaseInfo(constants.ZITI, false)
if err != nil {
logger.Debugf("failed to find latest GitHub version with error: %s", err)
return // soft-fail version check if GitHub API is unavailable
@@ -50,7 +51,7 @@ func LogReleaseVersionCheck(ziti_component string) {
if currentBuildSemver.EQ(developmentSemver) {
logger.Debugf(
"this build of %s is unreleased v%s",
- ziti_component,
+ zitiComponent,
developmentSemver,
)
} else if latestGithubRelease.SemVer.GT(currentBuildSemver) {
@@ -66,20 +67,20 @@ https://github.com/openziti/%s/releases/latest/
*********************************************************************************
`,
green("v"+latestGithubRelease.SemVer.String()),
- ziti_component,
+ zitiComponent,
yellow("v"+currentBuildSemver.String()),
constants.ZITI,
)
logger.Debugf(
"this v%s build of %s is superseded by v%s",
currentBuildSemver,
- ziti_component,
+ zitiComponent,
latestGithubRelease,
)
} else if latestGithubRelease.SemVer.EQ(currentBuildSemver) {
logger.Debugf(
"this build of %s is the latest release v%s",
- ziti_component,
+ zitiComponent,
currentBuildSemver,
)
}