add examples to response

This commit is contained in:
Pascal Fischer
2023-05-05 18:00:13 +02:00
parent 2b65de30e4
commit adf57d5294
16 changed files with 1174 additions and 180 deletions

View File

@@ -49,8 +49,9 @@ export type schemaParameter = {
enum?: string[]
}
export type schemaObject = {
examples: Object
export type component = {
example: Object
schema: Object
parameters: schemaParameter[]
}
@@ -77,31 +78,39 @@ async function gen_v3(spec: OpenAPIV3.Document, dest: string, { apiUrl }: { apiU
})
})
let schemas = new Map<string, schemaObject>();
let components = new Map<string, component>();
Object.entries(spec.components?.schemas).forEach(([key, val]) => {
const schema = val as OpenAPIV3.SchemaObject
let examples = new Map<string, any>();
let outputSchema = new Map<string, any>();
let outputExample = new Map<string, any>();
let parameters : schemaParameter[] = []
if(schema.allOf){
schema.allOf.forEach((item) => {
if((item as OpenAPIV3.ReferenceObject).$ref){
let schemaObject = schemas.get((item as OpenAPIV3.ReferenceObject).$ref.split('/').pop())
let examplesMap = new Map(Object.entries(schemaObject.examples))
examplesMap.forEach((value, key) => {
examples.set(key, value)
let component = components.get((item as OpenAPIV3.ReferenceObject).$ref.split('/').pop())
let schemaMap = new Map(Object.entries(component.schema))
let exampleMap = new Map(Object.entries(component.example))
schemaMap.forEach((value, key) => {
outputSchema.set(key, value)
})
parameters = parameters.concat(schemaObject.parameters)
exampleMap.forEach((value, key) => {
outputExample.set(key, value)
})
parameters = parameters.concat(component.parameters)
}
if((item as OpenAPIV3.SchemaObject).properties){
Object.entries((item as OpenAPIV3.SchemaObject).properties).forEach(([key, val]) => {
let property = val as OpenAPIV3.SchemaObject
let type
let type, exampleValue
if (property.type === "array") {
type = new Array(resolveType(property.items, spec.components?.schemas))
exampleValue = new Array(resolveExampleValue(property.items, spec.components?.schemas))
} else {
type = resolveType(property, spec.components?.schemas)
exampleValue = resolveExampleValue(property, spec.components?.schemas)
}
examples.set(key, type)
outputSchema.set(key, type)
outputExample.set(key, exampleValue)
let parameter: schemaParameter = {
name: key,
type: property.type === "array" ? ((property.items as OpenAPIV3.SchemaObject).type || (property.items as OpenAPIV3.ReferenceObject).$ref.split('/').pop()) + "[]" : property.type,
@@ -120,13 +129,16 @@ async function gen_v3(spec: OpenAPIV3.Document, dest: string, { apiUrl }: { apiU
} else {
Object.entries(schema.properties).forEach(([key, val]) => {
let property = val as OpenAPIV3.SchemaObject
let type
let type, exampleValue
if(property.type === "array"){
type = new Array(resolveType(property.items, spec.components?.schemas))
exampleValue = new Array(resolveExampleValue(property.items, spec.components?.schemas))
} else {
type = resolveType(property, spec.components?.schemas)
exampleValue = resolveExampleValue(property, spec.components?.schemas)
}
examples.set(key, type)
outputSchema.set(key, type)
outputExample.set(key, exampleValue)
let parameter : schemaParameter = {
name: key,
type: property.type === "array" ? ((property.items as OpenAPIV3.SchemaObject).type || (property.items as OpenAPIV3.ReferenceObject).$ref.split('/').pop()) + "[]" : property.type,
@@ -142,12 +154,12 @@ async function gen_v3(spec: OpenAPIV3.Document, dest: string, { apiUrl }: { apiU
})
}
let output : schemaObject = {
examples: Object.fromEntries(examples),
let output : component = {
example: Object.fromEntries(outputExample),
schema: Object.fromEntries(outputSchema),
parameters: parameters
}
schemas.set(key, output)
components.set(key, output)
})
@@ -169,7 +181,7 @@ async function gen_v3(spec: OpenAPIV3.Document, dest: string, { apiUrl }: { apiU
tag: key,
sections,
operations,
schemas,
components,
})
// Write to disk
@@ -198,3 +210,23 @@ function resolveType(items: OpenAPIV3.ReferenceObject | OpenAPIV3.SchemaObject |
return (items as OpenAPIV3.ArraySchemaObject).type
}
function resolveExampleValue(items: OpenAPIV3.ReferenceObject | OpenAPIV3.SchemaObject | OpenAPIV3.NonArraySchemaObjectType, schemas) : any {
if((items as OpenAPIV3.ReferenceObject).$ref){
let ref = (items as OpenAPIV3.ReferenceObject).$ref
let map = new Map<string, any>()
Object.entries(schemas[ref.split('/').pop()].properties).forEach(([key, val]) => {
let property = val as OpenAPIV3.SchemaObject
let exampleValue
if(property.type === "array"){
exampleValue = new Array(resolveExampleValue(property.items, schemas))
} else {
exampleValue = resolveExampleValue(property, schemas)
}
map.set(key, exampleValue)
})
return Object.fromEntries(map)
}
return (items as OpenAPIV3.ArraySchemaObject).example
}

View File

@@ -158,7 +158,7 @@
"/api/users" : {
"get" : {
"tags" : [ "Users" ],
"summary" : "Retrieve Users",
"summary" : "List all Users",
"description" : "Returns a list of all users",
"operationId" : "getUsers",
"parameters" : [ {
@@ -2325,7 +2325,8 @@
"properties" : {
"id" : {
"type" : "string",
"description" : "Account ID"
"description" : "Account ID",
"example" : "ch8i4ug6lnn4g9hqv7l0"
},
"settings" : {
"$ref" : "#/components/schemas/AccountSettings"
@@ -2337,11 +2338,13 @@
"properties" : {
"peer_login_expiration_enabled" : {
"type" : "boolean",
"description" : "Enables or disables peer login expiration globally. After peer's login has expired the user has to log in (authenticate). Applies only to peers that were added by a user (interactive SSO login)."
"description" : "Enables or disables peer login expiration globally. After peer's login has expired the user has to log in (authenticate). Applies only to peers that were added by a user (interactive SSO login).",
"example" : true
},
"peer_login_expiration" : {
"type" : "integer",
"description" : "Period of time after which peer login expires (seconds)."
"description" : "Period of time after which peer login expires (seconds).",
"example" : 43200
}
}
},
@@ -2351,41 +2354,49 @@
"properties" : {
"id" : {
"type" : "string",
"description" : "User ID"
"description" : "User ID",
"example" : "google-oauth2|277474792786460067937"
},
"email" : {
"type" : "string",
"description" : "User's email address"
"description" : "User's email address",
"example" : "demo@netbird.io"
},
"name" : {
"type" : "string",
"description" : "User's name from idp provider"
"description" : "User's name from idp provider",
"example" : "Tom Schulz"
},
"role" : {
"type" : "string",
"description" : "User's NetBird account role"
"description" : "User's NetBird account role",
"example" : "admin"
},
"status" : {
"type" : "string",
"description" : "User's status",
"example" : "active",
"enum" : [ "active", "invited", "disabled" ]
},
"auto_groups" : {
"type" : "array",
"description" : "Groups to auto-assign to peers registered by this user",
"items" : {
"type" : "string"
"type" : "string",
"example" : "devs"
}
},
"is_current" : {
"type" : "boolean",
"description" : "Is true if authenticated user is the same as this user",
"readOnly" : true
"readOnly" : true,
"example" : true
},
"is_service_user" : {
"type" : "boolean",
"description" : "Is true if this user is a service user",
"readOnly" : true
"readOnly" : true,
"example" : false
}
}
},
@@ -2395,13 +2406,15 @@
"properties" : {
"role" : {
"type" : "string",
"description" : "User's NetBird account role"
"description" : "User's NetBird account role",
"example" : "admin"
},
"auto_groups" : {
"type" : "array",
"description" : "Groups to auto-assign to peers registered by this user",
"items" : {
"type" : "string"
"type" : "string",
"example" : "devs"
}
}
}
@@ -2412,26 +2425,31 @@
"properties" : {
"email" : {
"type" : "string",
"description" : "User's Email to send invite to"
"description" : "User's Email to send invite to",
"example" : "demo@netbird.io"
},
"name" : {
"type" : "string",
"description" : "User's full name"
"description" : "User's full name",
"example" : "Tom Schulz"
},
"role" : {
"type" : "string",
"description" : "User's NetBird account role"
"description" : "User's NetBird account role",
"example" : "admin"
},
"auto_groups" : {
"type" : "array",
"description" : "Groups to auto-assign to peers registered by this user",
"items" : {
"type" : "string"
"type" : "string",
"example" : "devs"
}
},
"is_service_user" : {
"type" : "boolean",
"description" : "Is true if this user is a service user"
"description" : "Is true if this user is a service user",
"example" : false
}
}
},
@@ -2441,11 +2459,13 @@
"properties" : {
"id" : {
"type" : "string",
"description" : "Peer ID"
"description" : "Peer ID",
"example" : "chacbco6lnnbn6cg5s90"
},
"name" : {
"type" : "string",
"description" : "Peer's hostname"
"description" : "Peer's hostname",
"example" : "stage-host-1"
}
}
},
@@ -2454,13 +2474,16 @@
"type" : "object",
"properties" : {
"name" : {
"type" : "string"
"type" : "string",
"example" : "stage-host-1"
},
"ssh_enabled" : {
"type" : "boolean"
"type" : "boolean",
"example" : true
},
"login_expiration_enabled" : {
"type" : "boolean"
"type" : "boolean",
"example" : false
}
}
},
@@ -2473,24 +2496,29 @@
"properties" : {
"ip" : {
"type" : "string",
"description" : "Peer's IP address"
"description" : "Peer's IP address",
"example" : "10.64.0.1"
},
"connected" : {
"type" : "boolean",
"description" : "Peer to Management connection status"
"description" : "Peer to Management connection status",
"example" : true
},
"last_seen" : {
"type" : "string",
"description" : "Last time peer connected to Netbird's management service",
"format" : "date-time"
"format" : "date-time",
"example" : "2023-05-05T10:05:26.420578Z"
},
"os" : {
"type" : "string",
"description" : "Peer's operating system and version"
"description" : "Peer's operating system and version",
"example" : "Darwin 13.2.1"
},
"version" : {
"type" : "string",
"description" : "Peer's daemon or cli version"
"description" : "Peer's daemon or cli version",
"example" : "0.14.0"
},
"groups" : {
"type" : "array",
@@ -2501,36 +2529,44 @@
},
"ssh_enabled" : {
"type" : "boolean",
"description" : "Indicates whether SSH server is enabled on this peer"
"description" : "Indicates whether SSH server is enabled on this peer",
"example" : true
},
"user_id" : {
"type" : "string",
"description" : "User ID of the user that enrolled this peer"
"description" : "User ID of the user that enrolled this peer",
"example" : "google-oauth2|277474792786460067937"
},
"hostname" : {
"type" : "string",
"description" : "Hostname of the machine"
"description" : "Hostname of the machine",
"example" : "stage-host-1"
},
"ui_version" : {
"type" : "string",
"description" : "Peer's desktop UI version"
"description" : "Peer's desktop UI version",
"example" : "0.14.0"
},
"dns_label" : {
"type" : "string",
"description" : "Peer's DNS label is the parsed peer name for domain resolution. It is used to form an FQDN by appending the account's domain to the peer label. e.g. peer-dns-label.netbird.cloud"
"description" : "Peer's DNS label is the parsed peer name for domain resolution. It is used to form an FQDN by appending the account's domain to the peer label. e.g. peer-dns-label.netbird.cloud",
"example" : "stage-host-1.netbird.cloud"
},
"login_expiration_enabled" : {
"type" : "boolean",
"description" : "Indicates whether peer login expiration has been enabled or not"
"description" : "Indicates whether peer login expiration has been enabled or not",
"example" : false
},
"login_expired" : {
"type" : "boolean",
"description" : "Indicates whether peer's login expired or not"
"description" : "Indicates whether peer's login expired or not",
"example" : false
},
"last_login" : {
"type" : "string",
"description" : "Last time this peer performed log in (authentication). E.g., user authenticated.",
"format" : "date-time"
"format" : "date-time",
"example" : "2023-05-05T09:00:35.477782Z"
}
}
} ]
@@ -2541,61 +2577,74 @@
"properties" : {
"id" : {
"type" : "string",
"description" : "Setup Key ID"
"description" : "Setup Key ID",
"example" : "2531583362"
},
"key" : {
"type" : "string",
"description" : "Setup Key value"
"description" : "Setup Key value",
"example" : "A616097E-FCF0-48FA-9354-CA4A61142761"
},
"name" : {
"type" : "string",
"description" : "Setup key name identifier"
"description" : "Setup key name identifier",
"example" : "Default key"
},
"expires" : {
"type" : "string",
"description" : "Setup Key expiration date",
"format" : "date-time"
"format" : "date-time",
"example" : "2023-06-01T14:47:22.291057Z"
},
"type" : {
"type" : "string",
"description" : "Setup key type, one-off for single time usage and reusable"
"description" : "Setup key type, one-off for single time usage and reusable",
"example" : "reusable"
},
"valid" : {
"type" : "boolean",
"description" : "Setup key validity status"
"description" : "Setup key validity status",
"example" : true
},
"revoked" : {
"type" : "boolean",
"description" : "Setup key revocation status"
"description" : "Setup key revocation status",
"example" : false
},
"used_times" : {
"type" : "integer",
"description" : "Usage count of setup key"
"description" : "Usage count of setup key",
"example" : 2
},
"last_used" : {
"type" : "string",
"description" : "Setup key last usage date",
"format" : "date-time"
"format" : "date-time",
"example" : "2023-05-05T09:00:35.477782Z"
},
"state" : {
"type" : "string",
"description" : "Setup key status, \"valid\", \"overused\",\"expired\" or \"revoked\""
"description" : "Setup key status, \"valid\", \"overused\",\"expired\" or \"revoked\"",
"example" : "valid"
},
"auto_groups" : {
"type" : "array",
"description" : "Setup key groups to auto-assign to peers registered with this key",
"items" : {
"type" : "string"
"type" : "string",
"example" : "devs"
}
},
"updated_at" : {
"type" : "string",
"description" : "Setup key last update date",
"format" : "date-time"
"format" : "date-time",
"example" : "2023-05-05T09:00:35.477782Z"
},
"usage_limit" : {
"type" : "integer",
"description" : "A number of times this key can be used. The value of 0 indicates the unlimited usage."
"description" : "A number of times this key can be used. The value of 0 indicates the unlimited usage.",
"example" : 0
}
}
},
@@ -2605,30 +2654,36 @@
"properties" : {
"name" : {
"type" : "string",
"description" : "Setup Key name"
"description" : "Setup Key name",
"example" : "Default key"
},
"type" : {
"type" : "string",
"description" : "Setup key type, one-off for single time usage and reusable"
"description" : "Setup key type, one-off for single time usage and reusable",
"example" : "reusable"
},
"expires_in" : {
"type" : "integer",
"description" : "Expiration time in seconds"
"description" : "Expiration time in seconds",
"example" : 43200
},
"revoked" : {
"type" : "boolean",
"description" : "Setup key revocation status"
"description" : "Setup key revocation status",
"example" : false
},
"auto_groups" : {
"type" : "array",
"description" : "Setup key groups to auto-assign to peers registered with this key",
"items" : {
"type" : "string"
"type" : "string",
"example" : "devs"
}
},
"usage_limit" : {
"type" : "integer",
"description" : "A number of times this key can be used. The value of 0 indicates the unlimited usage."
"description" : "A number of times this key can be used. The value of 0 indicates the unlimited usage.",
"example" : 0
}
}
},
@@ -2638,30 +2693,36 @@
"properties" : {
"id" : {
"type" : "string",
"description" : "ID of a token"
"description" : "ID of a token",
"example" : "ch8i54g6lnn4g9hqv7n0"
},
"name" : {
"type" : "string",
"description" : "Name of the token"
"description" : "Name of the token",
"example" : "My first token"
},
"expiration_date" : {
"type" : "string",
"description" : "Date the token expires",
"format" : "date-time"
"format" : "date-time",
"example" : "2023-05-05T14:38:28.977616Z"
},
"created_by" : {
"type" : "string",
"description" : "User ID of the user who created the token"
"description" : "User ID of the user who created the token",
"example" : "google-oauth2|277474792786460067937"
},
"created_at" : {
"type" : "string",
"description" : "Date the token was created",
"format" : "date-time"
"format" : "date-time",
"example" : "2023-05-02T14:48:20.465209Z"
},
"last_used" : {
"type" : "string",
"description" : "Date the token was last used",
"format" : "date-time"
"format" : "date-time",
"example" : "2023-05-04T12:45:25.9723616Z"
}
}
},
@@ -2671,7 +2732,8 @@
"properties" : {
"plain_token" : {
"type" : "string",
"description" : "Plain text representation of the generated token"
"description" : "Plain text representation of the generated token",
"example" : "2023-05-02T14:48:20.465209Z"
},
"personal_access_token" : {
"$ref" : "#/components/schemas/PersonalAccessToken"
@@ -2684,13 +2746,15 @@
"properties" : {
"name" : {
"type" : "string",
"description" : "Name of the token"
"description" : "Name of the token",
"example" : "My first token"
},
"expires_in" : {
"maximum" : 365,
"minimum" : 1,
"type" : "integer",
"description" : "Expiration in days"
"description" : "Expiration in days",
"example" : 30
}
}
},
@@ -2700,15 +2764,18 @@
"properties" : {
"id" : {
"type" : "string",
"description" : "Group ID"
"description" : "Group ID",
"example" : "ch8i4ug6lnn4g9hqv7m0"
},
"name" : {
"type" : "string",
"description" : "Group Name identifier"
"description" : "Group Name identifier",
"example" : "devs"
},
"peers_count" : {
"type" : "integer",
"description" : "Count of peers associated to the group"
"description" : "Count of peers associated to the group",
"example" : 2
}
}
},
@@ -2718,11 +2785,13 @@
"properties" : {
"name" : {
"type" : "string",
"description" : "Group name identifier"
"description" : "Group name identifier",
"example" : "devs"
},
"peers" : {
"type" : "array",
"description" : "List of peers ids",
"example" : "ch8i4ug6lnn4g9hqv7m1",
"items" : {
"type" : "string"
}
@@ -2752,19 +2821,23 @@
"properties" : {
"name" : {
"type" : "string",
"description" : "Rule name identifier"
"description" : "Rule name identifier",
"example" : "Default"
},
"description" : {
"type" : "string",
"description" : "Rule friendly description"
"description" : "Rule friendly description",
"example" : "This is a default rule that allows connections between all the resources"
},
"disabled" : {
"type" : "boolean",
"description" : "Rules status"
"description" : "Rules status",
"example" : false
},
"flow" : {
"type" : "string",
"description" : "Rule flow, currently, only \"bidirect\" for bi-directional traffic is accepted"
"description" : "Rule flow, currently, only \"bidirect\" for bi-directional traffic is accepted",
"example" : "bidirect"
}
}
},
@@ -2778,14 +2851,16 @@
"type" : "array",
"description" : "List of source groups",
"items" : {
"type" : "string"
"type" : "string",
"example" : "ch8i4ug6lnn4g9hqv7m1"
}
},
"destinations" : {
"type" : "array",
"description" : "List of destination groups",
"items" : {
"type" : "string"
"type" : "string",
"example" : "ch8i4ug6lnn4g9hqv7m0"
}
}
}
@@ -2798,7 +2873,8 @@
"properties" : {
"id" : {
"type" : "string",
"description" : "Rule ID"
"description" : "Rule ID",
"example" : "ch8i4ug6lnn4g9hqv7mg"
}
}
}, {
@@ -2830,19 +2906,23 @@
"properties" : {
"id" : {
"type" : "string",
"description" : "Rule ID"
"description" : "Rule ID",
"example" : "ch8i4ug6lnn4g9hqv7mg"
},
"name" : {
"type" : "string",
"description" : "Rule name identifier"
"description" : "Rule name identifier",
"example" : "Default"
},
"description" : {
"type" : "string",
"description" : "Rule friendly description"
"description" : "Rule friendly description",
"example" : "This is a default rule that allows connections between all the resources"
},
"enabled" : {
"type" : "boolean",
"description" : "Rules status"
"description" : "Rules status",
"example" : true
},
"sources" : {
"type" : "array",
@@ -2861,6 +2941,7 @@
"action" : {
"type" : "string",
"description" : "policy accept or drops packets",
"example" : "accept",
"enum" : [ "accept", "drop" ]
}
}
@@ -2871,19 +2952,23 @@
"properties" : {
"name" : {
"type" : "string",
"description" : "Policy name identifier"
"description" : "Policy name identifier",
"example" : "ch8i4ug6lnn4g9hqv7mg"
},
"description" : {
"type" : "string",
"description" : "Policy friendly description"
"description" : "Policy friendly description",
"example" : "This is a default policy that allows connections between all the resources"
},
"enabled" : {
"type" : "boolean",
"description" : "Policy status"
"description" : "Policy status",
"example" : true
},
"query" : {
"type" : "string",
"description" : "Policy Rego query"
"description" : "Policy Rego query",
"example" : "package netbird\\n\\nall[rule] {\\n is_peer_in_any_group([\\\"ch8i4ug6lnn4g9hqv7m0\\\",\\\"ch8i4ug6lnn4g9hqv7m0\\\"])\\n rule := {\\n rules_from_group(\\\"ch8i4ug6lnn4g9hqv7m0\\\", \\\"dst\\\", \\\"accept\\\", \\\"\\\"),\\n rules_from_group(\\\"ch8i4ug6lnn4g9hqv7m0\\\", \\\"src\\\", \\\"accept\\\", \\\"\\\"),\\n }[_][_]\\n}\\n"
},
"rules" : {
"type" : "array",
@@ -2903,7 +2988,8 @@
"properties" : {
"id" : {
"type" : "string",
"description" : "Policy ID"
"description" : "Policy ID",
"example" : "ch8i4ug6lnn4g9hqv7mg"
}
}
} ]
@@ -2914,41 +3000,49 @@
"properties" : {
"description" : {
"type" : "string",
"description" : "Route description"
"description" : "Route description",
"example" : "My first route"
},
"network_id" : {
"maxLength" : 40,
"minLength" : 1,
"type" : "string",
"description" : "Route network identifier, to group HA routes"
"description" : "Route network identifier, to group HA routes",
"example" : "Route 1"
},
"enabled" : {
"type" : "boolean",
"description" : "Route status"
"description" : "Route status",
"example" : true
},
"peer" : {
"type" : "string",
"description" : "Peer Identifier associated with route"
"description" : "Peer Identifier associated with route",
"example" : "chacbco6lnnbn6cg5s91"
},
"network" : {
"type" : "string",
"description" : "Network range in CIDR format"
"description" : "Network range in CIDR format",
"example" : "10.64.0.0/24"
},
"metric" : {
"maximum" : 9999,
"minimum" : 1,
"type" : "integer",
"description" : "Route metric number. Lowest number has higher priority"
"description" : "Route metric number. Lowest number has higher priority",
"example" : 9999
},
"masquerade" : {
"type" : "boolean",
"description" : "Indicate if peer should masquerade traffic to this route's prefix"
"description" : "Indicate if peer should masquerade traffic to this route's prefix",
"example" : true
},
"groups" : {
"type" : "array",
"description" : "Route group tag groups",
"items" : {
"type" : "string"
"type" : "string",
"example" : "chacdk86lnnboviihd70"
}
}
}
@@ -2960,11 +3054,13 @@
"properties" : {
"id" : {
"type" : "string",
"description" : "Route Id"
"description" : "Route Id",
"example" : "chacdk86lnnboviihd7g"
},
"network_type" : {
"type" : "string",
"description" : "Network type indicating if it is IPv4 or IPv6"
"description" : "Network type indicating if it is IPv4 or IPv6",
"example" : "IPv4"
}
}
}, {
@@ -2977,16 +3073,19 @@
"properties" : {
"ip" : {
"type" : "string",
"description" : "Nameserver IP"
"description" : "Nameserver IP",
"example" : "8.8.8.8"
},
"ns_type" : {
"type" : "string",
"description" : "Nameserver Type",
"example" : "udp",
"enum" : [ "udp" ]
},
"port" : {
"type" : "integer",
"description" : "Nameserver Port"
"description" : "Nameserver Port",
"example" : 53
}
}
},
@@ -2998,11 +3097,13 @@
"maxLength" : 40,
"minLength" : 1,
"type" : "string",
"description" : "Nameserver group name"
"description" : "Nameserver group name",
"example" : "Google DNS"
},
"description" : {
"type" : "string",
"description" : "Nameserver group description"
"description" : "Nameserver group description",
"example" : "Google DNS servers"
},
"nameservers" : {
"maxLength" : 2,
@@ -3015,18 +3116,21 @@
},
"enabled" : {
"type" : "boolean",
"description" : "Nameserver group status"
"description" : "Nameserver group status",
"example" : true
},
"groups" : {
"type" : "array",
"description" : "Nameserver group tag groups",
"items" : {
"type" : "string"
"type" : "string",
"example" : "ch8i4ug6lnn4g9hqv7m0"
}
},
"primary" : {
"type" : "boolean",
"description" : "Nameserver group primary status"
"description" : "Nameserver group primary status",
"example" : true
},
"domains" : {
"type" : "array",
@@ -3034,7 +3138,8 @@
"items" : {
"maxLength" : 255,
"minLength" : 1,
"type" : "string"
"type" : "string",
"example" : "example.com"
}
}
}
@@ -3046,7 +3151,8 @@
"properties" : {
"id" : {
"type" : "string",
"description" : "Nameserver group ID"
"description" : "Nameserver group ID",
"example" : "ch8i4ug6lnn4g9hqv7m0"
}
}
}, {
@@ -3061,7 +3167,8 @@
"type" : "array",
"description" : "Groups whose DNS management is disabled",
"items" : {
"type" : "string"
"type" : "string",
"example" : "ch8i4ug6lnn4g9hqv7m0"
}
}
}
@@ -3072,36 +3179,47 @@
"properties" : {
"id" : {
"type" : "string",
"description" : "Event unique identifier"
"description" : "Event unique identifier",
"example" : "10"
},
"timestamp" : {
"type" : "string",
"description" : "The date and time when the event occurred",
"format" : "date-time"
"format" : "date-time",
"example" : "2023-05-05T10:04:37.473542Z"
},
"activity" : {
"type" : "string",
"description" : "The activity that occurred during the event"
"description" : "The activity that occurred during the event",
"example" : "Route created"
},
"activity_code" : {
"type" : "string",
"description" : "The string code of the activity that occurred during the event",
"example" : "route.add",
"enum" : [ "user.peer.delete", "user.join", "user.invite", "user.peer.add", "user.group.add", "user.group.delete", "user.role.update", "setupkey.peer.add", "setupkey.add", "setupkey.update", "setupkey.revoke", "setupkey.overuse", "setupkey.group.delete", "setupkey.group.add", "rule.add", "rule.delete", "rule.update", "policy.add", "policy.delete", "policy.update", "group.add", "group.update", "dns.setting.disabled.management.group.add", "dns.setting.disabled.management.group.delete", "account.create", "account.setting.peer.login.expiration.update", "account.setting.peer.login.expiration.disable", "account.setting.peer.login.expiration.enable", "route.add", "route.delete", "route.update", "nameserver.group.add", "nameserver.group.delete", "nameserver.group.update", "peer.ssh.disable", "peer.ssh.enable", "peer.rename", "peer.login.expiration.disable", "peer.login.expiration.enable", "service.user.create", "personal.access.token.create", "service.user.delete", "personal.access.token.delete" ]
},
"initiator_id" : {
"type" : "string",
"description" : "The ID of the initiator of the event. E.g., an ID of a user that triggered the event."
"description" : "The ID of the initiator of the event. E.g., an ID of a user that triggered the event.",
"example" : "google-oauth2|123456789012345678901"
},
"target_id" : {
"type" : "string",
"description" : "The ID of the target of the event. E.g., an ID of the peer that a user removed."
"description" : "The ID of the target of the event. E.g., an ID of the peer that a user removed.",
"example" : "chad9d86lnnc59g18ou0"
},
"meta" : {
"type" : "object",
"additionalProperties" : {
"type" : "string"
},
"description" : "The metadata of the event"
"description" : "The metadata of the event",
"example" : {
"name" : "my route",
"network_range" : "10.64.0.0/24",
"peer_id" : "chacbco6lnnbn6cg5s91"
}
}
}
}

View File

@@ -36,6 +36,7 @@ components:
id:
description: Account ID
type: string
example: ch8i4ug6lnn4g9hqv7l0
settings:
$ref: '#/components/schemas/AccountSettings'
required:
@@ -46,9 +47,11 @@ components:
peer_login_expiration_enabled:
description: Enables or disables peer login expiration globally. After peer's login has expired the user has to log in (authenticate). Applies only to peers that were added by a user (interactive SSO login).
type: boolean
example: true
peer_login_expiration:
description: Period of time after which peer login expires (seconds).
type: integer
example: 43200
required:
- peer_login_expiration_enabled
- peer_login_expiration
@@ -58,32 +61,40 @@ components:
id:
description: User ID
type: string
example: google-oauth2|277474792786460067937
email:
description: User's email address
type: string
example: demo@netbird.io
name:
description: User's name from idp provider
type: string
example: Tom Schulz
role:
description: User's NetBird account role
type: string
example: admin
status:
description: User's status
type: string
enum: [ "active","invited","disabled" ]
example: active
auto_groups:
description: Groups to auto-assign to peers registered by this user
type: array
items:
type: string
example: devs
is_current:
description: Is true if authenticated user is the same as this user
type: boolean
readOnly: true
example: true
is_service_user:
description: Is true if this user is a service user
type: boolean
readOnly: true
example: false
required:
- id
- email
@@ -97,11 +108,13 @@ components:
role:
description: User's NetBird account role
type: string
example: admin
auto_groups:
description: Groups to auto-assign to peers registered by this user
type: array
items:
type: string
example: devs
required:
- role
- auto_groups
@@ -111,20 +124,25 @@ components:
email:
description: User's Email to send invite to
type: string
example: demo@netbird.io
name:
description: User's full name
type: string
example: Tom Schulz
role:
description: User's NetBird account role
type: string
example: admin
auto_groups:
description: Groups to auto-assign to peers registered by this user
type: array
items:
type: string
example: devs
is_service_user:
description: Is true if this user is a service user
type: boolean
example: false
required:
- role
- auto_groups
@@ -135,9 +153,11 @@ components:
id:
description: Peer ID
type: string
example: chacbco6lnnbn6cg5s90
name:
description: Peer's hostname
type: string
example: stage-host-1
required:
- id
- name
@@ -146,10 +166,13 @@ components:
properties:
name:
type: string
example: stage-host-1
ssh_enabled:
type: boolean
example: true
login_expiration_enabled:
type: boolean
example: false
required:
- name
- ssh_enabled
@@ -162,19 +185,24 @@ components:
ip:
description: Peer's IP address
type: string
example: 10.64.0.1
connected:
description: Peer to Management connection status
type: boolean
example: true
last_seen:
description: Last time peer connected to Netbird's management service
type: string
format: date-time
example: 2023-05-05T10:05:26.420578Z
os:
description: Peer's operating system and version
type: string
example: Darwin 13.2.1
version:
description: Peer's daemon or cli version
type: string
example: 0.14.0
groups:
description: Groups that the peer belongs to
type: array
@@ -183,28 +211,36 @@ components:
ssh_enabled:
description: Indicates whether SSH server is enabled on this peer
type: boolean
example: true
user_id:
description: User ID of the user that enrolled this peer
type: string
example: google-oauth2|277474792786460067937
hostname:
description: Hostname of the machine
type: string
example: stage-host-1
ui_version:
description: Peer's desktop UI version
type: string
example: 0.14.0
dns_label:
description: Peer's DNS label is the parsed peer name for domain resolution. It is used to form an FQDN by appending the account's domain to the peer label. e.g. peer-dns-label.netbird.cloud
type: string
example: stage-host-1.netbird.cloud
login_expiration_enabled:
description: Indicates whether peer login expiration has been enabled or not
type: boolean
example: false
login_expired:
description: Indicates whether peer's login expired or not
type: boolean
example: false
last_login:
description: Last time this peer performed log in (authentication). E.g., user authenticated.
type: string
format: date-time
example: 2023-05-05T09:00:35.477782Z
required:
- ip
- connected
@@ -224,47 +260,60 @@ components:
id:
description: Setup Key ID
type: string
example: 2531583362
key:
description: Setup Key value
type: string
example: A616097E-FCF0-48FA-9354-CA4A61142761
name:
description: Setup key name identifier
type: string
example: Default key
expires:
description: Setup Key expiration date
type: string
format: date-time
example: 2023-06-01T14:47:22.291057Z
type:
description: Setup key type, one-off for single time usage and reusable
type: string
example: reusable
valid:
description: Setup key validity status
type: boolean
example: true
revoked:
description: Setup key revocation status
type: boolean
example: false
used_times:
description: Usage count of setup key
type: integer
example: 2
last_used:
description: Setup key last usage date
type: string
format: date-time
example: 2023-05-05T09:00:35.477782Z
state:
description: Setup key status, "valid", "overused","expired" or "revoked"
type: string
example: valid
auto_groups:
description: Setup key groups to auto-assign to peers registered with this key
type: array
items:
type: string
example: "devs"
updated_at:
description: Setup key last update date
type: string
format: date-time
example: 2023-05-05T09:00:35.477782Z
usage_limit:
description: A number of times this key can be used. The value of 0 indicates the unlimited usage.
type: integer
example: 0
required:
- id
- key
@@ -285,23 +334,29 @@ components:
name:
description: Setup Key name
type: string
example: Default key
type:
description: Setup key type, one-off for single time usage and reusable
type: string
example: reusable
expires_in:
description: Expiration time in seconds
type: integer
example: 43200
revoked:
description: Setup key revocation status
type: boolean
example: false
auto_groups:
description: Setup key groups to auto-assign to peers registered with this key
type: array
items:
type: string
example: "devs"
usage_limit:
description: A number of times this key can be used. The value of 0 indicates the unlimited usage.
type: integer
example: 0
required:
- name
- type
@@ -315,24 +370,30 @@ components:
id:
description: ID of a token
type: string
example: ch8i54g6lnn4g9hqv7n0
name:
description: Name of the token
type: string
example: My first token
expiration_date:
description: Date the token expires
type: string
format: date-time
example: 2023-05-05T14:38:28.977616Z
created_by:
description: User ID of the user who created the token
type: string
example: google-oauth2|277474792786460067937
created_at:
description: Date the token was created
type: string
format: date-time
example: 2023-05-02T14:48:20.465209Z
last_used:
description: Date the token was last used
type: string
format: date-time
example: 2023-05-04T12:45:25.9723616Z
required:
- id
- name
@@ -345,6 +406,7 @@ components:
plain_token:
description: Plain text representation of the generated token
type: string
example: 2023-05-02T14:48:20.465209Z
personal_access_token:
$ref: '#/components/schemas/PersonalAccessToken'
required:
@@ -356,11 +418,13 @@ components:
name:
description: Name of the token
type: string
example: My first token
expires_in:
description: Expiration in days
type: integer
minimum: 1
maximum: 365
example: 30
required:
- name
- expires_in
@@ -370,12 +434,15 @@ components:
id:
description: Group ID
type: string
example: ch8i4ug6lnn4g9hqv7m0
name:
description: Group Name identifier
type: string
example: devs
peers_count:
description: Count of peers associated to the group
type: integer
example: 2
required:
- id
- name
@@ -386,11 +453,13 @@ components:
name:
type: string
description: Group name identifier
example: devs
peers:
type: array
description: List of peers ids
items:
type: string
example: "ch8i4ug6lnn4g9hqv7m1"
required:
- name
Group:
@@ -411,15 +480,19 @@ components:
name:
description: Rule name identifier
type: string
example: Default
description:
description: Rule friendly description
type: string
example: This is a default rule that allows connections between all the resources
disabled:
description: Rules status
type: boolean
example: false
flow:
description: Rule flow, currently, only "bidirect" for bi-directional traffic is accepted
type: string
example: bidirect
required:
- name
- description
@@ -435,11 +508,13 @@ components:
description: List of source groups
items:
type: string
example: "ch8i4ug6lnn4g9hqv7m1"
destinations:
type: array
description: List of destination groups
items:
type: string
example: "ch8i4ug6lnn4g9hqv7m0"
Rule:
allOf:
- type: object
@@ -447,6 +522,7 @@ components:
id:
description: Rule ID
type: string
example: ch8i4ug6lnn4g9hqv7mg
required:
- id
- $ref: '#/components/schemas/RuleMinimum'
@@ -471,15 +547,19 @@ components:
id:
description: Rule ID
type: string
example: ch8i4ug6lnn4g9hqv7mg
name:
description: Rule name identifier
type: string
example: Default
description:
description: Rule friendly description
type: string
example: This is a default rule that allows connections between all the resources
enabled:
description: Rules status
type: boolean
example: true
sources:
description: policy source groups
type: array
@@ -494,6 +574,7 @@ components:
description: policy accept or drops packets
type: string
enum: ["accept","drop"]
example: accept
required:
- name
- sources
@@ -506,15 +587,19 @@ components:
name:
description: Policy name identifier
type: string
example: ch8i4ug6lnn4g9hqv7mg
description:
description: Policy friendly description
type: string
example: This is a default policy that allows connections between all the resources
enabled:
description: Policy status
type: boolean
example: true
query:
description: Policy Rego query
type: string
example: package netbird\n\nall[rule] {\n is_peer_in_any_group([\"ch8i4ug6lnn4g9hqv7m0\",\"ch8i4ug6lnn4g9hqv7m0\"])\n rule := {\n rules_from_group(\"ch8i4ug6lnn4g9hqv7m0\", \"dst\", \"accept\", \"\"),\n rules_from_group(\"ch8i4ug6lnn4g9hqv7m0\", \"src\", \"accept\", \"\"),\n }[_][_]\n}\n
rules:
description: Policy rule object for policy UI editor
type: array
@@ -534,6 +619,7 @@ components:
id:
description: Policy ID
type: string
example: ch8i4ug6lnn4g9hqv7mg
required:
- id
RouteRequest:
@@ -542,33 +628,41 @@ components:
description:
description: Route description
type: string
example: My first route
network_id:
description: Route network identifier, to group HA routes
type: string
maxLength: 40
minLength: 1
example: Route 1
enabled:
description: Route status
type: boolean
example: true
peer:
description: Peer Identifier associated with route
type: string
example: chacbco6lnnbn6cg5s91
network:
description: Network range in CIDR format
type: string
example: 10.64.0.0/24
metric:
description: Route metric number. Lowest number has higher priority
type: integer
maximum: 9999
minimum: 1
example: 9999
masquerade:
description: Indicate if peer should masquerade traffic to this route's prefix
type: boolean
example: true
groups:
description: Route group tag groups
type: array
items:
type: string
example: "chacdk86lnnboviihd70"
required:
- id
- description
@@ -586,9 +680,11 @@ components:
id:
description: Route Id
type: string
example: chacdk86lnnboviihd7g
network_type:
description: Network type indicating if it is IPv4 or IPv6
type: string
example: IPv4
required:
- id
- network_type
@@ -599,13 +695,16 @@ components:
ip:
description: Nameserver IP
type: string
example: 8.8.8.8
ns_type:
description: Nameserver Type
type: string
enum: [ "udp" ]
example: udp
port:
description: Nameserver Port
type: integer
example: 53
required:
- ip
- ns_type
@@ -618,9 +717,11 @@ components:
type: string
maxLength: 40
minLength: 1
example: Google DNS
description:
description: Nameserver group description
type: string
example: Google DNS servers
nameservers:
description: Nameserver group
minLength: 1
@@ -631,14 +732,17 @@ components:
enabled:
description: Nameserver group status
type: boolean
example: true
groups:
description: Nameserver group tag groups
type: array
items:
type: string
example: ch8i4ug6lnn4g9hqv7m0
primary:
description: Nameserver group primary status
type: boolean
example: true
domains:
description: Nameserver group domain list
type: array
@@ -646,6 +750,7 @@ components:
type: string
minLength: 1
maxLength: 255
example: "example.com"
required:
- name
- description
@@ -661,6 +766,7 @@ components:
id:
description: Nameserver group ID
type: string
example: ch8i4ug6lnn4g9hqv7m0
required:
- id
- $ref: '#/components/schemas/NameserverGroupRequest'
@@ -672,6 +778,7 @@ components:
type: array
items:
type: string
example: ch8i4ug6lnn4g9hqv7m0
required:
- disabled_management_groups
Event:
@@ -680,13 +787,16 @@ components:
id:
description: Event unique identifier
type: string
example: 10
timestamp:
description: The date and time when the event occurred
type: string
format: date-time
example: 2023-05-05T10:04:37.473542Z
activity:
description: The activity that occurred during the event
type: string
example: Route created
activity_code:
description: The string code of the activity that occurred during the event
type: string
@@ -702,17 +812,21 @@ components:
"nameserver.group.add", "nameserver.group.delete", "nameserver.group.update",
"peer.ssh.disable", "peer.ssh.enable", "peer.rename", "peer.login.expiration.disable", "peer.login.expiration.enable",
"service.user.create", "personal.access.token.create", "service.user.delete", "personal.access.token.delete" ]
example: route.add
initiator_id:
description: The ID of the initiator of the event. E.g., an ID of a user that triggered the event.
type: string
example: google-oauth2|123456789012345678901
target_id:
description: The ID of the target of the event. E.g., an ID of the peer that a user removed.
type: string
example: chad9d86lnnc59g18ou0
meta:
description: The metadata of the event
type: object
additionalProperties:
type: string
example: { "name": "my route", "network_range": "10.64.0.0/24", "peer_id": "chacbco6lnnbn6cg5s91"}
required:
- id
- timestamp

View File

@@ -35,7 +35,7 @@ export const title = '<%- tag %>'
<% if(operation.requestBody?.content && operation.requestBody?.content['application/json']){ %>
#### Request-Body Parameters
<Properties>
<% schemas.get(operation.requestBody?.content['application/json'].schema.$ref.split('/').pop())?.parameters.forEach(function(parameter){ %>
<% components.get(operation.requestBody?.content['application/json'].schema.$ref.split('/').pop())?.parameters.forEach(function(parameter){ %>
<Property name="<%- parameter.name %>" type="<%- parameter.type %>" required=\{<%- parameter.required %>\}
<% if(parameter.enum){ %>
enumList="<%- parameter.enum %>"
@@ -68,13 +68,13 @@ curl -X <%- operation.operation.toUpperCase() %> <%- operation.fullPath %> \\
-H 'Accept: application/json' \\<% }; %>
<% if(operation.requestBody?.content && operation.requestBody?.content['application/json']){ -%>
-H 'Content-Type: application/json' \\
--data-raw '<%- JSON.stringify(schemas.get(operation.requestBody?.content['application/json'].schema.$ref?.split('/').pop())?.examples, null, 2) %>'<% }; %>
--data-raw '<%- JSON.stringify(components.get(operation.requestBody?.content['application/json'].schema.$ref?.split('/').pop())?.schema, null, 2) %>'<% }; %>
\`\`\`
\`\`\`js
const axios = require('axios');
<% if(operation.requestBody?.content && operation.requestBody?.content['application/json']){ -%>
let data = JSON.stringify(<%- JSON.stringify(schemas.get(operation.requestBody?.content['application/json'].schema.$ref?.split('/').pop())?.examples, null, 2) %>);<% }; -%>
let data = JSON.stringify(<%- JSON.stringify(components.get(operation.requestBody?.content['application/json'].schema.$ref?.split('/').pop())?.schema, null, 2) %>);<% }; -%>
let config = {
method: '<%- operation.operation.toLowerCase() %>',
@@ -104,7 +104,7 @@ import json
url = "<%- operation.fullPath %>"
<% if(operation.requestBody?.content && operation.requestBody?.content['application/json']){ -%>
payload = json.dumps(<%- JSON.stringify(schemas.get(operation.requestBody?.content['application/json'].schema.$ref?.split('/').pop())?.examples, null, 2) %>)<% }; -%>
payload = json.dumps(<%- JSON.stringify(components.get(operation.requestBody?.content['application/json'].schema.$ref?.split('/').pop())?.schema, null, 2) %>)<% }; -%>
headers = {
<% if(operation.requestBody?.content && operation.requestBody?.content['application/json']){ -%>'Content-Type': 'application/json',<% }; %>
@@ -132,7 +132,7 @@ func main() {
url := "<%- operation.fullPath %>"
method := "<%- operation.operation.toUpperCase() %>"
<% if(operation.requestBody?.content && operation.requestBody?.content['application/json']){ %>
payload := strings.NewReader(\`<%- JSON.stringify(schemas.get(operation.requestBody?.content['application/json'].schema.$ref?.split('/').pop())?.examples, null, 2) %>\`)<% }; -%>
payload := strings.NewReader(\`<%- JSON.stringify(components.get(operation.requestBody?.content['application/json'].schema.$ref?.split('/').pop())?.schema, null, 2) %>\`)<% }; -%>
client := &http.Client {
}
@@ -178,7 +178,7 @@ request = Net::HTTP::<%- operation.operation.slice(0,1).toUpperCase() + operatio
<% if(operation.responseList[0].content && operation.responseList[0].content['application/json']){ -%>request["Accept"] = "application/json"<% }; %>
request["Authorization"] = "Token <TOKEN>"
<% if(operation.requestBody?.content && operation.requestBody?.content['application/json']){ %>
request.body = JSON.dump(<%- JSON.stringify(schemas.get(operation.requestBody?.content['application/json'].schema.$ref?.split('/').pop())?.examples, null, 2) %>)<% }; -%>
request.body = JSON.dump(<%- JSON.stringify(components.get(operation.requestBody?.content['application/json'].schema.$ref?.split('/').pop())?.schema, null, 2) %>)<% }; -%>
response = https.request(request)
puts response.read_body
@@ -189,7 +189,7 @@ OkHttpClient client = new OkHttpClient().newBuilder()
.build();
<% if(operation.requestBody?.content && operation.requestBody?.content['application/json']){ -%>
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, '<%- JSON.stringify(schemas.get(operation.requestBody?.content['application/json'].schema.$ref?.split('/').pop())?.examples, null, 2) %>');<% }; %>
RequestBody body = RequestBody.create(mediaType, '<%- JSON.stringify(components.get(operation.requestBody?.content['application/json'].schema.$ref?.split('/').pop())?.schema, null, 2) %>');<% }; %>
Request request = new Request.Builder()
.url("<%- operation.fullPath %>")
.method("<%- operation.operation.toUpperCase() %>"<% if(operation.requestBody?.content && operation.requestBody?.content['application/json']){ -%>, body<% }; %>)
@@ -215,7 +215,7 @@ curl_setopt_array($curl, array(
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => '<%- operation.operation.toUpperCase() %>',
<% if(operation.requestBody?.content && operation.requestBody?.content['application/json']){ %>
CURLOPT_POSTFIELDS =>'<%- JSON.stringify(schemas.get(operation.requestBody?.content['application/json'].schema.$ref?.split('/').pop())?.examples, null, 2) %>',<% }; %>
CURLOPT_POSTFIELDS =>'<%- JSON.stringify(components.get(operation.requestBody?.content['application/json'].schema.$ref?.split('/').pop())?.schema, null, 2) %>',<% }; %>
CURLOPT_HTTPHEADER => array(
<% if(operation.requestBody?.content && operation.requestBody?.content['application/json']){ -%>'Content-Type: application/json',<% }; %>
<% if(operation.responseList[0].content && operation.responseList[0].content['application/json']){ -%>'Accept: application/json',<% }; %>
@@ -234,14 +234,20 @@ echo $response;
<% if(response?.content && response?.content['application/json']){ %>
<% if(response?.content['application/json'].schema.type === 'array'){ %>
<CodeGroup title="Response">
\`\`\`json {{ title: '200' }}
<%- JSON.stringify(new Array(schemas.get(response?.content['application/json'].schema.items.$ref?.split('/').pop())?.examples), null, 2) %>
\`\`\`json {{ title: 'Example' }}
<%- JSON.stringify(new Array(components.get(response?.content['application/json'].schema.items.$ref?.split('/').pop())?.example), null, 2) %>
\`\`\`
\`\`\`json {{ title: 'Schema' }}
<%- JSON.stringify(new Array(components.get(response?.content['application/json'].schema.items.$ref?.split('/').pop())?.schema), null, 2) %>
\`\`\`
</CodeGroup>
<% } else { %>
<CodeGroup title="Response">
\`\`\`json {{ title: '200' }}
<%- JSON.stringify(schemas.get(response?.content['application/json'].schema.$ref?.split('/').pop())?.examples, null, 2) %>
\`\`\`json {{ title: 'Example' }}
<%- JSON.stringify(components.get(response?.content['application/json'].schema.$ref?.split('/').pop())?.example, null, 2) %>
\`\`\`
\`\`\`json {{ title: 'Schema' }}
<%- JSON.stringify(components.get(response?.content['application/json'].schema.$ref?.split('/').pop())?.schema, null, 2) %>
\`\`\`
</CodeGroup>
<% }; -%>