Skip to content

v1.23.0

Choose a tag to compare

@wvandeun wvandeun released this 19 Aug 17:27
· 45 commits to stable since this release
99a380a

1.23.0 - 2026-08-19

Removed

  • Removed client.branch.diff_data() from both the async and sync clients. The method relied on a GET /api/diff/data REST endpoint that does not exist in Infrahub, so every call returned a 404. Use client.get_diff_tree() to retrieve the full diff of a branch against its base branch, or client.get_diff_summary() for the list of changed nodes; both use the DiffTree GraphQL query. (#325)

Added

  • Added the Infrahub deployment ID to the infrahubctl info command output and a get_server_information() method (returning the server version and deployment ID) on the async and sync clients. (#1017)
  • Added transparent retry of HTTP 429 (rate-limited) responses on both InfrahubClient and InfrahubClientSync. Retries use jittered exponential backoff and honour a server-provided Retry-After header (delta-seconds or HTTP-date). The behaviour is tunable through four new Config fields (rate_limit_retry_enabled, rate_limit_max_retries, rate_limit_backoff_base, rate_limit_backoff_max), and a new RateLimitError exception is raised when retries are exhausted. (#1124)
  • Added support for tagging SDK requests with a priority via a new X-Priority header. A Priority enum (high, medium, low) is available from infrahub_sdk.constants; set Config.priority (env var INFRAHUB_PRIORITY) for a client-wide default emitted on every request, or pass priority= to individual operations to override it per request. When unset, no header is sent. Works identically on InfrahubClient and InfrahubClientSync. (#1151)
  • Add infrahubctl schema format command, an opinionated offline formatter that normalises the key ordering of schema files. Optional flags can also strip redundant default values (--strip-defaults), sort attributes/relationships by order_weight (--sort-by-order-weight), and backfill a missing order_weight (--backfill-order-weight).
  • Added retry() and cancel() methods to the task manager. The Task model now exposes available_actions along with can_retry / can_cancel helpers.
  • Added an opt-in include_diagnostics flag to the task manager's all(), filter(), and get() methods. When enabled, tasks expose an error field, and webhook-send tasks are returned as WebhookDeliveryTask instances carrying http_request / http_response delivery details.
  • Added support for the new IPAddress attribute kind. Values are exposed as bare ipaddress.IPv4Address/IPv6Address objects (no prefix) and serialized to a bare-address string when writing, alongside the existing IPHost and IPNetwork kinds.
  • The JSON schema generated for .infrahub.yml now warns when a definition has not said what it depends on, so YAML language servers flag it while the file is being edited. A Python transform or generator definition with no watch block is flagged, and so is a watch value that is not a mapping, including the bare watch: that parses as null and records nothing. Both warnings are advisory only: the models still accept every one of those forms. An empty watch: {} or files: [] stays clean, since either one records that the author checked and nothing beyond what Infrahub detects needs watching. The generated schema also picks up the watch block on generator definitions, which it was previously rejecting as an unknown property.
  • The request priority (X-Priority header) can now be carried on the client's RequestContext via a new priority field, alongside the existing client-wide Config.priority default and per-call priority= override. Resolution precedence is per-call priority= > request_context.priority > Config.priority > no header. The priority is emitted as a header only and is never included in the mutation body. Works identically on InfrahubClient and InfrahubClientSync.
  • Import pyarrow lazily in the line-delimited JSON importer so that infrahubctl commands other than object load no longer require the ctl extra (and its heavy pyarrow dependency) to be installed.

Changed

  • Paginated queries generated by all(), filters(), get() and resource pool allocation lookups now pass offset and limit as GraphQL variables instead of inlining them in the query text. The query document stays identical across pages, allowing the Infrahub server to reuse its cached query analysis, and the query is now rendered once per call instead of once per page. generate_query_data also accepts variable placeholder strings (for example "$offset") for its offset and limit arguments.

  • Raised the default Config.rate_limit_max_retries from 5 to 10, so a request shed with HTTP 429 keeps retrying (honouring Retry-After) for longer before raising RateLimitError. This lets background work ride out a longer burst of server-side backpressure. Callers that prefer to give up sooner can lower the value.

  • The hand-maintained schema models in infrahub_sdk.schema are now backed by the generated write/read contract (infrahub_sdk.schema.generated). Public names, import paths, and behavior methods are unchanged, but a few defaults and constraints now match the server contract:

    • AttributeKind.STRING has been removed. It was deprecated and kind="String" was already rejected server-side; use AttributeKind.TEXT instead.
    • Write and read models drop unknown fields silently (extra="ignore"). A submitted field that is not part of the write contract — read-level, internal, or a typo — is dropped rather than rejected, and a read model tolerates additional fields returned by a newer server.
    • Write-model defaults now match the server contract: relationship min_count/max_count default to 0 (was None), node branch defaults to "aware", generate_profile defaults to True, and generate_template defaults to False. This changes the round-trip output of programmatically-built schemas.

    Constructing AttributeSchema(name=..., kind=AttributeKind.TEXT, ...), NodeSchema, GenericSchema, RelationshipSchema, SchemaRoot, and the read-side *API models continues to work unchanged.