Zum Inhalt springen

Entwicklungshandbuch

Dieses Handbuch beschreibt den Entwicklungsworkflow für die F5 XC API-Anreicherungspipeline.

Terminal-Fenster
# 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-Fenster
# 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
VerzeichnisZweckGit-Status
specs/original/F5-QuellspezifikationenGitignored
specs/discovered/API-Discovery-AusgabeVerfolgt (openapi.json, session.json)
docs/specifications/api/Generierte Domain-SpezifikationenGitignored
scripts/Python-Pipeline-SkripteVerfolgt
config/Pipeline-KonfigurationVerfolgt
reports/Generierte BerichteGitignored

Voraussetzungen:

  • VPN-Verbindung zur F5 XC-Umgebung
  • Gültige API-Anmeldedaten
Terminal-Fenster
# 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

Discovery erfasst:

  • Tatsächliche Pflicht-/optionale Felder
  • Enum-Werte aus Live-Antworten
  • Standardwerte
  • Mustervalidierungen
  • Antwortbeispiele

Releases werden automatisiert:

  1. Täglicher Zeitplan (6:00 Uhr UTC) oder Push auf main löst den Workflow aus
  2. ETag-Prüfung stellt fest, ob sich F5-Spezifikationen geändert haben
  3. Pipeline verarbeitet und reichert Spezifikationen an
  4. Version wird aus Git-Tags berechnet: git describe --tags --abbrev=0
  5. Direkter Commit + Tag erstellt (kein Versions-Bump-PR)
  6. GitHub Release mit Changelog erstellt
  7. Dokumentation auf GitHub Pages bereitgestellt

Regeln für Versions-Bumps:

BedingungBump-TypBeispiel
[major] im CommitMajor1.0.0 → 2.0.0
BREAKING CHANGE im CommitMajor1.0.0 → 2.0.0
Neue Domain-Spezifikation hinzugefügtMinor1.0.0 → 1.1.0
Jede andere ÄnderungPatch1.0.0 → 1.0.1
Terminal-Fenster
# 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

Discovery erkundet die Live-F5 XC-API, um Folgendes zu finden:

  • Undokumentierte Einschränkungen: Pflichtfelder, die in OpenAPI nicht als solche markiert sind
  • Tatsächliche Enum-Werte: Echte in der Produktion verwendete Werte
  • Standardverhalten: Vom Server angewendete Werte, wenn Felder weggelassen werden
  • Antwortmuster: Tatsächliche Datenstrukturen
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

Discovery fügt x-discovered-*-Erweiterungen zu Spezifikationen hinzu:

