概要

validation-genフレームワークにDeferred Validation(遅延バリデーション)という新しいアーキテクチャを導入しました。条件付きバリデーションタグ(+k8s:ifEnabled等)の内側に状態を持つバリデーションタグ(+k8s:update=NoModify等)を記述した際に、条件を無視して無条件に実行されてしまう「リーケージ」バグを解決します。

背景・前提知識

validation-gen (KEP-5073): Goの構造体タグアノテーションからAPIバリデーションコードを自動生成するフレームワーク(featured-prs-1.mdも参照)。

コード生成の2フェーズ: validation-genはコード生成を2フェーズで行います。フェーズ1でタグを解析してメタデータを収集し、フェーズ2でGoコードを出力します。

問題: 一部のタグ(+k8s:update=NoModifyのような「更新時に変更不可」などの状態を持つもの)はフェーズ1でグローバルメモリに書き込みをしていました。このため、+k8s:ifEnabled(特定の機能ゲートが有効な場合のみ)の内側にそのタグを書いても、条件に関わらずルートレベルのチェックが生成されてしまうという「リーケージ」が起きていました。

詳細

Deferred Validation モデル: バリデーションタグがコードを直接生成する代わりに、「コールバック」を通じてコード生成を親ラッパーに委ねる仕組みを導入しました。これにより +k8s:ifEnabled のような条件ラッパーが適切なクロージャの中でのみコードを生成するよう制御できます。

このPRで移行されたバリデーター:

  • update(更新時バリデーション)
  • union(ユニオン型バリデーション)
  • subfield(サブフィールドバリデーション)
  • list(リストバリデーション)
  • ifEnabled(条件付きバリデーション)

また、validate.IfOption がポインタ以外の型も扱えるように更新されました。

変更量: 追加2776行、削除651行(サイズXXL)

使用例

このPR自体はKubernetesユーザーには直接影響しません(release-note NONE)。validation-genを使ってカスタムコントローラーやCRDのバリデーションコードを生成しているコントリビューターは、条件付きバリデーションが正しく機能するようになります。

参考リンク