Pular para o conteúdo

Sistema de Metadados de Restrições

Finalidade: Metadados abrangentes de restrições para geração determinística por IA, validação via CLI e aplicação de esquemas Terraform.

Extensão: x-f5xc-constraints Versão: 3.3.0 Status: Produção Consumidores: Assistentes de IA, ferramentas CLI, provedores Terraform, extensões de IDE, validadores de API


  1. Visão Geral
  2. Estrutura da Extensão
  3. Tipos de Restrição
  4. Descrições em Linguagem Natural
  5. Exemplos de Validação
  6. Pontuações de Confiança
  7. Integração com Discovery
  8. Guia de Integração com Ferramentas

A extensão x-f5xc-constraints fornece conhecimento determinístico sobre restrições de validação de campos, habilitando:

  • Assistentes de IA: Gerar configurações válidas sem necessitar de entrada do usuário para detalhes de restrições
  • Ferramentas CLI: Fornecer dicas de entrada precisas, validação e mensagens de erro
  • Terraform: Aplicar restrições no momento do plano, não no momento da execução
  • Extensões de IDE: Validação em tempo real e sugestões de autocompletar
  • Validadores de API: Validação pré-envio para reduzir erros de API
  • 9.851 restrições em todas as especificações da API F5 XC
  • Mais de 50 tipos de padrões (string, array, numérico)
  • 95% de confiança nos campos de alta prioridade (nomes, portas, identificadores)
  • Reconciliação em 3 camadas: EXISTING > DISCOVERY > INFERRED

{
"x-f5xc-constraints": {
"constraintType": "string|array|number|object",
"deterministic": true,
"category": "length|size|range|pattern|character|format",
"minLength": 1,
"maxLength": 63,
"pattern": "^[a-z0-9]+$",
"metadata": {
"source": "discovery|inferred|explicit",
"confidence": 0.95,
"category": "naming",
"validatedAt": "2026-01-19T12:00:00Z"
}
}
}
CampoTipoDescrição
constraintTypestringTipo de dado (string, array, number, object)
deterministicbooleanSinalizador de alta confiança (confiança >= 0,9) para geração por IA
categorystringCategoria de restrição para agrupamento e relatórios
(chaves de restrição)variadoChaves de restrição específicas do tipo niveladas no topo (ex.: minLength, maxItems, minimum)
metadataobjectRastreamento de origem, confiança, carimbo de data/hora de validação

{
"constraintType": "string",
"category": "naming",
"minLength": 1,
"maxLength": 63,
"pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$",
"characterSet": {
"allowed": "[a-z0-9-]",
"restricted": "[^a-z0-9-]",
"required": "[a-z0-9]",
"description": "Lowercase alphanumeric with hyphens, not at start/end"
},
"format": "dns-label",
"formatDescription": "RFC 1123 DNS label: lowercase, alphanumeric, hyphens allowed but not at start/end",
"byteLength": {
"min": 1,
"max": 63
},
"validation": {
"rfc": "RFC 1123",
"standard": "Kubernetes resource naming"
},
"metadata": {
"source": "inferred",
"confidence": 0.95
},
"deterministic": true
}
FormatoDescriçãoExemplo
dns-labelRótulo DNS RFC 1123 (1-63 caracteres)my-service
fqdnNome de domínio totalmente qualificadoapi.example.com
emailEndereço de e-mail RFC 5322user@example.com
urlURI/URL RFC 3986https://example.com/api
ipv4Endereço IPv4192.168.1.1
ipv6Endereço IPv62001:db8::1
uuidUUID RFC 4122550e8400-e29b-41d4-a716-446655440000
date-timeCarimbo de data/hora ISO 86012026-01-19T12:00:00Z
dateData ISO 86012026-01-19
timeHora ISO 860112:00:00
jsonString JSON (analisável){"key": "value"}
yamlString YAML (analisável)key: value
base64String codificada em Base64SGVsbG8gV29ybGQ=
hexString hexadecimal48656c6c6f
mac-addressEndereço MAC00:1A:2B:3C:4D:5E
phoneNúmero de telefone E.164+1-555-123-4567
{
"constraintType": "array",
"category": "collection",
"minItems": 1,
"maxItems": 50,
"uniqueItems": true,
"metadata": {
"source": "inferred",
"confidence": 0.90
},
"deterministic": true
}
{
"constraintType": "number",
"category": "range",
"minimum": 1,
"maximum": 65535,
"multipleOf": 1,
"exclusiveMinimum": false,
"exclusiveMaximum": false,
"metadata": {
"source": "inferred",
"confidence": 0.99
},
"deterministic": true
}

