From 6c90ad340b566590187f2ade7e26310e18da0ac6 Mon Sep 17 00:00:00 2001 From: liuxiran Date: Sat, 19 Dec 2020 20:02:48 -0600 Subject: [PATCH] Update schema to master (#1080) * debug * fix: sort schema.json * fix: unit test remote_addr validate pattern * fix: update remote_addr validate failed msg Co-authored-by: nic-chen --- api/build-tools/schema-sync.lua | 4 + api/conf/schema.json | 101 +++++++++++++++++------ api/internal/core/store/validate_test.go | 6 +- api/test/e2e/route_remote_addr_test.go | 6 +- 4 files changed, 86 insertions(+), 31 deletions(-) diff --git a/api/build-tools/schema-sync.lua b/api/build-tools/schema-sync.lua index f0c49b3399..7e96e964e4 100644 --- a/api/build-tools/schema-sync.lua +++ b/api/build-tools/schema-sync.lua @@ -22,6 +22,8 @@ local fake_module_list = { 'cjson.safe', 'bit', 'lfs', + 'ngx.worker', + 'ngx.errlog', 'ngx.process', 'ngx.re', 'net.url', @@ -80,10 +82,12 @@ ngx.timer = {} ngx.location = {} ngx.socket = {} ngx.thread = {} +ngx.worker = {} ngx.re.gmatch = empty_function ngx.shared = { ["plugin-api-breaker"] = {} } +ngx.shared.internal_status = {} -- additional define for management local time_def = { diff --git a/api/conf/schema.json b/api/conf/schema.json index 855d620aa8..76560bbfa3 100644 --- a/api/conf/schema.json +++ b/api/conf/schema.json @@ -88,7 +88,7 @@ }] }, "ip_def": [{ - "pattern": "^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$", + "format": "ipv4", "title": "IPv4", "type": "string" }, { @@ -96,11 +96,11 @@ "title": "IPv4/CIDR", "type": "string" }, { - "pattern": "^([a-fA-F0-9]{0,4}:){0,8}(:[a-fA-F0-9]{0,4}){0,8}([a-fA-F0-9]{0,4})?$", + "format": "ipv6", "title": "IPv6", "type": "string" }, { - "pattern": "^([a-fA-F0-9]{0,4}:){0,8}(:[a-fA-F0-9]{0,4}){0,8}([a-fA-F0-9]{0,4})?/[0-9]{1,3}$", + "pattern": "^([a-fA-F0-9]{0,4}:){1,8}(:[a-fA-F0-9]{0,4}){0,8}([a-fA-F0-9]{0,4})?/[0-9]{1,3}$", "title": "IPv6/CIDR", "type": "string" }], @@ -147,6 +147,41 @@ }, "route": { "additionalProperties": false, + "allOf": [{ + "oneOf": [{ + "required": ["uri"] + }, { + "required": ["uris"] + }] + }, { + "oneOf": [{ + "not": { + "anyOf": [{ + "required": ["host"] + }, { + "required": ["hosts"] + }] + } + }, { + "required": ["host"] + }, { + "required": ["hosts"] + }] + }, { + "oneOf": [{ + "not": { + "anyOf": [{ + "required": ["remote_addr"] + }, { + "required": ["remote_addrs"] + }] + } + }, { + "required": ["remote_addr"] + }, { + "required": ["remote_addrs"] + }] + }], "anyOf": [{ "required": ["plugins", "uri"] }, { @@ -199,6 +234,7 @@ "pattern": "^\\*?[0-9a-zA-Z-.]+$", "type": "string" }, + "minItems": 1, "type": "array", "uniqueItems": true }, @@ -250,7 +286,7 @@ }, "remote_addr": { "anyOf": [{ - "pattern": "^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$", + "format": "ipv4", "title": "IPv4", "type": "string" }, { @@ -258,11 +294,11 @@ "title": "IPv4/CIDR", "type": "string" }, { - "pattern": "^([a-fA-F0-9]{0,4}:){0,8}(:[a-fA-F0-9]{0,4}){0,8}([a-fA-F0-9]{0,4})?$", + "format": "ipv6", "title": "IPv6", "type": "string" }, { - "pattern": "^([a-fA-F0-9]{0,4}:){0,8}(:[a-fA-F0-9]{0,4}){0,8}([a-fA-F0-9]{0,4})?/[0-9]{1,3}$", + "pattern": "^([a-fA-F0-9]{0,4}:){1,8}(:[a-fA-F0-9]{0,4}){0,8}([a-fA-F0-9]{0,4})?/[0-9]{1,3}$", "title": "IPv6/CIDR", "type": "string" }], @@ -272,7 +308,7 @@ "remote_addrs": { "items": { "anyOf": [{ - "pattern": "^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$", + "format": "ipv4", "title": "IPv4", "type": "string" }, { @@ -280,17 +316,18 @@ "title": "IPv4/CIDR", "type": "string" }, { - "pattern": "^([a-fA-F0-9]{0,4}:){0,8}(:[a-fA-F0-9]{0,4}){0,8}([a-fA-F0-9]{0,4})?$", + "format": "ipv6", "title": "IPv6", "type": "string" }, { - "pattern": "^([a-fA-F0-9]{0,4}:){0,8}(:[a-fA-F0-9]{0,4}){0,8}([a-fA-F0-9]{0,4})?/[0-9]{1,3}$", + "pattern": "^([a-fA-F0-9]{0,4}:){1,8}(:[a-fA-F0-9]{0,4}){0,8}([a-fA-F0-9]{0,4})?/[0-9]{1,3}$", "title": "IPv6/CIDR", "type": "string" }], "description": "client IP", "type": "string" }, + "minItems": 1, "type": "array", "uniqueItems": true }, @@ -313,6 +350,12 @@ "service_protocol": { "enum": ["grpc", "http"] }, + "status": { + "default": 1, + "description": "route status, 1 to enable, 0 to disable", + "enum": [0, 1], + "type": "integer" + }, "update_time": { "type": "integer" }, @@ -707,6 +750,7 @@ "description": "HTTP uri", "type": "string" }, + "minItems": 1, "type": "array", "uniqueItems": true }, @@ -1281,7 +1325,7 @@ }, "remote_addr": { "anyOf": [{ - "pattern": "^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$", + "format": "ipv4", "title": "IPv4", "type": "string" }, { @@ -1289,11 +1333,11 @@ "title": "IPv4/CIDR", "type": "string" }, { - "pattern": "^([a-fA-F0-9]{0,4}:){0,8}(:[a-fA-F0-9]{0,4}){0,8}([a-fA-F0-9]{0,4})?$", + "format": "ipv6", "title": "IPv6", "type": "string" }, { - "pattern": "^([a-fA-F0-9]{0,4}:){0,8}(:[a-fA-F0-9]{0,4}){0,8}([a-fA-F0-9]{0,4})?/[0-9]{1,3}$", + "pattern": "^([a-fA-F0-9]{0,4}:){1,8}(:[a-fA-F0-9]{0,4}){0,8}([a-fA-F0-9]{0,4})?/[0-9]{1,3}$", "title": "IPv6/CIDR", "type": "string" }], @@ -1302,7 +1346,7 @@ }, "server_addr": { "anyOf": [{ - "pattern": "^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$", + "format": "ipv4", "title": "IPv4", "type": "string" }, { @@ -1310,11 +1354,11 @@ "title": "IPv4/CIDR", "type": "string" }, { - "pattern": "^([a-fA-F0-9]{0,4}:){0,8}(:[a-fA-F0-9]{0,4}){0,8}([a-fA-F0-9]{0,4})?$", + "format": "ipv6", "title": "IPv6", "type": "string" }, { - "pattern": "^([a-fA-F0-9]{0,4}:){0,8}(:[a-fA-F0-9]{0,4}){0,8}([a-fA-F0-9]{0,4})?/[0-9]{1,3}$", + "pattern": "^([a-fA-F0-9]{0,4}:){1,8}(:[a-fA-F0-9]{0,4}){0,8}([a-fA-F0-9]{0,4})?/[0-9]{1,3}$", "title": "IPv6/CIDR", "type": "string" }], @@ -2307,7 +2351,7 @@ "properties": { "allow_credential": { "default": false, - "description": "allow client append credential. according to CORS specification, if you set this option to 'true', you can not use '*' for other options.", + "description": "allow client append credential. according to CORS specification,if you set this option to 'true', you can not use '*' for other options.", "type": "boolean" }, "allow_headers": { @@ -2406,7 +2450,6 @@ "minProperties": 1, "properties": { "abort": { - "minProperties": 1, "properties": { "body": { "minLength": 0, @@ -2422,10 +2465,10 @@ "type": "integer" } }, + "required": ["http_status"], "type": "object" }, "delay": { - "minProperties": 1, "properties": { "duration": { "minimum": 0, @@ -2437,6 +2480,7 @@ "type": "integer" } }, + "required": ["duration"], "type": "object" } }, @@ -2620,7 +2664,7 @@ "whitelist": { "items": { "anyOf": [{ - "pattern": "^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$", + "format": "ipv4", "title": "IPv4", "type": "string" }, { @@ -2628,11 +2672,11 @@ "title": "IPv4/CIDR", "type": "string" }, { - "pattern": "^([a-fA-F0-9]{0,4}:){0,8}(:[a-fA-F0-9]{0,4}){0,8}([a-fA-F0-9]{0,4})?$", + "format": "ipv6", "title": "IPv6", "type": "string" }, { - "pattern": "^([a-fA-F0-9]{0,4}:){0,8}(:[a-fA-F0-9]{0,4}){0,8}([a-fA-F0-9]{0,4})?/[0-9]{1,3}$", + "pattern": "^([a-fA-F0-9]{0,4}:){1,8}(:[a-fA-F0-9]{0,4}){0,8}([a-fA-F0-9]{0,4})?/[0-9]{1,3}$", "title": "IPv6/CIDR", "type": "string" }] @@ -2649,7 +2693,7 @@ "blacklist": { "items": { "anyOf": [{ - "pattern": "^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$", + "format": "ipv4", "title": "IPv4", "type": "string" }, { @@ -2657,11 +2701,11 @@ "title": "IPv4/CIDR", "type": "string" }, { - "pattern": "^([a-fA-F0-9]{0,4}:){0,8}(:[a-fA-F0-9]{0,4}){0,8}([a-fA-F0-9]{0,4})?$", + "format": "ipv6", "title": "IPv6", "type": "string" }, { - "pattern": "^([a-fA-F0-9]{0,4}:){0,8}(:[a-fA-F0-9]{0,4}){0,8}([a-fA-F0-9]{0,4})?/[0-9]{1,3}$", + "pattern": "^([a-fA-F0-9]{0,4}:){1,8}(:[a-fA-F0-9]{0,4}){0,8}([a-fA-F0-9]{0,4})?/[0-9]{1,3}$", "title": "IPv6/CIDR", "type": "string" }] @@ -2891,6 +2935,7 @@ "type": "integer" }, "key": { + "default": "remote_addr", "enum": ["consumer_name", "http_x_forwarded_for", "http_x_real_ip", "remote_addr", "server_addr", "service_id"], "type": "string" }, @@ -2910,7 +2955,7 @@ "type": "integer" } }, - "required": ["count", "key", "time_window"], + "required": ["count", "time_window"], "type": "object" } }, @@ -3240,6 +3285,12 @@ "type": "object" } }, + "server-info": { + "schema": { + "additionalProperties": false, + "type": "object" + } + }, "serverless-post-function": { "schema": { "properties": { diff --git a/api/internal/core/store/validate_test.go b/api/internal/core/store/validate_test.go index fd38dbfc4e..b50586d258 100644 --- a/api/internal/core/store/validate_test.go +++ b/api/internal/core/store/validate_test.go @@ -362,7 +362,7 @@ func TestAPISIXJsonSchemaValidator_Route_checkRemoteAddr(t *testing.T) { }, "remote_addr": "127.0.0." }`, - wantValidateErr: fmt.Errorf("schema validate failed: remote_addr: Must validate at least one schema (anyOf)\nremote_addr: Does not match pattern '^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$'"), + wantValidateErr: fmt.Errorf("schema validate failed: remote_addr: Must validate at least one schema (anyOf)\nremote_addr: Does not match format 'ipv4'"), }, { caseDesc: "correct remote_addrs", @@ -395,7 +395,7 @@ func TestAPISIXJsonSchemaValidator_Route_checkRemoteAddr(t *testing.T) { }, "remote_addrs": ["127.0.0.", "192.0.0.0/128", "::1"] }`, - wantValidateErr: fmt.Errorf("schema validate failed: remote_addrs.0: Must validate at least one schema (anyOf)\nremote_addrs.0: Does not match pattern '^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$'\nremote_addrs.1: Must validate at least one schema (anyOf)\nremote_addrs.1: Does not match pattern '^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$'"), + wantValidateErr: fmt.Errorf("schema validate failed: remote_addrs.0: Must validate at least one schema (anyOf)\nremote_addrs.0: Does not match format 'ipv4'\nremote_addrs.1: Must validate at least one schema (anyOf)\nremote_addrs.1: Does not match format 'ipv4'"), }, { caseDesc: "invalid remote_addrs (an empty string item)", @@ -412,7 +412,7 @@ func TestAPISIXJsonSchemaValidator_Route_checkRemoteAddr(t *testing.T) { }, "remote_addrs": [""] }`, - wantValidateErr: fmt.Errorf("schema validate failed: invalid field remote_addrs"), + wantValidateErr: fmt.Errorf("schema validate failed: remote_addrs.0: Must validate at least one schema (anyOf)\nremote_addrs.0: Does not match format 'ipv4'"), }, } diff --git a/api/test/e2e/route_remote_addr_test.go b/api/test/e2e/route_remote_addr_test.go index 8cdf6e3225..7bceed0e79 100644 --- a/api/test/e2e/route_remote_addr_test.go +++ b/api/test/e2e/route_remote_addr_test.go @@ -42,7 +42,7 @@ func TestRoute_add_with_invalid_remote_addr(t *testing.T) { }`, Headers: map[string]string{"Authorization": token}, ExpectStatus: http.StatusBadRequest, - ExpectBody: "\"code\":10000,\"message\":\"schema validate failed: remote_addr: Must validate at least one schema (anyOf)\\nremote_addr: Does not match pattern '^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$'\"", + ExpectBody: "\"code\":10000,\"message\":\"schema validate failed: remote_addr: Must validate at least one schema (anyOf)\\nremote_addr: Does not match format 'ipv4'\"", }, { caseDesc: "verify route", @@ -72,7 +72,7 @@ func TestRoute_add_with_invalid_remote_addr(t *testing.T) { }`, Headers: map[string]string{"Authorization": token}, ExpectStatus: http.StatusBadRequest, - ExpectBody: "\"code\":10000,\"message\":\"schema validate failed: remote_addr: Must validate at least one schema (anyOf)\\nremote_addr: Does not match pattern '^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$'\"", + ExpectBody: "\"code\":10000,\"message\":\"schema validate failed: remote_addr: Must validate at least one schema (anyOf)\\nremote_addr: Does not match format 'ipv4'\"", }, { caseDesc: "verify route", @@ -102,7 +102,7 @@ func TestRoute_add_with_invalid_remote_addr(t *testing.T) { }`, Headers: map[string]string{"Authorization": token}, ExpectStatus: http.StatusBadRequest, - ExpectBody: "\"code\":10000,\"message\":\"schema validate failed: remote_addrs.1: Must validate at least one schema (anyOf)\\nremote_addrs.1: Does not match pattern '^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$'\"", + ExpectBody: "\"code\":10000,\"message\":\"schema validate failed: remote_addrs.1: Must validate at least one schema (anyOf)\\nremote_addrs.1: Does not match format 'ipv4'\"", }, { caseDesc: "verify route",