Salta ai contenuti

Guida allo sviluppo

Questa guida descrive il flusso di lavoro di sviluppo per la pipeline di arricchimento API F5 XC.

Terminal window
# Clone the repository
git clone https://github.com/f5-sales-demo/api-specs-enriched.git
cd api-specs-enriched
# Create virtual environment and install dependencies
make install
# Install pre-commit hooks
make pre-commit-install
# Download specs and run pipeline
make build
# Preview documentation locally
make serve
Terminal window
# Quick rebuild (uses cached specs)
make rebuild
# Run all quality checks
make pre-commit-run
# Preview documentation
make serve
┌─────────────────────┐ ┌─────────────────────────────┐
│ specs/original/ │────▶│ docs/specifications/api/ │
│ (READ-ONLY) │ │ (GENERATED) │
│ - Downloaded │ │ - Domain specs │
│ - Gitignored │ │ - Master spec │
│ - ETag cached │ │ - GitHub Pages │
└─────────────────────┘ └─────────────────────────────┘
Download (ETag) → Enrich → Normalize → Merge → Lint → Serve
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
270 specs Branding Fix refs 23 domains Spectral
+ Grammar + Types + Master rules
DirectoryScopoStato Git
specs/original/Specifiche sorgente F5Gitignored
specs/discovered/Output discovery APITracciato (openapi.json, session.json)
docs/specifications/api/Specifiche di dominio generateGitignored
scripts/Script Python della pipelineTracciato
config/Configurazione della pipelineTracciato
reports/Report generatiGitignored

Prerequisiti:

  • Connessione VPN all’ambiente F5 XC
  • Credenziali API valide
Terminal window
# Set credentials
export F5XC_API_URL="https://your-tenant.console.ves.volterra.io/api"
export F5XC_API_TOKEN="your-api-token"
# Run discovery
make discover
# View results
jq '.statistics' specs/discovered/session.json
# Commit for CI/CD
make push-discovery

La discovery acquisisce:

  • Campi effettivamente obbligatori/facoltativi
  • Valori enum dalle risposte live
  • Valori predefiniti
  • Validazioni tramite pattern
  • Esempi di risposta

I rilasci sono automatizzati:

  1. La pianificazione giornaliera (6:00 UTC) o il push al main avvia il flusso di lavoro
  2. Il controllo ETag determina se le specifiche F5 sono cambiate
  3. La pipeline elabora e arricchisce le specifiche
  4. La versione viene calcolata dai tag git: git describe --tags --abbrev=0
  5. Commit diretto + tag creato (nessuna PR di incremento versione)
  6. GitHub Release creata con changelog
  7. Documentazione distribuita su GitHub Pages

Regole di incremento versione:

CondizioneTipo di incrementoEsempio
[major] nel commitMajor1.0.0 → 2.0.0
BREAKING CHANGE nel commitMajor1.0.0 → 2.0.0
Nuova specifica di dominio aggiuntaMinor1.0.0 → 1.1.0
Qualsiasi altra modificaPatch1.0.0 → 1.0.1
Terminal window
# Create feature branch
git checkout -b feature/my-change
# Make changes to config or scripts
# Test locally
make pipeline
make lint
# Commit (pre-commit hooks run automatically)
git add .
git commit -m "feat: add new enrichment rule"
# Push and create PR
git push -u origin feature/my-change
gh pr create

La discovery esplora l’API F5 XC live per trovare:

  • Vincoli non documentati: Campi obbligatori non contrassegnati in OpenAPI
  • Valori enum effettivi: Valori reali rilevati in produzione
  • Comportamenti predefiniti: Valori applicati dal server quando i campi vengono omessi
  • Pattern di risposta: Forme dei dati effettive
config/discovery.yaml
discovery:
exploration:
namespaces:
- "system"
- "shared"
methods:
- "GET"
- "OPTIONS"
max_endpoints_per_run: 500
schema_inference:
sample_size: 3
detect_patterns: true
detect_constraints: true

La discovery aggiunge estensioni x-discovered-* alle specifiche:

