跳转到内容

开发指南

本指南介绍 F5 XC API 增强管道的开发工作流程。

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
目录用途Git 状态
specs/original/F5 源规格文件已忽略(Gitignored)
specs/discovered/API 发现输出已追踪(openapi.json, session.json)
docs/specifications/api/生成的领域规格文件已忽略(Gitignored)
scripts/Python 管道脚本已追踪
config/管道配置已追踪
reports/生成的报告已忽略(Gitignored)

前置条件

  • 连接至 F5 XC 环境的 VPN
  • 有效的 API 凭据
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

发现内容捕获

  • 实际的必填/可选字段
  • 来自实时响应的枚举值
  • 默认值
  • 模式验证
  • 响应示例

发布流程已自动化:

  1. 每日定时(UTC 凌晨 6 点)或推送至主分支触发工作流程
  2. ETag 检查确定 F5 规格文件是否有变更
  3. 管道处理并增强规格文件
  4. 版本号由 Git 标签计算得出:git describe --tags --abbrev=0
  5. 直接提交并创建标签(无版本升级 PR)
  6. 创建包含变更日志的 GitHub Release
  7. 文档部署至 GitHub Pages

版本升级规则

条件升级类型示例
提交信息包含 [major]主版本1.0.0 → 2.0.0
提交信息包含 BREAKING CHANGE主版本1.0.0 → 2.0.0
新增领域规格文件次版本1.0.0 → 1.1.0
其他任何变更补丁版本1.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

发现功能通过探索实时的 F5 XC API 来查找:

  • 未文档化的约束:OpenAPI 中未标记为必填的字段
  • 实际枚举值:生产环境中实际观察到的值
  • 默认行为:省略字段时服务器应用的值
  • 响应模式:实际的数据结构
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

发现功能向规格文件添加 x-discovered-* 扩展:

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

增强管道使用供应商扩展来嵌入验证和默认值元数据。

扩展含义说明
x-f5xc-server-default省略该字段时,F5 XC API 服务器会自动应用此值字段为可选;省略该字段将产生已文档化的默认行为
x-f5xc-recommended-valueF5 XC Web 控制台为新资源预填充此值字段无服务器默认值,但此值代表典型配置
x-f5xc-recommended-oneof-variantF5 XC 控制台预选此 OneOf 变体在多个互斥选项中标识典型选择
x-f5xc-conflicts-with列出不能与此字段同时使用的其他属性属性属于 OneOf 组;冲突属性中只能指定其中一个
扩展来源用途
x-ves-required: "true"F5 XC 原始规格文件字段需要非零/非空值
x-f5xc-required-for增强管道特定上下文的必填状态

x-f5xc-required-for 上下文

  • create:创建资源时必填
  • update:更新资源时必填
  • minimum_config:最小可行配置时必填
扩展用途
x-f5xc-server-default: true标记服务器应用的默认值
x-f5xc-recommended-valueF5 XC 控制台预填充的值
x-f5xc-recommended-oneof-variant推荐的 OneOf 变体
x-f5xc-conflicts-with与其他 OneOf 属性的互斥关系

类型boolean

当值为 true 时,表示附带的 default 值由 F5 XC API 服务器强制执行。具有此扩展的字段可以安全地从 API 请求中省略——服务器会自动应用默认值。

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

类型any(与字段类型匹配)

指定 F5 XC Web 控制台作为预填充默认值使用的值。此值不由服务器强制执行,但代表通过控制台创建新资源时的典型初始配置。

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

类型object(组名到变体名的映射)

对于具有互斥字段组的模式,标识哪个变体是默认或最常见的选择。键为 OneOf 组名,值为推荐的变体字段名。

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

类型:字符串 array

新增于:v3.2.0(Issue #494)

声明 OneOf 组成员之间的互斥关系。由 x-ves-oneof-field-* 扩展自动推导。这使下游工具(Terraform、CLI、MCP)能够在模式层面而非运行时验证冲突。

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

使用场景

  • Terraform 提供商可生成验证规则
  • CLI 工具可警告冲突字段组合
  • AI 助手可生成正确的 OneOf 配置
  • IDE 扩展可提供冲突感知的自动补全

来源:在管道增强过程中,由 F5 原生 x-ves-oneof-field-* 扩展自动推导。

增强器检查 x-ves-validation-rules 以推断必填状态:

规则说明
ves.io.schema.rules.message.required: "true"字段为必填
ves.io.schema.rules.uint32.gte: N若 N >= 1 且无服务器默认值,则字段为必填
ves.io.schema.rules.repeated.min_items: N若 N >= 1,数组至少需要 N 个元素
ves.io.schema.rules.string.min_bytes: N若 N >= 1,字符串至少需要 N 个字节

某些资源接受空规格文件,因为服务器会应用默认值:

资源服务器应用的默认值
app_firewallmonitoring: \{\}, default_detection_settings: \{\}
rate_limiterlimits: [], user_identification: []
api_definitionswagger_specs: [], 默认 api_groups
healthcheckjitter: 0, jitter_percent: 0, 嵌套 http_health_check 默认值

对于这些资源,即使 x-ves-requiredtruex-f5xc-required-for.create 也可能为 false

模式类型示例
\{\}空对象(选项选择)monitoring: \{\}
[]空数组expected_status_codes: []
0数值jitter: 0
""字符串expected_response: ""
false布尔值use_http2: false
  1. 通过 API 在 F5 XC 中使用最小规格创建资源
  2. 读取资源以查看服务器应用的值
  3. config/discovered_defaults.yaml 中记录默认值
  4. 运行管道:make pipeline
  5. 使用以下命令验证:jq '.components.schemas | to_entries[] | select(.key | contains("resource_name"))'

管道在每次提交时运行以确保一致性。对于进行中的提交:

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'

请在增强/规范化配置中修复问题,而非直接修改输出文件。

版本号由 Git 标签推导(例如 v2.0.38),消除了并发 PR 上导致合并冲突的竞态条件。

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

生成的规格文件已被 Git 忽略:

Terminal window
make build # Downloads and generates everything

.pre-commit-config.yaml 中添加排除规则:

- id: check-added-large-files
exclude: ^path/to/large/file\.json$
目标描述
make build完整构建(下载 + 管道)
make rebuild快速重新构建(跳过下载)
make download下载规格文件(ETag 缓存)
make download-force强制下载
make pipeline运行增强管道
make lintSpectral 代码检查
make serve本地文档服务器
make discoverAPI 发现(需要 VPN)
make push-discovery提交发现数据
make clean删除生成的文件
make pre-commit-run运行所有质量检查
变量用途
F5XC_API_URLF5 XC 租户 API URL
F5XC_API_TOKENAPI 认证令牌
文件用途
.etag上次下载的 ETag
CHANGELOG.md自动生成的变更日志
config/enrichment.yaml增强规则
config/normalization.yaml规范化规则
config/discovery.yaml发现设置
config/spectral.yaml代码检查规则
scripts/utils/version_calculator.py基于标签的版本计算

注意:版本号由 Git 标签推导(例如 v2.0.38),而非来自 .version 文件。