We're proud to announce the second beta release of Infrahub 🎉 🚀
Main Changes
Unified Storage
IP Address Management
Infrahub now includes builtin support for IP Prefixes and IP Addresses, both for IPv4 and IPv6.
To keep things extensible, Infrahub provides a minimal schema to capture the relationships between IP Prefix, IP address and IP Namespace.
Infrahub will automatically maintain trees of IP prefixes and IP addresses being built based on the IP Namespace.
Building these hierarchies/trees allows Infrahub to determine how IP prefixes and IP addresses are nested as well as computing utilization of the recorded IP spaces.
The following Generic
models are provided by default and can be extended as needed to add your own attributes/relationships or constraints:
BuiltinIPNamespace
: used to model a namespace to manage IP resources, this is a generic representation of what could be, for examples, a routing table, a routing instance or a VRFBuiltinIPPrefix
: used to model a network, sometimes referred as supernet/subnetBuiltinIPAddress
: used to model a single IP address
More information about IPAM is available in the Documentation.


Profiles
A profile in Infrahub allow you to define a common set of attributes that should be applied to nodes.
A node that has a profile assigned, will get the values of its attributes inherited from the assigned profile, if no value is defined for the attribute at the node, or if the default value is used.
The attribute values of a node that were inherited from a profile can be overridden, by defining them at the node.
More information about Profiles is available in the Documentation.
Leverage Database Indexes to improve performance
Infrahub is now leveraging database indexes to improve the overall performance of the database.
Indexes will be automatically applied during startup.
A new command infrahub db index
has been introduced to manage the indexes.
infrahub db index --help
Usage: infrahub db index [OPTIONS] [ACTION]:[show|add|drop] [CONFIG_FILE]
Manage Database Indexes
╭─ Arguments ─────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ action [ACTION]:[show|add|drop] [default: IndexAction.SHOW] │
│ config_file [CONFIG_FILE] [env var: INFRAHUB_CONFIG] [default: infrahub.toml] │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ───────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
CI Pipeline
Generators
A Generator is a generic plugin that can be used apply your own logic to create new nodes and relationships.
Generator are expected to be idempotent and should be able to run multiple times and always produce the same result.
One use case for the generators is to be able to manage technical objects derived from a higher level definition of a service.
Generators are associated with some input data identified by a GraphQL query.
Similar to the Transforms & Artifacts, Generator will be automatically executed as part of the CI Pipeline if the data associated with a given generator has changed.
The Generator itself is a Python class that is based on the InfrahubGenerator
class from the SDK. Just like transforms and checks, the Generators are user defined.
More information about Generators is available in the Documentation.
Redesigned proposed change creation form
The form to create a proposed change has been redesigned to expand the description field.

Schema
Relationship of type Parent can't be optional
The constraints around the relationships of kind Parent
have been tightened and these relationships can't be optional anymore.
All existing relationships will be automatically migrated when upgrading to this release and your schema will need to be updated.
Improvement and modularization of demo schema
The demo schemas located in the models
directory have been updated to cover more use cases and to simplify how to use them.
The main schema, previously stored in the file infrastructure_base.yml
has been broken down in multiple schemas now located in the base
directory.
The other schemas have been moved to the examples
directory
Cascade node deletion
It's now possible to define how related nodes should be handled when a node is being deleted. This feature is usually referred as CASCADE DELETE.
On each relationship, it's now possible to defined on_delete: CASCADE
to indicate that if this node is deleted, all nodes on the other side of this relationship must be deleted too.
New options available in the schema
The attribute read_only
is now available on all relationships.
If True, users won't be able to add or remove peers to this relationship (not present in GraphQL mutations and forms)
The attribute allow_override
is now available on all attributes and relationships.
This new flag is meant to be used on a Generic node to protect the attribute / relationship that can't be overwritten by a node inheriting from this generic.
The attribute documentation
is now available on all Node and Generic.
This field is meant to store an URL where the documentation for this model is available.
The link will be displayed in the help popup in the frontend.
The attribute on_delete
is now available on all relationships. See section above.
More information about the schema is available in the Documentation.
API / GraphQL
is_from_profile
and is_default
properties on all attributes
In GraphQL, it's now possible to query 2 new properties on all attributes to gather more information about the origin of the value:
is_from_profile
: True if the value was inherited from a profile, the name of the profile will be available in undersource
is_default
: True if the value was set by the default value defined in the schema
Other
Schema information included in the search anywhere bar
The main search anywhere bar now includes information from the schema and
it can include return existing schema page as a potential result for the search.