{
"properties": {
"name": {
"type": "string",
"x-discovered-required": true,
"x-discovered-pattern": "^[a-z][a-z0-9-]*$",
"x-discovered-examples": ["my-app", "prod-lb"]
}
}
}
reports/constraint-analysis.md
make constraint-report
f5xc-api-specs-v1.0.14.zip
├── openapi.json # Master combined spec
├── openapi.yaml # YAML format
├── domains/ # Individual domain specs
│ ├── api_security.json
│ ├── load_balancer.json
│ └── ...
├── index.json # Metadata
├── CHANGELOG.md # Release notes
└── README.md # Usage instructions
Terminal window
gh workflow run sync-and-enrich.yml
gh run watch
config/enrichment.yaml
enrichment:
branding:
replacements:
"Volterra": "F5 Distributed Cloud"
"VES": "F5 XC"
acronyms:
API: "Application Programming Interface"
DNS: "Domain Name System"
grammar:
enabled: true
language_tool: true
config/normalization.yaml
normalization:
orphan_refs:
fix: true
remove_if_unresolvable: true
empty_operations:
remove: true
type_standardization:
enabled: true
config/spectral.yaml
extends:
- spectral:oas
rules:
operation-operationId: error
operation-tags: warn

La pipeline di arricchimento utilizza estensioni vendor per incorporare metadati di validazione e valori predefiniti.

EstensioneSignificatoImplicazione
x-f5xc-server-defaultIl server API F5 XC applica questo valore quando il campo viene omessoIl campo è facoltativo; ometterlo produce il comportamento predefinito documentato
x-f5xc-recommended-valueLa console web F5 XC pre-popola questo valore per le nuove risorseIl campo non ha un valore predefinito lato server, ma questo valore rappresenta la configurazione tipica
x-f5xc-recommended-oneof-variantLa console F5 XC preseleziona questa variante OneOfIdentifica la scelta tipica quando esistono più opzioni mutuamente esclusive
x-f5xc-conflicts-withElenca altre proprietà che non possono essere utilizzate insieme a questo campoLa proprietà fa parte di un gruppo OneOf; è possibile specificare solo una delle proprietà in conflitto
EstensioneSorgenteScopo
x-ves-required: "true"Specifica originale F5 XCIl campo richiede un valore non zero/non vuoto
x-f5xc-required-forPipeline di arricchimentoStato obbligatorio specifico al contesto

Contesti di x-f5xc-required-for:

  • create: Obbligatorio durante la creazione della risorsa
  • update: Obbligatorio durante l’aggiornamento della risorsa
  • minimum_config: Obbligatorio per la configurazione minima funzionante
EstensioneScopo
x-f5xc-server-default: trueContrassegna i valori predefiniti applicati dal server
x-f5xc-recommended-valueValore pre-popolato dalla console F5 XC
x-f5xc-recommended-oneof-variantVariante OneOf consigliata
x-f5xc-conflicts-withEsclusività reciproca con altre proprietà OneOf

Tipo: boolean

Quando è true, indica che il valore default associato è applicato dal server API F5 XC. I campi con questa estensione possono essere omessi in sicurezza dalle richieste API — il server applica automaticamente il valore predefinito.

use_http2:
type: boolean
default: false
x-f5xc-server-default: true

Tipo: any (corrisponde al tipo del campo)

Specifica un valore che la console web F5 XC utilizza come valore predefinito pre-popolato. Questo valore non è applicato dal server, ma rappresenta la configurazione di partenza tipica per le nuove risorse create tramite la console.

timeout:
type: integer
x-f5xc-recommended-value: 3

Tipo: object (mappa da nome del gruppo a nome della variante)

Per gli schemi con gruppi di campi mutuamente esclusivi, identifica quale variante è quella predefinita o più comune. La chiave è il nome del gruppo OneOf e il valore è il nome del campo della variante consigliata.

healthcheckCreateSpecType:
type: object
x-f5xc-recommended-oneof-variant:
health_check: "http_health_check"

Tipo: array di stringhe