Rótulos DNS (format: "dns-label"):

  • Os nomes de rótulos DNS devem ter de 1 a 63 caracteres alfanuméricos minúsculos
  • Hífens são permitidos, mas não no início ou no fim (RFC 1123)
  • Exemplo: my-service, api-gateway, lb-prod-01

Endereços de E-mail (format: "email"):

  • Os endereços de e-mail devem ser válidos conforme RFC 5322
  • Máximo de 254 caracteres
  • Exemplo: admin@example.com, api+webhook@service.io

FQDNs (format: "fqdn"):

  • Os Nomes de Domínio Totalmente Qualificados devem ter de 1 a 253 caracteres
  • Rótulos DNS separados por ponto
  • Exemplo: api.example.com, service.production.internal

URLs (format: "url"):

  • As URLs devem ser URIs válidas conforme RFC 3986
  • Devem incluir esquema (http/https)
  • Exemplo: https://api.example.com/v1, http://localhost:8080

Endereços IPv4 (format: "ipv4"):

  • Os endereços IPv4 devem estar em notação decimal com pontos
  • Exemplo: 192.168.1.1, 10.0.0.1

UUIDs (format: "uuid"):

  • Os UUIDs devem seguir o formato RFC 4122
  • Exemplo: 550e8400-e29b-41d4-a716-446655440000

Carimbos de Data/Hora (format: "date-time"):

  • Os carimbos de data/hora devem estar no formato ISO 8601
  • Exemplo: 2026-01-19T12:00:00Z, 2026-01-19T12:00:00+00:00

Números de Porta:

  • Os números de porta devem ser inteiros entre 1 e 65535
  • Portas padrão: 80 (HTTP), 443 (HTTPS), 22 (SSH)

IDs de VLAN:

  • Os IDs de VLAN devem ser inteiros entre 1 e 4094 (padrão 802.1Q)

Timeouts:

  • Os timeouts devem ser de 1 a 3600 segundos (máximo de 1 hora)

Pools de Origem:

  • O array de pools de origem requer pelo menos 1 item, com máximo de 50 itens
  • Cada item deve ser único

Tags:

  • O array de tags permite de 0 a 100 itens
  • Os itens não precisam ser únicos

Restrição:

{
"constraintType": "string",
"minLength": 1,
"maxLength": 63,
"pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$",
"format": "dns-label",
"deterministic": true
}

Valores Válidos:

  • my-service
  • api-gateway
  • lb-prod-01
  • web

Valores Inválidos:

  • My-Service (maiúsculas não são permitidas)
  • -my-service (hífen no início)
  • my-service- (hífen no fim)
  • my_service (sublinhado não é permitido)
  • this-is-a-very-long-name-that-exceeds-the-sixty-three-character-limit (muito longo)

Restrição:

{
"constraintType": "number",
"minimum": 1,
"maximum": 65535,
"deterministic": true
}

Valores Válidos:

  • 80 (HTTP)
  • 443 (HTTPS)
  • 8080 (HTTP alternativo comum)
  • 65535 (porta máxima)

Valores Inválidos:

  • 0 (abaixo do mínimo)
  • 65536 (acima do máximo)
  • -1 (negativo)
  • "80" (string, não número)

Restrição:

{
"constraintType": "array",
"minItems": 1,
"maxItems": 50,
"uniqueItems": true,
"deterministic": true
}

Valores Válidos:

  • ["origin-1"] (1 item)
  • ["origin-1", "origin-2", "origin-3"] (3 itens, todos únicos)

Valores Inválidos:

  • [] (abaixo do mínimo)
  • ["origin-1", "origin-1"] (itens duplicados)
  • [array com 51 itens] (acima do máximo)

FaixaInterpretaçãoUso
0,90-1,00Alta confiançaSinalizador determinístico habilitado, usar para geração por IA
0,70-0,89Média confiançaConsultivo, recomenda confirmação do usuário
0,50-0,69Baixa confiançaApenas informativo, requer validação do usuário
< 0,50Muito baixaNão incluído nas restrições

O sinalizador booleano deterministic é definido quando:

  • A pontuação de confiança é >= 0,9
  • O padrão foi validado contra dados de discovery OU
  • O padrão corresponde a padrões bem estabelecidos (RFC, ISO, etc.)

Uso na geração por IA:

if constraint.get("deterministic"):
# Gerar valor automaticamente sem perguntar ao usuário
value = generate_from_pattern(constraint)
else:
# Solicitar entrada do usuário com dicas de restrição
value = prompt_user_with_hints(constraint)

As restrições são reconciliadas usando prioridade em 3 camadas:

  1. EXISTING (Confiança: 1,0)

    • Definido explicitamente na especificação OpenAPI original
    • Nunca sobrescrito
  2. DISCOVERY (Confiança: 0,99)

    • Extraído de respostas da API F5 XC em produção
    • Inclui regras de validação de x-ves-validation-rules
    • Substitui restrições inferidas
  3. INFERRED (Confiança: 0,50-0,95)

    • Correspondido por padrões a partir de nomes de campos
    • Menor prioridade, substituído por discovery ou explícito

