コンテンツにスキップ

上流スペックに適用される修正

リコンサイラー(scripts/reconcile.py)は、上流スペックに対して4つのカテゴリの修正を適用します。制約の修正はAPIコントラクトを観測された動作に一致するよう変更します。その他のすべての修正はメタデータのみであり、APIコントラクトを変更しません。

これらの修正は、スペックがライブAPIが実際に適用する内容と一致するよう、OpenAPIスキーマの制約を調整します。各修正は、バリデーション中に生成されるDiscrepancyオブジェクトによって駆動されます。

戦略トリガー動作内容コントラクト変更
緩和SPEC_STRICTERスペックがAPIが受け入れる値を拒否している。minLength/minimumを下げ、maxLength/maximumを上げ、不足しているenum値を追加する。あり — 受け入れ値を拡大
厳格化SPEC_LOOSERスペックがAPIが拒否する値を受け入れている。minLength/minimumを上げ、maxLength/maximumを下げ、enumを観測された値に制限する。あり — 受け入れ値を縮小
追加MISSING_CONSTRAINTAPIがスペックに文書化されていない制約を適用している。スキーマに制約を追加する。あり — 新しい制約を追加
削除EXTRA_CONSTRAINTスペックがAPIが無視する制約を宣言している。スキーマから制約を削除する。あり — 制約を削除

テストおよび修正される10のOpenAPI制約カテゴリ:

  • 文字列長minLengthmaxLength
  • パターンpattern(正規表現)
  • 数値範囲minimummaximumexclusiveMinimumexclusiveMaximum
  • 必須フィールドrequired
  • Enum値enum
  • 配列範囲minItemsmaxItemsuniqueItems
  • オブジェクト構造additionalPropertiespropertiespropertyNames
  • 合成oneOfanyOfallOf
  • 依存関係dependentRequireddependentSchemas
  • データ型typeformat

これらの修正は、Spectralリンティングで検出されたOAS3品質の問題に対処します。API動作を変更することなく、メタデータを追加または修正します。

ルール: oas3-api-servers | コントラクト変更: なし

serversブロックが欠落しているスペックにF5 XCテナントURLテンプレートを追加します:

"servers": [{
"url": "https://{tenant}.console.ves.volterra.io",
"description": "F5 Distributed Cloud API",
"variables": {
"tenant": {
"default": "example-tenant",
"description": "Your F5 XC tenant name"
}
}
}]

サーバーURLと変数値はvalidation.yamlspectral.serversから取得されます。

ルール: info-contact | コントラクト変更: なし

連絡先情報が欠落しているスペックのinfo.contactに連絡先情報を追加します:

"contact": {
"name": "F5 Distributed Cloud",
"url": "https://docs.cloud.f5.com",
"email": "support@f5.com"
}

値はvalidation.yamlspectral.contactから取得されます。

ルール: operation-tags | コントラクト変更: なし

タグが付いていないオペレーションに対して、URLパスプレフィックスからタグを導出します。/api/config/namespaces/{namespace}/healthchecksのようなパスの場合、タグはconfig(2番目の非パラメータセグメント)になります。タグはオペレーションのtags配列とスペックレベルのtagsリストの両方に追加されます。

ルール: oas3-unused-component | コントラクト変更: なし

スペック内のどこからも参照されていないコンポーネントスキーマをcomponents.schemasから削除します。オペレーションに影響を与えることなくスペックサイズを削減します。

ルール: operation-operationId-unique | コントラクト変更: なし

複数のオペレーションが同じoperationIdを共有している場合、HTTPメソッドをサフィックスとして付加します(例:ListItems_get)。これにより、コードジェネレーター向けに各operationIdを一意にします。

ルール: oas3-valid-schema-example | コントラクト変更: なし

値がスキーマ自体の制約に適合しない場合(型の不一致、範囲外など)、スキーマからexampleまたはdefault値を削除します。コードジェネレーターが無効なサンプルペイロードを生成するのを防ぎます。

ルール: no-script-tags-in-markdown | コントラクト変更: なし

正規表現置換を使用してdescriptionフィールドから<script>タグを除去します。一部の上流スペックには、ドキュメントレンダラーを壊すインジェクトされたスクリプトタグが含まれています。

コントラクト変更: なし(ドキュメントのみ)

すべてのスペックには、まだ存在しない場合にapiKeyAuthセキュリティスキームが追加されます。これはSpectralがフラグを立てたかどうかに関係なく、常に挿入されます。

"components": {
"securitySchemes": {
"apiKeyAuth": {
"type": "apiKey",
"in": "header",
"name": "Authorization",
"description": "F5 XC API Token (format: APIToken <token>)"
}
}
},
"security": [{ "apiKeyAuth": [] }]

スキーム定義はvalidation.yamlspectral.security_schemeから取得されます。これはAPIコンシューマーに認証方法を伝えますが、ランタイム動作は変更しません。

コントラクト変更: なし

すべての出力JSONスペックは、Biome互換の配列コンパクター(scripts/utils/spec_loader.py_compact_short_arrays)を通過します。120文字以内に収まる短い配列は1行に折りたたまれます:

// Before
"enum": [
"ACTIVE",
"INACTIVE"
]
// After
"enum": ["ACTIVE", "INACTIVE"]

行長の閾値を超える配列は複数行のまま維持されます。

複数の修正戦略が適用可能な場合、リコンサイラーはreconciliation.priorityで設定された優先順位を使用します:

  1. existing — 既存のスペック制約が有効であればそれを使用
  2. discovery — 発見されたライブAPI動作を使用
  3. inferred — 類似エンドポイント間のパターンから推論

すべての修正が適用された後、修正済みスペックはopenapi-spec-validatorで検証されます。検証が失敗した場合、元のスペックがフォールバックとして使用され、修正はエラーとしてログに記録されます。