Aller au contenu

Guide de développement

Ce guide décrit le workflow de développement pour le pipeline d’enrichissement des API F5 XC.

Fenêtre de terminal
# 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
Fenêtre de terminal
# 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
RépertoireRôleÉtat Git
specs/original/Spécifications source F5Gitignored
specs/discovered/Sortie de la découverte des APISuivi (openapi.json, session.json)
docs/specifications/api/Spécifications de domaine généréesGitignored
scripts/Scripts Python du pipelineSuivi
config/Configuration du pipelineSuivi
reports/Rapports générésGitignored

Prérequis :

  • Connexion VPN à l’environnement F5 XC
  • Identifiants API valides
Fenêtre de terminal
# 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 découverte capture :

  • Les champs requis/optionnels réels
  • Les valeurs d’énumération issues des réponses en production
  • Les valeurs par défaut
  • Les validations de pattern
  • Les exemples de réponse

Les publications sont automatisées :

  1. Le planning quotidien (6h UTC) ou un push sur main déclenche le workflow
  2. La vérification ETag détermine si les spécifications F5 ont changé
  3. Le pipeline traite et enrichit les spécifications
  4. La version est calculée à partir des tags git : git describe --tags --abbrev=0
  5. Un commit direct + tag est créé (sans PR de mise à jour de version)
  6. Une GitHub Release est créée avec le changelog
  7. La documentation est déployée sur GitHub Pages

Règles de mise à jour de version :

ConditionType de mise à jourExemple
[major] dans le commitMajeure1.0.0 → 2.0.0
BREAKING CHANGE dans le commitMajeure1.0.0 → 2.0.0
Nouvelle spécification de domaine ajoutéeMineure1.0.0 → 1.1.0
Tout autre changementPatch1.0.0 → 1.0.1
Fenêtre de terminal
# 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 découverte explore l’API F5 XC active pour trouver :

  • Des contraintes non documentées : Champs requis non marqués dans OpenAPI
  • Les valeurs d’énumération réelles : Valeurs réelles observées en production
  • Les comportements par défaut : Valeurs appliquées par le serveur lorsque les champs sont omis
  • Les patterns de réponse : Formes réelles des données
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 découverte ajoute des extensions x-discovered-* aux spécifications :