As restrições de discovery são extraídas de:

  1. x-ves-validation-rules: Extensões nativas de validação F5

    • ves.io.schema.rules.string.max_lenmaxLength
    • ves.io.schema.rules.string.patternpattern
    • ves.io.schema.rules.repeated.max_itemsmaxItems
  2. Catálogo de Erros: Mensagens de erro da API indicando violações de restrição

    • “name must be 1-63 characters” → minLength/maxLength
    • “port must be between 1 and 65535” → minimum/maximum
  3. Validação de Respostas: Respostas bem-sucedidas da API demonstrando valores válidos

    • Intervalos de valores observados
    • Padrões de formato reais

Gerar nomes de recursos válidos:

def generate_resource_name(schema_property):
constraints = schema_property.get("x-f5xc-constraints", {})
if not constraints.get("deterministic"):
# Solicitar nome ao usuário
return prompt_user("Enter resource name: ")
# Gerar automaticamente
pattern = constraints.get("pattern")
max_len = constraints.get("maxLength", 63)
# Gerar nome válido correspondente ao padrão
return generate_dns_label(max_length=max_len)

Fornecer validação de entrada:

def validate_cli_input(field_name, user_value, constraints):
if not constraints:
return True, None
# Verificar comprimento (as chaves de restrição estão no nível superior)
if "minLength" in constraints and len(user_value) < constraints["minLength"]:
return False, f"{field_name} must be at least {constraints['minLength']} characters"
if "maxLength" in constraints and len(user_value) > constraints["maxLength"]:
return False, f"{field_name} must be at most {constraints['maxLength']} characters"
# Verificar padrão
if "pattern" in constraints:
import re
if not re.match(constraints["pattern"], user_value):
char_set = constraints.get("characterSet", {})
desc = char_set.get("description", "valid format")
return False, f"{field_name} must match {desc}"
return True, None

Geração de esquema:

func generateTerraformSchema(property map[string]interface{}) *schema.Schema {
constraints := property["x-f5xc-constraints"].(map[string]interface{})
s := &schema.Schema{
Type: schema.TypeString,
Required: true,
}
// As chaves de restrição estão no nível superior (sem wrapper "string" aninhado)
if minLen, ok := constraints["minLength"].(float64); ok {
s.ValidateDiagFunc = validation.StringLenBetween(int(minLen), int(constraints["maxLength"].(float64)))
}
if pattern, ok := constraints["pattern"].(string); ok {
charSet := constraints["characterSet"].(map[string]interface{})
s.ValidateDiagFunc = validation.StringMatch(regexp.MustCompile(pattern),
charSet["description"].(string))
}
return s
}

Autocompletar e validação:

function provideCompletions(field: FieldInfo): CompletionItem[] {
const constraints = field.schema['x-f5xc-constraints'];
if (!constraints) return [];
const items: CompletionItem[] = [];
// Adicionar completions específicos de formato
if (constraints.format === 'dns-label') {
items.push({
label: 'my-service',
detail: 'Example DNS label',
kind: CompletionItemKind.Value
});
}
// Adicionar dica de validação
if (constraints.deterministic) {
items.push({
label: '✨ Auto-generate',
detail: 'Generate valid value automatically',
kind: CompletionItemKind.Function,
command: { command: 'f5xc.generateValue', arguments: [field] }
});
}
return items;
}

PadrãoRegex do Nome do CampoTipo de RestriçãoExemplo
Rótulo DNS\bname$String (1-63 caracteres, dns-label)my-service
Namespace\bnamespace$String (1-63 caracteres, dns-label)production
Porta\bport$Número (1-65535)443
ID de VLAN\b(vlan)?_?id$Número (1-4094)100
UUID\buuid$String (36 caracteres, formato uuid)550e8400-...
E-mail\bemail$String (máx. 254 caracteres, email)user@example.com
Carimbo de Data/Hora\b(timestamp|created_at|updated_at)$String (ISO 8601)2026-01-19T12:00:00Z
PadrãoRegex do Nome do CampoTipo de RestriçãoExemplo
Nome de Usuário\b(user|username)$String (1-64 caracteres, alfanumérico)admin
Nome de Exibição\b(display_?)?name$String (1-256 caracteres, texto livre)My Service
Descrição\b(comment|description|note)$String (máx. 4096 caracteres)Service description
Caminho\bpath$String (máx. 2048 caracteres)/api/v1/resources


Versão: 3.3.0 Última Atualização: 2026-01-19 Restrições Reconciliadas: 9.851 Cobertura de Padrões: Mais de 50 tipos