mcpField
I
infrahub-managing-checks

infrahub-managing-checks

github.com/opsmillテスト・品質27153 回インストール1 日前に更新
リポジトリ

infrahub-managing-checks について

Infrahub のチェックを作成・デバッグする開発者向けガイドです。提案変更パイプラインで使う Python と GraphQL の検証について、実装、登録、テストの手順を示し、適切な場合はスキーマ制約を優先します。

主な機能

  1. 01グローバルと対象指定チェックの解説
  2. 02GraphQL クエリと Python クラスの作成ガイド
  3. 03.infrahub.yml への登録方法
  4. 04YAML テストとローカルテストの説明
  5. 05スキーマ制約とクエリの注意点

活用シーン

  1. 01不正な提案変更を止めるチェックの作成
  2. 02リレーションと複数オブジェクトのルール検証
  3. 03チェック失敗とパイプライン動作の調査

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/opsmill/infrahub-skills --skill infrahub-managing-checks

インストール後、Claude Code で/infrahub-managing-checksを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

examples.md
reference.md
rules/
_sections.md
_template.md
api-error-surfaces.md
api-reference.md
architecture-types.md
patterns-common.md
patterns-relationship-traversal.md
patterns-shared-module.md
python-validate.md
registration-config.md
testing-commands.md
testing-proposed-change-commit.md
testing-resource-framework.md

詳細

Infrahub チェック作成ガイド

概要

Infrahub チェックの作成に関する専門的なガイダンスです。チェックは、提案された変更のパイプラインの一部として実行される、ユーザー定義の検証ロジック(Python + GraphQL)です。チェックでエラーがログに記録された場合、その提案された変更はマージできません。

プロジェクトのコンテキスト

Infrahub の設定: !cat .infrahub.yml 2>/dev/null || echo "No .infrahub.yml found"

既存のチェック: !find . -name "*.py" -path "*/checks/*" 2>/dev/null | head -20

既存のクエリ: !find . -name "*.gql" -path "*/queries/*" 2>/dev/null | head -20

使用する場面

  • 提案された変更の検証ロジックを作成する
  • データ品質を保護する仕組みを作成する(例:ラックの衝突検出)
  • ある型のすべてのオブジェクトを検証するグローバルチェックを構築する
  • 特定のグループ化されたオブジェクトを検証する対象限定チェックを構築する
  • チェックの失敗をデバッグする、またはチェックのライフサイクルを理解する

ルールカテゴリ

優先度カテゴリプレフィックス説明
CRITICALアーキテクチャarchitecture-3 つのコンポーネント、グローバルと対象限定の違い、実行フロー
CRITICALPython クラスpython-InfrahubCheck 基底クラス、validate()、log_error/log_info
HIGHAPI リファレンスapi-クラス属性、インスタンスプロパティ、メソッド、ライフサイクル、および拒否を通知する API サーフェス(GraphQL エラーは 200)
HIGH登録registration-.infrahub.yml の設定、クエリ名の一致、パラメーター
MEDIUM (patterns-shared-module の場合は HIGH)パターンpatterns-エラー収集、共有ユーティリティ、スコープ付き検証、リレーションシップをたどる検証、成果物タイプ間でのモジュール共有
HIGHテストtesting-Resources Testing Framework(YAML 駆動のテスト)、infrahubctl のチェックコマンド、提案された変更のチェックが実行されるリポジトリのコミット

このスキルが依存するスキーマ機能

チェックは、適切なデータを取得して検証できる場合にのみ有用です。デプロイ時のチェック失敗の多くは、実際にはスキーマ側の不足が原因です。

チェックが...スキーマ(または .infrahub.yml)で必要なこと...参照先
GraphQL 経由で属性を読み取る同じ名前の属性をスキーマノードで公開する(name__value 形式のパス)../infrahub-managing-schemas/rules/attribute-defaults-and-types.md
リレーションシップをたどって関連オブジェクトを検証するリレーションシップの両側を、対応する識別子を使って定義する。そうしないと、たどった結果が返りません../infrahub-managing-schemas/rules/relationship-identifiers.md
関連ノードの状態に照らしてノードを検証する(子と親のライフサイクル、ピア間の整合性)リレーションシップをたどるクエリで、関連ノードの比較対象属性を取得する。チェックはクエリを 1 回実行し、遅延取得は行いませんrules/patterns-relationship-traversal.md
対象限定(オブジェクト単位)である.infrahub.yml の targets: に CoreStandardGroup を登録し、parameters: を GraphQL 変数にバインドするrules/registration-config.md
GraphQL の応答で型付きノードをキーとして識別する必要があるクエリで id と __typename を選択する。SDK は両方に依存します../infrahub-common/graphql-queries.md
マージをブロックせず、注釈のみを付けるlog_error() の代わりに self.log_info() を使用する。log_warning() は存在しませんrules/python-validate.md

Python を書く前に