{
"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-Fenster
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

Die Anreicherungspipeline verwendet Vendor-Erweiterungen, um Validierungs- und Standardwert-Metadaten einzubetten.

ErweiterungBedeutungAuswirkung
x-f5xc-server-defaultDer F5 XC API-Server wendet diesen Wert an, wenn das Feld weggelassen wirdDas Feld ist optional; das Weglassen erzeugt das dokumentierte Standardverhalten
x-f5xc-recommended-valueDie F5 XC-Webkonsole befüllt diesen Wert für neue Ressourcen vorDas Feld hat keinen Serverstandard, aber dieser Wert repräsentiert eine typische Konfiguration
x-f5xc-recommended-oneof-variantDie F5 XC-Konsole wählt diese OneOf-Variante vorIdentifiziert die typische Auswahl, wenn mehrere sich gegenseitig ausschließende Optionen vorhanden sind
x-f5xc-conflicts-withListet andere Eigenschaften auf, die nicht zusammen mit diesem Feld verwendet werden könnenDie Eigenschaft ist Teil einer OneOf-Gruppe; nur eine der in Konflikt stehenden Eigenschaften kann angegeben werden
ErweiterungQuelleZweck
x-ves-required: "true"F5 XC-OriginalspezifikationFeld erfordert einen Nicht-Null-/Nicht-leer-Wert
x-f5xc-required-forAnreicherungspipelineKontextspezifischer Pflichtstatus

x-f5xc-required-for-Kontexte:

  • create: Erforderlich beim Erstellen der Ressource
  • update: Erforderlich beim Aktualisieren der Ressource
  • minimum_config: Erforderlich für die Mindestkonfiguration
ErweiterungZweck
x-f5xc-server-default: trueMarkiert vom Server angewendete Standardwerte
x-f5xc-recommended-valueVom F5 XC-Konsolenvorbefüllter Wert
x-f5xc-recommended-oneof-variantEmpfohlene OneOf-Variante
x-f5xc-conflicts-withGegenseitige Ausschlussmäßigkeit mit anderen OneOf-Eigenschaften

Typ: boolean

Wenn true, gibt dies an, dass der begleitende default-Wert vom F5 XC API-Server durchgesetzt wird. Felder mit dieser Erweiterung können sicher aus API-Anfragen weggelassen werden — der Server wendet den Standardwert automatisch an.

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

Typ: any (entspricht dem Feldtyp)

Gibt einen Wert an, den die F5 XC-Webkonsole als vorbefüllten Standardwert verwendet. Dieser Wert wird nicht vom Server durchgesetzt, repräsentiert aber die typische Ausgangskonfiguration für neue Ressourcen, die über die Konsole erstellt werden.

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

Typ: object (Zuordnung von Gruppenname zu Variantenname)

Für Schemas mit sich gegenseitig ausschließenden Feldgruppen wird angegeben, welche Variante die Standard- oder häufigste Wahl ist. Der Schlüssel ist der OneOf-Gruppenname und der Wert ist der empfohlene Variantenfeldname.

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

Typ: array aus Zeichenketten

Hinzugefügt: v3.2.0 (Issue #494)

Deklariert gegenseitige Ausschlussbeziehungen zwischen OneOf-Gruppenmitgliedern. Automatisch aus x-ves-oneof-field-*-Erweiterungen abgeleitet. Dies ermöglicht nachgelagerten Werkzeugen (Terraform, CLI, MCP), Konflikte auf Schema-Ebene statt zur Laufzeit zu validieren.

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

Anwendungsfälle:

  • Terraform-Provider können Validierungsregeln generieren
  • CLI-Werkzeuge können vor in Konflikt stehenden Feldkombinationen warnen
  • KI-Assistenten können korrekte OneOf-Konfigurationen generieren
  • IDE-Erweiterungen können konfliktbewusste Autovervollständigung bereitstellen

Quelle: Automatisch aus nativen F5 x-ves-oneof-field-*-Erweiterungen während der Pipeline-Anreicherung abgeleitet.

Der Anreicherungsprozess untersucht x-ves-validation-rules, um den Pflichtstatus abzuleiten:

RegelAuswirkung
ves.io.schema.rules.message.required: "true"Feld ist Pflichtfeld
ves.io.schema.rules.uint32.gte: NWenn N >= 1 und kein Serverstandard, ist das Feld Pflichtfeld
ves.io.schema.rules.repeated.min_items: NWenn N >= 1, erfordert das Array mindestens N Elemente
ves.io.schema.rules.string.min_bytes: NWenn N >= 1, erfordert die Zeichenkette mindestens N Bytes

Ressourcen mit vom Server angewendeten Standardwerten

Abschnitt betitelt „Ressourcen mit vom Server angewendeten Standardwerten“

Einige Ressourcen akzeptieren leere Spezifikationen, weil der Server Standardwerte anwendet:

RessourceVom Server angewendete Standardwerte
app_firewallmonitoring: \{\}, default_detection_settings: \{\}
rate_limiterlimits: [], user_identification: []
api_definitionswagger_specs: [], Standard-api_groups
healthcheckjitter: 0, jitter_percent: 0, verschachtelte http_health_check-Standardwerte

Für diese Ressourcen kann x-f5xc-required-for.create false sein, auch wenn x-ves-required true ist.

MusterTypBeispiel
\{\}Leeres Objekt (Auswahlauswahl)monitoring: \{\}
[]Leeres Arrayexpected_status_codes: []
0Numerischjitter: 0
""Zeichenketteexpected_response: ""
falseBooleschuse_http2: false
  1. Ressource in F5 XC mit minimaler Spezifikation über die API erstellen
  2. Ressource zurücklesen, um vom Server angewendete Werte zu sehen
  3. Standardwerte in config/discovered_defaults.yaml dokumentieren
  4. Pipeline ausführen: make pipeline
  5. Überprüfen mit: jq '.components.schemas | to_entries[] | select(.key | contains("resource_name"))'

Die Pipeline wird bei jedem Commit ausgeführt, um Konsistenz sicherzustellen. Für Work-in-Progress-Commits:

Terminal-Fenster
git commit --no-verify -m "WIP: work in progress"
# Run before final commit: make pre-commit-run
Terminal-Fenster
# 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-Fenster
# Check lint report
cat reports/lint-report.json | jq '.errors'

Beheben Sie Probleme in der Anreicherungs-/Normalisierungskonfiguration, nicht in den Ausgabedateien.

Die Version wird aus Git-Tags abgeleitet (z. B. v2.0.38), wodurch Race Conditions vermieden werden, die bei gleichzeitigen PRs zu Merge-Konflikten führten.

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

Generierte Spezifikationen sind gitignored:

Terminal-Fenster
make build # Downloads and generates everything

Ausnahme zu .pre-commit-config.yaml hinzufügen:

- id: check-added-large-files
exclude: ^path/to/large/file\.json$
ZielBeschreibung
make buildVollständiger Build (Herunterladen + Pipeline)
make rebuildSchneller Rebuild (Download überspringen)
make downloadSpezifikationen herunterladen (ETag gecacht)
make download-forceDownload erzwingen
make pipelineAnreicherungspipeline ausführen
make lintSpectral-Linting
make serveLokaler Dokumentationsserver
make discoverAPI-Discovery (VPN erforderlich)
make push-discoveryDiscovery-Daten committen
make cleanGenerierte Dateien entfernen
make pre-commit-runAlle Qualitätsprüfungen ausführen
VariableZweck
F5XC_API_URLF5 XC-Mandanten-API-URL
F5XC_API_TOKENAPI-Authentifizierungstoken
DateiZweck
.etagZuletzt heruntergeladener ETag
CHANGELOG.mdAutomatisch generierter Changelog
config/enrichment.yamlAnreicherungsregeln
config/normalization.yamlNormalisierungsregeln
config/discovery.yamlDiscovery-Einstellungen
config/spectral.yamlLinting-Regeln
scripts/utils/version_calculator.pyTag-basierte Versionsberechnung

Hinweis: Die Version wird aus Git-Tags abgeleitet (z. B. v2.0.38), nicht aus einer .version-Datei.