Compare commits
51 Commits
15c91f2910
...
v4.1.0
| Author | SHA1 | Date | |
|---|---|---|---|
| 2684509bd1 | |||
| 6d7f14ccf0 | |||
| f62cbcd890 | |||
| 05ee6a3536 | |||
| 82dcea4f29 | |||
| 99d706ceb7 | |||
|
|
7bb100c19a | ||
| 5445cfca19 | |||
|
|
1bf266a9d0 | ||
| d6b61dcca1 | |||
|
|
5bbe417769 | ||
| 36aa6c8b4d | |||
|
|
550ee03074 | ||
| 57790b33e6 | |||
|
|
0bb04805d0 | ||
| 774abe4f89 | |||
|
|
8171a411b1 | ||
| dac7664d93 | |||
|
|
2a46b0d229 | ||
| b51ed8d224 | |||
|
|
55a8a4f7eb | ||
| 632170cd84 | |||
|
|
16eb70b928 | ||
| 89c8b8b7af | |||
|
|
ebc74c0a6b | ||
| 4ac3c31e52 | |||
|
|
6d3bcb9eed | ||
| 068795eb11 | |||
|
|
4e6306b301 | ||
| 47d2e0469b | |||
|
|
083b431a66 | ||
| a6738d2da5 | |||
|
|
5a6b191205 | ||
| 541138e5f4 | |||
|
|
f8b92e762a | ||
| 90be898849 | |||
|
|
f58674fd57 | ||
| 3639b16686 | |||
|
|
227ca99f84 | ||
| 4fde9d39be | |||
|
|
e94f138ab7 | ||
| b12fa2bca2 | |||
|
|
1d62516001 | ||
| ed3fe8afd3 | |||
|
|
21ba164e60 | ||
| 0fced80bd4 | |||
|
|
0d796457fb | ||
| ac05746a52 | |||
|
|
2a19639bbe | ||
| 788c594f42 | |||
|
|
f59d1b39f0 |
29
.gitea/workflows/job_lint.yml
Normal file
29
.gitea/workflows/job_lint.yml
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
name: lint
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
types: [opened, reopened, synchronize]
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
- v3
|
||||||
|
- v4
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
lint:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
filter: 'blob:none'
|
||||||
|
- name: setup go
|
||||||
|
uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
cache-dependency-path: "**/*.sum"
|
||||||
|
go-version: 'stable'
|
||||||
|
- name: setup deps
|
||||||
|
run: go get -v ./...
|
||||||
|
- name: run lint
|
||||||
|
uses: https://github.com/golangci/golangci-lint-action@v6
|
||||||
|
with:
|
||||||
|
version: 'latest'
|
||||||
34
.gitea/workflows/job_test.yml
Normal file
34
.gitea/workflows/job_test.yml
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
name: test
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
types: [opened, reopened, synchronize]
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
- v3
|
||||||
|
- v4
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
- v3
|
||||||
|
- v4
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
filter: 'blob:none'
|
||||||
|
- name: setup go
|
||||||
|
uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
cache-dependency-path: "**/*.sum"
|
||||||
|
go-version: 'stable'
|
||||||
|
- name: setup deps
|
||||||
|
run: go get -v ./...
|
||||||
|
- name: run test
|
||||||
|
env:
|
||||||
|
INTEGRATION_TESTS: yes
|
||||||
|
run: go test -mod readonly -v ./...
|
||||||
53
.gitea/workflows/job_tests.yml
Normal file
53
.gitea/workflows/job_tests.yml
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
name: test
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
types: [opened, reopened, synchronize]
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
- v3
|
||||||
|
- v4
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
- v3
|
||||||
|
- v4
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
filter: 'blob:none'
|
||||||
|
- name: checkout tests
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
ref: master
|
||||||
|
filter: 'blob:none'
|
||||||
|
repository: unistack-org/micro-tests
|
||||||
|
path: micro-tests
|
||||||
|
- name: setup go
|
||||||
|
uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
cache-dependency-path: "**/*.sum"
|
||||||
|
go-version: 'stable'
|
||||||
|
- name: setup go work
|
||||||
|
env:
|
||||||
|
GOWORK: /workspace/${{ github.repository_owner }}/go.work
|
||||||
|
run: |
|
||||||
|
go work init
|
||||||
|
go work use .
|
||||||
|
go work use micro-tests
|
||||||
|
- name: setup deps
|
||||||
|
env:
|
||||||
|
GOWORK: /workspace/${{ github.repository_owner }}/go.work
|
||||||
|
run: go get -v ./...
|
||||||
|
- name: run tests
|
||||||
|
env:
|
||||||
|
INTEGRATION_TESTS: yes
|
||||||
|
GOWORK: /workspace/${{ github.repository_owner }}/go.work
|
||||||
|
run: |
|
||||||
|
cd micro-tests
|
||||||
|
go test -mod readonly -v ./... || true
|
||||||
19
.github/dependabot.yml
vendored
19
.github/dependabot.yml
vendored
@@ -1,19 +0,0 @@
|
|||||||
# To get started with Dependabot version updates, you'll need to specify which
|
|
||||||
# package ecosystems to update and where the package manifests are located.
|
|
||||||
# Please see the documentation for all configuration options:
|
|
||||||
# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
|
|
||||||
|
|
||||||
version: 2
|
|
||||||
updates:
|
|
||||||
|
|
||||||
# Maintain dependencies for GitHub Actions
|
|
||||||
- package-ecosystem: "github-actions"
|
|
||||||
directory: "/"
|
|
||||||
schedule:
|
|
||||||
interval: "daily"
|
|
||||||
|
|
||||||
# Maintain dependencies for Golang
|
|
||||||
- package-ecosystem: "gomod"
|
|
||||||
directory: "/"
|
|
||||||
schedule:
|
|
||||||
interval: "daily"
|
|
||||||
20
.github/workflows/autoapprove.yml
vendored
20
.github/workflows/autoapprove.yml
vendored
@@ -1,20 +0,0 @@
|
|||||||
name: "autoapprove"
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request_target:
|
|
||||||
types: [assigned, opened, synchronize, reopened]
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
pull-requests: write
|
|
||||||
contents: write
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
autoapprove:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: approve
|
|
||||||
uses: hmarr/auto-approve-action@v3
|
|
||||||
if: github.actor == 'vtolstov' || github.actor == 'dependabot[bot]'
|
|
||||||
id: approve
|
|
||||||
with:
|
|
||||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
21
.github/workflows/automerge.yml
vendored
21
.github/workflows/automerge.yml
vendored
@@ -1,21 +0,0 @@
|
|||||||
name: "automerge"
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request_target:
|
|
||||||
types: [assigned, opened, synchronize, reopened]
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
pull-requests: write
|
|
||||||
contents: write
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
automerge:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: github.actor == 'vtolstov'
|
|
||||||
steps:
|
|
||||||
- name: merge
|
|
||||||
id: merge
|
|
||||||
run: gh pr merge --auto --merge "$PR_URL"
|
|
||||||
env:
|
|
||||||
PR_URL: ${{github.event.pull_request.html_url}}
|
|
||||||
GITHUB_TOKEN: ${{secrets.TOKEN}}
|
|
||||||
47
.github/workflows/build.yml
vendored
47
.github/workflows/build.yml
vendored
@@ -1,47 +0,0 @@
|
|||||||
name: build
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
- v3
|
|
||||||
jobs:
|
|
||||||
test:
|
|
||||||
name: test
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: setup
|
|
||||||
uses: actions/setup-go@v3
|
|
||||||
with:
|
|
||||||
go-version: 1.17
|
|
||||||
- name: checkout
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
- name: cache
|
|
||||||
uses: actions/cache@v3
|
|
||||||
with:
|
|
||||||
path: ~/go/pkg/mod
|
|
||||||
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
|
|
||||||
restore-keys: ${{ runner.os }}-go-
|
|
||||||
- name: deps
|
|
||||||
run: go get -v -t -d ./...
|
|
||||||
- name: test
|
|
||||||
env:
|
|
||||||
INTEGRATION_TESTS: yes
|
|
||||||
run: go test -mod readonly -v ./...
|
|
||||||
lint:
|
|
||||||
name: lint
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: checkout
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
- name: lint
|
|
||||||
uses: golangci/golangci-lint-action@v3.4.0
|
|
||||||
continue-on-error: true
|
|
||||||
with:
|
|
||||||
# Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version.
|
|
||||||
version: v1.30
|
|
||||||
# Optional: working directory, useful for monorepos
|
|
||||||
# working-directory: somedir
|
|
||||||
# Optional: golangci-lint command line arguments.
|
|
||||||
# args: --issues-exit-code=0
|
|
||||||
# Optional: show only new issues if it's a pull request. The default value is `false`.
|
|
||||||
# only-new-issues: true
|
|
||||||
78
.github/workflows/codeql-analysis.yml
vendored
78
.github/workflows/codeql-analysis.yml
vendored
@@ -1,78 +0,0 @@
|
|||||||
# For most projects, this workflow file will not need changing; you simply need
|
|
||||||
# to commit it to your repository.
|
|
||||||
#
|
|
||||||
# You may wish to alter this file to override the set of languages analyzed,
|
|
||||||
# or to provide custom queries or build logic.
|
|
||||||
#
|
|
||||||
# ******** NOTE ********
|
|
||||||
# We have attempted to detect the languages in your repository. Please check
|
|
||||||
# the `language` matrix defined below to confirm you have the correct set of
|
|
||||||
# supported CodeQL languages.
|
|
||||||
#
|
|
||||||
name: "codeql"
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_run:
|
|
||||||
workflows: ["prbuild"]
|
|
||||||
types:
|
|
||||||
- completed
|
|
||||||
push:
|
|
||||||
branches: [ master, v3 ]
|
|
||||||
pull_request:
|
|
||||||
# The branches below must be a subset of the branches above
|
|
||||||
branches: [ master, v3 ]
|
|
||||||
schedule:
|
|
||||||
- cron: '34 1 * * 0'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
analyze:
|
|
||||||
name: analyze
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
permissions:
|
|
||||||
actions: read
|
|
||||||
contents: read
|
|
||||||
security-events: write
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
language: [ 'go' ]
|
|
||||||
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ]
|
|
||||||
# Learn more:
|
|
||||||
# https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: checkout
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
- name: setup
|
|
||||||
uses: actions/setup-go@v3
|
|
||||||
with:
|
|
||||||
go-version: 1.17
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
|
||||||
- name: init
|
|
||||||
uses: github/codeql-action/init@v2
|
|
||||||
with:
|
|
||||||
languages: ${{ matrix.language }}
|
|
||||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
|
||||||
# By default, queries listed here will override any specified in a config file.
|
|
||||||
# Prefix the list here with "+" to use these queries and those in the config file.
|
|
||||||
# queries: ./path/to/local/query, your-org/your-repo/queries@main
|
|
||||||
|
|
||||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
|
||||||
# If this step fails, then you should remove it and run the build manually (see below)
|
|
||||||
- name: autobuild
|
|
||||||
uses: github/codeql-action/autobuild@v2
|
|
||||||
|
|
||||||
# ℹ️ Command-line programs to run using the OS shell.
|
|
||||||
# 📚 https://git.io/JvXDl
|
|
||||||
|
|
||||||
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
|
|
||||||
# and modify them (or add more) to build your code if your project
|
|
||||||
# uses a compiled language
|
|
||||||
|
|
||||||
#- run: |
|
|
||||||
# make bootstrap
|
|
||||||
# make release
|
|
||||||
|
|
||||||
- name: analyze
|
|
||||||
uses: github/codeql-action/analyze@v2
|
|
||||||
27
.github/workflows/dependabot-automerge.yml
vendored
27
.github/workflows/dependabot-automerge.yml
vendored
@@ -1,27 +0,0 @@
|
|||||||
name: "dependabot-automerge"
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request_target:
|
|
||||||
types: [assigned, opened, synchronize, reopened]
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
pull-requests: write
|
|
||||||
contents: write
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
automerge:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: github.actor == 'dependabot[bot]'
|
|
||||||
steps:
|
|
||||||
- name: metadata
|
|
||||||
id: metadata
|
|
||||||
uses: dependabot/fetch-metadata@v1.3.6
|
|
||||||
with:
|
|
||||||
github-token: "${{ secrets.TOKEN }}"
|
|
||||||
- name: merge
|
|
||||||
id: merge
|
|
||||||
if: ${{contains(steps.metadata.outputs.dependency-names, 'go.unistack.org')}}
|
|
||||||
run: gh pr merge --auto --merge "$PR_URL"
|
|
||||||
env:
|
|
||||||
PR_URL: ${{github.event.pull_request.html_url}}
|
|
||||||
GITHUB_TOKEN: ${{secrets.TOKEN}}
|
|
||||||
47
.github/workflows/pr.yml
vendored
47
.github/workflows/pr.yml
vendored
@@ -1,47 +0,0 @@
|
|||||||
name: prbuild
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
- v3
|
|
||||||
jobs:
|
|
||||||
test:
|
|
||||||
name: test
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: setup
|
|
||||||
uses: actions/setup-go@v3
|
|
||||||
with:
|
|
||||||
go-version: 1.17
|
|
||||||
- name: checkout
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
- name: cache
|
|
||||||
uses: actions/cache@v3
|
|
||||||
with:
|
|
||||||
path: ~/go/pkg/mod
|
|
||||||
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
|
|
||||||
restore-keys: ${{ runner.os }}-go-
|
|
||||||
- name: deps
|
|
||||||
run: go get -v -t -d ./...
|
|
||||||
- name: test
|
|
||||||
env:
|
|
||||||
INTEGRATION_TESTS: yes
|
|
||||||
run: go test -mod readonly -v ./...
|
|
||||||
lint:
|
|
||||||
name: lint
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: checkout
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
- name: lint
|
|
||||||
uses: golangci/golangci-lint-action@v3.4.0
|
|
||||||
continue-on-error: true
|
|
||||||
with:
|
|
||||||
# Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version.
|
|
||||||
version: v1.30
|
|
||||||
# Optional: working directory, useful for monorepos
|
|
||||||
# working-directory: somedir
|
|
||||||
# Optional: golangci-lint command line arguments.
|
|
||||||
# args: --issues-exit-code=0
|
|
||||||
# Optional: show only new issues if it's a pull request. The default value is `false`.
|
|
||||||
# only-new-issues: true
|
|
||||||
19
go.mod
19
go.mod
@@ -1,5 +1,18 @@
|
|||||||
module go.unistack.org/micro-router-register/v3
|
module go.unistack.org/micro-router-register/v4
|
||||||
|
|
||||||
go 1.16
|
go 1.22.0
|
||||||
|
|
||||||
require go.unistack.org/micro/v3 v3.10.14
|
toolchain go1.23.4
|
||||||
|
|
||||||
|
require go.unistack.org/micro/v4 v4.1.2
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/ash3in/uuidv8 v1.2.0 // indirect
|
||||||
|
github.com/google/go-cmp v0.6.0 // indirect
|
||||||
|
github.com/google/uuid v1.6.0 // indirect
|
||||||
|
github.com/kr/pretty v0.3.1 // indirect
|
||||||
|
github.com/matoous/go-nanoid v1.5.1 // indirect
|
||||||
|
go.unistack.org/micro-proto/v4 v4.1.0 // indirect
|
||||||
|
google.golang.org/protobuf v1.36.3 // indirect
|
||||||
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
|
)
|
||||||
|
|||||||
34
go.sum
34
go.sum
@@ -1,8 +1,30 @@
|
|||||||
github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg=
|
github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU=
|
||||||
github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=
|
github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU=
|
||||||
github.com/silas/dag v0.0.0-20211117232152-9d50aa809f35/go.mod h1:7RTUFBdIRC9nZ7/3RyRNH1bdqIShrDejd1YbLwgPS+I=
|
github.com/ash3in/uuidv8 v1.2.0 h1:2oogGdtCPwaVtyvPPGin4TfZLtOGE5F+W++E880G6SI=
|
||||||
go.unistack.org/micro/v3 v3.10.14 h1:7fgLpwGlCN67twhwtngJDEQvrMkUBDSA5vzZqxIDqNE=
|
github.com/ash3in/uuidv8 v1.2.0/go.mod h1:BnU0wJBxnzdEKmVg4xckBkD+VZuecTFTUP3M0dWgyY4=
|
||||||
go.unistack.org/micro/v3 v3.10.14/go.mod h1:uMAc0U/x7dmtICCrblGf0ZLgYegu3VwQAquu+OFCw1Q=
|
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||||
|
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
||||||
|
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||||
|
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
||||||
|
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
|
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
||||||
|
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
|
||||||
|
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||||
|
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||||
|
github.com/matoous/go-nanoid v1.5.1 h1:aCjdvTyO9LLnTIi0fgdXhOPPvOHjpXN6Ik9DaNjIct4=
|
||||||
|
github.com/matoous/go-nanoid v1.5.1/go.mod h1:zyD2a71IubI24efhpvkJz+ZwfwagzgSO6UNiFsZKN7U=
|
||||||
|
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
|
||||||
|
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
|
||||||
|
github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
|
||||||
|
github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
|
||||||
|
go.unistack.org/micro-proto/v4 v4.1.0 h1:qPwL2n/oqh9RE3RTTDgt28XK3QzV597VugQPaw9lKUk=
|
||||||
|
go.unistack.org/micro-proto/v4 v4.1.0/go.mod h1:ArmK7o+uFvxSY3dbJhKBBX4Pm1rhWdLEFf3LxBrMtec=
|
||||||
|
go.unistack.org/micro/v4 v4.1.2 h1:9SOlPYyPNNFpg1A7BsvhDyQm3gysLH1AhWbDCp1hyoY=
|
||||||
|
go.unistack.org/micro/v4 v4.1.2/go.mod h1:lr3oYED8Ay1vjK68QqRw30QOtdk/ffpZqMFDasOUhKw=
|
||||||
|
google.golang.org/protobuf v1.36.3 h1:82DV7MYdb8anAVi3qge1wSnMDrnKK7ebr+I0hHRN1BU=
|
||||||
|
google.golang.org/protobuf v1.36.3/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||||
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
|||||||
98
registry.go
98
registry.go
@@ -1,13 +1,13 @@
|
|||||||
package register // import "go.unistack.org/micro-router-register/v3"
|
package register
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"go.unistack.org/micro/v3/logger"
|
"go.unistack.org/micro/v4/logger"
|
||||||
"go.unistack.org/micro/v3/register"
|
"go.unistack.org/micro/v4/register"
|
||||||
"go.unistack.org/micro/v3/router"
|
"go.unistack.org/micro/v4/router"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -84,32 +84,18 @@ func (r *rtr) Table() router.Table {
|
|||||||
return r.table
|
return r.table
|
||||||
}
|
}
|
||||||
|
|
||||||
func getDomain(srv *register.Service) string {
|
|
||||||
// check the service metadata for domain
|
|
||||||
// TODO: domain as Domain field in register?
|
|
||||||
if srv.Metadata != nil && len(srv.Metadata["domain"]) > 0 {
|
|
||||||
return srv.Metadata["domain"]
|
|
||||||
} else if len(srv.Nodes) > 0 && srv.Nodes[0].Metadata != nil {
|
|
||||||
return srv.Nodes[0].Metadata["domain"]
|
|
||||||
}
|
|
||||||
|
|
||||||
// otherwise return wildcard
|
|
||||||
// TODO: return GlobalDomain or PublicDomain
|
|
||||||
return register.DefaultDomain
|
|
||||||
}
|
|
||||||
|
|
||||||
// manageRoute applies action on a given route
|
// manageRoute applies action on a given route
|
||||||
func (r *rtr) manageRoute(route router.Route, action string) error {
|
func (r *rtr) manageRoute(route router.Route, action register.EventType) error {
|
||||||
switch action {
|
switch action {
|
||||||
case "create":
|
case register.EventCreate:
|
||||||
if err := r.table.Create(route); err != nil && err != router.ErrDuplicateRoute {
|
if err := r.table.Create(route); err != nil && err != router.ErrDuplicateRoute {
|
||||||
return fmt.Errorf("failed adding route for service %s: %s", route.Service, err)
|
return fmt.Errorf("failed adding route for service %s: %s", route.Service, err)
|
||||||
}
|
}
|
||||||
case "delete":
|
case register.EventDelete:
|
||||||
if err := r.table.Delete(route); err != nil && err != router.ErrRouteNotFound {
|
if err := r.table.Delete(route); err != nil && err != router.ErrRouteNotFound {
|
||||||
return fmt.Errorf("failed deleting route for service %s: %s", route.Service, err)
|
return fmt.Errorf("failed deleting route for service %s: %s", route.Service, err)
|
||||||
}
|
}
|
||||||
case "update":
|
case register.EventUpdate:
|
||||||
if err := r.table.Update(route); err != nil {
|
if err := r.table.Update(route); err != nil {
|
||||||
return fmt.Errorf("failed updating route for service %s: %s", route.Service, err)
|
return fmt.Errorf("failed updating route for service %s: %s", route.Service, err)
|
||||||
}
|
}
|
||||||
@@ -121,7 +107,7 @@ func (r *rtr) manageRoute(route router.Route, action string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// createRoutes turns a service into a list routes basically converting nodes to routes
|
// createRoutes turns a service into a list routes basically converting nodes to routes
|
||||||
func (r *rtr) createRoutes(service *register.Service, network string) []router.Route {
|
func (r *rtr) createRoutes(service *register.Service) []router.Route {
|
||||||
routes := make([]router.Route, 0, len(service.Nodes))
|
routes := make([]router.Route, 0, len(service.Nodes))
|
||||||
|
|
||||||
for _, node := range service.Nodes {
|
for _, node := range service.Nodes {
|
||||||
@@ -129,7 +115,7 @@ func (r *rtr) createRoutes(service *register.Service, network string) []router.R
|
|||||||
Service: service.Name,
|
Service: service.Name,
|
||||||
Address: node.Address,
|
Address: node.Address,
|
||||||
Gateway: "",
|
Gateway: "",
|
||||||
Network: network,
|
Network: service.Namespace,
|
||||||
Router: r.opts.ID,
|
Router: r.opts.ID,
|
||||||
Link: router.DefaultLink,
|
Link: router.DefaultLink,
|
||||||
Metric: router.DefaultLocalMetric,
|
Metric: router.DefaultLocalMetric,
|
||||||
@@ -142,23 +128,23 @@ func (r *rtr) createRoutes(service *register.Service, network string) []router.R
|
|||||||
|
|
||||||
// manageServiceRoutes applies action to all routes of the service.
|
// manageServiceRoutes applies action to all routes of the service.
|
||||||
// It returns error of the action fails with error.
|
// It returns error of the action fails with error.
|
||||||
func (r *rtr) manageRoutes(service *register.Service, action, network string) error {
|
func (r *rtr) manageRoutes(service *register.Service, action register.EventType) error {
|
||||||
// create a set of routes from the service
|
// create a set of routes from the service
|
||||||
routes := r.createRoutes(service, network)
|
routes := r.createRoutes(service)
|
||||||
|
|
||||||
// if its a delete action and there's no nodes
|
// if its a delete action and there's no nodes
|
||||||
// it means we need to wipe out all the routes
|
// it means we need to wipe out all the routes
|
||||||
// for that service
|
// for that service
|
||||||
if action == "delete" && len(routes) == 0 {
|
if action == register.EventDelete && len(routes) == 0 {
|
||||||
// delete the service entirely
|
// delete the service entirely
|
||||||
r.table.deleteService(service.Name, network)
|
r.table.deleteService(service.Name, service.Namespace)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// create the routes in the table
|
// create the routes in the table
|
||||||
for _, route := range routes {
|
for _, route := range routes {
|
||||||
if r.opts.Logger.V(logger.TraceLevel) {
|
if r.opts.Logger.V(logger.TraceLevel) {
|
||||||
r.opts.Logger.Tracef(r.opts.Context, "Creating route %v domain: %v", route, network)
|
r.opts.Logger.Trace(r.opts.Context, "Creating route %v namespace: %v", route, service.Namespace)
|
||||||
}
|
}
|
||||||
if err := r.manageRoute(route, action); err != nil {
|
if err := r.manageRoute(route, action); err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -171,23 +157,21 @@ func (r *rtr) manageRoutes(service *register.Service, action, network string) er
|
|||||||
// manageRegisterRoutes applies action to all routes of each service found in the register.
|
// manageRegisterRoutes applies action to all routes of each service found in the register.
|
||||||
// It returns error if either the services failed to be listed or the routing table action fails.
|
// It returns error if either the services failed to be listed or the routing table action fails.
|
||||||
func (r *rtr) loadRoutes(reg register.Register) error {
|
func (r *rtr) loadRoutes(reg register.Register) error {
|
||||||
services, err := reg.ListServices(r.opts.Context, register.ListDomain(register.WildcardDomain))
|
services, err := reg.ListServices(r.opts.Context, register.ListNamespace(register.WildcardNamespace))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed listing services: %v", err)
|
return fmt.Errorf("failed listing services: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// add each service node as a separate route
|
// add each service node as a separate route
|
||||||
for _, service := range services {
|
for _, service := range services {
|
||||||
// get the services domain from metadata. Fallback to wildcard.
|
|
||||||
domain := getDomain(service)
|
|
||||||
|
|
||||||
// create the routes
|
// create the routes
|
||||||
routes := r.createRoutes(service, domain)
|
routes := r.createRoutes(service)
|
||||||
|
|
||||||
// if the routes exist save them
|
// if the routes exist save them
|
||||||
if len(routes) > 0 {
|
if len(routes) > 0 {
|
||||||
if r.opts.Logger.V(logger.TraceLevel) {
|
if r.opts.Logger.V(logger.TraceLevel) {
|
||||||
r.opts.Logger.Tracef(r.opts.Context, "Creating routes for service %v domain: %v", service, domain)
|
r.opts.Logger.Trace(r.opts.Context, fmt.Sprintf("Creating routes for service %v", service))
|
||||||
}
|
}
|
||||||
for _, rt := range routes {
|
for _, rt := range routes {
|
||||||
err := r.table.Create(rt)
|
err := r.table.Create(rt)
|
||||||
@@ -199,7 +183,7 @@ func (r *rtr) loadRoutes(reg register.Register) error {
|
|||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if r.opts.Logger.V(logger.ErrorLevel) {
|
if r.opts.Logger.V(logger.ErrorLevel) {
|
||||||
r.opts.Logger.Errorf(r.opts.Context, "Error creating route for service %v in domain %v: %v", service, domain, err)
|
r.opts.Logger.Error(r.opts.Context, fmt.Sprintf("Error creating route for service %v: %v", service, err))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -209,21 +193,21 @@ func (r *rtr) loadRoutes(reg register.Register) error {
|
|||||||
// otherwise get all the service info
|
// otherwise get all the service info
|
||||||
|
|
||||||
// get the service to retrieve all its info
|
// get the service to retrieve all its info
|
||||||
srvs, err := reg.LookupService(r.opts.Context, service.Name, register.LookupDomain(domain))
|
srvs, err := reg.LookupService(r.opts.Context, service.Name, register.LookupNamespace(service.Namespace))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if r.opts.Logger.V(logger.TraceLevel) {
|
if r.opts.Logger.V(logger.TraceLevel) {
|
||||||
r.opts.Logger.Tracef(r.opts.Context, "Failed to get service %s domain: %s", service.Name, domain)
|
r.opts.Logger.Trace(r.opts.Context, fmt.Sprintf("Failed to get service %s", service.Name))
|
||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
// manage the routes for all returned services
|
// manage the routes for all returned services
|
||||||
for _, srv := range srvs {
|
for _, srv := range srvs {
|
||||||
routes := r.createRoutes(srv, domain)
|
routes := r.createRoutes(srv)
|
||||||
|
|
||||||
if len(routes) > 0 {
|
if len(routes) > 0 {
|
||||||
if r.opts.Logger.V(logger.TraceLevel) {
|
if r.opts.Logger.V(logger.TraceLevel) {
|
||||||
r.opts.Logger.Tracef(r.opts.Context, "Creating routes for service %v domain: %v", srv, domain)
|
r.opts.Logger.Trace(r.opts.Context, fmt.Sprintf("Creating routes for service %v", srv))
|
||||||
}
|
}
|
||||||
for _, rt := range routes {
|
for _, rt := range routes {
|
||||||
err := r.table.Create(rt)
|
err := r.table.Create(rt)
|
||||||
@@ -235,7 +219,7 @@ func (r *rtr) loadRoutes(reg register.Register) error {
|
|||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if r.opts.Logger.V(logger.ErrorLevel) {
|
if r.opts.Logger.V(logger.ErrorLevel) {
|
||||||
r.opts.Logger.Errorf(r.opts.Context, "Error creating route for service %v in domain %v: %v", service, domain, err)
|
r.opts.Logger.Error(r.opts.Context, fmt.Sprintf("Error creating route for service %v: %v", service, err))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -249,18 +233,18 @@ func (r *rtr) loadRoutes(reg register.Register) error {
|
|||||||
// lookup retrieves all the routes for a given service and creates them in the routing table
|
// lookup retrieves all the routes for a given service and creates them in the routing table
|
||||||
func (r *rtr) lookup(service string) ([]router.Route, error) {
|
func (r *rtr) lookup(service string) ([]router.Route, error) {
|
||||||
if r.opts.Logger.V(logger.TraceLevel) {
|
if r.opts.Logger.V(logger.TraceLevel) {
|
||||||
r.opts.Logger.Tracef(r.opts.Context, "Fetching route for %s domain: %v", service, register.WildcardDomain)
|
r.opts.Logger.Trace(r.opts.Context, fmt.Sprintf("Fetching route for %s domain: %v", service, register.WildcardNamespace))
|
||||||
}
|
}
|
||||||
|
|
||||||
services, err := r.opts.Register.LookupService(r.opts.Context, service, register.LookupDomain(register.WildcardDomain))
|
services, err := r.opts.Register.LookupService(r.opts.Context, service, register.LookupNamespace(register.WildcardNamespace))
|
||||||
if err == register.ErrNotFound {
|
if err == register.ErrNotFound {
|
||||||
if r.opts.Logger.V(logger.TraceLevel) {
|
if r.opts.Logger.V(logger.TraceLevel) {
|
||||||
r.opts.Logger.Tracef(r.opts.Context, "Failed to find route for %s", service)
|
r.opts.Logger.Trace(r.opts.Context, fmt.Sprintf("Failed to find route for %s", service))
|
||||||
}
|
}
|
||||||
return nil, router.ErrRouteNotFound
|
return nil, router.ErrRouteNotFound
|
||||||
} else if err != nil {
|
} else if err != nil {
|
||||||
if r.opts.Logger.V(logger.TraceLevel) {
|
if r.opts.Logger.V(logger.TraceLevel) {
|
||||||
r.opts.Logger.Tracef(r.opts.Context, "Failed to find route for %s: %v", service, err)
|
r.opts.Logger.Trace(r.opts.Context, fmt.Sprintf("Failed to find route for %s: %v", service, err))
|
||||||
}
|
}
|
||||||
return nil, fmt.Errorf("failed getting services: %v", err)
|
return nil, fmt.Errorf("failed getting services: %v", err)
|
||||||
}
|
}
|
||||||
@@ -268,10 +252,9 @@ func (r *rtr) lookup(service string) ([]router.Route, error) {
|
|||||||
var routes []router.Route
|
var routes []router.Route
|
||||||
|
|
||||||
for _, srv := range services {
|
for _, srv := range services {
|
||||||
domain := getDomain(srv)
|
|
||||||
// TODO: should we continue to send the event indicating we created a route?
|
// TODO: should we continue to send the event indicating we created a route?
|
||||||
// lookup is only called in the query path so probably not
|
// lookup is only called in the query path so probably not
|
||||||
routes = append(routes, r.createRoutes(srv, domain)...)
|
routes = append(routes, r.createRoutes(srv)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
return routes, nil
|
return routes, nil
|
||||||
@@ -308,24 +291,25 @@ func (r *rtr) watchRegister(w register.Watcher) error {
|
|||||||
}
|
}
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
if res == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
// don't process nil entries
|
// don't process nil entries
|
||||||
if res.Service == nil {
|
if res.Service == nil {
|
||||||
if logger.V(logger.TraceLevel) {
|
if r.opts.Logger.V(logger.TraceLevel) {
|
||||||
logger.Trace(r.opts.Context, "Received a nil service")
|
r.opts.Logger.Trace(r.opts.Context, "Received a nil service")
|
||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if r.opts.Logger.V(logger.TraceLevel) {
|
if r.opts.Logger.V(logger.TraceLevel) {
|
||||||
r.opts.Logger.Tracef(r.opts.Context, "Router dealing with next route %s %+v\n", res.Action, res.Service)
|
r.opts.Logger.Trace(r.opts.Context, fmt.Sprintf("Router dealing with next route %s %+v", res.Action, res.Service))
|
||||||
}
|
}
|
||||||
|
|
||||||
// get the services domain from metadata. Fallback to wildcard.
|
// get the services domain from metadata. Fallback to wildcard.
|
||||||
domain := getDomain(res.Service)
|
|
||||||
|
|
||||||
// create/update or delete the route
|
// create/update or delete the route
|
||||||
if err := r.manageRoutes(res.Service, res.Action, domain); err != nil {
|
if err := r.manageRoutes(res.Service, res.Action); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -383,7 +367,7 @@ func (r *rtr) start() error {
|
|||||||
case <-t1.C:
|
case <-t1.C:
|
||||||
if err := r.loadRoutes(r.opts.Register); err != nil {
|
if err := r.loadRoutes(r.opts.Register); err != nil {
|
||||||
if r.opts.Logger.V(logger.DebugLevel) {
|
if r.opts.Logger.V(logger.DebugLevel) {
|
||||||
r.opts.Logger.Debugf(r.opts.Context, "failed refreshing register routes: %s", err)
|
r.opts.Logger.Debug(r.opts.Context, fmt.Sprintf("failed refreshing register routes: %s", err))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -397,12 +381,12 @@ func (r *rtr) start() error {
|
|||||||
return
|
return
|
||||||
default:
|
default:
|
||||||
if r.opts.Logger.V(logger.TraceLevel) {
|
if r.opts.Logger.V(logger.TraceLevel) {
|
||||||
r.opts.Logger.Tracef(r.opts.Context, "Router starting register watch")
|
r.opts.Logger.Trace(r.opts.Context, "Router starting register watch")
|
||||||
}
|
}
|
||||||
w, err := r.opts.Register.Watch(r.opts.Context, register.WatchDomain(register.WildcardDomain))
|
w, err := r.opts.Register.Watch(r.opts.Context, register.WatchNamespace(register.WildcardNamespace))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if r.opts.Logger.V(logger.DebugLevel) {
|
if r.opts.Logger.V(logger.DebugLevel) {
|
||||||
r.opts.Logger.Debug(r.opts.Context, "failed creating register watcher: %v", err)
|
r.opts.Logger.Debug(r.opts.Context, fmt.Sprintf("failed creating register watcher: %v", err))
|
||||||
}
|
}
|
||||||
time.Sleep(time.Second)
|
time.Sleep(time.Second)
|
||||||
continue
|
continue
|
||||||
@@ -411,7 +395,7 @@ func (r *rtr) start() error {
|
|||||||
// watchRegister calls stop when it's done
|
// watchRegister calls stop when it's done
|
||||||
if err := r.watchRegister(w); err != nil {
|
if err := r.watchRegister(w); err != nil {
|
||||||
if r.opts.Logger.V(logger.DebugLevel) {
|
if r.opts.Logger.V(logger.DebugLevel) {
|
||||||
r.opts.Logger.Debugf(r.opts.Context, "Error watching the register: %v", err)
|
r.opts.Logger.Debug(r.opts.Context, fmt.Sprintf("Error watching the register: %v", err))
|
||||||
}
|
}
|
||||||
time.Sleep(time.Second)
|
time.Sleep(time.Second)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,28 +0,0 @@
|
|||||||
//go:build ignore
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
package register
|
|
||||||
|
|
||||||
import (
|
|
||||||
"os"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"go.unistack.org/micro/v3/register/memory"
|
|
||||||
"go.unistack.org/micro/v3/router"
|
|
||||||
)
|
|
||||||
|
|
||||||
func routerTestSetup() router.Router {
|
|
||||||
r := memory.NewRegister()
|
|
||||||
return NewRouter(router.Register(r))
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestRouterClose(t *testing.T) {
|
|
||||||
r := routerTestSetup()
|
|
||||||
|
|
||||||
if err := r.Close(); err != nil {
|
|
||||||
t.Errorf("failed to stop router: %v", err)
|
|
||||||
}
|
|
||||||
if len(os.Getenv("INTEGRATION_TESTS")) == 0 {
|
|
||||||
t.Logf("TestRouterStartStop STOPPED")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
13
table.go
13
table.go
@@ -1,12 +1,13 @@
|
|||||||
package register
|
package register
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"go.unistack.org/micro/v3/logger"
|
"go.unistack.org/micro/v4/logger"
|
||||||
"go.unistack.org/micro/v3/router"
|
"go.unistack.org/micro/v4/router"
|
||||||
"go.unistack.org/micro/v3/util/id"
|
"go.unistack.org/micro/v4/util/id"
|
||||||
)
|
)
|
||||||
|
|
||||||
// table is an in-memory routing table
|
// table is an in-memory routing table
|
||||||
@@ -132,7 +133,7 @@ func (t *table) Create(r router.Route) error {
|
|||||||
t.routes[service][sum] = &route{updated: time.Now(), route: r}
|
t.routes[service][sum] = &route{updated: time.Now(), route: r}
|
||||||
|
|
||||||
if t.opts.Logger.V(logger.DebugLevel) {
|
if t.opts.Logger.V(logger.DebugLevel) {
|
||||||
t.opts.Logger.Debugf(t.opts.Context, "Router emitting %s for route: %s", router.Create, r.Address)
|
t.opts.Logger.Debug(t.opts.Context, fmt.Sprintf("Router emitting %s for route: %s", router.Create, r.Address))
|
||||||
}
|
}
|
||||||
|
|
||||||
// send a route created event
|
// send a route created event
|
||||||
@@ -166,7 +167,7 @@ func (t *table) Delete(r router.Route) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if t.opts.Logger.V(logger.DebugLevel) {
|
if t.opts.Logger.V(logger.DebugLevel) {
|
||||||
t.opts.Logger.Debugf(t.opts.Context, "Router emitting %s for route: %s", router.Delete, r.Address)
|
t.opts.Logger.Debug(t.opts.Context, fmt.Sprintf("Router emitting %s for route: %s", router.Delete, r.Address))
|
||||||
}
|
}
|
||||||
go t.sendEvent(&router.Event{Type: router.Delete, Timestamp: time.Now(), Route: r})
|
go t.sendEvent(&router.Event{Type: router.Delete, Timestamp: time.Now(), Route: r})
|
||||||
|
|
||||||
@@ -191,7 +192,7 @@ func (t *table) Update(r router.Route) error {
|
|||||||
t.routes[service][sum] = &route{updated: time.Now(), route: r}
|
t.routes[service][sum] = &route{updated: time.Now(), route: r}
|
||||||
|
|
||||||
if t.opts.Logger.V(logger.DebugLevel) {
|
if t.opts.Logger.V(logger.DebugLevel) {
|
||||||
t.opts.Logger.Debugf(t.opts.Context, "Router emitting %s for route: %s", router.Update, r.Address)
|
t.opts.Logger.Debug(t.opts.Context, fmt.Sprintf("Router emitting %s for route: %s", router.Update, r.Address))
|
||||||
}
|
}
|
||||||
go t.sendEvent(&router.Event{Type: router.Update, Timestamp: time.Now(), Route: r})
|
go t.sendEvent(&router.Event{Type: router.Update, Timestamp: time.Now(), Route: r})
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
353
table_test.go
353
table_test.go
@@ -1,353 +0,0 @@
|
|||||||
//go:build ignore
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
package register
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"go.unistack.org/micro/v3/router"
|
|
||||||
)
|
|
||||||
|
|
||||||
func testSetup(t *testing.T) (*table, router.Route) {
|
|
||||||
r, err := NewRouter()
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
routr := r.(*rtr)
|
|
||||||
|
|
||||||
table := newTable(routr.lookup)
|
|
||||||
|
|
||||||
route := router.Route{
|
|
||||||
Service: "dest.svc",
|
|
||||||
Address: "dest.addr",
|
|
||||||
Gateway: "dest.gw",
|
|
||||||
Network: "dest.network",
|
|
||||||
Router: "src.router",
|
|
||||||
Link: "det.link",
|
|
||||||
Metric: 10,
|
|
||||||
}
|
|
||||||
|
|
||||||
return table, route
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestCreate(t *testing.T) {
|
|
||||||
table, route := testSetup(t)
|
|
||||||
|
|
||||||
if err := table.Create(route); err != nil {
|
|
||||||
t.Fatalf("error adding route: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// adds new route for the original destination
|
|
||||||
route.Gateway = "dest.gw2"
|
|
||||||
|
|
||||||
if err := table.Create(route); err != nil {
|
|
||||||
t.Fatalf("error adding route: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// adding the same route under Insert policy must error
|
|
||||||
if err := table.Create(route); err != router.ErrDuplicateRoute {
|
|
||||||
t.Fatalf("error adding route. Expected error: %s, found: %s", router.ErrDuplicateRoute, err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestDelete(t *testing.T) {
|
|
||||||
table, route := testSetup(t)
|
|
||||||
|
|
||||||
if err := table.Create(route); err != nil {
|
|
||||||
t.Fatalf("error adding route: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// should fail to delete non-existent route
|
|
||||||
prevSvc := route.Service
|
|
||||||
route.Service = "randDest"
|
|
||||||
|
|
||||||
if err := table.Delete(route); err != router.ErrRouteNotFound {
|
|
||||||
t.Fatalf("error deleting route. Expected: %s, found: %s", router.ErrRouteNotFound, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// we should be able to delete the existing route
|
|
||||||
route.Service = prevSvc
|
|
||||||
|
|
||||||
if err := table.Delete(route); err != nil {
|
|
||||||
t.Fatalf("error deleting route: %s", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestUpdate(t *testing.T) {
|
|
||||||
table, route := testSetup(t)
|
|
||||||
|
|
||||||
if err := table.Create(route); err != nil {
|
|
||||||
t.Fatalf("error adding route: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// change the metric of the original route
|
|
||||||
route.Metric = 200
|
|
||||||
|
|
||||||
if err := table.Update(route); err != nil {
|
|
||||||
t.Fatalf("error updating route: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// this should add a new route
|
|
||||||
route.Service = "rand.dest"
|
|
||||||
|
|
||||||
if err := table.Update(route); err != nil {
|
|
||||||
t.Fatalf("error updating route: %s", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestList(t *testing.T) {
|
|
||||||
table, route := testSetup(t)
|
|
||||||
|
|
||||||
svc := []string{"one.svc", "two.svc", "three.svc"}
|
|
||||||
|
|
||||||
for i := 0; i < len(svc); i++ {
|
|
||||||
route.Service = svc[i]
|
|
||||||
if err := table.Create(route); err != nil {
|
|
||||||
t.Fatalf("error adding route: %s", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
routes, err := table.List()
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("error listing routes: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(routes) != len(svc) {
|
|
||||||
t.Fatalf("incorrect number of routes listed. Expected: %d, found: %d", len(svc), len(routes))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestQuery(t *testing.T) {
|
|
||||||
table, route := testSetup(t)
|
|
||||||
|
|
||||||
svc := []string{"svc1", "svc2", "svc3", "svc1"}
|
|
||||||
net := []string{"net1", "net2", "net1", "net3"}
|
|
||||||
gw := []string{"gw1", "gw2", "gw3", "gw3"}
|
|
||||||
rtr := []string{"rtr1", "rt2", "rt3", "rtr3"}
|
|
||||||
|
|
||||||
for i := 0; i < len(svc); i++ {
|
|
||||||
route.Service = svc[i]
|
|
||||||
route.Network = net[i]
|
|
||||||
route.Gateway = gw[i]
|
|
||||||
route.Router = rtr[i]
|
|
||||||
route.Link = router.DefaultLink
|
|
||||||
|
|
||||||
if err := table.Create(route); err != nil {
|
|
||||||
t.Fatalf("error adding route: %s", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// return all routes
|
|
||||||
routes, err := table.Query()
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("error looking up routes: %s", err)
|
|
||||||
} else if len(routes) == 0 {
|
|
||||||
t.Fatalf("error looking up routes: not found")
|
|
||||||
}
|
|
||||||
|
|
||||||
// query routes particular network
|
|
||||||
network := "net1"
|
|
||||||
|
|
||||||
routes, err = table.Query(router.QueryNetwork(network))
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("error looking up routes: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(routes) != 2 {
|
|
||||||
t.Fatalf("incorrect number of routes returned. Expected: %d, found: %d", 2, len(routes))
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, route := range routes {
|
|
||||||
if route.Network != network {
|
|
||||||
t.Fatalf("incorrect route returned. Expected network: %s, found: %s", network, route.Network)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// query routes for particular gateway
|
|
||||||
gateway := "gw1"
|
|
||||||
|
|
||||||
routes, err = table.Query(router.QueryGateway(gateway))
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("error looking up routes: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(routes) != 1 {
|
|
||||||
t.Fatalf("incorrect number of routes returned. Expected: %d, found: %d", 1, len(routes))
|
|
||||||
}
|
|
||||||
|
|
||||||
if routes[0].Gateway != gateway {
|
|
||||||
t.Fatalf("incorrect route returned. Expected gateway: %s, found: %s", gateway, routes[0].Gateway)
|
|
||||||
}
|
|
||||||
|
|
||||||
// query routes for particular router
|
|
||||||
rt := "rtr1"
|
|
||||||
|
|
||||||
routes, err = table.Query(router.QueryRouter(rt))
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("error looking up routes: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(routes) != 1 {
|
|
||||||
t.Fatalf("incorrect number of routes returned. Expected: %d, found: %d", 1, len(routes))
|
|
||||||
}
|
|
||||||
|
|
||||||
if routes[0].Router != rt {
|
|
||||||
t.Fatalf("incorrect route returned. Expected router: %s, found: %s", rt, routes[0].Router)
|
|
||||||
}
|
|
||||||
|
|
||||||
// query particular gateway and network
|
|
||||||
query := []router.QueryOption{
|
|
||||||
router.QueryGateway(gateway),
|
|
||||||
router.QueryNetwork(network),
|
|
||||||
router.QueryRouter(rt),
|
|
||||||
}
|
|
||||||
|
|
||||||
routes, err = table.Query(query...)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("error looking up routes: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(routes) != 1 {
|
|
||||||
t.Fatalf("incorrect number of routes returned. Expected: %d, found: %d", 1, len(routes))
|
|
||||||
}
|
|
||||||
|
|
||||||
if routes[0].Gateway != gateway {
|
|
||||||
t.Fatalf("incorrect route returned. Expected gateway: %s, found: %s", gateway, routes[0].Gateway)
|
|
||||||
}
|
|
||||||
|
|
||||||
if routes[0].Network != network {
|
|
||||||
t.Fatalf("incorrect network returned. Expected network: %s, found: %s", network, routes[0].Network)
|
|
||||||
}
|
|
||||||
|
|
||||||
if routes[0].Router != rt {
|
|
||||||
t.Fatalf("incorrect route returned. Expected router: %s, found: %s", rt, routes[0].Router)
|
|
||||||
}
|
|
||||||
|
|
||||||
// non-existen route query
|
|
||||||
routes, err = table.Query(router.QueryService("foobar"))
|
|
||||||
if err != router.ErrRouteNotFound {
|
|
||||||
t.Fatalf("error looking up routes. Expected: %s, found: %s", router.ErrRouteNotFound, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(routes) != 0 {
|
|
||||||
t.Fatalf("incorrect number of routes returned. Expected: %d, found: %d", 0, len(routes))
|
|
||||||
}
|
|
||||||
|
|
||||||
// query NO routes
|
|
||||||
query = []router.QueryOption{
|
|
||||||
router.QueryGateway(gateway),
|
|
||||||
router.QueryNetwork(network),
|
|
||||||
router.QueryLink("network"),
|
|
||||||
}
|
|
||||||
|
|
||||||
routes, err = table.Query(query...)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("error looking up routes: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(routes) > 0 {
|
|
||||||
t.Fatalf("incorrect number of routes returned. Expected: %d, found: %d", 0, len(routes))
|
|
||||||
}
|
|
||||||
|
|
||||||
// insert local routes to query
|
|
||||||
for i := 0; i < 2; i++ {
|
|
||||||
route.Link = "foobar"
|
|
||||||
route.Address = fmt.Sprintf("local.route.address-%d", i)
|
|
||||||
if err := table.Create(route); err != nil {
|
|
||||||
t.Fatalf("error adding route: %s", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// query local routes
|
|
||||||
query = []router.QueryOption{
|
|
||||||
router.QueryGateway("*"),
|
|
||||||
router.QueryNetwork("*"),
|
|
||||||
router.QueryLink("foobar"),
|
|
||||||
}
|
|
||||||
|
|
||||||
routes, err = table.Query(query...)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("error looking up routes: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(routes) != 2 {
|
|
||||||
t.Fatalf("incorrect number of routes returned. Expected: %d, found: %d", 2, len(routes))
|
|
||||||
}
|
|
||||||
|
|
||||||
// add two different routes for svcX with different metric
|
|
||||||
for i := 0; i < 2; i++ {
|
|
||||||
route.Service = "svcX"
|
|
||||||
route.Address = fmt.Sprintf("svcX.route.address-%d", i)
|
|
||||||
route.Metric = int64(100 + i)
|
|
||||||
route.Link = router.DefaultLink
|
|
||||||
if err := table.Create(route); err != nil {
|
|
||||||
t.Fatalf("error adding route: %s", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
query = []router.QueryOption{
|
|
||||||
router.QueryService("svcX"),
|
|
||||||
}
|
|
||||||
|
|
||||||
routes, err = table.Query(query...)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("error looking up routes: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(routes) != 2 {
|
|
||||||
t.Fatalf("incorrect number of routes returned. Expected: %d, found: %d", 1, len(routes))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestFallback(t *testing.T) {
|
|
||||||
r := &rtr{
|
|
||||||
options: router.NewOptions(),
|
|
||||||
}
|
|
||||||
route := router.Route{
|
|
||||||
Service: "go.micro.service.foo",
|
|
||||||
Router: r.options.ID,
|
|
||||||
Link: router.DefaultLink,
|
|
||||||
Metric: router.DefaultLocalMetric,
|
|
||||||
}
|
|
||||||
r.table = newTable(func(s string) ([]router.Route, error) {
|
|
||||||
return []router.Route{route}, nil
|
|
||||||
})
|
|
||||||
r.start()
|
|
||||||
|
|
||||||
rts, err := r.Lookup(router.QueryService("go.micro.service.foo"))
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("error looking up service %s", err)
|
|
||||||
}
|
|
||||||
if len(rts) != 1 {
|
|
||||||
t.Fatalf("incorrect number of routes returned %d", len(rts))
|
|
||||||
}
|
|
||||||
|
|
||||||
// deleting from the table but the next query should invoke the fallback that we passed during new table creation
|
|
||||||
if err := r.table.Delete(route); err != nil {
|
|
||||||
t.Fatalf("error deleting route %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
rts, err = r.Lookup(router.QueryService("go.micro.service.foo"))
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("error looking up service %s", err)
|
|
||||||
}
|
|
||||||
if len(rts) != 1 {
|
|
||||||
t.Fatalf("incorrect number of routes returned %d", len(rts))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestFallbackError(t *testing.T) {
|
|
||||||
r := &rtr{
|
|
||||||
options: router.NewOptions(),
|
|
||||||
}
|
|
||||||
r.table = newTable(func(s string) ([]router.Route, error) {
|
|
||||||
return nil, fmt.Errorf("ERROR")
|
|
||||||
})
|
|
||||||
r.start()
|
|
||||||
_, err := r.Lookup(router.QueryService("go.micro.service.foo"))
|
|
||||||
if err == nil {
|
|
||||||
t.Fatalf("expected error looking up service but none returned")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -3,7 +3,7 @@ package register
|
|||||||
import (
|
import (
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"go.unistack.org/micro/v3/router"
|
"go.unistack.org/micro/v4/router"
|
||||||
)
|
)
|
||||||
|
|
||||||
// tableWatcher implements routing table Watcher
|
// tableWatcher implements routing table Watcher
|
||||||
|
|||||||
Reference in New Issue
Block a user