You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@apisix.apache.org by ba...@apache.org on 2023/03/23 09:20:22 UTC
[apisix-dashboard] branch release/3.0 updated: chore: backport commits to 3.0 (#2780)
This is an automated email from the ASF dual-hosted git repository.
baoyuan pushed a commit to branch release/3.0
in repository https://gitbox.apache.org/repos/asf/apisix-dashboard.git
The following commit(s) were added to refs/heads/release/3.0 by this push:
new 4cabd32e0 chore: backport commits to 3.0 (#2780)
4cabd32e0 is described below
commit 4cabd32e08c3a9b9b13d67531a720351baad3237
Author: Baoyuan <ba...@gmail.com>
AuthorDate: Thu Mar 23 17:20:15 2023 +0800
chore: backport commits to 3.0 (#2780)
* chore: update the year in the NOTICE (#2726)
fix: https://github.com/apache/apisix-dashboard/issues/2724
* fix plugins display in list of routes (#2704)
Co-authored-by: litesun <su...@apache.org>
* fix: plugin config page error (#2739)
* fix: plugin disable invalid in API /plugin?all=true (#2737)
* chore(deps): bump http-cache-semantics from 4.1.0 to 4.1.1 in /web (#2730)
* fix: update URL of the online playground (#2760)
* chore: update dependency (#2752)
* chore: update dependency
---------
Co-authored-by: rongxin <al...@apache.org>
* fix: remove route name length limit (#2759)
* fix: change regex template to optional in proxy write (#2762)
* fix: ssl table expiration time display (#2763)
* feat: add search functionality for id, host, and description fields (#2750)
Co-authored-by: Anil Durmus <an...@trendyol.com>
* fix: disable global plugin invalid (#2757)
* feat: support ipv6 in upstream nodes (#2766)
* fix: upstream nodes metadata miss (#2773)
* fix: remove ssl check in redirect https (#2770)
---------
Co-authored-by: Shivam0500 <12...@users.noreply.github.com>
Co-authored-by: incubator4 <ar...@gmail.com>
Co-authored-by: litesun <su...@apache.org>
Co-authored-by: Joanthan Chen <ms...@gmail.com>
Co-authored-by: dependabot[bot] <49...@users.noreply.github.com>
Co-authored-by: JunXu Chen <ch...@gmail.com>
Co-authored-by: Xin Rong <al...@gmail.com>
Co-authored-by: rongxin <al...@apache.org>
Co-authored-by: Anil Baki Durmus <an...@gmail.com>
Co-authored-by: Anil Durmus <an...@trendyol.com>
---
NOTICE | 2 +-
README.md | 2 +-
api/go.mod | 71 +++++++++++-
api/go.sum | 91 ++++++++++-----
api/internal/core/entity/entity.go | 6 +-
api/internal/core/entity/format.go | 28 +++--
api/internal/core/entity/format_test.go | 129 +++++++++++++++++++++
api/internal/handler/route/route.go | 17 +++
api/internal/handler/schema/plugin.go | 9 +-
api/internal/handler/service/service.go | 10 ++
api/internal/handler/upstream/upstream.go | 9 ++
api/test/e2e/route/route_test.go | 24 ++++
api/test/e2e/route/route_with_plugin_jwt_test.go | 7 ++
.../plugin/create-delete-in-drawer-plugin.cy.js | 47 ++++++++
.../route/create-edit-duplicate-delete-route.cy.js | 79 +++++++++++--
.../create-edit-route-with-redirect-plugin.cy.js | 40 +++++++
.../create-route-with-proxy-rewrite-plugin.cy.js | 28 ++++-
web/cypress/e2e/route/search-route.cy.js | 3 +
web/src/components/Plugin/PluginDetail.tsx | 4 +-
web/src/components/Plugin/PluginPage.tsx | 8 +-
web/src/components/Upstream/components/Nodes.tsx | 5 +-
web/src/components/Upstream/service.ts | 52 +++++++--
web/src/helpers.tsx | 8 +-
web/src/pages/Plugin/List.tsx | 2 +-
web/src/pages/Route/Create.tsx | 17 +--
web/src/pages/Route/List.tsx | 12 +-
.../pages/Route/components/Step1/ProxyRewrite.tsx | 9 +-
web/src/pages/Route/service.ts | 5 +-
web/src/pages/Route/typing.d.ts | 1 +
web/src/pages/SSL/typing.d.ts | 4 +-
web/src/pages/Service/List.tsx | 4 +-
web/src/pages/Service/service.ts | 2 +
web/src/pages/Upstream/List.tsx | 2 -
web/src/pages/Upstream/service.ts | 2 +
web/yarn.lock | 6 +-
35 files changed, 630 insertions(+), 115 deletions(-)
diff --git a/NOTICE b/NOTICE
index 13e98eb20..c663509f2 100644
--- a/NOTICE
+++ b/NOTICE
@@ -1,5 +1,5 @@
Apache APISIX
-Copyright 2019-2022 The Apache Software Foundation
+Copyright 2019-2023 The Apache Software Foundation
This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).
diff --git a/README.md b/README.md
index 87128b46e..e572a73bd 100644
--- a/README.md
+++ b/README.md
@@ -47,7 +47,7 @@ Note: Currently the Dashboard does not have complete coverage of Apache APISIX f
## Demo
-[Online Playground](http://20.210.250.99:9000/)
+[Online Playground](https://apisix-dashboard.apiseven.com/)
```text
Username: admin
diff --git a/api/go.mod b/api/go.mod
index 885f5d7ac..6bb8f3cbf 100644
--- a/api/go.mod
+++ b/api/go.mod
@@ -1,6 +1,6 @@
module github.com/apisix/manager-api
-go 1.16
+go 1.19
require (
github.com/coreos/go-oidc/v3 v3.3.0
@@ -8,7 +8,7 @@ require (
github.com/getkin/kin-openapi v0.33.0
github.com/gin-contrib/gzip v0.0.3
github.com/gin-contrib/static v0.0.0-20200916080430-d45d9a37d28e
- github.com/gin-gonic/gin v1.7.0
+ github.com/gin-gonic/gin v1.9.0
github.com/golang-jwt/jwt v3.2.2+incompatible
github.com/gorilla/sessions v1.2.1
github.com/juliangruber/go-intersect v1.1.0
@@ -19,13 +19,74 @@ require (
github.com/sony/sonyflake v1.0.0
github.com/spf13/cobra v1.6.1
github.com/spf13/viper v1.8.1
- github.com/stretchr/testify v1.8.0
- github.com/tidwall/gjson v1.6.7
+ github.com/stretchr/testify v1.8.2
+ github.com/tidwall/gjson v1.14.4
github.com/xeipuuv/gojsonschema v1.2.0
github.com/yuin/gopher-lua v0.0.0-20200816102855-ee81675732da
go.etcd.io/etcd/client/pkg/v3 v3.5.5
go.etcd.io/etcd/client/v3 v3.5.5
go.uber.org/zap v1.17.0
- golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f // indirect
golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094
)
+
+require (
+ github.com/bytedance/sonic v1.8.0 // indirect
+ github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect
+ github.com/coreos/go-semver v0.3.0 // indirect
+ github.com/coreos/go-systemd/v22 v22.3.2 // indirect
+ github.com/davecgh/go-spew v1.1.1 // indirect
+ github.com/fsnotify/fsnotify v1.4.9 // indirect
+ github.com/ghodss/yaml v1.0.0 // indirect
+ github.com/gin-contrib/sse v0.1.0 // indirect
+ github.com/go-openapi/jsonpointer v0.19.5 // indirect
+ github.com/go-openapi/swag v0.19.5 // indirect
+ github.com/go-playground/locales v0.14.1 // indirect
+ github.com/go-playground/universal-translator v0.18.1 // indirect
+ github.com/go-playground/validator/v10 v10.11.2 // indirect
+ github.com/goccy/go-json v0.10.0 // indirect
+ github.com/gogo/protobuf v1.3.2 // indirect
+ github.com/golang/protobuf v1.5.2 // indirect
+ github.com/gorilla/securecookie v1.1.1 // indirect
+ github.com/hashicorp/hcl v1.0.0 // indirect
+ github.com/inconshreveable/mousetrap v1.0.1 // indirect
+ github.com/json-iterator/go v1.1.12 // indirect
+ github.com/klauspost/cpuid/v2 v2.0.9 // indirect
+ github.com/leodido/go-urn v1.2.1 // indirect
+ github.com/magiconair/properties v1.8.5 // indirect
+ github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e // indirect
+ github.com/mattn/go-isatty v0.0.17 // indirect
+ github.com/mitchellh/mapstructure v1.4.1 // indirect
+ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
+ github.com/modern-go/reflect2 v1.0.2 // indirect
+ github.com/pelletier/go-toml v1.9.3 // indirect
+ github.com/pelletier/go-toml/v2 v2.0.6 // indirect
+ github.com/pmezard/go-difflib v1.0.0 // indirect
+ github.com/spf13/afero v1.6.0 // indirect
+ github.com/spf13/cast v1.3.1 // indirect
+ github.com/spf13/jwalterweatherman v1.1.0 // indirect
+ github.com/spf13/pflag v1.0.5 // indirect
+ github.com/stretchr/objx v0.5.0 // indirect
+ github.com/subosito/gotenv v1.2.0 // indirect
+ github.com/tidwall/match v1.1.1 // indirect
+ github.com/tidwall/pretty v1.2.0 // indirect
+ github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
+ github.com/ugorji/go/codec v1.2.9 // indirect
+ github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect
+ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
+ go.etcd.io/etcd/api/v3 v3.5.5 // indirect
+ go.uber.org/atomic v1.7.0 // indirect
+ go.uber.org/multierr v1.6.0 // indirect
+ golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect
+ golang.org/x/crypto v0.5.0 // indirect
+ golang.org/x/net v0.7.0 // indirect
+ golang.org/x/sys v0.5.0 // indirect
+ golang.org/x/text v0.7.0 // indirect
+ google.golang.org/appengine v1.6.7 // indirect
+ google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90 // indirect
+ google.golang.org/grpc v1.47.0 // indirect
+ google.golang.org/protobuf v1.28.1 // indirect
+ gopkg.in/ini.v1 v1.62.0 // indirect
+ gopkg.in/square/go-jose.v2 v2.6.0 // indirect
+ gopkg.in/yaml.v2 v2.4.0 // indirect
+ gopkg.in/yaml.v3 v3.0.1 // indirect
+)
diff --git a/api/go.sum b/api/go.sum
index 776477378..18ae650a7 100644
--- a/api/go.sum
+++ b/api/go.sum
@@ -74,9 +74,15 @@ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kB
github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM=
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY=
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4=
+github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=
+github.com/bytedance/sonic v1.8.0 h1:ea0Xadu+sHlu7x5O3gKhRpQ1IKiMrSiHttPF0ybECuA=
+github.com/bytedance/sonic v1.8.0/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=
+github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams=
+github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
@@ -131,8 +137,9 @@ github.com/gin-contrib/static v0.0.0-20200916080430-d45d9a37d28e h1:8bZpGwoPxkai
github.com/gin-contrib/static v0.0.0-20200916080430-d45d9a37d28e/go.mod h1:VhW/Ch/3FhimwZb8Oj+qJmdMmoB8r7lmJ5auRjm50oQ=
github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do=
github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M=
-github.com/gin-gonic/gin v1.7.0 h1:jGB9xAJQ12AIGNB4HguylppmDK1Am9ppF7XnGXXJuoU=
github.com/gin-gonic/gin v1.7.0/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY=
+github.com/gin-gonic/gin v1.9.0 h1:OjyFBKICoexlu99ctXNR2gg+c5pKrKMuyjgARg9qeY8=
+github.com/gin-gonic/gin v1.9.0/go.mod h1:W1Me9+hsUSyj3CePGrd1/QrKJMSJ1Tu/0hFEH89961k=
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
@@ -146,19 +153,24 @@ github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUe
github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY=
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
-github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A=
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
+github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM=
-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/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
+github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY=
-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/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
+github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI=
github.com/go-playground/validator/v10 v10.3.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI=
-github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE=
github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
+github.com/go-playground/validator/v10 v10.11.2 h1:q3SHpufmypg+erIExEKUmsgmhDTyhcJ38oeKGACXohU=
+github.com/go-playground/validator/v10 v10.11.2/go.mod h1:NieE624vt4SCTJtD87arVLvdmjPAeV8BQlHtMnw9D7s=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/goccy/go-json v0.10.0 h1:mXKd9Qw4NuzShiRlOXKews24ufknHO7gx30lsDyokKA=
+github.com/goccy/go-json v0.10.0/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
@@ -283,8 +295,9 @@ github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCV
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.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
-github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ=
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/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
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 h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
@@ -295,19 +308,22 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
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/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4=
+github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
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.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
-github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs=
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
+github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
-github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
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/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw=
-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/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w=
+github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
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=
@@ -316,8 +332,9 @@ github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ=
-github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
+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/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
@@ -333,13 +350,16 @@ github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJ
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 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
+github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
github.com/pelletier/go-toml v1.9.3 h1:zeC5b1GviRUyKYd6OJPvBU/mcVDVoL1OhT17FCt5dSQ=
github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
+github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU=
+github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
@@ -365,6 +385,7 @@ github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O
github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
@@ -399,8 +420,9 @@ github.com/spf13/viper v1.8.1 h1:Kq1fyeebqsBfbjZj4EL7gj2IO0mMaiyjYUWcUsl2O44=
github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
@@ -408,20 +430,24 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
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/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
-github.com/tidwall/gjson v1.6.7 h1:Mb1M9HZCRWEcXQ8ieJo7auYyyiSux6w9XN3AdTpxJrE=
-github.com/tidwall/gjson v1.6.7/go.mod h1:zeFuBCIqD4sN/gmqBzZ4j7Jd6UcA2Fc56x7QFsv+8fI=
-github.com/tidwall/match v1.0.3 h1:FQUVvBImDutD8wJLN6c5eMzWtjgONK9MwIBCOrUJKeE=
-github.com/tidwall/match v1.0.3/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
-github.com/tidwall/pretty v1.0.2 h1:Z7S3cePv9Jwm1KwS0513MRaoUe3S01WPbLNV40pwWZU=
-github.com/tidwall/pretty v1.0.2/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
-github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo=
+github.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=
+github.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
+github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
+github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
+github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=
+github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
+github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
+github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
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/ugorji/go/codec v1.2.9 h1:rmenucSohSTiyL09Y+l2OCk+FrMxGMzho2+tjr5ticU=
+github.com/ugorji/go/codec v1.2.9/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c=
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0=
@@ -458,6 +484,8 @@ go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
go.uber.org/zap v1.17.0 h1:MTjgFu6ZLKvY6Pvaqk97GlxNBuMpV4Hy/3P6tRGlI2U=
go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
+golang.org/x/arch v0.0.0-20210923205945-b76863e36670 h1:18EFjUmQOcUvxNYSkA6jO9VAiXCnxFY6NyDX0bHDmkU=
+golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
@@ -466,8 +494,8 @@ 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-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f h1:OeJjE6G4dgCY4PIXvIRQbE8+RX+uXZyGhUy/ksMGJoc=
-golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/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/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=
@@ -542,7 +570,6 @@ 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-20210503060351-7fd8e65b6420/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-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
@@ -550,8 +577,9 @@ golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su
golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
-golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b h1:ZmngSVLe/wycRns9MKikG9OWIEjGcGAkacif7oYQaUY=
golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
+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/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=
@@ -661,8 +689,10 @@ golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 h1:WIoqL4EROvwiPdUtaip4VcDdpZ4kha7wBWZrbVKCIZg=
golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/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/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/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -673,8 +703,9 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
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 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
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.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
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=
@@ -914,13 +945,14 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba
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.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
-google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
+google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE=
gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ=
@@ -949,6 +981,7 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt
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=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
+rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
diff --git a/api/internal/core/entity/entity.go b/api/internal/core/entity/entity.go
index f8fcc1c60..b8de0a9e0 100644
--- a/api/internal/core/entity/entity.go
+++ b/api/internal/core/entity/entity.go
@@ -65,8 +65,8 @@ type Route struct {
BaseInfo
URI string `json:"uri,omitempty"`
Uris []string `json:"uris,omitempty"`
- Name string `json:"name" validate:"max=50"`
- Desc string `json:"desc,omitempty" validate:"max=256"`
+ Name string `json:"name"`
+ Desc string `json:"desc,omitempty"`
Priority int `json:"priority,omitempty"`
Methods []string `json:"methods,omitempty"`
Host string `json:"host,omitempty"`
@@ -280,7 +280,7 @@ type ServerInfo struct {
// swagger:model GlobalPlugins
type PluginConfig struct {
BaseInfo
- Desc string `json:"desc,omitempty" validate:"max=256"`
+ Desc string `json:"desc,omitempty"`
Plugins map[string]interface{} `json:"plugins"`
Labels map[string]string `json:"labels,omitempty"`
}
diff --git a/api/internal/core/entity/format.go b/api/internal/core/entity/format.go
index c13bb6cb9..d7df2b13c 100644
--- a/api/internal/core/entity/format.go
+++ b/api/internal/core/entity/format.go
@@ -18,6 +18,7 @@ package entity
import (
"errors"
+ "net"
"strconv"
"strings"
@@ -25,15 +26,21 @@ import (
)
func mapKV2Node(key string, val float64) (*Node, error) {
- hp := strings.Split(key, ":")
- host := hp[0]
- // according to APISIX upstream nodes policy, port is optional
- port := "0"
+ host, port, err := net.SplitHostPort(key)
- if len(hp) > 2 {
- return nil, errors.New("invalid upstream node")
- } else if len(hp) == 2 {
- port = hp[1]
+ // ipv6 address
+ if strings.Count(host, ":") >= 2 {
+ host = "[" + host + "]"
+ }
+
+ if err != nil {
+ if strings.Contains(err.Error(), "missing port in address") {
+ // according to APISIX upstream nodes policy, port is optional
+ host = key
+ port = "0"
+ } else {
+ return nil, errors.New("invalid upstream node")
+ }
}
portInt, err := strconv.Atoi(port)
@@ -92,6 +99,11 @@ func NodesFormat(obj interface{}) interface{} {
if _, ok := val["priority"]; ok {
node.Priority = int(val["priority"].(float64))
}
+
+ if _, ok := val["metadata"]; ok {
+ node.Metadata = val["metadata"].(map[string]interface{})
+ }
+
nodes = append(nodes, node)
}
return nodes
diff --git a/api/internal/core/entity/format_test.go b/api/internal/core/entity/format_test.go
index 109aa384e..ef1254204 100644
--- a/api/internal/core/entity/format_test.go
+++ b/api/internal/core/entity/format_test.go
@@ -56,6 +56,39 @@ func TestNodesFormat(t *testing.T) {
assert.Contains(t, jsonStr, `"priority":10`)
}
+func TestNodesFormat_ipv6(t *testing.T) {
+ // route data saved in ETCD
+ routeStr := `{
+ "uris": ["/*"],
+ "upstream": {
+ "type": "roundrobin",
+ "nodes": [{
+ "host": "::1",
+ "port": 80,
+ "weight": 0,
+ "priority":10
+ }]
+ }
+ }`
+
+ // bind struct
+ var route Route
+ err := json.Unmarshal([]byte(routeStr), &route)
+ assert.Nil(t, err)
+
+ // nodes format
+ nodes := NodesFormat(route.Upstream.Nodes)
+
+ // json encode for client
+ res, err := json.Marshal(nodes)
+ assert.Nil(t, err)
+ jsonStr := string(res)
+ assert.Contains(t, jsonStr, `"weight":0`)
+ assert.Contains(t, jsonStr, `"port":80`)
+ assert.Contains(t, jsonStr, `"host":"::1"`)
+ assert.Contains(t, jsonStr, `"priority":10`)
+}
+
func TestNodesFormat_struct(t *testing.T) {
// route data saved in ETCD
var route Route
@@ -77,6 +110,27 @@ func TestNodesFormat_struct(t *testing.T) {
assert.Contains(t, jsonStr, `"host":"127.0.0.1"`)
}
+func TestNodesFormat_struct_ipv6(t *testing.T) {
+ // route data saved in ETCD
+ var route Route
+ route.Uris = []string{"/*"}
+ route.Upstream = &UpstreamDef{}
+ route.Upstream.Type = "roundrobin"
+ var nodes = []*Node{{Host: "::1", Port: 80, Weight: 0}}
+ route.Upstream.Nodes = nodes
+
+ // nodes format
+ formattedNodes := NodesFormat(route.Upstream.Nodes)
+
+ // json encode for client
+ res, err := json.Marshal(formattedNodes)
+ assert.Nil(t, err)
+ jsonStr := string(res)
+ assert.Contains(t, jsonStr, `"weight":0`)
+ assert.Contains(t, jsonStr, `"port":80`)
+ assert.Contains(t, jsonStr, `"host":"::1"`)
+}
+
func TestNodesFormat_Map(t *testing.T) {
// route data saved in ETCD
routeStr := `{
@@ -104,6 +158,33 @@ func TestNodesFormat_Map(t *testing.T) {
assert.Contains(t, jsonStr, `"host":"127.0.0.1"`)
}
+func TestNodesFormat_Map_ipv6(t *testing.T) {
+ // route data saved in ETCD
+ routeStr := `{
+ "uris": ["/*"],
+ "upstream": {
+ "type": "roundrobin",
+ "nodes": {"[::1]:8080": 0}
+ }
+ }`
+
+ // bind struct
+ var route Route
+ err := json.Unmarshal([]byte(routeStr), &route)
+ assert.Nil(t, err)
+
+ // nodes format
+ nodes := NodesFormat(route.Upstream.Nodes)
+
+ // json encode for client
+ res, err := json.Marshal(nodes)
+ assert.Nil(t, err)
+ jsonStr := string(res)
+ assert.Contains(t, jsonStr, `"weight":0`)
+ assert.Contains(t, jsonStr, `"port":8080`)
+ assert.Contains(t, jsonStr, `"host":"[::1]"`)
+}
+
func TestNodesFormat_empty_struct(t *testing.T) {
// route data saved in ETCD
routeStr := `{
@@ -277,6 +358,17 @@ func TestMapKV2Node(t *testing.T) {
Weight: 0,
},
},
+ {
+ name: "address with ipv6",
+ key: "[::1]:443",
+ value: 100,
+ wantErr: false,
+ wantRes: &Node{
+ Host: "[::1]",
+ Port: 443,
+ Weight: 100,
+ },
+ },
}
for _, tc := range testCases {
@@ -293,3 +385,40 @@ func TestMapKV2Node(t *testing.T) {
})
}
}
+
+func TestNodesFormatWithMetadata(t *testing.T) {
+ // route data saved in ETCD
+ routeStr := `{
+ "uris": ["/*"],
+ "upstream": {
+ "type": "roundrobin",
+ "nodes": [{
+ "host": "127.0.0.1",
+ "port": 80,
+ "weight": 0,
+ "priority":10,
+ "metadata": {
+ "name": "test"
+ }
+ }]
+ }
+ }`
+
+ // bind struct
+ var route Route
+ err := json.Unmarshal([]byte(routeStr), &route)
+ assert.Nil(t, err)
+
+ // nodes format
+ nodes := NodesFormat(route.Upstream.Nodes)
+
+ // json encode for client
+ res, err := json.Marshal(nodes)
+ assert.Nil(t, err)
+ jsonStr := string(res)
+ assert.Contains(t, jsonStr, `"weight":0`)
+ assert.Contains(t, jsonStr, `"port":80`)
+ assert.Contains(t, jsonStr, `"host":"127.0.0.1"`)
+ assert.Contains(t, jsonStr, `"priority":10`)
+ assert.Contains(t, jsonStr, `"metadata":{"name":"test"}`)
+}
diff --git a/api/internal/handler/route/route.go b/api/internal/handler/route/route.go
index fae4429d9..d100c85b4 100644
--- a/api/internal/handler/route/route.go
+++ b/api/internal/handler/route/route.go
@@ -194,6 +194,9 @@ type ListInput struct {
URI string `auto_read:"uri,query"`
Label string `auto_read:"label,query"`
Status string `auto_read:"status,query"`
+ Host string `auto_read:"host,query"`
+ ID string `auto_read:"id,query"`
+ Desc string `auto_read:"desc,query"`
store.Pagination
}
@@ -236,6 +239,20 @@ func (h *Handler) List(c droplet.Context) (interface{}, error) {
return false
}
+ if input.Host != "" && !strings.Contains(obj.(*entity.Route).Host, input.Host) {
+ return false
+ }
+
+ if input.Desc != "" && !strings.Contains(obj.(*entity.Route).Desc, input.Desc) {
+ return false
+ }
+
+ if obj != nil && obj.(*entity.Route) != nil && obj.(*entity.Route).ID != nil && input.ID != "" {
+ if !strings.Contains(utils.InterfaceToString(obj.(*entity.Route).ID), input.ID) {
+ return false // IDs do not match, so object should not be included in the filtered result
+ }
+ }
+
return true
},
Format: func(obj interface{}) interface{} {
diff --git a/api/internal/handler/schema/plugin.go b/api/internal/handler/schema/plugin.go
index d282640c9..4585f56d0 100644
--- a/api/internal/handler/schema/plugin.go
+++ b/api/internal/handler/schema/plugin.go
@@ -51,8 +51,11 @@ func (h *Handler) Plugins(c droplet.Context) (interface{}, error) {
if input.All {
var res []map[string]interface{}
list := plugins.Value().(map[string]interface{})
- for name, conf := range list {
- plugin := conf.(map[string]interface{})
+ for name, schemaConfig := range list {
+ if enable, ok := conf.Plugins[name]; !ok || !enable {
+ continue
+ }
+ plugin := schemaConfig.(map[string]interface{})
plugin["name"] = name
if _, ok := plugin["type"]; !ok {
plugin["type"] = "other"
@@ -65,7 +68,7 @@ func (h *Handler) Plugins(c droplet.Context) (interface{}, error) {
var ret []string
list := plugins.Map()
for pluginName := range list {
- if res, ok := conf.Plugins[pluginName]; !ok || !res {
+ if enable, ok := conf.Plugins[pluginName]; !ok || !enable {
continue
}
diff --git a/api/internal/handler/service/service.go b/api/internal/handler/service/service.go
index fe382b068..ab94bfd80 100644
--- a/api/internal/handler/service/service.go
+++ b/api/internal/handler/service/service.go
@@ -90,6 +90,8 @@ func (h *Handler) Get(c droplet.Context) (interface{}, error) {
type ListInput struct {
Name string `auto_read:"name,query"`
+ ID string `auto_read:"id,query"`
+ Desc string `auto_read:"desc,query"`
store.Pagination
}
@@ -135,6 +137,14 @@ func (h *Handler) List(c droplet.Context) (interface{}, error) {
if input.Name != "" {
return strings.Contains(obj.(*entity.Service).Name, input.Name)
}
+
+ if input.Desc != "" {
+ return strings.Contains(obj.(*entity.Service).Desc, input.Desc)
+ }
+
+ if input.ID != "" {
+ return strings.Contains(utils.InterfaceToString(obj.(*entity.Service).ID), input.ID)
+ }
return true
},
Format: func(obj interface{}) interface{} {
diff --git a/api/internal/handler/upstream/upstream.go b/api/internal/handler/upstream/upstream.go
index 3157fdda8..55c08a50b 100644
--- a/api/internal/handler/upstream/upstream.go
+++ b/api/internal/handler/upstream/upstream.go
@@ -96,6 +96,8 @@ func (h *Handler) Get(c droplet.Context) (interface{}, error) {
type ListInput struct {
Name string `auto_read:"name,query"`
+ ID string `auto_read:"id,query"`
+ Desc string `auto_read:"desc,query"`
store.Pagination
}
@@ -141,6 +143,13 @@ func (h *Handler) List(c droplet.Context) (interface{}, error) {
if input.Name != "" {
return strings.Contains(obj.(*entity.Upstream).Name, input.Name)
}
+
+ if input.Desc != "" {
+ return strings.Contains(obj.(*entity.Upstream).Desc, input.Desc)
+ }
+ if input.ID != "" {
+ return strings.Contains(utils.InterfaceToString(obj.(*entity.Upstream).ID), input.ID)
+ }
return true
},
Format: func(obj interface{}) interface{} {
diff --git a/api/test/e2e/route/route_test.go b/api/test/e2e/route/route_test.go
index d73cf949e..099c27925 100644
--- a/api/test/e2e/route/route_test.go
+++ b/api/test/e2e/route/route_test.go
@@ -63,6 +63,23 @@ var _ = Describe("Route", func() {
Headers: map[string]string{"Authorization": base.GetToken()},
ExpectStatus: http.StatusOK,
}),
+ Entry("create long name route3 success", base.HttpTestCase{
+ Object: base.ManagerApiExpect(),
+ Method: http.MethodPut,
+ Path: "/apisix/admin/routes/r3",
+ Body: `{
+ "name": "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",
+ "uri": "/hello_",
+ "upstream": {
+ "nodes": {
+ "` + base.UpstreamIp + `:1980": 1
+ },
+ "type": "roundrobin"
+ }
+ }`,
+ Headers: map[string]string{"Authorization": base.GetToken()},
+ ExpectStatus: http.StatusOK,
+ }),
Entry("create route failed, name existed", base.HttpTestCase{
Object: base.ManagerApiExpect(),
Method: http.MethodPost,
@@ -146,6 +163,13 @@ var _ = Describe("Route", func() {
Headers: map[string]string{"Authorization": base.GetToken()},
ExpectStatus: http.StatusOK,
}),
+ Entry("delete route3", base.HttpTestCase{
+ Object: base.ManagerApiExpect(),
+ Method: http.MethodDelete,
+ Path: "/apisix/admin/routes/r3",
+ Headers: map[string]string{"Authorization": base.GetToken()},
+ ExpectStatus: http.StatusOK,
+ }),
Entry("hit route1 that just deleted", base.HttpTestCase{
Object: base.APISIXExpect(),
Method: http.MethodGet,
diff --git a/api/test/e2e/route/route_with_plugin_jwt_test.go b/api/test/e2e/route/route_with_plugin_jwt_test.go
index 72509d961..c1694a4fe 100644
--- a/api/test/e2e/route/route_with_plugin_jwt_test.go
+++ b/api/test/e2e/route/route_with_plugin_jwt_test.go
@@ -311,6 +311,13 @@ var _ = Describe("route with jwt plugin", func() {
Headers: map[string]string{"Authorization": base.GetToken()},
ExpectStatus: http.StatusOK,
}),
+ Entry("delete the route", base.HttpTestCase{
+ Object: base.ManagerApiExpect(),
+ Method: http.MethodDelete,
+ Path: "/apisix/admin/routes/jwt-sign",
+ Headers: map[string]string{"Authorization": base.GetToken()},
+ ExpectStatus: http.StatusOK,
+ }),
Entry("verify the deleted route", base.HttpTestCase{
Object: base.APISIXExpect(),
Method: http.MethodGet,
diff --git a/web/cypress/e2e/plugin/create-delete-in-drawer-plugin.cy.js b/web/cypress/e2e/plugin/create-delete-in-drawer-plugin.cy.js
index f66560098..8053503c2 100644
--- a/web/cypress/e2e/plugin/create-delete-in-drawer-plugin.cy.js
+++ b/web/cypress/e2e/plugin/create-delete-in-drawer-plugin.cy.js
@@ -225,6 +225,53 @@ context('Delete Plugin List with the Drawer', () => {
cy.get(selector.empty).should('be.visible');
});
+ it('should disabled global plugin normally', () => {
+ cy.visit('/plugin/list');
+ cy.get(selector.refresh).click();
+ cy.contains('button', 'Enable').click();
+ cy.contains(data.basicAuthPlugin)
+ .parents(selector.pluginCardBordered)
+ .within(() => {
+ cy.get('button').click({
+ force: true,
+ });
+ });
+ cy.get(selector.drawer)
+ .should('be.visible')
+ .within(() => {
+ cy.get('#disable').should('have.attr', 'aria-checked', 'false');
+ cy.get(selector.disabledSwitcher).click();
+ cy.get(selector.checkedSwitcher).should('exist');
+ });
+ cy.contains('button', 'Submit').click({ force: true });
+ cy.wait(timeout);
+ cy.visit('/plugin/list');
+ cy.contains(data.basicAuthPlugin).siblings().contains('Configure').click();
+ cy.get(selector.drawer)
+ .should('be.visible')
+ .within(() => {
+ cy.get('#disable').should('have.attr', 'aria-checked', 'true');
+ cy.get(selector.disabledSwitcher).click();
+ });
+ cy.contains('button', 'Submit').click({ force: true });
+ cy.get(selector.drawer).should('not.exist');
+ cy.contains(data.basicAuthPlugin).should('be.visible');
+ cy.contains(data.basicAuthPlugin).siblings().contains('Configure').click();
+ cy.get(selector.drawer)
+ .should('be.visible')
+ .within(() => {
+ cy.get('#disable').should('have.attr', 'aria-checked', 'false');
+ });
+
+ cy.contains('button', 'Cancel').click({
+ force: true,
+ });
+ cy.contains(data.basicAuthPlugin).siblings().contains('Delete').click();
+ cy.contains('button', 'Confirm').click({
+ force: true,
+ });
+ });
+
it('should be deleted one of the plugins instead of all', function () {
cy.visit('/plugin/list');
cy.get(selector.refresh).click();
diff --git a/web/cypress/e2e/route/create-edit-duplicate-delete-route.cy.js b/web/cypress/e2e/route/create-edit-duplicate-delete-route.cy.js
index ba33c3171..62e2a5e00 100755
--- a/web/cypress/e2e/route/create-edit-duplicate-delete-route.cy.js
+++ b/web/cypress/e2e/route/create-edit-duplicate-delete-route.cy.js
@@ -36,6 +36,7 @@ context('Create and Delete Route', () => {
operator: '#operator',
value: '#value',
nodes_0_host: '#submitNodes_0_host',
+ nodes_1_host: '#submitNodes_1_host',
nodes_0_port: '#submitNodes_0_port',
nodes_0_weight: '#submitNodes_0_weight',
pluginCardBordered: '.ant-card-bordered',
@@ -52,6 +53,7 @@ context('Create and Delete Route', () => {
notificationCloseIcon: '.ant-notification-close-icon',
notification: '.ant-notification-notice-message',
addHost: '[data-cy=addHost]',
+ addNode: '[data-cy=add-node]',
schemaErrorMessage: '.ant-form-item-explain.ant-form-item-explain-error',
stepCheck: '.ant-steps-finish-icon',
advancedMatchingTable: '.ant-table-row.ant-table-row-level-0',
@@ -66,6 +68,8 @@ context('Create and Delete Route', () => {
host3: '10.10.10.10',
host4: '@',
host5: '*1',
+ host_ipv6: '2001:0db8:85a3:0000:0000:8a2e:0370:7334',
+ host_ipv6_2: '::1',
port: '80',
weight: 1,
basicAuthPlugin: 'basic-auth',
@@ -74,12 +78,7 @@ context('Create and Delete Route', () => {
deleteRouteSuccess: 'Delete Route Successfully',
};
- const opreatorList = [
- 'Equal(==)',
- 'Case insensitive regular match(~*)',
- 'HAS',
- 'Reverse the result(!)',
- ];
+ const opreatorList = ['Equal(==)', 'Case insensitive regular match(~*)', 'HAS'];
before(() => {
cy.clearLocalStorageSnapshot();
@@ -92,7 +91,7 @@ context('Create and Delete Route', () => {
cy.visit('/');
});
- it.only('should not create route with name above 100 characters', function () {
+ it('should not create route with name above 100 characters', function () {
cy.visit('/');
cy.contains('Route').click();
cy.get(selector.empty).should('be.visible');
@@ -325,4 +324,70 @@ context('Create and Delete Route', () => {
cy.get(selector.notificationCloseIcon).click();
});
});
+
+ it('should create route with ipv6 upstream node', () => {
+ cy.visit('/');
+ cy.contains('Route').click();
+ cy.get(selector.empty).should('be.visible');
+ cy.contains('Create').click();
+
+ // step 1
+ cy.get(selector.name).type(name);
+ cy.get(selector.description).type(data.description);
+ cy.contains('Next').click();
+
+ // step2
+ cy.get(selector.nodes_0_host).type(data.host_ipv6);
+ cy.get(selector.nodes_0_port).type(80);
+ cy.get(selector.addNode).click();
+ cy.get(selector.nodes_1_host).type(data.host_ipv6_2);
+ cy.contains('Next').click();
+ cy.contains('Next').click();
+ cy.contains('button', 'Submit').click();
+ cy.contains(data.submitSuccess);
+ cy.contains('Goto List').click();
+ cy.url().should('contains', 'routes/list');
+
+ cy.get(selector.nameSelector).type(name);
+ cy.contains('Search').click();
+ cy.contains(name).siblings().contains('Configure').click();
+ cy.get('#status').should('have.class', 'ant-switch-checked');
+
+ cy.contains('Next').click();
+ cy.get(selector.nodes_0_host).should('have.value', data.host_ipv6);
+ cy.get(selector.nodes_0_port).should('have.value', 80);
+ cy.get(selector.nodes_1_host).should('have.value', data.host_ipv6_2);
+
+ cy.contains('Next').click();
+ cy.contains('Next').click();
+ cy.contains('Submit').click();
+ cy.contains(data.submitSuccess);
+ cy.contains('Goto List').click();
+ cy.url().should('contains', 'routes/list');
+ cy.contains(name).siblings().contains('More').click();
+ cy.contains('View').click();
+ cy.get(selector.drawer).should('be.visible');
+
+ cy.get(selector.monacoScroll).within(() => {
+ cy.contains(name).should('exist');
+ cy.contains(`[${data.host_ipv6}]`).should('exist');
+ cy.contains(`[${data.host_ipv6_2}]`).should('exist');
+ });
+
+ cy.visit('/routes/list');
+ cy.get(selector.name).clear().type(name);
+ cy.contains('Search').click();
+ cy.contains(name).siblings().contains('More').click();
+ cy.contains('Delete').click();
+ cy.get(selector.deleteAlert)
+ .should('be.visible')
+ .within(() => {
+ cy.contains('OK').click();
+ });
+ cy.get(selector.deleteAlert).within(() => {
+ cy.get('.ant-btn-loading-icon').should('be.visible');
+ });
+ cy.get(selector.notification).should('contain', data.deleteRouteSuccess);
+ cy.get(selector.notificationCloseIcon).click();
+ });
});
diff --git a/web/cypress/e2e/route/create-edit-route-with-redirect-plugin.cy.js b/web/cypress/e2e/route/create-edit-route-with-redirect-plugin.cy.js
index f3f779c7d..05bae93b1 100644
--- a/web/cypress/e2e/route/create-edit-route-with-redirect-plugin.cy.js
+++ b/web/cypress/e2e/route/create-edit-route-with-redirect-plugin.cy.js
@@ -26,6 +26,7 @@ context('Create Edit and Delete Route with redirect plugin', () => {
name: '#name',
redirect: '[data-cy=route-redirect]',
customRedirectSelectOpt: '#redirectOption_list_1',
+ httpsRedirectSelectOpt: '#redirectOption_list_2',
customRedirectUrI: '#redirectURI',
customRedirectCode: '[data-cy=redirect_code]',
customRedirectLabel: "[title='Custom Redirect']",
@@ -34,10 +35,13 @@ context('Create Edit and Delete Route with redirect plugin', () => {
notification: '.ant-notification-notice-message',
webSocketSelector: '[title=WebSocket]',
enable_websocket_button: '#enable_websocket',
+ hosts_0: '#hosts_0',
+ nodes_0_host: '#submitNodes_0_host',
};
const data = {
customRedirectUrI: '/test',
+ host1: 'test.com',
submitSuccess: 'Submit Successfully',
deleteRouteSuccess: 'Delete Route Successfully',
step2Title: 'Define API Backend Server',
@@ -130,4 +134,40 @@ context('Create Edit and Delete Route with redirect plugin', () => {
cy.get(selector.notification).should('contain', data.deleteRouteSuccess);
cy.get(selector.notificationCloseIcon).click({ multiple: true });
});
+
+ it('should enable https redirect without ssl', () => {
+ cy.visit('/');
+ cy.contains('Route').click();
+ cy.wait(timeout * 2);
+ cy.get(selector.empty).should('be.visible');
+ cy.contains('Create').click();
+ cy.wait(timeout * 2);
+ cy.contains('Next').click();
+ cy.contains('Next').click();
+ cy.get(selector.name).type(name);
+ cy.get(selector.redirect).click();
+ cy.contains('Enable HTTPS').click({ force: true });
+
+ cy.get(selector.hosts_0).type(data.host1);
+ cy.contains('Next').click();
+ cy.get(selector.nodes_0_host).type(data.host1);
+ cy.contains('Next').click();
+ cy.contains('Next').click();
+ cy.contains('Submit').click();
+ cy.contains(data.submitSuccess);
+ cy.contains('Goto List').click();
+ cy.url().should('contains', 'routes/list');
+
+ cy.get(selector.name).focus().clear().type(name);
+ cy.contains('Search').click();
+ cy.contains(name).siblings().contains('More').click();
+ cy.contains('Delete').click();
+ cy.get(selector.deleteAlert)
+ .should('be.visible')
+ .within(() => {
+ cy.contains('OK').click();
+ });
+ cy.get(selector.notification).should('contain', data.deleteRouteSuccess);
+ cy.get(selector.notificationCloseIcon).click({ multiple: true });
+ });
});
diff --git a/web/cypress/e2e/route/create-route-with-proxy-rewrite-plugin.cy.js b/web/cypress/e2e/route/create-route-with-proxy-rewrite-plugin.cy.js
index 721d317c3..4086a4bcc 100644
--- a/web/cypress/e2e/route/create-route-with-proxy-rewrite-plugin.cy.js
+++ b/web/cypress/e2e/route/create-route-with-proxy-rewrite-plugin.cy.js
@@ -15,8 +15,8 @@
* limitations under the License.
*/
/* eslint-disable no-undef */
-import menuLocaleUS from '../../../src/locales/en-US/menu';
import componentLocaleUS from '../../../src/locales/en-US/component';
+import menuLocaleUS from '../../../src/locales/en-US/menu';
import routeLocaleUS from '../../../src/pages/Route/locales/en-US';
context('create route with proxy-rewrite plugin', () => {
@@ -29,6 +29,7 @@ context('create route with proxy-rewrite plugin', () => {
deleteAlert: '.ant-modal-body',
notification: '.ant-notification-notice-message',
staticUri: '[data-cy=uri-static]',
+ regexUri: '[data-cy=uri-regex]',
staticHost: '[data-cy=host-static]',
keepHost: '[data-cy=host-keep]',
newUri: '#proxyRewrite_uri',
@@ -56,6 +57,7 @@ context('create route with proxy-rewrite plugin', () => {
rewriteHeaderKey2: 'test2',
rewriteHeaderValue1: '1',
rewriteHeaderValue2: '2',
+ regex: '^/iresty/(.)/(.)/(.*)',
};
beforeEach(() => {
@@ -154,6 +156,30 @@ context('create route with proxy-rewrite plugin', () => {
cy.contains(data.submitSuccess).should('be.visible');
});
+ it('should use proxy rewrite in regex uri moode without template', () => {
+ cy.visit('/');
+ cy.contains(menuLocaleUS['menu.routes']).click();
+
+ cy.get(selector.nameSelector).type(data.routeName);
+ cy.contains('Search').click();
+ cy.contains(data.routeName).siblings().contains('Configure').click();
+
+ cy.get('#status').should('have.class', 'ant-switch-checked');
+ cy.get(selector.regexUri).click();
+ cy.get(selector.uriRewriteReg).should('be.visible').type(data.regex);
+ cy.get(selector.uriRewriteTemp).should('have.value', '');
+ cy.contains('Next').click();
+ cy.get(selector.nodes_0_host).type(data.host2);
+ cy.get(selector.nodes_0_port).type(data.port);
+ cy.get(selector.nodes_0_weight).type(data.weight);
+ cy.contains('Next').click();
+
+ cy.contains('proxy-rewrite').should('not.exist');
+ cy.contains('Next').click();
+ cy.contains('Submit').click();
+ cy.contains(data.submitSuccess).should('be.visible');
+ });
+
it('should delete the route', function () {
cy.visit('/routes/list');
cy.get(selector.nameSelector).type(data.routeName);
diff --git a/web/cypress/e2e/route/search-route.cy.js b/web/cypress/e2e/route/search-route.cy.js
index d947d977a..622881437 100644
--- a/web/cypress/e2e/route/search-route.cy.js
+++ b/web/cypress/e2e/route/search-route.cy.js
@@ -148,6 +148,8 @@ context('Create and Search Route', () => {
cy.contains('Route').click();
cy.wait(timeout);
// full match
+ // expand search
+ cy.get(selector.expandSearch).click();
cy.get(selector.pathSearchInput).type(data.uris1);
cy.contains('Search').click();
cy.contains(data.uris1).should('contain', data.uris1);
@@ -197,6 +199,7 @@ context('Create and Search Route', () => {
force: true,
multiple: true,
});
+ cy.wait(timeout);
}
});
});
diff --git a/web/src/components/Plugin/PluginDetail.tsx b/web/src/components/Plugin/PluginDetail.tsx
index 69c7a268f..5963fb3c8 100644
--- a/web/src/components/Plugin/PluginDetail.tsx
+++ b/web/src/components/Plugin/PluginDetail.tsx
@@ -181,7 +181,7 @@ const PluginDetail: React.FC<Props> = ({
useEffect(() => {
form.setFieldsValue({
- disable: isEnabled ? true : initialData[name] && !initialData[name]._meta.disable,
+ disable: isEnabled ? true : initialData[name] && !initialData[name]?._meta?.disable,
scope: 'global',
});
if (PLUGIN_UI_LIST.includes(name)) {
@@ -416,7 +416,7 @@ const PluginDetail: React.FC<Props> = ({
>
<Switch
defaultChecked={
- isEnabled ? true : initialData[name] && !initialData[name]._meta.disable
+ isEnabled ? true : initialData[name] && !initialData[name]?._meta?.disable
}
disabled={readonly || isEnabled}
/>
diff --git a/web/src/components/Plugin/PluginPage.tsx b/web/src/components/Plugin/PluginPage.tsx
index 5c843f3c3..aa6c9ad58 100644
--- a/web/src/components/Plugin/PluginPage.tsx
+++ b/web/src/components/Plugin/PluginPage.tsx
@@ -101,7 +101,7 @@ const PluginPage: React.FC<Props> = ({
useEffect(() => {
const openPluginList = pluginList.filter(
- (item) => initialData[item.name] && !initialData[item.name]._meta.disable,
+ (item) => initialData[item.name] && !initialData[item.name]?._meta?.disable,
);
setPlugins(initialData);
setEnablePluginsList(openPluginList);
@@ -244,16 +244,16 @@ const PluginPage: React.FC<Props> = ({
actions={[
<Button
type={
- initialData[item.name] && !initialData[item.name]._meta.disable
+ initialData[item.name] && !initialData[item.name]?._meta?.disable
? 'primary'
: 'default'
}
- danger={initialData[item.name] && !initialData[item.name]._meta.disable}
+ danger={initialData[item.name] && !initialData[item.name]?._meta?.disable}
onClick={() => {
setName(item.name);
}}
>
- {initialData[item.name] && !initialData[item.name]._meta.disable
+ {initialData[item.name] && !initialData[item.name]?._meta?.disable
? formatMessage({ id: 'component.plugin.disable' })
: formatMessage({ id: 'component.plugin.enable' })}
</Button>,
diff --git a/web/src/components/Upstream/components/Nodes.tsx b/web/src/components/Upstream/components/Nodes.tsx
index 40122545d..63d09e9f1 100644
--- a/web/src/components/Upstream/components/Nodes.tsx
+++ b/web/src/components/Upstream/components/Nodes.tsx
@@ -54,7 +54,8 @@ const Component: React.FC<Props> = ({ readonly }) => {
}),
},
{
- pattern: new RegExp(/^\*?[0-9a-zA-Z-._]+$/, 'g'),
+ // eslint-disable-next-line no-useless-escape
+ pattern: new RegExp(/^\*?[0-9a-zA-Z-._\[\]:]+$/),
message: formatMessage({
id: 'page.route.form.itemRulesPatternMessage.domain',
}),
@@ -115,7 +116,7 @@ const Component: React.FC<Props> = ({ readonly }) => {
</Form.Item>
{!readonly && (
<Form.Item wrapperCol={{ offset: 3 }}>
- <Button type="dashed" onClick={add}>
+ <Button type="dashed" onClick={add} data-cy="add-node">
<PlusOutlined />
{formatMessage({ id: 'component.global.add' })}
</Button>
diff --git a/web/src/components/Upstream/service.ts b/web/src/components/Upstream/service.ts
index c7587d7dd..acb5f88f8 100644
--- a/web/src/components/Upstream/service.ts
+++ b/web/src/components/Upstream/service.ts
@@ -18,6 +18,10 @@ import { notification } from 'antd';
import { cloneDeep, isNil, omit, omitBy } from 'lodash';
import { formatMessage, request } from 'umi';
+const ipv6RegexExp = new RegExp(
+ /(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1} [...]
+);
+
/**
* Because we have some `custom` field in Upstream Form, like custom.tls/custom.checks.active etc,
* we need to transform data that doesn't have `custom` field to data contains `custom` field
@@ -58,13 +62,32 @@ export const convertToFormData = (originData: UpstreamComponent.ResponseData) =>
// nodes have two types
// https://github.com/apache/apisix-dashboard/issues/2080
if (data.nodes instanceof Array) {
- data.submitNodes = data.nodes;
+ data.submitNodes = data.nodes.map((key) => {
+ if (key.host.indexOf(']') !== -1) {
+ // handle ipv6 address
+ return {
+ ...key,
+ host: key.host.match(/\[(.*?)\]/)?.[1] || '',
+ };
+ }
+ return key;
+ });
} else if (data.nodes) {
- data.submitNodes = Object.keys(data.nodes as Object).map((key) => ({
- host: key.split(':')[0],
- port: key.split(':')[1],
- weight: (data.nodes as Object)[key],
- }));
+ data.submitNodes = Object.keys(data.nodes as Object).map((key) => {
+ if (key.indexOf(']') !== -1) {
+ // handle ipv6 address
+ return {
+ host: key.match(/\[(.*?)\]/)?.[1] || '',
+ port: key.split(']:')[1],
+ weight: (data.nodes as Object)[key],
+ };
+ }
+ return {
+ host: key.split(':')[0],
+ port: key.split(':')[1],
+ weight: (data.nodes as Object)[key],
+ };
+ });
}
if (data.discovery_type && data.service_name) {
@@ -135,10 +158,19 @@ export const convertToRequestData = (
data.nodes = {};
submitNodes?.forEach((item) => {
const port = item.port ? `:${item.port}` : '';
- data.nodes = {
- ...data.nodes,
- [`${item.host}${port}`]: item.weight as number,
- };
+ if (ipv6RegexExp.test(item.host as string)) {
+ // ipv6 host need add [] on host
+ // like [::1]:80
+ data.nodes = {
+ ...data.nodes,
+ [`[${item.host}]${port}`]: item.weight as number,
+ };
+ } else {
+ data.nodes = {
+ ...data.nodes,
+ [`${item.host}${port}`]: item.weight as number,
+ };
+ }
});
return omit(data, ['upstream_type', 'submitNodes']);
}
diff --git a/web/src/helpers.tsx b/web/src/helpers.tsx
index 0ee105032..bc9f5af3c 100644
--- a/web/src/helpers.tsx
+++ b/web/src/helpers.tsx
@@ -18,6 +18,7 @@ import { FileTextOutlined, InfoCircleOutlined } from '@ant-design/icons';
import type { MenuDataItem } from '@ant-design/pro-layout';
import { notification } from 'antd';
import yaml from 'js-yaml';
+import { isNumber } from 'lodash';
import moment from 'moment';
import React from 'react';
import { history } from 'umi';
@@ -128,12 +129,11 @@ export const getUrlQuery: (key: string) => string | false = (key: string) => {
};
export const timestampToLocaleString = (timestamp: number) => {
- if (!timestamp) {
- // TODO: i18n
- return 'None';
+ if (isNumber(timestamp)) {
+ return moment.unix(timestamp).format('YYYY-MM-DD HH:mm:ss');
}
- return moment.unix(timestamp).format('YYYY-MM-DD HH:mm:ss');
+ return 'None';
};
/**
diff --git a/web/src/pages/Plugin/List.tsx b/web/src/pages/Plugin/List.tsx
index f0434e455..7071d30c0 100644
--- a/web/src/pages/Plugin/List.tsx
+++ b/web/src/pages/Plugin/List.tsx
@@ -124,7 +124,7 @@ const Page: React.FC = () => {
const disable = !formData.disable;
let plugins = {
...initialData,
- [name]: { ...monacoData, disable },
+ [name]: { ...monacoData, _meta: { disable } },
};
if (shouldDelete === true) {
plugins = omit(plugins, name);
diff --git a/web/src/pages/Route/Create.tsx b/web/src/pages/Route/Create.tsx
index d0240bf6a..71fcb6a59 100644
--- a/web/src/pages/Route/Create.tsx
+++ b/web/src/pages/Route/Create.tsx
@@ -31,7 +31,7 @@ import Step2 from './components/Step2';
import Step3 from './components/Step3';
import { DEFAULT_STEP_1_DATA, DEFAULT_STEP_3_DATA } from './constants';
import styles from './Create.less';
-import { checkHostWithSSL, checkUniqueName, create, fetchItem, update } from './service';
+import { checkUniqueName, create, fetchItem, update } from './service';
import { transformProxyRewrite2Plugin } from './transform';
const { Step } = Steps;
@@ -260,17 +260,10 @@ const Page: React.FC<Props> = (props) => {
if (nextStep === 2) {
if (step === 1) {
form1.validateFields().then((value) => {
- const { redirectOption, hosts } = value;
- const filterHosts = hosts.filter(Boolean);
- Promise.all([
- redirectOption === 'forceHttps' && filterHosts.length !== 0
- ? checkHostWithSSL(hosts)
- : Promise.resolve(),
- checkUniqueName(
- value.name,
- props.route.path.indexOf('edit') > 0 ? (props as any).match.params.rid : '',
- ),
- ]).then(() => {
+ checkUniqueName(
+ value.name,
+ props.route.path.indexOf('edit') > 0 ? (props as any).match.params.rid : '',
+ ).then(() => {
setStep(nextStep);
});
});
diff --git a/web/src/pages/Route/List.tsx b/web/src/pages/Route/List.tsx
index 63de96ed3..7ff4d7de2 100755
--- a/web/src/pages/Route/List.tsx
+++ b/web/src/pages/Route/List.tsx
@@ -322,13 +322,12 @@ const Page: React.FC = () => {
},
{
title: formatMessage({ id: 'component.global.id' }),
- hideInSearch: true,
dataIndex: 'id',
width: 200,
},
{
title: formatMessage({ id: 'page.route.host' }),
- hideInSearch: true,
+ dataIndex: 'host',
width: 224,
render: (_, record) => {
const list = record.hosts || (record.host && [record.host]) || [];
@@ -361,13 +360,13 @@ const Page: React.FC = () => {
{
title: formatMessage({ id: 'component.global.description' }),
dataIndex: 'desc',
- hideInSearch: true,
ellipsis: true,
width: 200,
},
{
title: formatMessage({ id: 'component.global.labels' }),
dataIndex: 'labels',
+ width: 240,
render: (_, record) => {
return Object.keys(record.labels || {})
.filter((item) => item !== 'API_VERSION')
@@ -550,6 +549,13 @@ const Page: React.FC = () => {
{
title: formatMessage({ id: 'menu.plugin' }),
dataIndex: 'plugins',
+ width: 240,
+ render: (_, record) => {
+ const plugins = record.plugins || {};
+ return Object.keys(plugins).length > 0
+ ? Object.keys(plugins).map((key) => <Tag key={key}>{key}</Tag>)
+ : '-';
+ },
},
];
diff --git a/web/src/pages/Route/components/Step1/ProxyRewrite.tsx b/web/src/pages/Route/components/Step1/ProxyRewrite.tsx
index 7770ab213..cbe873841 100644
--- a/web/src/pages/Route/components/Step1/ProxyRewrite.tsx
+++ b/web/src/pages/Route/components/Step1/ProxyRewrite.tsx
@@ -100,14 +100,6 @@ const ProxyRewrite: React.FC<RouteModule.Step1PassProps> = ({ form, disabled })
label={formatMessage({ id: 'page.route.form.itemLabel.template' })}
name={field.name}
key={field.name}
- rules={[
- {
- required: true,
- message: `${formatMessage({
- id: 'component.global.pleaseEnter',
- })} ${formatMessage({ id: 'page.route.form.itemLabel.template' })}`,
- },
- ]}
>
<Input
placeholder={`${formatMessage({
@@ -206,6 +198,7 @@ const ProxyRewrite: React.FC<RouteModule.Step1PassProps> = ({ form, disabled })
{
value: URI_REWRITE_TYPE.REGEXP,
label: formatMessage({ id: 'page.route.radio.regex' }),
+ dataCypress: 'uri-regex',
},
];
diff --git a/web/src/pages/Route/service.ts b/web/src/pages/Route/service.ts
index dbd182a50..794db9159 100644
--- a/web/src/pages/Route/service.ts
+++ b/web/src/pages/Route/service.ts
@@ -41,7 +41,7 @@ export const fetchItem = (rid: number) =>
request(`/routes/${rid}`).then((data) => transformRouteData(data.data));
export const fetchList = ({ current = 1, pageSize = 10, ...res }) => {
- const { labels = [], API_VERSION = [], status } = res;
+ const { labels = [], API_VERSION = [], host = "", id = "", desc = "", status} = res;
return request<Res<ResListData<RouteModule.ResponseBody>>>('/routes', {
params: {
@@ -51,6 +51,9 @@ export const fetchList = ({ current = 1, pageSize = 10, ...res }) => {
page: current,
page_size: pageSize,
status,
+ host,
+ desc,
+ id,
},
}).then(({ data }) => {
return {
diff --git a/web/src/pages/Route/typing.d.ts b/web/src/pages/Route/typing.d.ts
index 64c4bb723..234fc9feb 100644
--- a/web/src/pages/Route/typing.d.ts
+++ b/web/src/pages/Route/typing.d.ts
@@ -214,6 +214,7 @@ declare namespace RouteModule {
create_time: number;
update_time: number;
status: number;
+ plugins: Record<string, any>;
};
type RouteStatus = 0 | 1;
diff --git a/web/src/pages/SSL/typing.d.ts b/web/src/pages/SSL/typing.d.ts
index 985e3051a..3c9281cc4 100644
--- a/web/src/pages/SSL/typing.d.ts
+++ b/web/src/pages/SSL/typing.d.ts
@@ -52,7 +52,7 @@ declare namespace SSLModule {
snis: string[];
status: number;
update_time: number;
- validity_start: number;
- validity_end: number;
+ validity_start?: number;
+ validity_end?: number;
};
}
diff --git a/web/src/pages/Service/List.tsx b/web/src/pages/Service/List.tsx
index c509a95b6..05feb47aa 100644
--- a/web/src/pages/Service/List.tsx
+++ b/web/src/pages/Service/List.tsx
@@ -42,9 +42,8 @@ const Page: React.FC = () => {
const columns: ProColumns<ServiceModule.ResponseBody>[] = [
{
- title: 'ID',
+ title: formatMessage({ id: 'component.global.id' }),
dataIndex: 'id',
- hideInSearch: true,
},
{
title: formatMessage({ id: 'component.global.name' }),
@@ -53,7 +52,6 @@ const Page: React.FC = () => {
{
title: formatMessage({ id: 'component.global.description' }),
dataIndex: 'desc',
- hideInSearch: true,
},
{
title: formatMessage({ id: 'component.global.operation' }),
diff --git a/web/src/pages/Service/service.ts b/web/src/pages/Service/service.ts
index b65233560..def2860b3 100644
--- a/web/src/pages/Service/service.ts
+++ b/web/src/pages/Service/service.ts
@@ -21,6 +21,8 @@ import { transformData } from './transform';
export const fetchList = ({ current = 1, pageSize = 10, ...res }) =>
request('/services', {
params: {
+ id: res.id || '',
+ desc: res.desc || '',
name: res.name,
page: current,
page_size: pageSize,
diff --git a/web/src/pages/Upstream/List.tsx b/web/src/pages/Upstream/List.tsx
index c593b1eab..5c31749d6 100644
--- a/web/src/pages/Upstream/List.tsx
+++ b/web/src/pages/Upstream/List.tsx
@@ -45,7 +45,6 @@ const Page: React.FC = () => {
{
title: formatMessage({ id: 'page.upstream.list.id' }),
dataIndex: 'id',
- hideInSearch: true,
},
{
title: formatMessage({ id: 'page.upstream.list.name' }),
@@ -59,7 +58,6 @@ const Page: React.FC = () => {
{
title: formatMessage({ id: 'page.upstream.list.description' }),
dataIndex: 'desc',
- hideInSearch: true,
},
{
title: formatMessage({ id: 'page.upstream.list.edit.time' }),
diff --git a/web/src/pages/Upstream/service.ts b/web/src/pages/Upstream/service.ts
index a04925fdc..a4d5ffefb 100644
--- a/web/src/pages/Upstream/service.ts
+++ b/web/src/pages/Upstream/service.ts
@@ -21,6 +21,8 @@ import { convertToFormData } from '@/components/Upstream/service';
export const fetchList = ({ current = 1, pageSize = 10, ...res }) => {
return request<Res<ResListData<UpstreamModule.RequestBody>>>('/upstreams', {
params: {
+ id: res.id || '',
+ desc: res.desc || '',
name: res.name,
page: current,
page_size: pageSize,
diff --git a/web/yarn.lock b/web/yarn.lock
index fe721ab68..4417ceb83 100644
--- a/web/yarn.lock
+++ b/web/yarn.lock
@@ -8802,9 +8802,9 @@ htmlparser2@^7.0.0:
entities "^3.0.1"
http-cache-semantics@^4.0.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390"
- integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a"
+ integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==
http-deceiver@^1.2.7:
version "1.2.7"