Pular para o conteúdo

Correções Aplicadas às Especificações Upstream

O reconciliador (scripts/reconcile.py) aplica quatro categorias de correções às especificações upstream. Correções de restrição alteram contratos de API para corresponder ao comportamento observado. Todas as outras correções são apenas de metadados e não alteram contratos de API.

Essas correções ajustam as restrições do esquema OpenAPI para que a especificação corresponda ao que a API em produção realmente aplica. Cada correção é conduzida por um objeto Discrepancy produzido durante a validação.

EstratégiaGatilhoO Que FazAlteração de Contrato
RelaxarSPEC_STRICTERA especificação rejeita valores que a API aceita. Reduz minLength/minimum, aumenta maxLength/maximum, adiciona valores enum faltantes.Sim — amplia valores aceitos
RestringirSPEC_LOOSERA especificação aceita valores que a API rejeita. Aumenta minLength/minimum, reduz maxLength/maximum, restringe enums aos valores observados.Sim — reduz valores aceitos
AdicionarMISSING_CONSTRAINTA API aplica uma restrição não documentada na especificação. Adiciona a restrição ao esquema.Sim — adiciona nova restrição
RemoverEXTRA_CONSTRAINTA especificação declara uma restrição que a API ignora. Remove a restrição do esquema.Sim — remove restrição

As 10 categorias de restrição OpenAPI testadas e corrigidas:

  • Comprimento de stringminLength, maxLength
  • Padrãopattern (regex)
  • Limites numéricosminimum, maximum, exclusiveMinimum, exclusiveMaximum
  • Campos obrigatóriosrequired
  • Valores enumenum
  • Limites de arrayminItems, maxItems, uniqueItems
  • Estrutura de objetoadditionalProperties, properties, propertyNames
  • ComposiçãooneOf, anyOf, allOf
  • DependênciasdependentRequired, dependentSchemas
  • Tipos de dadostype, format

Essas correções tratam problemas de qualidade OAS3 encontrados pelo linting Spectral. Elas adicionam ou corrigem metadados sem alterar o comportamento da API.

Regra: oas3-api-servers | Alteração de contrato: Não

Adiciona o template de URL do tenant F5 XC às especificações que não possuem um bloco servers:

"servers": [{
"url": "https://{tenant}.console.ves.volterra.io",
"description": "F5 Distributed Cloud API",
"variables": {
"tenant": {
"default": "example-tenant",
"description": "Your F5 XC tenant name"
}
}
}]

A URL do servidor e os valores das variáveis vêm de spectral.servers em validation.yaml.

Regra: info-contact | Alteração de contrato: Não

Adiciona informações de contato em info.contact para especificações que não as possuem:

"contact": {
"name": "F5 Distributed Cloud",
"url": "https://docs.cloud.f5.com",
"email": "support@f5.com"
}

Os valores vêm de spectral.contact em validation.yaml.

Regra: operation-tags | Alteração de contrato: Não

Deriva uma tag a partir do prefixo do caminho URL para operações sem tags. Para um caminho como /api/config/namespaces/{namespace}/healthchecks, a tag é config (o segundo segmento que não é parâmetro). A tag é adicionada tanto ao array tags da operação quanto à lista tags no nível da especificação.

Regra: oas3-unused-component | Alteração de contrato: Não

Remove esquemas de componentes de components.schemas que não são referenciados em nenhum lugar da especificação. Reduz o tamanho da especificação sem afetar nenhuma operação.

Regra: operation-operationId-unique | Alteração de contrato: Não

Adiciona o método HTTP como sufixo (ex.: ListItems_get) quando múltiplas operações compartilham o mesmo operationId. Isso torna cada operationId único para geradores de código.

Regra: oas3-valid-schema-example | Alteração de contrato: Não

Remove valores example ou default dos esquemas quando o valor não está em conformidade com as próprias restrições do esquema (tipo errado, fora do intervalo, etc.). Evita que geradores de código produzam payloads de exemplo inválidos.

Regra: no-script-tags-in-markdown | Alteração de contrato: Não

Remove tags <script> dos campos description usando substituição por regex. Algumas especificações upstream contêm tags script injetadas que quebram renderizadores de documentação.

Alteração de contrato: Não (apenas documentação)

Toda especificação recebe um esquema de segurança apiKeyAuth se um ainda não estiver presente. Isso é sempre injetado independentemente de o Spectral ter sinalizado ou não.

"components": {
"securitySchemes": {
"apiKeyAuth": {
"type": "apiKey",
"in": "header",
"name": "Authorization",
"description": "F5 XC API Token (format: APIToken <token>)"
}
}
},
"security": [{ "apiKeyAuth": [] }]

A definição do esquema vem de spectral.security_scheme em validation.yaml. Isso informa aos consumidores da API como autenticar, mas não altera o comportamento em tempo de execução.

Alteração de contrato: Não

Todas as especificações JSON de saída passam por um compactador de arrays compatível com Biome (_compact_short_arrays em scripts/utils/spec_loader.py). Arrays curtos que cabem em 120 caracteres são colapsados em uma única linha:

// Before
"enum": [
"ACTIVE",
"INACTIVE"
]
// After
"enum": ["ACTIVE", "INACTIVE"]

Arrays que excedem o limite de comprimento de linha permanecem em múltiplas linhas.

Quando múltiplas estratégias de correção podem ser aplicadas, o reconciliador usa uma ordem de prioridade configurada em reconciliation.priority:

  1. existing — Usar a restrição existente da especificação se for válida
  2. discovery — Usar o comportamento descoberto da API em produção
  3. inferred — Inferir a partir de padrões em endpoints similares

Toda especificação corrigida é validada com openapi-spec-validator após todas as correções serem aplicadas. Se a validação falhar, a especificação original é usada como fallback e a correção é registrada como erro.