update crds
This commit is contained in:
@@ -0,0 +1,591 @@
|
||||
{
|
||||
"description": "CloudflareDNS is the Schema for the cloudflarednses API.\n\nCloudflareDNS manages DNS record synchronization independently from CloudflareTunnel resources.\nIt supports two target modes: tunnel references (for tunnel-based CNAME records) and external\ntargets (for non-tunnel DNS management). DNS records can be sourced from Gateway API routes\nor explicitly defined.\n\nCloudflareDNS implements ownership tracking via TXT records (aligned with external-dns patterns)\nto enable safe multi-cluster deployments and prevent accidental deletion of records created\nby other installations.\n\nStatus conditions:\n - Ready: DNS sync is fully operational\n - CredentialsValid: Cloudflare credentials have been validated\n - ZonesResolved: All configured zones have been resolved via API\n - RecordsSynced: DNS records have been synchronized to Cloudflare\n - OwnershipVerified: TXT ownership records have been verified, when enabled",
|
||||
"properties": {
|
||||
"apiVersion": {
|
||||
"description": "APIVersion defines the versioned schema of this representation of an object.\nServers should convert recognized schemas to the latest internal value, and\nmay reject unrecognized values.\nMore info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources",
|
||||
"type": "string"
|
||||
},
|
||||
"kind": {
|
||||
"description": "Kind is a string value representing the REST resource this object represents.\nServers may infer this from the endpoint the client submits requests to.\nCannot be updated.\nIn CamelCase.\nMore info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
|
||||
"type": "string"
|
||||
},
|
||||
"metadata": {
|
||||
"type": "object"
|
||||
},
|
||||
"spec": {
|
||||
"description": "CloudflareDNSSpec defines the desired state of a CloudflareDNS resource.\n\nCloudflareDNSSpec configures DNS record synchronization, including the target\n(tunnel or external), zones to manage, hostname sources, and ownership tracking.\nEither tunnelRef or externalTarget must be specified (mutually exclusive).",
|
||||
"properties": {
|
||||
"cleanupPolicy": {
|
||||
"description": "CleanupPolicy defines cleanup behavior for records.",
|
||||
"properties": {
|
||||
"deleteOnResourceRemoval": {
|
||||
"description": "DeleteOnResourceRemoval deletes records when CloudflareDNS resource is deleted.\nnil defaults to true.",
|
||||
"type": "boolean"
|
||||
},
|
||||
"deleteOnRouteRemoval": {
|
||||
"description": "DeleteOnRouteRemoval deletes records when the source route is deleted.\nnil defaults to true.",
|
||||
"type": "boolean"
|
||||
},
|
||||
"onlyManaged": {
|
||||
"description": "OnlyManaged only deletes records that were created by cfgate (verified via ownership).\nnil defaults to true.",
|
||||
"type": "boolean"
|
||||
}
|
||||
},
|
||||
"type": "object",
|
||||
"additionalProperties": false
|
||||
},
|
||||
"cloudflare": {
|
||||
"description": "Cloudflare API credentials (required when using externalTarget).\nWhen using tunnelRef, credentials are inherited from the tunnel.",
|
||||
"properties": {
|
||||
"accountId": {
|
||||
"description": "AccountID is the Cloudflare Account ID.",
|
||||
"maxLength": 32,
|
||||
"type": "string"
|
||||
},
|
||||
"accountName": {
|
||||
"description": "AccountName is the Cloudflare Account name. Will be looked up via API.",
|
||||
"maxLength": 255,
|
||||
"type": "string"
|
||||
},
|
||||
"secretKeys": {
|
||||
"description": "SecretKeys defines the key mappings within the secret.",
|
||||
"properties": {
|
||||
"apiToken": {
|
||||
"default": "CLOUDFLARE_API_TOKEN",
|
||||
"description": "APIToken is the key name for the Cloudflare API token.",
|
||||
"maxLength": 253,
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"type": "object",
|
||||
"additionalProperties": false
|
||||
},
|
||||
"secretRef": {
|
||||
"description": "SecretRef references the Secret containing Cloudflare API credentials.\nThe secret must contain an API token (not tunnel token).",
|
||||
"properties": {
|
||||
"name": {
|
||||
"description": "Name of the secret.",
|
||||
"maxLength": 253,
|
||||
"minLength": 1,
|
||||
"type": "string"
|
||||
},
|
||||
"namespace": {
|
||||
"description": "Namespace of the secret. Defaults to the tunnel's namespace.",
|
||||
"maxLength": 63,
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"name"
|
||||
],
|
||||
"type": "object",
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"secretRef"
|
||||
],
|
||||
"type": "object",
|
||||
"x-kubernetes-validations": [
|
||||
{
|
||||
"message": "either accountId or accountName must be specified",
|
||||
"rule": "has(self.accountId) || has(self.accountName)"
|
||||
},
|
||||
{
|
||||
"message": "accountId must be a 32-character hex string",
|
||||
"rule": "!has(self.accountId) || self.accountId.matches('^[a-f0-9]{32}$')"
|
||||
}
|
||||
],
|
||||
"additionalProperties": false
|
||||
},
|
||||
"defaults": {
|
||||
"description": "Defaults defines default settings for DNS records.",
|
||||
"properties": {
|
||||
"proxied": {
|
||||
"default": true,
|
||||
"description": "Proxied enables Cloudflare proxy by default.",
|
||||
"type": "boolean"
|
||||
},
|
||||
"ttl": {
|
||||
"default": 1,
|
||||
"description": "TTL is the default DNS record TTL in seconds.\nValid values: 1 (auto) or 60-86400 (explicit).",
|
||||
"format": "int32",
|
||||
"maximum": 86400,
|
||||
"minimum": 1,
|
||||
"type": "integer"
|
||||
}
|
||||
},
|
||||
"type": "object",
|
||||
"x-kubernetes-validations": [
|
||||
{
|
||||
"message": "TTL must be 1 (auto) or between 60 and 86400 seconds",
|
||||
"rule": "!has(self.ttl) || self.ttl == 1 || (self.ttl >= 60 && self.ttl <= 86400)"
|
||||
}
|
||||
],
|
||||
"additionalProperties": false
|
||||
},
|
||||
"externalTarget": {
|
||||
"description": "ExternalTarget specifies a non-tunnel DNS target.",
|
||||
"properties": {
|
||||
"type": {
|
||||
"allOf": [
|
||||
{
|
||||
"enum": [
|
||||
"CNAME",
|
||||
"A",
|
||||
"AAAA"
|
||||
]
|
||||
},
|
||||
{
|
||||
"enum": [
|
||||
"CNAME",
|
||||
"A",
|
||||
"AAAA"
|
||||
]
|
||||
}
|
||||
],
|
||||
"description": "Type is the DNS record type.",
|
||||
"type": "string"
|
||||
},
|
||||
"value": {
|
||||
"description": "Value is the target value (domain for CNAME, IP for A/AAAA).\nMax 253: RFC 1035 section 2.3.4 FQDN presentation-format limit.",
|
||||
"maxLength": 253,
|
||||
"minLength": 1,
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"type",
|
||||
"value"
|
||||
],
|
||||
"type": "object",
|
||||
"additionalProperties": false
|
||||
},
|
||||
"fallbackCredentialsRef": {
|
||||
"description": "FallbackCredentialsRef references fallback Cloudflare API credentials.\nUsed during deletion when primary credentials are unavailable.",
|
||||
"properties": {
|
||||
"name": {
|
||||
"description": "Name of the secret.",
|
||||
"maxLength": 253,
|
||||
"minLength": 1,
|
||||
"type": "string"
|
||||
},
|
||||
"namespace": {
|
||||
"description": "Namespace of the secret. Defaults to the resource's namespace if empty.",
|
||||
"maxLength": 63,
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"name"
|
||||
],
|
||||
"type": "object",
|
||||
"additionalProperties": false
|
||||
},
|
||||
"ownership": {
|
||||
"description": "Ownership defines how to track record ownership.",
|
||||
"properties": {
|
||||
"comment": {
|
||||
"description": "Comment configures comment-based ownership.\n\nDeprecated: since v0.1.0-alpha.13. All fields are ignored. Will be removed in a future cleanup release.",
|
||||
"properties": {
|
||||
"enabled": {
|
||||
"default": false,
|
||||
"description": "Enabled enables comment-based ownership tracking.\n\nDeprecated: since v0.1.0-alpha.13. This field is ignored. The controller always\nwrites a \"managed by cfgate\" comment. Will be removed in a future cleanup release.",
|
||||
"type": "boolean"
|
||||
},
|
||||
"template": {
|
||||
"default": "managed by cfgate",
|
||||
"description": "Template is the comment template.\n\nDeprecated: since v0.1.0-alpha.13. This field is ignored. The controller always\nuses \"managed by cfgate\" as the comment. Will be removed in a future cleanup release.",
|
||||
"maxLength": 255,
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"type": "object",
|
||||
"additionalProperties": false
|
||||
},
|
||||
"ownerId": {
|
||||
"description": "OwnerID is the cluster/installation identifier used in TXT ownership records.\nUsed to distinguish records created by different cfgate installations.\nDefaults to the CloudflareDNS resource's namespace/name if not specified.",
|
||||
"maxLength": 253,
|
||||
"pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?(/[a-z0-9]([-a-z0-9]*[a-z0-9])?)?$",
|
||||
"type": "string"
|
||||
},
|
||||
"txtRecord": {
|
||||
"description": "TXTRecord configures TXT record-based ownership.",
|
||||
"properties": {
|
||||
"enabled": {
|
||||
"description": "Enabled enables TXT record ownership tracking.\nnil defaults to true.",
|
||||
"type": "boolean"
|
||||
},
|
||||
"prefix": {
|
||||
"default": "_cfgate",
|
||||
"description": "Prefix is the prefix for TXT record names.",
|
||||
"maxLength": 63,
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"type": "object",
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"type": "object",
|
||||
"additionalProperties": false
|
||||
},
|
||||
"policy": {
|
||||
"allOf": [
|
||||
{
|
||||
"enum": [
|
||||
"sync",
|
||||
"upsert-only",
|
||||
"create-only"
|
||||
]
|
||||
},
|
||||
{
|
||||
"enum": [
|
||||
"sync",
|
||||
"upsert-only",
|
||||
"create-only"
|
||||
]
|
||||
}
|
||||
],
|
||||
"default": "sync",
|
||||
"description": "Policy controls DNS record lifecycle.",
|
||||
"type": "string"
|
||||
},
|
||||
"source": {
|
||||
"description": "Source defines where to get hostnames to sync.",
|
||||
"properties": {
|
||||
"explicit": {
|
||||
"description": "Explicit defines explicit hostnames to sync.",
|
||||
"items": {
|
||||
"description": "DNSExplicitHostname defines an explicit hostname to sync with optional per-hostname configuration.\n\nDNSExplicitHostname provides direct specification of DNS hostnames without depending on\nGateway API route discovery. The Target field supports the template\nvariable for dynamic resolution when using tunnelRef.",
|
||||
"properties": {
|
||||
"hostname": {
|
||||
"description": "Hostname is the DNS hostname to create.\nMax 253: RFC 1035 section 2.3.4 FQDN presentation-format limit.",
|
||||
"maxLength": 253,
|
||||
"minLength": 1,
|
||||
"type": "string",
|
||||
"x-kubernetes-validations": [
|
||||
{
|
||||
"message": "each DNS label must not exceed 63 octets (RFC 1035 section 2.3.4)",
|
||||
"rule": "self.split('.').all(s, size(s) <= 63)"
|
||||
}
|
||||
]
|
||||
},
|
||||
"proxied": {
|
||||
"description": "Proxied enables Cloudflare proxy for this record.\nnil inherits from zone or defaults.",
|
||||
"type": "boolean"
|
||||
},
|
||||
"target": {
|
||||
"description": "Target overrides the resolved record target for this hostname.\nSupports template variable when tunnelRef is used.\nDefaults to the resource-level resolved target when omitted.\nMax 253: RFC 1035 section 2.3.4 FQDN presentation-format limit.",
|
||||
"maxLength": 253,
|
||||
"type": "string"
|
||||
},
|
||||
"ttl": {
|
||||
"default": 1,
|
||||
"description": "TTL is the DNS record TTL in seconds. 1 means auto (Cloudflare managed).\nValid values: 1 (auto) or 60-86400 (explicit).",
|
||||
"format": "int32",
|
||||
"maximum": 86400,
|
||||
"minimum": 1,
|
||||
"type": "integer"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"hostname"
|
||||
],
|
||||
"type": "object",
|
||||
"x-kubernetes-validations": [
|
||||
{
|
||||
"message": "TTL must be 1 (auto) or between 60 and 86400 seconds",
|
||||
"rule": "!has(self.ttl) || self.ttl == 1 || (self.ttl >= 60 && self.ttl <= 86400)"
|
||||
}
|
||||
],
|
||||
"additionalProperties": false
|
||||
},
|
||||
"maxItems": 100,
|
||||
"type": "array"
|
||||
},
|
||||
"gatewayRoutes": {
|
||||
"description": "GatewayRoutes configures watching Gateway API routes.",
|
||||
"properties": {
|
||||
"annotationFilter": {
|
||||
"description": "AnnotationFilter only syncs routes with this annotation.",
|
||||
"maxLength": 255,
|
||||
"type": "string"
|
||||
},
|
||||
"enabled": {
|
||||
"default": true,
|
||||
"description": "Enabled enables watching Gateway API routes.",
|
||||
"type": "boolean"
|
||||
},
|
||||
"namespaceSelector": {
|
||||
"description": "NamespaceSelector limits route discovery to specific namespaces.",
|
||||
"properties": {
|
||||
"matchLabels": {
|
||||
"additionalProperties": {
|
||||
"type": "string"
|
||||
},
|
||||
"description": "MatchLabels selects namespaces with matching labels.",
|
||||
"maxProperties": 10,
|
||||
"type": "object"
|
||||
},
|
||||
"matchNames": {
|
||||
"description": "MatchNames selects namespaces by name.",
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"maxItems": 50,
|
||||
"type": "array"
|
||||
}
|
||||
},
|
||||
"type": "object",
|
||||
"x-kubernetes-validations": [
|
||||
{
|
||||
"message": "at least one selector must be specified",
|
||||
"rule": "has(self.matchLabels) || has(self.matchNames)"
|
||||
}
|
||||
],
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"type": "object",
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"type": "object",
|
||||
"additionalProperties": false
|
||||
},
|
||||
"tunnelRef": {
|
||||
"description": "TunnelRef references a CloudflareTunnel for CNAME target resolution.",
|
||||
"properties": {
|
||||
"name": {
|
||||
"description": "Name is the name of the CloudflareTunnel.",
|
||||
"maxLength": 63,
|
||||
"minLength": 1,
|
||||
"type": "string"
|
||||
},
|
||||
"namespace": {
|
||||
"description": "Namespace is the namespace of the CloudflareTunnel.\nDefaults to the CloudflareDNS's namespace.",
|
||||
"maxLength": 63,
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"name"
|
||||
],
|
||||
"type": "object",
|
||||
"additionalProperties": false
|
||||
},
|
||||
"zones": {
|
||||
"description": "Zones defines the DNS zones to manage.",
|
||||
"items": {
|
||||
"description": "DNSZoneConfig defines a DNS zone where records will be managed.\n\nDNSZoneConfig identifies a Cloudflare DNS zone either by name (requiring API lookup)\nor by explicit zone ID. The optional Proxied field sets the default proxy behavior\nfor all records in this zone.",
|
||||
"properties": {
|
||||
"id": {
|
||||
"description": "ID is the optional explicit zone ID (skips API lookup).",
|
||||
"maxLength": 32,
|
||||
"pattern": "^[a-f0-9]{32}$",
|
||||
"type": "string"
|
||||
},
|
||||
"name": {
|
||||
"description": "Name is the zone domain name (e.g., example.com).\nMax 253: RFC 1035 section 2.3.4 FQDN presentation-format limit.",
|
||||
"maxLength": 253,
|
||||
"minLength": 1,
|
||||
"type": "string",
|
||||
"x-kubernetes-validations": [
|
||||
{
|
||||
"message": "each DNS label must not exceed 63 octets (RFC 1035 section 2.3.4)",
|
||||
"rule": "self.split('.').all(s, size(s) <= 63)"
|
||||
}
|
||||
]
|
||||
},
|
||||
"proxied": {
|
||||
"description": "Proxied sets the default proxied setting for this zone.\nnil inherits from spec.defaults.proxied.",
|
||||
"type": "boolean"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"name"
|
||||
],
|
||||
"type": "object",
|
||||
"additionalProperties": false
|
||||
},
|
||||
"maxItems": 10,
|
||||
"minItems": 1,
|
||||
"type": "array"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"zones"
|
||||
],
|
||||
"type": "object",
|
||||
"x-kubernetes-validations": [
|
||||
{
|
||||
"message": "either tunnelRef or externalTarget must be specified",
|
||||
"rule": "has(self.tunnelRef) || has(self.externalTarget)"
|
||||
},
|
||||
{
|
||||
"message": "tunnelRef and externalTarget are mutually exclusive",
|
||||
"rule": "!(has(self.tunnelRef) && has(self.externalTarget))"
|
||||
},
|
||||
{
|
||||
"message": "cloudflare credentials required when using externalTarget",
|
||||
"rule": "has(self.tunnelRef) || has(self.cloudflare)"
|
||||
}
|
||||
],
|
||||
"additionalProperties": false
|
||||
},
|
||||
"status": {
|
||||
"description": "CloudflareDNSStatus defines the observed state of a CloudflareDNS resource.\n\nCloudflareDNSStatus captures the synchronization state of all DNS records, including\ncounts of synced, pending, and failed records. The ResolvedTarget field shows the\nactual CNAME target being used (either from tunnel or external target).",
|
||||
"properties": {
|
||||
"conditions": {
|
||||
"description": "Conditions represent the latest available observations.",
|
||||
"items": {
|
||||
"description": "Condition contains details for one aspect of the current state of this API Resource.",
|
||||
"properties": {
|
||||
"lastTransitionTime": {
|
||||
"description": "lastTransitionTime is the last time the condition transitioned from one status to another.\nThis should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable.",
|
||||
"format": "date-time",
|
||||
"type": "string"
|
||||
},
|
||||
"message": {
|
||||
"description": "message is a human readable message indicating details about the transition.\nThis may be an empty string.",
|
||||
"maxLength": 32768,
|
||||
"type": "string"
|
||||
},
|
||||
"observedGeneration": {
|
||||
"description": "observedGeneration represents the .metadata.generation that the condition was set based upon.\nFor instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\nwith respect to the current state of the instance.",
|
||||
"format": "int64",
|
||||
"minimum": 0,
|
||||
"type": "integer"
|
||||
},
|
||||
"reason": {
|
||||
"description": "reason contains a programmatic identifier indicating the reason for the condition's last transition.\nProducers of specific condition types may define expected values and meanings for this field,\nand whether the values are considered a guaranteed API.\nThe value should be a CamelCase string.\nThis field may not be empty.",
|
||||
"maxLength": 1024,
|
||||
"minLength": 1,
|
||||
"pattern": "^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$",
|
||||
"type": "string"
|
||||
},
|
||||
"status": {
|
||||
"description": "status of the condition, one of True, False, Unknown.",
|
||||
"enum": [
|
||||
"True",
|
||||
"False",
|
||||
"Unknown"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
"type": {
|
||||
"description": "type of condition in CamelCase or in foo.example.com/CamelCase.",
|
||||
"maxLength": 316,
|
||||
"pattern": "^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$",
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"lastTransitionTime",
|
||||
"message",
|
||||
"reason",
|
||||
"status",
|
||||
"type"
|
||||
],
|
||||
"type": "object",
|
||||
"additionalProperties": false
|
||||
},
|
||||
"type": "array",
|
||||
"x-kubernetes-list-map-keys": [
|
||||
"type"
|
||||
],
|
||||
"x-kubernetes-list-type": "map"
|
||||
},
|
||||
"failedRecords": {
|
||||
"description": "FailedRecords is the number of records that failed to sync.",
|
||||
"format": "int32",
|
||||
"type": "integer"
|
||||
},
|
||||
"lastSyncTime": {
|
||||
"description": "LastSyncTime is the last time records were synced.",
|
||||
"format": "date-time",
|
||||
"type": "string"
|
||||
},
|
||||
"observedGeneration": {
|
||||
"description": "ObservedGeneration is the generation observed by the controller.",
|
||||
"format": "int64",
|
||||
"type": "integer"
|
||||
},
|
||||
"pendingRecords": {
|
||||
"description": "PendingRecords is the number of records pending sync.",
|
||||
"format": "int32",
|
||||
"type": "integer"
|
||||
},
|
||||
"records": {
|
||||
"description": "Records contains the status of individual DNS records.",
|
||||
"items": {
|
||||
"description": "DNSRecordSyncStatus represents the synchronization status of a single DNS record.\n\nDNSRecordSyncStatus tracks individual DNS record state including the Cloudflare record ID,\ncurrent configuration, and sync status. The Status field indicates: Synced (successfully\nsynchronized), Pending (awaiting sync), or Failed (sync failed, see Error field).",
|
||||
"properties": {
|
||||
"error": {
|
||||
"description": "Error contains the error message if status is Failed.",
|
||||
"type": "string"
|
||||
},
|
||||
"hostname": {
|
||||
"description": "Hostname is the DNS hostname.",
|
||||
"type": "string"
|
||||
},
|
||||
"proxied": {
|
||||
"description": "Proxied indicates if Cloudflare proxy is enabled.",
|
||||
"type": "boolean"
|
||||
},
|
||||
"recordId": {
|
||||
"description": "RecordID is the Cloudflare record ID.",
|
||||
"type": "string"
|
||||
},
|
||||
"status": {
|
||||
"description": "Status is the sync status: Synced, Pending, Failed.",
|
||||
"type": "string"
|
||||
},
|
||||
"target": {
|
||||
"description": "Target is the record target/content.",
|
||||
"type": "string"
|
||||
},
|
||||
"ttl": {
|
||||
"description": "TTL is the record TTL.",
|
||||
"format": "int32",
|
||||
"type": "integer"
|
||||
},
|
||||
"type": {
|
||||
"description": "Type is the DNS record type (CNAME, A, AAAA).",
|
||||
"type": "string"
|
||||
},
|
||||
"zoneId": {
|
||||
"description": "ZoneID is the Cloudflare zone ID where the record was created.",
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"hostname",
|
||||
"proxied",
|
||||
"status",
|
||||
"target",
|
||||
"type"
|
||||
],
|
||||
"type": "object",
|
||||
"additionalProperties": false
|
||||
},
|
||||
"maxItems": 1000,
|
||||
"type": "array"
|
||||
},
|
||||
"resolvedTarget": {
|
||||
"description": "ResolvedTarget is the resolved CNAME target (tunnel domain or external value).",
|
||||
"type": "string"
|
||||
},
|
||||
"syncedRecords": {
|
||||
"description": "SyncedRecords is the number of successfully synced records.",
|
||||
"format": "int32",
|
||||
"type": "integer"
|
||||
}
|
||||
},
|
||||
"type": "object",
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"type": "object"
|
||||
}
|
||||
Reference in New Issue
Block a user