Open qrkourier opened 1 year ago
{
"_links": {
"self": {
"href": "./config-types/host.v2"
}
},
"createdAt": "2023-03-10T14:58:29.424Z",
"id": "host.v2",
"tags": {},
"updatedAt": "2023-03-10T14:58:29.424Z",
"name": "host.v2",
"schema": {
"$id": "http://ziti-edge.netfoundry.io/schemas/host.v2.schema.json",
"additionalProperties": false,
"definitions": {
"action": {
"additionalProperties": false,
"properties": {
"action": {
"pattern": "(mark (un)?healthy|increase cost [0-9]+|decrease cost [0-9]+|send event)",
"type": "string"
},
"consecutiveEvents": {
"maximum": 65535,
"minimum": 0,
"type": "integer"
},
"duration": {
"$ref": "#/definitions/duration"
},
"trigger": {
"enum": [
"fail",
"pass",
"change"
],
"type": "string"
}
},
"required": [
"trigger",
"action"
],
"type": "object"
},
"actionList": {
"items": {
"$ref": "#/definitions/action"
},
"maxItems": 20,
"minItems": 1,
"type": "array"
},
"cidr": {
"oneOf": [
{
"pattern": "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/(3[0-2]|[1-2][0-9]|[0-9]))$"
},
{
"pattern": "^s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:)))(%.+)?s*(\/(12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9]))$"
}
],
"type": "string"
},
"dialAddress": {
"oneOf": [
{
"$ref": "#/definitions/ipAddress"
},
{
"$ref": "#/definitions/hostname"
}
]
},
"duration": {
"pattern": "[0-9]+(h|m|s|ms)",
"type": "string"
},
"hostname": {
"format": "hostname",
"not": {
"$ref": "#/definitions/ipAddressFormat"
},
"type": "string"
},
"httpCheck": {
"additionalProperties": false,
"properties": {
"actions": {
"$ref": "#/definitions/actionList"
},
"body": {
"type": "string"
},
"expectInBody": {
"type": "string"
},
"expectStatus": {
"maximum": 599,
"minimum": 100,
"type": "integer"
},
"interval": {
"$ref": "#/definitions/duration"
},
"method": {
"$ref": "#/definitions/method"
},
"timeout": {
"$ref": "#/definitions/duration"
},
"url": {
"type": "string"
}
},
"required": [
"interval",
"timeout",
"url"
],
"type": "object"
},
"httpCheckList": {
"items": {
"$ref": "#/definitions/httpCheck"
},
"type": "array"
},
"inhabitedSet": {
"minItems": 1,
"type": "array",
"uniqueItems": true
},
"ipAddress": {
"$ref": "#/definitions/ipAddressFormat",
"type": "string"
},
"ipAddressFormat": {
"oneOf": [
{
"format": "ipv4"
},
{
"format": "ipv6"
}
]
},
"listenAddress": {
"oneOf": [
{
"$ref": "#/definitions/ipAddress"
},
{
"$ref": "#/definitions/hostname"
},
{
"$ref": "#/definitions/wildcardDomain"
},
{
"$ref": "#/definitions/cidr"
}
]
},
"method": {
"enum": [
"GET",
"POST",
"PUT",
"PATCH"
],
"type": "string"
},
"portCheck": {
"additionalProperties": false,
"properties": {
"actions": {
"$ref": "#/definitions/actionList"
},
"address": {
"type": "string"
},
"interval": {
"$ref": "#/definitions/duration"
},
"timeout": {
"$ref": "#/definitions/duration"
}
},
"required": [
"interval",
"timeout",
"address"
],
"type": "object"
},
"portCheckList": {
"items": {
"$ref": "#/definitions/portCheck"
},
"type": "array"
},
"portNumber": {
"maximum": 65535,
"minimum": 0,
"type": "integer"
},
"portRange": {
"additionalProperties": false,
"properties": {
"high": {
"$ref": "#/definitions/portNumber"
},
"low": {
"$ref": "#/definitions/portNumber"
}
},
"required": [
"low",
"high"
],
"type": "object"
},
"protocolName": {
"enum": [
"tcp",
"udp"
],
"type": "string"
},
"terminator": {
"additionalProperties": false,
"allOf": [
{
"else": {
"required": [
"protocol"
]
},
"if": {
"properties": {
"forwardProtocol": {
"const": true
}
},
"required": [
"forwardProtocol"
]
},
"then": {
"required": [
"allowedProtocols"
]
}
},
{
"else": {
"required": [
"address"
]
},
"if": {
"properties": {
"forwardAddress": {
"const": true
}
},
"required": [
"forwardAddress"
]
},
"then": {
"required": [
"allowedAddresses"
]
}
},
{
"else": {
"required": [
"port"
]
},
"if": {
"properties": {
"forwardPort": {
"const": true
}
},
"required": [
"forwardPort"
]
},
"then": {
"required": [
"allowedPortRanges"
]
}
}
],
"properties": {
"address": {
"$ref": "#/definitions/dialAddress",
"description": "Dial the specified ip address or hostname when a ziti client connects to the service."
},
"allowedAddresses": {
"allOf": [
{
"$ref": "#/definitions/inhabitedSet"
},
{
"items": {
"$ref": "#/definitions/listenAddress"
}
}
],
"description": "Only allow addresses from this set to be dialed"
},
"allowedPortRanges": {
"allOf": [
{
"$ref": "#/definitions/inhabitedSet"
},
{
"items": {
"$ref": "#/definitions/portRange"
}
}
],
"description": "Only allow ports from this set to be dialed"
},
"allowedProtocols": {
"allOf": [
{
"$ref": "#/definitions/inhabitedSet"
},
{
"items": {
"$ref": "#/definitions/protocolName"
}
}
],
"description": "Only allow protocols from this set to be dialed"
},
"allowedSourceAddresses": {
"allOf": [
{
"$ref": "#/definitions/inhabitedSet"
},
{
"items": {
"$ref": "#/definitions/listenAddress"
}
}
],
"description": "hosting tunnelers establish local routes for the specified source addresses so binding will succeed"
},
"forwardAddress": {
"description": "Dial the same ip address that was intercepted at the client tunneler. 'address' and 'forwardAddress' are mutually exclusive.",
"enum": [
true
],
"type": "boolean"
},
"forwardPort": {
"description": "Dial the same port that was intercepted at the client tunneler. 'port' and 'forwardPort' are mutually exclusive.",
"enum": [
true
],
"type": "boolean"
},
"forwardProtocol": {
"description": "Dial the same protocol that was intercepted at the client tunneler. 'protocol' and 'forwardProtocol' are mutually exclusive.",
"enum": [
true
],
"type": "boolean"
},
"httpChecks": {
"$ref": "#/definitions/httpCheckList"
},
"listenOptions": {
"additionalProperties": false,
"properties": {
"bindUsingEdgeIdentity": {
"description": "Associate the hosting terminator with the name of the hosting tunneler's identity. Setting this to 'true' is equivalent to setting 'identiy=$tunneler_id.name'",
"type": "boolean"
},
"connectTimeoutSeconds": {
"$ref": "#/definitions/timeoutSeconds",
"description": "defaults to 5"
},
"cost": {
"description": "defaults to 0",
"maximum": 65535,
"minimum": 0,
"type": "integer"
},
"identity": {
"description": "Associate the hosting terminator with the specified identity. '$tunneler_id.name' resolves to the name of the hosting tunneler's identity. '$tunneler_id.tag[tagName]' resolves to the value of the 'tagName' tag on the hosting tunneler's identity.",
"type": "string"
},
"maxConnections": {
"description": "defaults to 3",
"minimum": 1,
"type": "integer"
},
"precedence": {
"description": "defaults to 'default'",
"enum": [
"default",
"required",
"failed"
],
"type": "string"
}
},
"type": "object"
},
"port": {
"$ref": "#/definitions/portNumber",
"description": "Dial the specified port when a ziti client connects to the service."
},
"portChecks": {
"$ref": "#/definitions/portCheckList"
},
"protocol": {
"$ref": "#/definitions/protocolName",
"description": "Dial the specified protocol when a ziti client connects to the service."
}
},
"type": "object"
},
"terminatorList": {
"items": {
"$ref": "#/definitions/terminator"
},
"minItems": 1,
"type": "array"
},
"timeoutSeconds": {
"maximum": 2147483647,
"minimum": 0,
"type": "integer"
},
"wildcardDomain": {
"pattern": "^\\*\\.(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\\-]*[A-Za-z0-9])$",
"type": "string"
}
},
"properties": {
"terminators": {
"$ref": "#/definitions/terminatorList"
}
},
"required": [
"terminators"
],
"type": "object"
}
}
It would in fact be convenient if the id
was the unique name of the built-in config type. I see I can do this, but only for host.v2
because the others have unpredictable IDs.
GET {{baseUrl}}/config-types/host.v2
When I list the built-in config-types the
id
attributes have several different shapes. That might be for reverse compatibility because the older types have UUIDs and the newer ones have what look like NanoIDs.The id for the
host.v2
type ishost.v2
, though. Is that right or should it be a NanoID?