{
"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
Fenêtre de terminal
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

Le pipeline d’enrichissement utilise des extensions vendeur pour intégrer les métadonnées de validation et de valeurs par défaut.

ExtensionSignificationImplication
x-f5xc-server-defaultLe serveur API F5 XC applique cette valeur lorsque le champ est omisLe champ est optionnel ; son omission produit le comportement par défaut documenté
x-f5xc-recommended-valueLa console web F5 XC pré-remplit cette valeur pour les nouvelles ressourcesLe champ n’a pas de valeur par défaut serveur, mais cette valeur représente une configuration type
x-f5xc-recommended-oneof-variantLa console F5 XC présélectionne cette variante OneOfIdentifie le choix type lorsque plusieurs options mutuellement exclusives existent
x-f5xc-conflicts-withListe les autres propriétés qui ne peuvent pas être utilisées conjointement avec ce champLa propriété fait partie d’un groupe OneOf ; une seule des propriétés en conflit peut être spécifiée
ExtensionSourceRôle
x-ves-required: "true"Spécification originale F5 XCLe champ requiert une valeur non nulle/non vide
x-f5xc-required-forPipeline d’enrichissementStatut requis selon le contexte

Contextes de x-f5xc-required-for :

  • create : Requis lors de la création de la ressource
  • update : Requis lors de la mise à jour de la ressource
  • minimum_config : Requis pour une configuration minimale viable
ExtensionRôle
x-f5xc-server-default: trueMarque les valeurs par défaut appliquées par le serveur
x-f5xc-recommended-valueValeur pré-remplie par la console F5 XC
x-f5xc-recommended-oneof-variantVariante OneOf recommandée
x-f5xc-conflicts-withExclusivité mutuelle avec d’autres propriétés OneOf

Type : boolean

Lorsque la valeur est true, indique que la valeur default associée est appliquée par le serveur API F5 XC. Les champs dotés de cette extension peuvent être omis en toute sécurité des requêtes API — le serveur applique la valeur par défaut automatiquement.

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

Type : any (correspond au type du champ)

Spécifie une valeur que la console web F5 XC utilise comme valeur par défaut pré-remplie. Cette valeur n’est pas appliquée par le serveur, mais représente la configuration de départ type pour les nouvelles ressources créées via la console.

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

Type : object (correspondance entre nom de groupe et nom de variante)

Pour les schémas comportant des groupes de champs mutuellement exclusifs, identifie la variante par défaut ou la plus courante. La clé est le nom du groupe OneOf et la valeur est le nom du champ de la variante recommandée.

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

Type : array de chaînes

Ajouté : v3.2.0 (Issue #494)

Déclare les relations d’exclusivité mutuelle entre les membres d’un groupe OneOf. Dérivé automatiquement des extensions x-ves-oneof-field-*. Cela permet aux outils en aval (Terraform, CLI, MCP) de valider les conflits au niveau du schéma plutôt qu’à l’exécution.

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

Cas d’usage :

  • Les fournisseurs Terraform peuvent générer des règles de validation
  • Les outils CLI peuvent avertir des combinaisons de champs en conflit
  • Les assistants IA peuvent générer des configurations OneOf correctes
  • Les extensions IDE peuvent fournir une autocomplétion tenant compte des conflits

Source : Dérivé automatiquement des extensions natives F5 x-ves-oneof-field-* lors de l’enrichissement par le pipeline.

L’enrichisseur inspecte x-ves-validation-rules pour inférer le statut requis :

RègleImplication
ves.io.schema.rules.message.required: "true"Le champ est requis
ves.io.schema.rules.uint32.gte: NSi N >= 1 et sans valeur par défaut serveur, le champ est requis
ves.io.schema.rules.repeated.min_items: NSi N >= 1, le tableau requiert au moins N éléments
ves.io.schema.rules.string.min_bytes: NSi N >= 1, la chaîne requiert au moins N octets

Ressources avec des valeurs par défaut appliquées par le serveur

Section intitulée « Ressources avec des valeurs par défaut appliquées par le serveur »

Certaines ressources acceptent des spécifications vides car le serveur applique des valeurs par défaut :

RessourceValeurs par défaut appliquées par le serveur
app_firewallmonitoring: \{\}, default_detection_settings: \{\}
rate_limiterlimits: [], user_identification: []
api_definitionswagger_specs: [], api_groups par défaut
healthcheckjitter: 0, jitter_percent: 0, valeurs par défaut http_health_check imbriquées

Pour ces ressources, x-f5xc-required-for.create peut être false même lorsque x-ves-required est true.

PatternTypeExemple
\{\}Objet vide (sélection de choix)monitoring: \{\}
[]Tableau videexpected_status_codes: []
0Numériquejitter: 0
""Chaîneexpected_response: ""
falseBooléenuse_http2: false
  1. Créer la ressource dans F5 XC avec une spécification minimale via l’API
  2. Relire la ressource pour voir les valeurs appliquées par le serveur
  3. Documenter les valeurs par défaut dans config/discovered_defaults.yaml
  4. Exécuter le pipeline : make pipeline
  5. Vérifier avec : jq '.components.schemas | to_entries[] | select(.key | contains("resource_name"))'

Le pipeline s’exécute à chaque commit pour garantir la cohérence. Pour les commits en cours de travail :

Fenêtre de terminal
git commit --no-verify -m "WIP: work in progress"
# Run before final commit: make pre-commit-run
Fenêtre de terminal
# 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

Erreurs de lint sur les spécifications générées

Section intitulée « Erreurs de lint sur les spécifications générées »
Fenêtre de terminal
# Check lint report
cat reports/lint-report.json | jq '.errors'

Corrigez les problèmes dans la configuration d’enrichissement/normalisation, et non dans les fichiers de sortie.

La version est dérivée des tags git (ex. : v2.0.38), éliminant ainsi les conditions de concurrence qui causaient des conflits de fusion sur les PR simultanées.

# 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"

Les spécifications générées sont gitignorées :

Fenêtre de terminal
make build # Downloads and generates everything

Ajoutez une exclusion dans .pre-commit-config.yaml :

- id: check-added-large-files
exclude: ^path/to/large/file\.json$
CibleDescription
make buildConstruction complète (téléchargement + pipeline)
make rebuildReconstruction rapide (sans téléchargement)
make downloadTélécharger les spécifications (mise en cache ETag)
make download-forceForcer le téléchargement
make pipelineExécuter le pipeline d’enrichissement
make lintLinting Spectral
make serveServeur de documentation local
make discoverDécouverte des API (VPN requis)
make push-discoveryCommiter les données de découverte
make cleanSupprimer les fichiers générés
make pre-commit-runExécuter tous les contrôles qualité
VariableRôle
F5XC_API_URLURL de l’API du tenant F5 XC
F5XC_API_TOKENJeton d’authentification API
FichierRôle
.etagDernier ETag téléchargé
CHANGELOG.mdChangelog généré automatiquement
config/enrichment.yamlRègles d’enrichissement
config/normalization.yamlRègles de normalisation
config/discovery.yamlParamètres de découverte
config/spectral.yamlRègles de linting
scripts/utils/version_calculator.pyCalcul de version basé sur les tags

Remarque : La version est dérivée des tags git (ex. : v2.0.38), et non d’un fichier .version.