You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@apisix.apache.org by sp...@apache.org on 2022/08/10 07:37:15 UTC

[apisix] branch master updated: change: update list URIs for V3 feature (#7622)

This is an automated email from the ASF dual-hosted git repository.

spacewander pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix.git


The following commit(s) were added to refs/heads/master by this push:
     new ccc43ea32 change: update list URIs for V3 feature (#7622)
ccc43ea32 is described below

commit ccc43ea329edcc60f950307d91c7440c58bfcb3f
Author: tzssangglass <tz...@gmail.com>
AuthorDate: Wed Aug 10 15:37:08 2022 +0800

    change: update list URIs for V3 feature (#7622)
---
 apisix/admin/init.lua                    |  2 -
 apisix/admin/proto.lua                   |  8 +--
 apisix/admin/ssl.lua                     | 10 ++--
 apisix/constants.lua                     |  6 +--
 apisix/plugins/grpc-transcode/proto.lua  |  2 +-
 apisix/ssl/router/radixtree_sni.lua      |  4 +-
 apisix/upstream.lua                      |  2 +-
 docs/en/latest/admin-api.md              | 12 ++---
 docs/en/latest/certificate.md            |  2 +-
 docs/en/latest/mtls.md                   |  2 +-
 docs/en/latest/plugins/grpc-transcode.md |  6 +--
 docs/zh/latest/admin-api.md              | 12 ++---
 docs/zh/latest/certificate.md            |  2 +-
 docs/zh/latest/mtls.md                   |  2 +-
 docs/zh/latest/plugins/grpc-transcode.md |  6 +--
 t/admin/proto.t                          | 10 ++--
 t/admin/ssl.t                            | 84 ++++++++++++++++----------------
 t/admin/ssl2.t                           | 36 +++++++-------
 t/admin/ssl3.t                           |  4 +-
 t/admin/ssls.t                           |  4 +-
 t/admin/upstream.t                       |  2 +-
 t/cli/test_etcd.sh                       |  4 +-
 t/config-center-yaml/ssl.t               |  6 +--
 t/node/client-mtls-openresty.t           |  2 +-
 t/node/client-mtls.t                     |  6 +--
 t/node/grpc-proxy-unary.t                |  2 +-
 t/node/upstream-mtls.t                   |  6 +--
 t/node/upstream-websocket.t              |  2 +-
 t/plugin/grpc-transcode.t                | 14 +++---
 t/plugin/grpc-transcode2.t               | 12 ++---
 t/plugin/grpc-transcode3.t               |  2 +-
 t/plugin/redirect.t                      |  2 +-
 t/router/multi-ssl-certs.t               | 18 +++----
 t/router/radixtree-sni.t                 | 30 ++++++------
 t/router/radixtree-sni2.t                | 16 +++---
 t/stream-node/mtls.t                     |  2 +-
 t/stream-node/sni.t                      |  2 +-
 t/stream-node/tls.t                      |  2 +-
 t/stream-node/upstream-tls.t             |  2 +-
 utils/create-ssl.py                      |  2 +-
 40 files changed, 174 insertions(+), 176 deletions(-)

diff --git a/apisix/admin/init.lua b/apisix/admin/init.lua
index 0e7f8f399..fbbfd2d57 100644
--- a/apisix/admin/init.lua
+++ b/apisix/admin/init.lua
@@ -47,10 +47,8 @@ local resources = {
     upstreams       = require("apisix.admin.upstreams"),
     consumers       = require("apisix.admin.consumers"),
     schema          = require("apisix.admin.schema"),
-    ssl             = require("apisix.admin.ssl"),
     ssls            = require("apisix.admin.ssl"),
     plugins         = require("apisix.admin.plugins"),
-    proto           = require("apisix.admin.proto"),
     protos          = require("apisix.admin.proto"),
     global_rules    = require("apisix.admin.global_rules"),
     stream_routes   = require("apisix.admin.stream_routes"),
diff --git a/apisix/admin/proto.lua b/apisix/admin/proto.lua
index abe161f07..e10079565 100644
--- a/apisix/admin/proto.lua
+++ b/apisix/admin/proto.lua
@@ -70,7 +70,7 @@ function _M.put(id, conf)
         return 400, err
     end
 
-    local key = "/proto/" .. id
+    local key = "/protos/" .. id
 
     local ok, err = utils.inject_conf_with_prev_conf("proto", key, conf)
     if not ok then
@@ -88,7 +88,7 @@ end
 
 
 function _M.get(id)
-    local key = "/proto"
+    local key = "/protos"
     if id then
         key = key .. "/" .. id
     end
@@ -111,7 +111,7 @@ function _M.post(id, conf)
         return 400, err
     end
 
-    local key = "/proto"
+    local key = "/protos"
     utils.inject_timestamp(conf)
     local res, err = core.etcd.push(key, conf)
     if not res then
@@ -183,7 +183,7 @@ function _M.delete(id)
     end
     core.log.info("proto delete service ref check pass: ", id)
 
-    local key = "/proto/" .. id
+    local key = "/protos/" .. id
     -- core.log.info("key: ", key)
     local res, err = core.etcd.delete(key)
     if not res then
diff --git a/apisix/admin/ssl.lua b/apisix/admin/ssl.lua
index 70d868dc9..54d74e961 100644
--- a/apisix/admin/ssl.lua
+++ b/apisix/admin/ssl.lua
@@ -73,7 +73,7 @@ function _M.put(id, conf)
         end
     end
 
-    local key = "/ssl/" .. id
+    local key = "/ssls/" .. id
 
     local ok, err = utils.inject_conf_with_prev_conf("ssl", key, conf)
     if not ok then
@@ -91,7 +91,7 @@ end
 
 
 function _M.get(id)
-    local key = "/ssl"
+    local key = "/ssls"
     if id then
         key = key .. "/" .. id
     end
@@ -128,7 +128,7 @@ function _M.post(id, conf)
         end
     end
 
-    local key = "/ssl"
+    local key = "/ssls"
     utils.inject_timestamp(conf)
     local res, err = core.etcd.push(key, conf)
     if not res then
@@ -145,7 +145,7 @@ function _M.delete(id)
         return 400, {error_msg = "missing ssl id"}
     end
 
-    local key = "/ssl/" .. id
+    local key = "/ssls/" .. id
     -- core.log.info("key: ", key)
     local res, err = core.etcd.delete(key)
     if not res then
@@ -170,7 +170,7 @@ function _M.patch(id, conf, sub_path)
         return 400, {error_msg = "invalid configuration"}
     end
 
-    local key = "/ssl"
+    local key = "/ssls"
     if id then
         key = key .. "/" .. id
     end
diff --git a/apisix/constants.lua b/apisix/constants.lua
index cf04e890c..1c82ec3d4 100644
--- a/apisix/constants.lua
+++ b/apisix/constants.lua
@@ -23,20 +23,20 @@ return {
     HTTP_ETCD_DIRECTORY = {
         ["/upstreams"] = true,
         ["/plugins"] = true,
-        ["/ssl"] = true,
+        ["/ssls"] = true,
         ["/stream_routes"] = true,
         ["/plugin_metadata"] = true,
         ["/routes"] = true,
         ["/services"] = true,
         ["/consumers"] = true,
         ["/global_rules"] = true,
-        ["/proto"] = true,
+        ["/protos"] = true,
         ["/plugin_configs"] = true,
     },
     STREAM_ETCD_DIRECTORY = {
         ["/upstreams"] = true,
         ["/plugins"] = true,
-        ["/ssl"] = true,
+        ["/ssls"] = true,
         ["/stream_routes"] = true,
         ["/plugin_metadata"] = true,
     },
diff --git a/apisix/plugins/grpc-transcode/proto.lua b/apisix/plugins/grpc-transcode/proto.lua
index c30c17e71..c2a3cb523 100644
--- a/apisix/plugins/grpc-transcode/proto.lua
+++ b/apisix/plugins/grpc-transcode/proto.lua
@@ -159,7 +159,7 @@ end
 
 function _M.init()
     local err
-    protos, err = core.config.new("/proto", {
+    protos, err = core.config.new("/protos", {
         automatic = true,
         item_schema = core.schema.proto
     })
diff --git a/apisix/ssl/router/radixtree_sni.lua b/apisix/ssl/router/radixtree_sni.lua
index 891d8d21d..28648f8c9 100644
--- a/apisix/ssl/router/radixtree_sni.lua
+++ b/apisix/ssl/router/radixtree_sni.lua
@@ -247,7 +247,7 @@ end
 
 function _M.init_worker()
     local err
-    ssl_certificates, err = core.config.new("/ssl", {
+    ssl_certificates, err = core.config.new("/ssls", {
         automatic = true,
         item_schema = core.schema.ssl,
         checker = function (item, schema_type)
@@ -264,7 +264,7 @@ end
 
 function _M.get_by_id(ssl_id)
     local ssl
-    local ssls = core.config.fetch_created_obj("/ssl")
+    local ssls = core.config.fetch_created_obj("/ssls")
     if ssls then
         ssl = ssls:get(tostring(ssl_id))
     end
diff --git a/apisix/upstream.lua b/apisix/upstream.lua
index 465098975..a2a0cd3e8 100644
--- a/apisix/upstream.lua
+++ b/apisix/upstream.lua
@@ -429,7 +429,7 @@ local function check_upstream_conf(in_dp, conf)
 
         local ssl_id = conf.tls and conf.tls.client_cert_id
         if ssl_id then
-            local key = "/ssl/" .. ssl_id
+            local key = "/ssls/" .. ssl_id
             local res, err = core.etcd.get(key)
             if not res then
                 return nil, "failed to fetch ssl info by "
diff --git a/docs/en/latest/admin-api.md b/docs/en/latest/admin-api.md
index cb551cd15..2b695b1a1 100644
--- a/docs/en/latest/admin-api.md
+++ b/docs/en/latest/admin-api.md
@@ -766,17 +766,17 @@ Currently, the response is returned from etcd.
 
 ## SSL
 
-**API**:/apisix/admin/ssl/{id}
+**API**:/apisix/admin/ssls/{id}
 
 ### Request Methods
 
 | Method | Request URI            | Request Body | Description                                     |
 | ------ | ---------------------- | ------------ | ----------------------------------------------- |
-| GET    | /apisix/admin/ssl      | NULL         | Fetches a list of all configured SSL resources. |
-| GET    | /apisix/admin/ssl/{id} | NULL         | Fetch specified resource by id.                 |
-| PUT    | /apisix/admin/ssl/{id} | {...}        | Creates a resource with the specified id.           |
-| POST   | /apisix/admin/ssl      | {...}        | Creates a resource and assigns a random id.           |
-| DELETE | /apisix/admin/ssl/{id} | NULL         | Removes the resource with the specified id.     |
+| GET    | /apisix/admin/ssls      | NULL         | Fetches a list of all configured SSL resources. |
+| GET    | /apisix/admin/ssls/{id} | NULL         | Fetch specified resource by id.                 |
+| PUT    | /apisix/admin/ssls/{id} | {...}        | Creates a resource with the specified id.           |
+| POST   | /apisix/admin/ssls      | {...}        | Creates a resource and assigns a random id.           |
+| DELETE | /apisix/admin/ssls/{id} | NULL         | Removes the resource with the specified id.     |
 
 ### Request Body Parameters
 
diff --git a/docs/en/latest/certificate.md b/docs/en/latest/certificate.md
index 38140f36c..156e2f594 100644
--- a/docs/en/latest/certificate.md
+++ b/docs/en/latest/certificate.md
@@ -50,7 +50,7 @@ with open(sys.argv[2]) as f:
     key = f.read()
 sni = sys.argv[3]
 api_key = "edd1c9f034335f136f87ad84b625c8f1"
-resp = requests.put("http://127.0.0.1:9080/apisix/admin/ssl/1", json={
+resp = requests.put("http://127.0.0.1:9080/apisix/admin/ssls/1", json={
     "cert": cert,
     "key": key,
     "snis": [sni],
diff --git a/docs/en/latest/mtls.md b/docs/en/latest/mtls.md
index 294d4b162..33e0fb7f3 100644
--- a/docs/en/latest/mtls.md
+++ b/docs/en/latest/mtls.md
@@ -126,7 +126,7 @@ if len(sys.argv) >= 5:
         reqParam["client"]["ca"] = clientCert
     if len(sys.argv) >= 6:
         reqParam["client"]["depth"] = int(sys.argv[5])
-resp = requests.put("http://127.0.0.1:9080/apisix/admin/ssl/1", json=reqParam, headers={
+resp = requests.put("http://127.0.0.1:9080/apisix/admin/ssls/1", json=reqParam, headers={
     "X-API-KEY": api_key,
 })
 print(resp.status_code)
diff --git a/docs/en/latest/plugins/grpc-transcode.md b/docs/en/latest/plugins/grpc-transcode.md
index f198de8e2..de7699a25 100644
--- a/docs/en/latest/plugins/grpc-transcode.md
+++ b/docs/en/latest/plugins/grpc-transcode.md
@@ -58,10 +58,10 @@ APISIX takes in an HTTP request, transcodes it and forwards it to a gRPC service
 
 Before enabling the Plugin, you have to add the content of your `.proto` or `.pb` files to APISIX.
 
-You can use the `/admin/proto/id` endpoint and add the contents of the file to the `content` field:
+You can use the `/admin/protos/id` endpoint and add the contents of the file to the `content` field:
 
 ```shell
-curl http://127.0.0.1:9080/apisix/admin/proto/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
+curl http://127.0.0.1:9080/apisix/admin/protos/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
 {
     "content" : "syntax = \"proto3\";
     package helloworld;
@@ -122,7 +122,7 @@ api_key = "edd1c9f034335f136f87ad84b625c8f1" # use a different API key
 reqParam = {
     "content": content,
 }
-resp = requests.put("http://127.0.0.1:9080/apisix/admin/proto/" + id, json=reqParam, headers={
+resp = requests.put("http://127.0.0.1:9080/apisix/admin/protos/" + id, json=reqParam, headers={
     "X-API-KEY": api_key,
 })
 print(resp.status_code)
diff --git a/docs/zh/latest/admin-api.md b/docs/zh/latest/admin-api.md
index 0eea807f2..9462cdfb9 100644
--- a/docs/zh/latest/admin-api.md
+++ b/docs/zh/latest/admin-api.md
@@ -774,7 +774,7 @@ $ curl http://127.0.0.1:9080/get
 
 ## SSL
 
-*地址*:/apisix/admin/ssl/{id}
+*地址*:/apisix/admin/ssls/{id}
 
 *说明*:SSL.
 
@@ -782,11 +782,11 @@ $ curl http://127.0.0.1:9080/get
 
 | 名字   | 请求 uri               | 请求 body | 说明                            |
 | ------ | ---------------------- | --------- | ------------------------------- |
-| GET    | /apisix/admin/ssl      | 无        | 获取资源列表                    |
-| GET    | /apisix/admin/ssl/{id} | 无        | 获取资源                        |
-| PUT    | /apisix/admin/ssl/{id} | {...}     | 根据 id 创建资源                |
-| POST   | /apisix/admin/ssl      | {...}     | 创建资源,id 由后台服务自动生成 |
-| DELETE | /apisix/admin/ssl/{id} | 无        | 删除资源                        |
+| GET    | /apisix/admin/ssls      | 无        | 获取资源列表                    |
+| GET    | /apisix/admin/ssls/{id} | 无        | 获取资源                        |
+| PUT    | /apisix/admin/ssls/{id} | {...}     | 根据 id 创建资源                |
+| POST   | /apisix/admin/ssls      | {...}     | 创建资源,id 由后台服务自动生成 |
+| DELETE | /apisix/admin/ssls/{id} | 无        | 删除资源                        |
 
 ### body 请求参数
 
diff --git a/docs/zh/latest/certificate.md b/docs/zh/latest/certificate.md
index 8b89d6f6c..b1c04d744 100644
--- a/docs/zh/latest/certificate.md
+++ b/docs/zh/latest/certificate.md
@@ -52,7 +52,7 @@ with open(sys.argv[2]) as f:
     key = f.read()
 sni = sys.argv[3]
 api_key = "edd1c9f034335f136f87ad84b625c8f1"
-resp = requests.put("http://127.0.0.1:9080/apisix/admin/ssl/1", json={
+resp = requests.put("http://127.0.0.1:9080/apisix/admin/ssls/1", json={
     "cert": cert,
     "key": key,
     "snis": [sni],
diff --git a/docs/zh/latest/mtls.md b/docs/zh/latest/mtls.md
index 8996f2b5f..1791821d8 100644
--- a/docs/zh/latest/mtls.md
+++ b/docs/zh/latest/mtls.md
@@ -126,7 +126,7 @@ if len(sys.argv) >= 5:
         reqParam["client"]["ca"] = clientCert
     if len(sys.argv) >= 6:
         reqParam["client"]["depth"] = int(sys.argv[5])
-resp = requests.put("http://127.0.0.1:9080/apisix/admin/ssl/1", json=reqParam, headers={
+resp = requests.put("http://127.0.0.1:9080/apisix/admin/ssls/1", json=reqParam, headers={
     "X-API-KEY": api_key,
 })
 print(resp.status_code)
diff --git a/docs/zh/latest/plugins/grpc-transcode.md b/docs/zh/latest/plugins/grpc-transcode.md
index 759d90065..ec2337952 100644
--- a/docs/zh/latest/plugins/grpc-transcode.md
+++ b/docs/zh/latest/plugins/grpc-transcode.md
@@ -58,10 +58,10 @@ APISIX 接收 HTTP 请求后,首先对请求进行转码,并将转码后的
 
 在启用插件之前,你必须将 `.proto` 或 `.pb` 文件的内容添加到 APISIX。
 
-可以使用 `/admin/proto/id` 接口将文件的内容添加到 `content` 字段:
+可以使用 `/admin/protos/id` 接口将文件的内容添加到 `content` 字段:
 
 ```shell
-curl http://127.0.0.1:9080/apisix/admin/proto/1 \
+curl http://127.0.0.1:9080/apisix/admin/protos/1 \
 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
 {
     "content" : "syntax = \"proto3\";
@@ -123,7 +123,7 @@ api_key = "edd1c9f034335f136f87ad84b625c8f1" # use your API key
 reqParam = {
     "content": content,
 }
-resp = requests.put("http://127.0.0.1:9080/apisix/admin/proto/" + id, json=reqParam, headers={
+resp = requests.put("http://127.0.0.1:9080/apisix/admin/protos/" + id, json=reqParam, headers={
     "X-API-KEY": api_key,
 })
 print(resp.status_code)
diff --git a/t/admin/proto.t b/t/admin/proto.t
index 3a05a26df..0a41f8001 100644
--- a/t/admin/proto.t
+++ b/t/admin/proto.t
@@ -43,7 +43,7 @@ __DATA__
     location /t {
         content_by_lua_block {
             local t = require("lib.test_admin").test
-            local code, message = t('/apisix/admin/proto/1',
+            local code, message = t('/apisix/admin/protos/1',
                  ngx.HTTP_PUT,
                  [[{
                         "content": "syntax = \"proto3\";
@@ -88,7 +88,7 @@ __DATA__
     location /t {
         content_by_lua_block {
             local t = require("lib.test_admin").test
-            local code, message = t('/apisix/admin/proto/1',
+            local code, message = t('/apisix/admin/protos/1',
                  ngx.HTTP_DELETE,
                  nil,
                  [[{
@@ -115,7 +115,7 @@ __DATA__
     location /t {
         content_by_lua_block {
             local t = require("lib.test_admin").test
-            local code, message = t('/apisix/admin/proto/2',
+            local code, message = t('/apisix/admin/protos/2',
                  ngx.HTTP_PUT,
                  [[{
                     "content": "syntax = \"proto3\";
@@ -184,7 +184,7 @@ __DATA__
 
             ngx.sleep(0.1) -- ensure reference is synced from etcd
 
-            code, message = t('/apisix/admin/proto/2',
+            code, message = t('/apisix/admin/protos/2',
                  ngx.HTTP_DELETE,
                  nil,
                  [[{
@@ -207,7 +207,7 @@ __DATA__
     location /t {
         content_by_lua_block {
             local t = require("lib.test_admin").test
-            local code, message = t('/apisix/admin/proto/1',
+            local code, message = t('/apisix/admin/protos/1',
                  ngx.HTTP_PUT,
                  [[{
                         "content": "syntax = \"proto3\";
diff --git a/t/admin/ssl.t b/t/admin/ssl.t
index 0232d2110..ff1504b13 100644
--- a/t/admin/ssl.t
+++ b/t/admin/ssl.t
@@ -34,7 +34,7 @@ __DATA__
             local ssl_key =  t.read_file("t/certs/apisix.key")
             local data = {cert = ssl_cert, key = ssl_key, sni = "test.com"}
 
-            local code, body = t.test('/apisix/admin/ssl/1',
+            local code, body = t.test('/apisix/admin/ssls/1',
                 ngx.HTTP_PUT,
                 core.json.encode(data),
                 [[{
@@ -42,7 +42,7 @@ __DATA__
                         "value": {
                             "sni": "test.com"
                         },
-                        "key": "/apisix/ssl/1"
+                        "key": "/apisix/ssls/1"
                     },
                     "action": "set"
                 }]]
@@ -51,7 +51,7 @@ __DATA__
             ngx.status = code
             ngx.say(body)
 
-            local res = assert(etcd.get('/ssl/1'))
+            local res = assert(etcd.get('/ssls/1'))
             local prev_create_time = res.body.node.value.create_time
             assert(prev_create_time ~= nil, "create_time is nil")
             local update_time = res.body.node.value.update_time
@@ -73,7 +73,7 @@ passed
     location /t {
         content_by_lua_block {
             local t = require("lib.test_admin").test
-            local code, body = t('/apisix/admin/ssl/1',
+            local code, body = t('/apisix/admin/ssls/1',
                 ngx.HTTP_GET,
                 nil,
                 [[{
@@ -83,7 +83,7 @@ passed
                             "key": null
                         },
 
-                        "key": "/apisix/ssl/1"
+                        "key": "/apisix/ssls/1"
                     },
                     "action": "get"
                 }]]
@@ -107,7 +107,7 @@ passed
     location /t {
         content_by_lua_block {
             local t = require("lib.test_admin").test
-            local code, message = t('/apisix/admin/ssl/1',
+            local code, message = t('/apisix/admin/ssls/1',
                  ngx.HTTP_DELETE,
                  nil,
                  [[{
@@ -131,7 +131,7 @@ GET /t
     location /t {
         content_by_lua_block {
             local t = require("lib.test_admin").test
-            local code = t('/apisix/admin/ssl/99999999999999',
+            local code = t('/apisix/admin/ssls/99999999999999',
                  ngx.HTTP_DELETE,
                  nil,
                  [[{
@@ -161,7 +161,7 @@ GET /t
             local ssl_key =  t.read_file("t/certs/apisix.key")
             local data = {cert = ssl_cert, key = ssl_key, sni = "foo.com"}
 
-            local code, message, res = t.test('/apisix/admin/ssl',
+            local code, message, res = t.test('/apisix/admin/ssls',
                 ngx.HTTP_POST,
                 core.json.encode(data),
                 [[{
@@ -182,8 +182,8 @@ GET /t
 
             ngx.say("[push] code: ", code, " message: ", message)
 
-            local id = string.sub(res.node.key, #"/apisix/ssl/" + 1)
-            code, message = t.test('/apisix/admin/ssl/' .. id,
+            local id = string.sub(res.node.key, #"/apisix/ssls/" + 1)
+            code, message = t.test('/apisix/admin/ssls/' .. id,
                  ngx.HTTP_DELETE,
                  nil,
                  [[{
@@ -214,7 +214,7 @@ GET /t
             local ssl_key =  t.read_file("t/certs/apisix.key")
             local data = {sni = "foo.com"}
 
-            local code, body = t.test('/apisix/admin/ssl/1',
+            local code, body = t.test('/apisix/admin/ssls/1',
                 ngx.HTTP_PUT,
                 core.json.encode(data),
                 [[{
@@ -222,7 +222,7 @@ GET /t
                         "value": {
                             "sni": "foo.com"
                         },
-                        "key": "/apisix/ssl/1"
+                        "key": "/apisix/ssls/1"
                     },
                     "action": "set"
                 }]]
@@ -253,7 +253,7 @@ GET /t
             local ssl_key =  t.read_file("t/certs/apisix.key")
             local data = {cert = ssl_cert, key = ssl_key, sni = "*.foo.com"}
 
-            local code, body = t.test('/apisix/admin/ssl/1',
+            local code, body = t.test('/apisix/admin/ssls/1',
                 ngx.HTTP_PUT,
                 core.json.encode(data),
                 [[{
@@ -261,7 +261,7 @@ GET /t
                         "value": {
                             "sni": "*.foo.com"
                         },
-                        "key": "/apisix/ssl/1"
+                        "key": "/apisix/ssls/1"
                     },
                     "action": "set"
                 }]]
@@ -294,7 +294,7 @@ passed
                 snis = {"*.foo.com", "bar.com"},
             }
 
-            local code, body = t.test('/apisix/admin/ssl/1',
+            local code, body = t.test('/apisix/admin/ssls/1',
                 ngx.HTTP_PUT,
                 core.json.encode(data),
                 [[{
@@ -302,7 +302,7 @@ passed
                         "value": {
                             "snis": ["*.foo.com", "bar.com"]
                         },
-                        "key": "/apisix/ssl/1"
+                        "key": "/apisix/ssls/1"
                     },
                     "action": "set"
                 }]]
@@ -336,7 +336,7 @@ passed
                 exptime = 1588262400 + 60 * 60 * 24 * 365,
             }
 
-            local code, body = t.test('/apisix/admin/ssl/1',
+            local code, body = t.test('/apisix/admin/ssls/1',
                 ngx.HTTP_PUT,
                 core.json.encode(data),
                 [[{
@@ -345,7 +345,7 @@ passed
                             "sni": "bar.com",
                             "exptime": 1619798400
                         },
-                        "key": "/apisix/ssl/1"
+                        "key": "/apisix/ssls/1"
                     },
                     "action": "set"
                 }]]
@@ -375,7 +375,7 @@ passed
             local ssl_key =  t.read_file("t/certs/apisix.key")
             local data = {cert = ssl_cert, key = ssl_key, sni = "test.com"}
 
-            local code, body = t.test('/apisix/admin/ssl/a-b-c-ABC_0123',
+            local code, body = t.test('/apisix/admin/ssls/a-b-c-ABC_0123',
                 ngx.HTTP_PUT,
                 core.json.encode(data)
             )
@@ -405,7 +405,7 @@ passed
             local ssl_key =  t.read_file("t/certs/apisix.key")
             local data = {cert = ssl_cert, key = ssl_key, sni = "test.com"}
 
-            local code, body = t.test('/apisix/admin/ssl/a-b-c-ABC_0123',
+            local code, body = t.test('/apisix/admin/ssls/a-b-c-ABC_0123',
                 ngx.HTTP_DELETE
             )
             if code > 300 then
@@ -434,7 +434,7 @@ passed
             local ssl_key =  t.read_file("t/certs/apisix.key")
             local data = {cert = ssl_cert, key = ssl_key, sni = "test.com"}
 
-            local code, body = t.test('/apisix/admin/ssl/*invalid',
+            local code, body = t.test('/apisix/admin/ssls/*invalid',
                 ngx.HTTP_PUT,
                 core.json.encode(data)
             )
@@ -471,7 +471,7 @@ GET /t
                 keys = {ssl_ecc_key}
             }
 
-            local code, body = t.test('/apisix/admin/ssl/1',
+            local code, body = t.test('/apisix/admin/ssls/1',
                 ngx.HTTP_PUT,
                 core.json.encode(data),
                 [[{
@@ -479,7 +479,7 @@ GET /t
                         "value": {
                             "sni": "test.com"
                         },
-                        "key": "/apisix/ssl/1"
+                        "key": "/apisix/ssls/1"
                     },
                     "action": "set"
                 }]]
@@ -513,7 +513,7 @@ passed
                 keys = {},
             }
 
-            local code, body = t.test('/apisix/admin/ssl/1',
+            local code, body = t.test('/apisix/admin/ssls/1',
                 ngx.HTTP_PUT,
                 core.json.encode(data),
                 [[{
@@ -521,7 +521,7 @@ passed
                         "value": {
                             "sni": "test.com"
                         },
-                        "key": "/apisix/ssl/1"
+                        "key": "/apisix/ssls/1"
                     },
                     "action": "set"
                 }]]
@@ -552,7 +552,7 @@ GET /t
             local ssl_key =  t.read_file("t/certs/apisix.key")
             local data = {cert = ssl_cert, key = ssl_key, sni = "test.com", labels = { version = "v2", build = "16", env = "production"}}
 
-            local code, body = t.test('/apisix/admin/ssl/1',
+            local code, body = t.test('/apisix/admin/ssls/1',
                 ngx.HTTP_PUT,
                 core.json.encode(data),
                 [[{
@@ -566,7 +566,7 @@ GET /t
                             }
                         },
 
-                        "key": "/apisix/ssl/1"
+                        "key": "/apisix/ssls/1"
                     },
                     "action": "set"
                 }]]
@@ -596,7 +596,7 @@ passed
             local ssl_key =  t.read_file("t/certs/apisix.key")
             local data = {cert = ssl_cert, key = ssl_key, sni = "test.com", labels = { env = {"production", "release"}}}
 
-            local code, body = t.test('/apisix/admin/ssl/1',
+            local code, body = t.test('/apisix/admin/ssls/1',
                 ngx.HTTP_PUT,
                 core.json.encode(data),
                 [[{
@@ -608,7 +608,7 @@ passed
                             }
                         },
 
-                        "key": "/apisix/ssl/1"
+                        "key": "/apisix/ssls/1"
                     },
                     "action": "set"
                 }]]
@@ -647,7 +647,7 @@ GET /t
                 validity_end = 1603893670
             }
 
-            local code, body = t.test('/apisix/admin/ssl/1',
+            local code, body = t.test('/apisix/admin/ssls/1',
                 ngx.HTTP_PUT,
                 core.json.encode(data),
                 [[{
@@ -659,7 +659,7 @@ GET /t
                             "validity_start": 1602873670,
                             "validity_end": 1603893670
                         },
-                        "key": "/apisix/ssl/1"
+                        "key": "/apisix/ssls/1"
                     },
                     "action": "set"
                 }]]
@@ -683,7 +683,7 @@ passed
     location /t {
         content_by_lua_block {
             local t = require("lib.test_admin").test
-            local code, message = t('/apisix/admin/ssl/1',
+            local code, message = t('/apisix/admin/ssls/1',
                  ngx.HTTP_DELETE,
                  nil,
                  [[{
@@ -714,7 +714,7 @@ GET /t
             local ssl_key =  t.read_file("t/certs/apisix.key")
             local data = {cert = ssl_cert, key = ssl_key, sni = "test.com"}
 
-            local code, body, res = t.test('/apisix/admin/ssl',
+            local code, body, res = t.test('/apisix/admin/ssls',
                 ngx.HTTP_POST,
                 core.json.encode(data),
                 [[{
@@ -733,14 +733,14 @@ GET /t
                 return
             end
 
-            local id = string.sub(res.node.key, #"/apisix/ssl/" + 1)
-            local res = assert(etcd.get('/ssl/' .. id))
+            local id = string.sub(res.node.key, #"/apisix/ssls/" + 1)
+            local res = assert(etcd.get('/ssls/' .. id))
             local prev_create_time = res.body.node.value.create_time
             assert(prev_create_time ~= nil, "create_time is nil")
             local update_time = res.body.node.value.update_time
             assert(update_time ~= nil, "update_time is nil")
 
-            local code, body = t.test('/apisix/admin/ssl/' .. id,
+            local code, body = t.test('/apisix/admin/ssls/' .. id,
                 ngx.HTTP_PATCH,
                 core.json.encode({create_time = 0, update_time = 1})
                 )
@@ -751,14 +751,14 @@ GET /t
                 return
             end
 
-            local res = assert(etcd.get('/ssl/' .. id))
+            local res = assert(etcd.get('/ssls/' .. id))
             local create_time = res.body.node.value.create_time
             assert(create_time == 0, "create_time mismatched")
             local update_time = res.body.node.value.update_time
             assert(update_time == 1, "update_time mismatched")
 
             -- clean up
-            local code, body = t.test('/apisix/admin/ssl/' .. id,
+            local code, body = t.test('/apisix/admin/ssls/' .. id,
                 ngx.HTTP_DELETE
             )
             ngx.status = code
@@ -785,12 +785,12 @@ passed
             local ssl_key =  t.read_file("t/certs/apisix.key")
             local data = {cert = ssl_cert, key = ssl_key}
 
-            local code, body = t.test('/apisix/admin/ssl/1',
+            local code, body = t.test('/apisix/admin/ssls/1',
                 ngx.HTTP_PUT,
                 core.json.encode(data),
                 [[{
                     "node": {
-                        "key": "/apisix/ssl/1"
+                        "key": "/apisix/ssls/1"
                     },
                     "action": "set"
                 }]]
@@ -821,12 +821,12 @@ GET /t
             local ssl_key =  t.read_file("t/certs/apisix.key")
             local data = {type = "client", cert = ssl_cert, key = ssl_key}
 
-            local code, body = t.test('/apisix/admin/ssl/1',
+            local code, body = t.test('/apisix/admin/ssls/1',
                 ngx.HTTP_PUT,
                 core.json.encode(data),
                 [[{
                     "node": {
-                        "key": "/apisix/ssl/1"
+                        "key": "/apisix/ssls/1"
                     },
                     "action": "set"
                 }]]
diff --git a/t/admin/ssl2.t b/t/admin/ssl2.t
index 865652ce2..773552f41 100644
--- a/t/admin/ssl2.t
+++ b/t/admin/ssl2.t
@@ -48,7 +48,7 @@ __DATA__
             local ssl_cert = t.read_file("t/certs/apisix.crt")
             local ssl_key =  t.read_file("t/certs/apisix.key")
             local data = {cert = ssl_cert, key = ssl_key, sni = "not-unwanted-post.com"}
-            local code, message, res = t.test('/apisix/admin/ssl',
+            local code, message, res = t.test('/apisix/admin/ssls',
                 ngx.HTTP_POST,
                 json.encode(data)
             )
@@ -84,7 +84,7 @@ __DATA__
             local ssl_cert = t.read_file("t/certs/apisix.crt")
             local ssl_key =  t.read_file("t/certs/apisix.key")
             local data = {cert = ssl_cert, key = ssl_key, sni = "test.com"}
-            local code, message, res = t.test('/apisix/admin/ssl/1',
+            local code, message, res = t.test('/apisix/admin/ssls/1',
                 ngx.HTTP_PUT,
                 json.encode(data)
             )
@@ -104,7 +104,7 @@ __DATA__
         }
     }
 --- response_body
-{"action":"set","node":{"key":"/apisix/ssl/1","value":{"cert":"","id":"1","key":"","sni":"test.com","status":1,"type":"server"}}}
+{"action":"set","node":{"key":"/apisix/ssls/1","value":{"cert":"","id":"1","key":"","sni":"test.com","status":1,"type":"server"}}}
 
 
 
@@ -117,7 +117,7 @@ __DATA__
             local ssl_cert = t.read_file("t/certs/apisix.crt")
             local ssl_key =  t.read_file("t/certs/apisix.key")
             local data = {cert = ssl_cert, key = ssl_key, sni = "t.com"}
-            local code, message, res = t.test('/apisix/admin/ssl/1',
+            local code, message, res = t.test('/apisix/admin/ssls/1',
                 ngx.HTTP_PATCH,
                 json.encode(data)
             )
@@ -137,7 +137,7 @@ __DATA__
         }
     }
 --- response_body
-{"action":"compareAndSwap","node":{"key":"/apisix/ssl/1","value":{"cert":"","id":"1","key":"","sni":"t.com","status":1,"type":"server"}}}
+{"action":"compareAndSwap","node":{"key":"/apisix/ssls/1","value":{"cert":"","id":"1","key":"","sni":"t.com","status":1,"type":"server"}}}
 
 
 
@@ -147,7 +147,7 @@ __DATA__
         content_by_lua_block {
             local json = require("toolkit.json")
             local t = require("lib.test_admin")
-            local code, message, res = t.test('/apisix/admin/ssl/1',
+            local code, message, res = t.test('/apisix/admin/ssls/1',
                 ngx.HTTP_GET
             )
 
@@ -172,7 +172,7 @@ __DATA__
         }
     }
 --- response_body
-{"action":"get","node":{"key":"/apisix/ssl/1","value":{"cert":"","id":"1","sni":"t.com","status":1,"type":"server"}}}
+{"action":"get","node":{"key":"/apisix/ssls/1","value":{"cert":"","id":"1","sni":"t.com","status":1,"type":"server"}}}
 
 
 
@@ -185,7 +185,7 @@ __DATA__
             local ssl_cert = t.read_file("t/certs/apisix.crt")
             local ssl_key =  t.read_file("t/certs/apisix.key")
             local data = {cert = ssl_cert, key = ssl_key, sni = "test.com"}
-            local code, message, res = t.test('/apisix/admin/ssl/1',
+            local code, message, res = t.test('/apisix/admin/ssls/1',
                 ngx.HTTP_DELETE
             )
 
@@ -200,7 +200,7 @@ __DATA__
         }
     }
 --- response_body
-{"action":"delete","deleted":"1","key":"/apisix/ssl/1","node":{}}
+{"action":"delete","deleted":"1","key":"/apisix/ssls/1","node":{}}
 
 
 
@@ -217,7 +217,7 @@ BAYTAkNOMRIwEAYDVQQIDAlHdWFuZ0RvbmcxDzANBgNVBAcMBlpodUhhaTEPMA0G
 U/OOcSRr39Kuis/JJ+DkgHYa/PWHZhnJQBxcqXXk1bJGw9BNbhM=
 -----END CERTIFICATE-----
             ]], key = ssl_key, sni = "test.com"}
-            local code, message, res = t.test('/apisix/admin/ssl/1',
+            local code, message, res = t.test('/apisix/admin/ssls/1',
                 ngx.HTTP_PUT,
                 json.encode(data)
             )
@@ -250,7 +250,7 @@ MIIG5AIBAAKCAYEAyCM0rqJecvgnCfOw4fATotPwk5Ba0gC2YvIrO+gSbQkyxXF5
 jhZB3W6BkWUWR4oNFLLSqcVbVDPitz/Mt46Mo8amuS6zTbQetGnBARzPLtmVhJfo
 wzarryret/7GFW1/3cz+hTj9/d45i25zArr3Pocfpur5mfz3fJO8jg==
 -----END RSA PRIVATE KEY-----]], sni = "test.com"}
-            local code, message, res = t.test('/apisix/admin/ssl/1',
+            local code, message, res = t.test('/apisix/admin/ssls/1',
                 ngx.HTTP_PUT,
                 json.encode(data)
             )
@@ -288,7 +288,7 @@ U/OOcSRr39Kuis/JJ+DkgHYa/PWHZhnJQBxcqXXk1bJGw9BNbhM=
                 },
                 keys = {ssl_key}
             }
-            local code, message, res = t.test('/apisix/admin/ssl/1',
+            local code, message, res = t.test('/apisix/admin/ssls/1',
                 ngx.HTTP_PUT,
                 json.encode(data)
             )
@@ -324,7 +324,7 @@ jhZB3W6BkWUWR4oNFLLSqcVbVDPitz/Mt46Mo8amuS6zTbQetGnBARzPLtmVhJfo
 wzarryret/7GFW1/3cz+hTj9/d45i25zArr3Pocfpur5mfz3fJO8jg==
 -----END RSA PRIVATE KEY-----]]}
             }
-            local code, message, res = t.test('/apisix/admin/ssl/1',
+            local code, message, res = t.test('/apisix/admin/ssls/1',
                 ngx.HTTP_PUT,
                 json.encode(data)
             )
@@ -353,7 +353,7 @@ wzarryret/7GFW1/3cz+hTj9/d45i25zArr3Pocfpur5mfz3fJO8jg==
             local ssl_cert = t.read_file("t/certs/apisix.crt")
             local ssl_key =  t.read_file("t/certs/apisix.key")
             local data = {cert = ssl_cert, key = ssl_key, snis = {}}
-            local code, message, res = t.test('/apisix/admin/ssl/1',
+            local code, message, res = t.test('/apisix/admin/ssls/1',
                 ngx.HTTP_PUT,
                 json.encode(data)
             )
@@ -382,7 +382,7 @@ wzarryret/7GFW1/3cz+hTj9/d45i25zArr3Pocfpur5mfz3fJO8jg==
             local ssl_cert = t.read_file("t/certs/apisix.crt")
             local ssl_key =  t.read_file("t/certs/apisix.key")
             local data = {cert = ssl_cert, key = ssl_key, snis = {"test.com"}}
-            local code, message, res = t.test('/apisix/admin/ssl/1',
+            local code, message, res = t.test('/apisix/admin/ssls/1',
                 ngx.HTTP_PUT,
                 json.encode(data)
             )
@@ -395,7 +395,7 @@ wzarryret/7GFW1/3cz+hTj9/d45i25zArr3Pocfpur5mfz3fJO8jg==
 
 
             local data = {"update1.com", "update2.com"}
-            local code, message, res = t.test('/apisix/admin/ssl/1/snis',
+            local code, message, res = t.test('/apisix/admin/ssls/1/snis',
                 ngx.HTTP_PATCH,
                 json.encode(data)
             )
@@ -429,7 +429,7 @@ apisix:
             local ssl_cert = t.read_file("t/certs/apisix.crt")
             local ssl_key =  t.read_file("t/certs/apisix.key")
             local data = {cert = ssl_cert, key = ssl_key, certs = {ssl_cert}, keys = {ssl_key}}
-            local code, message, res = t.test('/apisix/admin/ssl/1',
+            local code, message, res = t.test('/apisix/admin/ssls/1',
                 ngx.HTTP_PATCH,
                 json.encode(data)
             )
@@ -465,7 +465,7 @@ apisix:
             local t = require("lib.test_admin")
 
             local ssl_key =  t.read_file("t/certs/apisix.key")
-            local code, message, res = t.test('/apisix/admin/ssl/1/keys',
+            local code, message, res = t.test('/apisix/admin/ssls/1/keys',
                 ngx.HTTP_PATCH,
                 json.encode({ssl_key})
             )
diff --git a/t/admin/ssl3.t b/t/admin/ssl3.t
index cb09b5119..cf8960e78 100644
--- a/t/admin/ssl3.t
+++ b/t/admin/ssl3.t
@@ -45,7 +45,7 @@ __DATA__
             local json = require("toolkit.json")
             local t = require("lib.test_admin").test
 
-            local code, message, res = t('/apisix/admin/ssl',
+            local code, message, res = t('/apisix/admin/ssls',
                 ngx.HTTP_GET
             )
 
@@ -60,4 +60,4 @@ __DATA__
         }
     }
 --- response_body
-{"action":"get","count":0,"node":{"dir":true,"key":"/apisix/ssl","nodes":[]}}
+{"action":"get","count":0,"node":{"dir":true,"key":"/apisix/ssls","nodes":[]}}
diff --git a/t/admin/ssls.t b/t/admin/ssls.t
index 33c98e11e..911b89494 100644
--- a/t/admin/ssls.t
+++ b/t/admin/ssls.t
@@ -58,7 +58,7 @@ __DATA__
                         "value": {
                             "sni": "test.com"
                         },
-                        "key": "/apisix/ssl/1"
+                        "key": "/apisix/ssls/1"
                     },
                     "action": "set"
                 }]]
@@ -67,7 +67,7 @@ __DATA__
             ngx.status = code
             ngx.say(body)
 
-            local res = assert(etcd.get('/ssl/1'))
+            local res = assert(etcd.get('/ssls/1'))
             local prev_create_time = res.body.node.value.create_time
             assert(prev_create_time ~= nil, "create_time is nil")
             local update_time = res.body.node.value.update_time
diff --git a/t/admin/upstream.t b/t/admin/upstream.t
index 16bfb5157..f04d5e1a6 100644
--- a/t/admin/upstream.t
+++ b/t/admin/upstream.t
@@ -717,7 +717,7 @@ GET /t
                 cert = ssl_cert,
                 key = ssl_key
             }
-            local code, body = t.test('/apisix/admin/ssl/1',
+            local code, body = t.test('/apisix/admin/ssls/1',
                 ngx.HTTP_PUT,
                 json.encode(data)
             )
diff --git a/t/cli/test_etcd.sh b/t/cli/test_etcd.sh
index c417baaec..23b5882e9 100755
--- a/t/cli/test_etcd.sh
+++ b/t/cli/test_etcd.sh
@@ -52,10 +52,10 @@ init_kv=(
 "/apisix/global_rules/ init_dir"
 "/apisix/plugin_metadata/ init_dir"
 "/apisix/plugins/ init_dir"
-"/apisix/proto/ init_dir"
+"/apisix/protos/ init_dir"
 "/apisix/routes/ init_dir"
 "/apisix/services/ init_dir"
-"/apisix/ssl/ init_dir"
+"/apisix/ssls/ init_dir"
 "/apisix/stream_routes/ init_dir"
 "/apisix/upstreams/ init_dir"
 )
diff --git a/t/config-center-yaml/ssl.t b/t/config-center-yaml/ssl.t
index d4745a21f..8d74faff0 100644
--- a/t/config-center-yaml/ssl.t
+++ b/t/config-center-yaml/ssl.t
@@ -108,7 +108,7 @@ __DATA__
 
 === TEST 1: sanity
 --- apisix_yaml
-ssl:
+ssls:
     -
         cert: |
             -----BEGIN CERTIFICATE-----
@@ -181,7 +181,7 @@ server name: "test.com"
 
 === TEST 2: single sni
 --- apisix_yaml
-ssl:
+ssls:
     -
         cert: |
             -----BEGIN CERTIFICATE-----
@@ -252,7 +252,7 @@ server name: "test.com"
 
 === TEST 3: bad cert
 --- apisix_yaml
-ssl:
+ssls:
     -
         cert: |
             -----BEGIN CERTIFICATE-----
diff --git a/t/node/client-mtls-openresty.t b/t/node/client-mtls-openresty.t
index 7b388932d..1779abe09 100644
--- a/t/node/client-mtls-openresty.t
+++ b/t/node/client-mtls-openresty.t
@@ -74,7 +74,7 @@ __DATA__
                     depth = 2,
                 }
             }
-            local code, body = t.test('/apisix/admin/ssl/1',
+            local code, body = t.test('/apisix/admin/ssls/1',
                 ngx.HTTP_PUT,
                 json.encode(data)
             )
diff --git a/t/node/client-mtls.t b/t/node/client-mtls.t
index afccc9375..aa326dbe9 100644
--- a/t/node/client-mtls.t
+++ b/t/node/client-mtls.t
@@ -58,7 +58,7 @@ __DATA__
                     ca = ("test.com"):rep(128),
                 }
             }
-            local code, body = t.test('/apisix/admin/ssl/1',
+            local code, body = t.test('/apisix/admin/ssls/1',
                 ngx.HTTP_PUT,
                 json.encode(data)
             )
@@ -92,7 +92,7 @@ GET /t
                 client = {
                 }
             }
-            local code, body = t.test('/apisix/admin/ssl/1',
+            local code, body = t.test('/apisix/admin/ssls/1',
                 ngx.HTTP_PUT,
                 json.encode(data)
             )
@@ -173,7 +173,7 @@ GET /t
                     depth = 2,
                 }
             }
-            local code, body = t.test('/apisix/admin/ssl/1',
+            local code, body = t.test('/apisix/admin/ssls/1',
                 ngx.HTTP_PUT,
                 json.encode(data)
             )
diff --git a/t/node/grpc-proxy-unary.t b/t/node/grpc-proxy-unary.t
index 393016d15..694ea6281 100644
--- a/t/node/grpc-proxy-unary.t
+++ b/t/node/grpc-proxy-unary.t
@@ -114,7 +114,7 @@ grpcurl -import-path ./t/grpc_server_example/proto -proto helloworld.proto -plai
 === TEST 4: Unary API gRPC proxy with tls
 --- http2
 --- apisix_yaml
-ssl:
+ssls:
   -
     id: 1
     cert: "-----BEGIN CERTIFICATE-----\nMIIEojCCAwqgAwIBAgIJAK253pMhgCkxMA0GCSqGSIb3DQEBCwUAMFYxCzAJBgNV\nBAYTAkNOMRIwEAYDVQQIDAlHdWFuZ0RvbmcxDzANBgNVBAcMBlpodUhhaTEPMA0G\nA1UECgwGaXJlc3R5MREwDwYDVQQDDAh0ZXN0LmNvbTAgFw0xOTA2MjQyMjE4MDVa\nGA8yMTE5MDUzMTIyMTgwNVowVjELMAkGA1UEBhMCQ04xEjAQBgNVBAgMCUd1YW5n\nRG9uZzEPMA0GA1UEBwwGWmh1SGFpMQ8wDQYDVQQKDAZpcmVzdHkxETAPBgNVBAMM\nCHRlc3QuY29tMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAyCM0rqJe\ncvgnCfOw4fATotPwk5Ba0gC2YvIrO+gSbQkyxXF5jhZB3W6BkWUWR4oN [...]
diff --git a/t/node/upstream-mtls.t b/t/node/upstream-mtls.t
index c909dbc9a..8f837db84 100644
--- a/t/node/upstream-mtls.t
+++ b/t/node/upstream-mtls.t
@@ -562,7 +562,7 @@ hello world
                 cert = ssl_cert,
                 key = ssl_key
             }
-            local code, body = t.test('/apisix/admin/ssl/1',
+            local code, body = t.test('/apisix/admin/ssls/1',
                 ngx.HTTP_PUT,
                 json.encode(data)
             )
@@ -629,7 +629,7 @@ hello world
                 cert = ssl_cert,
                 key = ssl_key
             }
-            local code, body = t.test('/apisix/admin/ssl/1',
+            local code, body = t.test('/apisix/admin/ssls/1',
                 ngx.HTTP_PUT,
                 json.encode(data)
             )
@@ -664,7 +664,7 @@ failed to get ssl cert: ssl type should be 'client'
             local t = require("lib.test_admin")
             local json = require("toolkit.json")
 
-            local code, body = t.test('/apisix/admin/ssl/1', ngx.HTTP_DELETE)
+            local code, body = t.test('/apisix/admin/ssls/1', ngx.HTTP_DELETE)
 
             if code >= 300 then
                 ngx.status = code
diff --git a/t/node/upstream-websocket.t b/t/node/upstream-websocket.t
index 5ca21d28e..a24474749 100644
--- a/t/node/upstream-websocket.t
+++ b/t/node/upstream-websocket.t
@@ -254,7 +254,7 @@ qr/failed to new websocket: bad "upgrade" request header: nil/
             local ssl_key =  t.read_file("t/certs/apisix.key")
             local data = {cert = ssl_cert, key = ssl_key, sni = "127.0.0.1"}
 
-            local code, body = t.test('/apisix/admin/ssl/1',
+            local code, body = t.test('/apisix/admin/ssls/1',
                 ngx.HTTP_PUT,
                 core.json.encode(data)
             )
diff --git a/t/plugin/grpc-transcode.t b/t/plugin/grpc-transcode.t
index 78baac0ff..caf902cda 100644
--- a/t/plugin/grpc-transcode.t
+++ b/t/plugin/grpc-transcode.t
@@ -42,7 +42,7 @@ __DATA__
         content_by_lua_block {
             local t = require("lib.test_admin").test
             local etcd = require("apisix.core.etcd")
-            local code, body = t('/apisix/admin/proto/1',
+            local code, body = t('/apisix/admin/protos/1',
                  ngx.HTTP_PUT,
                  [[{
                     "content" : "syntax = \"proto3\";
@@ -64,7 +64,7 @@ __DATA__
             end
             ngx.say(body)
 
-            local res = assert(etcd.get('/proto/1'))
+            local res = assert(etcd.get('/protos/1'))
             local create_time = res.body.node.value.create_time
             assert(create_time ~= nil, "create_time is nil")
             local update_time = res.body.node.value.update_time
@@ -86,7 +86,7 @@ passed
     location /t {
         content_by_lua_block {
             local t = require("lib.test_admin").test
-            local code, body = t('/apisix/admin/proto/2',
+            local code, body = t('/apisix/admin/protos/2',
                  ngx.HTTP_PUT,
                  [[{
                     "content" : "syntax = \"proto3\";
@@ -123,7 +123,7 @@ passed
     location /t {
         content_by_lua_block {
             local t = require("lib.test_admin").test
-            local code, body = t('/apisix/admin/proto/2',
+            local code, body = t('/apisix/admin/protos/2',
                  ngx.HTTP_DELETE
                 )
 
@@ -317,7 +317,7 @@ Connection refused) while connecting to upstream
     location /t {
         content_by_lua_block {
             local t = require("lib.test_admin").test
-            local code, body = t('/apisix/admin/proto/1',
+            local code, body = t('/apisix/admin/protos/1',
                  ngx.HTTP_PUT,
                  [[{
                     "content" : "syntax = \"proto3\";
@@ -562,7 +562,7 @@ GET /t
     location /t {
         content_by_lua_block {
             local t = require("lib.test_admin").test
-            local code, body = t('/apisix/admin/proto/1',
+            local code, body = t('/apisix/admin/protos/1',
                  ngx.HTTP_PUT,
                  [[{
                     "content" : "syntax = \"proto3\";
@@ -669,7 +669,7 @@ GET /t
     location /t {
         content_by_lua_block {
             local t = require("lib.test_admin").test
-            local code, body = t('/apisix/admin/proto/1',
+            local code, body = t('/apisix/admin/protos/1',
                  ngx.HTTP_PUT,
                  [[{
                     "content" : "syntax = \"proto3\";
diff --git a/t/plugin/grpc-transcode2.t b/t/plugin/grpc-transcode2.t
index 7c8286650..9f98efb1a 100644
--- a/t/plugin/grpc-transcode2.t
+++ b/t/plugin/grpc-transcode2.t
@@ -41,7 +41,7 @@ __DATA__
     location /t {
         content_by_lua_block {
             local t = require("lib.test_admin").test
-            local code, body = t('/apisix/admin/proto/1',
+            local code, body = t('/apisix/admin/protos/1',
                  ngx.HTTP_PUT,
                  [[{
                     "content" : "syntax = \"proto3\";
@@ -135,7 +135,7 @@ Content-Type: application/json
     location /t {
         content_by_lua_block {
             local t = require("lib.test_admin").test
-            local code, body = t('/apisix/admin/proto/2',
+            local code, body = t('/apisix/admin/protos/2',
                  ngx.HTTP_PUT,
                  [[{
                     "content" : "syntax = \"proto3\";
@@ -240,7 +240,7 @@ failed to encode request data to protobuf
 
             local content = t.read_file("t/grpc_server_example/proto.pb")
             local data = {content = ngx.encode_base64(content)}
-            local code, body = t.test('/apisix/admin/proto/1',
+            local code, body = t.test('/apisix/admin/protos/1',
                  ngx.HTTP_PUT,
                 json.encode(data)
             )
@@ -388,7 +388,7 @@ Undefined service method
     location /t {
         content_by_lua_block {
             local t = require("lib.test_admin").test
-            local code, body = t('/apisix/admin/proto/1',
+            local code, body = t('/apisix/admin/protos/1',
                  ngx.HTTP_PUT,
                  [[{
                     "content" : "syntax = \"proto3\";
@@ -581,7 +581,7 @@ qr/request log: \{.*body":\"\{\\"result\\":3}/
         content_by_lua_block {
             local http = require "resty.http"
             local t = require("lib.test_admin").test
-            local code, body = t('/apisix/admin/proto/1',
+            local code, body = t('/apisix/admin/protos/1',
                  ngx.HTTP_PUT,
                  [[{
                     "content" : "syntax = \"proto3\";
@@ -700,7 +700,7 @@ set protobuf option: int64_as_string
         content_by_lua_block {
             local http = require "resty.http"
             local t = require("lib.test_admin").test
-            local code, body = t('/apisix/admin/proto/1',
+            local code, body = t('/apisix/admin/protos/1',
                  ngx.HTTP_PUT,
                  [[{
                     "content" : "syntax = \"proto3\";
diff --git a/t/plugin/grpc-transcode3.t b/t/plugin/grpc-transcode3.t
index a027a84bd..97208788a 100644
--- a/t/plugin/grpc-transcode3.t
+++ b/t/plugin/grpc-transcode3.t
@@ -42,7 +42,7 @@ __DATA__
        content_by_lua_block {
           local http = require "resty.http"
           local t = require("lib.test_admin").test
-          local code, body = t('/apisix/admin/proto/1',
+          local code, body = t('/apisix/admin/protos/1',
                 ngx.HTTP_PUT,
                 [[{
                    "content" : "syntax = \"proto3\";
diff --git a/t/plugin/redirect.t b/t/plugin/redirect.t
index ec753f00b..be8bac807 100644
--- a/t/plugin/redirect.t
+++ b/t/plugin/redirect.t
@@ -649,7 +649,7 @@ location /t {
         local ssl_key =  t.read_file("t/certs/apisix.key")
         local data = {cert = ssl_cert, key = ssl_key, sni = "test.com"}
 
-        local code, body = t.test('/apisix/admin/ssl/1',
+        local code, body = t.test('/apisix/admin/ssls/1',
             ngx.HTTP_PUT,
             core.json.encode(data)
             )
diff --git a/t/router/multi-ssl-certs.t b/t/router/multi-ssl-certs.t
index 1c302f9ed..c1669434f 100644
--- a/t/router/multi-ssl-certs.t
+++ b/t/router/multi-ssl-certs.t
@@ -36,7 +36,7 @@ location /t {
         local ssl_key =  t.read_file("t/certs/apisix.key")
         local data = {cert = ssl_cert, key = ssl_key, sni = "www.test.com"}
 
-        local code, body = t.test('/apisix/admin/ssl/1',
+        local code, body = t.test('/apisix/admin/ssls/1',
             ngx.HTTP_PUT,
             core.json.encode(data),
             [[{
@@ -44,7 +44,7 @@ location /t {
                     "value": {
                         "sni": "www.test.com"
                     },
-                    "key": "/apisix/ssl/1"
+                    "key": "/apisix/ssls/1"
                 },
                 "action": "set"
             }]]
@@ -183,7 +183,7 @@ location /t {
         local ssl_key =  t.read_file("t/certs/test2.key")
         local data = {cert = ssl_cert, key = ssl_key, sni = "*.test2.com"}
 
-        local code, body = t.test('/apisix/admin/ssl/2',
+        local code, body = t.test('/apisix/admin/ssls/2',
             ngx.HTTP_PUT,
             core.json.encode(data),
             [[{
@@ -191,7 +191,7 @@ location /t {
                     "value": {
                         "sni": "*.test2.com"
                     },
-                    "key": "/apisix/ssl/2"
+                    "key": "/apisix/ssls/2"
                 },
                 "action": "set"
             }]]
@@ -268,7 +268,7 @@ location /t {
         local ssl_key =  t.read_file("t/certs/apisix_admin_ssl.key")
         local data = {cert = ssl_cert, key = ssl_key, sni = "apisix.dev"}
 
-        local code, body = t.test('/apisix/admin/ssl/3',
+        local code, body = t.test('/apisix/admin/ssls/3',
             ngx.HTTP_PUT,
             core.json.encode(data),
             [[{
@@ -276,7 +276,7 @@ location /t {
                     "value": {
                         "sni": "apisix.dev"
                     },
-                    "key": "/apisix/ssl/3"
+                    "key": "/apisix/ssls/3"
                 },
                 "action": "set"
             }]]
@@ -349,9 +349,9 @@ location /t {
         local core = require("apisix.core")
         local t = require("lib.test_admin")
 
-        t.test('/apisix/admin/ssl/1', ngx.HTTP_DELETE)
-        t.test('/apisix/admin/ssl/2', ngx.HTTP_DELETE)
-        t.test('/apisix/admin/ssl/3', ngx.HTTP_DELETE)
+        t.test('/apisix/admin/ssls/1', ngx.HTTP_DELETE)
+        t.test('/apisix/admin/ssls/2', ngx.HTTP_DELETE)
+        t.test('/apisix/admin/ssls/3', ngx.HTTP_DELETE)
 
     }
 }
diff --git a/t/router/radixtree-sni.t b/t/router/radixtree-sni.t
index b8494d315..ce232e8d3 100644
--- a/t/router/radixtree-sni.t
+++ b/t/router/radixtree-sni.t
@@ -36,7 +36,7 @@ location /t {
         local ssl_key =  t.read_file("t/certs/apisix.key")
         local data = {cert = ssl_cert, key = ssl_key, sni = "www.test.com"}
 
-        local code, body = t.test('/apisix/admin/ssl/1',
+        local code, body = t.test('/apisix/admin/ssls/1',
             ngx.HTTP_PUT,
             core.json.encode(data),
             [[{
@@ -44,7 +44,7 @@ location /t {
                     "value": {
                         "sni": "www.test.com"
                     },
-                    "key": "/apisix/ssl/1"
+                    "key": "/apisix/ssls/1"
                 },
                 "action": "set"
             }]]
@@ -223,7 +223,7 @@ location /t {
         local ssl_key =  t.read_file("t/certs/apisix.key")
         local data = {cert = ssl_cert, key = ssl_key, sni = "*.test.com"}
 
-        local code, body = t.test('/apisix/admin/ssl/1',
+        local code, body = t.test('/apisix/admin/ssls/1',
             ngx.HTTP_PUT,
             core.json.encode(data),
             [[{
@@ -231,7 +231,7 @@ location /t {
                     "value": {
                         "sni": "*.test.com"
                     },
-                    "key": "/apisix/ssl/1"
+                    "key": "/apisix/ssls/1"
                 },
                 "action": "set"
             }]]
@@ -337,7 +337,7 @@ location /t {
         local ssl_key =  t.read_file("t/certs/apisix.key")
         local data = {cert = ssl_cert, key = ssl_key, sni = "test.com"}
 
-        local code, body = t.test('/apisix/admin/ssl/1',
+        local code, body = t.test('/apisix/admin/ssls/1',
             ngx.HTTP_PUT,
             core.json.encode(data),
             [[{
@@ -345,7 +345,7 @@ location /t {
                     "value": {
                         "sni": "test.com"
                     },
-                    "key": "/apisix/ssl/1"
+                    "key": "/apisix/ssls/1"
                 },
                 "action": "set"
             }]]
@@ -451,7 +451,7 @@ location /t {
         local ssl_key =  t.read_file("t/certs/test2.key")
         local data = {cert = ssl_cert, key = ssl_key, sni = "*.test2.com"}
 
-        local code, body = t.test('/apisix/admin/ssl/1',
+        local code, body = t.test('/apisix/admin/ssls/1',
             ngx.HTTP_PUT,
             core.json.encode(data),
             [[{
@@ -459,7 +459,7 @@ location /t {
                     "value": {
                         "sni": "*.test2.com"
                     },
-                    "key": "/apisix/ssl/1"
+                    "key": "/apisix/ssls/1"
                 },
                 "action": "set"
             }]]
@@ -579,7 +579,7 @@ location /t {
 
         local data = {status = 0}
 
-        local code, body = t.test('/apisix/admin/ssl/1',
+        local code, body = t.test('/apisix/admin/ssls/1',
             ngx.HTTP_PATCH,
             core.json.encode(data),
             [[{
@@ -587,7 +587,7 @@ location /t {
                     "value": {
                         "status": 0
                     },
-                    "key": "/apisix/ssl/1"
+                    "key": "/apisix/ssls/1"
                 },
                 "action": "compareAndSwap"
             }]]
@@ -660,7 +660,7 @@ location /t {
 
         local data = {status = 1}
 
-        local code, body = t.test('/apisix/admin/ssl/1',
+        local code, body = t.test('/apisix/admin/ssls/1',
             ngx.HTTP_PATCH,
             core.json.encode(data),
             [[{
@@ -668,7 +668,7 @@ location /t {
                     "value": {
                         "status": 1
                     },
-                    "key": "/apisix/ssl/1"
+                    "key": "/apisix/ssls/1"
                 },
                 "action": "compareAndSwap"
             }]]
@@ -744,7 +744,7 @@ location /t {
         local ssl_key =  t.read_file("t/certs/test2.key")
         local data = {cert = ssl_cert, key = ssl_key, snis = {"test2.com", "*.test2.com"}}
 
-        local code, body = t.test('/apisix/admin/ssl/1',
+        local code, body = t.test('/apisix/admin/ssls/1',
             ngx.HTTP_PUT,
             core.json.encode(data),
             [[{
@@ -752,7 +752,7 @@ location /t {
                     "value": {
                         "snis": ["test2.com", "*.test2.com"]
                     },
-                    "key": "/apisix/ssl/1"
+                    "key": "/apisix/ssls/1"
                 },
                 "action": "set"
             }]]
@@ -874,7 +874,7 @@ location /t {
         local ssl_key =  t.aes_encrypt(t.read_file("t/certs/test2.key"))
         local data = {cert = ssl_cert, key = ssl_key, snis = {"test2.com", "*.test2.com"}}
 
-        local code, body = t.test('/apisix/admin/ssl/1',
+        local code, body = t.test('/apisix/admin/ssls/1',
             ngx.HTTP_PUT,
             core.json.encode(data)
             )
diff --git a/t/router/radixtree-sni2.t b/t/router/radixtree-sni2.t
index 83d1187dc..1a8e6c8da 100644
--- a/t/router/radixtree-sni2.t
+++ b/t/router/radixtree-sni2.t
@@ -45,7 +45,7 @@ location /t {
             sni = "test.com",
         }
 
-        local code, body = t.test('/apisix/admin/ssl/1',
+        local code, body = t.test('/apisix/admin/ssls/1',
             ngx.HTTP_PUT,
             core.json.encode(data),
             [[{
@@ -53,7 +53,7 @@ location /t {
                     "value": {
                         "sni": "test.com"
                     },
-                    "key": "/apisix/ssl/1"
+                    "key": "/apisix/ssls/1"
                 },
                 "action": "set"
             }]]
@@ -167,7 +167,7 @@ location /t {
         local ssl_key =  t.read_file("t/certs/test2.key")
         local data = {cert = ssl_cert, key = ssl_key, sni = "*.test2.com"}
 
-        local code, body = t.test('/apisix/admin/ssl/1',
+        local code, body = t.test('/apisix/admin/ssls/1',
             ngx.HTTP_PUT,
             core.json.encode(data),
             [[{
@@ -175,7 +175,7 @@ location /t {
                     "value": {
                         "sni": "*.test2.com"
                     },
-                    "key": "/apisix/ssl/1"
+                    "key": "/apisix/ssls/1"
                 },
                 "action": "set"
             }]]
@@ -270,7 +270,7 @@ location /t {
             key = raw_ssl_key,
         }
 
-        local code, body = t.test('/apisix/admin/ssl/1',
+        local code, body = t.test('/apisix/admin/ssls/1',
             ngx.HTTP_PUT,
             core.json.encode(data)
             )
@@ -298,7 +298,7 @@ location /t {
         local ssl_key =  t.read_file("t/certs/incorrect.key")
         local data = {cert = ssl_cert, key = ssl_key, sni = "www.test.com"}
 
-        local code, body = t.test('/apisix/admin/ssl/1',
+        local code, body = t.test('/apisix/admin/ssls/1',
             ngx.HTTP_PUT,
             core.json.encode(data)
             )
@@ -412,7 +412,7 @@ location /t {
         local ssl_key =  t.read_file("t/certs/test2.key")
         local data = {cert = ssl_cert, key = ssl_key, sni = "*.TesT2.com"}
 
-        local code, body = t.test('/apisix/admin/ssl/1',
+        local code, body = t.test('/apisix/admin/ssls/1',
             ngx.HTTP_PUT,
             core.json.encode(data)
         )
@@ -477,7 +477,7 @@ location /t {
         local ssl_key =  t.read_file("t/certs/test2.key")
         local data = {cert = ssl_cert, key = ssl_key, snis = {"TesT2.com", "a.com"}}
 
-        local code, body = t.test('/apisix/admin/ssl/1',
+        local code, body = t.test('/apisix/admin/ssls/1',
             ngx.HTTP_PUT,
             core.json.encode(data)
         )
diff --git a/t/stream-node/mtls.t b/t/stream-node/mtls.t
index 3caad2c1b..35dcfc4fd 100644
--- a/t/stream-node/mtls.t
+++ b/t/stream-node/mtls.t
@@ -100,7 +100,7 @@ __DATA__
                     depth = 2,
                 }
             }
-            local code, body = t.test('/apisix/admin/ssl/1',
+            local code, body = t.test('/apisix/admin/ssls/1',
                 ngx.HTTP_PUT,
                 json.encode(data)
             )
diff --git a/t/stream-node/sni.t b/t/stream-node/sni.t
index 0d7131364..291815279 100644
--- a/t/stream-node/sni.t
+++ b/t/stream-node/sni.t
@@ -46,7 +46,7 @@ __DATA__
                 cert = ssl_cert, key = ssl_key,
                 sni = "*.test.com",
             }
-            local code, body = t.test('/apisix/admin/ssl/1',
+            local code, body = t.test('/apisix/admin/ssls/1',
                 ngx.HTTP_PUT,
                 core.json.encode(data)
             )
diff --git a/t/stream-node/tls.t b/t/stream-node/tls.t
index 2f3016b55..7e9568c4d 100644
--- a/t/stream-node/tls.t
+++ b/t/stream-node/tls.t
@@ -46,7 +46,7 @@ __DATA__
                 cert = ssl_cert, key = ssl_key,
                 sni = "test.com",
             }
-            local code, body = t.test('/apisix/admin/ssl/1',
+            local code, body = t.test('/apisix/admin/ssls/1',
                 ngx.HTTP_PUT,
                 core.json.encode(data)
             )
diff --git a/t/stream-node/upstream-tls.t b/t/stream-node/upstream-tls.t
index a9fce58a4..e721d4c35 100644
--- a/t/stream-node/upstream-tls.t
+++ b/t/stream-node/upstream-tls.t
@@ -118,7 +118,7 @@ hello apisix_backend
                 cert = ssl_cert, key = ssl_key,
                 sni = "test.com",
             }
-            local code, body = t.test('/apisix/admin/ssl/1',
+            local code, body = t.test('/apisix/admin/ssls/1',
                 ngx.HTTP_PUT,
                 core.json.encode(data)
             )
diff --git a/utils/create-ssl.py b/utils/create-ssl.py
index 93f206819..cf4735f89 100755
--- a/utils/create-ssl.py
+++ b/utils/create-ssl.py
@@ -30,7 +30,7 @@ with open(sys.argv[2]) as f:
     key = f.read()
 sni = sys.argv[3]
 api_key = "edd1c9f034335f136f87ad84b625c8f1"
-resp = requests.put("http://127.0.0.1:9080/apisix/admin/ssl/1", json={
+resp = requests.put("http://127.0.0.1:9080/apisix/admin/ssls/1", json={
     "cert": cert,
     "key": key,
     "snis": [sni],