Aggiunta: v3.2.0 (Issue #494)

Dichiara le relazioni di esclusività reciproca tra i membri del gruppo OneOf. Derivata automaticamente dalle estensioni x-ves-oneof-field-*. Ciò consente agli strumenti downstream (Terraform, CLI, MCP) di validare i conflitti a livello di schema anziché a runtime.

host_header:
type: string
x-f5xc-conflicts-with: ["use_origin_server_name"]
use_origin_server_name:
type: object
x-f5xc-conflicts-with: ["host_header"]

Casi d’uso:

  • I provider Terraform possono generare regole di validazione
  • Gli strumenti CLI possono avvisare sulle combinazioni di campi in conflitto
  • Gli assistenti IA possono generare configurazioni OneOf corrette
  • Le estensioni IDE possono fornire completamento automatico con consapevolezza dei conflitti

Sorgente: Derivata automaticamente dalle estensioni native F5 x-ves-oneof-field-* durante l’arricchimento della pipeline.

L’arricchitore ispeziona x-ves-validation-rules per dedurre lo stato obbligatorio:

RegolaImplicazione
ves.io.schema.rules.message.required: "true"Il campo è obbligatorio
ves.io.schema.rules.uint32.gte: NSe N >= 1 e nessun valore predefinito lato server, il campo è obbligatorio
ves.io.schema.rules.repeated.min_items: NSe N >= 1, l’array richiede almeno N elementi
ves.io.schema.rules.string.min_bytes: NSe N >= 1, la stringa richiede almeno N byte

Risorse con valori predefiniti applicati dal server

Sezione intitolata “Risorse con valori predefiniti applicati dal server”

Alcune risorse accettano specifiche vuote perché il server applica i valori predefiniti:

RisorsaValori predefiniti applicati dal server
app_firewallmonitoring: \{\}, default_detection_settings: \{\}
rate_limiterlimits: [], user_identification: []
api_definitionswagger_specs: [], api_groups predefiniti
healthcheckjitter: 0, jitter_percent: 0, valori predefiniti http_health_check annidati

Per queste risorse, x-f5xc-required-for.create può essere false anche quando x-ves-required è true.

PatternTipoEsempio
\{\}Oggetto vuoto (selezione di scelta)monitoring: \{\}
[]Array vuotoexpected_status_codes: []
0Numericojitter: 0
""Stringaexpected_response: ""
falseBooleanouse_http2: false
  1. Creare la risorsa in F5 XC con una specifica minima tramite API
  2. Rileggere la risorsa per vedere i valori applicati dal server
  3. Documentare i valori predefiniti in config/discovered_defaults.yaml
  4. Eseguire la pipeline: make pipeline
  5. Verificare con: jq '.components.schemas | to_entries[] | select(.key | contains("resource_name"))'

La pipeline viene eseguita ad ogni commit per garantire la coerenza. Per i commit in corso di lavorazione:

Terminal window
git commit --no-verify -m "WIP: work in progress"
# Run before final commit: make pre-commit-run
Terminal window
# Check VPN
ping your-tenant.console.ves.volterra.io
# Check credentials
echo $F5XC_API_TOKEN | head -c 10
# Check API URL format
echo $F5XC_API_URL
# Format: https://tenant.console.ves.volterra.io/api
Terminal window
# Check lint report
cat reports/lint-report.json | jq '.errors'

Correggere i problemi nella configurazione di arricchimento/normalizzazione, non nei file di output.

La versione viene derivata dai tag git (es. v2.0.38), eliminando le race condition che causavano conflitti di merge su PR concorrenti.

# Version is calculated dynamically from git tags
from scripts.utils.version_calculator import get_version_from_tags
version = get_version_from_tags() # Returns "2.0.38"

Le specifiche generate sono gitignored:

Terminal window
make build # Downloads and generates everything

Aggiungere un’esclusione a .pre-commit-config.yaml:

- id: check-added-large-files
exclude: ^path/to/large/file\.json$
TargetDescrizione
make buildBuild completa (download + pipeline)
make rebuildRebuild rapida (salta il download)
make downloadScarica le specifiche (con cache ETag)
make download-forceDownload forzato
make pipelineEsegue la pipeline di arricchimento
make lintLinting Spectral
make serveServer locale di documentazione
make discoverDiscovery API (richiede VPN)
make push-discoveryCommit dei dati di discovery
make cleanRimuove i file generati
make pre-commit-runEsegue tutti i controlli di qualità
VariabileScopo
F5XC_API_URLURL API del tenant F5 XC
F5XC_API_TOKENToken di autenticazione API
FileScopo
.etagUltimo ETag scaricato
CHANGELOG.mdChangelog generato automaticamente
config/enrichment.yamlRegole di arricchimento
config/normalization.yamlRegole di normalizzazione
config/discovery.yamlImpostazioni di discovery
config/spectral.yamlRegole di linting
scripts/utils/version_calculator.pyCalcolo della versione basato su tag

Nota: La versione viene derivata dai tag git (es. v2.0.38), non da un file .version.