تخطَّ إلى المحتوى

دليل التطوير

يصف هذا الدليل سير عمل التطوير لخط أنابيب إثراء 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
الدليلالغرضحالة Git
specs/original/مواصفات F5 المصدرمُستثنى من Git
specs/discovered/مخرجات اكتشاف APIمُتتبَّع (openapi.json, session.json)
docs/specifications/api/مواصفات النطاق المُولَّدةمُستثنى من Git
scripts/نصوص Python لخط الأنابيبمُتتبَّع
config/إعداد خط الأنابيبمُتتبَّع
reports/التقارير المُولَّدةمُستثنى من Git

المتطلبات المسبقة:

  • اتصال VPN ببيئة F5 XC
  • بيانات اعتماد 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

ما يلتقطه الاكتشاف:

  • الحقول المطلوبة/الاختيارية الفعلية
  • قيم Enum من الاستجابات المباشرة
  • القيم الافتراضية
  • عمليات التحقق من الأنماط
  • أمثلة الاستجابات

الإصدارات مؤتمتة:

  1. الجدول اليومي (6 صباحًا بتوقيت UTC) أو الدفع إلى الفرع الرئيسي يُشغّل سير العمل
  2. يحدد فحص ETag ما إذا كانت مواصفات F5 قد تغيرت
  3. يُعالج خط الأنابيب المواصفات ويُثريها
  4. يُحسب الإصدار من وسوم git: git describe --tags --abbrev=0
  5. يُنشأ commit مباشر + وسم (بدون PR لرفع الإصدار)
  6. يُنشأ إصدار GitHub مع سجل التغييرات
  7. يُنشر التوثيق على GitHub Pages

قواعد رفع الإصدار:

الشرطنوع الرفعمثال
[major] في الـ commitرئيسي1.0.0 → 2.0.0
BREAKING CHANGE في الـ commitرئيسي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
  • قيم Enum الفعلية: القيم الحقيقية المرصودة في الإنتاج
  • السلوكيات الافتراضية: القيم التي يُطبقها الخادم عند حذف الحقول
  • أنماط الاستجابة: أشكال البيانات الفعلية
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-valueتملأ واجهة F5 XC الويب هذه القيمة مسبقًا للموارد الجديدةلا يوجد افتراضي للخادم للحقل لكن هذه القيمة تمثل الإعداد النموذجي
x-f5xc-recommended-oneof-variantتختار وحدة تحكم F5 XC هذا المتغير من OneOf مسبقًايُحدد الخيار النموذجي عند وجود خيارات متعددة متنافية
x-f5xc-conflicts-withيسرد الخصائص الأخرى التي لا يمكن استخدامها مع هذا الحقلالخاصية جزء من مجموعة OneOf؛ يمكن تحديد خاصية واحدة فقط من الخصائص المتعارضة

امتدادات الحقول المطلوبة

Section titled “امتدادات الحقول المطلوبة”
الامتدادالمصدرالغرض
x-ves-required: "true"مواصفة F5 XC الأصليةيتطلب الحقل قيمة غير صفرية/غير فارغة
x-f5xc-required-forخط أنابيب الإثراءالحالة المطلوبة حسب السياق

سياقات x-f5xc-required-for:

  • create: مطلوب عند إنشاء المورد
  • update: مطلوب عند تحديث المورد
  • minimum_config: مطلوب للحد الأدنى من الإعداد القابل للتطبيق

امتدادات القيم الافتراضية وOneOf

Section titled “امتدادات القيم الافتراضية وOneOf”
الامتدادالغرض
x-f5xc-server-default: trueيُعلّم الإعدادات الافتراضية التي يُطبقها الخادم
x-f5xc-recommended-valueقيمة مُملأة مسبقًا في وحدة تحكم F5 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 الويب كإعداد افتراضي مُملأ مسبقًا. هذه القيمة غير مُفرَّضة من قبل الخادم لكنها تمثل الإعداد الأولي النموذجي للموارد الجديدة التي تُنشأ عبر وحدة التحكم.

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 التحذير من مجموعات الحقول المتعارضة
  • يمكن لمساعدي الذكاء الاصطناعي توليد إعدادات 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 بايت على الأقل

الموارد ذات الإعدادات الافتراضية المُطبَّقة من الخادم

Section titled “الموارد ذات الإعدادات الافتراضية المُطبَّقة من الخادم”

تقبل بعض الموارد مواصفات فارغة لأن الخادم يُطبق الإعدادات الافتراضية:

الموردالإعدادات الافتراضية المُطبَّقة من الخادم
app_firewallmonitoring: \{\}, default_detection_settings: \{\}
rate_limiterlimits: [], user_identification: []
api_definitionswagger_specs: [], default api_groups
healthcheckjitter: 0, jitter_percent: 0, nested http_health_check defaults

بالنسبة لهذه الموارد، قد تكون x-f5xc-required-for.create بقيمة false حتى عندما تكون x-ves-required بقيمة true.

أنماط القيم الافتراضية

Section titled “أنماط القيم الافتراضية”
النمطالنوعمثال
\{\}كائن فارغ (اختيار نوع)monitoring: \{\}
[]مصفوفة فارغةexpected_status_codes: []
0رقميjitter: 0
""نصيexpected_response: ""
falseمنطقيuse_http2: false

إضافة الإعدادات الافتراضية المُكتشَفة

Section titled “إضافة الإعدادات الافتراضية المُكتشَفة”
  1. إنشاء المورد في F5 XC بمواصفة بحد أدنى عبر API
  2. قراءة المورد مجددًا لرؤية القيم التي طبّقها الخادم
  3. توثيق الإعدادات الافتراضية في config/discovered_defaults.yaml
  4. تشغيل خط الأنابيب: make pipeline
  5. التحقق باستخدام: jq '.components.schemas | to_entries[] | select(.key | contains("resource_name"))'

استكشاف الأخطاء وإصلاحها

Section titled “استكشاف الأخطاء وإصلاحها”

pre-commit يستغرق وقتًا طويلاً

Section titled “pre-commit يستغرق وقتًا طويلاً”

يعمل خط الأنابيب على كل commit لضمان الاتساق. بالنسبة للـ commits قيد التقدم:

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

أخطاء الفحص في المواصفات المُولَّدة

Section titled “أخطاء الفحص في المواصفات المُولَّدة”
Terminal window
# Check lint report
cat reports/lint-report.json | jq '.errors'

أصلح المشكلات في إعداد الإثراء/التطبيع، وليس في ملفات المخرجات.

يُشتق الإصدار من وسوم git (مثل v2.0.38)، مما يُزيل حالات التعارض التي كانت تُسبب تعارضات الدمج في PRs المتزامنة.

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

مواصفات مفقودة بعد الاستنساخ

Section titled “مواصفات مفقودة بعد الاستنساخ”

المواصفات المُولَّدة مُستثناة من 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 lintفحص Spectral
make serveخادم التوثيق المحلي
make discoverاكتشاف API (يتطلب VPN)
make push-discoveryتثبيت بيانات الاكتشاف
make cleanإزالة الملفات المُولَّدة
make pre-commit-runتشغيل جميع فحوصات الجودة
المتغيرالغرض
F5XC_API_URLعنوان URL لـ API خاصة بمستأجر F5 XC
F5XC_API_TOKENرمز مصادقة API
الملفالغرض
.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.