Search and filter on object list view
The object list view has been updated to include a new search bar and a new panel to filter the element of the list.

Cleanup of invoke tasks and introduction of the dev
namespace
The invoke tasks have been cleaned up to clearly separate the tasks related to the demo environment and the one for internal development.
A new namespace dev
has been introduced and some commands have been renamed including demo.dev-start
that has been renamed to dev.deps
.
A new demo.migrate
command has been introduced to apply the database & schema migrations.
Update GraphiQL Application
The Graph sandbox (GraphiQL) has been integrated into Infrahub directly to provide a better experience
and remove the dependencies to an external CDN.
The standard menu is now available on the left of the GraphiQL application
and its possible to directly select the active branch with the standard dropdown.

Help Panel in the list view
A new help popup is now available in the top right corner of a list view for all objects.
The help popup will include a link to the schema for this object and if defined in the schema, a link to the external documentation.

Changelog
- Fix issue preventing user to create node with uniqueness constraints in a branch @dgarros (#3234)
- Various changes related to schema and database migrations @dgarros (#3222)
- Remove readme page in docs for topics and guides @dgarros (#3226)
- Update NodeAttributeAddMigrationQuery01 to add is_default @dgarros (#3225)
- Typos and spelling covering those reported from @hbled: #3152 @petercrocker (#3223)
- only optional attrs on profiles @ajtmccarty (#3177)
- Guide - Jinja Transform: Update Jinja2 template to iterate over GQL data at proper level. @FragmentedPacket (#3208)
- Sends null when setting an enum to empty, to remove the defined value @pa-lem (#3199)
- IPAM edit for prefixes and adresses @pa-lem (#3189)
- on sidebar footer, docs link redirects to local documentation @bilalabbad (#3156)
- Prefix columns and icons updates @pa-lem (#3149)
- Remove is_inheritied metadata from metadata popover @pa-lem (#3118)
- add CoreProfile as generic on all ProfileSchema @ajtmccarty (#3021)
- Add Plausible analytics in docs @bilalabbad (#2790)
🚀 Features
- Add IPAM reconciliation to merge @ajtmccarty (#3135)
- Redesign Progress bar + accessibility @bilalabbad (#3150)
- Display progress bar on "utilization" row in IP summary @bilalabbad (#3136)
- Display profiles schema in Schema visualizer @bilalabbad (#3133)
- add IPAM reconciliation to rebase and merge @ajtmccarty (#3087)
- Display a profile details from both url /CoreProfile and /<ProfileKind> @bilalabbad (#3091)
- Profiles for object edition @pa-lem (#3058)
- Added Profile in menu @bilalabbad (#3085)
- IPAM reconcile in mutations @ajtmccarty (#3072)
- Add ability to parse the GraphQL within a Generator @ogenstad (#3080)
- Run Generators on branch merge operations @ogenstad (#3073)
- Enable Profile creation on profile page @bilalabbad (#3078)
- Profiles selection for object creation @pa-lem (#3056)
- Use generics in all IPAM page @bilalabbad (#3074)
- Show Profile next to properties sourced from the profile @bilalabbad (#3040)
- Add missing db migrations and add command to update core schema @dgarros (#2987)
- Add parent/children on generics for GraphQL queries @gmazoyer (#2999)
- Add "expand" directive to schema @ogenstad (#2918)
- Update attribute name migration to support profile @dgarros (#3035)
- new query to reconcile IPAM changes @ajtmccarty (#3002)
- Expand IPAM tree to the selected prefix on page load @bilalabbad (#3023)
- IPAM CRUD for prefixes and addresses @pa-lem (#2998)
- Add read-only attribute to relationship schema @gmazoyer (#3012)
- Added Ip Address summary on IPAM @bilalabbad (#3013)
- On Prefix summary page, get property list from node instead of generic @bilalabbad (#3011)
- List all properties of a prefix on summary page @bilalabbad (#3003)
- IPAM menu @pa-lem (#2982)
- Added Prefix Summary on IPAM @bilalabbad (#2992)
- Improved vertical overflow on large screen for IPAM page @bilalabbad (#2990)
- Updates IPAM columns and components @pa-lem (#2974)
- Added Tree component + Tree navigation on IPAM @bilalabbad (#2978)
- Set is_default flag to false when value comes from profile @dgarros (#2965)
- Add support for Profiles to the SDK and fix is_Default when value is None @dgarros (#2963)
- new
is_from_profile
metadata for attributes in GraphQL @ajtmccarty (#2943) - Add schema attribute to control overriding generic's attribute or relationship @gmazoyer (#2941)
- support for filtering and sorting objects using profiles in NodeGetListQuery @ajtmccarty (#2903)
- Update IPAM Queries to use new format @dgarros (#2900)
- Store additional information in the database for IPHost and IPNetwork @dgarros (#2893)
- Add help menu on schema and list view @bilalabbad (#2886)
- Add new route and components for ipam views @pa-lem (#2883)
- Add Generator Definitions to pipeline @ogenstad (#2856)
- feat(backend): add e2e useful tracing @fatih-acar (#2037)
- Lay out the IPAM foundations @gmazoyer (#2769)
- Add button to copy object ID to clipboard @bilalabbad (#2867)
- Add new documentation attribute to NodeSchema and Generic Schema @dgarros (#2852)
- basic profiles: create and apply values to associated nodes @ajtmccarty (#2825)
- Implemented "query" QSP for passing GraphQL query on GraphiQL page @bilalabbad (#2857)
- Migrate GraphiQL from backend to Infrahub frontend app @bilalabbad (#2824)
- new node delete constraint @ajtmccarty (#2766)
- Reorganized page header with title and description @bilalabbad (#2814)
- Refactor Attribute handling in Core to store is_default @dgarros (#2792)
- Add kbd component + display shortcut on search bar @bilalabbad (#2800)
- Redesigned proposed change creation form @bilalabbad (#2797)
- Add ability to import generators from repositories @ogenstad (#2787)
- Add support for Database Indexes @dgarros (#2743)
- Update filters UI and logic @pa-lem (#2788)
- feat(sdk): add support for using proxies @wvandeun (#2739)
- Add --list parameter for infrahubctl render @ogenstad (#2749)
- parent component schema relationship validation @ajtmccarty (#2740)
- New icons and tooltips for menu links @pa-lem (#2742)
- In search anywhere, you can find go to link to model's schema @bilalabbad (#2728)
- Objects list search @pa-lem (#2711)
🐛 Bug Fixes
- use version of schema for correct branch in uniqueness checks @ajtmccarty (#3219)
- add more nodes to CodeNode.used_by @ajtmccarty (#3218)
- Keep QSP when navigating with tabs on IPAM @bilalabbad (#3214)
- Fix crash on IPAM when prefix id is not found @bilalabbad (#3213)
- Support adding a profile to a group on UI @bilalabbad (#3210)
- Keep all initial url query params after login success @bilalabbad (#3209)
- replace prefix by uuid on IPAM url + E2E Testing on IPAM @bilalabbad (#3161)
- Filters fix for default values @pa-lem (#3206)
- fix for hierarchy cypher query @ajtmccarty (#3194)
- Allow null values for optional enums @ogenstad (#3196)
- fix for stale relationships being included in NodeGetListQuery filtering and ordering results @ajtmccarty (#3165)
- No focus ring on button when clicking with mouse @bilalabbad (#3160)
- Force Ip in IP in BuiltinIPAM nodes @BeArchiTek (#3166)
- Raise correct exception when getting node of wrong type @gmazoyer (#3140)
- Raise error on RelationshipAdd to busy peer @ogenstad (#3125)
- hierarchy update fix @ajtmccarty (#3143)
- Fix edit on profile object @bilalabbad (#3095)
- Ple prefix pagination @pa-lem (#3119)
- Added constant for IPAM Route + used them in all ipam @bilalabbad (#3077)
- Preserve query parameters when transitioning to the proposed change creation form @bilalabbad (#3031)
- Fix schema integrity check label to add indication of problem @ogenstad (#3019)
- Fix data integrity check for schema @pa-lem (#3014)
- Fix path traversal vulnerability in the git agent @gmazoyer (#2996)
- Fix bug related to choice of data conflict resolutions @ogenstad (#2988)
- Fix load-infra-schema for demo environment @dgarros (#2986)
- Fix checks tab in proposed changes @pa-lem (#2979)
- Fix
is_top_level
on less specific prefix insert @gmazoyer (#2953) - Fix API schema validator call @gmazoyer (#2931)
- Fix IPAM prefix
get_percentage
call @gmazoyer (#2923) - Fix some IPAM operations @gmazoyer (#2874)
- Fix number display when value is 0 @bilalabbad (#2866)
- Added back conflict resolver on proposed change checks @bilalabbad (#2859)
- fix(docs): fixes interface name in graphql mutation used in the getting started tutorial @wvandeun (#2826)
- Add merging of proposed change to happy test and fix value bug @ogenstad (#2823)
- fix for order_by with optional relationship @ajtmccarty (#2804)
- Change IP attributes
prefixlen
to integer instead of string @gmazoyer (#2799) - more uniqueness_constraint unit tests, and a fix @ajtmccarty (#2789)
- fix index error on DiffSummary @ajtmccarty (#2760)
- Update checks summary layout on small screens @pa-lem (#2732)
🧰 Maintenance
- Only show IPAM menu if proper models exist. @ogenstad (#3248)
- Update Jinja2 for vulnerability fix @gmazoyer (#3245)
- Remove retype @dgarros (#3228)
- Adds advanced test for profile for interface l2 @pa-lem (#3239)
- Flaky test fix for select 2 steps and options loading time @pa-lem (#3229)
- Removes pagination for group selector @pa-lem (#3198)
- Metadata popover in relationships list @pa-lem (#3167)
- Attributes updates for queries function to exclude read only fields @pa-lem (#3137)
- Prefix summary updates @pa-lem (#3122)
- Columns update for IP details list view @pa-lem (#3134)
- In url template, use format <xxx> instead of :xxx + update docusaurus version to latest version @bilalabbad (#3090)
- Don't duplicate schema within read-only endpoint @ogenstad (#3088)
- Run events even if the broker is marked as disabled @ogenstad (#3084)
- Raise the length limit for peers @ogenstad (#3045)
- Simplified component MetaDetailsTooltips @bilalabbad (#3048)
- Add is_default and is_from_profile to @expand directive @ogenstad (#3046)
- Set yamllint to strict mode and fix violations @ogenstad (#3024)
- Add documentation for generators @ogenstad (#2995)
- Move backend integration tests to neo4j @ogenstad (#3005)
- Add CICD to publish helm Chart and Build docker-compose for customer @BeArchiTek (#2961)
- Upgrade ruff to 0.4.1 @ogenstad (#3007)
- Add profile_attribute test to db_query_benchmark @dgarros (#2927)
- Modularize schema @BeArchiTek (#2925)
- Add deprecation_reason to DiffSummaryOld @dgarros (#2928)
- Add support for both Pydantic v1 and v2 in the Sync @BeArchiTek (#2877)
- Remove Python 3.8 and update idna=3.7 @ogenstad (#2911)
- Cleanup of invoke tasks and introduce "dev" namespace @ogenstad (#2894)
- New return object for SDK schema load, and wait for sync in CTL @ogenstad (#2884)
- Fix typehints on registry tasks @ogenstad (#2888)
- Fix Ruff PLW2901
for
loop variable overwritten by assignment target @ogenstad (#2887) - Move Client parameters to Config object @ogenstad (#2873)
- Fix ruff B018 - Found useless expression. @ogenstad (#2876)
- Change API schema load response to include information @ogenstad (#2875)
- feat(helm): add support for shared storage @fatih-acar (#2865)
- Improve performance of node_constraints_uniqueness query @dgarros (#2849)
- Add InfrahubStatus query & service.component class @ogenstad (#2744)
- Add missing labels to Cypher Queries @dgarros (#2847)
- Remove Python SDK and CTL specific tags @dgarros (#2850)
- Enable code-splitting to improve load time and performance @bilalabbad (#2839)
- Fix ruff C408 (Unnecessary
dict
call (rewrite as a literal)) @ogenstad (#2827) - Fix ruff rule reimplemented-container-builtin (PIE807) @ogenstad (#2818)
- Fix typehints in attribute_schema @ogenstad (#2815)
- Fix ruff RET502 (Do not implicitly
return None
) @ogenstad (#2821) - Fix ruff rule B015 (Pointless comparison) and fix broken test @ogenstad (#2816)
- Several UI improvements @bilalabbad (#2819)
- Simplified Input and SearchInput components for native behavior @bilalabbad (#2805)
- Update frontend dependencies @bilalabbad (#2802)
- use Content.Title in all page header @bilalabbad (#2801)
- Add query testing framework @dgarros (#2748)
- Add schema nodes for generators @ogenstad (#2770)
- Fix linting C419 Unnecessary list comprehension. @ogenstad (#2777)
- Adjust CORS related default settings and make them changeable @gmazoyer (#2738)
- Convert infrahub db and event commands to use AsyncTyper @dgarros (#2735)
- Allow to define profile and runtime when executing Cypher query @dgarros (#2734)