より低コストのレイヤーで制約を表現できるなら、そちらを使ってください。 スキーマ制約は、すべての書き込み経路で読み込み時に実行されます。 一方、Python のチェックは提案変更パイプライン内でのみ実行されるため、 別の経路で作成された不正なデータは見逃されます。 InfrahubCheck を使う前に、次の簡単な手順を確認してください。

シグナルより低コストのレイヤールールを参照
1 つの属性に対する一意性、存在、許可された値、または正規表現の検証スキーマ制約(uniqueness_constraints、optional: false、kind: Dropdown の選択肢、regex)yagni-python-validator-vs-schema-constraint
本体が GraphQL クエリと単一の if len(...) > 0: raise で構成されるチェック1 つの .gql ファイルと 5 行の Pythonyagni-redundant-check-that-graphql-can-answer
リレーションシップを単一ピアまたは任意でないものにするスキーマの cardinality: one、kind: Parent / Component、optional: falseyagni-python-validator-vs-schema-constraint

これらのいずれにも該当しない場合にのみ、 Python のチェックを書いてください。rules/python-validate.md にあるノード間のビジネスルール、帯域外の調整、状態を伴うアサーションが 正当なユースケースです。

チェックが SDK を通じてオブジェクトを読み取る場合(GraphQL クエリのみを使う場合を除く)は、 文字列の kind ではなく、生成されたプロトコルクラスで呼び出しに型を指定してください。 kind="DcimDevice" ではなく、client.get(DcimDevice, ...) のようにします。 チェックのクライアントに対応する --sync プロトコルのバリアントを選んでください。 protocols-adopt-typed-kindsを参照してください。

チェックの基本

すべてのチェックは、次の 3 つの要素で構成されます。

  1. GraphQL クエリ(.gql ファイル)-- 検証するデータを取得し、.infrahub.yml の最上位の queries: セクションに登録します
  2. Python クラス -- InfrahubCheck を継承し、 query = "<query_name>" を設定して、 validate() を実装します
  3. 設定 -- .infrahub.yml の check_definitions の下に宣言します(query: フィールドは 指定しません。下記を参照してください)
from infrahub_sdk.checks import InfrahubCheck


class MyCheck(InfrahubCheck):
    query = "my_query"  # Must match queries[].name in .infrahub.yml

    def validate(self, data: dict) -> None:
        # Validation logic here
        if something_is_wrong:
            self.log_error(
                message="Problem description"
            )

クエリがバインドされる場所: Python クラス (query = "...")であり、check_definitions ではありません。 リポジトリの設定モデルでは extra="forbid" が使われているため、 check_definitions: の下に query: を置くと、 リポジトリ設定全体の検証に失敗します。これは、 最上位の query: を指定する generator_definitions: と 混同されるケースが最も多いものです。rules/registration-config.mdを参照してください。

ワークフロー

チェックを作成するときは、次の手順に従います。

  1. 検証の目的を理解する — 提案された変更をブロックするデータ条件は何ですか? これは、ある型のすべてのオブジェクトを対象とするグローバルチェックなのか、特定のグループを対象とするものなのかを判断します。 rules/architecture-types.mdを読みます。
  2. GraphQL クエリを作成する — 検証するデータを取得する.gqlファイルを作成します。クエリのパターンについては、../infrahub-common/graphql-queries.mdを読みます。ルールがノードを関連ノードの状態と比較する場合(子と親のライフサイクル、ピア間の一貫性など)、クエリで関係をたどって関連属性を取得する必要があります。チェックではクエリを1回実行し、その後のデータ取得はありません。rules/patterns-relationship-traversal.mdを参照してください。
  3. Python クラスを実装する — InfrahubCheckを継承し、validate()を実装します。クラスのパターンについてはrules/python-validate.mdを、利用可能なメソッドについてはrules/api-reference.mdを読みます。チェックからInfrahubを呼び出す場合は、rules/api-error-surfaces.mdも読んでください。GraphQLリクエストが拒否されてもHTTP 200が返されるため、ステータスコードで分岐すると、検出するはずの失敗時にチェックが成功してしまいます。ロジックをジェネレーターや変換処理と共有する場合は、相対インポートを使う前にrules/patterns-shared-module.mdを読んでください。
  4. .infrahub.ymlに登録する — check_definitionsの下にチェックを追加します。クエリ名は、Pythonクラスのquery属性と一致させる必要があります。rules/registration-config.mdを参照してください。
  5. テストを追加する — 提案された変更のパイプラインで自動検証されるよう、チェックと同じ場所にYAML駆動のテスト定義(スモーク、ユニット、統合)を作成します。rules/testing-resource-framework.mdを読みます。
  6. ローカルでテストする — infrahubctl checkを実行して、フィーチャーブランチに対して検証します。rules/testing-commands.mdを参照してください。既存の提案された変更に対して変更済みのチェックを実行するには、rules/testing-proposed-change-commit.mdを読んでください。パイプラインはmainのコミットではなく、ソースブランチのリポジトリコミットのコードを実行します。また、Gitと同期しているブランチでは、ブランチのリベースをしてもそのコミットは更新されません。

補足資料

コメント