Check Manager
Skill: infrahub-managing-checks
The Check Manager produces, modifies, and debugs Python validation checks that run in Infrahub's proposed change pipeline. Each check consists of three components: a GraphQL query file, a Python class inheriting from InfrahubCheck, and a .infrahub.yml registration entry. The skill generates all three and ensures they are correctly wired together.
When to use​
- Enforcing naming conventions on devices, interfaces, or other nodes when a change is proposed
- Validating that required relationships are populated (e.g., every device has a primary IP)
- Blocking changes that would violate design intent (e.g., a BGP session referencing a decommissioned device)
- Any validation that should block a proposed change from merging
- Changing what an existing check validates, or working out why one fails, passes when it should not, or flags the wrong nodes
What it produces​
Three files that must be used together:
- GraphQL query file (
.gql): fetches the data the check needs. Named to match thequeryattribute in the Python class. - Python class (
InfrahubChecksubclass): implements thevalidate()method. Usesself.log_error()to flag violations (which blocks the change) andself.log_info()for informational messages (which does not block). .infrahub.ymlentry: registers the check undercheck_definitionswith the class name, query name, and any parameters.
Example prompts​
- "Create a check that validates every device has a primary IP assigned"
- "Write a check that enforces the naming convention
<site>-<role>-<number>for all device names" - "Create a check that blocks any proposed change that removes a BGP session from an active device"
- "This check passes even when a device has no primary IP. Work out why and fix it"
Key rules enforced​
- Three-component structure: all three files are always generated together; missing any one causes the check to fail at runtime
log_error()vslog_info():log_error()blocks the proposed change;log_info()does not. The skill uses the correct one based on the intent described- GraphQL query naming: the query name in the
.gqlfile must match thequeryclass attribute exactly - Parameter mapping: if the check accepts parameters (e.g., to parameterize a naming pattern), the parameters are declared in both the Python class and the
.infrahub.ymlregistration - Error collection before logging: errors are collected across all objects first, then logged together, rather than short-circuiting on the first error
Common mistakes it catches​
| Mistake | What the skill does instead |
|---|---|
Using log_error() when log_info() was intended | Matches the log method to the described intent |
Query name mismatch between .gql and Python class | Uses the same name in both |
Missing .infrahub.yml registration | Generates the registration entry alongside the check |
| Short-circuiting on first error | Collects all errors before logging |
Running it​
Checks run automatically in the proposed change pipeline when a change is submitted to Infrahub. To test a check locally:
infrahubctl check <check-name>
Not sure this is the right skill?​
See Which skill do I use? for how the Check Manager differs from the Data Analyzer and the Transform Manager.