From c994081b94918df840ade61755c7a189147921fe Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:07:40 +0200 Subject: [PATCH 01/68] fix: keep DcimInterface.mtu on the generic so LAG and virtual interfaces keep an MTU Packet: DCIM-06 (reject, redesign), keeps DCIM-07. Moving mtu to InterfacePhysical left InterfaceLag and InterfaceVirtual with no MTU at all, which is where a non-default MTU is most often needed (bundles, SVIs, tunnels, loopbacks). The fix for a bad default (1514 was frame size) is the default, so mtu returns to the DcimInterface generic with default_value 1500. Co-Authored-By: Claude Fable 5 --- base/dcim.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/base/dcim.yml b/base/dcim.yml index 7a3d0aa..ddc424d 100644 --- a/base/dcim.yml +++ b/base/dcim.yml @@ -212,6 +212,13 @@ generics: optional: true description: "The role of the interface in the network" order_weight: 1250 + - name: mtu + kind: Number + label: MTU + default_value: 1500 + optional: true + description: "Maximum transmission unit, in bytes (IP payload, not frame size)." + order_weight: 1300 relationships: - name: device peer: DcimGenericDevice @@ -443,12 +450,6 @@ nodes: - InterfaceLayer3 - DcimEndpoint - InterfaceHasSubInterface - attributes: - - name: mtu - kind: Number - label: MTU - default_value: 1500 - order_weight: 1300 - name: Virtual namespace: Interface From 0c29a4a3e668d395f833061cbe7ba604c5bb43df Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:07:49 +0200 Subject: [PATCH 02/68] fix: pluralize cardinality-many relationship names on OrganizationManufacturer Packet: ORG-N1 (change). CC-2 wants plural names on cardinality-many relationships, and both declarations are PR-touched. The rename also removes the clash with DcimGenericDevice.device_type and .platform, which are cardinality one and mean something else. Identifiers stay singular on the object part, so the forward sides in base/dcim.yml are untouched. Checklist: CC-2 Co-Authored-By: Claude Fable 5 --- base/organization.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/base/organization.yml b/base/organization.yml index 175cc1c..20e4ab6 100644 --- a/base/organization.yml +++ b/base/organization.yml @@ -46,13 +46,13 @@ nodes: inherit_from: - OrganizationGeneric relationships: - - name: device_type + - name: device_types peer: DcimDeviceType kind: Attribute cardinality: many optional: true identifier: manufacturer__device_type - - name: platform + - name: platforms peer: DcimPlatform kind: Attribute cardinality: many From 4bf6d25284115d174791906374f46dd2b9bf428d Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:07:58 +0200 Subject: [PATCH 03/68] fix: declare LocationHosting.name identity explicitly Packet: LOC-02 (change). The human_friendly_id was silently deriving the uniqueness constraint, which CC-4 forbids; unique: true states what Infrahub already enforces, so there is no behaviour change and no migration. optional and order_weight are written on the same three lines, and display_label plus order_by give the generic parity with LocationGeneric (it is a relationship peer in seven places and had a null display label). Checklist: CC-4, CC-6, CC-9 Co-Authored-By: Claude Fable 5 --- base/location.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/base/location.yml b/base/location.yml index b7d5991..d21ab6e 100644 --- a/base/location.yml +++ b/base/location.yml @@ -44,9 +44,15 @@ generics: # This is only owning relationships toward various assets that could be found on those locations human_friendly_id: - name__value + order_by: + - name__value + display_label: name__value attributes: - name: name kind: Text + unique: true + optional: false + order_weight: 1000 relationships: - name: devices peer: DcimPhysicalDevice From 5ec2081804135781fd44990a7c954de8a343d791 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:08:11 +0200 Subject: [PATCH 04/68] fix(ipam): align IpamPrefix.status choice order with the base status order Packet: IPAM-05 (change, substance accepted). The mandatory plus default_value plus base palette work is exactly what CC-5 and CC-6 ask for; the one defect is that this node listed reserved after deprecated while DcimDevice, GenericVLAN, LocationRack and IpamIPAddress all put reserved first (4:1). Two nodes in the same file ordered the same dropdown differently. Checklist: CC-5 Co-Authored-By: Claude Fable 5 --- base/ipam.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/base/ipam.yml b/base/ipam.yml index 95e4797..45d2746 100644 --- a/base/ipam.yml +++ b/base/ipam.yml @@ -52,12 +52,12 @@ nodes: - name: active label: Active color: "#00d25b" - - name: deprecated - label: Deprecated - color: "#e04040" - name: reserved label: Reserved color: "#4d90fe" + - name: deprecated + label: Deprecated + color: "#e04040" optional: false order_weight: 1100 - name: description From 8119eb14b7731515e7b157b658e5c7e2dcc24567 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:08:15 +0200 Subject: [PATCH 05/68] fix(ipam): give IpamPrefix.role backbone its own color Packet: IPAM-04 (color half only, the rest is a question to the author). backbone and management both used #AEC6CF, so the two roles were indistinguishable in the UI and the color carried no information. #9678B6 is freed by dropping the v1 technical role. Co-Authored-By: Claude Fable 5 --- base/ipam.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base/ipam.yml b/base/ipam.yml index 45d2746..f732685 100644 --- a/base/ipam.yml +++ b/base/ipam.yml @@ -86,7 +86,7 @@ nodes: - name: backbone label: Backbone description: Core network infrastructure prefixes. - color: "#AEC6CF" + color: "#9678B6" optional: true order_weight: 1200 relationships: From 2ecaa005c1b6d6f85d767d8ca09578aea99c3cc3 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:08:27 +0200 Subject: [PATCH 06/68] fix: declare explicit uniqueness constraints behind HFIDs (CC-4) Packets: AGG-01, VLAN-01 (both change). CC-4 forbids relying on the constraint Infrahub derives from the human_friendly_id. IpamAggregate resolved to a derived [[prefix__value]] (namespace-less is correct here) and IpamVLANGroup.name to a derived [[name__value]]; both are now stated in the file. Checklist: CC-4 Co-Authored-By: Claude Fable 5 --- extensions/aggregate/aggregate.yml | 2 ++ extensions/vlan/vlan.yml | 1 + 2 files changed, 3 insertions(+) diff --git a/extensions/aggregate/aggregate.yml b/extensions/aggregate/aggregate.yml index 2b1513c..6f97aff 100644 --- a/extensions/aggregate/aggregate.yml +++ b/extensions/aggregate/aggregate.yml @@ -22,6 +22,8 @@ nodes: order_by: - prefix__value display_label: prefix__value + uniqueness_constraints: + - [prefix__value] attributes: - name: description kind: Text diff --git a/extensions/vlan/vlan.yml b/extensions/vlan/vlan.yml index 4a9a75e..8a3d8c8 100644 --- a/extensions/vlan/vlan.yml +++ b/extensions/vlan/vlan.yml @@ -121,6 +121,7 @@ nodes: attributes: - name: name kind: Text + unique: true order_weight: 1000 - name: description kind: Text From 09032e042b5dd0a9c66c80be5b0852c34658bb23 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:08:52 +0200 Subject: [PATCH 07/68] fix: align attribute names with CC-2 naming rules Packets: AGG-02, PSU-03, DCIM-CC2 (all change; DCIM-CC2 confirmed by Matej as a rename). CC-2 says Booleans are bare snake_case with no is_ prefix (is_private -> private, 7:1 in the tree) and no run-together words (hotswappable -> hot_swappable, named by the checklist). DCIM-CC2 follows the CC-2 majority count, serial_number 3 against serial 2, so base DcimPhysicalDevice and DcimGenericSFP move to serial_number. The matching object files are renamed in the same commit so the data still loads. Checklist: CC-2 Co-Authored-By: Claude Fable 5 --- base/dcim.yml | 2 +- extensions/aggregate/aggregate.yml | 2 +- extensions/device_psu_module/device_psu_module.yml | 2 +- extensions/sfp/sfp.yml | 2 +- objects/extensions/aggregate/aggregate.yml | 2 +- .../extensions/device_psu_module/device_psu_module.yml | 6 +++--- objects/extensions/dwdm/dwdm.yml | 6 +++--- objects/extensions/sfp/sfp.yml | 10 +++++----- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/base/dcim.yml b/base/dcim.yml index ddc424d..fd543cc 100644 --- a/base/dcim.yml +++ b/base/dcim.yml @@ -71,7 +71,7 @@ generics: optional: true description: Lowest unit. order_weight: 1500 - - name: serial + - name: serial_number kind: Text optional: true order_weight: 1500 diff --git a/extensions/aggregate/aggregate.yml b/extensions/aggregate/aggregate.yml index 6f97aff..c448e10 100644 --- a/extensions/aggregate/aggregate.yml +++ b/extensions/aggregate/aggregate.yml @@ -55,7 +55,7 @@ nodes: inherit_from: - OrganizationGeneric attributes: - - name: is_private + - name: private kind: Boolean label: Private default_value: false diff --git a/extensions/device_psu_module/device_psu_module.yml b/extensions/device_psu_module/device_psu_module.yml index 6c19931..c5804cc 100644 --- a/extensions/device_psu_module/device_psu_module.yml +++ b/extensions/device_psu_module/device_psu_module.yml @@ -50,7 +50,7 @@ nodes: optional: true description: "Wattage in watts." order_weight: 1300 - - name: hotswappable + - name: hot_swappable kind: Boolean label: Hot-Swappable default_value: false diff --git a/extensions/sfp/sfp.yml b/extensions/sfp/sfp.yml index 04bdbf8..3473484 100644 --- a/extensions/sfp/sfp.yml +++ b/extensions/sfp/sfp.yml @@ -16,7 +16,7 @@ generics: include_in_menu: true display_label: "{{ form_factor__value }} {{ sfp_type__value }}" attributes: - - name: serial + - name: serial_number kind: Text optional: true order_weight: 1400 diff --git a/objects/extensions/aggregate/aggregate.yml b/objects/extensions/aggregate/aggregate.yml index 9e0de29..6e7848a 100644 --- a/objects/extensions/aggregate/aggregate.yml +++ b/objects/extensions/aggregate/aggregate.yml @@ -20,7 +20,7 @@ spec: description: Réseau IP Européens Network Coordination Centre. - name: Private (RFC 1918) description: Internal registry for RFC 1918 / RFC 4193 private address space. - is_private: true + private: true --- apiVersion: infrahub.app/v1 diff --git a/objects/extensions/device_psu_module/device_psu_module.yml b/objects/extensions/device_psu_module/device_psu_module.yml index ca5be2b..f9e9e4c 100644 --- a/objects/extensions/device_psu_module/device_psu_module.yml +++ b/objects/extensions/device_psu_module/device_psu_module.yml @@ -25,21 +25,21 @@ spec: part_number: "A9K-PSU" manufacturer: Cisco wattage: 3000 - hotswappable: true + hot_swappable: true - name: MX204-PSU description: "AC power supply module for the MX204." part_number: "PSU-MX204" manufacturer: Juniper wattage: 650 - hotswappable: true + hot_swappable: true - name: PowerEdge-PSU description: "Redundant power supply module for the PowerEdge R660." part_number: "PWR-R660" manufacturer: Dell wattage: 800 - hotswappable: true + hot_swappable: true --- apiVersion: infrahub.app/v1 diff --git a/objects/extensions/dwdm/dwdm.yml b/objects/extensions/dwdm/dwdm.yml index c407e5d..5ea8373 100644 --- a/objects/extensions/dwdm/dwdm.yml +++ b/objects/extensions/dwdm/dwdm.yml @@ -134,7 +134,7 @@ spec: form_factor: sfp_plus status: plugged wdm_type: dwdm - serial: "SFP-WDM-0001" + serial_number: "SFP-WDM-0001" manufacturer: Cisco # `interface` peer (InterfacePhysical) is a CONCRETE kind with a # composite human_friendly_id ([device__name__value, name__value]). @@ -148,7 +148,7 @@ spec: form_factor: sfp_plus status: spare wdm_type: dwdm - serial: "SFP-WDM-0002" + serial_number: "SFP-WDM-0002" manufacturer: Cisco spare_location: kind: LocationSite @@ -160,7 +160,7 @@ spec: form_factor: qsfp28 status: spare wdm_type: cwdm - serial: "SFP-WDM-0003" + serial_number: "SFP-WDM-0003" manufacturer: Cisco spare_location: kind: LocationRack diff --git a/objects/extensions/sfp/sfp.yml b/objects/extensions/sfp/sfp.yml index c4c2236..ad99497 100644 --- a/objects/extensions/sfp/sfp.yml +++ b/objects/extensions/sfp/sfp.yml @@ -38,7 +38,7 @@ kind: Object spec: kind: DcimStandardSFP data: - - serial: "SFP-STD-0001" + - serial_number: "SFP-STD-0001" sfp_type: lr form_factor: sfp_plus status: plugged @@ -49,7 +49,7 @@ spec: # kind+data block -- this upserts against the existing interface. interface: [nyc1-rtr01, GigabitEthernet0/0/0/0] - - serial: "SFP-STD-0002" + - serial_number: "SFP-STD-0002" sfp_type: sr form_factor: sfp_plus status: spare @@ -63,7 +63,7 @@ spec: data: name: NYC1 - - serial: "SFP-STD-0003" + - serial_number: "SFP-STD-0003" sfp_type: t form_factor: sfp status: spare @@ -81,7 +81,7 @@ kind: Object spec: kind: DcimBidiSFP data: - - serial: "SFP-BIDI-0001" + - serial_number: "SFP-BIDI-0001" sfp_type: zr form_factor: sfp_plus status: plugged @@ -90,7 +90,7 @@ spec: manufacturer: Cisco interface: [nyc1-rtr01, GigabitEthernet0/0/0/1] - - serial: "SFP-BIDI-0002" + - serial_number: "SFP-BIDI-0002" sfp_type: zr form_factor: sfp_plus status: spare From fc52a80dbcefbf2b76bf0a689619a23064ad6565 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:09:03 +0200 Subject: [PATCH 08/68] fix: order uniqueness_constraints to match the namespace-first HFID Packets: IPAM-07 (change), base_ipam consistency note 3, ruling R5 (IpamCVLAN part deferred to the QinQ scoping change). The namespace-first human_friendly_id flip is accepted, but the declared constraints still read value-first, so Infrahub no longer recognises them as the same constraint and adds its derived one on top: the live schema carried two functionally identical constraints on IpamPrefix, IpamIPAddress and DcimCrossConnect. Reordering restores one explicit constraint and no implicit one. Checklist: CC-4 Co-Authored-By: Claude Fable 5 --- base/ipam.yml | 4 ++-- extensions/cross_connect/cross_connect.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/base/ipam.yml b/base/ipam.yml index f732685..8ce7bfa 100644 --- a/base/ipam.yml +++ b/base/ipam.yml @@ -43,7 +43,7 @@ nodes: - prefix__value display_label: prefix__value uniqueness_constraints: - - [prefix__value, ip_namespace] + - [ip_namespace, prefix__value] attributes: - name: status kind: Dropdown @@ -113,7 +113,7 @@ nodes: - address__value display_label: address__value uniqueness_constraints: - - [address__value, ip_namespace] + - [ip_namespace, address__value] attributes: - name: description kind: Text diff --git a/extensions/cross_connect/cross_connect.yml b/extensions/cross_connect/cross_connect.yml index 539a1f6..ec8d54f 100644 --- a/extensions/cross_connect/cross_connect.yml +++ b/extensions/cross_connect/cross_connect.yml @@ -22,7 +22,7 @@ nodes: - provider__name__value display_label: "{{ identifier__value }} (Provider: {{ provider__name__value }})" uniqueness_constraints: - - [identifier__value, provider] + - [provider, identifier__value] attributes: - name: identifier kind: Text From 26280ad76970a1bef75a0e8b8e9b25198f942470 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:15:44 +0200 Subject: [PATCH 09/68] fix(cable): give DcimCable a human_friendly_id backed by an explicit unique label Packet: CABLE-02 (change). order_by and display_label both point at label, which was optional and non-unique, so unlabelled cables rendered an empty display label and sorted arbitrarily. Making label the node's declared identity fixes both and covers CC-4's HFID-less-node list. Checklist: CC-4 Co-Authored-By: Claude Fable 5 --- extensions/cable/cable.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/extensions/cable/cable.yml b/extensions/cable/cable.yml index 9a13dcb..965cb58 100644 --- a/extensions/cable/cable.yml +++ b/extensions/cable/cable.yml @@ -16,6 +16,8 @@ nodes: menu_placement: DcimDevice inherit_from: - DcimConnector + human_friendly_id: + - label__value order_by: - label__value display_label: label__value @@ -217,7 +219,8 @@ nodes: order_weight: 1300 - name: label kind: Text - optional: true + unique: true + optional: false order_weight: 1200 # As we can't put float in Number "forcing" length in cm - name: length From 768d1601c76cf170abb0ae6812211d37de9457f6 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:15:54 +0200 Subject: [PATCH 10/68] refactor(cluster): rename ClusterGeneric.location to locations Packet: CLU-01 (change). ClusterGeneric.location is cardinality many with a singular name, and CC-2 makes plural the rule. No identifier is declared on either side and the reverse LocationGeneric.clusters is named independently, so the rename does not have to be mirrored. Checklist: CC-2 Co-Authored-By: Claude Fable 5 --- extensions/cluster/cluster.yml | 4 ++-- objects/extensions/hosting_cluster/hosting_cluster.yml | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/extensions/cluster/cluster.yml b/extensions/cluster/cluster.yml index 6788d7d..ca9d5e5 100644 --- a/extensions/cluster/cluster.yml +++ b/extensions/cluster/cluster.yml @@ -28,9 +28,9 @@ generics: kind: Text optional: true relationships: - - name: location + - name: locations peer: LocationGeneric - label: Location + label: Locations kind: Attribute cardinality: many optional: false diff --git a/objects/extensions/hosting_cluster/hosting_cluster.yml b/objects/extensions/hosting_cluster/hosting_cluster.yml index b25e1f4..7ab17ed 100644 --- a/objects/extensions/hosting_cluster/hosting_cluster.yml +++ b/objects/extensions/hosting_cluster/hosting_cluster.yml @@ -48,10 +48,10 @@ spec: description: VMware vSphere cluster at SJC1 built from physical servers. technology: vmware status: active - # `location` is cardinality many (a cluster can span locations), and + # `locations` is cardinality many (a cluster can span locations), and # LocationGeneric is a Generic -- a flat list of HFID strings works # against the existing LocationSite. - location: + locations: - SJC1 # `nodes` is cardinality many, and ComputeGenericUnit is a Generic -- # a flat list of HFID strings is not enough (the peer schema can't be @@ -73,7 +73,7 @@ spec: description: KVM/QEMU cluster at NYC1 built from physical servers. technology: kvm status: active - location: + locations: - NYC1 nodes: kind: ComputePhysicalServer From 18aa411f2611183818871b74c89b12febd7ab3f2 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:16:10 +0200 Subject: [PATCH 11/68] refactor(compute,hosting_cluster): group compute units under a visible ComputeGenericUnit Packets: COMP-03, HOST-03 (both escalated, decision Q6-B). CC-3 says menu placement follows the node's own domain: a Compute server filed under DcimDevice ("Network Device") and a Cluster filed under VirtualizationVirtualMachine both broke that, the latter also inverting containment. ComputeGenericUnit becomes the visible anchor, which is the library's own idiom and yields a real "all compute units" list. CLU-01 stands as the author wrote it: ClusterGeneric stays hidden. Checklist: CC-3, CC-9 Co-Authored-By: Claude Fable 5 --- extensions/compute/compute.yml | 6 ++++-- extensions/hosting_cluster/hosting_cluster.yml | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/extensions/compute/compute.yml b/extensions/compute/compute.yml index c773ff9..838e810 100644 --- a/extensions/compute/compute.yml +++ b/extensions/compute/compute.yml @@ -11,7 +11,8 @@ generics: - name: GenericUnit namespace: Compute description: A generic unit that can compute (e.g. server, vm ...). - include_in_menu: false + label: Compute + include_in_menu: true - name: HostVirtualMachine namespace: Virtualization @@ -31,7 +32,7 @@ nodes: description: A physical server with fixed resources and specific hardware characteristics. label: Physical Server icon: mdi:server - menu_placement: DcimDevice + menu_placement: ComputeGenericUnit inherit_from: - ComputeGenericUnit - DcimGenericDevice @@ -67,6 +68,7 @@ nodes: description: A virtual machine hosted on a server or a cluster. label: Virtual Machine icon: carbon:virtual-machine + menu_placement: ComputeGenericUnit include_in_menu: true inherit_from: - ComputeGenericUnit diff --git a/extensions/hosting_cluster/hosting_cluster.yml b/extensions/hosting_cluster/hosting_cluster.yml index 18d41e9..039bba9 100644 --- a/extensions/hosting_cluster/hosting_cluster.yml +++ b/extensions/hosting_cluster/hosting_cluster.yml @@ -13,7 +13,7 @@ nodes: description: A cluster hosting virtual machines. label: Hosting Cluster icon: mdi:dots-hexagon - menu_placement: VirtualizationVirtualMachine + menu_placement: ComputeGenericUnit inherit_from: - ClusterGeneric - VirtualizationHostVirtualMachine # Means we can get VM running on this one From 76acca101e6ae0bc6a8f8cbb489090a46cff0997 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:16:20 +0200 Subject: [PATCH 12/68] fix(cross_connect): align status with the base mandatory+default+palette convention Packet: XCON-CC6 (change, no packet owns the file). CC-6 names cross_connect as one of the status deviants: status is mandatory with a default_value everywhere else. planned is the safe default, since a cross-connect has to be ordered from a carrier before it is connected. The three colors were still the v1 palette. Checklist: CC-5, CC-6 Co-Authored-By: Claude Fable 5 --- extensions/cross_connect/cross_connect.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/extensions/cross_connect/cross_connect.yml b/extensions/cross_connect/cross_connect.yml index ec8d54f..05ff8ce 100644 --- a/extensions/cross_connect/cross_connect.yml +++ b/extensions/cross_connect/cross_connect.yml @@ -33,20 +33,21 @@ nodes: order_weight: 1300 - name: status kind: Dropdown + default_value: planned choices: - name: connected label: Connected description: "Fully operational and currently in connected" - color: "#7fbf7f" + color: "#00d25b" - name: planned label: Planned description: "In the process of being set up" - color: "#ffff7f" + color: "#2196f3" - name: reserved label: Reserved description: "Fully connected and reserved for a future use" - color: "#9090de" - optional: true + color: "#4d90fe" + optional: false order_weight: 1200 relationships: - name: location From 223c096dff9f42fb12e34abe527a174616571043 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:16:39 +0200 Subject: [PATCH 13/68] fix(device_module): make DcimModuleBay.position a validated Number Packet: MOD-04 (change). Text is the wrong kind: the description documented NetBox's {module} token substitution, which nothing here implements, the sibling DcimPhysicalDevice.position in the same namespace is a Number, and the author's own first version (98a730f) was Number with min_value 1. No uniqueness constraint restored: position is optional. Checklist: CC-2 Note: objects/extensions/device_module/device_module.yml still quotes the three values; unquoting them is the paired objects-file fix. Co-Authored-By: Claude Fable 5 --- extensions/device_module/device_module.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/extensions/device_module/device_module.yml b/extensions/device_module/device_module.yml index 5f18ed6..d0db68a 100644 --- a/extensions/device_module/device_module.yml +++ b/extensions/device_module/device_module.yml @@ -119,9 +119,12 @@ nodes: description: "Name of the bay, e.g. 'slot 1' or 'psu 1'." order_weight: 1000 - name: position - kind: Text + kind: Number optional: true - description: "Position identifier, substituted into a module's token." + parameters: + min_value: 1 + description: "Numeric position of the bay within the device (e.g. slot 1, 2, 3)." + order_weight: 1050 - name: description kind: Text optional: true From faf27384199901de31177ffc70e00c279e72cb70 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:16:53 +0200 Subject: [PATCH 14/68] fix(device_module): give DcimGenericModule.computed_name a default Jinja2 template Packet: MOD-06 (change). The generic declared computed_name as read_only + mandatory with no computed_attribute, so it could be neither set by a client nor computed by the server, and any node inheriting the generic without overriding it could not be created. The generic can compute from module_bay, which it owns; concrete kinds keep their own override. The stale "Overriten at node level" comment goes with it. Checklist: CC-4, CC-8 Co-Authored-By: Claude Fable 5 --- extensions/device_module/device_module.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/extensions/device_module/device_module.yml b/extensions/device_module/device_module.yml index d0db68a..a6aba34 100644 --- a/extensions/device_module/device_module.yml +++ b/extensions/device_module/device_module.yml @@ -18,13 +18,16 @@ generics: - computed_name__value display_label: computed_name__value attributes: - # Overriten at node level - name: computed_name kind: Text unique: true read_only: true optional: false allow_override: any + computed_attribute: + kind: Jinja2 + jinja2_template: "{{ module_bay__computed_name__value }}" + description: "Name computed from the module bay; concrete module kinds may refine it." order_weight: 1000 - name: serial_number kind: Text From d8d2307bdcb29b017b70a50e05d5881939bafda6 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:16:59 +0200 Subject: [PATCH 15/68] fix(device_psu_module): label and validate DcimPSUModuleType.wattage Packet: PSU-02 (change). CC-2 requires units in parentheses in the label, which base does uniformly ("Height (U)", "Weight (kg)"), and wattage carried no label at all. Commit 8eae840 in this PR set the min_value precedent; without it a wattage accepts 0 and negatives. Checklist: CC-2 Co-Authored-By: Claude Fable 5 --- extensions/device_psu_module/device_psu_module.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/extensions/device_psu_module/device_psu_module.yml b/extensions/device_psu_module/device_psu_module.yml index c5804cc..a4caf10 100644 --- a/extensions/device_psu_module/device_psu_module.yml +++ b/extensions/device_psu_module/device_psu_module.yml @@ -47,7 +47,10 @@ nodes: attributes: - name: wattage kind: Number + label: Wattage (W) optional: true + parameters: + min_value: 1 description: "Wattage in watts." order_weight: 1300 - name: hot_swappable From f9d3211b2c2695126442ff028fbec93ea6beddf0 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:17:24 +0200 Subject: [PATCH 16/68] fix(dwdm,patch_panel): restore the three connector types dropped by a stale 4096-char FIXME Packets: CONN-01 (change), CONN-02 (ruling R6). The FIXME's premise is false on 1.11.0: the full 28-choice list loads at roughly 3.3 KB against a 4096-char limit. CONN-02 keeps the two lists duplicated, so each now carries a sync comment pointing at the other; a shared generic in a common ancestor is the real deduplication and is a base-tier change for a separate release. The three restored choice names keep the surrounding UPPERCASE form; the case sweep owns all 28 values at once. Checklist: CC-5, CC-8 Co-Authored-By: Claude Fable 5 --- extensions/dwdm/dwdm.yml | 22 ++++++++++++---------- extensions/patch_panel/patch_panel.yml | 22 ++++++++++++---------- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/extensions/dwdm/dwdm.yml b/extensions/dwdm/dwdm.yml index c3ad93f..dab091f 100644 --- a/extensions/dwdm/dwdm.yml +++ b/extensions/dwdm/dwdm.yml @@ -21,6 +21,9 @@ generics: kind: Text optional: true order_weight: 2000 + # NOTE: this choice list is duplicated in extensions/patch_panel and the two must be + # kept in sync. Infrahub cannot share a choice list across extension files without a + # shared generic in a common ancestor, which is a base-tier change. - name: connector_type kind: Dropdown choices: @@ -99,16 +102,15 @@ generics: - name: URM_P2 label: URM-P2 description: "Specialized fiber optic connector for industrial and harsh environments." - # FIXME: Commenting out otherwise I'm facing a Text attribute length should be less than 4096 characters. - # - name: URM_P4 - # label: URM-P4 - # description: "Similar to URM-P2 but designed for higher performance." - # - name: URM_P8 - # label: URM-P8 - # description: "Enhanced version of URM connectors with higher protection." - # - name: Splice - # label: Splice - # description: "Permanent fiber connection method where two fiber ends are fused." + - name: URM_P4 + label: URM-P4 + description: "Similar to URM-P2 but designed for higher performance." + - name: URM_P8 + label: URM-P8 + description: "Enhanced version of URM connectors with higher protection." + - name: Splice + label: Splice + description: "Permanent fiber connection method where two fiber ends are fused." optional: true order_weight: 1100 nodes: diff --git a/extensions/patch_panel/patch_panel.yml b/extensions/patch_panel/patch_panel.yml index 7253ba4..6132427 100644 --- a/extensions/patch_panel/patch_panel.yml +++ b/extensions/patch_panel/patch_panel.yml @@ -21,6 +21,9 @@ generics: kind: Text optional: true order_weight: 2000 + # NOTE: this choice list is duplicated in extensions/dwdm and the two must be + # kept in sync. Infrahub cannot share a choice list across extension files without a + # shared generic in a common ancestor, which is a base-tier change. - name: connector_type kind: Dropdown choices: @@ -99,16 +102,15 @@ generics: - name: URM_P2 label: URM-P2 description: "Specialized fiber optic connector for industrial and harsh environments." - # FIXME: Commenting out otherwise I'm facing a Text attribute length should be less than 4096 characters. - # - name: URM_P4 - # label: URM-P4 - # description: "Similar to URM-P2 but designed for higher performance." - # - name: URM_P8 - # label: URM-P8 - # description: "Enhanced version of URM connectors with higher protection." - # - name: Splice - # label: Splice - # description: "Permanent fiber connection method where two fiber ends are fused." + - name: URM_P4 + label: URM-P4 + description: "Similar to URM-P2 but designed for higher performance." + - name: URM_P8 + label: URM-P8 + description: "Enhanced version of URM connectors with higher protection." + - name: Splice + label: Splice + description: "Permanent fiber connection method where two fiber ends are fused." order_weight: 1100 nodes: From c5931d807e150191e00ee09c478185e02f92f89f Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:17:38 +0200 Subject: [PATCH 17/68] fix(dwdm): keep connector_type mandatory, matching every other hardware-type enum in the domain Packet: DWDM-03 (change). The flip to optional was unstated and left one identical 25-choice list with two optionalities inside one domain. DcimGenericSFP.sfp_type, form_factor and DcimGenericPatchPanelInterface.connector_type are all mandatory; CC-6's "no sensible default" exception covers a mandatory connector type, and CONN-01 removed the one argument for optional by restoring the missing choices. Checklist: CC-6 Co-Authored-By: Claude Fable 5 --- extensions/dwdm/dwdm.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/dwdm/dwdm.yml b/extensions/dwdm/dwdm.yml index dab091f..4dfdd26 100644 --- a/extensions/dwdm/dwdm.yml +++ b/extensions/dwdm/dwdm.yml @@ -111,7 +111,7 @@ generics: - name: Splice label: Splice description: "Permanent fiber connection method where two fiber ends are fused." - optional: true + optional: false order_weight: 1100 nodes: - name: OpticalMultiplexer From 010d5b04f74eac60536596de96afe8f92900d902 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:17:52 +0200 Subject: [PATCH 18/68] fix(location,rack): align the retired lifecycle choice to the base deprecated vocabulary Packets: LMIN-03, RACK-02 (both change). CC-2 resolves split vocabulary by majority. Counted across base/ and extensions/, the choice name deprecated wins 5:2 and the label Deprecated 4:3, so both Sites rename. The Rack already used name: deprecated with label: Retired, exactly the name/label split CC-2 exists to close. Checklist: CC-2 Co-Authored-By: Claude Fable 5 --- extensions/location_minimal/location_minimal.yml | 4 ++-- extensions/location_site/location_site.yml | 4 ++-- extensions/rack/rack.yml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/extensions/location_minimal/location_minimal.yml b/extensions/location_minimal/location_minimal.yml index dc36906..ad2b547 100644 --- a/extensions/location_minimal/location_minimal.yml +++ b/extensions/location_minimal/location_minimal.yml @@ -58,8 +58,8 @@ nodes: - name: decommissioning label: Decommissioning color: "#ff9800" - - name: retired - label: Retired + - name: deprecated + label: Deprecated color: "#6c757d" optional: false order_weight: 1250 diff --git a/extensions/location_site/location_site.yml b/extensions/location_site/location_site.yml index 9f3c93f..0b13254 100644 --- a/extensions/location_site/location_site.yml +++ b/extensions/location_site/location_site.yml @@ -36,8 +36,8 @@ nodes: - name: decommissioning label: Decommissioning color: "#ff9800" - - name: retired - label: Retired + - name: deprecated + label: Deprecated color: "#6c757d" optional: false order_weight: 1250 diff --git a/extensions/rack/rack.yml b/extensions/rack/rack.yml index 43130b9..46151da 100644 --- a/extensions/rack/rack.yml +++ b/extensions/rack/rack.yml @@ -56,7 +56,7 @@ nodes: description: Rack is being phased out and emptied. color: "#ff9800" - name: deprecated - label: Retired + label: Deprecated description: Rack has been removed from service. color: "#6c757d" optional: false From 235be3e93ec5e66c69dbf751fc2b9cae3d001a9f Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:18:00 +0200 Subject: [PATCH 19/68] fix(patch_panel): namespace the front/rear interface relationship identifiers Packet: PP-01 (identifier half; the dependency and description halves belong to the metadata commit). CC-7 wants identifiers in subject__object form. DWDM-01 fixed the dwdm half of the v1 collision and left these two bare; v2.0 is the last release that may rename a stored relationship identifier. Checklist: CC-7 Co-Authored-By: Claude Fable 5 --- extensions/patch_panel/patch_panel.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/extensions/patch_panel/patch_panel.yml b/extensions/patch_panel/patch_panel.yml index 6132427..1304da5 100644 --- a/extensions/patch_panel/patch_panel.yml +++ b/extensions/patch_panel/patch_panel.yml @@ -146,13 +146,13 @@ nodes: kind: Component cardinality: many optional: true - identifier: front_interfaces + identifier: patch_panel__front_interfaces - name: rear_interfaces peer: DcimRearPatchPanelInterface kind: Component cardinality: many optional: true - identifier: rear_interfaces + identifier: patch_panel__rear_interfaces - name: FrontPatchPanelInterface namespace: Dcim @@ -183,7 +183,7 @@ nodes: kind: Parent cardinality: one optional: false - identifier: front_interfaces + identifier: patch_panel__front_interfaces order_weight: 900 - name: RearPatchPanelInterface @@ -215,5 +215,5 @@ nodes: kind: Parent cardinality: one optional: false - identifier: rear_interfaces + identifier: patch_panel__rear_interfaces order_weight: 900 From 7dd300be45d8ce9a001fc8f69880275e0f30a4c8 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:19:06 +0200 Subject: [PATCH 20/68] fix(rack): scope rack identity to its site and pair site/racks as Parent/Component Packet: RACK-01 (change). Two defects rode in on the split. CC-4: name was globally unique, so two sites could not each have a rack called R01, and rack names repeat across sites in every real estate; identity is now scoped by site with the uniqueness declared explicitly. CC-7: LocationRack.site was Attribute while its reverse LocationSite.racks is Component, and Parent is what pairs with Component. Deletion behaviour is unchanged, the site side stays Component and site stays mandatory. Checklist: CC-4, CC-7 Co-Authored-By: Claude Fable 5 --- extensions/rack/rack.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/extensions/rack/rack.yml b/extensions/rack/rack.yml index 46151da..1cc1aac 100644 --- a/extensions/rack/rack.yml +++ b/extensions/rack/rack.yml @@ -17,14 +17,17 @@ nodes: inherit_from: - LocationHosting human_friendly_id: + - site__name__value - name__value order_by: - name__value display_label: name__value + uniqueness_constraints: + - [site, name__value] attributes: - name: name kind: Text - unique: true + unique: false optional: false order_weight: 1000 - name: facility_id @@ -78,7 +81,7 @@ nodes: relationships: - name: site peer: LocationSite - kind: Attribute + kind: Parent cardinality: one optional: false identifier: site__racks From 2c9ce515fc08d25e8be5c44873f92deec5ea6756 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:19:22 +0200 Subject: [PATCH 21/68] refactor(rack): rename facility_id to facility to match LocationSite Packet: RACK-04 (change). CC-2's explicit call: facility beats facility_id 2:1, and the rack either aligns or documents that it is a different concept. The attribute carries no description at all, so nothing in the file distinguishes a rack's local identifier from a site's. The objects file moves with it or the load breaks. Checklist: CC-2 Co-Authored-By: Claude Fable 5 --- extensions/rack/rack.yml | 2 +- objects/extensions/rack/rack.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/rack/rack.yml b/extensions/rack/rack.yml index 1cc1aac..2f70cfc 100644 --- a/extensions/rack/rack.yml +++ b/extensions/rack/rack.yml @@ -30,7 +30,7 @@ nodes: unique: false optional: false order_weight: 1000 - - name: facility_id + - name: facility kind: Text optional: true order_weight: 1100 diff --git a/objects/extensions/rack/rack.yml b/objects/extensions/rack/rack.yml index 4255e0d..39ebd68 100644 --- a/objects/extensions/rack/rack.yml +++ b/objects/extensions/rack/rack.yml @@ -12,7 +12,7 @@ spec: site: NYC1 status: active height: 42 - facility_id: "R101" + facility: "R101" --- apiVersion: infrahub.app/v1 From e7bd03de4e8cb2d0a6a0600045449ea4b37a859d Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:19:41 +0200 Subject: [PATCH 22/68] fix(snmp): peer SnmpCommunity.devices at DcimGenericDevice Packet: SNMP-03 (change). Adding the link is right, the peer was not: concrete DcimDevice silently excludes ComputePhysicalServer, VirtualizationVirtualMachine and DcimPatchPanel, and servers and VMs are the most SNMP-polled things in an estate. TEN-02 in this same diff peers the base generic, and DcimGenericDevice is base, so the change costs no dependency edge. CC-4's explicit uniqueness behind the HFID name folds in here. Checklist: CC-1, CC-4, CC-7 Co-Authored-By: Claude Fable 5 --- extensions/snmp/snmp.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/extensions/snmp/snmp.yml b/extensions/snmp/snmp.yml index 2b81405..316a48f 100644 --- a/extensions/snmp/snmp.yml +++ b/extensions/snmp/snmp.yml @@ -21,6 +21,7 @@ generics: attributes: - name: name kind: Text + unique: true order_weight: 1000 - name: description kind: Text @@ -32,10 +33,12 @@ generics: kind: Component cardinality: many - name: devices - peer: DcimDevice + peer: DcimGenericDevice label: Devices kind: Attribute cardinality: many + optional: true + identifier: snmp_community__device description: Devices this community is configured on. order_weight: 1200 From 5094cc5ff88e84d36f0f483a07f38fe310872c96 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:19:49 +0200 Subject: [PATCH 23/68] refactor(snmp): pluralize SnmpClient relationships and make name unique Packet: SNMP-04 (change). CC-2 makes plural the rule on cardinality-many relationships and routes untouched singulars to their own packet; SnmpClient had two, the new ip_address and the pre-existing community. CC-4 lists SnmpClient among the nodes whose HFID name is not explicitly unique. community also had no kind, declared here as Attribute rather than left to the kind sweep. Checklist: CC-2, CC-4 Co-Authored-By: Claude Fable 5 --- extensions/snmp/snmp.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/extensions/snmp/snmp.yml b/extensions/snmp/snmp.yml index 316a48f..709aefc 100644 --- a/extensions/snmp/snmp.yml +++ b/extensions/snmp/snmp.yml @@ -156,6 +156,7 @@ nodes: attributes: - name: name kind: Text + unique: true order_weight: 1000 - name: client_description kind: Text @@ -163,14 +164,15 @@ nodes: optional: true order_weight: 1100 relationships: - - name: ip_address + - name: ip_addresses peer: IpamIPAddress - label: IP Address + label: IP Addresses kind: Attribute cardinality: many description: Authorized SNMP client address. order_weight: 1150 - - name: community + - name: communities peer: SnmpCommunity + kind: Attribute cardinality: many order_weight: 1200 From 83fcdde43c2a8a21abbb01fb32b5956a272dffb2 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:20:11 +0200 Subject: [PATCH 24/68] refactor(tenancy): rename TenancyTenant to OrganizationTenant and place it under Organization Packets: TEN-01, TEN-04 (both change). CC-3 names this node explicitly: a single-node Tenancy namespace whose only node inherits OrganizationGeneric violates one-namespace-per-domain, and the folder keeps the feature name. The missing label and menu_placement ride along, matching the two namespace siblings OrganizationManufacturer and OrganizationProvider. TEN-04: tenant__ipaddress runs two words together where every sibling identifier in the file separates them. Checklist: CC-3, CC-7 Co-Authored-By: Claude Fable 5 --- extensions/tenancy/tenancy.yml | 20 ++++++++++--------- .../extensions/routing_bgp/routing_bgp.yml | 2 +- objects/extensions/tenancy/tenancy.yml | 2 +- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/extensions/tenancy/tenancy.yml b/extensions/tenancy/tenancy.yml index eb128ee..49242d8 100644 --- a/extensions/tenancy/tenancy.yml +++ b/extensions/tenancy/tenancy.yml @@ -9,10 +9,12 @@ version: "1.0" nodes: - name: Tenant - namespace: Tenancy + namespace: Organization description: A tenant is the owner of the corresponding devices, addressing, and locations. + label: Tenant icon: mdi:domain include_in_menu: true + menu_placement: OrganizationGeneric inherit_from: - OrganizationGeneric relationships: @@ -36,7 +38,7 @@ nodes: kind: Generic cardinality: many optional: true - identifier: tenant__ipaddress + identifier: tenant__ip_address - name: locations peer: LocationHosting label: Locations @@ -50,7 +52,7 @@ extensions: - kind: DcimGenericDevice relationships: - name: tenant - peer: TenancyTenant + peer: OrganizationTenant kind: Attribute cardinality: one optional: true @@ -59,7 +61,7 @@ extensions: - kind: IpamPrefix relationships: - name: tenant - peer: TenancyTenant + peer: OrganizationTenant kind: Attribute cardinality: one optional: true @@ -68,16 +70,16 @@ extensions: - kind: IpamIPAddress relationships: - name: tenant - peer: TenancyTenant + peer: OrganizationTenant kind: Attribute cardinality: one optional: true - identifier: tenant__ipaddress + identifier: tenant__ip_address order_weight: 1300 - kind: LocationHosting relationships: - name: tenant - peer: TenancyTenant + peer: OrganizationTenant kind: Attribute cardinality: one optional: true @@ -102,12 +104,12 @@ extensions: # - kind: DcimCircuit # relationships: # - name: tenant -# peer: TenancyTenant +# peer: OrganizationTenant # identifier: tenant__circuit # optional: true # cardinality: one # kind: Attribute -# - kind: TenancyTenant +# - kind: OrganizationTenant # relationships: # - name: circuits # peer: DcimCircuit diff --git a/objects/extensions/routing_bgp/routing_bgp.yml b/objects/extensions/routing_bgp/routing_bgp.yml index 22e5f18..743b580 100644 --- a/objects/extensions/routing_bgp/routing_bgp.yml +++ b/objects/extensions/routing_bgp/routing_bgp.yml @@ -17,7 +17,7 @@ # relationships to Generic peers (OrganizationGeneric / LocationGeneric). # Per convention, a plain human_friendly_id scalar is tried first since the # target records already exist (OrganizationProvider "Acme Networks"/"Lumen" -# from base, TenancyTenant "Globex Corp" from extensions/tenancy, LocationSite +# from base, OrganizationTenant "Globex Corp" from extensions/tenancy, LocationSite # "NYC1" from extensions/location_minimal). # # RoutingBGPSession's human_friendly_id is just `description__value` (the diff --git a/objects/extensions/tenancy/tenancy.yml b/objects/extensions/tenancy/tenancy.yml index 90bdda7..26db2f1 100644 --- a/objects/extensions/tenancy/tenancy.yml +++ b/objects/extensions/tenancy/tenancy.yml @@ -9,7 +9,7 @@ apiVersion: infrahub.app/v1 kind: Object spec: - kind: TenancyTenant + kind: OrganizationTenant data: - name: Acme Corp description: Primary tenant for the NYC1 backbone. From cf085f491961660c751020da986b1a9c3587cb55 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:20:33 +0200 Subject: [PATCH 25/68] refactor(vlan): fill IpamVLANGroupScope through the extensions mechanism Packet: IPAM-03 (change). The bare stub in base is forced: base loads standalone and first, so it cannot declare vlan_groups without dangling on IpamVLANGroup. What was wrong is the mechanism the extension used to fill it: re-declaring the whole generic under generics: replaces base's definition, duplicates a kind across two files, and hides who fills the stub from a reader of base. extensions: nodes: - kind: is the documented and repo-established mechanism, already used on LocationHosting by three extensions in this tree. The stub also gains the label and description CC-2/CC-8 require. Checklist: CC-1, CC-2, CC-8 Co-Authored-By: Claude Fable 5 --- base/ipam.yml | 3 +++ extensions/vlan/vlan.yml | 22 +++++++++------------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/base/ipam.yml b/base/ipam.yml index 8ce7bfa..a15fb11 100644 --- a/base/ipam.yml +++ b/base/ipam.yml @@ -13,6 +13,9 @@ generics: # them without requiring users to modify their schema manually. - name: VLANGroupScope namespace: Ipam + label: VLAN Group Scope + description: Mixin for objects that can scope a VLAN group (e.g. Region, Site, Rack). The + reverse relationship is added by extensions/vlan. include_in_menu: false - name: PrefixScope diff --git a/extensions/vlan/vlan.yml b/extensions/vlan/vlan.yml index 8a3d8c8..401ac07 100644 --- a/extensions/vlan/vlan.yml +++ b/extensions/vlan/vlan.yml @@ -8,19 +8,6 @@ version: "1.0" generics: - - name: VLANGroupScope - namespace: Ipam - description: Mixin for objects that can scope a VLAN group (e.g. Region, Site, Rack). - include_in_menu: false - relationships: - - name: vlan_groups - peer: IpamVLANGroup - label: VLAN Groups - kind: Attribute - cardinality: many - optional: true - identifier: vlan_group__scope - - name: VLAN namespace: Generic description: A VLAN is isolated layer two domain @@ -143,6 +130,15 @@ nodes: extensions: nodes: + - kind: IpamVLANGroupScope + relationships: + - name: vlan_groups + peer: IpamVLANGroup + label: VLAN Groups + kind: Attribute + cardinality: many + optional: true + identifier: vlan_group__scope - kind: IpamPrefix relationships: - name: vlan From 33a88dfa7f663fddde3442cd1dbc0314467ea55f Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:21:09 +0200 Subject: [PATCH 26/68] fix: rename GenericVLAN to IpamGenericVLAN and scope VLAN-ID uniqueness per kind Packets: VLAN-03, QINQ-02 (both change; decision Q4-A). CC-2 rejects a literal Generic namespace: the namespace is prepended to form the kind and "Generic" is not a domain, so the convention is Generic, exactly the DcimGenericDevice shape. Separately, [vlan_id__value, vlan_group] on the generic made IpamVLAN, IpamSVLAN and IpamCVLAN share one flat VLAN-ID space per group, so two C-VLANs with the same C-tag under different S-VLANs were rejected at create time. That is the central Q-in-Q case. The constraint moves down to IpamVLAN and IpamSVLAN; IpamCVLAN keeps only its own [vlan_id__value, svlan]. Checklist: CC-2, CC-4 Co-Authored-By: Claude Fable 5 --- extensions/qinq/qinq.yml | 6 ++++-- extensions/vlan/vlan.yml | 20 ++++++++++---------- objects/extensions/qinq/qinq.yml | 2 +- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/extensions/qinq/qinq.yml b/extensions/qinq/qinq.yml index b49de73..62bb3ec 100644 --- a/extensions/qinq/qinq.yml +++ b/extensions/qinq/qinq.yml @@ -14,7 +14,9 @@ nodes: label: S-VLAN include_in_menu: false inherit_from: - - GenericVLAN + - IpamGenericVLAN + uniqueness_constraints: + - [vlan_id__value, vlan_group] relationships: - name: cvlan peer: IpamCVLAN @@ -31,7 +33,7 @@ nodes: label: C-VLAN include_in_menu: false inherit_from: - - GenericVLAN + - IpamGenericVLAN human_friendly_id: - svlan__name__value - vlan_id__value diff --git a/extensions/vlan/vlan.yml b/extensions/vlan/vlan.yml index 401ac07..00f9f7d 100644 --- a/extensions/vlan/vlan.yml +++ b/extensions/vlan/vlan.yml @@ -8,8 +8,8 @@ version: "1.0" generics: - - name: VLAN - namespace: Generic + - name: GenericVLAN + namespace: Ipam description: A VLAN is isolated layer two domain label: VLAN icon: mdi:lan-pending @@ -18,8 +18,6 @@ generics: order_by: - name__value display_label: name__value - uniqueness_constraints: - - [vlan_id__value, vlan_group] attributes: - name: name kind: Text @@ -94,14 +92,16 @@ nodes: label: VLAN include_in_menu: false inherit_from: - - GenericVLAN + - IpamGenericVLAN + uniqueness_constraints: + - [vlan_id__value, vlan_group] - name: VLANGroup namespace: Ipam description: A VLAN group scopes VLANs to a domain (site, rack, etc.). label: VLAN Group icon: mdi:domain-switch - menu_placement: GenericVLAN + menu_placement: IpamGenericVLAN human_friendly_id: - name__value display_label: name__value @@ -122,7 +122,7 @@ nodes: identifier: vlan_group__scope order_weight: 900 - name: vlans - peer: GenericVLAN + peer: IpamGenericVLAN kind: Component cardinality: many optional: true @@ -142,7 +142,7 @@ extensions: - kind: IpamPrefix relationships: - name: vlan - peer: GenericVLAN + peer: IpamGenericVLAN kind: Attribute cardinality: one optional: true @@ -151,14 +151,14 @@ extensions: - kind: InterfaceLayer2 relationships: - name: untagged_vlan - peer: GenericVLAN + peer: IpamGenericVLAN label: Untagged VLAN kind: Generic cardinality: one optional: true identifier: interface_l2__untagged_vlan - name: tagged_vlan - peer: GenericVLAN + peer: IpamGenericVLAN label: Tagged VLANs kind: Generic cardinality: many diff --git a/objects/extensions/qinq/qinq.yml b/objects/extensions/qinq/qinq.yml index 473e0f2..5abbdce 100644 --- a/objects/extensions/qinq/qinq.yml +++ b/objects/extensions/qinq/qinq.yml @@ -2,7 +2,7 @@ # Mock data for extensions/qinq. # Depends on: base, extensions/location_minimal, extensions/vlan # (IpamVLANGroup: NYC1-VLANs). -# IpamSVLAN and IpamCVLAN both inherit from GenericVLAN, so each needs its own +# IpamSVLAN and IpamCVLAN both inherit from IpamGenericVLAN, so each needs its own # vlan_id/vlan_group. IpamCVLAN's `name` attribute is a read-only computed # attribute (Jinja2 from svlan + vlan_id), so it is never set here. # --------------------------------------------------------------------------- From b26063a4b84ba7bd85571d75e31e7746bdd1298e Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:21:21 +0200 Subject: [PATCH 27/68] fix(qinq): order the IpamCVLAN uniqueness constraint to match its HFID Packets: IPAM-07 cross-reference, base_ipam consistency note 3, ruling R5. Third and last of the duplicate-constraint fixes; IpamPrefix, IpamIPAddress and DcimCrossConnect landed earlier. IpamCVLAN's HFID reads [svlan__name__value, vlan_id__value] while the declared constraint read [vlan_id__value, svlan], so Infrahub no longer recognised them as the same constraint and added its derived one on top. Sequenced after the QinQ scoping change so the reorder applies to the final constraint set. Checklist: CC-4 Co-Authored-By: Claude Fable 5 --- extensions/qinq/qinq.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/qinq/qinq.yml b/extensions/qinq/qinq.yml index 62bb3ec..3d82388 100644 --- a/extensions/qinq/qinq.yml +++ b/extensions/qinq/qinq.yml @@ -39,7 +39,7 @@ nodes: - vlan_id__value display_label: "{{ svlan__name__value }}-{{ vlan_id__value }}" uniqueness_constraints: - - [vlan_id__value, svlan] + - [svlan, vlan_id__value] attributes: - name: name kind: Text From 041928129f8e56c77ee74103fd4a47d37f05d9bb Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:21:27 +0200 Subject: [PATCH 28/68] fix: stop a VRRP virtual IP deletion from cascading into its group Packet: VRRP-02 (change, admitted under ruling R3). Measured: deleting a single virtual IP address deleted the VRRP group and the group's other virtual IP. The cause is kind: Component on IpamIPAddress.vrrp, which implies on_delete: cascade and declares that an IP address owns a VRRP group. Every other Component relationship in the library points container to children. The group to IPs cascade stays: a VIP exists only for its group. A kind change does not touch the derived identifier, so no data migration. Checklist: CC-7 Co-Authored-By: Claude Fable 5 --- extensions/vrrp/vrrp.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/vrrp/vrrp.yml b/extensions/vrrp/vrrp.yml index 54f9d17..7e4e3f9 100644 --- a/extensions/vrrp/vrrp.yml +++ b/extensions/vrrp/vrrp.yml @@ -112,7 +112,7 @@ extensions: - name: vrrp peer: NetworkVRRPGroup label: VRRP Group - kind: Component + kind: Attribute cardinality: one description: Part of VRRP Group order_weight: 1600 From 8d93b7ed4704a8ad9492f8ad374ed5539387c3cb Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:21:35 +0200 Subject: [PATCH 29/68] fix(peering_ixp): do not cascade-delete BGP sessions with their IXP connection Packet: IXP-02 (change). Live-verified: PeeringIXPConnection.bgp_sessions resolves to Component, which defaults to on_delete: cascade, while RoutingBGPSession.ixp_connection is optional. So deleting an IXP connection silently deleted its BGP sessions with their policies and AS links, even though the schema says a session need not have a connection. This is the only Component pair in the repo whose child side is optional by necessity. kind stays Component for the separate-tab UI; on_delete, not the kind, drives deletion. Checklist: CC-7 Co-Authored-By: Claude Fable 5 --- extensions/peering_ixp/peering_ixp.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/extensions/peering_ixp/peering_ixp.yml b/extensions/peering_ixp/peering_ixp.yml index 477d210..4976acc 100644 --- a/extensions/peering_ixp/peering_ixp.yml +++ b/extensions/peering_ixp/peering_ixp.yml @@ -187,6 +187,7 @@ nodes: kind: Component cardinality: many optional: true + on_delete: no-action # a session outlives its IXP connection; it is owned by its device identifier: ixpconn__bgpsessions description: "BGP sessions established over this IXP connection" order_weight: 1450 From 83f8f27ae6cdcd6dfe6f34461fbb5fddc8b33a26 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:22:27 +0200 Subject: [PATCH 30/68] fix(snmp): follow the community and device renames in the objects file Packets: SNMP-03, SNMP-04 (objects half). The SNMP-04 verdict states the objects file populates neither renamed relationship; it does populate community on SnmpClient three times, so the load would break on communities. The header comment also still named DcimDevice and ip_address. Split out rather than folded because both schema commits had already landed. Co-Authored-By: Claude Fable 5 --- objects/extensions/snmp/snmp.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/objects/extensions/snmp/snmp.yml b/objects/extensions/snmp/snmp.yml index 59f2f7f..5a1984f 100644 --- a/objects/extensions/snmp/snmp.yml +++ b/objects/extensions/snmp/snmp.yml @@ -1,7 +1,7 @@ # --------------------------------------------------------------------------- # Mock data for extensions/snmp. # Standalone extension -- no fixture dependencies. The `devices` relationship -# on SnmpCommunity (-> DcimDevice) and `ip_address` on SnmpClient +# on SnmpCommunity (-> DcimGenericDevice) and `ip_addresses` on SnmpClient # (-> IpamIPAddress) are optional and intentionally left unset here. # --------------------------------------------------------------------------- --- @@ -49,9 +49,9 @@ spec: data: - name: nms-poller-01 client_description: Primary NMS polling server. - # SnmpCommunity is a Generic -- specify the concrete kind. `community` is + # SnmpCommunity is a Generic -- specify the concrete kind. `communities` is # cardinality many, so `data` is a list under the single kind mapping. - community: + communities: kind: SnmpCommunityV3 data: - name: monitoring-v3 @@ -61,7 +61,7 @@ spec: security_level: authPriv - name: legacy-monitor-01 client_description: Legacy monitoring host polling via SNMPv2c. - community: + communities: kind: SnmpCommunityV2 data: - name: public-ro @@ -69,7 +69,7 @@ spec: access: read_only - name: netops-workstation client_description: NetOps engineer workstation with read-write access. - community: + communities: kind: SnmpCommunityV2 data: - name: private-rw From 3de8d8afc02007e9810a45fe639af0405d6dc3b1 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:25:55 +0200 Subject: [PATCH 31/68] fix(topology): point experimental topology at Ipam kinds Packets: EXP-02 (STRUCT-01) The three IPAM peers name an Infra* namespace that does not exist anywhere in base or extensions, so the schema cannot load. This PR deletes extensions/topology and makes this file the library's only topology model, so the pre-existing breakage is now v2.0's to carry. The missing extensions/vlan dependency edge lands with the merged .metadata.yml dependency commit. Co-Authored-By: Claude Fable 5 --- experimental/topology/topology.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/experimental/topology/topology.yml b/experimental/topology/topology.yml index b2c1d8d..7201bf1 100644 --- a/experimental/topology/topology.yml +++ b/experimental/topology/topology.yml @@ -49,7 +49,7 @@ generics: optional: true cardinality: many - name: ip_addresses - peer: InfraIPAddress + peer: IpamIPAddress optional: true cardinality: many kind: Component @@ -404,13 +404,13 @@ nodes: kind: Parent optional: false - name: vlan - peer: InfraVLAN + peer: IpamVLAN optional: true cardinality: one kind: Component order_weight: 1500 - name: prefix - peer: InfraPrefix + peer: IpamPrefix optional: true cardinality: one kind: Component From 9ce2a4917b38198ae95744ad7347f377291037c4 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:26:03 +0200 Subject: [PATCH 32/68] fix(circuit_service): use DcimCircuitEndpoint kind Packets: EXP-03 CircuitEndpoint is not a kind anywhere in the library; the declared dependency extensions/circuit defines DcimCircuitEndpoint. Two tokens stand between this extension and loading, and the declared dependency list is already correct. Co-Authored-By: Claude Fable 5 --- experimental/circuit_service/circuit_service.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/experimental/circuit_service/circuit_service.yml b/experimental/circuit_service/circuit_service.yml index ba54181..742973b 100644 --- a/experimental/circuit_service/circuit_service.yml +++ b/experimental/circuit_service/circuit_service.yml @@ -35,7 +35,7 @@ nodes: cardinality: one kind: Attribute - name: circuit_endpoints - peer: CircuitEndpoint + peer: DcimCircuitEndpoint optional: true cardinality: many kind: Component @@ -48,7 +48,7 @@ extensions: peer: CircuitService cardinality: many optional: true - - kind: CircuitEndpoint + - kind: DcimCircuitEndpoint relationships: - name: circuit_service peer: CircuitService From ce79de597b8b770e8ef5c012e6915f4eab0f715d Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:26:12 +0200 Subject: [PATCH 33/68] fix(location_extended): use name in LocationRack human_friendly_id Packets: EXP-04 Checklist: CC-4 base/location.yml drops shortname from LocationGeneric in this PR and switches the human_friendly_id to name, but LocationRack here still resolves its HFID through shortname__value and defines no shortname of its own, so the schema no longer loads. The break arrives entirely from base, so this PR owns it. Co-Authored-By: Claude Fable 5 --- experimental/location_extended/location_extended.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/experimental/location_extended/location_extended.yml b/experimental/location_extended/location_extended.yml index 4ce118d..20a2278 100644 --- a/experimental/location_extended/location_extended.yml +++ b/experimental/location_extended/location_extended.yml @@ -114,7 +114,7 @@ nodes: label: Rack display_label: name__value human_friendly_id: - - shortname__value + - name__value parent: "LocationSuite" children: "" icon: "clarity:rack-server-line" From 3ebaac787fd60376264b77dde903587f0cef1b12 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:26:35 +0200 Subject: [PATCH 34/68] fix(optical_transport): compute module names from the module bay in one hop Packets: EXP-05 (STRUCT-05) Re-pointing these three nodes from the removed DeviceGenericModule to DcimGenericModule left the templates traversing module_bay -> device, and Jinja2 computed attributes only resolve direct relationships, so the schema is rejected. Switch to the one-hop idiom the rest of the library uses, module_bay__computed_name__value, and correct the three description examples: the name now keys off device name plus bay, not the device serial number. Co-Authored-By: Claude Fable 5 --- experimental/optical_transport/optical_transport.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/experimental/optical_transport/optical_transport.yml b/experimental/optical_transport/optical_transport.yml index 42bad3b..acc989f 100644 --- a/experimental/optical_transport/optical_transport.yml +++ b/experimental/optical_transport/optical_transport.yml @@ -712,8 +712,8 @@ nodes: optional: false computed_attribute: kind: Jinja2 - jinja2_template: "{{ module_bay__device__serial__value }}-TPD-{{ slot_number__value }}" - description: "Computed module name (e.g., ABC123-TPD-1/1)" + jinja2_template: "{{ module_bay__computed_name__value }}-TPD-{{ slot_number__value }}" + description: "Computed module name (e.g., dc1-leaf1 > slot 1-TPD-1/1)" - name: slot_number kind: Text optional: false @@ -826,8 +826,8 @@ nodes: optional: false computed_attribute: kind: Jinja2 - jinja2_template: "{{ module_bay__device__serial__value }}-MUX-{{ slot_number__value }}" - description: "Computed module name (e.g., ABC123-MUX-1/3)" + jinja2_template: "{{ module_bay__computed_name__value }}-MUX-{{ slot_number__value }}" + description: "Computed module name (e.g., dc1-leaf1 > slot 1-MUX-1/3)" - name: slot_number kind: Text optional: false @@ -1130,8 +1130,8 @@ nodes: optional: false computed_attribute: kind: Jinja2 - jinja2_template: "{{ module_bay__device__serial__value }}-AMP-{{ slot_number__value }}" - description: "Computed module name (e.g., ABC123-AMP-1/5)" + jinja2_template: "{{ module_bay__computed_name__value }}-AMP-{{ slot_number__value }}" + description: "Computed module name (e.g., dc1-leaf1 > slot 1-AMP-1/5)" - name: slot_number kind: Text optional: false From 0ffcd605483075fa07ab5e9308c061416067a754 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:26:58 +0200 Subject: [PATCH 35/68] fix(physical_disk): scope disk identity to its device Packets: lead reviewer ruling, 2026-08-31 (new) Checklist: CC-4 Disk names repeat across devices, so a bare name__value human_friendly_id cannot address a disk; the node already declares the matching [device, name__value] uniqueness constraint. Resolving device__name__value needs a name on the DcimDeviceWithPhysicalDisks generic, so add one with allow_override: any, following the precedent base/dcim.yml sets on DcimPhysicalDevice.name for DcimModuleBay. Co-Authored-By: Claude Fable 5 --- extensions/physical_disk/physical_disk.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/extensions/physical_disk/physical_disk.yml b/extensions/physical_disk/physical_disk.yml index c805d84..038b383 100644 --- a/extensions/physical_disk/physical_disk.yml +++ b/extensions/physical_disk/physical_disk.yml @@ -12,6 +12,10 @@ generics: namespace: Dcim description: Generic that hold relationship toward physical disks. To apply on device that can have physical disks. include_in_menu: false + attributes: + - name: name # Here so HFIDs and computed names can resolve, see DcimPhysicalDevice.name + kind: Text + allow_override: any relationships: - name: physical_disks peer: DcimPhysicalDisk @@ -26,6 +30,7 @@ nodes: label: Physical Disk icon: carbon:vmdk-disk human_friendly_id: + - device__name__value - name__value order_by: - name__value From c40a1720bf47ce0fcba61d7a18f3aca980e44451 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:27:55 +0200 Subject: [PATCH 36/68] fix(metadata): declare exactly the dependencies each extension uses Packets: RTG-CC1, BGPC-CC1, IXP-03, STRUCT-11, STRUCT-12, CIRC-05, PP-01, RACK-05, EXP-02 Checklist: CC-1 Every declared edge is now referenced by the extension's YAML and every kind an extension references is owned inside its transitive closure. Twelve entries change: - extensions/circuit: drop extensions/location_minimal (DcimCircuit.location is gone, only LocationHosting from base remains) (CIRC-05) - extensions/patch_panel: add extensions/device_module, and stop promising the removed DcimPatchPanelModule in the description (PP-01) - extensions/rack: re-point extensions/location_minimal to extensions/location_site, the smallest provider of Location.Site, with the either-package note in the description since a flat list cannot say "one of" (RACK-05, ruling 1) - extensions/routing: drop extensions/vlan, add extensions/vrf (RTG-CC1) - extensions/routing_bgp_community: drop extensions/routing, add extensions/routing_policies (BGPC-CC1) - extensions/routing_bgp_rr: drop extensions/routing (RTG-CC1) - extensions/routing_policies_aggregate: drop extensions/routing and extensions/routing_aggregate (RTG-CC1) - extensions/routing_policies_bgp: drop extensions/routing (RTG-CC1) - extensions/routing_policies_ospf: drop extensions/routing (RTG-CC1) - extensions/routing_policies_pim: drop extensions/routing (RTG-CC1) - extensions/peering_ixp: drop extensions/routing and extensions/routing_policies, both unused and both reached transitively (IXP-03, STRUCT-11) - experimental/topology: add extensions/vlan, now that the VLAN peer resolves to IpamVLAN (EXP-02) routing_policies_aggregate.yml gains one comment line so the commented-out extensions block records that uncommenting it needs the dropped extensions/routing_aggregate edge back (RPOL-CC9 bucket b rider). Resolver check after the edit: 57 nodes ordered, no cycle, no dangling edge. Co-Authored-By: Claude Fable 5 --- .metadata.yml | 26 ++++++++----------- .../routing_policies_aggregate.yml | 1 + 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/.metadata.yml b/.metadata.yml index 71a7260..5a2e163 100644 --- a/.metadata.yml +++ b/.metadata.yml @@ -90,6 +90,7 @@ experimental/security: experimental/topology: dependencies: - base + - extensions/vlan description: A schema for defining and managing network topology, strategies, and services. @@ -119,7 +120,6 @@ extensions/cable: extensions/circuit: dependencies: - base - - extensions/location_minimal description: This schema extension contains Circuits and ways to connect them with your infrastructure! The circuit could be a fiber connecting two sites, you would @@ -245,18 +245,17 @@ extensions/device_psu_module: extensions/patch_panel: dependencies: - base + - extensions/device_module description: | - This schema extension allows you to capture patch panel related information like rear/front interfaces and mapping between them. You can insert the patch panel into a rack and leverage the device type model. Finally you can also capture information about potential modules you would insert into your patch panel. + This schema extension allows you to capture patch panel related information like rear/front interfaces and mapping between them. You can insert the patch panel into a rack and leverage the device type model. Cassettes and other inserts are tracked as regular device modules in module bays, through extensions/device_module. NOTE: This extension is compatible with all sort of connectors, meaning you can plug cable, circuits, cross-connect to front & rear interfaces! name: Patch Panel extensions/peering_ixp: dependencies: - base - - extensions/routing - extensions/routing_bgp - extensions/routing_bgp_community - - extensions/routing_policies - extensions/routing_policies_bgp description: This schema extension contains all you need to model anything revolving @@ -273,11 +272,14 @@ extensions/physical_disk: extensions/rack: dependencies: - base - - extensions/location_minimal - description: + - extensions/location_site + description: >- This schema extension introduces a Rack model representing a physical equipment rack installed at a site. Racks can be placed at a LocationSite and can host devices - and other equipment. + and other equipment. LocationRack needs a Location.Site: extensions/location_site is + declared above as the smallest provider, but extensions/location_minimal provides the + same node as part of its hierarchy and satisfies the rack equally, load whichever + suits, never both. name: Rack extensions/qinq: dependencies: @@ -290,7 +292,7 @@ extensions/qinq: extensions/routing: dependencies: - base - - extensions/vlan + - extensions/vrf description: This schema extension contains generics to create Routing Protocol "Instance". The idea is to create one Routing Protocol instance per IpamVRF + @@ -313,13 +315,12 @@ extensions/routing_bgp: extensions/routing_bgp_community: dependencies: - base - - extensions/routing + - extensions/routing_policies description: This schema extension adds the BGP Communities models. name: Routing BGP Community extensions/routing_bgp_rr: dependencies: - base - - extensions/routing - extensions/routing_bgp description: This schema extension extend the BGP extension to add BGP Route Reflector @@ -349,9 +350,7 @@ extensions/routing_policies: extensions/routing_policies_aggregate: dependencies: - base - - extensions/routing - extensions/routing_policies - - extensions/routing_aggregate description: This extension is using the Routing Policies extensions and the Routing Aggregate one together. @@ -359,7 +358,6 @@ extensions/routing_policies_aggregate: extensions/routing_policies_bgp: dependencies: - base - - extensions/routing - extensions/routing_policies - extensions/routing_bgp description: @@ -369,7 +367,6 @@ extensions/routing_policies_bgp: extensions/routing_policies_ospf: dependencies: - base - - extensions/routing - extensions/routing_policies - extensions/routing_ospf description: @@ -379,7 +376,6 @@ extensions/routing_policies_ospf: extensions/routing_policies_pim: dependencies: - base - - extensions/routing - extensions/routing_policies - extensions/routing_pim description: diff --git a/extensions/routing_policies_aggregate/routing_policies_aggregate.yml b/extensions/routing_policies_aggregate/routing_policies_aggregate.yml index 57dce38..426509f 100644 --- a/extensions/routing_policies_aggregate/routing_policies_aggregate.yml +++ b/extensions/routing_policies_aggregate/routing_policies_aggregate.yml @@ -17,6 +17,7 @@ nodes: inherit_from: - "RoutingPolicy" # TODO: extend if need +# Uncommenting this block also requires adding extensions/routing_aggregate back to .metadata.yml. # extensions: # nodes: # - kind: RoutingAggregate From 606714f8d9a204a7889688273cbd94c7ef2335b7 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:30:34 +0200 Subject: [PATCH 37/68] feat(metadata): declare mutual exclusivity between overlapping extensions and honour it in the loader Packets: STRUCT-09, FR-004b, LSITE-01, EXP-06 (STRUCT-08) Checklist: CC-1, CC-8 Two pairs of packages define the same kind and cannot be loaded together: extensions/location_minimal and extensions/location_site both define Location.Site, and experimental/location_extended and extensions/rack both define Location.Rack. Until now co-loading was silent: the hierarchical Site simply won in either order, so a user who picked location_site for a flat model got the hierarchy with no warning, and the rack pair fails outright with "Hierarchy must be provided if either parent or children is defined". - .metadata.yml gains a machine-readable exclusive_with key on all four entries, declared in both directions, and reciprocal prose in every description, which CC-1 requires on both sides. - location_minimal's description also records the constraint that stays invisible until data is loaded: LocationGeneric.name is unique across every location kind, so a single-country deployment enters the hierarchy at Country rather than duplicating a country under several regions (FR-004b field test; generic-level uniqueness itself stays as it is). - Both location YAML files, plus rack and location_extended, carry the same note above their nodes block, and the three READMEs say it too, including the "LocationSite comes from either location package" line rack was missing. - load_all_schemas honours the key through _select_extensions: a member is skipped once its partner is selected, so location_minimal, the superset, is what CI loads. Because the skip only fires after the partner is loaded, the partner always comes first and a dependency on the skipped member is satisfied by it, which is what makes rack's re-point at location_site safe for hierarchy users. An experimental package always yields to the extension it collides with, whatever the load order says, so rack survives a TEST_EXPERIMENTAL run and location_extended is the one skipped. Resolver check: 57 nodes ordered, no cycle. Selection drops location_site without the flag, and location_site plus location_extended with it. Co-Authored-By: Claude Fable 5 --- .metadata.yml | 29 ++++++++++---- .../location_extended/location_extended.yml | 1 + extensions/location_minimal/README.md | 2 + .../location_minimal/location_minimal.yml | 1 + extensions/location_site/README.md | 2 + extensions/location_site/location_site.yml | 1 + extensions/rack/README.md | 2 + extensions/rack/rack.yml | 1 + tasks/schemas.py | 39 ++++++++++++++++--- 9 files changed, 66 insertions(+), 12 deletions(-) diff --git a/.metadata.yml b/.metadata.yml index 5a2e163..1485e7d 100644 --- a/.metadata.yml +++ b/.metadata.yml @@ -54,9 +54,12 @@ experimental/optical_transport: experimental/location_extended: dependencies: - base - description: - This schema extension is the most detailed when it comes to location, - you'll find all the layers you can think of. + exclusive_with: + - extensions/rack + description: >- + This schema extension is the most detailed when it comes to location, you'll find all the + layers you can think of. It defines its own hierarchical Location.Rack, incompatible with + the flat one extensions/rack defines, so load one or the other, not both. name: Location Extended experimental/modules_linecards: dependencies: @@ -199,13 +202,22 @@ extensions/lag: extensions/location_minimal: dependencies: - base - description: - This schema extension is minimal but will provide you with basic items - to store location related data. + exclusive_with: + - extensions/location_site + description: >- + This schema extension is minimal but will provide you with basic items to store location + related data, as a Region -> Country -> Site hierarchy. It defines the same Location.Site + node as extensions/location_site, so load one or the other, not both. Note that + LocationGeneric.name is unique across every location kind, so a name used at one tier + cannot be reused at another; a single-country deployment therefore enters the hierarchy at + Country (with Region as the national node) rather than duplicating a country under several + regions. name: Location Minimal extensions/location_site: dependencies: - base + exclusive_with: + - extensions/location_minimal description: >- This schema extension introduces a standalone Location.Site node (with facility, physical address, timezone, and status). It defines the same Site node as @@ -273,13 +285,16 @@ extensions/rack: dependencies: - base - extensions/location_site + exclusive_with: + - experimental/location_extended description: >- This schema extension introduces a Rack model representing a physical equipment rack installed at a site. Racks can be placed at a LocationSite and can host devices and other equipment. LocationRack needs a Location.Site: extensions/location_site is declared above as the smallest provider, but extensions/location_minimal provides the same node as part of its hierarchy and satisfies the rack equally, load whichever - suits, never both. + suits, never both. LocationRack is also defined, hierarchically and incompatibly, by + experimental/location_extended, so load one or the other, not both. name: Rack extensions/qinq: dependencies: diff --git a/experimental/location_extended/location_extended.yml b/experimental/location_extended/location_extended.yml index 20a2278..318214b 100644 --- a/experimental/location_extended/location_extended.yml +++ b/experimental/location_extended/location_extended.yml @@ -7,6 +7,7 @@ --- version: "1.0" +# Defines Location.Rack. Mutually exclusive with extensions/rack, load one, not both. nodes: # -------------------- Locations -------------------- - name: Continent diff --git a/extensions/location_minimal/README.md b/extensions/location_minimal/README.md index 428e0ee..af0126d 100644 --- a/extensions/location_minimal/README.md +++ b/extensions/location_minimal/README.md @@ -1,3 +1,5 @@ # location_minimal Please refer to the [reference page](https://docs.infrahub.app/schema-library/reference/location_minimal) for the corresponding documentation. + +This extension defines `Location.Site`, the same node as `extensions/location_site`. Load one or the other, never both. diff --git a/extensions/location_minimal/location_minimal.yml b/extensions/location_minimal/location_minimal.yml index ad2b547..c7a8677 100644 --- a/extensions/location_minimal/location_minimal.yml +++ b/extensions/location_minimal/location_minimal.yml @@ -7,6 +7,7 @@ # --------------------------------------------------------------------------- version: "1.0" +# Defines Location.Site. Mutually exclusive with extensions/location_site, load one, not both. nodes: - name: Region namespace: Location diff --git a/extensions/location_site/README.md b/extensions/location_site/README.md index 437e14e..822016c 100644 --- a/extensions/location_site/README.md +++ b/extensions/location_site/README.md @@ -1,3 +1,5 @@ # location_site Please refer to the [reference page](https://docs.infrahub.app/schema-library/reference/location_site) for the corresponding documentation. + +This extension defines `Location.Site`, the same node as `extensions/location_minimal`. Load one or the other, never both. diff --git a/extensions/location_site/location_site.yml b/extensions/location_site/location_site.yml index 0b13254..94311ac 100644 --- a/extensions/location_site/location_site.yml +++ b/extensions/location_site/location_site.yml @@ -7,6 +7,7 @@ # --------------------------------------------------------------------------- version: "1.0" +# Defines Location.Site. Mutually exclusive with extensions/location_minimal, load one, not both. nodes: - name: Site namespace: Location diff --git a/extensions/rack/README.md b/extensions/rack/README.md index f67fd70..41ec016 100644 --- a/extensions/rack/README.md +++ b/extensions/rack/README.md @@ -1,3 +1,5 @@ # rack Please refer to the [reference page](https://docs.infrahub.app/schema-library/reference/rack) for the corresponding documentation. + +`LocationSite` comes from either `extensions/location_minimal` or `extensions/location_site`. `LocationRack` is also defined, hierarchically and incompatibly, by `experimental/location_extended`, so load one or the other, never both. diff --git a/extensions/rack/rack.yml b/extensions/rack/rack.yml index 2f70cfc..7339631 100644 --- a/extensions/rack/rack.yml +++ b/extensions/rack/rack.yml @@ -7,6 +7,7 @@ # --------------------------------------------------------------------------- version: "1.0" +# Defines Location.Rack. Mutually exclusive with experimental/location_extended, load one, not both. nodes: - name: Rack namespace: Location diff --git a/tasks/schemas.py b/tasks/schemas.py index 27f18cb..f03e9be 100644 --- a/tasks/schemas.py +++ b/tasks/schemas.py @@ -75,6 +75,39 @@ def _resolve_load_order(graph, all_extensions): return load_order +# Drop the extensions we must not load: the experimental ones unless the flag is set, +# and one member of every `exclusive_with` pair (two extensions defining the same kind). +# A member is only skipped once its partner is selected, so the partner is always loaded +# first and anything depending on the skipped member is satisfied by the partner instead. +def _select_extensions(metadata, load_order): + selected = [] # Extensions we keep, in load order + for extension in load_order: + # If it's experimental extension and flag is false we skip + if extension.startswith("experimental/") and not TEST_EXPERIMENTAL: + continue + + # An experimental extension always yields to the extension it collides with, + # even when the load order puts the experimental one first + blocking = [ + other + for other in metadata.get(extension, {}).get("exclusive_with") or [] + if other in selected + or ( + extension.startswith("experimental/") + and not other.startswith("experimental/") + ) + ] + if blocking: + print( + f"⏭ Skipping `{extension}`: mutually exclusive with {', '.join(blocking)}" + ) + continue + + selected.append(extension) + + return selected + + @task def load_all_schemas(context: Context) -> None: # Parse metadata file @@ -87,11 +120,7 @@ def load_all_schemas(context: Context) -> None: load_order = _resolve_load_order(graph, all_extensions) # Load each extension respecting dependencies - for extension in load_order: - # If it's experimental extension and flag is false we skip - if extension.startswith("experimental/") and not TEST_EXPERIMENTAL: - continue - + for extension in _select_extensions(metadata, load_order): _load_extension(context, Path(extension)) print("All good! ✨") From 487b8763acc13279177fd33e472526e0d991ad0b Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:31:05 +0200 Subject: [PATCH 38/68] fix(tasks): derive demo schema load order from .metadata.yml Packets: STRUCT-13 Checklist: CC-1 CC-1 makes .metadata.yml the normative dependency graph, and this task hard-codes a second, hand-ordered copy of it that already contradicts it: extensions/circuit sat six positions before its own declared dependency extensions/location_minimal, and only survived because circuit.yml happens to reference no location kind. Route the list through the resolver the file already contains and drop the TEMPORARY marker; the [DEMO] docstring says what the task is. Order produced: base, aggregate, cable, circuit, compute, lag, location_minimal, vlan, vrf, cluster, rack, qinq, hosting_cluster. Every declared edge respected, and the closure of the 13 entries adds nothing. Co-Authored-By: Claude Fable 5 --- tasks/schemas.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/tasks/schemas.py b/tasks/schemas.py index f03e9be..7d2ae07 100644 --- a/tasks/schemas.py +++ b/tasks/schemas.py @@ -126,11 +126,10 @@ def load_all_schemas(context: Context) -> None: print("All good! ✨") -# TEMPORARY DEMO TASK - load IPAM + DCIM @task def load_demo_ipam_dcim(context: Context) -> None: """[DEMO] Load IPAM + DCIM base schemas and a handful of common extensions.""" - schemas_to_load = [ + schemas_to_load = { "base", "extensions/aggregate", "extensions/cable", @@ -144,6 +143,11 @@ def load_demo_ipam_dcim(context: Context) -> None: "extensions/qinq", "extensions/rack", "extensions/vrf", - ] - for path in schemas_to_load: + } + + # `.metadata.yml` is the normative dependency graph, so the demo order comes from it + metadata = _load_yaml_metadata() + load_order = _resolve_load_order(*_build_dependency_graph(metadata)) + + for path in (p for p in load_order if p in schemas_to_load): _load_extension(context, Path(path)) From 351f6555e34c6401e36dfce137c0c29fa697d3e0 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:39:56 +0200 Subject: [PATCH 39/68] fix: correct stale and copy-pasted descriptions and comments CC-8 (descriptions and documentation): stale or copy-pasted text is a defect, and every node and generic carries a description. - PIM interface no longer described as an OSPF interface (routing_pim/pim.yml) - RoutingAggregateRoute.destination no longer called a static route - "A routing policiers for X" corrected in the four routing_policies_* files - IXP-level import/export policies and BGP communities described at IXP scope, not session scope (peering_ixp) - "Fully operational and currently in connected" fixed in cable, cross_connect - "Type of WDM (e.g CWDM. DWDM)" fixed three times in dwdm - "Redifine" fixed in lag - DcimModuleBay.device comment now states the real peer, DcimPhysicalDevice - DcimPhysicalDevice.name comment explains why the attribute is duplicated - DcimConnector description records the cost of kind Attribute on many - vrrp.yml computed-name note points at IpamCVLAN.name instead of the old group + ip field names - bucket (b) markers reworded as guidance: base/dcim.yml sub-interface hint, vrf.yml namespace block, the four "TODO: extend if need" markers - IpamPrefixScope drops VRF from its example scopes and gains a label; IpamVLANGroupScope drops Rack - IpamVRF.enforce_unique documented as declarative intent - DcimCircuitEndpoint description no longer points at the removed meet_me_room - grammar on IpamVLAN, IpamVRF, OrganizationGeneric, LocationGeneric - .metadata.yml: firewall_policer copy-paste, qinq and snmp stale text - 13 missing node and generic descriptions added (dwdm x3, lag, mlag, location_minimal x3, location_site, patch_panel x3, vlan) - em dash removed from line 5 of the disclaimer header in all 56 schema files - orphan docs/docs/reference/modules.mdx deleted (STRUCT-04) 58 files. Co-Authored-By: Claude Fable 5 --- .metadata.yml | 13 +- base/dcim.yml | 16 +- base/ipam.yml | 7 +- base/location.yml | 4 +- base/organization.yml | 4 +- docs/docs/reference/modules.mdx | 206 ------------------ experimental/azure/azure.yml | 2 +- .../circuit_service/circuit_service.yml | 2 +- .../firewall_policer/firewall_policer.yml | 2 +- experimental/infiniband/infiniband.yml | 2 +- .../location_extended/location_extended.yml | 2 +- experimental/modules_linecards/linecard.yml | 2 +- .../modules_routing_engine/routing_engine.yml | 2 +- .../optical_transport/optical_transport.yml | 2 +- experimental/qos/qos.yml | 2 +- experimental/security/security.yml | 2 +- experimental/topology/topology.yml | 2 +- .../vlan-translation/vlan-translation.yml | 2 +- extensions/aggregate/aggregate.yml | 2 +- extensions/cable/cable.yml | 4 +- extensions/circuit/circuit.yml | 7 +- .../circuit_contract/circuit_contract.yml | 2 +- extensions/cluster/cluster.yml | 2 +- extensions/compute/compute.yml | 2 +- extensions/cross_connect/cross_connect.yml | 4 +- extensions/device_module/device_module.yml | 6 +- .../device_psu_module/device_psu_module.yml | 2 +- extensions/dwdm/dwdm.yml | 11 +- .../hosting_cluster/hosting_cluster.yml | 2 +- .../interface_breakout/interface_breakout.yml | 2 +- extensions/lag/lag.yml | 5 +- .../location_minimal/location_minimal.yml | 5 +- extensions/location_site/location_site.yml | 3 +- extensions/mlag/mlag.yml | 3 +- extensions/patch_panel/patch_panel.yml | 5 +- extensions/peering_ixp/peering_ixp.yml | 8 +- extensions/physical_disk/physical_disk.yml | 2 +- extensions/qinq/qinq.yml | 2 +- extensions/rack/rack.yml | 2 +- extensions/routing/routing.yml | 2 +- extensions/routing_aggregate/aggregate.yml | 4 +- extensions/routing_bgp/bgp.yml | 2 +- .../routing_bgp_community/bgp_community.yml | 2 +- extensions/routing_bgp_rr/bgp_rr.yml | 2 +- extensions/routing_ospf/ospf.yml | 2 +- extensions/routing_pim/pim.yml | 4 +- .../routing_policies/routing_policies.yml | 2 +- .../routing_policies_aggregate.yml | 6 +- .../routing_policies_bgp.yml | 6 +- .../routing_policies_ospf.yml | 6 +- .../routing_policies_pim.yml | 6 +- extensions/sfp/sfp.yml | 2 +- extensions/snmp/snmp.yml | 2 +- extensions/tenancy/tenancy.yml | 2 +- extensions/users/users.yml | 2 +- extensions/vlan/vlan.yml | 5 +- extensions/vrf/vrf.yml | 10 +- extensions/vrrp/vrrp.yml | 4 +- 58 files changed, 124 insertions(+), 302 deletions(-) delete mode 100644 docs/docs/reference/modules.mdx diff --git a/.metadata.yml b/.metadata.yml index 1485e7d..daed45a 100644 --- a/.metadata.yml +++ b/.metadata.yml @@ -170,8 +170,9 @@ experimental/firewall_policer: dependencies: - base description: - This schema extension contains models for VMs. You might consider Cluster - or/and Hypervisor extension to go with! + This schema extension contains models for traffic policers and the classes + and rules that reference them, so you can describe rate limiting alongside + the interfaces it is applied to. name: Firewall Policer extensions/hosting_cluster: dependencies: @@ -301,8 +302,8 @@ extensions/qinq: - base - extensions/vlan description: - This schema extension brings extensions to VLAN model in order to support - QinQ. + This schema extension adds the Service VLAN and Customer VLAN nodes needed + to model QinQ on top of the VLAN extension. name: QinQ extensions/routing: dependencies: @@ -417,8 +418,8 @@ extensions/snmp: - base description: This schema extension contains models for SNMP Communities and SNMP - Clients. As you can see this extension is not linked to Tenancy or Device, as - you could decide to link the Community to different models based on your use case. + Clients. A community links to the devices it is configured on; any further + wiring, to a tenant for instance, is left to you. name: SNMP extensions/tenancy: dependencies: diff --git a/base/dcim.yml b/base/dcim.yml index fd543cc..81c164c 100644 --- a/base/dcim.yml +++ b/base/dcim.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" @@ -61,7 +61,11 @@ generics: description: Generic holding attributes and relationships relevant for physical device. include_in_menu: false attributes: - - name: name # Here for computed attribute + # Duplicated from DcimGenericDevice because generics cannot inherit generics. + # DcimModuleBay.computed_name (extensions/device_module) renders + # {{ device__name__value }} against peer DcimPhysicalDevice, so name must resolve here. + # allow_override lets DcimPatchPanel and DcimOpticalMultiplexer restate it. + - name: name kind: Text unique: true allow_override: any @@ -118,7 +122,10 @@ generics: order_weight: 1500 - name: Connector namespace: Dcim - description: Generic Connector to link two endpoints together. + description: >- + Generic Connector to link two endpoints together. The endpoints are kind Attribute so both + ends render inline on the connector form; a high-fan-out connector kind should override the + relationship back to Generic. include_in_menu: false relationships: - name: connected_endpoints @@ -460,7 +467,8 @@ nodes: - DcimInterface - InterfaceLayer2 - InterfaceLayer3 - # - InterfaceHasSubInterface # Depending if you want your virtual interfaces to have sub interface + # Uncomment if your virtual interfaces should be able to carry sub-interfaces. + # - InterfaceHasSubInterface relationships: - name: parent_interface peer: InterfaceHasSubInterface diff --git a/base/ipam.yml b/base/ipam.yml index a15fb11..9f3a4f2 100644 --- a/base/ipam.yml +++ b/base/ipam.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" @@ -14,13 +14,14 @@ generics: - name: VLANGroupScope namespace: Ipam label: VLAN Group Scope - description: Mixin for objects that can scope a VLAN group (e.g. Region, Site, Rack). The + description: Mixin for objects that can scope a VLAN group (e.g. Region, Site). The reverse relationship is added by extensions/vlan. include_in_menu: false - name: PrefixScope namespace: Ipam - description: Mixin for objects that can scope IP prefixes (e.g. Region, Site, VRF). + label: Prefix Scope + description: Mixin for objects that can scope IP prefixes (e.g. Region, Site). include_in_menu: false relationships: - name: prefixes diff --git a/base/location.yml b/base/location.yml index d21ab6e..478ae47 100644 --- a/base/location.yml +++ b/base/location.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" @@ -10,7 +10,7 @@ version: "1.0" generics: - name: Generic namespace: Location - description: Generic Location, could be a country, city ... + description: A location in the estate, such as a region, a country or a site. label: Location icon: mingcute:location-line include_in_menu: true diff --git a/base/organization.yml b/base/organization.yml index 20e4ab6..26d2590 100644 --- a/base/organization.yml +++ b/base/organization.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" @@ -10,7 +10,7 @@ version: "1.0" generics: - name: Generic namespace: Organization - description: An organization represent a legal entity, a company. + description: An organization represents a legal entity, such as a company. label: Organization icon: mdi:domain include_in_menu: true diff --git a/docs/docs/reference/modules.mdx b/docs/docs/reference/modules.mdx deleted file mode 100644 index 615d48d..0000000 --- a/docs/docs/reference/modules.mdx +++ /dev/null @@ -1,206 +0,0 @@ ---- -title: Modules ---- - -This schema extension allows you to capture Device Modules related information like the serial number or the status. You can insert the Module into a Dcim Physical Device. - -NOTE: This extension doesn't contain any Nodes, you can use the extension module_linecards or modules_routing_engine to use it - -## Details - -- **Dependencies:** - - [base](dcim) - -## Generics - -### GenericModule - -- **Label:** Module -- **Description:** A generic module, such as a Linecard or Routing Engine, installed in a device. -- **Namespace:** Device -- **Icon:** mdi:expansion-card -- **Human Friendly ID:** serial_number__value - -#### Attributes - -| name | description | kind | optional | default_value | choices | -| ---- | ----------- | ---- | -------- | ------------- | ------- | -| serial_number | Unique serial number of the module. | Text | | | | -| description | | Text | True | | | -| status | | Dropdown | | active | provisioning, active, maintenance, disabled, outage | - -#### Relationships - -| name | peer | optional | cardinality | kind | -| ---- | ---- | -------- | ----------- | ---- | -| module_type | DeviceGenericModuleType | False | one | Attribute | -| device | DcimPhysicalDevice | True | one | Attribute | - -### GenericModuleType - -- **Label:** Module Type -- **Description:** A generic module type, with common specifications like part number and manufacturer. -- **Namespace:** Device -- **Icon:** mdi:database-cog -- **Uniqueness Constraints:** - - name__value, manufacturer -- **Human Friendly ID:** name__value - -#### Attributes - -| name | description | kind | optional | default_value | choices | -| ---- | ----------- | ---- | -------- | ------------- | ------- | -| name | Name of the module type. | Text | | | | -| description | Description of the module type. | Text | True | | | -| part_number | Part number of the module. | Text | True | | | - -#### Relationships - -| name | peer | optional | cardinality | kind | -| ---- | ---- | -------- | ----------- | ---- | -| manufacturer | OrganizationManufacturer | False | one | Attribute | -| tags | BuiltinTag | True | many | Attribute | - -## Extensions - -:::note - -In this context "extensions" refer to modifications or additions to the existing schema, such as adding new attributes, relationships, or other schema elements. - -::: - -### DcimPhysicalDevice - -#### Relationships - -| name | peer | optional | cardinality | kind | -| ---- | ---- | -------- | ----------- | ---- | -| modules | DeviceGenericModule | | many | Component | - -## Code - -```yaml -version: '1.0' -generics: -- name: GenericModule - namespace: Device - description: A generic module, such as a Linecard or Routing Engine, installed in - a device. - label: Module - icon: mdi:expansion-card - human_friendly_id: - - serial_number__value - display_label: serial_number__value - order_by: - - serial_number__value - attributes: - - name: serial_number - kind: Text - unique: true - description: Unique serial number of the module. - order_weight: 1000 - - name: description - kind: Text - optional: true - order_weight: 1100 - - name: status - kind: Dropdown - choices: - - name: provisioning - label: Provisioning - description: Linecard is being provisioned. - color: '#A9DFBF' - - name: active - label: Active - description: Linecard is active and operational. - color: '#A9CCE3' - - name: maintenance - label: Maintenance - description: Linecard is under maintenance. - color: '#FFF2CC' - - name: disabled - label: Disabled - description: Linecard has been disabled. - color: '#D3D3D3' - - name: outage - label: Outage - description: Linecard is currently experiencing an outage. - color: '#F4CCCC' - default_value: active - order_weight: 1300 - relationships: - - name: module_type - peer: DeviceGenericModuleType - optional: false - cardinality: one - kind: Attribute - order_weight: 1150 - - name: device - label: Device - peer: DcimPhysicalDevice - identifier: device__modules - optional: true - cardinality: one - kind: Attribute - order_weight: 1000 -- name: GenericModuleType - namespace: Device - description: A generic module type, with common specifications like part number - and manufacturer. - label: Module Type - icon: mdi:database-cog - menu_placement: DeviceGenericModule - display_label: name__value - uniqueness_constraints: - - - name__value - - manufacturer - human_friendly_id: - - name__value - order_by: - - manufacturer__name__value - - name__value - attributes: - - name: name - kind: Text - unique: true - description: Name of the module type. - order_weight: 1000 - - name: description - kind: Text - optional: true - description: Description of the module type. - order_weight: 1100 - - name: part_number - label: Part Number - kind: Text - optional: true - unique: true - description: Part number of the module. - order_weight: 1200 - relationships: - - name: manufacturer - peer: OrganizationManufacturer - identifier: manufacturer__moduletype - cardinality: one - optional: false - kind: Attribute - description: Manufacturer of the module type. - order_weight: 1250 - - name: tags - peer: BuiltinTag - optional: true - cardinality: many - kind: Attribute - description: Tags associated with the module type. - order_weight: 3000 -extensions: - nodes: - - kind: DcimPhysicalDevice - relationships: - - name: modules - peer: DeviceGenericModule - identifier: device__modules - cardinality: many - kind: Component - -``` \ No newline at end of file diff --git a/experimental/azure/azure.yml b/experimental/azure/azure.yml index 6b7fe33..f52ca42 100644 --- a/experimental/azure/azure.yml +++ b/experimental/azure/azure.yml @@ -1,7 +1,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- --- diff --git a/experimental/circuit_service/circuit_service.yml b/experimental/circuit_service/circuit_service.yml index 742973b..4f16c59 100644 --- a/experimental/circuit_service/circuit_service.yml +++ b/experimental/circuit_service/circuit_service.yml @@ -1,7 +1,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- --- diff --git a/experimental/firewall_policer/firewall_policer.yml b/experimental/firewall_policer/firewall_policer.yml index 730d1a7..d330a39 100644 --- a/experimental/firewall_policer/firewall_policer.yml +++ b/experimental/firewall_policer/firewall_policer.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" diff --git a/experimental/infiniband/infiniband.yml b/experimental/infiniband/infiniband.yml index aa180b9..300e948 100644 --- a/experimental/infiniband/infiniband.yml +++ b/experimental/infiniband/infiniband.yml @@ -1,7 +1,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- --- diff --git a/experimental/location_extended/location_extended.yml b/experimental/location_extended/location_extended.yml index 318214b..fe010d9 100644 --- a/experimental/location_extended/location_extended.yml +++ b/experimental/location_extended/location_extended.yml @@ -1,7 +1,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- --- diff --git a/experimental/modules_linecards/linecard.yml b/experimental/modules_linecards/linecard.yml index 281509f..dfa4ce0 100644 --- a/experimental/modules_linecards/linecard.yml +++ b/experimental/modules_linecards/linecard.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- diff --git a/experimental/modules_routing_engine/routing_engine.yml b/experimental/modules_routing_engine/routing_engine.yml index 48fb826..4d93dd8 100644 --- a/experimental/modules_routing_engine/routing_engine.yml +++ b/experimental/modules_routing_engine/routing_engine.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" diff --git a/experimental/optical_transport/optical_transport.yml b/experimental/optical_transport/optical_transport.yml index acc989f..0ecb9e6 100644 --- a/experimental/optical_transport/optical_transport.yml +++ b/experimental/optical_transport/optical_transport.yml @@ -1,7 +1,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- --- diff --git a/experimental/qos/qos.yml b/experimental/qos/qos.yml index 823f06b..120651e 100644 --- a/experimental/qos/qos.yml +++ b/experimental/qos/qos.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" diff --git a/experimental/security/security.yml b/experimental/security/security.yml index e6178b7..a727c25 100644 --- a/experimental/security/security.yml +++ b/experimental/security/security.yml @@ -1,7 +1,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- --- diff --git a/experimental/topology/topology.yml b/experimental/topology/topology.yml index 7201bf1..54bedfb 100644 --- a/experimental/topology/topology.yml +++ b/experimental/topology/topology.yml @@ -1,7 +1,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- --- diff --git a/experimental/vlan-translation/vlan-translation.yml b/experimental/vlan-translation/vlan-translation.yml index 9666425..ee4cb43 100644 --- a/experimental/vlan-translation/vlan-translation.yml +++ b/experimental/vlan-translation/vlan-translation.yml @@ -1,7 +1,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- --- diff --git a/extensions/aggregate/aggregate.yml b/extensions/aggregate/aggregate.yml index c448e10..fdf924f 100644 --- a/extensions/aggregate/aggregate.yml +++ b/extensions/aggregate/aggregate.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" diff --git a/extensions/cable/cable.yml b/extensions/cable/cable.yml index 965cb58..d146509 100644 --- a/extensions/cable/cable.yml +++ b/extensions/cable/cable.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" @@ -28,7 +28,7 @@ nodes: choices: - name: connected label: Connected - description: Fully operational and currently in connected + description: Fully operational and currently connected color: "#00d25b" - name: planned label: Planned diff --git a/extensions/circuit/circuit.yml b/extensions/circuit/circuit.yml index 99aca00..e735fb0 100644 --- a/extensions/circuit/circuit.yml +++ b/extensions/circuit/circuit.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" @@ -93,7 +93,10 @@ nodes: - name: CircuitEndpoint namespace: Dcim - description: A circuit endpoint, could be a position in a MMR... + description: >- + One of the two terminations (A or Z) of a circuit, at the location where the provider hands + the circuit off. Use the description field for the provider-side reference (patch panel + position, cross-connect ID). label: Circuit Endpoint icon: mdi:ethernet menu_placement: DcimCircuit diff --git a/extensions/circuit_contract/circuit_contract.yml b/extensions/circuit_contract/circuit_contract.yml index e7df138..adecb0c 100644 --- a/extensions/circuit_contract/circuit_contract.yml +++ b/extensions/circuit_contract/circuit_contract.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" diff --git a/extensions/cluster/cluster.yml b/extensions/cluster/cluster.yml index ca9d5e5..69feb9f 100644 --- a/extensions/cluster/cluster.yml +++ b/extensions/cluster/cluster.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" diff --git a/extensions/compute/compute.yml b/extensions/compute/compute.yml index 838e810..0bf1796 100644 --- a/extensions/compute/compute.yml +++ b/extensions/compute/compute.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" diff --git a/extensions/cross_connect/cross_connect.yml b/extensions/cross_connect/cross_connect.yml index 05ff8ce..a6fac97 100644 --- a/extensions/cross_connect/cross_connect.yml +++ b/extensions/cross_connect/cross_connect.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" @@ -37,7 +37,7 @@ nodes: choices: - name: connected label: Connected - description: "Fully operational and currently in connected" + description: "Fully operational and currently connected" color: "#00d25b" - name: planned label: Planned diff --git a/extensions/device_module/device_module.yml b/extensions/device_module/device_module.yml index a6aba34..0c70288 100644 --- a/extensions/device_module/device_module.yml +++ b/extensions/device_module/device_module.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- @@ -158,8 +158,8 @@ nodes: - name: device peer: DcimPhysicalDevice label: Device - # DcimGenericDevice (not DcimPhysicalDevice) so `name` is resolvable in computed_name above - - # PhysicalDevice itself carries no identifying attribute. + # Peer is DcimPhysicalDevice; base/dcim.yml adds `name` to that generic so + # `device__name__value` resolves in computed_name above. kind: Parent cardinality: one optional: false diff --git a/extensions/device_psu_module/device_psu_module.yml b/extensions/device_psu_module/device_psu_module.yml index a4caf10..28b5d22 100644 --- a/extensions/device_psu_module/device_psu_module.yml +++ b/extensions/device_psu_module/device_psu_module.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- diff --git a/extensions/dwdm/dwdm.yml b/extensions/dwdm/dwdm.yml index 4dfdd26..440ffc0 100644 --- a/extensions/dwdm/dwdm.yml +++ b/extensions/dwdm/dwdm.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" @@ -10,6 +10,7 @@ version: "1.0" generics: - name: GenericOadmInterface namespace: Dcim + description: Generic interface of an optical add-drop multiplexer, front or rear. label: Optical Multiplexer Interfaces icon: mdi:ethernet menu_placement: DcimOpticalMultiplexer @@ -146,7 +147,7 @@ nodes: description: Supports dense wavelengths and amplification for long-distance communication. color: "#9933cc" optional: false - description: Type of WDM (e.g CWDM. DWDM) + description: Type of WDM technology (e.g. CWDM, DWDM) order_weight: 1100 - name: description kind: Text @@ -168,6 +169,7 @@ nodes: - name: OadmFrontInterface namespace: Dcim + description: Client-side interface of an optical add-drop multiplexer, carrying a single channel. label: Optical Multiplexer Front Interfaces menu_placement: DcimGenericOadmInterface inherit_from: @@ -200,6 +202,7 @@ nodes: - name: OadmRearInterface namespace: Dcim + description: Line-side interface of an optical add-drop multiplexer, carrying the multiplexed signal. label: Optical Multiplexer Rear Interfaces menu_placement: DcimGenericOadmInterface inherit_from: @@ -259,7 +262,7 @@ nodes: description: Supports dense wavelengths and amplification for long-distance communication. color: "#9933cc" optional: false - description: Type of WDM (e.g CWDM. DWDM) + description: Type of WDM technology (e.g. CWDM, DWDM) order_weight: 1100 - name: wavelength kind: Text # Text until float possible in Number Kind @@ -294,7 +297,7 @@ nodes: description: Supports dense wavelengths and amplification for long-distance communication. color: "#9933cc" optional: false - description: Type of WDM (e.g CWDM. DWDM) + description: Type of WDM technology (e.g. CWDM, DWDM) order_weight: 1100 relationships: - name: wdm_channel diff --git a/extensions/hosting_cluster/hosting_cluster.yml b/extensions/hosting_cluster/hosting_cluster.yml index 039bba9..6bdd5c6 100644 --- a/extensions/hosting_cluster/hosting_cluster.yml +++ b/extensions/hosting_cluster/hosting_cluster.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" diff --git a/extensions/interface_breakout/interface_breakout.yml b/extensions/interface_breakout/interface_breakout.yml index f48aa8e..0ed702b 100644 --- a/extensions/interface_breakout/interface_breakout.yml +++ b/extensions/interface_breakout/interface_breakout.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" diff --git a/extensions/lag/lag.yml b/extensions/lag/lag.yml index cfc55e2..30187f3 100644 --- a/extensions/lag/lag.yml +++ b/extensions/lag/lag.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" @@ -10,6 +10,7 @@ version: "1.0" generics: - name: InterfaceBundle namespace: Generic + description: Generic holding the members of an interface bundle such as a LAG. label: Generic Interface Bundle include_in_menu: false attributes: @@ -74,7 +75,7 @@ nodes: description: "LACP mode for the aggregated interface" order_weight: 1750 relationships: - # Redifine the relationship here to add common_parent constraint + # Redefine the relationship here to add the common_parent constraint - name: bundle_members peer: InterfacePhysical label: "Member(s)" diff --git a/extensions/location_minimal/location_minimal.yml b/extensions/location_minimal/location_minimal.yml index c7a8677..f214be2 100644 --- a/extensions/location_minimal/location_minimal.yml +++ b/extensions/location_minimal/location_minimal.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" @@ -11,6 +11,7 @@ version: "1.0" nodes: - name: Region namespace: Location + description: A geographical region grouping countries and sites. label: Region icon: carbon:cics-region-target menu_placement: LocationGeneric @@ -22,6 +23,7 @@ nodes: - name: Country namespace: Location + description: A country, sitting between a region and the sites it contains. label: Country icon: gis:search-country menu_placement: LocationGeneric @@ -32,6 +34,7 @@ nodes: - name: Site namespace: Location + description: A physical location hosting equipment, such as a data center or an office. label: Site icon: ri:building-line menu_placement: LocationGeneric diff --git a/extensions/location_site/location_site.yml b/extensions/location_site/location_site.yml index 94311ac..59c851d 100644 --- a/extensions/location_site/location_site.yml +++ b/extensions/location_site/location_site.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" @@ -11,6 +11,7 @@ version: "1.0" nodes: - name: Site namespace: Location + description: A physical location hosting equipment, such as a data center or an office. label: Site icon: ri:building-line menu_placement: LocationGeneric diff --git a/extensions/mlag/mlag.yml b/extensions/mlag/mlag.yml index 397b922..f5daada 100644 --- a/extensions/mlag/mlag.yml +++ b/extensions/mlag/mlag.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" @@ -15,6 +15,7 @@ generics: # and add the necessary relationships/attributes to it following MlagDomain node example below - name: MlagDomain namespace: Generic + description: Generic holding the peer links and interfaces shared by the members of an MLAG domain. label: MLAG Domain include_in_menu: false human_friendly_id: diff --git a/extensions/patch_panel/patch_panel.yml b/extensions/patch_panel/patch_panel.yml index 1304da5..bbe477a 100644 --- a/extensions/patch_panel/patch_panel.yml +++ b/extensions/patch_panel/patch_panel.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" @@ -10,6 +10,7 @@ version: "1.0" generics: - name: GenericPatchPanelInterface namespace: Dcim + description: Generic interface of a patch panel, front or rear. label: Patch Panel Interfaces icon: mdi:ethernet menu_placement: DcimPatchPanel @@ -156,6 +157,7 @@ nodes: - name: FrontPatchPanelInterface namespace: Dcim + description: Front interface of a patch panel, where equipment is patched in. label: Patch Panel Front Interfaces menu_placement: DcimGenericPatchPanelInterface inherit_from: @@ -188,6 +190,7 @@ nodes: - name: RearPatchPanelInterface namespace: Dcim + description: Rear interface of a patch panel, terminating the permanent cabling. label: Patch Panel Rear Interfaces menu_placement: DcimGenericPatchPanelInterface inherit_from: diff --git a/extensions/peering_ixp/peering_ixp.yml b/extensions/peering_ixp/peering_ixp.yml index 4976acc..29927a9 100644 --- a/extensions/peering_ixp/peering_ixp.yml +++ b/extensions/peering_ixp/peering_ixp.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" @@ -61,7 +61,7 @@ nodes: cardinality: many optional: true identifier: ixp__import_bgppolicies - description: "Import routing policies applied to the session" + description: "Import routing policies applied to every session on this internet exchange point" - name: export_policies peer: RoutingPolicyBGP label: Export Routing Policies @@ -69,14 +69,14 @@ nodes: cardinality: many optional: true identifier: ixp__export_bgppolicies - description: "Export routing policies applied to the session" + description: "Export routing policies applied to every session on this internet exchange point" - name: bgp_communities peer: RoutingBGPCommunity label: "BGP Communities" kind: Generic cardinality: many optional: true - description: "BGP communities associated with the session" + description: "BGP communities associated with this internet exchange point" - name: tags peer: BuiltinTag kind: Attribute diff --git a/extensions/physical_disk/physical_disk.yml b/extensions/physical_disk/physical_disk.yml index 038b383..e39364e 100644 --- a/extensions/physical_disk/physical_disk.yml +++ b/extensions/physical_disk/physical_disk.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" diff --git a/extensions/qinq/qinq.yml b/extensions/qinq/qinq.yml index 3d82388..c710c81 100644 --- a/extensions/qinq/qinq.yml +++ b/extensions/qinq/qinq.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" diff --git a/extensions/rack/rack.yml b/extensions/rack/rack.yml index 7339631..71a2f6e 100644 --- a/extensions/rack/rack.yml +++ b/extensions/rack/rack.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" diff --git a/extensions/routing/routing.yml b/extensions/routing/routing.yml index bf4594e..6b0b4db 100644 --- a/extensions/routing/routing.yml +++ b/extensions/routing/routing.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" diff --git a/extensions/routing_aggregate/aggregate.yml b/extensions/routing_aggregate/aggregate.yml index 629cb3c..3b89a3a 100644 --- a/extensions/routing_aggregate/aggregate.yml +++ b/extensions/routing_aggregate/aggregate.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" @@ -35,5 +35,5 @@ nodes: - name: destination peer: IpamPrefix kind: Attribute - description: "Destination network for the static route." + description: "Destination network aggregated by this route." order_weight: 1200 diff --git a/extensions/routing_bgp/bgp.yml b/extensions/routing_bgp/bgp.yml index ca76fe6..8bcb5d3 100644 --- a/extensions/routing_bgp/bgp.yml +++ b/extensions/routing_bgp/bgp.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" diff --git a/extensions/routing_bgp_community/bgp_community.yml b/extensions/routing_bgp_community/bgp_community.yml index ed6f704..16d0186 100644 --- a/extensions/routing_bgp_community/bgp_community.yml +++ b/extensions/routing_bgp_community/bgp_community.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" diff --git a/extensions/routing_bgp_rr/bgp_rr.yml b/extensions/routing_bgp_rr/bgp_rr.yml index 4ea8c48..e0ad85c 100644 --- a/extensions/routing_bgp_rr/bgp_rr.yml +++ b/extensions/routing_bgp_rr/bgp_rr.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" diff --git a/extensions/routing_ospf/ospf.yml b/extensions/routing_ospf/ospf.yml index 2d8213d..0f2813f 100644 --- a/extensions/routing_ospf/ospf.yml +++ b/extensions/routing_ospf/ospf.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" diff --git a/extensions/routing_pim/pim.yml b/extensions/routing_pim/pim.yml index 9076c6e..0af8aed 100644 --- a/extensions/routing_pim/pim.yml +++ b/extensions/routing_pim/pim.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" @@ -74,7 +74,7 @@ nodes: kind: Text unique: true optional: false - description: "Description of the OSPF interface." + description: "Description of the PIM interface." order_weight: 1100 - name: pim_mode kind: Dropdown diff --git a/extensions/routing_policies/routing_policies.yml b/extensions/routing_policies/routing_policies.yml index 9f5310f..4e2993f 100644 --- a/extensions/routing_policies/routing_policies.yml +++ b/extensions/routing_policies/routing_policies.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" diff --git a/extensions/routing_policies_aggregate/routing_policies_aggregate.yml b/extensions/routing_policies_aggregate/routing_policies_aggregate.yml index 426509f..c2862e7 100644 --- a/extensions/routing_policies_aggregate/routing_policies_aggregate.yml +++ b/extensions/routing_policies_aggregate/routing_policies_aggregate.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" @@ -10,13 +10,13 @@ version: "1.0" nodes: - name: PolicyAggregate namespace: Routing - description: A routing policiers for Aggregate + description: A routing policy for Aggregate. label: Aggregate Routing Policies icon: carbon:deployment-policy include_in_menu: false inherit_from: - "RoutingPolicy" - # TODO: extend if need + # Add attributes here if this policy flavour needs more than the generic RoutingPolicy provides. # Uncommenting this block also requires adding extensions/routing_aggregate back to .metadata.yml. # extensions: # nodes: diff --git a/extensions/routing_policies_bgp/routing_policies_bgp.yml b/extensions/routing_policies_bgp/routing_policies_bgp.yml index 8c550a5..c994b5e 100644 --- a/extensions/routing_policies_bgp/routing_policies_bgp.yml +++ b/extensions/routing_policies_bgp/routing_policies_bgp.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" @@ -10,13 +10,13 @@ version: "1.0" nodes: - name: PolicyBGP namespace: Routing - description: A routing policiers for BGP + description: A routing policy for BGP. label: BGP Routing Policies icon: carbon:deployment-policy include_in_menu: false inherit_from: - "RoutingPolicy" - # TODO: extend if need + # Add attributes here if this policy flavour needs more than the generic RoutingPolicy provides. extensions: nodes: diff --git a/extensions/routing_policies_ospf/routing_policies_ospf.yml b/extensions/routing_policies_ospf/routing_policies_ospf.yml index 0415855..0950d2f 100644 --- a/extensions/routing_policies_ospf/routing_policies_ospf.yml +++ b/extensions/routing_policies_ospf/routing_policies_ospf.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" @@ -10,13 +10,13 @@ version: "1.0" nodes: - name: PolicyOSPF namespace: Routing - description: A routing policiers for OSPF + description: A routing policy for OSPF. label: OSPF Routing Policies icon: carbon:deployment-policy include_in_menu: false inherit_from: - "RoutingPolicy" - # TODO: extend if need + # Add attributes here if this policy flavour needs more than the generic RoutingPolicy provides. extensions: nodes: diff --git a/extensions/routing_policies_pim/routing_policies_pim.yml b/extensions/routing_policies_pim/routing_policies_pim.yml index fab427a..53d614a 100644 --- a/extensions/routing_policies_pim/routing_policies_pim.yml +++ b/extensions/routing_policies_pim/routing_policies_pim.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" @@ -10,13 +10,13 @@ version: "1.0" nodes: - name: PolicyPIM namespace: Routing - description: A routing policiers for PIM + description: A routing policy for PIM. label: PIM Routing Policies icon: carbon:deployment-policy include_in_menu: false inherit_from: - "RoutingPolicy" - # TODO: extend if need + # Add attributes here if this policy flavour needs more than the generic RoutingPolicy provides. extensions: nodes: diff --git a/extensions/sfp/sfp.yml b/extensions/sfp/sfp.yml index 3473484..c5fbf90 100644 --- a/extensions/sfp/sfp.yml +++ b/extensions/sfp/sfp.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" diff --git a/extensions/snmp/snmp.yml b/extensions/snmp/snmp.yml index 709aefc..c2892b2 100644 --- a/extensions/snmp/snmp.yml +++ b/extensions/snmp/snmp.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" diff --git a/extensions/tenancy/tenancy.yml b/extensions/tenancy/tenancy.yml index 49242d8..6c1523a 100644 --- a/extensions/tenancy/tenancy.yml +++ b/extensions/tenancy/tenancy.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" diff --git a/extensions/users/users.yml b/extensions/users/users.yml index 53df453..d8307e9 100644 --- a/extensions/users/users.yml +++ b/extensions/users/users.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" diff --git a/extensions/vlan/vlan.yml b/extensions/vlan/vlan.yml index 00f9f7d..604c60e 100644 --- a/extensions/vlan/vlan.yml +++ b/extensions/vlan/vlan.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" @@ -10,7 +10,7 @@ version: "1.0" generics: - name: GenericVLAN namespace: Ipam - description: A VLAN is isolated layer two domain + description: A VLAN is an isolated layer two domain. label: VLAN icon: mdi:lan-pending human_friendly_id: @@ -89,6 +89,7 @@ generics: nodes: - name: VLAN namespace: Ipam + description: A plain VLAN, with no QinQ role of its own. label: VLAN include_in_menu: false inherit_from: diff --git a/extensions/vrf/vrf.yml b/extensions/vrf/vrf.yml index d3ef4c7..4a1f5af 100644 --- a/extensions/vrf/vrf.yml +++ b/extensions/vrf/vrf.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" @@ -10,7 +10,7 @@ version: "1.0" nodes: - name: VRF namespace: Ipam - description: A VRF is isolated layer three domain + description: A VRF is an isolated layer three domain. label: VRF icon: mdi:router human_friendly_id: @@ -30,6 +30,8 @@ nodes: - name: enforce_unique kind: Boolean label: Enforce Unique + description: Declares the intent that prefixes and addresses be unique within this VRF. + Infrahub does not enforce this; consume it from a check or a generator. default_value: true optional: true order_weight: 1100 @@ -38,8 +40,8 @@ nodes: optional: true order_weight: 1200 relationships: - # TODO: Perhaps add namespace here at some point? - # Perhaps would make sense to have multiple flavors of namespace? + # Uncomment to pin each VRF to its own IP namespace; the library leaves VRFs + # namespace-agnostic by default. # - name: namespace # peer: BuiltinIPNamespace # identifier: vrf__namespace diff --git a/extensions/vrrp/vrrp.yml b/extensions/vrrp/vrrp.yml index 7e4e3f9..a8b09d1 100644 --- a/extensions/vrrp/vrrp.yml +++ b/extensions/vrrp/vrrp.yml @@ -2,7 +2,7 @@ # yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json # --------------------------------------------------------------------------- # This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review — see +# Adapting it for your environment typically requires architectural review, see # docs.infrahub.app, or reach out to OpsMill for help. # --------------------------------------------------------------------------- version: "1.0" @@ -19,7 +19,7 @@ nodes: - name__value display_label: name__value attributes: - # Could become a 'computed field' based on group + ip + # Could become a computed attribute from vrid + ip_addresses, as IpamCVLAN.name does. - name: name kind: Text label: Name From 8e9f4f9921a3efb2f33a7f009d82b8bebeea4987 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:41:35 +0200 Subject: [PATCH 40/68] fix: normalize choice values, labels and status colors CC-5 (dropdown and choice hygiene): choice names are lowercase snake_case, every choice carries a label, and status choices reuse the base palette. - connector_type: 28 UPPERCASE values lowercased in dwdm and patch_panel (URM_P4, URM_P8 and Splice included) - cable_type: mmf-om1..om5, smf-os1/os2, dac-passive, dac-active, mrj21-trunk - cable color: dark-red, dark-purple, light-blue, dark-green, light-green, dark-orange, light-grey, dark-grey - routing_policies policy_type: import-policy, export-policy, import-export-policy - users permissions: read-only - peering_ixp status: pre-maintenance, post-maintenance - snmp security_level: noAuthNoPriv, authNoPriv, authPriv - labels added to the two choice sets that had none: the virtual machine role in compute, permissions in users - status colors aligned to the base palette (#00d25b active): mlag interface, routing protocol, both peering_ixp status sets, physical disk. Non-status colors, including the routing lavender, are untouched. The matching object files are updated in the same commit so the demo data still loads: dwdm, patch_panel, routing_policies_{aggregate,bgp,ospf,pim}, snmp, users. 19 files. Co-Authored-By: Claude Fable 5 --- extensions/cable/cable.yml | 36 ++++++------ extensions/compute/compute.yml | 2 + extensions/dwdm/dwdm.yml | 56 +++++++++---------- extensions/mlag/mlag.yml | 2 +- extensions/patch_panel/patch_panel.yml | 56 +++++++++---------- extensions/peering_ixp/peering_ixp.yml | 8 +-- extensions/physical_disk/physical_disk.yml | 2 +- extensions/routing/routing.yml | 2 +- .../routing_policies/routing_policies.yml | 6 +- extensions/snmp/snmp.yml | 6 +- extensions/users/users.yml | 5 +- objects/extensions/dwdm/dwdm.yml | 10 ++-- .../extensions/patch_panel/patch_panel.yml | 12 ++-- .../routing_policies_aggregate.yml | 8 +-- .../routing_policies_bgp.yml | 6 +- .../routing_policies_ospf.yml | 6 +- .../routing_policies_pim.yml | 8 +-- objects/extensions/snmp/snmp.yml | 6 +- objects/extensions/users/users.yml | 2 +- 19 files changed, 122 insertions(+), 117 deletions(-) diff --git a/extensions/cable/cable.yml b/extensions/cable/cable.yml index d146509..ccaaedf 100644 --- a/extensions/cable/cable.yml +++ b/extensions/cable/cable.yml @@ -73,41 +73,41 @@ nodes: description: "Category 8 twisted pair cable." color: "#99ccff" # Light Blue # Fiber Cables (Multi-mode) - - name: mmf-om1 + - name: mmf_om1 label: Multimode Fiber OM1 description: "Multimode fiber (62.5/125 µm)." color: "#ff9933" # Dark Orange - - name: mmf-om2 + - name: mmf_om2 label: Multimode Fiber OM2 description: "Multimode fiber (50/125 µm)." color: "#ff9933" # Dark Orange - - name: mmf-om3 + - name: mmf_om3 label: Multimode Fiber OM3 description: "Optimized multimode fiber (50/125 µm)." color: "#ff9933" # Dark Orange - - name: mmf-om4 + - name: mmf_om4 label: Multimode Fiber OM4 description: "Enhanced multimode fiber (50/125 µm)." color: "#ff9933" # Dark Orange - - name: mmf-om5 + - name: mmf_om5 label: Multimode Fiber OM5 description: "Wideband multimode fiber (50/125 µm)." color: "#ff9933" # Dark Orange # Fiber Cables (Single-mode) - - name: smf-os1 + - name: smf_os1 label: Singlemode Fiber OS1 description: "Standard singlemode fiber." color: "#ffcc00" # Yellow - - name: smf-os2 + - name: smf_os2 label: Singlemode Fiber OS2 description: "Improved singlemode fiber." color: "#ffcc00" # Yellow # Direct Attach and Active Optical Cables - - name: dac-passive + - name: dac_passive label: Passive DAC description: "Direct Attach Copper (Passive)." color: "#a0a0a0" # Grey - - name: dac-active + - name: dac_active label: Active DAC description: "Direct Attach Copper (Active)." color: "#a0a0a0" # Grey @@ -120,7 +120,7 @@ nodes: label: Coaxial description: "Coaxial cable for broadband." color: "#000000" # Black - - name: mrj21-trunk + - name: mrj21_trunk label: MRJ21 Trunk description: "High-density copper cable." color: "#000000" # Black @@ -137,7 +137,7 @@ nodes: - name: color kind: Dropdown choices: - - name: dark-red + - name: dark_red label: Dark Red color: "#aa1409" - name: red @@ -155,7 +155,7 @@ nodes: - name: purple label: Purple color: "#9c27b0" - - name: dark-purple + - name: dark_purple label: Dark Purple color: "#673ab7" - name: indigo @@ -164,7 +164,7 @@ nodes: - name: blue label: Blue color: "#2196f3" - - name: light-blue + - name: light_blue label: Light Blue color: "#03a9f4" - name: cyan @@ -176,13 +176,13 @@ nodes: - name: aqua label: Aqua color: "#00ffff" - - name: dark-green + - name: dark_green label: Dark Green color: "#2f6a31" - name: green label: Green color: "#4caf50" - - name: light-green + - name: light_green label: Light Green color: "#8bc34a" - name: lime @@ -197,19 +197,19 @@ nodes: - name: orange label: Orange color: "#ff9800" - - name: dark-orange + - name: dark_orange label: Dark Orange color: "#ff5722" - name: brown label: Brown color: "#795548" - - name: light-grey + - name: light_grey label: Light Grey color: "#c0c0c0" - name: grey label: Grey color: "#9e9e9e" - - name: dark-grey + - name: dark_grey label: Dark Grey color: "#607d8b" - name: black diff --git a/extensions/compute/compute.yml b/extensions/compute/compute.yml index 0bf1796..02009f3 100644 --- a/extensions/compute/compute.yml +++ b/extensions/compute/compute.yml @@ -78,8 +78,10 @@ nodes: kind: Dropdown choices: - name: application + label: Application color: "#7f7fff" - name: storage + label: Storage color: "#bf7fbf" optional: true description: Role of the virtual machine. diff --git a/extensions/dwdm/dwdm.yml b/extensions/dwdm/dwdm.yml index 440ffc0..fb1719f 100644 --- a/extensions/dwdm/dwdm.yml +++ b/extensions/dwdm/dwdm.yml @@ -28,88 +28,88 @@ generics: - name: connector_type kind: Dropdown choices: - - name: FC + - name: fc label: FC description: "Standardized fiber optic connector used primarily in datacom and telecom applications." - - name: LC + - name: lc label: LC description: "Compact fiber optic connector with a push-pull mechanism." - - name: LC_PC + - name: lc_pc label: LC/PC description: "Polished LC connector providing physical contact (PC)." - - name: LC_UPC + - name: lc_upc label: LC/UPC description: "Ultra-Physical Contact (UPC) variant of the LC connector with enhanced polish." - - name: LC_APC + - name: lc_apc label: LC/APC description: "Angled Physical Contact (APC) version of the LC connector with a slanted fiber end-face." - - name: LSH + - name: lsh label: LSH description: "European fiber optic connector offering high durability." - - name: LSH_PC + - name: lsh_pc label: LSH/PC description: "Physical Contact version of LSH with standard polish." - - name: LSH_UPC + - name: lsh_upc label: LSH/UPC description: "Ultra-Physical Contact variant of LSH, minimizing return loss with a superior polish." - - name: LSH_APC + - name: lsh_apc label: LSH/APC description: "Angled Physical Contact version of LSH, designed to reduce back reflections." - - name: LX_5 + - name: lx_5 label: LX.5 description: "Miniaturized fiber optic connector similar to LC but with an additional shutter mechanism." - - name: LX_5_PC + - name: lx_5_pc label: LX.5/PC description: "Physical Contact version of LX.5." - - name: LX_5_UPC + - name: lx_5_upc label: LX.5/UPC description: "Ultra-Physical Contact variant of LX.5." - - name: LX_5_APC + - name: lx_5_apc label: LX.5/APC description: "Angled Physical Contact version of LX.5." - - name: MPO + - name: mpo label: MPO description: "Multi-fiber Push-On connector typically used in data centers for high-speed applications." - - name: MTRJ + - name: mtrj label: MTRJ description: "Male-to-female fiber optic connector with two fibers." - - name: SC + - name: sc label: SC description: "Square fiber optic connector with push-pull lock." - - name: SC_PC + - name: sc_pc label: SC/PC description: "Physical Contact SC connector with a polished end-face." - - name: SC_UPC + - name: sc_upc label: SC/UPC description: "Ultra-Physical Contact variant of SC." - - name: SC_APC + - name: sc_apc label: SC/APC description: "Angled Physical Contact version of SC." - - name: ST + - name: st label: ST description: "Bayonet-style fiber optic connector primarily used in industrial and military applications." - - name: CS + - name: cs label: CS description: "Compact connector with a high-density duplex configuration." - - name: SN + - name: sn label: SN description: "Small-form connector with dual fibers." - - name: SMA_905 + - name: sma_905 label: SMA 905 description: "Stainless steel fiber optic connector." - - name: SMA_906 + - name: sma_906 label: SMA 906 description: "Variant of SMA 905 with similar durability, frequently used in high-vibration settings." - - name: URM_P2 + - name: urm_p2 label: URM-P2 description: "Specialized fiber optic connector for industrial and harsh environments." - - name: URM_P4 + - name: urm_p4 label: URM-P4 description: "Similar to URM-P2 but designed for higher performance." - - name: URM_P8 + - name: urm_p8 label: URM-P8 description: "Enhanced version of URM connectors with higher protection." - - name: Splice + - name: splice label: Splice description: "Permanent fiber connection method where two fiber ends are fused." optional: false diff --git a/extensions/mlag/mlag.yml b/extensions/mlag/mlag.yml index f5daada..be4cd36 100644 --- a/extensions/mlag/mlag.yml +++ b/extensions/mlag/mlag.yml @@ -100,7 +100,7 @@ nodes: - name: active label: Active description: "Interface is active and operational." - color: "#A9CCE3" # pastel blue + color: "#00d25b" - name: maintenance label: Maintenance description: "Interface is under maintenance." diff --git a/extensions/patch_panel/patch_panel.yml b/extensions/patch_panel/patch_panel.yml index bbe477a..d410d30 100644 --- a/extensions/patch_panel/patch_panel.yml +++ b/extensions/patch_panel/patch_panel.yml @@ -28,88 +28,88 @@ generics: - name: connector_type kind: Dropdown choices: - - name: FC + - name: fc label: FC description: "Standardized fiber optic connector used primarily in datacom and telecom applications." - - name: LC + - name: lc label: LC description: "Compact fiber optic connector with a push-pull mechanism." - - name: LC_PC + - name: lc_pc label: LC/PC description: "Polished LC connector providing physical contact (PC)." - - name: LC_UPC + - name: lc_upc label: LC/UPC description: "Ultra-Physical Contact (UPC) variant of the LC connector with enhanced polish." - - name: LC_APC + - name: lc_apc label: LC/APC description: "Angled Physical Contact (APC) version of the LC connector with a slanted fiber end-face." - - name: LSH + - name: lsh label: LSH description: "European fiber optic connector offering high durability." - - name: LSH_PC + - name: lsh_pc label: LSH/PC description: "Physical Contact version of LSH with standard polish." - - name: LSH_UPC + - name: lsh_upc label: LSH/UPC description: "Ultra-Physical Contact variant of LSH, minimizing return loss with a superior polish." - - name: LSH_APC + - name: lsh_apc label: LSH/APC description: "Angled Physical Contact version of LSH, designed to reduce back reflections." - - name: LX_5 + - name: lx_5 label: LX.5 description: "Miniaturized fiber optic connector similar to LC but with an additional shutter mechanism." - - name: LX_5_PC + - name: lx_5_pc label: LX.5/PC description: "Physical Contact version of LX.5." - - name: LX_5_UPC + - name: lx_5_upc label: LX.5/UPC description: "Ultra-Physical Contact variant of LX.5." - - name: LX_5_APC + - name: lx_5_apc label: LX.5/APC description: "Angled Physical Contact version of LX.5." - - name: MPO + - name: mpo label: MPO description: "Multi-fiber Push-On connector typically used in data centers for high-speed applications." - - name: MTRJ + - name: mtrj label: MTRJ description: "Male-to-female fiber optic connector with two fibers." - - name: SC + - name: sc label: SC description: "Square fiber optic connector with push-pull lock." - - name: SC_PC + - name: sc_pc label: SC/PC description: "Physical Contact SC connector with a polished end-face." - - name: SC_UPC + - name: sc_upc label: SC/UPC description: "Ultra-Physical Contact variant of SC." - - name: SC_APC + - name: sc_apc label: SC/APC description: "Angled Physical Contact version of SC." - - name: ST + - name: st label: ST description: "Bayonet-style fiber optic connector primarily used in industrial and military applications." - - name: CS + - name: cs label: CS description: "Compact connector with a high-density duplex configuration." - - name: SN + - name: sn label: SN description: "Small-form connector with dual fibers." - - name: SMA_905 + - name: sma_905 label: SMA 905 description: "Stainless steel fiber optic connector." - - name: SMA_906 + - name: sma_906 label: SMA 906 description: "Variant of SMA 905 with similar durability, frequently used in high-vibration settings." - - name: URM_P2 + - name: urm_p2 label: URM-P2 description: "Specialized fiber optic connector for industrial and harsh environments." - - name: URM_P4 + - name: urm_p4 label: URM-P4 description: "Similar to URM-P2 but designed for higher performance." - - name: URM_P8 + - name: urm_p8 label: URM-P8 description: "Enhanced version of URM connectors with higher protection." - - name: Splice + - name: splice label: Splice description: "Permanent fiber connection method where two fiber ends are fused." order_weight: 1100 diff --git a/extensions/peering_ixp/peering_ixp.yml b/extensions/peering_ixp/peering_ixp.yml index 29927a9..1809da4 100644 --- a/extensions/peering_ixp/peering_ixp.yml +++ b/extensions/peering_ixp/peering_ixp.yml @@ -35,7 +35,7 @@ nodes: - name: enabled label: Enabled description: "Internet Exchange is active and operational" - color: "#a8dadc" + color: "#00d25b" - name: disabled label: Disabled description: "Internet Exchange is not operational" @@ -121,8 +121,8 @@ nodes: - name: enabled label: Enabled description: "The system is fully operational and functioning as expected." - color: "#a8dadc" - - name: pre-maintenance + color: "#00d25b" + - name: pre_maintenance label: Pre-Maintenance description: "Preparation stage before performing maintenance tasks." color: "#f4a261" @@ -130,7 +130,7 @@ nodes: label: Maintenance description: "Currently undergoing maintenance tasks." color: "#e9c46a" - - name: post-maintenance + - name: post_maintenance label: Post-Maintenance description: "Final checks and verifications after maintenance tasks." color: "#f0e5de" diff --git a/extensions/physical_disk/physical_disk.yml b/extensions/physical_disk/physical_disk.yml index e39364e..461b344 100644 --- a/extensions/physical_disk/physical_disk.yml +++ b/extensions/physical_disk/physical_disk.yml @@ -74,7 +74,7 @@ nodes: - name: active label: Active description: The disk is currently in use within the infrastructure. - color: "#28a745" + color: "#00d25b" - name: decommissioned label: Decommissioned description: The disk is retired from active use but still stored for potential reuse or auditing. diff --git a/extensions/routing/routing.yml b/extensions/routing/routing.yml index 6b0b4db..9907c7e 100644 --- a/extensions/routing/routing.yml +++ b/extensions/routing/routing.yml @@ -28,7 +28,7 @@ generics: - name: active label: Active description: "Configuration is active and operational." - color: "#A9CCE3" # pastel blue + color: "#00d25b" - name: disabled label: Disabled description: "Configuration has been disabled." diff --git a/extensions/routing_policies/routing_policies.yml b/extensions/routing_policies/routing_policies.yml index 4e2993f..5c3acf3 100644 --- a/extensions/routing_policies/routing_policies.yml +++ b/extensions/routing_policies/routing_policies.yml @@ -34,15 +34,15 @@ generics: kind: Dropdown label: Type choices: - - name: import-policy + - name: import_policy label: Import description: "Policy for incoming routes." color: "#E6E6FA" # lavender - - name: export-policy + - name: export_policy label: Export description: "Policy for outgoing routes." color: "#E6E6FA" # lavender - - name: import-export-policy + - name: import_export_policy label: Import + Export description: "Policy for both incoming and outgoing routes." color: "#E6E6FA" # lavender diff --git a/extensions/snmp/snmp.yml b/extensions/snmp/snmp.yml index c2892b2..a0f1f3b 100644 --- a/extensions/snmp/snmp.yml +++ b/extensions/snmp/snmp.yml @@ -131,13 +131,13 @@ nodes: kind: Dropdown label: Security Level choices: - - name: noAuthNoPriv + - name: no_auth_no_priv label: NoAuthNoPriv description: No authentication and no privacy. - - name: authNoPriv + - name: auth_no_priv label: AuthNoPriv description: Authentication but no privacy. - - name: authPriv + - name: auth_priv label: AuthPriv description: Both authentication and privacy. order_weight: 1200 diff --git a/extensions/users/users.yml b/extensions/users/users.yml index d8307e9..bc6dcd9 100644 --- a/extensions/users/users.yml +++ b/extensions/users/users.yml @@ -35,12 +35,15 @@ nodes: kind: Dropdown choices: - name: admin + label: Admin description: "All rights on device." color: "#E6E6FA" # lavender - name: operator + label: Operator description: "Operator right on configuration." color: "#E6E6FA" # lavender - - name: read-only + - name: read_only + label: Read Only description: "Read only right on configuration." color: "#E6E6FA" # lavender optional: false diff --git a/objects/extensions/dwdm/dwdm.yml b/objects/extensions/dwdm/dwdm.yml index 5ea8373..e990901 100644 --- a/objects/extensions/dwdm/dwdm.yml +++ b/objects/extensions/dwdm/dwdm.yml @@ -59,7 +59,7 @@ spec: kind: DcimOadmFrontInterface data: - name: "CH1" - connector_type: LC + connector_type: lc # `channels` peer (DcimWdmChannel) is a CONCRETE kind whose # human_friendly_id has two components ([wdm_type__value, # channel__value]) and the relationship is cardinality many, so @@ -68,7 +68,7 @@ spec: channels: - [dwdm, "1"] - name: "CH2" - connector_type: LC + connector_type: lc channels: - [dwdm, "2"] # rear_interface is a Component relationship of cardinality one -- @@ -77,7 +77,7 @@ spec: kind: DcimOadmRearInterface data: name: "COM" - connector_type: LC + connector_type: lc - name: NYC1-MUX02 wdm_type: cwdm @@ -93,14 +93,14 @@ spec: kind: DcimOadmFrontInterface data: - name: "CH1" - connector_type: LC + connector_type: lc channels: - [cwdm, "20"] rear_interface: kind: DcimOadmRearInterface data: name: "COM" - connector_type: LC + connector_type: lc --- apiVersion: infrahub.app/v1 diff --git a/objects/extensions/patch_panel/patch_panel.yml b/objects/extensions/patch_panel/patch_panel.yml index 39c6bae..865e730 100644 --- a/objects/extensions/patch_panel/patch_panel.yml +++ b/objects/extensions/patch_panel/patch_panel.yml @@ -30,9 +30,9 @@ spec: kind: DcimRearPatchPanelInterface data: - name: RJ1 - connector_type: LC + connector_type: lc - name: RJ2 - connector_type: LC + connector_type: lc - name: NYC1-PP-02 description: 12-port SC fiber patch panel. @@ -48,7 +48,7 @@ spec: kind: DcimRearPatchPanelInterface data: - name: RJ1 - connector_type: SC + connector_type: sc --- # Front interfaces are created as their own top-level documents (rather than @@ -61,7 +61,7 @@ spec: kind: DcimFrontPatchPanelInterface data: - name: FR1 - connector_type: LC + connector_type: lc # patch_panel peer (DcimPatchPanel) is a CONCRETE kind with a # single-field human_friendly_id (name), so a plain scalar works. patch_panel: NYC1-PP-01 @@ -73,11 +73,11 @@ spec: corresponding_front_rear: [NYC1-PP-01, RJ1] - name: FR2 - connector_type: LC + connector_type: lc patch_panel: NYC1-PP-01 corresponding_front_rear: [NYC1-PP-01, RJ2] - name: FR1 - connector_type: SC + connector_type: sc patch_panel: NYC1-PP-02 corresponding_front_rear: [NYC1-PP-02, RJ1] diff --git a/objects/extensions/routing_policies_aggregate/routing_policies_aggregate.yml b/objects/extensions/routing_policies_aggregate/routing_policies_aggregate.yml index d42e522..cfb1e19 100644 --- a/objects/extensions/routing_policies_aggregate/routing_policies_aggregate.yml +++ b/objects/extensions/routing_policies_aggregate/routing_policies_aggregate.yml @@ -5,7 +5,7 @@ # # RoutingPolicyAggregate inherits RoutingPolicy: name (Text, unique, the # human_friendly_id), description (Text, optional), policy_type (Dropdown: -# import-policy / export-policy / import-export-policy), weight (Number, +# import_policy / export_policy / import_export_policy), weight (Number, # default 1000), address_family (Dropdown: ipv4 / ipv6 / all, default all). # # The `extensions: nodes:` block in @@ -37,17 +37,17 @@ spec: Export policy controlling advertisement of the Customer A summary aggregate route. Referenced by name from the RoutingAggregateRoute.import_policies free-text field on nyc1-rtr01. - policy_type: "export-policy" + policy_type: "export_policy" weight: 500 address_family: "ipv4" - name: "CUST-B-DISCARD-EXPORT" description: "Export policy suppressing advertisement of the discarded Customer B subnet aggregate." - policy_type: "export-policy" + policy_type: "export_policy" weight: 200 address_family: "ipv4" - name: "MGMT-DEFAULT-IMPORT" description: "Import policy accepting the default route learned on management-VRF aggregates." - policy_type: "import-policy" + policy_type: "import_policy" address_family: "all" diff --git a/objects/extensions/routing_policies_bgp/routing_policies_bgp.yml b/objects/extensions/routing_policies_bgp/routing_policies_bgp.yml index d2a19a3..667bac4 100644 --- a/objects/extensions/routing_policies_bgp/routing_policies_bgp.yml +++ b/objects/extensions/routing_policies_bgp/routing_policies_bgp.yml @@ -34,13 +34,13 @@ spec: data: - name: CUST-A-IMPORT-PREFER-CUSTOMER description: "Import routes learned from Customer A, setting local preference for backbone selection." - policy_type: import-policy + policy_type: import_policy weight: 100 address_family: ipv4 - name: CUST-A-EXPORT-DEFAULT-ROUTE description: "Export a default route and backbone summaries to Customer A." - policy_type: export-policy + policy_type: export_policy weight: 100 address_family: ipv4 @@ -48,7 +48,7 @@ spec: description: >- Export only our own backbone prefixes to the upstream transit provider, filtering out customer routes. - policy_type: export-policy + policy_type: export_policy weight: 500 address_family: all diff --git a/objects/extensions/routing_policies_ospf/routing_policies_ospf.yml b/objects/extensions/routing_policies_ospf/routing_policies_ospf.yml index 62c8a9a..7dc32b3 100644 --- a/objects/extensions/routing_policies_ospf/routing_policies_ospf.yml +++ b/objects/extensions/routing_policies_ospf/routing_policies_ospf.yml @@ -34,19 +34,19 @@ spec: data: - name: CUST-A-OSPF-IMPORT description: "Import policy applied to OSPF routes learned in Customer A's VRF on nyc1-rtr01." - policy_type: import-policy + policy_type: import_policy address_family: ipv4 weight: 100 - name: CUST-A-OSPF-EXPORT description: "Export policy applied to OSPF routes advertised in Customer A's VRF on nyc1-rtr01." - policy_type: export-policy + policy_type: export_policy address_family: ipv4 weight: 100 - name: OSPF-DEFAULT-METRIC description: "Default metric adjustment policy applied to both imported and exported OSPF routes." - policy_type: import-export-policy + policy_type: import_export_policy address_family: all weight: 500 diff --git a/objects/extensions/routing_policies_pim/routing_policies_pim.yml b/objects/extensions/routing_policies_pim/routing_policies_pim.yml index 94c1f44..243e927 100644 --- a/objects/extensions/routing_policies_pim/routing_policies_pim.yml +++ b/objects/extensions/routing_policies_pim/routing_policies_pim.yml @@ -10,7 +10,7 @@ # inheriting RoutingPolicy with no extra attributes of its own. Live # schema confirms it adds nothing beyond the generic's fields: name # (Text, unique, mandatory), description (Text, optional), policy_type -# (Dropdown: import-policy/export-policy/import-export-policy, +# (Dropdown: import_policy/export_policy/import_export_policy, # mandatory), weight (Number, optional, default 1000), address_family # (Dropdown: ipv4/ipv6/all, optional, default "all"). Its # human_friendly_id is the single field name__value. @@ -40,19 +40,19 @@ spec: data: - name: PIM-ALLOW-CUSTOMER-A-SOURCES description: "Permit PIM joins toward known multicast sources in VRF CUSTOMER-A" - policy_type: import-policy + policy_type: import_policy weight: 100 address_family: ipv4 - name: PIM-ALLOW-CUSTOMER-A-RECEIVERS description: "Permit PIM joins/prunes toward known receiver interfaces in VRF CUSTOMER-A" - policy_type: export-policy + policy_type: export_policy weight: 100 address_family: ipv4 - name: PIM-DENY-DEFAULT description: "Default deny-all fallback PIM policy applied to both import and export" - policy_type: import-export-policy + policy_type: import_export_policy weight: 10 address_family: all diff --git a/objects/extensions/snmp/snmp.yml b/objects/extensions/snmp/snmp.yml index 5a1984f..66b7b49 100644 --- a/objects/extensions/snmp/snmp.yml +++ b/objects/extensions/snmp/snmp.yml @@ -32,14 +32,14 @@ spec: auth_password: AuthPass123! privacy_protocol: aes privacy_password: PrivPass123! - security_level: authPriv + security_level: auth_priv - name: readonly-v3 description: SNMPv3 user with authentication only, no privacy. username: svc-readonly auth_protocol: md5 auth_password: ReadOnlyAuth1 privacy_protocol: none - security_level: authNoPriv + security_level: auth_no_priv --- apiVersion: infrahub.app/v1 @@ -58,7 +58,7 @@ spec: username: svc-monitoring auth_protocol: sha privacy_protocol: aes - security_level: authPriv + security_level: auth_priv - name: legacy-monitor-01 client_description: Legacy monitoring host polling via SNMPv2c. communities: diff --git a/objects/extensions/users/users.yml b/objects/extensions/users/users.yml index 8acbef8..2a08d4d 100644 --- a/objects/extensions/users/users.yml +++ b/objects/extensions/users/users.yml @@ -31,7 +31,7 @@ spec: - name: Auditors description: Read-only access for compliance and auditing. idle_timeout: 3600 - permissions: read-only + permissions: read_only --- apiVersion: infrahub.app/v1 From 6d319fc3ef10c598edfa67ae9f0057e00c1a6a77 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 17:42:30 +0200 Subject: [PATCH 41/68] fix: declare relationship kind explicitly everywhere CC-7 asks for kind and cardinality on every relationship. Twelve relationships still relied on the implicit default; each now states the kind it already resolves to at runtime, so nothing changes behaviour. - base/ipam.yml IpamIPAddress.interface gets kind Attribute, matching InterfaceLayer3.ip_addresses on the other end of ip_address__interface (DCIM-15 and IPAM-12 reached the same ruling) - kind Generic written out on: OrganizationProvider.circuits and LocationHosting.circuit_endpoints (circuit), DcimCircuit.contract (circuit_contract), ComputeGenericUnit.worker_in_cluster (cluster), RoutingBGPSession.device and OrganizationGeneric.asn (routing_bgp), InterfacePhysical.plugged_sfp, LocationHosting.spare_sfps and OrganizationManufacturer.sfps (sfp), IpamRouteTarget.import_vrf and .export_vrf (vrf) No Attribute/Generic flips beyond the ip_address__interface pair. SnmpClient.community already gained its kind earlier in the review. 7 files. Co-Authored-By: Claude Fable 5 --- base/ipam.yml | 1 + extensions/circuit/circuit.yml | 2 ++ extensions/circuit_contract/circuit_contract.yml | 1 + extensions/cluster/cluster.yml | 1 + extensions/routing_bgp/bgp.yml | 2 ++ extensions/sfp/sfp.yml | 3 +++ extensions/vrf/vrf.yml | 2 ++ 7 files changed, 12 insertions(+) diff --git a/base/ipam.yml b/base/ipam.yml index 9f3a4f2..30fb369 100644 --- a/base/ipam.yml +++ b/base/ipam.yml @@ -170,6 +170,7 @@ nodes: order_weight: 1250 - name: interface peer: InterfaceLayer3 + kind: Attribute cardinality: one optional: true identifier: ip_address__interface diff --git a/extensions/circuit/circuit.yml b/extensions/circuit/circuit.yml index e735fb0..bd5fb14 100644 --- a/extensions/circuit/circuit.yml +++ b/extensions/circuit/circuit.yml @@ -177,6 +177,7 @@ extensions: relationships: - name: circuits peer: DcimCircuit + kind: Generic cardinality: many optional: true identifier: circuit__provider @@ -184,6 +185,7 @@ extensions: relationships: - name: circuit_endpoints peer: DcimCircuitEndpoint + kind: Generic cardinality: many optional: true identifier: circuit_endpoint__location diff --git a/extensions/circuit_contract/circuit_contract.yml b/extensions/circuit_contract/circuit_contract.yml index adecb0c..20c5b9c 100644 --- a/extensions/circuit_contract/circuit_contract.yml +++ b/extensions/circuit_contract/circuit_contract.yml @@ -70,6 +70,7 @@ extensions: relationships: - name: contract peer: DcimCircuitContract + kind: Generic cardinality: one optional: true identifier: circuit__contract diff --git a/extensions/cluster/cluster.yml b/extensions/cluster/cluster.yml index 69feb9f..e78a276 100644 --- a/extensions/cluster/cluster.yml +++ b/extensions/cluster/cluster.yml @@ -59,6 +59,7 @@ extensions: relationships: - name: worker_in_cluster peer: ClusterGenericComputeUnitNodes + kind: Generic label: Worker in cluster cardinality: one optional: true diff --git a/extensions/routing_bgp/bgp.yml b/extensions/routing_bgp/bgp.yml index 8bcb5d3..32e48d1 100644 --- a/extensions/routing_bgp/bgp.yml +++ b/extensions/routing_bgp/bgp.yml @@ -209,6 +209,7 @@ nodes: identifier: bgpsession__remote_ip - name: device peer: DcimDevice + kind: Generic cardinality: one optional: true - name: peer_group @@ -237,6 +238,7 @@ extensions: - name: asn peer: RoutingAutonomousSystem label: Autonomous System + kind: Generic cardinality: many optional: true order_weight: 2000 diff --git a/extensions/sfp/sfp.yml b/extensions/sfp/sfp.yml index c5fbf90..7cd2808 100644 --- a/extensions/sfp/sfp.yml +++ b/extensions/sfp/sfp.yml @@ -188,6 +188,7 @@ extensions: relationships: - name: plugged_sfp peer: DcimGenericSFP + kind: Generic cardinality: one optional: true identifier: sfp__interface @@ -195,12 +196,14 @@ extensions: relationships: - name: spare_sfps peer: DcimGenericSFP + kind: Generic cardinality: many optional: true - kind: OrganizationManufacturer relationships: - name: sfps peer: DcimGenericSFP + kind: Generic label: SFPs cardinality: many optional: true diff --git a/extensions/vrf/vrf.yml b/extensions/vrf/vrf.yml index 4a1f5af..93fbb76 100644 --- a/extensions/vrf/vrf.yml +++ b/extensions/vrf/vrf.yml @@ -85,12 +85,14 @@ nodes: relationships: - name: import_vrf peer: IpamVRF + kind: Generic label: Imported by VRFs cardinality: many optional: true identifier: vrf__import - name: export_vrf peer: IpamVRF + kind: Generic label: Exported by VRFs cardinality: many optional: true From b6eb488521ce5445a0983ea1df1a2833621ae395 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 18:41:21 +0200 Subject: [PATCH 42/68] fix: normalize order_weight to the base scheme CC-9 asks that every attribute and relationship carry an order_weight on the base scheme: Parent 900, name 1000, description 1100, status 1200, role 1300-1400, tags 2000. After this commit no attribute or relationship in base/ or extensions/ is missing a weight, and no two fields on a resolved node share one (checked with inheritance and extensions: blocks applied, state: absent honoured). - 106 missing weights filled, on attributes and on relationships, including the ones the review commits added: DcimInterface.mtu keeps a slot of its own, DcimDeviceWithPhysicalDisks.name, DcimPhysicalDevice.name, IpamIPAddress.interface, and the four routing_policies_* reverse relationships - scheme slots restored where they had drifted: description 2000 to 1100 in base/dcim.yml, dwdm and patch_panel; description 1200 to 1100 in base/location.yml, base/organization.yml, DcimPlatform, DcimGenericModule and vrf; tags 3000 to 2000 in organization, rack, peering_ixp (twice) and bgp_community; LocationGeneric.name 900 to 1000; status to 1200 on DcimDevice, IpamPrefix, IpamIPAddress, DcimCable, LocationSite (both files), ComputePhysicalServer, ClusterHosting, DcimGenericSFP and RoutingProtocol - Parent relationships moved to 900: DcimInterface.device, MlagInterface, DcimPhysicalDisk.device, RoutingProtocol.device, RoutingOSPFInterface.ospf, and the three new ones on RoutingPIMInterface, PeeringIXPConnection and UserAccount - sibling ties broken: VirtualizationVirtualMachine vcpu/memory/disk (all 1900), DcimPhysicalDevice position/serial_number/location (all 1500, with rack_face at 1515), GenericMlagDomain peer_links/mlag_interfaces, PeeringIXPConnection ipv6_address/router, RoutingOSPFInterface area/interface - the IpamGenericVLAN 900/910/920/930 ladder rebased onto the scheme - IPAM-13 applied to base/ipam.yml: IpamPrefix description 1100, status 1200, role 1300, scope 1500; IpamIPAddress description 1100, status 1200, role 1300, fqdn 1400, primary_of 1500, interface 1600. IpamIPAddress.vrrp moves to 1700 so it clears the pinned interface slot, and tenancy's IpamIPAddress.tenant to 1350 so it clears role Weights only. No attribute, relationship, choice or flag changes. 40 files. Co-Authored-By: Claude Fable 5 --- base/dcim.yml | 29 ++++++++++--------- base/ipam.yml | 20 +++++++------ base/location.yml | 6 ++-- base/organization.yml | 6 ++-- extensions/cable/cable.yml | 4 +-- extensions/circuit/circuit.yml | 12 +++++++- .../circuit_contract/circuit_contract.yml | 6 ++++ extensions/cluster/cluster.yml | 4 +++ extensions/compute/compute.yml | 13 +++++---- extensions/cross_connect/cross_connect.yml | 8 ++--- extensions/device_module/device_module.yml | 7 +++-- extensions/dwdm/dwdm.yml | 16 +++++----- .../hosting_cluster/hosting_cluster.yml | 4 +-- .../interface_breakout/interface_breakout.yml | 5 ++-- extensions/lag/lag.yml | 8 ++--- .../location_minimal/location_minimal.yml | 6 ++-- extensions/location_site/location_site.yml | 6 ++-- extensions/mlag/mlag.yml | 12 ++++---- extensions/patch_panel/patch_panel.yml | 13 +++++---- extensions/peering_ixp/peering_ixp.yml | 14 ++++++--- extensions/physical_disk/physical_disk.yml | 15 ++++++---- extensions/qinq/qinq.yml | 3 ++ extensions/rack/rack.yml | 9 +++--- extensions/routing/routing.yml | 6 ++-- extensions/routing_aggregate/aggregate.yml | 8 ++--- extensions/routing_bgp/bgp.yml | 26 +++++++++++++---- .../routing_bgp_community/bgp_community.yml | 3 +- extensions/routing_bgp_rr/bgp_rr.yml | 3 +- extensions/routing_ospf/ospf.yml | 16 +++++----- extensions/routing_pim/pim.yml | 3 ++ .../routing_policies_bgp.yml | 4 +++ .../routing_policies_ospf.yml | 2 ++ .../routing_policies_pim.yml | 2 ++ extensions/sfp/sfp.yml | 7 +++-- extensions/snmp/snmp.yml | 3 +- extensions/tenancy/tenancy.yml | 9 ++++-- extensions/users/users.yml | 2 ++ extensions/vlan/vlan.yml | 18 ++++++++---- extensions/vrf/vrf.yml | 12 ++++++-- extensions/vrrp/vrrp.yml | 4 +-- 40 files changed, 230 insertions(+), 124 deletions(-) diff --git a/base/dcim.yml b/base/dcim.yml index 81c164c..493223a 100644 --- a/base/dcim.yml +++ b/base/dcim.yml @@ -27,7 +27,7 @@ generics: - name: description kind: Text optional: true - order_weight: 2000 + order_weight: 1100 relationships: - name: interfaces peer: DcimInterface @@ -35,6 +35,7 @@ generics: cardinality: many optional: true identifier: device__interface + order_weight: 1650 - name: tags peer: BuiltinTag kind: Attribute @@ -69,16 +70,17 @@ generics: kind: Text unique: true allow_override: any + order_weight: 1000 - name: position kind: Number label: Position (U) optional: true description: Lowest unit. - order_weight: 1500 + order_weight: 1550 - name: serial_number kind: Text optional: true - order_weight: 1500 + order_weight: 1400 - name: rack_face kind: Dropdown label: Rack Face @@ -92,14 +94,14 @@ generics: description: Device mounted on the rear face of the rack. optional: false description: On which face of the rack the device is mounted. - order_weight: 1515 + order_weight: 1600 relationships: - name: device_type peer: DcimDeviceType kind: Attribute cardinality: one optional: true - order_weight: 1200 + order_weight: 1150 - name: location peer: LocationHosting label: Location @@ -119,7 +121,7 @@ generics: cardinality: one optional: true identifier: connector__endpoint - order_weight: 1500 + order_weight: 1600 - name: Connector namespace: Dcim description: >- @@ -218,14 +220,14 @@ generics: color: "#B2D4E6" optional: true description: "The role of the interface in the network" - order_weight: 1250 + order_weight: 1300 - name: mtu kind: Number label: MTU default_value: 1500 optional: true description: "Maximum transmission unit, in bytes (IP payload, not frame size)." - order_weight: 1300 + order_weight: 1350 relationships: - name: device peer: DcimGenericDevice @@ -233,7 +235,7 @@ generics: cardinality: one optional: false identifier: device__interface - order_weight: 1025 + order_weight: 900 - name: Layer2 namespace: Interface @@ -261,7 +263,7 @@ generics: description: "Trunk all mode" optional: true description: "Layer 2 mode of the interface" - order_weight: 1500 + order_weight: 1450 - name: Layer3 namespace: Interface @@ -365,7 +367,7 @@ nodes: - name: description kind: Text optional: true - order_weight: 1200 + order_weight: 1100 relationships: - name: devices peer: DcimGenericDevice @@ -416,7 +418,7 @@ nodes: description: No longer in use and scheduled for removal. color: "#e04040" optional: false - order_weight: 1100 + order_weight: 1200 - name: role kind: Dropdown choices: @@ -445,7 +447,7 @@ nodes: description: Tor switch part of a Fabric. color: "#e8e7fd" optional: true - order_weight: 1400 + order_weight: 1300 - name: Physical namespace: Interface description: "Physical network port on a device" @@ -476,3 +478,4 @@ nodes: cardinality: one identifier: "sub__interface" description: "Parent interface to which this sub-interface belongs" + order_weight: 1600 diff --git a/base/ipam.yml b/base/ipam.yml index 30fb369..8e2eb57 100644 --- a/base/ipam.yml +++ b/base/ipam.yml @@ -30,6 +30,7 @@ generics: cardinality: many optional: true identifier: prefix__prefix_scope + order_weight: 1550 nodes: - name: Prefix @@ -63,11 +64,11 @@ nodes: label: Deprecated color: "#e04040" optional: false - order_weight: 1100 + order_weight: 1200 - name: description kind: Text optional: true - order_weight: 1150 + order_weight: 1100 - name: role kind: Dropdown choices: @@ -92,7 +93,7 @@ nodes: description: Core network infrastructure prefixes. color: "#9678B6" optional: true - order_weight: 1200 + order_weight: 1300 relationships: - name: scope peer: IpamPrefixScope @@ -100,7 +101,7 @@ nodes: cardinality: one optional: true identifier: prefix__prefix_scope - order_weight: 1300 + order_weight: 1500 - name: IPAddress namespace: Ipam @@ -122,7 +123,7 @@ nodes: - name: description kind: Text optional: true - order_weight: 1050 + order_weight: 1100 - name: status kind: Dropdown default_value: active @@ -137,7 +138,7 @@ nodes: label: Deprecated color: "#e04040" optional: false - order_weight: 1100 + order_weight: 1200 - name: role kind: Dropdown choices: @@ -151,13 +152,13 @@ nodes: label: Anycast color: "#FDFD96" optional: true - order_weight: 1150 + order_weight: 1300 - name: fqdn kind: Text label: FQDN regex: (?=^.{1,253}$)(^(((?!-)[a-zA-Z0-9-]{1,63}(? Date: Mon, 31 Aug 2026 18:43:33 +0200 Subject: [PATCH 43/68] chore: state optional explicitly on every attribute and relationship CC-6 asks for `optional` in writing everywhere, because the default is not the same on both sides: live 1.11.0 treats an omitted `optional` as false on an attribute and true on a relationship, which is easy to read the wrong way in a file. Each of the 98 places that relied on the default now states the value it already resolves to. - 69 attributes gain `optional: false`, 29 relationships gain `optional: true` - the value written is the current effective one, verified field by field: all 406 attributes and relationships in base/ and extensions/ resolve to exactly the same `optional` before and after this commit - `optional: false` stays next to `default_value` rather than being dropped (decision Q1a), and base/dcim.yml and base/ipam.yml each gain one note at their first status definition recording why: Infrahub 1.11 treats an attribute with a default_value as optional at runtime, so `optional: false` is there to document intent - patch_panel connector_type gets its explicit `optional: false`, the second half of DWDM-03 - `state: absent` entries are left alone, and experimental/ is out of scope per the tier rule 31 files. Co-Authored-By: Claude Fable 5 --- base/dcim.yml | 10 ++++++++++ base/ipam.yml | 2 ++ base/organization.yml | 1 + extensions/aggregate/aggregate.yml | 1 + extensions/circuit/circuit.yml | 1 + extensions/cluster/cluster.yml | 2 ++ extensions/cross_connect/cross_connect.yml | 1 + extensions/device_module/device_module.yml | 2 ++ extensions/dwdm/dwdm.yml | 5 +++++ extensions/hosting_cluster/hosting_cluster.yml | 1 + extensions/lag/lag.yml | 6 ++++++ extensions/mlag/mlag.yml | 6 ++++++ extensions/patch_panel/patch_panel.yml | 3 +++ extensions/peering_ixp/peering_ixp.yml | 7 +++++++ extensions/physical_disk/physical_disk.yml | 2 ++ extensions/routing/routing.yml | 1 + extensions/routing_aggregate/aggregate.yml | 1 + extensions/routing_bgp/bgp.yml | 5 +++++ extensions/routing_bgp_community/bgp_community.yml | 3 +++ extensions/routing_bgp_rr/bgp_rr.yml | 2 ++ extensions/routing_ospf/ospf.yml | 3 +++ extensions/routing_pim/pim.yml | 1 + extensions/routing_policies/routing_policies.yml | 2 ++ .../routing_policies_bgp/routing_policies_bgp.yml | 4 ++++ .../routing_policies_ospf/routing_policies_ospf.yml | 2 ++ .../routing_policies_pim/routing_policies_pim.yml | 2 ++ extensions/snmp/snmp.yml | 11 +++++++++++ extensions/users/users.yml | 5 +++++ extensions/vlan/vlan.yml | 3 +++ extensions/vrf/vrf.yml | 1 + extensions/vrrp/vrrp.yml | 6 ++++++ 31 files changed, 102 insertions(+) diff --git a/base/dcim.yml b/base/dcim.yml index 493223a..6ffcc9d 100644 --- a/base/dcim.yml +++ b/base/dcim.yml @@ -23,6 +23,7 @@ generics: - name: name kind: Text unique: true + optional: false order_weight: 1000 - name: description kind: Text @@ -70,6 +71,7 @@ generics: kind: Text unique: true allow_override: any + optional: false order_weight: 1000 - name: position kind: Number @@ -157,6 +159,7 @@ generics: attributes: - name: name kind: Text + optional: false description: "Name of the interface" order_weight: 1000 - name: description @@ -164,6 +167,8 @@ generics: optional: true description: "A brief description of the interface" order_weight: 1100 + # NOTE: Infrahub 1.11 treats attributes with a default_value as optional at runtime; + # optional: false documents intent. - name: status kind: Dropdown default_value: "active" @@ -313,6 +318,7 @@ nodes: - name: name kind: Text unique: true + optional: false order_weight: 1000 - name: description kind: Text @@ -333,6 +339,7 @@ nodes: kind: Boolean label: Full Depth default_value: true + optional: false order_weight: 1500 - name: weight kind: Number @@ -363,6 +370,7 @@ nodes: - name: name kind: Text unique: true + optional: false order_weight: 1000 - name: description kind: Text @@ -381,6 +389,7 @@ nodes: kind: Attribute cardinality: one identifier: manufacturer__platform + optional: true order_weight: 1300 - name: Device namespace: Dcim @@ -477,5 +486,6 @@ nodes: kind: Attribute cardinality: one identifier: "sub__interface" + optional: true description: "Parent interface to which this sub-interface belongs" order_weight: 1600 diff --git a/base/ipam.yml b/base/ipam.yml index 8e2eb57..b5ab1f3 100644 --- a/base/ipam.yml +++ b/base/ipam.yml @@ -50,6 +50,8 @@ nodes: uniqueness_constraints: - [ip_namespace, prefix__value] attributes: + # NOTE: Infrahub 1.11 treats attributes with a default_value as optional at runtime; + # optional: false documents intent. - name: status kind: Dropdown default_value: active diff --git a/base/organization.yml b/base/organization.yml index 97759e7..c9da07f 100644 --- a/base/organization.yml +++ b/base/organization.yml @@ -23,6 +23,7 @@ generics: - name: name kind: Text unique: true + optional: false order_weight: 1000 - name: description kind: Text diff --git a/extensions/aggregate/aggregate.yml b/extensions/aggregate/aggregate.yml index fdf924f..01cee73 100644 --- a/extensions/aggregate/aggregate.yml +++ b/extensions/aggregate/aggregate.yml @@ -59,6 +59,7 @@ nodes: kind: Boolean label: Private default_value: false + optional: false description: Indicates this RIR manages private (RFC 1918 / RFC 4193) address space. order_weight: 1300 relationships: diff --git a/extensions/circuit/circuit.yml b/extensions/circuit/circuit.yml index 5912142..83edd0d 100644 --- a/extensions/circuit/circuit.yml +++ b/extensions/circuit/circuit.yml @@ -23,6 +23,7 @@ nodes: - name: circuit_id kind: Text unique: true + optional: false order_weight: 1000 - name: description kind: Text diff --git a/extensions/cluster/cluster.yml b/extensions/cluster/cluster.yml index 7e45921..5d1192c 100644 --- a/extensions/cluster/cluster.yml +++ b/extensions/cluster/cluster.yml @@ -22,6 +22,7 @@ generics: - name: name kind: Text unique: true + optional: false description: Name of the cluster. order_weight: 1000 - name: description @@ -54,6 +55,7 @@ generics: kind: Component cardinality: many identifier: worker_in_cluster + optional: true order_weight: 1500 extensions: nodes: diff --git a/extensions/cross_connect/cross_connect.yml b/extensions/cross_connect/cross_connect.yml index c1d848c..f29d629 100644 --- a/extensions/cross_connect/cross_connect.yml +++ b/extensions/cross_connect/cross_connect.yml @@ -26,6 +26,7 @@ nodes: attributes: - name: identifier kind: Text + optional: false order_weight: 1000 - name: description kind: Text diff --git a/extensions/device_module/device_module.yml b/extensions/device_module/device_module.yml index 6f09c88..b96fe99 100644 --- a/extensions/device_module/device_module.yml +++ b/extensions/device_module/device_module.yml @@ -68,6 +68,7 @@ generics: - name: name kind: Text unique: true + optional: false description: "Name of the module type." order_weight: 1000 - name: description @@ -119,6 +120,7 @@ nodes: order_weight: 800 - name: name kind: Text + optional: false description: "Name of the bay, e.g. 'slot 1' or 'psu 1'." order_weight: 1000 - name: position diff --git a/extensions/dwdm/dwdm.yml b/extensions/dwdm/dwdm.yml index 5503c99..f330767 100644 --- a/extensions/dwdm/dwdm.yml +++ b/extensions/dwdm/dwdm.yml @@ -17,6 +17,7 @@ generics: attributes: - name: name kind: Text + optional: false order_weight: 1000 - name: description kind: Text @@ -133,6 +134,7 @@ nodes: - name: name kind: Text unique: true + optional: false order_weight: 1000 - name: wdm_type kind: Dropdown @@ -249,6 +251,7 @@ nodes: attributes: - name: channel kind: Number + optional: false description: WDM channel number. order_weight: 1000 - name: wdm_type @@ -269,11 +272,13 @@ nodes: - name: wavelength kind: Text # Text until float possible in Number Kind label: Wavelength (nm) + optional: false description: Wavelength of the channel in nm. order_weight: 1200 - name: frequency kind: Text # Text until float possible in Number Kind label: Frequency (GHz) + optional: false description: Frequency of the channel in GHz. order_weight: 1300 diff --git a/extensions/hosting_cluster/hosting_cluster.yml b/extensions/hosting_cluster/hosting_cluster.yml index 90607aa..5f6993b 100644 --- a/extensions/hosting_cluster/hosting_cluster.yml +++ b/extensions/hosting_cluster/hosting_cluster.yml @@ -47,6 +47,7 @@ nodes: - name: public_cloud label: Public Cloud color: "#888888" + optional: false description: Underlying virtualisation or clustering technology. order_weight: 1300 - name: status diff --git a/extensions/lag/lag.yml b/extensions/lag/lag.yml index a34497e..53f8a7a 100644 --- a/extensions/lag/lag.yml +++ b/extensions/lag/lag.yml @@ -16,10 +16,12 @@ generics: attributes: - name: name kind: Text + optional: false description: "Name of the interface" order_weight: 1000 - name: bundle_number kind: Number + optional: false description: "Bundle number for the aggregated interface" order_weight: 1250 relationships: @@ -29,6 +31,7 @@ generics: kind: Attribute cardinality: many identifier: interface__bundle + optional: true description: "Physical Interfaces that are members of this aggregate" order_weight: 1800 @@ -56,6 +59,7 @@ nodes: - name: fast label: Fast color: "#E6E6FA" # lavender + optional: false description: "LACP rate for the aggregated interface" order_weight: 1850 - name: lacp_mode @@ -72,6 +76,7 @@ nodes: - name: disabled label: Disabled color: "#E6E6FA" # lavender + optional: false description: "LACP mode for the aggregated interface" order_weight: 1900 relationships: @@ -83,6 +88,7 @@ nodes: cardinality: many identifier: interface__bundle common_parent: device + optional: true description: "Physical Interfaces that are members of this aggregate" order_weight: 1800 diff --git a/extensions/mlag/mlag.yml b/extensions/mlag/mlag.yml index feaa9fd..5bb2143 100644 --- a/extensions/mlag/mlag.yml +++ b/extensions/mlag/mlag.yml @@ -26,12 +26,14 @@ generics: kind: Text label: "MLAG Domain ID" unique: true # TODO: This one could be a mess to make unique... + optional: false description: "Identifier for the MLAG domain" order_weight: 1000 - name: reload_delay kind: Number label: "Reload Delay" default_value: 300 + optional: false description: "Time in seconds to wait before bringing up the MLAG after a reload" order_weight: 1650 relationships: @@ -40,6 +42,7 @@ generics: label: "Peer Links" kind: Attribute cardinality: many + optional: true description: "LAG interfaces used as peer-links between the MLAG peers" order_weight: 1500 # Depending on the use-case this could be optional or not @@ -55,6 +58,7 @@ generics: label: "MLAG Interface(s)" kind: Component cardinality: many + optional: true description: "Bundle interfaces that are spread across all devices in this MLAG domain." order_weight: 1550 @@ -78,6 +82,7 @@ nodes: attributes: - name: name kind: Text + optional: false description: "Name of the interface" order_weight: 1000 - name: description @@ -117,6 +122,7 @@ nodes: label: Outage description: "Interface is currently experiencing an outage." color: "#F4CCCC" # pastel red + optional: false description: "The status of the interface" order_weight: 1200 - name: role diff --git a/extensions/patch_panel/patch_panel.yml b/extensions/patch_panel/patch_panel.yml index 6870bc5..a836958 100644 --- a/extensions/patch_panel/patch_panel.yml +++ b/extensions/patch_panel/patch_panel.yml @@ -17,6 +17,7 @@ generics: attributes: - name: name kind: Text + optional: false order_weight: 1000 - name: description kind: Text @@ -112,6 +113,7 @@ generics: - name: splice label: Splice description: "Permanent fiber connection method where two fiber ends are fused." + optional: false order_weight: 1200 nodes: @@ -131,6 +133,7 @@ nodes: - name: name kind: Text unique: true # TODO: maybe combine location / name + optional: false order_weight: 1000 - name: module_capacity kind: Number diff --git a/extensions/peering_ixp/peering_ixp.yml b/extensions/peering_ixp/peering_ixp.yml index cc11262..21aa6f5 100644 --- a/extensions/peering_ixp/peering_ixp.yml +++ b/extensions/peering_ixp/peering_ixp.yml @@ -21,6 +21,7 @@ nodes: - name: name kind: Text unique: true + optional: false description: "Name of the Internet Exchange" order_weight: 1000 - name: description @@ -40,6 +41,7 @@ nodes: label: Disabled description: "Internet Exchange is not operational" color: "#b0bec5" + optional: false order_weight: 1200 relationships: - name: connections @@ -105,6 +107,7 @@ nodes: - name: name kind: Text unique: true + optional: false description: "Name of the IXP Connection" order_weight: 1000 - name: description @@ -162,6 +165,7 @@ nodes: kind: Attribute cardinality: one identifier: ixpconn__ipv6_address + optional: true description: "IPv6 address assigned to the connection" order_weight: 1400 - name: ipv4_address @@ -170,6 +174,7 @@ nodes: kind: Attribute cardinality: one identifier: ixpconn__ipv4_address + optional: true description: "IPv4 address assigned to the connection" order_weight: 1375 - name: internet_exchange_point @@ -184,6 +189,7 @@ nodes: peer: DcimDevice kind: Attribute cardinality: one + optional: true description: "The router this IXP connection is connected to" order_weight: 1500 - name: bgp_sessions @@ -200,6 +206,7 @@ nodes: peer: BuiltinTag kind: Attribute cardinality: many + optional: true order_weight: 2000 extensions: diff --git a/extensions/physical_disk/physical_disk.yml b/extensions/physical_disk/physical_disk.yml index 251e6b1..68a4e3c 100644 --- a/extensions/physical_disk/physical_disk.yml +++ b/extensions/physical_disk/physical_disk.yml @@ -16,6 +16,7 @@ generics: - name: name # Here so HFIDs and computed names can resolve, see DcimPhysicalDevice.name kind: Text allow_override: any + optional: false order_weight: 1000 relationships: - name: physical_disks @@ -85,6 +86,7 @@ nodes: label: Disposed description: The disk has been securely erased and disposed of. color: "#dc3545" + optional: false description: Lifecycle status of the hardware component. order_weight: 1200 - name: size diff --git a/extensions/routing/routing.yml b/extensions/routing/routing.yml index dc64fa9..d95e0b1 100644 --- a/extensions/routing/routing.yml +++ b/extensions/routing/routing.yml @@ -37,6 +37,7 @@ generics: label: Deleted description: "Configuration has been deleted." color: "#FAD7A0" # pastel orange + optional: false description: "Status of the Protocol Configuration." order_weight: 1200 relationships: diff --git a/extensions/routing_aggregate/aggregate.yml b/extensions/routing_aggregate/aggregate.yml index e0148f2..c17b4fb 100644 --- a/extensions/routing_aggregate/aggregate.yml +++ b/extensions/routing_aggregate/aggregate.yml @@ -35,5 +35,6 @@ nodes: - name: destination peer: IpamPrefix kind: Attribute + optional: true description: "Destination network aggregated by this route." order_weight: 1300 diff --git a/extensions/routing_bgp/bgp.yml b/extensions/routing_bgp/bgp.yml index 4796f60..5d33441 100644 --- a/extensions/routing_bgp/bgp.yml +++ b/extensions/routing_bgp/bgp.yml @@ -25,11 +25,13 @@ nodes: - name: name kind: Text unique: true + optional: false description: "Name of the Autonomous System" order_weight: 1000 - name: asn kind: Number unique: true + optional: false description: "Autonomous System Number" order_weight: 1050 - name: description @@ -117,6 +119,7 @@ nodes: label: IPv6 description: "Policy applies to IPv6 addresses." color: "#E6E6FA" # lavender + optional: false description: "The address family for the routing policy indicating the type of IP address." order_weight: 1250 relationships: @@ -163,6 +166,7 @@ nodes: - name: internal label: Internal description: "Session established with a router in the same autonomous system." + optional: false description: "Type of BGP Session" order_weight: 1250 - name: role @@ -180,6 +184,7 @@ nodes: label: Peering description: "Connect with other networks via IX." color: "#E6E6FA" # lavender + optional: false description: "Role of the BGP Session" order_weight: 1300 - name: local_pref diff --git a/extensions/routing_bgp_community/bgp_community.yml b/extensions/routing_bgp_community/bgp_community.yml index f03f7e6..3a58e22 100644 --- a/extensions/routing_bgp_community/bgp_community.yml +++ b/extensions/routing_bgp_community/bgp_community.yml @@ -22,6 +22,7 @@ nodes: - name: name kind: Text unique: true + optional: false description: "The name of the BGP community." order_weight: 1000 - name: description @@ -32,6 +33,7 @@ nodes: - name: community kind: Text unique: true + optional: false description: "The value of the BGP community (RFC1997, RFC4360, RFC8092)." order_weight: 1200 relationships: @@ -40,6 +42,7 @@ nodes: label: Routing Policies kind: Generic cardinality: many + optional: true description: "The BGP Policies using this BGP Community." order_weight: 1300 - name: tags diff --git a/extensions/routing_bgp_rr/bgp_rr.yml b/extensions/routing_bgp_rr/bgp_rr.yml index 050b069..0c97d88 100644 --- a/extensions/routing_bgp_rr/bgp_rr.yml +++ b/extensions/routing_bgp_rr/bgp_rr.yml @@ -21,6 +21,7 @@ nodes: - name: name kind: Text unique: true + optional: false description: "Name of the Route Reflector Cluster" order_weight: 1000 - name: description @@ -54,4 +55,5 @@ extensions: label: "RR Cluster" kind: Attribute cardinality: one + optional: true order_weight: 1700 diff --git a/extensions/routing_ospf/ospf.yml b/extensions/routing_ospf/ospf.yml index d210b7d..70323bd 100644 --- a/extensions/routing_ospf/ospf.yml +++ b/extensions/routing_ospf/ospf.yml @@ -46,6 +46,7 @@ nodes: label: OSPFv3 description: "Open Shortest Path First version 3." color: "#E6E6FA" # lavender + optional: false description: "Version of the OSPF protocol." order_weight: 1300 - name: import_policies @@ -114,6 +115,7 @@ nodes: label: Peer-to-Peer description: "OSPF peer-to-peer interface mode." color: "#E6E6FA" # lavender + optional: false description: "Mode of the OSPF interface." order_weight: 1300 - name: authentication_key @@ -134,6 +136,7 @@ nodes: order_weight: 1225 - name: area kind: Text + optional: false description: "OSPF area associated with the interface." order_weight: 1200 relationships: diff --git a/extensions/routing_pim/pim.yml b/extensions/routing_pim/pim.yml index f6d6e4b..23d8073 100644 --- a/extensions/routing_pim/pim.yml +++ b/extensions/routing_pim/pim.yml @@ -93,6 +93,7 @@ nodes: label: Bidirectional Mode description: "Bidirectional PIM for efficient traffic forwarding." color: "#E6E6FA" # lavender + optional: false description: "PIM mode used for multicast routing on this interface." order_weight: 1150 - name: hello_interval diff --git a/extensions/routing_policies/routing_policies.yml b/extensions/routing_policies/routing_policies.yml index 5c3acf3..c00a06e 100644 --- a/extensions/routing_policies/routing_policies.yml +++ b/extensions/routing_policies/routing_policies.yml @@ -46,6 +46,7 @@ generics: label: Import + Export description: "Policy for both incoming and outgoing routes." color: "#E6E6FA" # lavender + optional: false description: "The type of routing policy which specifies the direction of route advertisement." order_weight: 1200 - name: weight @@ -70,5 +71,6 @@ generics: label: All description: "Policy applies to both IPv4 and IPv6 addresses." color: "#E6E6FA" # lavender + optional: false description: "The address family for the routing policy indicating the type of IP address." order_weight: 1150 diff --git a/extensions/routing_policies_bgp/routing_policies_bgp.yml b/extensions/routing_policies_bgp/routing_policies_bgp.yml index 52f5ea7..50789ae 100644 --- a/extensions/routing_policies_bgp/routing_policies_bgp.yml +++ b/extensions/routing_policies_bgp/routing_policies_bgp.yml @@ -35,6 +35,7 @@ extensions: kind: Generic cardinality: many identifier: bgppeergroup__import_policies + optional: true description: "The routing-policies used by this instance for import." order_weight: 1750 - name: export_routing_policies @@ -43,6 +44,7 @@ extensions: kind: Generic cardinality: many identifier: bgppeergroup__export_policies + optional: true description: "The routing-policies used by this instance for export." order_weight: 1800 - kind: RoutingBGPSession @@ -60,6 +62,7 @@ extensions: kind: Generic cardinality: many identifier: bgpsession__import_policies + optional: true description: "The routing-policies used by this instance for import." order_weight: 1850 - name: export_routing_policies @@ -68,5 +71,6 @@ extensions: kind: Generic cardinality: many identifier: bgpsession__export_policies + optional: true description: "The routing-policies used by this instance for export." order_weight: 1900 diff --git a/extensions/routing_policies_ospf/routing_policies_ospf.yml b/extensions/routing_policies_ospf/routing_policies_ospf.yml index c15773f..c5580f3 100644 --- a/extensions/routing_policies_ospf/routing_policies_ospf.yml +++ b/extensions/routing_policies_ospf/routing_policies_ospf.yml @@ -35,6 +35,7 @@ extensions: kind: Generic cardinality: many identifier: ospf__import_policies + optional: true description: "The routing-policies used by this instance for import." order_weight: 1600 - name: export_routing_policies @@ -43,5 +44,6 @@ extensions: kind: Generic cardinality: many identifier: ospf__export_policies + optional: true description: "The routing-policies used by this instance for export." order_weight: 1650 diff --git a/extensions/routing_policies_pim/routing_policies_pim.yml b/extensions/routing_policies_pim/routing_policies_pim.yml index bf62f29..9c512d0 100644 --- a/extensions/routing_policies_pim/routing_policies_pim.yml +++ b/extensions/routing_policies_pim/routing_policies_pim.yml @@ -35,6 +35,7 @@ extensions: kind: Generic cardinality: many identifier: pim__import_policies + optional: true description: "The routing-policies used by this instance for import." order_weight: 1500 - name: export_routing_policies @@ -43,5 +44,6 @@ extensions: kind: Generic cardinality: many identifier: pim__export_policies + optional: true description: "The routing-policies used by this instance for export." order_weight: 1550 diff --git a/extensions/snmp/snmp.yml b/extensions/snmp/snmp.yml index f31550b..fbbc919 100644 --- a/extensions/snmp/snmp.yml +++ b/extensions/snmp/snmp.yml @@ -22,6 +22,7 @@ generics: - name: name kind: Text unique: true + optional: false order_weight: 1000 - name: description kind: Text @@ -32,6 +33,7 @@ generics: peer: SnmpClient kind: Component cardinality: many + optional: true order_weight: 1900 - name: devices peer: DcimGenericDevice @@ -61,6 +63,7 @@ nodes: attributes: - name: community_string kind: Password + optional: false order_weight: 1300 - name: access kind: Dropdown @@ -71,6 +74,7 @@ nodes: - name: read_write label: Read-Write description: Read-write access. + optional: false order_weight: 1200 - name: CommunityV3 @@ -89,6 +93,7 @@ nodes: attributes: - name: username kind: Text + optional: false order_weight: 1300 - name: auth_protocol kind: Dropdown @@ -103,6 +108,7 @@ nodes: - name: sha label: SHA description: SHA authentication. + optional: false order_weight: 1400 - name: auth_password kind: Password @@ -122,6 +128,7 @@ nodes: - name: aes label: AES description: AES encryption. + optional: false order_weight: 1600 - name: privacy_password kind: Password @@ -141,6 +148,7 @@ nodes: - name: auth_priv label: AuthPriv description: Both authentication and privacy. + optional: false order_weight: 1200 - name: Client @@ -158,6 +166,7 @@ nodes: - name: name kind: Text unique: true + optional: false order_weight: 1000 - name: client_description kind: Text @@ -170,10 +179,12 @@ nodes: label: IP Addresses kind: Attribute cardinality: many + optional: true description: Authorized SNMP client address. order_weight: 1150 - name: communities peer: SnmpCommunity kind: Attribute cardinality: many + optional: true order_weight: 1200 diff --git a/extensions/users/users.yml b/extensions/users/users.yml index 166ec43..2139c17 100644 --- a/extensions/users/users.yml +++ b/extensions/users/users.yml @@ -22,6 +22,7 @@ nodes: - name: name kind: Text unique: true + optional: false order_weight: 1000 - name: description kind: Text @@ -30,6 +31,7 @@ nodes: - name: idle_timeout kind: Number label: Idle Timeout (s) + optional: false order_weight: 1300 - name: permissions kind: Dropdown @@ -64,6 +66,7 @@ nodes: kind: Text label: Username unique: true + optional: false description: "The login username" order_weight: 1000 - name: full_name @@ -84,6 +87,7 @@ nodes: - name: mfa_enabled kind: Boolean default_value: false + optional: false description: "Whether multi-factor authentication is enabled" order_weight: 1500 relationships: @@ -109,5 +113,6 @@ extensions: peer: UserAccount kind: Component cardinality: many + optional: true description: "List of Accounts under this organization" order_weight: 1600 diff --git a/extensions/vlan/vlan.yml b/extensions/vlan/vlan.yml index 694321f..258eb11 100644 --- a/extensions/vlan/vlan.yml +++ b/extensions/vlan/vlan.yml @@ -21,6 +21,7 @@ generics: attributes: - name: name kind: Text + optional: false order_weight: 1000 - name: description kind: Text @@ -28,6 +29,7 @@ generics: order_weight: 1100 - name: vlan_id kind: Number + optional: false order_weight: 1050 - name: status kind: Dropdown @@ -113,6 +115,7 @@ nodes: - name: name kind: Text unique: true + optional: false order_weight: 1000 - name: description kind: Text diff --git a/extensions/vrf/vrf.yml b/extensions/vrf/vrf.yml index 0050ab9..508ae53 100644 --- a/extensions/vrf/vrf.yml +++ b/extensions/vrf/vrf.yml @@ -83,6 +83,7 @@ nodes: - name: name kind: Text unique: true + optional: false order_weight: 1000 - name: description kind: Text diff --git a/extensions/vrrp/vrrp.yml b/extensions/vrrp/vrrp.yml index a8e459b..50c8bcf 100644 --- a/extensions/vrrp/vrrp.yml +++ b/extensions/vrrp/vrrp.yml @@ -24,6 +24,7 @@ nodes: kind: Text label: Name unique: true + optional: false description: Unique name of the entry order_weight: 1000 - name: vrid @@ -32,6 +33,7 @@ nodes: parameters: min_value: 1 max_value: 255 + optional: false description: Virtual Router ID (VRID, should be between 1 and 255) order_weight: 1100 - name: password @@ -56,6 +58,7 @@ nodes: kind: Component cardinality: many on_delete: cascade + optional: true order_weight: 1300 - name: VRRPInterface @@ -76,6 +79,7 @@ nodes: parameters: min_value: 1 max_value: 255 + optional: false description: VRRP Priority (Should be between 1 and 255) order_weight: 1100 relationships: @@ -105,6 +109,7 @@ extensions: label: VRRP kind: Component cardinality: one + optional: true description: VRRP Interface Configuration order_weight: 1650 - kind: IpamIPAddress @@ -114,5 +119,6 @@ extensions: label: VRRP Group kind: Attribute cardinality: one + optional: true description: Part of VRRP Group order_weight: 1700 From 0793d6ce2eae79344a53ef6c176f3bac8ab62722 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 18:45:19 +0200 Subject: [PATCH 44/68] feat: state menu intent explicitly and give routing nodes a menu path CC-9 has two halves: the menu intent of every node and generic is written in the file, and every concrete node is reachable from the menu. Both land here, because the routing fix is made of the same keys. include_in_menu written out (50 nodes and generics) Every definition in base/ and extensions/ now states include_in_menu. The 50 that relied on the default gain `include_in_menu: true`, the value they already resolve to, so users can read the menu shape out of the files and later move it to a menu.yml. experimental/ is out of scope per the tier rule. Menu placement (CC-3, both live-tested against 1.11.0 on :55000 earlier) - IpamAggregate moves from menu_placement OrganizationRIR to BuiltinIPAM, where an IPAM object belongs - OrganizationRIR gains menu_placement OrganizationGeneric, matching Manufacturer and Provider Routing menu path (RPOL-CC9) Ten concrete routing nodes were hidden with no menu_placement and no visible generic to reach them. Three of them inherit neither routing generic, so making the generics visible is not enough on its own. The fix is this repo's own dominant shape, used by SFP, location, organization, SNMP, patch panel and OADM: a visible generic root plus explicit menu_placement on every concrete node. - RoutingProtocol becomes visible and is relabelled from "Protocol" to "Routing Protocol", which is what a sidebar root has to say - RoutingPolicy becomes visible and gains the label "Routing Policy" it never had - menu_placement RoutingProtocol on RoutingAggregateRoute, RoutingOSPF and RoutingPIM; RoutingOSPFInterface under RoutingOSPF and RoutingPIMInterface under RoutingPIM; RoutingBGPRRCluster under the existing RoutingBGPSession root; the four RoutingPolicy flavours under RoutingPolicy The sidebar grows by two collapsed top-level entries, not by ten. Every placement target sits in the node's own declared dependency closure, so no extension can produce a dangling menu_placement. 35 files. Co-Authored-By: Claude Fable 5 --- base/dcim.yml | 3 +++ extensions/aggregate/aggregate.yml | 3 ++- extensions/cable/cable.yml | 1 + extensions/circuit/circuit.yml | 2 ++ extensions/circuit_contract/circuit_contract.yml | 1 + extensions/compute/compute.yml | 1 + extensions/cross_connect/cross_connect.yml | 1 + extensions/device_module/device_module.yml | 3 +++ extensions/dwdm/dwdm.yml | 6 ++++++ extensions/hosting_cluster/hosting_cluster.yml | 1 + extensions/location_minimal/location_minimal.yml | 3 +++ extensions/location_site/location_site.yml | 1 + extensions/mlag/mlag.yml | 1 + extensions/patch_panel/patch_panel.yml | 4 ++++ extensions/peering_ixp/peering_ixp.yml | 2 ++ extensions/physical_disk/physical_disk.yml | 1 + extensions/rack/rack.yml | 1 + extensions/routing/routing.yml | 4 ++-- extensions/routing_aggregate/aggregate.yml | 3 ++- extensions/routing_bgp/bgp.yml | 3 +++ extensions/routing_bgp_community/bgp_community.yml | 1 + extensions/routing_bgp_rr/bgp_rr.yml | 3 ++- extensions/routing_ospf/ospf.yml | 6 ++++-- extensions/routing_pim/pim.yml | 6 ++++-- extensions/routing_policies/routing_policies.yml | 3 ++- .../routing_policies_aggregate.yml | 3 ++- extensions/routing_policies_bgp/routing_policies_bgp.yml | 3 ++- extensions/routing_policies_ospf/routing_policies_ospf.yml | 3 ++- extensions/routing_policies_pim/routing_policies_pim.yml | 3 ++- extensions/sfp/sfp.yml | 2 ++ extensions/snmp/snmp.yml | 4 ++++ extensions/users/users.yml | 2 ++ extensions/vlan/vlan.yml | 2 ++ extensions/vrf/vrf.yml | 2 ++ extensions/vrrp/vrrp.yml | 2 ++ 35 files changed, 76 insertions(+), 14 deletions(-) diff --git a/base/dcim.yml b/base/dcim.yml index 6ffcc9d..cb8906f 100644 --- a/base/dcim.yml +++ b/base/dcim.yml @@ -307,6 +307,7 @@ nodes: description: A model of device label: Device Type icon: mdi:poll + include_in_menu: true menu_placement: DcimDevice human_friendly_id: - name__value @@ -359,6 +360,7 @@ nodes: description: A Platform represent the type of software running on a device. label: Platform icon: mdi:application-cog-outline + include_in_menu: true menu_placement: DcimDevice human_friendly_id: - name__value @@ -396,6 +398,7 @@ nodes: description: A configurable network device including routers, switches... label: Network Device icon: clarity:network-switch-solid + include_in_menu: true inherit_from: - CoreArtifactTarget - DcimGenericDevice diff --git a/extensions/aggregate/aggregate.yml b/extensions/aggregate/aggregate.yml index 01cee73..9a8b4d5 100644 --- a/extensions/aggregate/aggregate.yml +++ b/extensions/aggregate/aggregate.yml @@ -14,7 +14,7 @@ nodes: label: Aggregate icon: mdi:ip-network include_in_menu: true - menu_placement: OrganizationRIR + menu_placement: BuiltinIPAM inherit_from: - BuiltinIPPrefix human_friendly_id: @@ -52,6 +52,7 @@ nodes: label: RIR icon: mdi:certificate include_in_menu: true + menu_placement: OrganizationGeneric inherit_from: - OrganizationGeneric attributes: diff --git a/extensions/cable/cable.yml b/extensions/cable/cable.yml index 21882a5..d0b2e1c 100644 --- a/extensions/cable/cable.yml +++ b/extensions/cable/cable.yml @@ -13,6 +13,7 @@ nodes: description: Physical cable connecting two endpoints label: Cable icon: mdi:cable-data + include_in_menu: true menu_placement: DcimDevice inherit_from: - DcimConnector diff --git a/extensions/circuit/circuit.yml b/extensions/circuit/circuit.yml index 83edd0d..038fc98 100644 --- a/extensions/circuit/circuit.yml +++ b/extensions/circuit/circuit.yml @@ -14,6 +14,7 @@ nodes: description: A Circuit represent service operated by a provider. label: Circuit icon: mdi:cable-data + include_in_menu: true human_friendly_id: - circuit_id__value order_by: @@ -106,6 +107,7 @@ nodes: position, cross-connect ID). label: Circuit Endpoint icon: mdi:ethernet + include_in_menu: true menu_placement: DcimCircuit inherit_from: - DcimEndpoint diff --git a/extensions/circuit_contract/circuit_contract.yml b/extensions/circuit_contract/circuit_contract.yml index 9d76058..e9baf67 100644 --- a/extensions/circuit_contract/circuit_contract.yml +++ b/extensions/circuit_contract/circuit_contract.yml @@ -12,6 +12,7 @@ nodes: description: A contract document associated with a circuit service, including terms, costs, and validity period. label: Circuit Contract icon: mdi:file-sign + include_in_menu: true menu_placement: DcimCircuit inherit_from: - CoreFileObject diff --git a/extensions/compute/compute.yml b/extensions/compute/compute.yml index b5de72b..709babf 100644 --- a/extensions/compute/compute.yml +++ b/extensions/compute/compute.yml @@ -33,6 +33,7 @@ nodes: description: A physical server with fixed resources and specific hardware characteristics. label: Physical Server icon: mdi:server + include_in_menu: true menu_placement: ComputeGenericUnit inherit_from: - ComputeGenericUnit diff --git a/extensions/cross_connect/cross_connect.yml b/extensions/cross_connect/cross_connect.yml index f29d629..6956ddf 100644 --- a/extensions/cross_connect/cross_connect.yml +++ b/extensions/cross_connect/cross_connect.yml @@ -13,6 +13,7 @@ nodes: description: Cross-connect between different endpoints within a datacenter. label: Cross-Connect icon: streamline:arrow-crossover-right-solid + include_in_menu: true inherit_from: - DcimConnector human_friendly_id: diff --git a/extensions/device_module/device_module.yml b/extensions/device_module/device_module.yml index b96fe99..c6e15e5 100644 --- a/extensions/device_module/device_module.yml +++ b/extensions/device_module/device_module.yml @@ -14,6 +14,7 @@ generics: description: "A generic module, such as a Linecard or Routing Engine, installed in a module bay." label: "Module" icon: mdi:expansion-card + include_in_menu: true human_friendly_id: - computed_name__value display_label: computed_name__value @@ -55,6 +56,7 @@ generics: description: "A generic module type, with common specifications like part number and manufacturer." label: "Module Type" icon: mdi:database-cog + include_in_menu: true menu_placement: DcimGenericModule human_friendly_id: - name__value @@ -98,6 +100,7 @@ nodes: description: "A physical bay on a device that can receive a module." label: "Module Bay" icon: mdi:tray + include_in_menu: true menu_placement: DcimDevice human_friendly_id: - computed_name__value diff --git a/extensions/dwdm/dwdm.yml b/extensions/dwdm/dwdm.yml index f330767..e290554 100644 --- a/extensions/dwdm/dwdm.yml +++ b/extensions/dwdm/dwdm.yml @@ -13,6 +13,7 @@ generics: description: Generic interface of an optical add-drop multiplexer, front or rear. label: Optical Multiplexer Interfaces icon: mdi:ethernet + include_in_menu: true menu_placement: DcimOpticalMultiplexer attributes: - name: name @@ -123,6 +124,7 @@ nodes: (Wavelength Division Multiplexing) technologies. label: Optical Multiplexer icon: mdi:transit-connection-variant + include_in_menu: true inherit_from: - DcimPhysicalDevice human_friendly_id: @@ -175,6 +177,7 @@ nodes: namespace: Dcim description: Client-side interface of an optical add-drop multiplexer, carrying a single channel. label: Optical Multiplexer Front Interfaces + include_in_menu: true menu_placement: DcimGenericOadmInterface inherit_from: - DcimEndpoint @@ -208,6 +211,7 @@ nodes: namespace: Dcim description: Line-side interface of an optical add-drop multiplexer, carrying the multiplexed signal. label: Optical Multiplexer Rear Interfaces + include_in_menu: true menu_placement: DcimGenericOadmInterface inherit_from: - DcimEndpoint @@ -235,6 +239,7 @@ nodes: description: A WDM channel with its wavelength and frequency. label: WDM Channel icon: game-icons:laser-warning + include_in_menu: true human_friendly_id: - wdm_type__value - channel__value @@ -287,6 +292,7 @@ nodes: description: SFP with configuration for Wavelength Division Multiplexing. label: WDM SFP icon: mdi:laser-pointer + include_in_menu: true menu_placement: DcimGenericSFP inherit_from: - DcimGenericSFP diff --git a/extensions/hosting_cluster/hosting_cluster.yml b/extensions/hosting_cluster/hosting_cluster.yml index 5f6993b..1c8b4c0 100644 --- a/extensions/hosting_cluster/hosting_cluster.yml +++ b/extensions/hosting_cluster/hosting_cluster.yml @@ -13,6 +13,7 @@ nodes: description: A cluster hosting virtual machines. label: Hosting Cluster icon: mdi:dots-hexagon + include_in_menu: true menu_placement: ComputeGenericUnit inherit_from: - ClusterGeneric diff --git a/extensions/location_minimal/location_minimal.yml b/extensions/location_minimal/location_minimal.yml index b8c0852..0805fe1 100644 --- a/extensions/location_minimal/location_minimal.yml +++ b/extensions/location_minimal/location_minimal.yml @@ -14,6 +14,7 @@ nodes: description: A geographical region grouping countries and sites. label: Region icon: carbon:cics-region-target + include_in_menu: true menu_placement: LocationGeneric inherit_from: - LocationGeneric @@ -26,6 +27,7 @@ nodes: description: A country, sitting between a region and the sites it contains. label: Country icon: gis:search-country + include_in_menu: true menu_placement: LocationGeneric inherit_from: - LocationGeneric @@ -37,6 +39,7 @@ nodes: description: A physical location hosting equipment, such as a data center or an office. label: Site icon: ri:building-line + include_in_menu: true menu_placement: LocationGeneric inherit_from: - LocationGeneric diff --git a/extensions/location_site/location_site.yml b/extensions/location_site/location_site.yml index c636590..b6709dd 100644 --- a/extensions/location_site/location_site.yml +++ b/extensions/location_site/location_site.yml @@ -14,6 +14,7 @@ nodes: description: A physical location hosting equipment, such as a data center or an office. label: Site icon: ri:building-line + include_in_menu: true menu_placement: LocationGeneric inherit_from: - LocationGeneric diff --git a/extensions/mlag/mlag.yml b/extensions/mlag/mlag.yml index 5bb2143..749c74d 100644 --- a/extensions/mlag/mlag.yml +++ b/extensions/mlag/mlag.yml @@ -155,6 +155,7 @@ nodes: description: "MLAG (Multi-Chassis Link Aggregation Group) Domain" label: MLAG Domain icon: mingcute:cloud-line + include_in_menu: true inherit_from: - GenericMlagDomain relationships: diff --git a/extensions/patch_panel/patch_panel.yml b/extensions/patch_panel/patch_panel.yml index a836958..09ff5f7 100644 --- a/extensions/patch_panel/patch_panel.yml +++ b/extensions/patch_panel/patch_panel.yml @@ -13,6 +13,7 @@ generics: description: Generic interface of a patch panel, front or rear. label: Patch Panel Interfaces icon: mdi:ethernet + include_in_menu: true menu_placement: DcimPatchPanel attributes: - name: name @@ -122,6 +123,7 @@ nodes: description: A Patch Panel used for managing network cable connections in a data center or telecom setup. label: Patch Panel icon: ic:round-device-hub + include_in_menu: true inherit_from: - DcimPhysicalDevice human_friendly_id: @@ -165,6 +167,7 @@ nodes: namespace: Dcim description: Front interface of a patch panel, where equipment is patched in. label: Patch Panel Front Interfaces + include_in_menu: true menu_placement: DcimGenericPatchPanelInterface inherit_from: - DcimEndpoint @@ -198,6 +201,7 @@ nodes: namespace: Dcim description: Rear interface of a patch panel, terminating the permanent cabling. label: Patch Panel Rear Interfaces + include_in_menu: true menu_placement: DcimGenericPatchPanelInterface inherit_from: - DcimEndpoint diff --git a/extensions/peering_ixp/peering_ixp.yml b/extensions/peering_ixp/peering_ixp.yml index 21aa6f5..39386dc 100644 --- a/extensions/peering_ixp/peering_ixp.yml +++ b/extensions/peering_ixp/peering_ixp.yml @@ -12,6 +12,7 @@ nodes: description: "An Internet Exchange Point (IXP) for peering" label: "Internet Exchange" icon: "mdi:network" + include_in_menu: true human_friendly_id: - "name__value" order_by: @@ -95,6 +96,7 @@ nodes: description: "A connection to an Internet Exchange Point (IXP)" label: "IXP Connection" icon: "mdi:lan-connect" + include_in_menu: true menu_placement: PeeringIXP human_friendly_id: - "name__value" diff --git a/extensions/physical_disk/physical_disk.yml b/extensions/physical_disk/physical_disk.yml index 68a4e3c..48a771c 100644 --- a/extensions/physical_disk/physical_disk.yml +++ b/extensions/physical_disk/physical_disk.yml @@ -32,6 +32,7 @@ nodes: description: Physical Disk label: Physical Disk icon: carbon:vmdk-disk + include_in_menu: true human_friendly_id: - device__name__value - name__value diff --git a/extensions/rack/rack.yml b/extensions/rack/rack.yml index 1e4a467..1249a6a 100644 --- a/extensions/rack/rack.yml +++ b/extensions/rack/rack.yml @@ -14,6 +14,7 @@ nodes: description: A physical equipment rack installed at a site. label: Rack icon: clarity:rack-server-line + include_in_menu: true menu_placement: LocationGeneric inherit_from: - LocationHosting diff --git a/extensions/routing/routing.yml b/extensions/routing/routing.yml index d95e0b1..9c7439a 100644 --- a/extensions/routing/routing.yml +++ b/extensions/routing/routing.yml @@ -11,9 +11,9 @@ generics: - name: Protocol namespace: Routing description: "Generic protocol model for routing protocols" - label: "Protocol" + label: "Routing Protocol" icon: "carbon:router" - include_in_menu: false + include_in_menu: true attributes: # TODO: Should be computed later - name: description diff --git a/extensions/routing_aggregate/aggregate.yml b/extensions/routing_aggregate/aggregate.yml index c17b4fb..62ea3c8 100644 --- a/extensions/routing_aggregate/aggregate.yml +++ b/extensions/routing_aggregate/aggregate.yml @@ -13,7 +13,8 @@ nodes: description: "Aggregate Protocol with action and BGP communities" label: "Aggregate Routes" icon: "grommet-icons:aggregate" - include_in_menu: false + include_in_menu: true + menu_placement: RoutingProtocol inherit_from: - "RoutingProtocol" attributes: diff --git a/extensions/routing_bgp/bgp.yml b/extensions/routing_bgp/bgp.yml index 5d33441..181235e 100644 --- a/extensions/routing_bgp/bgp.yml +++ b/extensions/routing_bgp/bgp.yml @@ -13,6 +13,7 @@ nodes: description: An Autonomous System (AS) is a set of Internet routable IP prefixes belonging to a network label: Autonomous System icon: mdi:bank-circle-outline + include_in_menu: true menu_placement: RoutingBGPSession human_friendly_id: - "asn__value" @@ -64,6 +65,7 @@ nodes: description: A BGP Peer Group is used to regroup parameters that are shared across multiple peers label: BGP Peer Group icon: mdi:view-grid-plus-outline + include_in_menu: true menu_placement: RoutingBGPSession inherit_from: - "RoutingProtocol" @@ -143,6 +145,7 @@ nodes: description: A BGP Session represent a point to point connection between two routers label: BGP Session icon: mdi:router + include_in_menu: true inherit_from: - "RoutingProtocol" order_by: diff --git a/extensions/routing_bgp_community/bgp_community.yml b/extensions/routing_bgp_community/bgp_community.yml index 3a58e22..458e4f7 100644 --- a/extensions/routing_bgp_community/bgp_community.yml +++ b/extensions/routing_bgp_community/bgp_community.yml @@ -13,6 +13,7 @@ nodes: description: "Defines a BGP community." label: "BGP Community" icon: iconoir:community + include_in_menu: true human_friendly_id: - name__value order_by: diff --git a/extensions/routing_bgp_rr/bgp_rr.yml b/extensions/routing_bgp_rr/bgp_rr.yml index 0c97d88..408e4e6 100644 --- a/extensions/routing_bgp_rr/bgp_rr.yml +++ b/extensions/routing_bgp_rr/bgp_rr.yml @@ -13,7 +13,8 @@ nodes: description: "A Route Reflector (RR) Cluster used for grouping internal peers" label: "Route Reflector Cluster" icon: "mdi:router-network" - include_in_menu: false + include_in_menu: true + menu_placement: RoutingBGPSession human_friendly_id: - name__value display_label: name__value diff --git a/extensions/routing_ospf/ospf.yml b/extensions/routing_ospf/ospf.yml index 70323bd..c73efe0 100644 --- a/extensions/routing_ospf/ospf.yml +++ b/extensions/routing_ospf/ospf.yml @@ -13,7 +13,8 @@ nodes: description: "OSPF (Open Shortest Path First) instance on a Virtual Router." label: "OSPF" icon: "mdi:network-outline" - include_in_menu: false + include_in_menu: true + menu_placement: RoutingProtocol inherit_from: - "RoutingProtocol" human_friendly_id: @@ -78,7 +79,8 @@ nodes: description: "Pivot table linking OSPF configuration to an interface." label: "OSPF Interface" icon: "mdi:ethernet" - include_in_menu: false + include_in_menu: true + menu_placement: RoutingOSPF human_friendly_id: - "description__value" order_by: diff --git a/extensions/routing_pim/pim.yml b/extensions/routing_pim/pim.yml index 23d8073..1af4380 100644 --- a/extensions/routing_pim/pim.yml +++ b/extensions/routing_pim/pim.yml @@ -13,7 +13,8 @@ nodes: description: "Protocol Independent Multicast (PIM) instance on a Virtual Router." label: "PIM" icon: "mdi:network-outline" - include_in_menu: false + include_in_menu: true + menu_placement: RoutingProtocol inherit_from: - "RoutingProtocol" human_friendly_id: @@ -62,7 +63,8 @@ nodes: description: "Interface configuration for PIM." label: "PIM Interface" icon: "mdi:ethernet" - include_in_menu: false + include_in_menu: true + menu_placement: RoutingPIM human_friendly_id: - "description__value" order_by: diff --git a/extensions/routing_policies/routing_policies.yml b/extensions/routing_policies/routing_policies.yml index c00a06e..953c598 100644 --- a/extensions/routing_policies/routing_policies.yml +++ b/extensions/routing_policies/routing_policies.yml @@ -11,8 +11,9 @@ generics: - name: Policy namespace: Routing description: "Policy defining the rules for routing traffic in a network." + label: "Routing Policy" icon: carbon:deployment-policy - include_in_menu: false + include_in_menu: true human_friendly_id: - "name__value" order_by: diff --git a/extensions/routing_policies_aggregate/routing_policies_aggregate.yml b/extensions/routing_policies_aggregate/routing_policies_aggregate.yml index c2862e7..f3bf5a7 100644 --- a/extensions/routing_policies_aggregate/routing_policies_aggregate.yml +++ b/extensions/routing_policies_aggregate/routing_policies_aggregate.yml @@ -13,7 +13,8 @@ nodes: description: A routing policy for Aggregate. label: Aggregate Routing Policies icon: carbon:deployment-policy - include_in_menu: false + include_in_menu: true + menu_placement: RoutingPolicy inherit_from: - "RoutingPolicy" # Add attributes here if this policy flavour needs more than the generic RoutingPolicy provides. diff --git a/extensions/routing_policies_bgp/routing_policies_bgp.yml b/extensions/routing_policies_bgp/routing_policies_bgp.yml index 50789ae..599228c 100644 --- a/extensions/routing_policies_bgp/routing_policies_bgp.yml +++ b/extensions/routing_policies_bgp/routing_policies_bgp.yml @@ -13,7 +13,8 @@ nodes: description: A routing policy for BGP. label: BGP Routing Policies icon: carbon:deployment-policy - include_in_menu: false + include_in_menu: true + menu_placement: RoutingPolicy inherit_from: - "RoutingPolicy" # Add attributes here if this policy flavour needs more than the generic RoutingPolicy provides. diff --git a/extensions/routing_policies_ospf/routing_policies_ospf.yml b/extensions/routing_policies_ospf/routing_policies_ospf.yml index c5580f3..40e8518 100644 --- a/extensions/routing_policies_ospf/routing_policies_ospf.yml +++ b/extensions/routing_policies_ospf/routing_policies_ospf.yml @@ -13,7 +13,8 @@ nodes: description: A routing policy for OSPF. label: OSPF Routing Policies icon: carbon:deployment-policy - include_in_menu: false + include_in_menu: true + menu_placement: RoutingPolicy inherit_from: - "RoutingPolicy" # Add attributes here if this policy flavour needs more than the generic RoutingPolicy provides. diff --git a/extensions/routing_policies_pim/routing_policies_pim.yml b/extensions/routing_policies_pim/routing_policies_pim.yml index 9c512d0..91df60b 100644 --- a/extensions/routing_policies_pim/routing_policies_pim.yml +++ b/extensions/routing_policies_pim/routing_policies_pim.yml @@ -13,7 +13,8 @@ nodes: description: A routing policy for PIM. label: PIM Routing Policies icon: carbon:deployment-policy - include_in_menu: false + include_in_menu: true + menu_placement: RoutingPolicy inherit_from: - "RoutingPolicy" # Add attributes here if this policy flavour needs more than the generic RoutingPolicy provides. diff --git a/extensions/sfp/sfp.yml b/extensions/sfp/sfp.yml index a2afc11..c5f6bef 100644 --- a/extensions/sfp/sfp.yml +++ b/extensions/sfp/sfp.yml @@ -156,6 +156,7 @@ nodes: description: Standard SFP module for various types (e.g., LR, SR, T). label: Standard SFP icon: mdi:gpu + include_in_menu: true menu_placement: DcimGenericSFP inherit_from: - DcimGenericSFP @@ -165,6 +166,7 @@ nodes: description: "Bidirectional SFP supporting two wavelengths for single-fiber operation." label: Bidirectional SFP icon: lineicons:arrow-both-direction-vertical-1 + include_in_menu: true menu_placement: DcimGenericSFP inherit_from: - DcimGenericSFP diff --git a/extensions/snmp/snmp.yml b/extensions/snmp/snmp.yml index fbbc919..f3da930 100644 --- a/extensions/snmp/snmp.yml +++ b/extensions/snmp/snmp.yml @@ -13,6 +13,7 @@ generics: description: Generic model for SNMP community configurations. label: SNMP Community icon: iconoir:community + include_in_menu: true human_friendly_id: - name__value order_by: @@ -52,6 +53,7 @@ nodes: description: SNMP v1/v2c community configuration. label: SNMP v1/v2c icon: iconoir:community + include_in_menu: true menu_placement: SnmpCommunity inherit_from: - SnmpCommunity @@ -82,6 +84,7 @@ nodes: description: SNMP version 3 configuration with enhanced security. label: SNMP v3 icon: iconoir:community + include_in_menu: true menu_placement: SnmpCommunity inherit_from: - SnmpCommunity @@ -156,6 +159,7 @@ nodes: description: Represents an SNMP client that interacts with SNMP Community. label: SNMP Client icon: ph:user-list-light + include_in_menu: true menu_placement: SnmpCommunity human_friendly_id: - name__value diff --git a/extensions/users/users.yml b/extensions/users/users.yml index 2139c17..1f40f41 100644 --- a/extensions/users/users.yml +++ b/extensions/users/users.yml @@ -13,6 +13,7 @@ nodes: description: "User Group" label: "User Groups" icon: "iconoir:group" + include_in_menu: true human_friendly_id: - "name__value" order_by: @@ -56,6 +57,7 @@ nodes: description: "User login and authentication" label: "User Account" icon: "mdi:account-key" + include_in_menu: true human_friendly_id: - "name__value" order_by: diff --git a/extensions/vlan/vlan.yml b/extensions/vlan/vlan.yml index 258eb11..29d6d15 100644 --- a/extensions/vlan/vlan.yml +++ b/extensions/vlan/vlan.yml @@ -13,6 +13,7 @@ generics: description: A VLAN is an isolated layer two domain. label: VLAN icon: mdi:lan-pending + include_in_menu: true human_friendly_id: - name__value order_by: @@ -107,6 +108,7 @@ nodes: description: A VLAN group scopes VLANs to a domain (site, rack, etc.). label: VLAN Group icon: mdi:domain-switch + include_in_menu: true menu_placement: IpamGenericVLAN human_friendly_id: - name__value diff --git a/extensions/vrf/vrf.yml b/extensions/vrf/vrf.yml index 508ae53..45cc0af 100644 --- a/extensions/vrf/vrf.yml +++ b/extensions/vrf/vrf.yml @@ -13,6 +13,7 @@ nodes: description: A VRF is an isolated layer three domain. label: VRF icon: mdi:router + include_in_menu: true human_friendly_id: - name__value order_by: @@ -72,6 +73,7 @@ nodes: description: Route Target (RFC 4360) label: Route Target icon: mdi:target + include_in_menu: true menu_placement: IpamVRF human_friendly_id: - name__value diff --git a/extensions/vrrp/vrrp.yml b/extensions/vrrp/vrrp.yml index 50c8bcf..f274ee8 100644 --- a/extensions/vrrp/vrrp.yml +++ b/extensions/vrrp/vrrp.yml @@ -13,6 +13,7 @@ nodes: description: VRRP Group configuration label: VRRP Group icon: fluent:virtual-network-20-filled + include_in_menu: true human_friendly_id: - name__value order_by: @@ -66,6 +67,7 @@ nodes: description: VRRP Interface configuration label: VRRP Interface icon: carbon:interface-usage + include_in_menu: true menu_placement: NetworkVRRPGroup order_by: - priority__value From a1dfcbcc91612c2292d283d7627919f63907e51e Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 18:47:37 +0200 Subject: [PATCH 45/68] fix(routing_bgp): make RoutingBGPSession.role optional Packet BGP-* / checklist CC-6: role is optional with no default value, and RoutingBGPSession.role is the attribute the rule was written against. The explicit-optional sweep only recorded the current effective value, so the semantic flip is made here on its own. Co-Authored-By: Claude Fable 5 --- extensions/routing_bgp/bgp.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/routing_bgp/bgp.yml b/extensions/routing_bgp/bgp.yml index 181235e..3517c61 100644 --- a/extensions/routing_bgp/bgp.yml +++ b/extensions/routing_bgp/bgp.yml @@ -187,7 +187,7 @@ nodes: label: Peering description: "Connect with other networks via IX." color: "#E6E6FA" # lavender - optional: false + optional: true description: "Role of the BGP Session" order_weight: 1300 - name: local_pref From 3951058ecf9043bf1b51b01b1c5cbc88344cd60d Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 18:52:20 +0200 Subject: [PATCH 46/68] fix(objects): unquote DcimModuleBay positions Packet MOD-04 (parked objects finding, review brief item a): the schema commit turned DcimModuleBay.position into a Number with min_value 1, but the mock data still carried "1"/"2"/"3" as quoted strings, which load as Text. The PSU bays already used unquoted 4/5 and are unchanged. Co-Authored-By: Claude Fable 5 --- objects/extensions/device_module/device_module.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/objects/extensions/device_module/device_module.yml b/objects/extensions/device_module/device_module.yml index 0d81463..7dee255 100644 --- a/objects/extensions/device_module/device_module.yml +++ b/objects/extensions/device_module/device_module.yml @@ -41,7 +41,7 @@ spec: # match the existing nyc1-rtr01 fixture exactly, so this upserts/matches # it instead of creating a duplicate. - name: "slot 1" - position: "1" + position: 1 description: "Primary route processor slot." device: &nyc1_rtr01 kind: DcimDevice @@ -54,12 +54,12 @@ spec: site: NYC1 - name: "slot 2" - position: "2" + position: 2 description: "Secondary route processor slot." device: *nyc1_rtr01 - name: "fan tray 1" - position: "3" + position: 3 description: "Fan tray slot." device: *nyc1_rtr01 From 36cd64fdc2b2feadcc6e0d71cbd4a3f4738017f1 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 18:52:29 +0200 Subject: [PATCH 47/68] fix(objects): reference cardinality-many peers by HFID list Parked objects finding (review brief item b): on infrahub-sdk 1.17.0 a bare string in a cardinality-many relationship list is sent as a node ID, not as a human_friendly_id, so every one of these references failed to resolve. An HFID is always a list of its parts, so single-part ones are wrapped in a list too. The comments that asserted flat strings were enough are corrected with them. Co-Authored-By: Claude Fable 5 --- .../hosting_cluster/hosting_cluster.yml | 9 +++++---- objects/extensions/mlag/mlag.yml | 13 +++++++------ objects/extensions/peering_ixp/peering_ixp.yml | 9 +++++---- objects/extensions/routing_bgp/routing_bgp.yml | 4 ++-- .../routing_policies_bgp/routing_policies_bgp.yml | 12 +++++++----- .../routing_policies_ospf.yml | 10 ++++++---- .../routing_policies_pim/routing_policies_pim.yml | 12 +++++++----- objects/extensions/vrf/vrf.yml | 15 ++++++++------- 8 files changed, 47 insertions(+), 37 deletions(-) diff --git a/objects/extensions/hosting_cluster/hosting_cluster.yml b/objects/extensions/hosting_cluster/hosting_cluster.yml index 7ab17ed..494f6f8 100644 --- a/objects/extensions/hosting_cluster/hosting_cluster.yml +++ b/objects/extensions/hosting_cluster/hosting_cluster.yml @@ -49,10 +49,11 @@ spec: technology: vmware status: active # `locations` is cardinality many (a cluster can span locations), and - # LocationGeneric is a Generic -- a flat list of HFID strings works - # against the existing LocationSite. + # LocationGeneric is a Generic -- each entry is a human_friendly_id, and + # an HFID is always a list of its parts, so the single-part site name is + # wrapped in a list. A bare string there is read as a node ID. locations: - - SJC1 + - [SJC1] # `nodes` is cardinality many, and ComputeGenericUnit is a Generic -- # a flat list of HFID strings is not enough (the peer schema can't be # resolved), so specify the concrete kind with a list of upsert specs. @@ -74,7 +75,7 @@ spec: technology: kvm status: active locations: - - NYC1 + - [NYC1] nodes: kind: ComputePhysicalServer data: diff --git a/objects/extensions/mlag/mlag.yml b/objects/extensions/mlag/mlag.yml index faa538a..73eefc8 100644 --- a/objects/extensions/mlag/mlag.yml +++ b/objects/extensions/mlag/mlag.yml @@ -23,10 +23,11 @@ # extensions/rack nests InterfacePhysical under DcimDevice.interfaces. # # peer_links (peer InterfaceLag, concrete kind, cardinality many) and peers -# (peer DcimDevice, concrete kind, cardinality many) both use flat lists of -# human_friendly_id refs -- InterfaceLag's HFID is a 2-part -# [device__name__value, name__value] list, DcimDevice's HFID is just -# name__value. +# (peer DcimDevice, concrete kind, cardinality many) are both lists of +# human_friendly_id refs, and every HFID is itself a list of its parts: +# InterfaceLag's is the 2-part [device__name__value, name__value], DcimDevice's +# is the 1-part [name__value]. A bare string there is read as a node ID, so the +# single-part HFID is wrapped in a list too. # --------------------------------------------------------------------------- --- apiVersion: infrahub.app/v1 @@ -120,8 +121,8 @@ spec: - domain_id: "NYC1-MLAG-01" reload_delay: 300 peers: - - "nyc1-rtr01" - - "nyc1-rtr02" + - ["nyc1-rtr01"] + - ["nyc1-rtr02"] peer_links: - ["nyc1-rtr01", "Bundle-Ether1"] - ["nyc1-rtr02", "Bundle-Ether1"] diff --git a/objects/extensions/peering_ixp/peering_ixp.yml b/objects/extensions/peering_ixp/peering_ixp.yml index 056f0ee..a2b5807 100644 --- a/objects/extensions/peering_ixp/peering_ixp.yml +++ b/objects/extensions/peering_ixp/peering_ixp.yml @@ -18,7 +18,8 @@ # string. import_policies/export_policies (cardinality many, peer # RoutingPolicyBGP -- concrete, HFID name__value) and bgp_communities # (cardinality many, peer RoutingBGPCommunity -- concrete, HFID name__value) -# are flat lists of HFID scalars. +# are lists of HFIDs, and an HFID is always a list of its parts -- so each +# single-part entry is itself a one-element list, not a bare string. # # PeeringIXPConnection's human_friendly_id is also just `name__value`. # internet_exchange_point (Parent, cardinality one, mandatory) references @@ -47,11 +48,11 @@ spec: - "65000" - NYC1-BACKBONE-AS import_policies: - - CUST-A-IMPORT-PREFER-CUSTOMER + - [CUST-A-IMPORT-PREFER-CUSTOMER] export_policies: - - CUST-A-EXPORT-DEFAULT-ROUTE + - [CUST-A-EXPORT-DEFAULT-ROUTE] bgp_communities: - - NO-EXPORT + - [NO-EXPORT] - name: SJC1-IX description: "San Jose area internet exchange point serving the SJC1 site." diff --git a/objects/extensions/routing_bgp/routing_bgp.yml b/objects/extensions/routing_bgp/routing_bgp.yml index 743b580..208d904 100644 --- a/objects/extensions/routing_bgp/routing_bgp.yml +++ b/objects/extensions/routing_bgp/routing_bgp.yml @@ -50,8 +50,8 @@ spec: organization: "Acme Networks" location: "NYC1" devices: - - nyc1-rtr01 - - nyc1-rtr02 + - ["nyc1-rtr01"] + - ["nyc1-rtr02"] - asn: 65001 name: CUSTOMER-A-AS diff --git a/objects/extensions/routing_policies_bgp/routing_policies_bgp.yml b/objects/extensions/routing_policies_bgp/routing_policies_bgp.yml index 667bac4..54d0da4 100644 --- a/objects/extensions/routing_policies_bgp/routing_policies_bgp.yml +++ b/objects/extensions/routing_policies_bgp/routing_policies_bgp.yml @@ -15,8 +15,10 @@ # the RoutingPolicy generic), so it's referenced as a plain scalar string. # # import_routing_policies / export_routing_policies are cardinality-many -# relationships whose peer (RoutingPolicyBGP) is a concrete kind, so they use -# a flat list of HFID scalars rather than the nested kind+data form. +# relationships whose peer (RoutingPolicyBGP) is a concrete kind, so they take +# a list of HFIDs rather than the nested kind+data form. An HFID is always a +# list of its parts, so each single-part entry is a one-element list -- a bare +# string there is read as a node ID. # # The RoutingBGPPeerGroup/RoutingBGPSession upserts below repeat only their # mandatory fields (per convention -- see objects/extensions/routing_bgp for @@ -64,9 +66,9 @@ spec: device: nyc1-rtr01 vrf: CUST-A import_routing_policies: - - CUST-A-IMPORT-PREFER-CUSTOMER + - [CUST-A-IMPORT-PREFER-CUSTOMER] export_routing_policies: - - CUST-A-EXPORT-DEFAULT-ROUTE + - [CUST-A-EXPORT-DEFAULT-ROUTE] --- apiVersion: infrahub.app/v1 @@ -80,4 +82,4 @@ spec: role: upstream vrf: TRANSIT-VRF export_routing_policies: - - TRANSIT-EXPORT-NO-CUSTOMER-ROUTES + - [TRANSIT-EXPORT-NO-CUSTOMER-ROUTES] diff --git a/objects/extensions/routing_policies_ospf/routing_policies_ospf.yml b/objects/extensions/routing_policies_ospf/routing_policies_ospf.yml index 7dc32b3..214a36d 100644 --- a/objects/extensions/routing_policies_ospf/routing_policies_ospf.yml +++ b/objects/extensions/routing_policies_ospf/routing_policies_ospf.yml @@ -24,7 +24,9 @@ # RoutingBGPPeerGroup. This upserts the existing record rather than # creating a duplicate, and adds import_routing_policies/ # export_routing_policies -- both cardinality many with a CONCRETE peer -# (RoutingPolicyOSPF), so they're flat lists of HFID scalars. +# (RoutingPolicyOSPF), so they're lists of HFIDs. An HFID is always a list of +# its parts, so each single-part entry is a one-element list; a bare string +# there is read as a node ID. # --------------------------------------------------------------------------- --- apiVersion: infrahub.app/v1 @@ -62,7 +64,7 @@ spec: vrf: CUST-A version: ospf import_routing_policies: - - CUST-A-OSPF-IMPORT + - [CUST-A-OSPF-IMPORT] export_routing_policies: - - CUST-A-OSPF-EXPORT - - OSPF-DEFAULT-METRIC + - [CUST-A-OSPF-EXPORT] + - [OSPF-DEFAULT-METRIC] diff --git a/objects/extensions/routing_policies_pim/routing_policies_pim.yml b/objects/extensions/routing_policies_pim/routing_policies_pim.yml index 243e927..4bfb8ab 100644 --- a/objects/extensions/routing_policies_pim/routing_policies_pim.yml +++ b/objects/extensions/routing_policies_pim/routing_policies_pim.yml @@ -29,8 +29,10 @@ # mandatory fields it already has (description, status, device, vrf, # dr_priority) plus the two new relationship lists pointing at the policies # below. Peer RoutingPolicyPIM is a CONCRETE kind with a human_friendly_id -# (name__value), so a flat list of name strings is enough for these -# cardinality-many relationships -- no nested kind+data block needed. +# (name__value), so these cardinality-many relationships take a list of HFIDs +# and need no nested kind+data block. An HFID is always a list of its parts, so +# each single-part entry is a one-element list; a bare string is read as a +# node ID instead. # --------------------------------------------------------------------------- --- apiVersion: infrahub.app/v1 @@ -72,7 +74,7 @@ spec: vrf: CUSTOMER-A dr_priority: 100 import_routing_policies: - - PIM-ALLOW-CUSTOMER-A-SOURCES + - [PIM-ALLOW-CUSTOMER-A-SOURCES] export_routing_policies: - - PIM-ALLOW-CUSTOMER-A-RECEIVERS - - PIM-DENY-DEFAULT + - [PIM-ALLOW-CUSTOMER-A-RECEIVERS] + - [PIM-DENY-DEFAULT] diff --git a/objects/extensions/vrf/vrf.yml b/objects/extensions/vrf/vrf.yml index 2c3e58e..b97a4f7 100644 --- a/objects/extensions/vrf/vrf.yml +++ b/objects/extensions/vrf/vrf.yml @@ -27,21 +27,22 @@ spec: description: Customer A dedicated VRF. enforce_unique: true # import_rt/export_rt are cardinality many with a CONCRETE peer - # (IpamRouteTarget), so a flat list of human_friendly_id strings is - # enough -- no nested kind/data block needed. + # (IpamRouteTarget). Every entry is a human_friendly_id, and an HFID is + # always a list of its parts: a bare string is read as a node ID, so even + # a single-part HFID is wrapped in a list of its own. import_rt: - - "65000:100" + - ["65000:100"] export_rt: - - "65000:100" + - ["65000:100"] - name: CUSTOMER-B vrf_rd: "65000:200" description: Customer B VRF, also imports the shared services route target. enforce_unique: true import_rt: - - "65000:100" - - "65000:200" + - ["65000:100"] + - ["65000:200"] export_rt: - - "65000:200" + - ["65000:200"] - name: MGMT-VRF vrf_rd: "65000:999" description: Out-of-band management VRF, isolated with no route targets. From d423b85254eb6d929867a9819dbe7f74960ace16 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 18:52:34 +0200 Subject: [PATCH 48/68] fix(objects): stop circuit restating the location_minimal region tree Parked objects finding (review brief item c): the circuit mock data re-declared the Americas -> United States -> NYC1/SJC1 hierarchy that objects/extensions/location_minimal already owns, and re-upserting a hierarchical root fails. The endpoints now reference the existing sites by LocationHosting's name__value human_friendly_id instead. Co-Authored-By: Claude Fable 5 --- objects/extensions/circuit/circuit.yml | 70 +++++++------------------- 1 file changed, 17 insertions(+), 53 deletions(-) diff --git a/objects/extensions/circuit/circuit.yml b/objects/extensions/circuit/circuit.yml index ce2c70d..526b1ab 100644 --- a/objects/extensions/circuit/circuit.yml +++ b/objects/extensions/circuit/circuit.yml @@ -1,40 +1,17 @@ # --------------------------------------------------------------------------- # Mock data for extensions/circuit. -# Depends on: base. +# Depends on: base, extensions/location_minimal (LocationSite: NYC1, SJC1). # -# NOTE: this file also creates the minimal LocationSite (from -# extensions/location_minimal) and OrganizationProvider (from base) fixtures -# it needs. If those extensions' own object files have already loaded the -# same records (e.g. NYC1, SJC1, Lumen, Colt), this upserts/matches them -# instead of duplicating -- see rule in AGENTS notes about repeating -# mandatory fields for an existing target. +# The sites the endpoints hand off at are owned by +# objects/extensions/location_minimal, which builds them under the Americas -> +# United States hierarchy. They are referenced here by human_friendly_id only: +# restating that tree would re-upsert a hierarchical root, which fails. +# +# NOTE: this file also creates the OrganizationProvider (from base) fixtures it +# needs. If base's own object file has already loaded the same records (Lumen, +# Colt), this upserts/matches them instead of duplicating -- see rule in AGENTS +# notes about repeating mandatory fields for an existing target. # --------------------------------------------------------------------------- ---- -apiVersion: infrahub.app/v1 -kind: Object -spec: - kind: LocationRegion - data: - - name: Americas - description: North & South America. - children: - kind: LocationCountry - data: - - name: United States - children: - kind: LocationSite - data: - - name: NYC1 - status: active - facility: Equinix NY5 - physical_address: "755 Secaucus Rd, Secaucus, NJ 07094" - timezone: America/New_York - - name: SJC1 - status: active - facility: Equinix SV1 - physical_address: "2001 Ryan Ave, San Jose, CA 95131" - timezone: America/Los_Angeles - --- apiVersion: infrahub.app/v1 kind: Object @@ -67,21 +44,14 @@ spec: - side: a status: active description: "NYC1 hand-off" - # location is cardinality one, peer LocationHosting (a Generic), - # so it needs a nested kind+data block naming the concrete kind. - # LocationSite's only mandatory field is `name`; this upserts - # against the site created above. - location: - kind: LocationSite - data: - name: NYC1 + # location is cardinality one, peer LocationHosting (a Generic) + # whose human_friendly_id is the single field name__value, so the + # already-created site is referenced by that scalar. + location: NYC1 - side: z status: active description: "SJC1 hand-off" - location: - kind: LocationSite - data: - name: SJC1 + location: SJC1 - circuit_id: "COLT-00456" description: "NYC1 internet access circuit" @@ -95,10 +65,7 @@ spec: - side: a status: active description: "NYC1 hand-off" - location: - kind: LocationSite - data: - name: NYC1 + location: NYC1 - circuit_id: "LUMEN-00789" description: "SJC1 dark fiber segment" @@ -111,7 +78,4 @@ spec: - side: a status: provisioning description: "SJC1 hand-off" - location: - kind: LocationSite - data: - name: SJC1 + location: SJC1 From eb4444b495bf3d809bc837ef3cb437a379270028 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 18:53:51 +0200 Subject: [PATCH 49/68] docs: regenerate schema reference pages Output of `uv run invoke docs.generate` after the 56 schema and metadata commits on this branch. Covers the renames (device_types/platforms, OrganizationTenant, serial_number, private, facility, IpamGenericVLAN), the new human_friendly_id and dependency declarations, and the .metadata.yml description rewrites, plus the sweeps' order_weight/optional/include_in_menu. Co-Authored-By: Claude Fable 5 --- docs/docs/home.mdx | 16 +- docs/docs/reference/aggregate.mdx | 40 +-- docs/docs/reference/cable.mdx | 73 +++--- docs/docs/reference/circuit.mdx | 80 +++--- docs/docs/reference/circuit_contract.mdx | 20 +- docs/docs/reference/circuit_service.mdx | 8 +- docs/docs/reference/cluster.mdx | 47 ++-- docs/docs/reference/compute.mdx | 35 +-- docs/docs/reference/cross_connect.mdx | 49 ++-- docs/docs/reference/dcim.mdx | 230 +++++++++--------- docs/docs/reference/device_module.mdx | 115 +++++---- docs/docs/reference/device_psu_module.mdx | 23 +- docs/docs/reference/dwdm.mdx | 227 +++++++++-------- docs/docs/reference/firewall_policer.mdx | 2 +- docs/docs/reference/hosting_cluster.mdx | 18 +- docs/docs/reference/interface_breakout.mdx | 15 +- docs/docs/reference/ipam.mdx | 108 ++++---- docs/docs/reference/lag.mdx | 62 +++-- docs/docs/reference/location.mdx | 24 +- docs/docs/reference/location_extended.mdx | 6 +- docs/docs/reference/location_minimal.mdx | 40 +-- docs/docs/reference/location_site.mdx | 22 +- docs/docs/reference/mlag.mdx | 102 ++++---- docs/docs/reference/optical_transport.mdx | 18 +- docs/docs/reference/organization.mdx | 39 +-- docs/docs/reference/patch_panel.mdx | 168 +++++++------ docs/docs/reference/peering_ixp.mdx | 154 ++++++------ docs/docs/reference/physical_disk.mdx | 57 +++-- docs/docs/reference/qinq.mdx | 50 ++-- docs/docs/reference/rack.mdx | 56 +++-- docs/docs/reference/routing.mdx | 31 +-- docs/docs/reference/routing_aggregate.mdx | 22 +- docs/docs/reference/routing_bgp.mdx | 132 ++++++---- docs/docs/reference/routing_bgp_community.mdx | 31 ++- docs/docs/reference/routing_bgp_rr.mdx | 31 +-- docs/docs/reference/routing_ospf.mdx | 83 ++++--- docs/docs/reference/routing_pim.mdx | 60 +++-- docs/docs/reference/routing_policies.mdx | 38 +-- .../reference/routing_policies_aggregate.mdx | 9 +- docs/docs/reference/routing_policies_bgp.mdx | 48 ++-- docs/docs/reference/routing_policies_ospf.mdx | 28 ++- docs/docs/reference/routing_policies_pim.mdx | 28 ++- docs/docs/reference/sfp.mdx | 56 +++-- docs/docs/reference/snmp.mdx | 109 +++++---- docs/docs/reference/tenancy.mdx | 80 +++--- docs/docs/reference/topology.mdx | 13 +- docs/docs/reference/users.mdx | 58 +++-- docs/docs/reference/vlan.mdx | 150 ++++++------ docs/docs/reference/vrf.mdx | 81 +++--- docs/docs/reference/vrrp.mdx | 84 ++++--- 50 files changed, 1745 insertions(+), 1331 deletions(-) diff --git a/docs/docs/home.mdx b/docs/docs/home.mdx index a7da38b..4635f9f 100644 --- a/docs/docs/home.mdx +++ b/docs/docs/home.mdx @@ -94,9 +94,9 @@ This list provides an overview of the schemas available in this repository. Each | ---- | ----------- | | **[Azure](./reference/azure.mdx)** | This schema extension introduces cloud support for Microsoft Azure. | | **[Circuit Service](./reference/circuit_service.mdx)** | This schema extension contains model coming on top of circuit to capture a single service shared across multiple circuits. For example you have a MPLS network supported by a provider connecting multiple locations: - One single CircuitService would be needed to store MPLS related information (e.g. service id, provider ...) - On each site we would create a circuit connecting on one side our device and the CircuitService on the other side | -| **[Firewall Policer](./reference/firewall_policer.mdx)** | This schema extension contains models for VMs. You might consider Cluster or/and Hypervisor extension to go with! | +| **[Firewall Policer](./reference/firewall_policer.mdx)** | This schema extension contains models for traffic policers and the classes and rules that reference them, so you can describe rate limiting alongside the interfaces it is applied to. | | **[Infiniband](./reference/infiniband.mdx)** | This schema extension adds support for InfiniBand switches. | -| **[Location Extended](./reference/location_extended.mdx)** | This schema extension is the most detailed when it comes to location, you'll find all the layers you can think of. | +| **[Location Extended](./reference/location_extended.mdx)** | This schema extension is the most detailed when it comes to location, you'll find all the layers you can think of. It defines its own hierarchical Location.Rack, incompatible with the flat one extensions/rack defines, so load one or the other, not both. | | **[Modules Linecards](./reference/modules_linecards.mdx)** | This schema extension allows you to capture Linecard related information like the version. You can insert the Linecard into a Dcim Physical Device and leverage the Linecard type model. The Linecard can accept PIC to help configure PORT information like breakout-capabilities and configurations. | | **[Modules Routing Engine](./reference/modules_routing_engine.mdx)** | This schema extension allows you to capture Routing Engine related information like the version. You can insert the Routing Engine into a Dcim Physical Device and leverage the Routing Engine type model. | | **[Optical Transport](./reference/optical_transport.mdx)** | Comprehensive optical transport network schemas for DWDM/WDM systems (ADVA FSP 3000 and similar platforms). Covers four layers: wavelength (ITU-T G.694.1 grid, optical bands, DWDM channels), topology (logical optical nodes, passive multiplexers, fiber links), equipment (transponder/amplifier/ROADM modules, ROADM degrees, WSS cross-connects), and service (end-to-end optical services, optical paths, path segments). Not designed to be loaded together with extensions/dwdm. | @@ -122,14 +122,14 @@ This list provides an overview of the schemas available in this repository. Each | **[Hosting Cluster](./reference/hosting_cluster.mdx)** | A rather generic cluster built with compute units (e.g. servers) and able to host VMs. | | **[Interface Breakout](./reference/interface_breakout.mdx)** | This schema extension introduces relationships to support breakout interfaces, enabling you to document the breakout of a physical interface into smaller physical interfaces. | | **[Lag](./reference/lag.mdx)** | This schema extension includes models for Link Aggregation Groups (LAGs), enabling you to link physical interfaces as building blocs of your LAG interface. It can be used in standard networking environments as well as in compute scenarios, such as capturing bond interfaces. | -| **[Location Minimal](./reference/location_minimal.mdx)** | This schema extension is minimal but will provide you with basic items to store location related data. | +| **[Location Minimal](./reference/location_minimal.mdx)** | This schema extension is minimal but will provide you with basic items to store location related data, as a Region -> Country -> Site hierarchy. It defines the same Location.Site node as extensions/location_site, so load one or the other, not both. Note that LocationGeneric.name is unique across every location kind, so a name used at one tier cannot be reused at another; a single-country deployment therefore enters the hierarchy at Country (with Region as the national node) rather than duplicating a country under several regions. | | **[Location Site](./reference/location_site.mdx)** | This schema extension introduces a standalone Location.Site node (with facility, physical address, timezone, and status). It defines the same Site node as extensions/location_minimal, so load one or the other, not both. | | **[MLAG](./reference/mlag.mdx)** | This schema extension contains the foundations to capture Multi-Chassis Link Aggregation Group (MLAG). It comes on top of the LAG extension. In this implementation, a MLAG interface is essentially a LAG interface but linked to a MLAG domain (instead of a device). The MLAG domain regroup devices together (usually 2) and is built over LAG interfaces used as peer-link between the devices. MLAG interfaces defined at the MLAG domain level are then spread across all devices in the domain. Note: This is a very minimalist implementation of MLAG, the goal is to make it easy to blend with existing models you might have. For example, if you are operating in a data center fabric environment you might already have a LeafGroup or similar concept. In that case you can have your LeafGroup inherit from GenericMlagDomain and add the necessary relationships/attributes. Next steps: - Add support for layer 3 overlay for MLAG interfaces (loopback, peer address ...) - Create virtual relationship so MLAG interfaces can be seen on the devices in the domain | -| **[Patch Panel](./reference/patch_panel.mdx)** | This schema extension allows you to capture patch panel related information like rear/front interfaces and mapping between them. You can insert the patch panel into a rack and leverage the device type model. Finally you can also capture information about potential modules you would insert into your patch panel. NOTE: This extension is compatible with all sort of connectors, meaning you can plug cable, circuits, cross-connect to front & rear interfaces! | +| **[Patch Panel](./reference/patch_panel.mdx)** | This schema extension allows you to capture patch panel related information like rear/front interfaces and mapping between them. You can insert the patch panel into a rack and leverage the device type model. Cassettes and other inserts are tracked as regular device modules in module bays, through extensions/device_module. NOTE: This extension is compatible with all sort of connectors, meaning you can plug cable, circuits, cross-connect to front & rear interfaces! | | **[Peering IXP](./reference/peering_ixp.mdx)** | This schema extension contains all you need to model anything revolving around internet peering (Exchange points ...)! | | **[Physical Disk](./reference/physical_disk.mdx)** | Simple schema allowing you to capture physical disks information for the sake of inventory and lifecycle management. NOTE: This extension is compatible with all sort of device. You can apply the generic "DeviceWithPhysicalDisks" to particular model to enable disks tracking. You might also link that schema to location for instance to capture spares. | -| **[QinQ](./reference/qinq.mdx)** | This schema extension brings extensions to VLAN model in order to support QinQ. | -| **[Rack](./reference/rack.mdx)** | This schema extension introduces a Rack model representing a physical equipment rack installed at a site. Racks can be placed at a LocationSite and can host devices and other equipment. | +| **[QinQ](./reference/qinq.mdx)** | This schema extension adds the Service VLAN and Customer VLAN nodes needed to model QinQ on top of the VLAN extension. | +| **[Rack](./reference/rack.mdx)** | This schema extension introduces a Rack model representing a physical equipment rack installed at a site. Racks can be placed at a LocationSite and can host devices and other equipment. LocationRack needs a Location.Site: extensions/location_site is declared above as the smallest provider, but extensions/location_minimal provides the same node as part of its hierarchy and satisfies the rack equally, load whichever suits, never both. LocationRack is also defined, hierarchically and incompatibly, by experimental/location_extended, so load one or the other, not both. | | **[Routing](./reference/routing.mdx)** | This schema extension contains generics to create Routing Protocol "Instance". The idea is to create one Routing Protocol instance per IpamVRF + DcimDevice pair. | | **[Routing Aggregate](./reference/routing_aggregate.mdx)** | This schema extension contains all you need to model the Aggregate Routing Protocol. | | **[Routing BGP](./reference/routing_bgp.mdx)** | This schema extension contains all you need to model your BGP platform. | @@ -143,7 +143,7 @@ This list provides an overview of the schemas available in this repository. Each | **[Routing Policies BGP](./reference/routing_policies_bgp.mdx)** | This extension is using the Routing Policies extensions and the Routing BGP one together. | | **[Routing Policies OSPF](./reference/routing_policies_ospf.mdx)** | This extension is using the Routing Policies extensions and the Routing OSPF one together. | | **[SFP](./reference/sfp.mdx)** | This schema extension gives you all the models you need to document Small Form-factor Pluggable (SFP). You can either plug it into an interface or attach it to a location (e.g. it's a spare SFP stored in a rack). Improvements: - As of now there is no verification with type / form factor / protocol / distance ... - You could plug any SFP into any equipment interface (e.g. a virtual interface ...) - You could link a SFP to an interface AND a location ... | -| **[SNMP](./reference/snmp.mdx)** | This schema extension contains models for SNMP Communities and SNMP Clients. As you can see this extension is not linked to Tenancy or Device, as you could decide to link the Community to different models based on your use case. | +| **[SNMP](./reference/snmp.mdx)** | This schema extension contains models for SNMP Communities and SNMP Clients. A community links to the devices it is configured on; any further wiring, to a tenant for instance, is left to you. | | **[Tenancy](./reference/tenancy.mdx)** | This schema extension introduces a Tenant node that can own devices, IP prefixes/addresses, and hosting locations. See the comment at the bottom of `tenancy.yml` for an example of how to extend tenancy onto optional extension nodes such as `DcimCircuit`. | | **[Users](./reference/users.mdx)** | This schema extension contains models for account management. | | **[VLAN](./reference/vlan.mdx)** | This schema extension contains models to support VLANs in you network. | @@ -161,4 +161,4 @@ This error indicates that the schema you are trying to load has dependencies on To resolve this, ensure that you have loaded all required schemas before attempting to load the one in question. You can find the list of dependencies in the schema documentation. -::: +::: \ No newline at end of file diff --git a/docs/docs/reference/aggregate.mdx b/docs/docs/reference/aggregate.mdx index d776ea9..5b9ce71 100644 --- a/docs/docs/reference/aggregate.mdx +++ b/docs/docs/reference/aggregate.mdx @@ -17,6 +17,8 @@ This schema extension contains models to capture IP aggregates assigned by a Reg - **Description:** An aggregate is a top-level IPv4 or IPv6 prefix assigned by a RIR. - **Namespace:** Ipam - **Icon:** mdi:ip-network +- **Uniqueness Constraints:** + - prefix__value - **Human Friendly ID:** prefix__value - **Inherit From:** BuiltinIPPrefix @@ -45,7 +47,7 @@ This schema extension contains models to capture IP aggregates assigned by a Reg | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| is_private | Indicates this RIR manages private (RFC 1918 / RFC 4193) address space. | Boolean | | False | | +| private | Indicates this RIR manages private (RFC 1918 / RFC 4193) address space. | Boolean | False | False | | #### Relationships @@ -63,33 +65,35 @@ nodes: description: An aggregate is a top-level IPv4 or IPv6 prefix assigned by a RIR. label: Aggregate icon: mdi:ip-network - menu_placement: OrganizationRIR include_in_menu: true + menu_placement: BuiltinIPAM + inherit_from: + - BuiltinIPPrefix + human_friendly_id: + - prefix__value order_by: - prefix__value display_label: prefix__value - human_friendly_id: - - prefix__value - inherit_from: - - BuiltinIPPrefix + uniqueness_constraints: + - - prefix__value attributes: - name: description kind: Text optional: true order_weight: 1100 - name: date_added - label: Date Added kind: DateTime + label: Date Added optional: true order_weight: 1200 relationships: - name: rir - label: RIR peer: OrganizationRIR - identifier: aggregate__rir - optional: false - cardinality: one + label: RIR kind: Attribute + cardinality: one + optional: false + identifier: aggregate__rir order_weight: 1000 - name: RIR namespace: Organization @@ -98,23 +102,25 @@ nodes: label: RIR icon: mdi:certificate include_in_menu: true + menu_placement: OrganizationGeneric inherit_from: - OrganizationGeneric attributes: - - name: is_private + - name: private + kind: Boolean label: Private + default_value: false + optional: false description: Indicates this RIR manages private (RFC 1918 / RFC 4193) address space. - kind: Boolean - default_value: false order_weight: 1300 relationships: - name: aggregates peer: IpamAggregate - identifier: aggregate__rir - optional: true - cardinality: many kind: Generic + cardinality: many + optional: true + identifier: aggregate__rir order_weight: 1400 ``` \ No newline at end of file diff --git a/docs/docs/reference/cable.mdx b/docs/docs/reference/cable.mdx index 5d17f72..f63d832 100644 --- a/docs/docs/reference/cable.mdx +++ b/docs/docs/reference/cable.mdx @@ -17,6 +17,7 @@ This schema extension contains a basic Cable model allowing you to connect two e - **Description:** Physical cable connecting two endpoints - **Namespace:** Dcim - **Icon:** mdi:cable-data +- **Human Friendly ID:** label__value - **Inherit From:** DcimConnector #### Attributes @@ -24,9 +25,9 @@ This schema extension contains a basic Cable model allowing you to connect two e | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | | status | | Dropdown | False | connected | connected, planned | -| cable_type | | Dropdown | True | | cat3, cat5, cat5e, cat6, cat6a, cat7, cat7a, cat8, mmf-om1, mmf-om2, mmf-om3, mmf-om4, mmf-om5, smf-os1, smf-os2, dac-passive, dac-active, aoc, coaxial, mrj21-trunk, power, usb | -| color | | Dropdown | True | | dark-red, red, pink, rose, fuchsia, purple, dark-purple, indigo, blue, light-blue, cyan, teal, aqua, dark-green, green, light-green, lime, yellow, amber, orange, dark-orange, brown, light-grey, grey, dark-grey, black | -| label | | Text | True | | | +| cable_type | | Dropdown | True | | cat3, cat5, cat5e, cat6, cat6a, cat7, cat7a, cat8, mmf_om1, mmf_om2, mmf_om3, mmf_om4, mmf_om5, smf_os1, smf_os2, dac_passive, dac_active, aoc, coaxial, mrj21_trunk, power, usb | +| color | | Dropdown | True | | dark_red, red, pink, rose, fuchsia, purple, dark_purple, indigo, blue, light_blue, cyan, teal, aqua, dark_green, green, light_green, lime, yellow, amber, orange, dark_orange, brown, light_grey, grey, dark_grey, black | +| label | | Text | False | | | | length | | Number | True | | | ## Code @@ -39,31 +40,32 @@ nodes: description: Physical cable connecting two endpoints label: Cable icon: mdi:cable-data - display_label: label__value + include_in_menu: true menu_placement: DcimDevice - order_by: - - label__value inherit_from: - DcimConnector + human_friendly_id: + - label__value + order_by: + - label__value + display_label: label__value attributes: - name: status kind: Dropdown - optional: false default_value: connected - order_weight: 1000 choices: - name: connected label: Connected - description: Fully operational and currently in connected + description: Fully operational and currently connected color: '#00d25b' - name: planned label: Planned description: In the process of being set up color: '#2196f3' + optional: false + order_weight: 1200 - name: cable_type kind: Dropdown - optional: true - order_weight: 1100 choices: - name: cat3 label: CAT3 @@ -97,39 +99,39 @@ nodes: label: CAT8 description: Category 8 twisted pair cable. color: '#99ccff' - - name: mmf-om1 + - name: mmf_om1 label: Multimode Fiber OM1 description: "Multimode fiber (62.5/125 \xB5m)." color: '#ff9933' - - name: mmf-om2 + - name: mmf_om2 label: Multimode Fiber OM2 description: "Multimode fiber (50/125 \xB5m)." color: '#ff9933' - - name: mmf-om3 + - name: mmf_om3 label: Multimode Fiber OM3 description: "Optimized multimode fiber (50/125 \xB5m)." color: '#ff9933' - - name: mmf-om4 + - name: mmf_om4 label: Multimode Fiber OM4 description: "Enhanced multimode fiber (50/125 \xB5m)." color: '#ff9933' - - name: mmf-om5 + - name: mmf_om5 label: Multimode Fiber OM5 description: "Wideband multimode fiber (50/125 \xB5m)." color: '#ff9933' - - name: smf-os1 + - name: smf_os1 label: Singlemode Fiber OS1 description: Standard singlemode fiber. color: '#ffcc00' - - name: smf-os2 + - name: smf_os2 label: Singlemode Fiber OS2 description: Improved singlemode fiber. color: '#ffcc00' - - name: dac-passive + - name: dac_passive label: Passive DAC description: Direct Attach Copper (Passive). color: '#a0a0a0' - - name: dac-active + - name: dac_active label: Active DAC description: Direct Attach Copper (Active). color: '#a0a0a0' @@ -141,7 +143,7 @@ nodes: label: Coaxial description: Coaxial cable for broadband. color: '#000000' - - name: mrj21-trunk + - name: mrj21_trunk label: MRJ21 Trunk description: High-density copper cable. color: '#000000' @@ -153,12 +155,12 @@ nodes: label: USB description: Universal Serial Bus cable. color: '#000000' + optional: true + order_weight: 1100 - name: color kind: Dropdown - optional: true - order_weight: 1300 choices: - - name: dark-red + - name: dark_red label: Dark Red color: '#aa1409' - name: red @@ -176,7 +178,7 @@ nodes: - name: purple label: Purple color: '#9c27b0' - - name: dark-purple + - name: dark_purple label: Dark Purple color: '#673ab7' - name: indigo @@ -185,7 +187,7 @@ nodes: - name: blue label: Blue color: '#2196f3' - - name: light-blue + - name: light_blue label: Light Blue color: '#03a9f4' - name: cyan @@ -197,13 +199,13 @@ nodes: - name: aqua label: Aqua color: '#00ffff' - - name: dark-green + - name: dark_green label: Dark Green color: '#2f6a31' - name: green label: Green color: '#4caf50' - - name: light-green + - name: light_green label: Light Green color: '#8bc34a' - name: lime @@ -218,31 +220,34 @@ nodes: - name: orange label: Orange color: '#ff9800' - - name: dark-orange + - name: dark_orange label: Dark Orange color: '#ff5722' - name: brown label: Brown color: '#795548' - - name: light-grey + - name: light_grey label: Light Grey color: '#c0c0c0' - name: grey label: Grey color: '#9e9e9e' - - name: dark-grey + - name: dark_grey label: Dark Grey color: '#607d8b' - name: black label: Black color: '#111111' + optional: true + order_weight: 1300 - name: label kind: Text - optional: true - order_weight: 1200 + unique: true + optional: false + order_weight: 1000 - name: length - label: Length (in cm) kind: Number + label: Length (in cm) optional: true order_weight: 1350 diff --git a/docs/docs/reference/circuit.mdx b/docs/docs/reference/circuit.mdx index 3cb59c3..59e8afa 100644 --- a/docs/docs/reference/circuit.mdx +++ b/docs/docs/reference/circuit.mdx @@ -8,7 +8,6 @@ This schema extension contains Circuits and ways to connect them with your infra - **Dependencies:** - [base](dcim) - - [extensions/location_minimal](location_minimal) ## Nodes @@ -24,7 +23,7 @@ This schema extension contains Circuits and ways to connect them with your infra | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| circuit_id | | Text | | | | +| circuit_id | | Text | False | | | | description | | Text | True | | | | commit_rate | | Number | True | | | | circuit_type | Specifies the type of circuit. | Dropdown | True | | internet_access, point_to_point, peering, dark_fiber, mpls | @@ -40,7 +39,7 @@ This schema extension contains Circuits and ways to connect them with your infra ### CircuitEndpoint - **Label:** Circuit Endpoint -- **Description:** A circuit endpoint, could be a position in a MMR... +- **Description:** One of the two terminations (A or Z) of a circuit, at the location where the provider hands the circuit off. Use the description field for the provider-side reference (patch panel position, cross-connect ID). - **Namespace:** Dcim - **Icon:** mdi:ethernet - **Uniqueness Constraints:** @@ -78,7 +77,7 @@ In this context "extensions" refer to modifications or additions to the existing | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | -| circuits | DcimCircuit | True | many | | +| circuits | DcimCircuit | True | many | Generic | ### LocationHosting @@ -86,7 +85,7 @@ In this context "extensions" refer to modifications or additions to the existing | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | -| circuit_endpoints | DcimCircuitEndpoint | True | many | | +| circuit_endpoints | DcimCircuitEndpoint | True | many | Generic | ## Code @@ -98,6 +97,7 @@ nodes: description: A Circuit represent service operated by a provider. label: Circuit icon: mdi:cable-data + include_in_menu: true human_friendly_id: - circuit_id__value order_by: @@ -107,18 +107,19 @@ nodes: - name: circuit_id kind: Text unique: true + optional: false + order_weight: 1000 - name: description kind: Text optional: true + order_weight: 1100 - name: commit_rate - label: Commit Rate (Kbps) kind: Number + label: Commit Rate (Kbps) optional: true - order_weight: 1100 + order_weight: 1400 - name: circuit_type kind: Dropdown - optional: true - description: Specifies the type of circuit. choices: - name: internet_access label: Internet Access @@ -140,9 +141,11 @@ nodes: label: MPLS description: Multi-Protocol Label Switching circuit for QoS-based routing. color: '#7f00ff' + optional: true + description: Specifies the type of circuit. + order_weight: 1300 - name: status kind: Dropdown - optional: false default_value: active choices: - name: active @@ -161,42 +164,47 @@ nodes: label: Drained description: Temporarily taken out of service. color: '#9e9e9e' + optional: false + order_weight: 1200 relationships: - name: provider peer: OrganizationProvider - optional: false - cardinality: one kind: Attribute + cardinality: one + optional: false identifier: circuit__provider + order_weight: 1500 - name: endpoints peer: DcimCircuitEndpoint - optional: true - cardinality: many kind: Component + cardinality: many + optional: true identifier: circuit__endpoint + order_weight: 1600 - name: CircuitEndpoint namespace: Dcim - description: A circuit endpoint, could be a position in a MMR... + description: One of the two terminations (A or Z) of a circuit, at the location + where the provider hands the circuit off. Use the description field for the provider-side + reference (patch panel position, cross-connect ID). label: Circuit Endpoint - inherit_from: - - DcimEndpoint icon: mdi:ethernet + include_in_menu: true menu_placement: DcimCircuit + inherit_from: + - DcimEndpoint human_friendly_id: - circuit__circuit_id__value - name__value - uniqueness_constraints: - - - circuit - - side__value order_by: - name__value display_label: name__value + uniqueness_constraints: + - - circuit + - side__value attributes: - name: side - label: Side kind: Dropdown - optional: false - order_weight: 950 + label: Side choices: - name: a label: A @@ -204,17 +212,18 @@ nodes: - name: z label: Z description: Z-side of the circuit. + optional: false + order_weight: 950 - name: name kind: Text + read_only: true computed_attribute: kind: Jinja2 jinja2_template: '{{ circuit__circuit_id__value }}_{{ side__value | upper }}' - read_only: true optional: false order_weight: 1000 - name: status kind: Dropdown - optional: false default_value: active choices: - name: active @@ -233,40 +242,47 @@ nodes: label: Drained description: Temporarily taken out of service. color: '#9e9e9e' + optional: false + order_weight: 1200 - name: description kind: Text optional: true + order_weight: 1100 relationships: - name: circuit peer: DcimCircuit - order_weight: 900 - optional: false - cardinality: one kind: Parent + cardinality: one + optional: false identifier: circuit__endpoint + order_weight: 900 - name: location - label: Location peer: LocationHosting - optional: false - cardinality: one + label: Location kind: Attribute - order_weight: 1500 + cardinality: one + optional: false identifier: circuit_endpoint__location + order_weight: 1500 extensions: nodes: - kind: OrganizationProvider relationships: - name: circuits peer: DcimCircuit + kind: Generic cardinality: many optional: true identifier: circuit__provider + order_weight: 1300 - kind: LocationHosting relationships: - name: circuit_endpoints peer: DcimCircuitEndpoint + kind: Generic cardinality: many optional: true identifier: circuit_endpoint__location + order_weight: 1700 ``` \ No newline at end of file diff --git a/docs/docs/reference/circuit_contract.mdx b/docs/docs/reference/circuit_contract.mdx index c1dc729..aa9c421 100644 --- a/docs/docs/reference/circuit_contract.mdx +++ b/docs/docs/reference/circuit_contract.mdx @@ -51,7 +51,7 @@ In this context "extensions" refer to modifications or additions to the existing | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | -| contract | DcimCircuitContract | True | one | | +| contract | DcimCircuitContract | True | one | Generic | ## Code @@ -60,13 +60,14 @@ version: '1.0' nodes: - name: CircuitContract namespace: Dcim - inherit_from: - - CoreFileObject description: A contract document associated with a circuit service, including terms, costs, and validity period. label: Circuit Contract icon: mdi:file-sign + include_in_menu: true menu_placement: DcimCircuit + inherit_from: + - CoreFileObject human_friendly_id: - name__value order_by: @@ -75,23 +76,26 @@ nodes: attributes: - name: name kind: Text + read_only: true computed_attribute: kind: Jinja2 jinja2_template: contract_{{ circuit__circuit_id__value }} - read_only: true optional: false + order_weight: 1000 - name: contract_start kind: DateTime optional: false + order_weight: 1200 - name: contract_end kind: DateTime optional: false + order_weight: 1300 - name: monthly_cost kind: Number optional: true + order_weight: 1400 - name: currency kind: Dropdown - optional: true choices: - name: usd label: USD @@ -102,22 +106,26 @@ nodes: - name: gbp label: GBP description: British Pound Sterling + optional: true + order_weight: 1450 relationships: - name: circuit peer: DcimCircuit kind: Attribute cardinality: one optional: false - order_weight: 950 identifier: circuit__contract + order_weight: 950 extensions: nodes: - kind: DcimCircuit relationships: - name: contract peer: DcimCircuitContract + kind: Generic cardinality: one optional: true identifier: circuit__contract + order_weight: 1550 ``` \ No newline at end of file diff --git a/docs/docs/reference/circuit_service.mdx b/docs/docs/reference/circuit_service.mdx index b2b0aae..fe04d59 100644 --- a/docs/docs/reference/circuit_service.mdx +++ b/docs/docs/reference/circuit_service.mdx @@ -36,7 +36,7 @@ For example you have a MPLS network supported by a provider connecting multiple | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | | provider | OrganizationProvider | False | one | Attribute | -| circuit_endpoints | CircuitEndpoint | True | many | Component | +| circuit_endpoints | DcimCircuitEndpoint | True | many | Component | ## Extensions @@ -54,7 +54,7 @@ In this context "extensions" refer to modifications or additions to the existing | ---- | ---- | -------- | ----------- | ---- | | circuit_services | CircuitService | True | many | | -### CircuitEndpoint +### DcimCircuitEndpoint #### Relationships @@ -96,7 +96,7 @@ nodes: cardinality: one kind: Attribute - name: circuit_endpoints - peer: CircuitEndpoint + peer: DcimCircuitEndpoint optional: true cardinality: many kind: Component @@ -108,7 +108,7 @@ extensions: peer: CircuitService cardinality: many optional: true - - kind: CircuitEndpoint + - kind: DcimCircuitEndpoint relationships: - name: circuit_service peer: CircuitService diff --git a/docs/docs/reference/cluster.mdx b/docs/docs/reference/cluster.mdx index 40a64d4..047eb08 100644 --- a/docs/docs/reference/cluster.mdx +++ b/docs/docs/reference/cluster.mdx @@ -23,14 +23,14 @@ This schema extension contains the foundations to capture clusters. With this on | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| name | Name of the cluster. | Text | | | | +| name | Name of the cluster. | Text | False | | | | description | | Text | True | | | #### Relationships | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | -| location | LocationGeneric | False | many | Attribute | +| locations | LocationGeneric | False | many | Attribute | | tags | BuiltinTag | True | many | Attribute | ### GenericComputeUnitNodes @@ -42,7 +42,7 @@ This schema extension contains the foundations to capture clusters. With this on | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | -| nodes | ComputeGenericUnit | | many | Component | +| nodes | ComputeGenericUnit | True | many | Component | ## Extensions @@ -58,7 +58,7 @@ In this context "extensions" refer to modifications or additions to the existing | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | -| worker_in_cluster | ClusterGenericComputeUnitNodes | True | one | | +| worker_in_cluster | ClusterGenericComputeUnitNodes | True | one | Generic | ### LocationGeneric @@ -86,25 +86,27 @@ generics: attributes: - name: name kind: Text - description: Name of the cluster. unique: true + optional: false + description: Name of the cluster. order_weight: 1000 - name: description kind: Text optional: true + order_weight: 1100 relationships: - - name: location - label: Location + - name: locations peer: LocationGeneric - optional: false - cardinality: many + label: Locations kind: Attribute + cardinality: many + optional: false order_weight: 1400 - name: tags peer: BuiltinTag - optional: true - cardinality: many kind: Attribute + cardinality: many + optional: true order_weight: 2000 - name: GenericComputeUnitNodes namespace: Cluster @@ -113,30 +115,35 @@ generics: include_in_menu: false relationships: - name: nodes - label: Nodes - identifier: worker_in_cluster - cardinality: many peer: ComputeGenericUnit + label: Nodes kind: Component + cardinality: many + identifier: worker_in_cluster + optional: true + order_weight: 1500 extensions: nodes: - kind: ComputeGenericUnit relationships: - name: worker_in_cluster - identifier: worker_in_cluster - label: Worker in cluster peer: ClusterGenericComputeUnitNodes + kind: Generic + label: Worker in cluster cardinality: one - description: This device is a worker node of the specified cluster. optional: true + identifier: worker_in_cluster + description: This device is a worker node of the specified cluster. + order_weight: 1900 - kind: LocationGeneric relationships: - name: clusters - label: Clusters peer: ClusterGeneric - cardinality: many + label: Clusters kind: Component - description: All clusters available on that location. + cardinality: many optional: true + description: All clusters available on that location. + order_weight: 1650 ``` \ No newline at end of file diff --git a/docs/docs/reference/compute.mdx b/docs/docs/reference/compute.mdx index e003eac..50a770b 100644 --- a/docs/docs/reference/compute.mdx +++ b/docs/docs/reference/compute.mdx @@ -52,6 +52,7 @@ With this schema extension in place you will be able to capture all your physica ### GenericUnit +- **Label:** Compute - **Description:** A generic unit that can compute (e.g. server, vm ...). - **Namespace:** Compute @@ -74,25 +75,28 @@ generics: - name: GenericUnit namespace: Compute description: A generic unit that can compute (e.g. server, vm ...). - include_in_menu: false + label: Compute + include_in_menu: true - name: HostVirtualMachine namespace: Virtualization description: A generic unit that can host VM include_in_menu: false relationships: - name: virtual_machines - cardinality: many peer: VirtualizationVirtualMachine kind: Component + cardinality: many optional: true identifier: host__virtual_machine + order_weight: 1450 nodes: - name: PhysicalServer namespace: Compute description: A physical server with fixed resources and specific hardware characteristics. label: Physical Server icon: mdi:server - menu_placement: DcimDevice + include_in_menu: true + menu_placement: ComputeGenericUnit inherit_from: - ComputeGenericUnit - DcimGenericDevice @@ -101,9 +105,7 @@ nodes: attributes: - name: status kind: Dropdown - optional: false default_value: active - order_weight: 1100 choices: - name: active label: Active @@ -121,11 +123,14 @@ nodes: label: Drained description: Temporarily taken out of service. color: '#9e9e9e' + optional: false + order_weight: 1200 - name: VirtualMachine namespace: Virtualization description: A virtual machine hosted on a server or a cluster. label: Virtual Machine icon: carbon:virtual-machine + menu_placement: ComputeGenericUnit include_in_menu: true inherit_from: - ComputeGenericUnit @@ -133,36 +138,38 @@ nodes: attributes: - name: role kind: Dropdown - optional: true - description: Role of the virtual machine. - order_weight: 1400 choices: - name: application + label: Application color: '#7f7fff' - name: storage + label: Storage color: '#bf7fbf' + optional: true + description: Role of the virtual machine. + order_weight: 1300 - name: vcpu kind: Number optional: true - order_weight: 1900 description: Number of CPU cores assigned to the VM. + order_weight: 1400 - name: memory kind: Number optional: true - order_weight: 1900 description: Amount of memory (in GB) assigned to the VM. + order_weight: 1450 - name: disk kind: Number optional: true - order_weight: 1900 description: Disk space (in GB) assigned to the VM. + order_weight: 1500 relationships: - name: host peer: VirtualizationHostVirtualMachine - optional: false - cardinality: one kind: Attribute - order_weight: 1500 + cardinality: one + optional: false identifier: host__virtual_machine + order_weight: 1350 ``` \ No newline at end of file diff --git a/docs/docs/reference/cross_connect.mdx b/docs/docs/reference/cross_connect.mdx index 5ae365a..287b44c 100644 --- a/docs/docs/reference/cross_connect.mdx +++ b/docs/docs/reference/cross_connect.mdx @@ -18,7 +18,7 @@ This extension contains schema to capture Cross Connect. You can see it as "a ca - **Namespace:** Dcim - **Icon:** streamline:arrow-crossover-right-solid - **Uniqueness Constraints:** - - identifier__value, provider + - provider, identifier__value - **Human Friendly ID:** provider__name__value, identifier__value - **Inherit From:** DcimConnector @@ -26,9 +26,9 @@ This extension contains schema to capture Cross Connect. You can see it as "a ca | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| identifier | | Text | | | | +| identifier | | Text | False | | | | description | | Text | True | | | -| status | | Dropdown | True | | connected, planned, reserved | +| status | | Dropdown | False | planned | connected, planned, reserved | #### Relationships @@ -47,55 +47,58 @@ nodes: description: Cross-connect between different endpoints within a datacenter. label: Cross-Connect icon: streamline:arrow-crossover-right-solid + include_in_menu: true inherit_from: - DcimConnector - order_by: - - provider__name__value - display_label: '{{ identifier__value }} (Provider: {{ provider__name__value }})' human_friendly_id: - provider__name__value - identifier__value + order_by: + - provider__name__value + display_label: '{{ identifier__value }} (Provider: {{ provider__name__value }})' uniqueness_constraints: - - - identifier__value - - provider + - - provider + - identifier__value attributes: - name: identifier kind: Text - order_weight: 900 + optional: false + order_weight: 1000 - name: description kind: Text optional: true - order_weight: 1300 + order_weight: 1100 - name: status kind: Dropdown - optional: true - order_weight: 1200 + default_value: planned choices: - name: connected label: Connected - description: Fully operational and currently in connected - color: '#7fbf7f' + description: Fully operational and currently connected + color: '#00d25b' - name: planned label: Planned description: In the process of being set up - color: '#ffff7f' + color: '#2196f3' - name: reserved label: Reserved description: Fully connected and reserved for a future use - color: '#9090de' + color: '#4d90fe' + optional: false + order_weight: 1200 relationships: - name: location - label: Location peer: LocationHosting - optional: false - cardinality: one + label: Location kind: Attribute - order_weight: 1100 + cardinality: one + optional: false + order_weight: 1400 - name: provider peer: OrganizationProvider - optional: false - cardinality: one kind: Attribute - order_weight: 1000 + cardinality: one + optional: false + order_weight: 1300 ``` \ No newline at end of file diff --git a/docs/docs/reference/dcim.mdx b/docs/docs/reference/dcim.mdx index 0b8ed0c..6801a3c 100644 --- a/docs/docs/reference/dcim.mdx +++ b/docs/docs/reference/dcim.mdx @@ -22,11 +22,11 @@ Basic DCIM schema to capture devices, racks, interfaces, and related information | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| name | | Text | | | | +| name | | Text | False | | | | description | | Text | True | | | | part_number | | Text | True | | | | height | | Number | False | 1 | | -| full_depth | | Boolean | | True | | +| full_depth | | Boolean | False | True | | | weight | | Number | True | | | #### Relationships @@ -47,7 +47,7 @@ Basic DCIM schema to capture devices, racks, interfaces, and related information | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| name | | Text | | | | +| name | | Text | False | | | | description | | Text | True | | | #### Relationships @@ -55,7 +55,7 @@ Basic DCIM schema to capture devices, racks, interfaces, and related information | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | | devices | DcimGenericDevice | True | many | Generic | -| manufacturer | OrganizationManufacturer | | one | Attribute | +| manufacturer | OrganizationManufacturer | True | one | Attribute | ### Device @@ -79,12 +79,6 @@ Basic DCIM schema to capture devices, racks, interfaces, and related information - **Namespace:** Interface - **Inherit From:** DcimInterface, InterfaceLayer2, InterfaceLayer3, DcimEndpoint, InterfaceHasSubInterface -#### Attributes - -| name | description | kind | optional | default_value | choices | -| ---- | ----------- | ---- | -------- | ------------- | ------- | -| mtu | | Number | | 1500 | | - ### Virtual - **Label:** Virtual Interface @@ -96,7 +90,7 @@ Basic DCIM schema to capture devices, racks, interfaces, and related information | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | -| parent_interface | InterfaceHasSubInterface | | one | Attribute | +| parent_interface | InterfaceHasSubInterface | True | one | Attribute | ## Generics @@ -112,7 +106,7 @@ Basic DCIM schema to capture devices, racks, interfaces, and related information | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| name | | Text | | | | +| name | | Text | False | | | | description | | Text | True | | | #### Relationships @@ -133,9 +127,9 @@ Basic DCIM schema to capture devices, racks, interfaces, and related information | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| name | | Text | | | | +| name | | Text | False | | | | position | Lowest unit. | Number | True | | | -| serial | | Text | True | | | +| serial_number | | Text | True | | | | rack_face | On which face of the rack the device is mounted. | Dropdown | False | front | front, rear | #### Relationships @@ -158,7 +152,7 @@ Basic DCIM schema to capture devices, racks, interfaces, and related information ### Connector -- **Description:** Generic Connector to link two endpoints together. +- **Description:** Generic Connector to link two endpoints together. The endpoints are kind Attribute so both ends render inline on the connector form; a high-fan-out connector kind should override the relationship back to Generic. - **Namespace:** Dcim #### Relationships @@ -181,10 +175,11 @@ Basic DCIM schema to capture devices, racks, interfaces, and related information | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| name | Name of the interface | Text | | | | +| name | Name of the interface | Text | False | | | | description | A brief description of the interface | Text | True | | | | status | The status of the interface | Dropdown | False | active | provisioning, free, active, maintenance, disabled | | role | The role of the interface in the network | Dropdown | True | | core, customer, access, management, peering, upstream | +| mtu | Maximum transmission unit, in bytes (IP payload, not frame size). | Number | True | 1500 | | #### Relationships @@ -248,39 +243,41 @@ generics: - name: name kind: Text unique: true + optional: false order_weight: 1000 - name: description kind: Text optional: true - order_weight: 2000 + order_weight: 1100 relationships: - name: interfaces peer: DcimInterface - optional: true + kind: Component cardinality: many + optional: true identifier: device__interface - kind: Component + order_weight: 1650 - name: tags peer: BuiltinTag - optional: true - cardinality: many kind: Attribute + cardinality: many + optional: true order_weight: 2000 - name: primary_address peer: IpamIPAddress label: Primary IP Address - identifier: device__primary_address - optional: true - cardinality: one kind: Attribute + cardinality: one + optional: true + identifier: device__primary_address order_weight: 1700 - name: platform peer: DcimPlatform - optional: true - cardinality: one kind: Attribute - order_weight: 1250 + cardinality: one + optional: true identifier: device__platform + order_weight: 1250 - name: PhysicalDevice namespace: Dcim description: Generic holding attributes and relationships relevant for physical @@ -291,23 +288,22 @@ generics: kind: Text unique: true allow_override: any + optional: false + order_weight: 1000 - name: position - label: Position (U) - description: Lowest unit. kind: Number + label: Position (U) optional: true - order_weight: 1500 - - name: serial + description: Lowest unit. + order_weight: 1550 + - name: serial_number kind: Text optional: true - order_weight: 1500 + order_weight: 1400 - name: rack_face - label: Rack Face - description: On which face of the rack the device is mounted. kind: Dropdown - optional: false + label: Rack Face default_value: front - order_weight: 1515 choices: - name: front label: Front @@ -315,21 +311,24 @@ generics: - name: rear label: Rear description: Device mounted on the rear face of the rack. + optional: false + description: On which face of the rack the device is mounted. + order_weight: 1600 relationships: - name: device_type peer: DcimDeviceType - optional: true - cardinality: one kind: Attribute - order_weight: 1200 + cardinality: one + optional: true + order_weight: 1150 - name: location - label: Location peer: LocationHosting - optional: false - cardinality: one + label: Location kind: Attribute - order_weight: 1500 + cardinality: one + optional: false identifier: physical_device__location + order_weight: 1500 - name: Endpoint namespace: Dcim description: Generic Endpoint to receive a connector. @@ -337,23 +336,25 @@ generics: relationships: - name: connector peer: DcimConnector - optional: true - cardinality: one - order_weight: 1500 kind: Attribute + cardinality: one + optional: true identifier: connector__endpoint + order_weight: 1600 - name: Connector namespace: Dcim - description: Generic Connector to link two endpoints together. + description: Generic Connector to link two endpoints together. The endpoints are + kind Attribute so both ends render inline on the connector form; a high-fan-out + connector kind should override the relationship back to Generic. include_in_menu: false relationships: - name: connected_endpoints peer: DcimEndpoint - optional: true - cardinality: many - order_weight: 1500 kind: Attribute + cardinality: many + optional: true identifier: connector__endpoint + order_weight: 1500 - name: Interface namespace: Dcim description: Generic Network Interface @@ -361,19 +362,20 @@ generics: icon: mdi:ethernet include_in_menu: true menu_placement: DcimDevice - display_label: name__value + human_friendly_id: + - device__name__value + - name__value order_by: - device__name__value - name__value + display_label: name__value uniqueness_constraints: - - device - name__value - human_friendly_id: - - device__name__value - - name__value attributes: - name: name kind: Text + optional: false description: Name of the interface order_weight: 1000 - name: description @@ -383,8 +385,6 @@ generics: order_weight: 1100 - name: status kind: Dropdown - description: The status of the interface - optional: false default_value: active choices: - name: provisioning @@ -407,11 +407,11 @@ generics: label: Disabled description: Interface has been disabled. color: '#6c757d' + optional: false + description: The status of the interface order_weight: 1200 - name: role kind: Dropdown - optional: true - description: The role of the interface in the network choices: - name: core label: Core Interface @@ -437,30 +437,38 @@ generics: label: Upstream Interface description: Interface dedicated to upstream traffic between networks. color: '#B2D4E6' - order_weight: 1250 + optional: true + description: The role of the interface in the network + order_weight: 1300 + - name: mtu + kind: Number + label: MTU + default_value: 1500 + optional: true + description: Maximum transmission unit, in bytes (IP payload, not frame size). + order_weight: 1350 relationships: - name: device peer: DcimGenericDevice - identifier: device__interface - optional: false - cardinality: one kind: Parent - order_weight: 1025 + cardinality: one + optional: false + identifier: device__interface + order_weight: 900 - name: Layer2 namespace: Interface - include_in_menu: false description: Layer 2 specific attributes for network interfaces label: Layer 2 Interface + include_in_menu: false attributes: - name: mac_address - label: MAC Address kind: MacAddress + label: MAC Address optional: true order_weight: 1400 - name: l2_mode - label: Layer2 Mode kind: Dropdown - optional: true + label: Layer2 Mode choices: - name: access label: Access @@ -471,21 +479,22 @@ generics: - name: trunk_all label: Trunk (All) description: Trunk all mode + optional: true description: Layer 2 mode of the interface - order_weight: 1500 + order_weight: 1450 - name: Layer3 namespace: Interface - include_in_menu: false description: Layer 3 specific attributes for network interfaces label: Layer 3 Interface + include_in_menu: false relationships: - name: ip_addresses - label: IP Addresses peer: IpamIPAddress - identifier: ip_address__interface - cardinality: many + label: IP Addresses kind: Attribute + cardinality: many optional: true + identifier: ip_address__interface description: List of IP addresses associated with the interface order_weight: 1150 - name: HasSubInterface @@ -494,12 +503,12 @@ generics: include_in_menu: false relationships: - name: sub_interfaces - label: Sub-interface(s) peer: InterfaceVirtual - identifier: sub__interface - optional: true - cardinality: many + label: Sub-interface(s) kind: Attribute + cardinality: many + optional: true + identifier: sub__interface description: Sub-interfaces of this interface order_weight: 1750 nodes: @@ -508,102 +517,107 @@ nodes: description: A model of device label: Device Type icon: mdi:poll + include_in_menu: true menu_placement: DcimDevice human_friendly_id: - name__value - display_label: name__value order_by: - manufacturer__name__value - name__value + display_label: name__value attributes: - name: name kind: Text unique: true + optional: false order_weight: 1000 - name: description kind: Text optional: true order_weight: 1100 - name: part_number + kind: Text label: Part Number optional: true - kind: Text order_weight: 1200 - name: height + kind: Number label: Height (U) - optional: false default_value: 1 - kind: Number + optional: false order_weight: 1400 - name: full_depth + kind: Boolean label: Full Depth default_value: true - kind: Boolean + optional: false order_weight: 1500 - name: weight + kind: Number label: Weight (kg) optional: true - kind: Number order_weight: 1600 relationships: - name: manufacturer peer: OrganizationManufacturer - cardinality: one kind: Attribute - order_weight: 1250 + cardinality: one optional: false identifier: manufacturer__device_type + order_weight: 1250 - name: Platform namespace: Dcim description: A Platform represent the type of software running on a device. label: Platform icon: mdi:application-cog-outline + include_in_menu: true menu_placement: DcimDevice human_friendly_id: - name__value - display_label: name__value order_by: - manufacturer__name__value - name__value + display_label: name__value attributes: - name: name kind: Text unique: true + optional: false order_weight: 1000 - name: description kind: Text optional: true - order_weight: 1200 + order_weight: 1100 relationships: - name: devices peer: DcimGenericDevice - optional: true - cardinality: many kind: Generic - order_weight: 1350 + cardinality: many + optional: true identifier: device__platform + order_weight: 1350 - name: manufacturer peer: OrganizationManufacturer - cardinality: one kind: Attribute - order_weight: 1300 + cardinality: one identifier: manufacturer__platform + optional: true + order_weight: 1300 - name: Device - label: Network Device + namespace: Dcim description: A configurable network device including routers, switches... + label: Network Device icon: clarity:network-switch-solid - generate_template: true - namespace: Dcim + include_in_menu: true inherit_from: - CoreArtifactTarget - DcimGenericDevice - DcimPhysicalDevice + generate_template: true attributes: - name: status kind: Dropdown - optional: false default_value: active - order_weight: 1100 choices: - name: active label: Active @@ -625,10 +639,10 @@ nodes: label: Deprecated description: No longer in use and scheduled for removal. color: '#e04040' + optional: false + order_weight: 1200 - name: role kind: Dropdown - optional: true - order_weight: 1400 choices: - name: core label: Core Router @@ -654,38 +668,36 @@ nodes: label: Tor Switch description: Tor switch part of a Fabric. color: '#e8e7fd' + optional: true + order_weight: 1300 - name: Physical namespace: Interface - label: Physical Interface description: Physical network port on a device + label: Physical Interface + include_in_menu: false inherit_from: - DcimInterface - InterfaceLayer2 - InterfaceLayer3 - DcimEndpoint - InterfaceHasSubInterface - include_in_menu: false - attributes: - - name: mtu - label: MTU - kind: Number - default_value: 1500 - order_weight: 1300 - name: Virtual namespace: Interface - label: Virtual Interface description: Virtual interface like VLAN or Loopback + label: Virtual Interface + include_in_menu: false inherit_from: - DcimInterface - InterfaceLayer2 - InterfaceLayer3 - include_in_menu: false relationships: - name: parent_interface peer: InterfaceHasSubInterface - cardinality: one kind: Attribute + cardinality: one identifier: sub__interface + optional: true description: Parent interface to which this sub-interface belongs + order_weight: 1600 ``` \ No newline at end of file diff --git a/docs/docs/reference/device_module.mdx b/docs/docs/reference/device_module.mdx index 43bc679..ce1ca16 100644 --- a/docs/docs/reference/device_module.mdx +++ b/docs/docs/reference/device_module.mdx @@ -21,7 +21,6 @@ NOTE: This extension ships a standard Module/ModuleType node pair ready to use, - **Icon:** mdi:tray - **Uniqueness Constraints:** - device, name__value - - device, position__value - **Human Friendly ID:** computed_name__value #### Attributes @@ -29,9 +28,10 @@ NOTE: This extension ships a standard Module/ModuleType node pair ready to use, | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | | computed_name | Name computed from the device and bay name. | Text | False | | | -| name | Name of the bay, e.g. 'slot 1' or 'psu 1'. | Text | | | | -| position | Numeric position of the bay within the device, used for ordering (e.g. slot 1, 2, 3...). | Number | False | | | +| name | Name of the bay, e.g. 'slot 1' or 'psu 1'. | Text | False | | | +| position | Numeric position of the bay within the device (e.g. slot 1, 2, 3). | Number | True | | | | description | | Text | True | | | +| role | The role of the module bay, indicating the type of module it is intended to receive. | Dropdown | True | | supervisor, line_card, power_supply, fan | #### Relationships @@ -82,7 +82,7 @@ NOTE: This extension ships a standard Module/ModuleType node pair ready to use, | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| computed_name | | Text | False | | | +| computed_name | Name computed from the module bay; concrete module kinds may refine it. | Text | False | | | | serial_number | Serial number of the module, if known. | Text | True | | | | description | | Text | True | | | @@ -106,7 +106,7 @@ NOTE: This extension ships a standard Module/ModuleType node pair ready to use, | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| name | Name of the module type. | Text | | | | +| name | Name of the module type. | Text | False | | | | description | Description of the module type. | Text | True | | | | part_number | Part number of the module. | Text | True | | | @@ -143,34 +143,40 @@ generics: a module bay. label: Module icon: mdi:expansion-card + include_in_menu: true human_friendly_id: - computed_name__value display_label: computed_name__value attributes: - name: computed_name kind: Text + unique: true read_only: true optional: false - unique: true allow_override: any + computed_attribute: + kind: Jinja2 + jinja2_template: '{{ module_bay__computed_name__value }}' + description: Name computed from the module bay; concrete module kinds may refine + it. order_weight: 1000 - name: serial_number kind: Text optional: true description: Serial number of the module, if known. - order_weight: 1100 + order_weight: 1400 - name: description kind: Text optional: true - order_weight: 1200 + order_weight: 1100 relationships: - name: module_bay - label: Module Bay peer: DcimModuleBay - identifier: module_bay__module - optional: false - cardinality: one + label: Module Bay kind: Attribute + cardinality: one + optional: false + identifier: module_bay__module order_weight: 900 - name: GenericModuleType namespace: Dcim @@ -178,20 +184,22 @@ generics: and manufacturer. label: Module Type icon: mdi:database-cog + include_in_menu: true menu_placement: DcimGenericModule - display_label: name__value - uniqueness_constraints: - - - name__value - - manufacturer human_friendly_id: - name__value order_by: - manufacturer__name__value - name__value + display_label: name__value + uniqueness_constraints: + - - name__value + - manufacturer attributes: - name: name kind: Text unique: true + optional: false description: Name of the module type. order_weight: 1000 - name: description @@ -200,18 +208,18 @@ generics: description: Description of the module type. order_weight: 1100 - name: part_number - label: Part Number kind: Text + label: Part Number optional: true description: Part number of the module. order_weight: 1200 relationships: - name: manufacturer peer: OrganizationManufacturer - identifier: manufacturer__moduletype + kind: Attribute cardinality: one optional: false - kind: Attribute + identifier: manufacturer__moduletype description: Manufacturer of the module type. order_weight: 1250 nodes: @@ -220,61 +228,83 @@ nodes: description: A physical bay on a device that can receive a module. label: Module Bay icon: mdi:tray + include_in_menu: true menu_placement: DcimDevice human_friendly_id: - computed_name__value - display_label: computed_name__value order_by: - device__name__value - name__value + display_label: computed_name__value uniqueness_constraints: - - device - name__value - - - device - - position__value attributes: - name: computed_name kind: Text - read_only: true - optional: false unique: true + read_only: true computed_attribute: kind: Jinja2 jinja2_template: '{{ device__name__value }} > {{ name__value }}' + optional: false description: Name computed from the device and bay name. order_weight: 800 - name: name kind: Text + optional: false description: Name of the bay, e.g. 'slot 1' or 'psu 1'. order_weight: 1000 - name: position kind: Number - description: Numeric position of the bay within the device, used for ordering - (e.g. slot 1, 2, 3...). - optional: false + optional: true parameters: min_value: 1 + description: Numeric position of the bay within the device (e.g. slot 1, 2, 3). order_weight: 1050 - name: description kind: Text optional: true order_weight: 1100 + - name: role + kind: Dropdown + optional: true + description: The role of the module bay, indicating the type of module it is intended + to receive. + order_weight: 1300 + choices: + - name: supervisor + label: Supervisor + description: Bay intended for a supervisor / routing engine module. + color: '#A9CCE3' + - name: line_card + label: Line Card + description: Bay intended for a line card module. + color: '#B4E0DC' + - name: power_supply + label: Power Supply + description: Bay intended for a power supply module. + color: '#E3DAC9' + - name: fan + label: Fan + description: Bay intended for a fan module. + color: '#D2B4DE' relationships: - name: device - label: Device peer: DcimPhysicalDevice - identifier: device__module_bays - optional: false - cardinality: one + label: Device kind: Parent + cardinality: one + optional: false + identifier: device__module_bays order_weight: 900 - name: installed_module - label: Installed Module peer: DcimGenericModule - identifier: module_bay__module - optional: true - cardinality: one + label: Installed Module kind: Attribute + cardinality: one + optional: true + identifier: module_bay__module order_weight: 1200 - name: Module namespace: Dcim @@ -287,21 +317,21 @@ nodes: attributes: - name: computed_name kind: Text - read_only: true - optional: false unique: true + read_only: true computed_attribute: kind: Jinja2 jinja2_template: '{{ module_bay__computed_name__value }} ({{ module_type__name__value }})' + optional: false description: Name computed from the module bay and module type. order_weight: 1000 relationships: - name: module_type peer: DcimModuleType - optional: false - cardinality: one kind: Attribute + cardinality: one + optional: false order_weight: 950 - name: ModuleType namespace: Dcim @@ -316,12 +346,13 @@ extensions: - kind: DcimPhysicalDevice relationships: - name: module_bays - label: Module Bays peer: DcimModuleBay - identifier: device__module_bays - cardinality: many + label: Module Bays kind: Component + cardinality: many optional: true + identifier: device__module_bays description: Module bays available on this device. + order_weight: 1750 ``` \ No newline at end of file diff --git a/docs/docs/reference/device_psu_module.mdx b/docs/docs/reference/device_psu_module.mdx index 3ce6d53..71c3a89 100644 --- a/docs/docs/reference/device_psu_module.mdx +++ b/docs/docs/reference/device_psu_module.mdx @@ -45,7 +45,7 @@ This schema extension adds a PSU (Power Supply Unit) flavor on top of the generi | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | | wattage | Wattage in watts. | Number | True | | | -| hotswappable | Whether the PSU can be replaced without powering down the device. | Boolean | False | False | | +| hot_swappable | Whether the PSU can be replaced without powering down the device. | Boolean | False | False | | ## Code @@ -63,21 +63,21 @@ nodes: attributes: - name: computed_name kind: Text - read_only: true - optional: false unique: true + read_only: true computed_attribute: kind: Jinja2 jinja2_template: '{{ module_bay__computed_name__value }} ({{ module_type__name__value }})' + optional: false description: Name computed from the module bay and module type. order_weight: 1000 relationships: - name: module_type peer: DcimPSUModuleType - optional: false - cardinality: one kind: Attribute + cardinality: one + optional: false order_weight: 950 - name: PSUModuleType namespace: Dcim @@ -90,16 +90,19 @@ nodes: - DcimGenericModuleType attributes: - name: wattage - description: Wattage in watts. kind: Number + label: Wattage (W) optional: true + parameters: + min_value: 1 + description: Wattage in watts. order_weight: 1300 - - name: hotswappable - label: Hot-Swappable - description: Whether the PSU can be replaced without powering down the device. + - name: hot_swappable kind: Boolean - optional: false + label: Hot-Swappable default_value: false + optional: false + description: Whether the PSU can be replaced without powering down the device. order_weight: 1350 ``` \ No newline at end of file diff --git a/docs/docs/reference/dwdm.mdx b/docs/docs/reference/dwdm.mdx index 81c9cff..14ae741 100644 --- a/docs/docs/reference/dwdm.mdx +++ b/docs/docs/reference/dwdm.mdx @@ -15,7 +15,9 @@ This schema extension contains models for OADM (Optical Add Drop Multiplexer) su ### OpticalMultiplexer - **Label:** Optical Multiplexer -- **Description:** An OADM (Optical Add Drop Multiplexer) supporting various WDM (Wavelength Division Multiplexing) technologies. +- **Description:** An OADM (Optical Add Drop Multiplexer) supporting various WDM +(Wavelength Division Multiplexing) technologies. + - **Namespace:** Dcim - **Icon:** mdi:transit-connection-variant - **Human Friendly ID:** name__value @@ -25,8 +27,8 @@ This schema extension contains models for OADM (Optical Add Drop Multiplexer) su | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| name | | Text | | | | -| wdm_type | Type of WDM (e.g CWDM. DWDM) | Dropdown | False | dwdm | cwdm, dwdm | +| name | | Text | False | | | +| wdm_type | Type of WDM technology (e.g. CWDM, DWDM) | Dropdown | False | dwdm | cwdm, dwdm | | description | | Text | True | | | #### Relationships @@ -39,6 +41,7 @@ This schema extension contains models for OADM (Optical Add Drop Multiplexer) su ### OadmFrontInterface - **Label:** Optical Multiplexer Front Interfaces +- **Description:** Client-side interface of an optical add-drop multiplexer, carrying a single channel. - **Namespace:** Dcim - **Uniqueness Constraints:** - optical_multiplexer, name__value @@ -55,6 +58,7 @@ This schema extension contains models for OADM (Optical Add Drop Multiplexer) su ### OadmRearInterface - **Label:** Optical Multiplexer Rear Interfaces +- **Description:** Line-side interface of an optical add-drop multiplexer, carrying the multiplexed signal. - **Namespace:** Dcim - **Uniqueness Constraints:** - optical_multiplexer, name__value @@ -82,10 +86,10 @@ This schema extension contains models for OADM (Optical Add Drop Multiplexer) su | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| channel | WDM channel number. | Number | | | | -| wdm_type | Type of WDM (e.g CWDM. DWDM) | Dropdown | False | dwdm | cwdm, dwdm | -| wavelength | Wavelength of the channel in nm. | Text | | | | -| frequency | Frequency of the channel in GHz. | Text | | | | +| channel | WDM channel number. | Number | False | | | +| wdm_type | Type of WDM technology (e.g. CWDM, DWDM) | Dropdown | False | dwdm | cwdm, dwdm | +| wavelength | Wavelength of the channel in nm. | Text | False | | | +| frequency | Frequency of the channel in GHz. | Text | False | | | ### WdmSFP @@ -99,7 +103,7 @@ This schema extension contains models for OADM (Optical Add Drop Multiplexer) su | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| wdm_type | Type of WDM (e.g CWDM. DWDM) | Dropdown | False | dwdm | cwdm, dwdm | +| wdm_type | Type of WDM technology (e.g. CWDM, DWDM) | Dropdown | False | dwdm | cwdm, dwdm | #### Relationships @@ -112,6 +116,7 @@ This schema extension contains models for OADM (Optical Add Drop Multiplexer) su ### GenericOadmInterface - **Label:** Optical Multiplexer Interfaces +- **Description:** Generic interface of an optical add-drop multiplexer, front or rear. - **Namespace:** Dcim - **Icon:** mdi:ethernet @@ -119,9 +124,9 @@ This schema extension contains models for OADM (Optical Add Drop Multiplexer) su | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| name | | Text | | | | +| name | | Text | False | | | | description | | Text | True | | | -| connector_type | | Dropdown | True | | FC, LC, LC_PC, LC_UPC, LC_APC, LSH, LSH_PC, LSH_UPC, LSH_APC, LX_5, LX_5_PC, LX_5_UPC, LX_5_APC, MPO, MTRJ, SC, SC_PC, SC_UPC, SC_APC, ST, CS, SN, SMA_905, SMA_906, URM_P2 | +| connector_type | | Dropdown | False | | fc, lc, lc_pc, lc_upc, lc_apc, lsh, lsh_pc, lsh_upc, lsh_apc, lx_5, lx_5_pc, lx_5_upc, lx_5_apc, mpo, mtrj, sc, sc_pc, sc_upc, sc_apc, st, cs, sn, sma_905, sma_906, urm_p2, urm_p4, urm_p8, splice | ## Code @@ -129,131 +134,146 @@ This schema extension contains models for OADM (Optical Add Drop Multiplexer) su version: '1.0' generics: - name: GenericOadmInterface - label: Optical Multiplexer Interfaces - menu_placement: DcimOpticalMultiplexer namespace: Dcim + description: Generic interface of an optical add-drop multiplexer, front or rear. + label: Optical Multiplexer Interfaces icon: mdi:ethernet + include_in_menu: true + menu_placement: DcimOpticalMultiplexer attributes: - name: name kind: Text + optional: false order_weight: 1000 - name: description kind: Text optional: true - order_weight: 2000 + order_weight: 1100 - name: connector_type kind: Dropdown - optional: true - order_weight: 1100 choices: - - name: FC + - name: fc label: FC description: Standardized fiber optic connector used primarily in datacom and telecom applications. - - name: LC + - name: lc label: LC description: Compact fiber optic connector with a push-pull mechanism. - - name: LC_PC + - name: lc_pc label: LC/PC description: Polished LC connector providing physical contact (PC). - - name: LC_UPC + - name: lc_upc label: LC/UPC description: Ultra-Physical Contact (UPC) variant of the LC connector with enhanced polish. - - name: LC_APC + - name: lc_apc label: LC/APC description: Angled Physical Contact (APC) version of the LC connector with a slanted fiber end-face. - - name: LSH + - name: lsh label: LSH description: European fiber optic connector offering high durability. - - name: LSH_PC + - name: lsh_pc label: LSH/PC description: Physical Contact version of LSH with standard polish. - - name: LSH_UPC + - name: lsh_upc label: LSH/UPC description: Ultra-Physical Contact variant of LSH, minimizing return loss with a superior polish. - - name: LSH_APC + - name: lsh_apc label: LSH/APC description: Angled Physical Contact version of LSH, designed to reduce back reflections. - - name: LX_5 + - name: lx_5 label: LX.5 description: Miniaturized fiber optic connector similar to LC but with an additional shutter mechanism. - - name: LX_5_PC + - name: lx_5_pc label: LX.5/PC description: Physical Contact version of LX.5. - - name: LX_5_UPC + - name: lx_5_upc label: LX.5/UPC description: Ultra-Physical Contact variant of LX.5. - - name: LX_5_APC + - name: lx_5_apc label: LX.5/APC description: Angled Physical Contact version of LX.5. - - name: MPO + - name: mpo label: MPO description: Multi-fiber Push-On connector typically used in data centers for high-speed applications. - - name: MTRJ + - name: mtrj label: MTRJ description: Male-to-female fiber optic connector with two fibers. - - name: SC + - name: sc label: SC description: Square fiber optic connector with push-pull lock. - - name: SC_PC + - name: sc_pc label: SC/PC description: Physical Contact SC connector with a polished end-face. - - name: SC_UPC + - name: sc_upc label: SC/UPC description: Ultra-Physical Contact variant of SC. - - name: SC_APC + - name: sc_apc label: SC/APC description: Angled Physical Contact version of SC. - - name: ST + - name: st label: ST description: Bayonet-style fiber optic connector primarily used in industrial and military applications. - - name: CS + - name: cs label: CS description: Compact connector with a high-density duplex configuration. - - name: SN + - name: sn label: SN description: Small-form connector with dual fibers. - - name: SMA_905 + - name: sma_905 label: SMA 905 description: Stainless steel fiber optic connector. - - name: SMA_906 + - name: sma_906 label: SMA 906 description: Variant of SMA 905 with similar durability, frequently used in high-vibration settings. - - name: URM_P2 + - name: urm_p2 label: URM-P2 description: Specialized fiber optic connector for industrial and harsh environments. + - name: urm_p4 + label: URM-P4 + description: Similar to URM-P2 but designed for higher performance. + - name: urm_p8 + label: URM-P8 + description: Enhanced version of URM connectors with higher protection. + - name: splice + label: Splice + description: Permanent fiber connection method where two fiber ends are fused. + optional: false + order_weight: 1200 nodes: - name: OpticalMultiplexer + namespace: Dcim + description: 'An OADM (Optical Add Drop Multiplexer) supporting various WDM + + (Wavelength Division Multiplexing) technologies. + + ' label: Optical Multiplexer - description: An OADM (Optical Add Drop Multiplexer) supporting various WDM (Wavelength - Division Multiplexing) technologies. icon: mdi:transit-connection-variant - namespace: Dcim + include_in_menu: true + inherit_from: + - DcimPhysicalDevice human_friendly_id: - name__value order_by: - name__value display_label: name__value - inherit_from: - - DcimPhysicalDevice attributes: - name: name kind: Text unique: true + optional: false order_weight: 1000 - name: wdm_type kind: Dropdown - description: Type of WDM (e.g CWDM. DWDM) - order_weight: 1100 - optional: false + default_value: dwdm choices: - name: cwdm label: CWDM (Coarse Wavelength Division Multiplexing) @@ -264,86 +284,100 @@ nodes: description: Supports dense wavelengths and amplification for long-distance communication. color: '#9933cc' - default_value: dwdm + optional: false + description: Type of WDM technology (e.g. CWDM, DWDM) + order_weight: 1300 - name: description kind: Text optional: true - order_weight: 2000 + order_weight: 1100 relationships: - name: front_interfaces peer: DcimOadmFrontInterface - identifier: optical_multiplexer__front_interfaces - optional: true - cardinality: many kind: Component + cardinality: many + optional: true + identifier: optical_multiplexer__front_interfaces + order_weight: 1350 - name: rear_interface peer: DcimOadmRearInterface - identifier: optical_multiplexer__rear_interface - optional: true - cardinality: one kind: Component + cardinality: one + optional: true + identifier: optical_multiplexer__rear_interface + order_weight: 1450 - name: OadmFrontInterface + namespace: Dcim + description: Client-side interface of an optical add-drop multiplexer, carrying + a single channel. label: Optical Multiplexer Front Interfaces + include_in_menu: true menu_placement: DcimGenericOadmInterface - namespace: Dcim + inherit_from: + - DcimEndpoint + - DcimGenericOadmInterface human_friendly_id: - optical_multiplexer__name__value - name__value - display_label: '{{ optical_multiplexer__name__value }} > {{ name__value }}' order_by: - optical_multiplexer__name__value - name__value + display_label: '{{ optical_multiplexer__name__value }} > {{ name__value }}' uniqueness_constraints: - - optical_multiplexer - name__value - inherit_from: - - DcimEndpoint - - DcimGenericOadmInterface relationships: - name: optical_multiplexer peer: DcimOpticalMultiplexer - order_weight: 900 - identifier: optical_multiplexer__front_interfaces - optional: false - cardinality: one kind: Parent + cardinality: one + optional: false + identifier: optical_multiplexer__front_interfaces + order_weight: 900 - name: channels peer: DcimWdmChannel - identifier: oadm_interface__channels - order_weight: 1200 - optional: true - cardinality: many kind: Attribute + cardinality: many + optional: true + identifier: oadm_interface__channels + order_weight: 1300 - name: OadmRearInterface + namespace: Dcim + description: Line-side interface of an optical add-drop multiplexer, carrying the + multiplexed signal. label: Optical Multiplexer Rear Interfaces + include_in_menu: true menu_placement: DcimGenericOadmInterface - namespace: Dcim + inherit_from: + - DcimEndpoint + - DcimGenericOadmInterface human_friendly_id: - optical_multiplexer__name__value - name__value - display_label: '{{ optical_multiplexer__name__value }} > {{ name__value }}' order_by: - optical_multiplexer__name__value - name__value + display_label: '{{ optical_multiplexer__name__value }} > {{ name__value }}' uniqueness_constraints: - - optical_multiplexer - name__value - inherit_from: - - DcimEndpoint - - DcimGenericOadmInterface relationships: - name: optical_multiplexer peer: DcimOpticalMultiplexer - order_weight: 900 - identifier: optical_multiplexer__rear_interface - optional: false - cardinality: one kind: Parent + cardinality: one + optional: false + identifier: optical_multiplexer__rear_interface + order_weight: 900 - name: WdmChannel namespace: Dcim description: A WDM channel with its wavelength and frequency. label: WDM Channel icon: game-icons:laser-warning + include_in_menu: true + human_friendly_id: + - wdm_type__value + - channel__value order_by: - wdm_type__value - channel__value @@ -355,19 +389,15 @@ nodes: - wdm_type__value - - channel__value - wdm_type__value - human_friendly_id: - - wdm_type__value - - channel__value attributes: - name: channel kind: Number + optional: false description: WDM channel number. order_weight: 1000 - name: wdm_type kind: Dropdown - description: Type of WDM (e.g CWDM. DWDM) - order_weight: 1100 - optional: false + default_value: dwdm choices: - name: cwdm label: CWDM (Coarse Wavelength Division Multiplexing) @@ -378,31 +408,34 @@ nodes: description: Supports dense wavelengths and amplification for long-distance communication. color: '#9933cc' - default_value: dwdm + optional: false + description: Type of WDM technology (e.g. CWDM, DWDM) + order_weight: 1100 - name: wavelength - label: Wavelength (nm) kind: Text + label: Wavelength (nm) + optional: false description: Wavelength of the channel in nm. order_weight: 1200 - name: frequency - label: Frequency (GHz) kind: Text + label: Frequency (GHz) + optional: false description: Frequency of the channel in GHz. order_weight: 1300 - name: WdmSFP namespace: Dcim - inherit_from: - - DcimGenericSFP description: SFP with configuration for Wavelength Division Multiplexing. label: WDM SFP icon: mdi:laser-pointer + include_in_menu: true menu_placement: DcimGenericSFP + inherit_from: + - DcimGenericSFP attributes: - name: wdm_type kind: Dropdown - description: Type of WDM (e.g CWDM. DWDM) - order_weight: 1100 - optional: false + default_value: dwdm choices: - name: cwdm label: CWDM (Coarse Wavelength Division Multiplexing) @@ -413,15 +446,17 @@ nodes: description: Supports dense wavelengths and amplification for long-distance communication. color: '#9933cc' - default_value: dwdm + optional: false + description: Type of WDM technology (e.g. CWDM, DWDM) + order_weight: 1150 relationships: - name: wdm_channel - label: WDM Channel peer: DcimWdmChannel - identifier: wdm_sfp__channel + label: WDM Channel kind: Attribute cardinality: one optional: false - order_weight: 1150 + identifier: wdm_sfp__channel + order_weight: 1250 ``` \ No newline at end of file diff --git a/docs/docs/reference/firewall_policer.mdx b/docs/docs/reference/firewall_policer.mdx index da563f6..426dfc6 100644 --- a/docs/docs/reference/firewall_policer.mdx +++ b/docs/docs/reference/firewall_policer.mdx @@ -2,7 +2,7 @@ title: Firewall Policer --- -This schema extension contains models for VMs. You might consider Cluster or/and Hypervisor extension to go with! +This schema extension contains models for traffic policers and the classes and rules that reference them, so you can describe rate limiting alongside the interfaces it is applied to. ## Details diff --git a/docs/docs/reference/hosting_cluster.mdx b/docs/docs/reference/hosting_cluster.mdx index 3155fd5..adc3f83 100644 --- a/docs/docs/reference/hosting_cluster.mdx +++ b/docs/docs/reference/hosting_cluster.mdx @@ -25,7 +25,7 @@ A rather generic cluster built with compute units (e.g. servers) and able to hos | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| technology | Underlying virtualisation or clustering technology. | Dropdown | | | vmware, kvm, hyper_v, xen, nutanix, openstack, kubernetes, public_cloud | +| technology | Underlying virtualisation or clustering technology. | Dropdown | False | | vmware, kvm, hyper_v, xen, nutanix, openstack, kubernetes, public_cloud | | status | | Dropdown | False | active | active, provisioning, maintenance, drained | ## Code @@ -35,20 +35,19 @@ version: '1.0' nodes: - name: Hosting namespace: Cluster - label: Hosting Cluster description: A cluster hosting virtual machines. + label: Hosting Cluster icon: mdi:dots-hexagon - menu_placement: VirtualizationVirtualMachine + include_in_menu: true + menu_placement: ComputeGenericUnit inherit_from: - ClusterGeneric - VirtualizationHostVirtualMachine - ClusterGenericComputeUnitNodes attributes: - name: technology - label: Technology kind: Dropdown - order_weight: 1200 - description: Underlying virtualisation or clustering technology. + label: Technology choices: - name: vmware label: VMware vSphere @@ -74,11 +73,12 @@ nodes: - name: public_cloud label: Public Cloud color: '#888888' + optional: false + description: Underlying virtualisation or clustering technology. + order_weight: 1300 - name: status kind: Dropdown - optional: false default_value: active - order_weight: 1300 choices: - name: active label: Active @@ -96,5 +96,7 @@ nodes: label: Drained description: Temporarily taken out of service. color: '#9e9e9e' + optional: false + order_weight: 1200 ``` \ No newline at end of file diff --git a/docs/docs/reference/interface_breakout.mdx b/docs/docs/reference/interface_breakout.mdx index 0de9a75..7985a9f 100644 --- a/docs/docs/reference/interface_breakout.mdx +++ b/docs/docs/reference/interface_breakout.mdx @@ -42,29 +42,30 @@ extensions: attributes: - name: breakout_capability kind: Boolean - optional: false default_value: false + optional: false description: Indicates if the port supports breakout capability + order_weight: 1800 relationships: - name: breakout_child_interfaces peer: InterfacePhysical label: Breakout child interface(s) - optional: true - cardinality: many kind: Attribute + cardinality: many + optional: true identifier: physical__breakout direction: outbound description: Interfaces resulting from the breakout - order_weight: 1650 + order_weight: 1850 - name: breakout_parent_interface peer: InterfacePhysical label: Breakout parent interface - optional: true - cardinality: one kind: Attribute + cardinality: one + optional: true identifier: physical__breakout direction: inbound description: Interface from which breakout is created - order_weight: 1700 + order_weight: 1900 ``` \ No newline at end of file diff --git a/docs/docs/reference/ipam.mdx b/docs/docs/reference/ipam.mdx index 29c5022..462bea8 100644 --- a/docs/docs/reference/ipam.mdx +++ b/docs/docs/reference/ipam.mdx @@ -17,7 +17,7 @@ Basic IPAM schema to capture IP addresses, subnets, and related information. - **Namespace:** Ipam - **Icon:** mdi:ip-network - **Uniqueness Constraints:** - - prefix__value, ip_namespace + - ip_namespace, prefix__value - **Human Friendly ID:** ip_namespace__name__value, prefix__value - **Inherit From:** BuiltinIPPrefix @@ -25,7 +25,7 @@ Basic IPAM schema to capture IP addresses, subnets, and related information. | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| status | | Dropdown | False | active | active, deprecated, reserved | +| status | | Dropdown | False | active | active, reserved, deprecated | | description | | Text | True | | | | role | | Dropdown | True | | management, link, customer, supernet, backbone | @@ -42,7 +42,7 @@ Basic IPAM schema to capture IP addresses, subnets, and related information. - **Namespace:** Ipam - **Icon:** mdi:ip - **Uniqueness Constraints:** - - address__value, ip_namespace + - ip_namespace, address__value - **Human Friendly ID:** ip_namespace__name__value, address__value - **Inherit From:** BuiltinIPAddress @@ -60,17 +60,20 @@ Basic IPAM schema to capture IP addresses, subnets, and related information. | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | | primary_of | DcimGenericDevice | True | many | Attribute | -| interface | InterfaceLayer3 | True | one | | +| interface | InterfaceLayer3 | True | one | Attribute | ## Generics ### VLANGroupScope +- **Label:** VLAN Group Scope +- **Description:** Mixin for objects that can scope a VLAN group (e.g. Region, Site). The reverse relationship is added by extensions/vlan. - **Namespace:** Ipam ### PrefixScope -- **Description:** Mixin for objects that can scope IP prefixes (e.g. Region, Site, VRF). +- **Label:** Prefix Scope +- **Description:** Mixin for objects that can scope IP prefixes (e.g. Region, Site). - **Namespace:** Ipam #### Relationships @@ -86,60 +89,63 @@ version: '1.0' generics: - name: VLANGroupScope namespace: Ipam + label: VLAN Group Scope + description: Mixin for objects that can scope a VLAN group (e.g. Region, Site). + The reverse relationship is added by extensions/vlan. include_in_menu: false - name: PrefixScope namespace: Ipam - description: Mixin for objects that can scope IP prefixes (e.g. Region, Site, VRF). + label: Prefix Scope + description: Mixin for objects that can scope IP prefixes (e.g. Region, Site). include_in_menu: false relationships: - name: prefixes peer: IpamPrefix - identifier: prefix__prefix_scope + kind: Generic cardinality: many optional: true - kind: Generic + identifier: prefix__prefix_scope + order_weight: 1550 nodes: - name: Prefix namespace: Ipam description: IPv4 or IPv6 network (with mask) - include_in_menu: false - icon: mdi:ip-network label: Prefix - order_by: - - prefix__value - display_label: prefix__value + icon: mdi:ip-network + include_in_menu: false inherit_from: - BuiltinIPPrefix - uniqueness_constraints: - - - prefix__value - - ip_namespace human_friendly_id: - ip_namespace__name__value - prefix__value + order_by: + - prefix__value + display_label: prefix__value + uniqueness_constraints: + - - ip_namespace + - prefix__value attributes: - name: status kind: Dropdown - optional: false default_value: active - order_weight: 1100 choices: - name: active label: Active color: '#00d25b' - - name: deprecated - label: Deprecated - color: '#e04040' - name: reserved label: Reserved color: '#4d90fe' + - name: deprecated + label: Deprecated + color: '#e04040' + optional: false + order_weight: 1200 - name: description kind: Text optional: true - order_weight: 1150 + order_weight: 1100 - name: role kind: Dropdown - optional: true - order_weight: 1200 choices: - name: management label: Management @@ -160,42 +166,42 @@ nodes: - name: backbone label: Backbone description: Core network infrastructure prefixes. - color: '#AEC6CF' + color: '#9678B6' + optional: true + order_weight: 1300 relationships: - name: scope peer: IpamPrefixScope + kind: Attribute + cardinality: one optional: true identifier: prefix__prefix_scope - cardinality: one - kind: Attribute - order_weight: 1300 + order_weight: 1500 - name: IPAddress namespace: Ipam description: IP Address - include_in_menu: false label: IP Address icon: mdi:ip - order_by: - - address__value - display_label: address__value + include_in_menu: false inherit_from: - BuiltinIPAddress - uniqueness_constraints: - - - address__value - - ip_namespace human_friendly_id: - ip_namespace__name__value - address__value + order_by: + - address__value + display_label: address__value + uniqueness_constraints: + - - ip_namespace + - address__value attributes: - name: description kind: Text optional: true - order_weight: 1050 + order_weight: 1100 - name: status kind: Dropdown - optional: false default_value: active - order_weight: 1100 choices: - name: active label: Active @@ -206,10 +212,10 @@ nodes: - name: deprecated label: Deprecated color: '#e04040' + optional: false + order_weight: 1200 - name: role kind: Dropdown - optional: true - order_weight: 1150 choices: - name: loopback label: Loopback @@ -220,25 +226,29 @@ nodes: - name: anycast label: Anycast color: '#FDFD96' + optional: true + order_weight: 1300 - name: fqdn - label: FQDN kind: Text - optional: true - order_weight: 1200 + label: FQDN regex: (?=^.{1,253}$)(^(((?!-)[a-zA-Z0-9-]{1,63}(? Country -> Site hierarchy. It defines the same Location.Site node as extensions/location_site, so load one or the other, not both. Note that LocationGeneric.name is unique across every location kind, so a name used at one tier cannot be reused at another; a single-country deployment therefore enters the hierarchy at Country (with Region as the national node) rather than duplicating a country under several regions. ## Details @@ -14,6 +14,7 @@ This schema extension is minimal but will provide you with basic items to store ### Region - **Label:** Region +- **Description:** A geographical region grouping countries and sites. - **Namespace:** Location - **Icon:** carbon:cics-region-target - **Inherit From:** LocationGeneric, IpamPrefixScope @@ -21,6 +22,7 @@ This schema extension is minimal but will provide you with basic items to store ### Country - **Label:** Country +- **Description:** A country, sitting between a region and the sites it contains. - **Namespace:** Location - **Icon:** gis:search-country - **Inherit From:** LocationGeneric @@ -28,6 +30,7 @@ This schema extension is minimal but will provide you with basic items to store ### Site - **Label:** Site +- **Description:** A physical location hosting equipment, such as a data center or an office. - **Namespace:** Location - **Icon:** ri:building-line - **Inherit From:** LocationGeneric, LocationHosting, IpamPrefixScope, IpamVLANGroupScope @@ -36,7 +39,7 @@ This schema extension is minimal but will provide you with basic items to store | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| status | | Dropdown | False | active | active, planned, staging, decommissioning, retired | +| status | | Dropdown | False | active | active, planned, staging, decommissioning, deprecated | | facility | | Text | True | | | | physical_address | | Text | True | | | | timezone | | Text | True | | | @@ -48,41 +51,46 @@ version: '1.0' nodes: - name: Region namespace: Location + description: A geographical region grouping countries and sites. label: Region + icon: carbon:cics-region-target + include_in_menu: true + menu_placement: LocationGeneric inherit_from: - LocationGeneric - IpamPrefixScope - menu_placement: LocationGeneric parent: '' children: LocationCountry - icon: carbon:cics-region-target - name: Country namespace: Location + description: A country, sitting between a region and the sites it contains. label: Country + icon: gis:search-country + include_in_menu: true + menu_placement: LocationGeneric inherit_from: - LocationGeneric - menu_placement: LocationGeneric parent: LocationRegion children: LocationSite - icon: gis:search-country - name: Site namespace: Location + description: A physical location hosting equipment, such as a data center or an + office. label: Site + icon: ri:building-line + include_in_menu: true + menu_placement: LocationGeneric inherit_from: - LocationGeneric - LocationHosting - IpamPrefixScope - IpamVLANGroupScope - menu_placement: LocationGeneric - display_label: name__value parent: LocationCountry - icon: ri:building-line + display_label: name__value attributes: - name: status kind: Dropdown - optional: false default_value: active - order_weight: 1250 choices: - name: active label: Active @@ -96,19 +104,21 @@ nodes: - name: decommissioning label: Decommissioning color: '#ff9800' - - name: retired - label: Retired + - name: deprecated + label: Deprecated color: '#6c757d' + optional: false + order_weight: 1200 - name: facility kind: Text unique: false optional: true - order_weight: 1100 + order_weight: 1150 - name: physical_address kind: Text unique: false optional: true - order_weight: 1500 + order_weight: 1400 - name: timezone kind: Text optional: true diff --git a/docs/docs/reference/location_site.mdx b/docs/docs/reference/location_site.mdx index 03d40da..52c81d3 100644 --- a/docs/docs/reference/location_site.mdx +++ b/docs/docs/reference/location_site.mdx @@ -14,6 +14,7 @@ This schema extension introduces a standalone Location.Site node (with facility, ### Site - **Label:** Site +- **Description:** A physical location hosting equipment, such as a data center or an office. - **Namespace:** Location - **Icon:** ri:building-line - **Inherit From:** LocationGeneric, LocationHosting, IpamPrefixScope, IpamVLANGroupScope @@ -22,7 +23,7 @@ This schema extension introduces a standalone Location.Site node (with facility, | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| status | | Dropdown | False | active | active, planned, staging, decommissioning, retired | +| status | | Dropdown | False | active | active, planned, staging, decommissioning, deprecated | | facility | | Text | True | | | | physical_address | | Text | True | | | | timezone | | Text | True | | | @@ -34,21 +35,22 @@ version: '1.0' nodes: - name: Site namespace: Location + description: A physical location hosting equipment, such as a data center or an + office. label: Site + icon: ri:building-line + include_in_menu: true + menu_placement: LocationGeneric inherit_from: - LocationGeneric - LocationHosting - IpamPrefixScope - IpamVLANGroupScope - menu_placement: LocationGeneric display_label: name__value - icon: ri:building-line attributes: - name: status kind: Dropdown - optional: false default_value: active - order_weight: 1250 choices: - name: active label: Active @@ -62,19 +64,21 @@ nodes: - name: decommissioning label: Decommissioning color: '#ff9800' - - name: retired - label: Retired + - name: deprecated + label: Deprecated color: '#6c757d' + optional: false + order_weight: 1200 - name: facility kind: Text unique: false optional: true - order_weight: 1100 + order_weight: 1150 - name: physical_address kind: Text unique: false optional: true - order_weight: 1500 + order_weight: 1400 - name: timezone kind: Text optional: true diff --git a/docs/docs/reference/mlag.mdx b/docs/docs/reference/mlag.mdx index cb0b780..725c21a 100644 --- a/docs/docs/reference/mlag.mdx +++ b/docs/docs/reference/mlag.mdx @@ -35,9 +35,9 @@ Next steps: | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| name | Name of the interface | Text | | | | +| name | Name of the interface | Text | False | | | | description | A brief description of the interface | Text | True | | | -| status | The status of the interface | Dropdown | | active | provisioning, free, active, maintenance, disabled, deleted, outage | +| status | The status of the interface | Dropdown | False | active | provisioning, free, active, maintenance, disabled, deleted, outage | | role | The role of the interface in the network | Dropdown | True | | server, router | #### Relationships @@ -65,6 +65,7 @@ Next steps: ### MlagDomain - **Label:** MLAG Domain +- **Description:** Generic holding the peer links and interfaces shared by the members of an MLAG domain. - **Namespace:** Generic - **Human Friendly ID:** domain_id__value @@ -72,15 +73,15 @@ Next steps: | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| domain_id | Identifier for the MLAG domain | Text | | | | -| reload_delay | Time in seconds to wait before bringing up the MLAG after a reload | Number | | 300 | | +| domain_id | Identifier for the MLAG domain | Text | False | | | +| reload_delay | Time in seconds to wait before bringing up the MLAG after a reload | Number | False | 300 | | #### Relationships | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | -| peer_links | InterfaceLag | | many | Attribute | -| mlag_interfaces | MlagInterface | | many | Component | +| peer_links | InterfaceLag | True | many | Attribute | +| mlag_interfaces | MlagInterface | True | many | Component | ## Extensions @@ -113,61 +114,68 @@ version: '1.0' generics: - name: MlagDomain namespace: Generic - include_in_menu: false + description: Generic holding the peer links and interfaces shared by the members + of an MLAG domain. label: MLAG Domain - display_label: domain_id__value + include_in_menu: false human_friendly_id: - domain_id__value + display_label: domain_id__value attributes: - name: domain_id - label: MLAG Domain ID kind: Text + label: MLAG Domain ID unique: true + optional: false description: Identifier for the MLAG domain - order_weight: 900 + order_weight: 1000 - name: reload_delay - label: Reload Delay kind: Number - description: Time in seconds to wait before bringing up the MLAG after a reload + label: Reload Delay default_value: 300 + optional: false + description: Time in seconds to wait before bringing up the MLAG after a reload order_weight: 1650 relationships: - name: peer_links - label: Peer Links - description: LAG interfaces used as peer-links between the MLAG peers peer: InterfaceLag - cardinality: many + label: Peer Links kind: Attribute + cardinality: many + optional: true + description: LAG interfaces used as peer-links between the MLAG peers order_weight: 1500 - name: mlag_interfaces - label: MLAG Interface(s) peer: MlagInterface - cardinality: many + label: MLAG Interface(s) kind: Component + cardinality: many + optional: true description: Bundle interfaces that are spread across all devices in this MLAG domain. - order_weight: 1500 + order_weight: 1550 nodes: - name: Interface namespace: Mlag - label: MLAG Interface description: Multi-Chassis Link Aggregation Group Interface + label: MLAG Interface + include_in_menu: false inherit_from: - InterfaceLayer2 - GenericInterfaceBundle - include_in_menu: false - uniqueness_constraints: - - - mlag_domain - - name__value human_friendly_id: - mlag_domain__domain_id__value - name__value order_by: - name__value display_label: name__value + uniqueness_constraints: + - - mlag_domain + - name__value attributes: - name: name kind: Text + optional: false description: Name of the interface order_weight: 1000 - name: description @@ -177,7 +185,7 @@ nodes: order_weight: 1100 - name: status kind: Dropdown - description: The status of the interface + default_value: active choices: - name: provisioning label: Provisioning @@ -190,7 +198,7 @@ nodes: - name: active label: Active description: Interface is active and operational. - color: '#A9CCE3' + color: '#00d25b' - name: maintenance label: Maintenance description: Interface is under maintenance. @@ -207,12 +215,11 @@ nodes: label: Outage description: Interface is currently experiencing an outage. color: '#F4CCCC' - default_value: active + optional: false + description: The status of the interface order_weight: 1200 - name: role kind: Dropdown - optional: true - description: The role of the interface in the network choices: - name: server label: Server Interface @@ -222,55 +229,58 @@ nodes: label: Router Interface description: Interface connecting routers color: '#B2D4E6' - order_weight: 1250 + optional: true + description: The role of the interface in the network + order_weight: 1300 relationships: - name: mlag_domain - label: MLAG Domain peer: GenericMlagDomain - optional: false - cardinality: one + label: MLAG Domain kind: Parent + cardinality: one + optional: false description: MLAG Domain this MLAG Interface belongs to - order_weight: 1750 + order_weight: 900 - name: Domain namespace: Mlag - label: MLAG Domain description: MLAG (Multi-Chassis Link Aggregation Group) Domain + label: MLAG Domain icon: mingcute:cloud-line + include_in_menu: true inherit_from: - GenericMlagDomain relationships: - name: peers peer: DcimDevice - optional: false - cardinality: many kind: Generic + cardinality: many + optional: false identifier: device__mlag_domain - max_count: 2 min_count: 2 + max_count: 2 order_weight: 950 extensions: nodes: - kind: InterfaceLag relationships: - name: mlag_peer_link - label: MLAG Peer Link peer: MlagDomain - optional: true - cardinality: one + label: MLAG Peer Link kind: Attribute + cardinality: one + optional: true description: MLAG Domain this LAG is used as peer link - order_weight: 1800 + order_weight: 1950 - kind: DcimDevice relationships: - name: mlag_domain - label: MLAG Domain peer: MlagDomain - optional: true - cardinality: one + label: MLAG Domain kind: Attribute - description: MLAG Domain this device belongs to - order_weight: 1800 + cardinality: one + optional: true identifier: device__mlag_domain + description: MLAG Domain this device belongs to + order_weight: 1900 ``` \ No newline at end of file diff --git a/docs/docs/reference/optical_transport.mdx b/docs/docs/reference/optical_transport.mdx index 7f6d330..e95b27f 100644 --- a/docs/docs/reference/optical_transport.mdx +++ b/docs/docs/reference/optical_transport.mdx @@ -261,7 +261,7 @@ Comprehensive optical transport network schemas for DWDM/WDM systems (ADVA FSP 3 | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| computed_name | Computed module name (e.g., ABC123-TPD-1/1) | Text | False | | | +| computed_name | Computed module name (e.g., dc1-leaf1 > slot 1-TPD-1/1) | Text | False | | | | slot_number | Slot number in chassis (e.g., '1/1', '1/2', '2/1') | Text | False | | | | capacity_gbps | Line rate capacity in Gbps (e.g., 100, 200, 400) | Number | False | | | | modulation_format | Modulation format for optical transmission | Dropdown | False | | dp_qpsk, dp_16qam, dp_8qam, dp_64qam | @@ -290,7 +290,7 @@ Comprehensive optical transport network schemas for DWDM/WDM systems (ADVA FSP 3 | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| computed_name | Computed module name (e.g., ABC123-MUX-1/3) | Text | False | | | +| computed_name | Computed module name (e.g., dc1-leaf1 > slot 1-MUX-1/3) | Text | False | | | | slot_number | Slot number in chassis (e.g., '1/3', '1/4', '2/3') | Text | False | | | | mux_type | Type of multiplexer technology | Dropdown | False | | passive_mux, passive_demux, oadm, roadm, wss | | channel_capacity | Number of supported DWDM channels (e.g., 40, 80, 96) | Number | False | | | @@ -399,7 +399,7 @@ Comprehensive optical transport network schemas for DWDM/WDM systems (ADVA FSP 3 | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| computed_name | Computed module name (e.g., ABC123-AMP-1/5) | Text | False | | | +| computed_name | Computed module name (e.g., dc1-leaf1 > slot 1-AMP-1/5) | Text | False | | | | slot_number | Slot number in chassis (e.g., '1/5', '1/6', '2/5') | Text | False | | | | amplifier_type | Type of optical amplifier | Dropdown | False | | edfa, raman, soa, vgc, hybrid | | stage | Amplifier stage position | Dropdown | False | | booster, inline, preamplifier | @@ -1195,9 +1195,9 @@ nodes: optional: false computed_attribute: kind: Jinja2 - jinja2_template: '{{ module_bay__device__serial__value }}-TPD-{{ slot_number__value + jinja2_template: '{{ module_bay__computed_name__value }}-TPD-{{ slot_number__value }}' - description: Computed module name (e.g., ABC123-TPD-1/1) + description: Computed module name (e.g., dc1-leaf1 > slot 1-TPD-1/1) - name: slot_number kind: Text optional: false @@ -1307,9 +1307,9 @@ nodes: optional: false computed_attribute: kind: Jinja2 - jinja2_template: '{{ module_bay__device__serial__value }}-MUX-{{ slot_number__value + jinja2_template: '{{ module_bay__computed_name__value }}-MUX-{{ slot_number__value }}' - description: Computed module name (e.g., ABC123-MUX-1/3) + description: Computed module name (e.g., dc1-leaf1 > slot 1-MUX-1/3) - name: slot_number kind: Text optional: false @@ -1598,9 +1598,9 @@ nodes: optional: false computed_attribute: kind: Jinja2 - jinja2_template: '{{ module_bay__device__serial__value }}-AMP-{{ slot_number__value + jinja2_template: '{{ module_bay__computed_name__value }}-AMP-{{ slot_number__value }}' - description: Computed module name (e.g., ABC123-AMP-1/5) + description: Computed module name (e.g., dc1-leaf1 > slot 1-AMP-1/5) - name: slot_number kind: Text optional: false diff --git a/docs/docs/reference/organization.mdx b/docs/docs/reference/organization.mdx index 8674376..3a8fe46 100644 --- a/docs/docs/reference/organization.mdx +++ b/docs/docs/reference/organization.mdx @@ -21,8 +21,8 @@ Basic Organization schema to capture organizations, vendors, and related informa | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | -| device_type | DcimDeviceType | True | many | Attribute | -| platform | DcimPlatform | True | many | Attribute | +| device_types | DcimDeviceType | True | many | Attribute | +| platforms | DcimPlatform | True | many | Attribute | ### Provider @@ -36,7 +36,7 @@ Basic Organization schema to capture organizations, vendors, and related informa ### Generic - **Label:** Organization -- **Description:** An organization represent a legal entity, a company. +- **Description:** An organization represents a legal entity, such as a company. - **Namespace:** Organization - **Icon:** mdi:domain - **Human Friendly ID:** name__value @@ -45,7 +45,7 @@ Basic Organization schema to capture organizations, vendors, and related informa | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| name | | Text | | | | +| name | | Text | False | | | | description | | Text | True | | | #### Relationships @@ -61,60 +61,63 @@ version: '1.0' generics: - name: Generic namespace: Organization + description: An organization represents a legal entity, such as a company. label: Organization - description: An organization represent a legal entity, a company. + icon: mdi:domain + include_in_menu: true human_friendly_id: - name__value order_by: - name__value display_label: name__value - icon: mdi:domain - include_in_menu: true attributes: - name: name kind: Text unique: true + optional: false order_weight: 1000 - name: description kind: Text optional: true - order_weight: 1200 + order_weight: 1100 relationships: - name: tags peer: BuiltinTag - cardinality: many kind: Attribute + cardinality: many optional: true - order_weight: 3000 + order_weight: 2000 nodes: - name: Manufacturer namespace: Organization description: Device Manufacturer icon: mdi:domain - inherit_from: - - OrganizationGeneric include_in_menu: true menu_placement: OrganizationGeneric + inherit_from: + - OrganizationGeneric relationships: - - name: device_type + - name: device_types peer: DcimDeviceType + kind: Attribute cardinality: many optional: true - kind: Attribute identifier: manufacturer__device_type - - name: platform + order_weight: 1300 + - name: platforms peer: DcimPlatform + kind: Attribute cardinality: many optional: true - kind: Attribute identifier: manufacturer__platform + order_weight: 1400 - name: Provider namespace: Organization description: Circuit or Location Provider icon: mdi:domain - inherit_from: - - OrganizationGeneric include_in_menu: true menu_placement: OrganizationGeneric + inherit_from: + - OrganizationGeneric ``` \ No newline at end of file diff --git a/docs/docs/reference/patch_panel.mdx b/docs/docs/reference/patch_panel.mdx index caf7c67..f794338 100644 --- a/docs/docs/reference/patch_panel.mdx +++ b/docs/docs/reference/patch_panel.mdx @@ -2,7 +2,7 @@ title: Patch Panel --- -This schema extension allows you to capture patch panel related information like rear/front interfaces and mapping between them. You can insert the patch panel into a rack and leverage the device type model. Finally you can also capture information about potential modules you would insert into your patch panel. +This schema extension allows you to capture patch panel related information like rear/front interfaces and mapping between them. You can insert the patch panel into a rack and leverage the device type model. Cassettes and other inserts are tracked as regular device modules in module bays, through extensions/device_module. NOTE: This extension is compatible with all sort of connectors, meaning you can plug cable, circuits, cross-connect to front & rear interfaces! @@ -10,6 +10,7 @@ NOTE: This extension is compatible with all sort of connectors, meaning you can - **Dependencies:** - [base](dcim) + - [extensions/device_module](device_module) ## Nodes @@ -26,7 +27,7 @@ NOTE: This extension is compatible with all sort of connectors, meaning you can | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| name | | Text | | | | +| name | | Text | False | | | | module_capacity | The maximum number of modules that can be housed within this patch panel. | Number | True | | | | description | | Text | True | | | @@ -40,6 +41,7 @@ NOTE: This extension is compatible with all sort of connectors, meaning you can ### FrontPatchPanelInterface - **Label:** Patch Panel Front Interfaces +- **Description:** Front interface of a patch panel, where equipment is patched in. - **Namespace:** Dcim - **Uniqueness Constraints:** - patch_panel, name__value @@ -56,6 +58,7 @@ NOTE: This extension is compatible with all sort of connectors, meaning you can ### RearPatchPanelInterface - **Label:** Patch Panel Rear Interfaces +- **Description:** Rear interface of a patch panel, terminating the permanent cabling. - **Namespace:** Dcim - **Uniqueness Constraints:** - patch_panel, name__value @@ -74,6 +77,7 @@ NOTE: This extension is compatible with all sort of connectors, meaning you can ### GenericPatchPanelInterface - **Label:** Patch Panel Interfaces +- **Description:** Generic interface of a patch panel, front or rear. - **Namespace:** Dcim - **Icon:** mdi:ethernet @@ -81,9 +85,9 @@ NOTE: This extension is compatible with all sort of connectors, meaning you can | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| name | | Text | | | | +| name | | Text | False | | | | description | | Text | True | | | -| connector_type | | Dropdown | | | FC, LC, LC_PC, LC_UPC, LC_APC, LSH, LSH_PC, LSH_UPC, LSH_APC, LX_5, LX_5_PC, LX_5_UPC, LX_5_APC, MPO, MTRJ, SC, SC_PC, SC_UPC, SC_APC, ST, CS, SN, SMA_905, SMA_906, URM_P2 | +| connector_type | | Dropdown | False | | fc, lc, lc_pc, lc_upc, lc_apc, lsh, lsh_pc, lsh_upc, lsh_apc, lx_5, lx_5_pc, lx_5_upc, lx_5_apc, mpo, mtrj, sc, sc_pc, sc_upc, sc_apc, st, cs, sn, sma_905, sma_906, urm_p2, urm_p4, urm_p8, splice | ## Code @@ -91,211 +95,233 @@ NOTE: This extension is compatible with all sort of connectors, meaning you can version: '1.0' generics: - name: GenericPatchPanelInterface - label: Patch Panel Interfaces - menu_placement: DcimPatchPanel namespace: Dcim + description: Generic interface of a patch panel, front or rear. + label: Patch Panel Interfaces icon: mdi:ethernet + include_in_menu: true + menu_placement: DcimPatchPanel attributes: - name: name kind: Text + optional: false order_weight: 1000 - name: description kind: Text optional: true - order_weight: 2000 + order_weight: 1100 - name: connector_type kind: Dropdown - order_weight: 1100 choices: - - name: FC + - name: fc label: FC description: Standardized fiber optic connector used primarily in datacom and telecom applications. - - name: LC + - name: lc label: LC description: Compact fiber optic connector with a push-pull mechanism. - - name: LC_PC + - name: lc_pc label: LC/PC description: Polished LC connector providing physical contact (PC). - - name: LC_UPC + - name: lc_upc label: LC/UPC description: Ultra-Physical Contact (UPC) variant of the LC connector with enhanced polish. - - name: LC_APC + - name: lc_apc label: LC/APC description: Angled Physical Contact (APC) version of the LC connector with a slanted fiber end-face. - - name: LSH + - name: lsh label: LSH description: European fiber optic connector offering high durability. - - name: LSH_PC + - name: lsh_pc label: LSH/PC description: Physical Contact version of LSH with standard polish. - - name: LSH_UPC + - name: lsh_upc label: LSH/UPC description: Ultra-Physical Contact variant of LSH, minimizing return loss with a superior polish. - - name: LSH_APC + - name: lsh_apc label: LSH/APC description: Angled Physical Contact version of LSH, designed to reduce back reflections. - - name: LX_5 + - name: lx_5 label: LX.5 description: Miniaturized fiber optic connector similar to LC but with an additional shutter mechanism. - - name: LX_5_PC + - name: lx_5_pc label: LX.5/PC description: Physical Contact version of LX.5. - - name: LX_5_UPC + - name: lx_5_upc label: LX.5/UPC description: Ultra-Physical Contact variant of LX.5. - - name: LX_5_APC + - name: lx_5_apc label: LX.5/APC description: Angled Physical Contact version of LX.5. - - name: MPO + - name: mpo label: MPO description: Multi-fiber Push-On connector typically used in data centers for high-speed applications. - - name: MTRJ + - name: mtrj label: MTRJ description: Male-to-female fiber optic connector with two fibers. - - name: SC + - name: sc label: SC description: Square fiber optic connector with push-pull lock. - - name: SC_PC + - name: sc_pc label: SC/PC description: Physical Contact SC connector with a polished end-face. - - name: SC_UPC + - name: sc_upc label: SC/UPC description: Ultra-Physical Contact variant of SC. - - name: SC_APC + - name: sc_apc label: SC/APC description: Angled Physical Contact version of SC. - - name: ST + - name: st label: ST description: Bayonet-style fiber optic connector primarily used in industrial and military applications. - - name: CS + - name: cs label: CS description: Compact connector with a high-density duplex configuration. - - name: SN + - name: sn label: SN description: Small-form connector with dual fibers. - - name: SMA_905 + - name: sma_905 label: SMA 905 description: Stainless steel fiber optic connector. - - name: SMA_906 + - name: sma_906 label: SMA 906 description: Variant of SMA 905 with similar durability, frequently used in high-vibration settings. - - name: URM_P2 + - name: urm_p2 label: URM-P2 description: Specialized fiber optic connector for industrial and harsh environments. + - name: urm_p4 + label: URM-P4 + description: Similar to URM-P2 but designed for higher performance. + - name: urm_p8 + label: URM-P8 + description: Enhanced version of URM connectors with higher protection. + - name: splice + label: Splice + description: Permanent fiber connection method where two fiber ends are fused. + optional: false + order_weight: 1200 nodes: - name: PatchPanel - label: Patch Panel + namespace: Dcim description: A Patch Panel used for managing network cable connections in a data center or telecom setup. + label: Patch Panel icon: ic:round-device-hub - namespace: Dcim + include_in_menu: true + inherit_from: + - DcimPhysicalDevice human_friendly_id: - name__value order_by: - name__value display_label: name__value - inherit_from: - - DcimPhysicalDevice attributes: - name: name kind: Text unique: true + optional: false order_weight: 1000 - name: module_capacity - label: Module Capacity kind: Number + label: Module Capacity optional: true description: The maximum number of modules that can be housed within this patch panel. + order_weight: 1300 - name: description kind: Text optional: true - order_weight: 2000 + order_weight: 1100 relationships: - name: front_interfaces peer: DcimFrontPatchPanelInterface - identifier: front_interfaces - optional: true - cardinality: many kind: Component + cardinality: many + optional: true + identifier: patch_panel__front_interfaces + order_weight: 1350 - name: rear_interfaces peer: DcimRearPatchPanelInterface - identifier: rear_interfaces - optional: true - cardinality: many kind: Component + cardinality: many + optional: true + identifier: patch_panel__rear_interfaces + order_weight: 1450 - name: FrontPatchPanelInterface + namespace: Dcim + description: Front interface of a patch panel, where equipment is patched in. label: Patch Panel Front Interfaces + include_in_menu: true menu_placement: DcimGenericPatchPanelInterface - namespace: Dcim + inherit_from: + - DcimEndpoint + - DcimGenericPatchPanelInterface human_friendly_id: - patch_panel__name__value - name__value - display_label: '{{ patch_panel__name__value }} > {{ name__value }}' order_by: - corresponding_front_rear__name__value - name__value + display_label: '{{ patch_panel__name__value }} > {{ name__value }}' uniqueness_constraints: - - patch_panel - name__value - inherit_from: - - DcimEndpoint - - DcimGenericPatchPanelInterface relationships: - name: corresponding_front_rear - label: Corresponding rear interface peer: DcimRearPatchPanelInterface - order_weight: 1200 - optional: true - cardinality: one + label: Corresponding rear interface kind: Attribute + cardinality: one + optional: true + order_weight: 1300 - name: patch_panel peer: DcimPatchPanel - order_weight: 900 - identifier: front_interfaces - optional: false - cardinality: one kind: Parent + cardinality: one + optional: false + identifier: patch_panel__front_interfaces + order_weight: 900 - name: RearPatchPanelInterface + namespace: Dcim + description: Rear interface of a patch panel, terminating the permanent cabling. label: Patch Panel Rear Interfaces + include_in_menu: true menu_placement: DcimGenericPatchPanelInterface - namespace: Dcim + inherit_from: + - DcimEndpoint + - DcimGenericPatchPanelInterface human_friendly_id: - patch_panel__name__value - name__value - display_label: '{{ patch_panel__name__value }} > {{ name__value }}' order_by: - patch_panel__name__value - name__value + display_label: '{{ patch_panel__name__value }} > {{ name__value }}' uniqueness_constraints: - - patch_panel - name__value - inherit_from: - - DcimEndpoint - - DcimGenericPatchPanelInterface relationships: - name: corresponding_front_rear - label: Corresponding front interfaces peer: DcimFrontPatchPanelInterface - order_weight: 1200 - optional: true - cardinality: many + label: Corresponding front interfaces kind: Attribute + cardinality: many + optional: true + order_weight: 1300 - name: patch_panel peer: DcimPatchPanel - order_weight: 900 - identifier: rear_interfaces - optional: false - cardinality: one kind: Parent + cardinality: one + optional: false + identifier: patch_panel__rear_interfaces + order_weight: 900 ``` \ No newline at end of file diff --git a/docs/docs/reference/peering_ixp.mdx b/docs/docs/reference/peering_ixp.mdx index f143d81..8151f6d 100644 --- a/docs/docs/reference/peering_ixp.mdx +++ b/docs/docs/reference/peering_ixp.mdx @@ -8,10 +8,8 @@ This schema extension contains all you need to model anything revolving around i - **Dependencies:** - [base](dcim) - - [extensions/routing](routing) - [extensions/routing_bgp](routing_bgp) - [extensions/routing_bgp_community](routing_bgp_community) - - [extensions/routing_policies](routing_policies) - [extensions/routing_policies_bgp](routing_policies_bgp) ## Nodes @@ -28,9 +26,9 @@ This schema extension contains all you need to model anything revolving around i | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| name | Name of the Internet Exchange | Text | | | | +| name | Name of the Internet Exchange | Text | False | | | | description | An optional description of the Internet Exchange | Text | True | | | -| status | | Dropdown | | enabled | enabled, disabled | +| status | | Dropdown | False | enabled | enabled, disabled | #### Relationships @@ -57,10 +55,10 @@ This schema extension contains all you need to model anything revolving around i | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| name | Name of the IXP Connection | Text | | | | +| name | Name of the IXP Connection | Text | False | | | | description | Description of the IXP Connection | Text | True | | | | peeringdb_netixlan | PeeringDB ID for the IXP connection | Number | True | | | -| status | | Dropdown | True | enabled | enabled, pre-maintenance, maintenance, post-maintenance, disabled | +| status | | Dropdown | True | enabled | enabled, pre_maintenance, maintenance, post_maintenance, disabled | | vlan | VLAN ID for the connection | Number | True | | | | mac_address | MAC address associated with the connection | MacAddress | True | | | @@ -68,12 +66,12 @@ This schema extension contains all you need to model anything revolving around i | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | -| ipv6_address | IpamIPAddress | | one | Attribute | -| ipv4_address | IpamIPAddress | | one | Attribute | +| ipv6_address | IpamIPAddress | True | one | Attribute | +| ipv4_address | IpamIPAddress | True | one | Attribute | | internet_exchange_point | PeeringIXP | False | one | Parent | -| router | DcimDevice | | one | Attribute | +| router | DcimDevice | True | one | Attribute | | bgp_sessions | RoutingBGPSession | True | many | Component | -| tags | BuiltinTag | | many | Attribute | +| tags | BuiltinTag | True | many | Attribute | ## Extensions @@ -89,7 +87,7 @@ In this context "extensions" refer to modifications or additions to the existing | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | -| ixp_connection | PeeringIXPConnection | True | one | Parent | +| ixp_connection | PeeringIXPConnection | True | one | Attribute | ## Code @@ -101,6 +99,7 @@ nodes: description: An Internet Exchange Point (IXP) for peering label: Internet Exchange icon: mdi:network + include_in_menu: true human_friendly_id: - name__value order_by: @@ -110,85 +109,95 @@ nodes: - name: name kind: Text unique: true + optional: false description: Name of the Internet Exchange order_weight: 1000 - name: description kind: Text - description: An optional description of the Internet Exchange optional: true + description: An optional description of the Internet Exchange order_weight: 1100 - name: status kind: Dropdown + default_value: enabled choices: - name: enabled label: Enabled description: Internet Exchange is active and operational - color: '#a8dadc' + color: '#00d25b' - name: disabled label: Disabled description: Internet Exchange is not operational color: '#b0bec5' - default_value: enabled + optional: false order_weight: 1200 relationships: - name: connections peer: PeeringIXPConnection - optional: true - cardinality: many kind: Component + cardinality: many + optional: true description: IXP connections associated with this Internet Exchange + order_weight: 1500 - name: local_as peer: RoutingAutonomousSystem - optional: true - cardinality: one kind: Attribute + cardinality: one + optional: true order_weight: 1300 - name: import_policies - label: Import Routing Policies peer: RoutingPolicyBGP - identifier: ixp__import_bgppolicies - optional: true - cardinality: many + label: Import Routing Policies kind: Generic - description: Import routing policies applied to the session + cardinality: many + optional: true + identifier: ixp__import_bgppolicies + description: Import routing policies applied to every session on this internet + exchange point + order_weight: 1600 - name: export_policies - label: Export Routing Policies peer: RoutingPolicyBGP - identifier: ixp__export_bgppolicies - optional: true - cardinality: many + label: Export Routing Policies kind: Generic - description: Export routing policies applied to the session + cardinality: many + optional: true + identifier: ixp__export_bgppolicies + description: Export routing policies applied to every session on this internet + exchange point + order_weight: 1650 - name: bgp_communities - label: BGP Communities peer: RoutingBGPCommunity - optional: true - cardinality: many + label: BGP Communities kind: Generic - description: BGP communities associated with the session + cardinality: many + optional: true + description: BGP communities associated with this internet exchange point + order_weight: 1700 - name: tags peer: BuiltinTag - optional: true - cardinality: many kind: Attribute - order_weight: 3000 + cardinality: many + optional: true + order_weight: 2000 - name: IXPConnection namespace: Peering description: A connection to an Internet Exchange Point (IXP) label: IXP Connection icon: mdi:lan-connect + include_in_menu: true menu_placement: PeeringIXP - uniqueness_constraints: - - - name__value human_friendly_id: - name__value order_by: - name__value display_label: name__value + uniqueness_constraints: + - - name__value attributes: - name: name kind: Text unique: true + optional: false description: Name of the IXP Connection order_weight: 1000 - name: description @@ -197,20 +206,20 @@ nodes: description: Description of the IXP Connection order_weight: 1100 - name: peeringdb_netixlan - label: PeeringDB Netixlan kind: Number + label: PeeringDB Netixlan optional: true description: PeeringDB ID for the IXP connection order_weight: 1150 - name: status kind: Dropdown - optional: true + default_value: enabled choices: - name: enabled label: Enabled description: The system is fully operational and functioning as expected. - color: '#a8dadc' - - name: pre-maintenance + color: '#00d25b' + - name: pre_maintenance label: Pre-Maintenance description: Preparation stage before performing maintenance tasks. color: '#f4a261' @@ -218,7 +227,7 @@ nodes: label: Maintenance description: Currently undergoing maintenance tasks. color: '#e9c46a' - - name: post-maintenance + - name: post_maintenance label: Post-Maintenance description: Final checks and verifications after maintenance tasks. color: '#f0e5de' @@ -226,12 +235,12 @@ nodes: label: Disabled description: The system is not operational and cannot be used. color: '#b0bec5' - default_value: enabled + optional: true order_weight: 1200 - name: vlan kind: Number - description: VLAN ID for the connection optional: true + description: VLAN ID for the connection order_weight: 1300 - name: mac_address kind: MacAddress @@ -241,59 +250,66 @@ nodes: order_weight: 1350 relationships: - name: ipv6_address - label: IPv6 Address - description: IPv6 address assigned to the connection peer: IpamIPAddress - identifier: ixpconn__ipv6_address - cardinality: one + label: IPv6 Address kind: Attribute + cardinality: one + identifier: ixpconn__ipv6_address + optional: true + description: IPv6 address assigned to the connection order_weight: 1400 - name: ipv4_address - label: IPv4 Address - description: IPv4 address assigned to the connection peer: IpamIPAddress - identifier: ixpconn__ipv4_address - cardinality: one + label: IPv4 Address kind: Attribute + cardinality: one + identifier: ixpconn__ipv4_address + optional: true + description: IPv4 address assigned to the connection order_weight: 1375 - name: internet_exchange_point - label: IXP peer: PeeringIXP - optional: false - cardinality: one + label: IXP kind: Parent + cardinality: one + optional: false description: The Internet Exchange Point this connection is part of + order_weight: 900 - name: router peer: DcimDevice - cardinality: one kind: Attribute + cardinality: one + optional: true description: The router this IXP connection is connected to - order_weight: 1400 + order_weight: 1500 - name: bgp_sessions - label: BGP Sessions peer: RoutingBGPSession - identifier: ixpconn__bgpsessions - optional: true - cardinality: many + label: BGP Sessions kind: Component + cardinality: many + optional: true + on_delete: no-action + identifier: ixpconn__bgpsessions description: BGP sessions established over this IXP connection - order_weight: 1450 + order_weight: 1550 - name: tags peer: BuiltinTag - cardinality: many kind: Attribute - order_weight: 3000 + cardinality: many + optional: true + order_weight: 2000 extensions: nodes: - kind: RoutingBGPSession relationships: - name: ixp_connection - label: IXP Connection peer: PeeringIXPConnection - identifier: ixpconn__bgpsessions - optional: true + label: IXP Connection + kind: Attribute cardinality: one - kind: Parent - description: The IXP connection (port) this BGP session is established over + optional: true + identifier: ixpconn__bgpsessions + description: The IXP connection this BGP session is established over + order_weight: 1800 ``` \ No newline at end of file diff --git a/docs/docs/reference/physical_disk.mdx b/docs/docs/reference/physical_disk.mdx index bab4560..f569173 100644 --- a/docs/docs/reference/physical_disk.mdx +++ b/docs/docs/reference/physical_disk.mdx @@ -21,7 +21,7 @@ NOTE: This extension is compatible with all sort of device. You can apply the ge - **Icon:** carbon:vmdk-disk - **Uniqueness Constraints:** - device, name__value -- **Human Friendly ID:** name__value +- **Human Friendly ID:** device__name__value, name__value #### Attributes @@ -29,7 +29,7 @@ NOTE: This extension is compatible with all sort of device. You can apply the ge | ---- | ----------- | ---- | -------- | ------------- | ------- | | name | | Text | False | | | | disk_type | Specifies the type of disk | Dropdown | True | | ssd, nvme, hdd, hybrid | -| status | Lifecycle status of the hardware component. | Dropdown | | | in_inventory, active, decommissioned, disposed | +| status | Lifecycle status of the hardware component. | Dropdown | False | | in_inventory, active, decommissioned, disposed | | size | Disk capacity (in GB). | Number | False | | | | serial_number | Serial number of the disk | Text | True | | | | description | | Text | True | | | @@ -47,6 +47,12 @@ NOTE: This extension is compatible with all sort of device. You can apply the ge - **Description:** Generic that hold relationship toward physical disks. To apply on device that can have physical disks. - **Namespace:** Dcim +#### Attributes + +| name | description | kind | optional | default_value | choices | +| ---- | ----------- | ---- | -------- | ------------- | ------- | +| name | | Text | False | | | + #### Relationships | name | peer | optional | cardinality | kind | @@ -63,23 +69,32 @@ generics: description: Generic that hold relationship toward physical disks. To apply on device that can have physical disks. include_in_menu: false + attributes: + - name: name + kind: Text + allow_override: any + optional: false + order_weight: 1000 relationships: - name: physical_disks - cardinality: many peer: DcimPhysicalDisk - optional: true kind: Component + cardinality: many + optional: true + order_weight: 1950 nodes: - name: PhysicalDisk namespace: Dcim description: Physical Disk label: Physical Disk icon: carbon:vmdk-disk + include_in_menu: true + human_friendly_id: + - device__name__value + - name__value order_by: - name__value display_label: name__value - human_friendly_id: - - name__value uniqueness_constraints: - - device - name__value @@ -87,12 +102,9 @@ nodes: - name: name kind: Text optional: false - order_weight: 900 + order_weight: 1000 - name: disk_type kind: Dropdown - description: Specifies the type of disk - order_weight: 950 - optional: true choices: - name: ssd label: SSD @@ -110,9 +122,11 @@ nodes: label: Hybrid description: Hybrid Drive color: '#ffcc80' + optional: true + description: Specifies the type of disk + order_weight: 1300 - name: status kind: Dropdown - description: Lifecycle status of the hardware component. choices: - name: in_inventory label: In Inventory @@ -121,7 +135,7 @@ nodes: - name: active label: Active description: The disk is currently in use within the infrastructure. - color: '#28a745' + color: '#00d25b' - name: decommissioned label: Decommissioned description: The disk is retired from active use but still stored for potential @@ -131,29 +145,32 @@ nodes: label: Disposed description: The disk has been securely erased and disposed of. color: '#dc3545' + optional: false + description: Lifecycle status of the hardware component. + order_weight: 1200 - name: size - label: Size (GB) kind: Number + label: Size (GB) optional: false - order_weight: 1000 description: Disk capacity (in GB). + order_weight: 1400 - name: serial_number kind: Text - description: Serial number of the disk unique: true - order_weight: 1100 optional: true + description: Serial number of the disk + order_weight: 1450 - name: description kind: Text unique: false optional: true - order_weight: 1500 + order_weight: 1100 relationships: - name: device peer: DcimDeviceWithPhysicalDisks - optional: false - cardinality: one kind: Parent - order_weight: 800 + cardinality: one + optional: false + order_weight: 900 ``` \ No newline at end of file diff --git a/docs/docs/reference/qinq.mdx b/docs/docs/reference/qinq.mdx index 9a2306e..bd15f53 100644 --- a/docs/docs/reference/qinq.mdx +++ b/docs/docs/reference/qinq.mdx @@ -2,7 +2,7 @@ title: QinQ --- -This schema extension brings extensions to VLAN model in order to support QinQ. +This schema extension adds the Service VLAN and Customer VLAN nodes needed to model QinQ on top of the VLAN extension. ## Details @@ -17,7 +17,9 @@ This schema extension brings extensions to VLAN model in order to support QinQ. - **Label:** S-VLAN - **Description:** A VLAN used to encapsulate multiple CVLANs. - **Namespace:** Ipam -- **Inherit From:** GenericVLAN +- **Uniqueness Constraints:** + - vlan_id__value, vlan_group +- **Inherit From:** IpamGenericVLAN #### Relationships @@ -31,9 +33,9 @@ This schema extension brings extensions to VLAN model in order to support QinQ. - **Description:** A VLAN assigned to customer traffic, encapsulated within an S-VLAN. - **Namespace:** Ipam - **Uniqueness Constraints:** - - vlan_id__value, svlan + - svlan, vlan_id__value - **Human Friendly ID:** svlan__name__value, vlan_id__value -- **Inherit From:** GenericVLAN +- **Inherit From:** IpamGenericVLAN #### Attributes @@ -54,50 +56,56 @@ version: '1.0' nodes: - name: SVLAN namespace: Ipam - label: S-VLAN description: A VLAN used to encapsulate multiple CVLANs. + label: S-VLAN include_in_menu: false inherit_from: - - GenericVLAN + - IpamGenericVLAN + uniqueness_constraints: + - - vlan_id__value + - vlan_group relationships: - name: cvlan - label: Customer vlan(s) peer: IpamCVLAN + label: Customer vlan(s) + kind: Attribute + cardinality: many optional: true - direction: outbound identifier: vlan__qinq - cardinality: many - kind: Attribute + direction: outbound + order_weight: 1600 - name: CVLAN namespace: Ipam - label: C-VLAN description: A VLAN assigned to customer traffic, encapsulated within an S-VLAN. + label: C-VLAN include_in_menu: false - display_label: '{{ svlan__name__value }}-{{ vlan_id__value }}' + inherit_from: + - IpamGenericVLAN human_friendly_id: - svlan__name__value - vlan_id__value + display_label: '{{ svlan__name__value }}-{{ vlan_id__value }}' uniqueness_constraints: - - - vlan_id__value - - svlan - inherit_from: - - GenericVLAN + - - svlan + - vlan_id__value attributes: - name: name kind: Text - optional: true read_only: true computed_attribute: kind: Jinja2 jinja2_template: '{{ svlan__name__value }}-{{ vlan_id__value }}' + optional: true + order_weight: 1000 relationships: - name: svlan - label: Supplier vlan peer: IpamSVLAN + label: Supplier vlan + kind: Attribute + cardinality: one optional: false - direction: inbound identifier: vlan__qinq - cardinality: one - kind: Attribute + direction: inbound + order_weight: 1600 ``` \ No newline at end of file diff --git a/docs/docs/reference/rack.mdx b/docs/docs/reference/rack.mdx index 90d6116..2f94c1b 100644 --- a/docs/docs/reference/rack.mdx +++ b/docs/docs/reference/rack.mdx @@ -2,13 +2,13 @@ title: Rack --- -This schema extension introduces a Rack model representing a physical equipment rack installed at a site. Racks can be placed at a LocationSite and can host devices and other equipment. +This schema extension introduces a Rack model representing a physical equipment rack installed at a site. Racks can be placed at a LocationSite and can host devices and other equipment. LocationRack needs a Location.Site: extensions/location_site is declared above as the smallest provider, but extensions/location_minimal provides the same node as part of its hierarchy and satisfies the rack equally, load whichever suits, never both. LocationRack is also defined, hierarchically and incompatibly, by experimental/location_extended, so load one or the other, not both. ## Details - **Dependencies:** - [base](dcim) - - [extensions/location_minimal](location_minimal) + - [extensions/location_site](location_site) ## Nodes @@ -18,7 +18,9 @@ This schema extension introduces a Rack model representing a physical equipment - **Description:** A physical equipment rack installed at a site. - **Namespace:** Location - **Icon:** clarity:rack-server-line -- **Human Friendly ID:** name__value +- **Uniqueness Constraints:** + - site, name__value +- **Human Friendly ID:** site__name__value, name__value - **Inherit From:** LocationHosting #### Attributes @@ -26,7 +28,7 @@ This schema extension introduces a Rack model representing a physical equipment | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | | name | | Text | False | | | -| facility_id | | Text | True | | | +| facility | | Text | True | | | | status | | Dropdown | False | active | active, available, reserved, planned, decommissioning, deprecated | | height | | Number | False | 42 | | | serial_number | | Text | True | | | @@ -36,7 +38,7 @@ This schema extension introduces a Rack model representing a physical equipment | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | -| site | LocationSite | False | one | Attribute | +| site | LocationSite | False | one | Parent | | tags | BuiltinTag | True | many | Attribute | ## Extensions @@ -62,32 +64,35 @@ version: '1.0' nodes: - name: Rack namespace: Location - label: Rack description: A physical equipment rack installed at a site. + label: Rack icon: clarity:rack-server-line + include_in_menu: true menu_placement: LocationGeneric + inherit_from: + - LocationHosting human_friendly_id: + - site__name__value - name__value order_by: - name__value display_label: name__value - inherit_from: - - LocationHosting + uniqueness_constraints: + - - site + - name__value attributes: - name: name kind: Text - unique: true + unique: false optional: false order_weight: 1000 - - name: facility_id + - name: facility kind: Text optional: true - order_weight: 1100 + order_weight: 1150 - name: status kind: Dropdown - optional: false default_value: active - order_weight: 1200 choices: - name: active label: Active @@ -110,46 +115,49 @@ nodes: description: Rack is being phased out and emptied. color: '#ff9800' - name: deprecated - label: Retired + label: Deprecated description: Rack has been removed from service. color: '#6c757d' + optional: false + order_weight: 1200 - name: height - label: Height (U) kind: Number - optional: false + label: Height (U) default_value: 42 + optional: false order_weight: 1300 - name: serial_number kind: Text optional: true - order_weight: 1400 + order_weight: 1350 - name: asset_tag kind: Text optional: true - order_weight: 1500 + order_weight: 1400 relationships: - name: site peer: LocationSite - optional: false + kind: Parent cardinality: one - kind: Attribute - order_weight: 900 + optional: false identifier: site__racks + order_weight: 900 - name: tags peer: BuiltinTag - cardinality: many kind: Attribute + cardinality: many optional: true - order_weight: 3000 + order_weight: 2000 extensions: nodes: - kind: LocationSite relationships: - name: racks peer: LocationRack + kind: Component cardinality: many optional: true - kind: Component identifier: site__racks + order_weight: 1850 ``` \ No newline at end of file diff --git a/docs/docs/reference/routing.mdx b/docs/docs/reference/routing.mdx index cd51945..0e8f8c0 100644 --- a/docs/docs/reference/routing.mdx +++ b/docs/docs/reference/routing.mdx @@ -8,13 +8,13 @@ This schema extension contains generics to create Routing Protocol "Instance". T - **Dependencies:** - [base](dcim) - - [extensions/vlan](vlan) + - [extensions/vrf](vrf) ## Generics ### Protocol -- **Label:** Protocol +- **Label:** Routing Protocol - **Description:** Generic protocol model for routing protocols - **Namespace:** Routing - **Icon:** carbon:router @@ -24,7 +24,7 @@ This schema extension contains generics to create Routing Protocol "Instance". T | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | | description | Description of the protocol | Text | False | | | -| status | Status of the Protocol Configuration. | Dropdown | | | active, disabled, deleted | +| status | Status of the Protocol Configuration. | Dropdown | False | | active, disabled, deleted | #### Relationships @@ -41,14 +41,14 @@ generics: - name: Protocol namespace: Routing description: Generic protocol model for routing protocols - label: Protocol + label: Routing Protocol icon: carbon:router - include_in_menu: false + include_in_menu: true attributes: - name: description kind: Text - optional: false unique: true + optional: false description: Description of the protocol order_weight: 1100 - name: status @@ -57,7 +57,7 @@ generics: - name: active label: Active description: Configuration is active and operational. - color: '#A9CCE3' + color: '#00d25b' - name: disabled label: Disabled description: Configuration has been disabled. @@ -66,21 +66,22 @@ generics: label: Deleted description: Configuration has been deleted. color: '#FAD7A0' + optional: false description: Status of the Protocol Configuration. - order_weight: 1150 + order_weight: 1200 relationships: - name: device peer: DcimDevice - optional: false - cardinality: one kind: Parent - order_weight: 1050 + cardinality: one + optional: false + order_weight: 900 - name: vrf - label: VRF peer: IpamVRF - optional: false - cardinality: one + label: VRF kind: Attribute - order_weight: 1075 + cardinality: one + optional: false + order_weight: 1050 ``` \ No newline at end of file diff --git a/docs/docs/reference/routing_aggregate.mdx b/docs/docs/reference/routing_aggregate.mdx index d3acd23..780cef8 100644 --- a/docs/docs/reference/routing_aggregate.mdx +++ b/docs/docs/reference/routing_aggregate.mdx @@ -32,7 +32,7 @@ This schema extension contains all you need to model the Aggregate Routing Proto | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | -| destination | IpamPrefix | | | Attribute | +| destination | IpamPrefix | True | | Attribute | ## Code @@ -43,30 +43,32 @@ nodes: namespace: Routing description: Aggregate Protocol with action and BGP communities label: Aggregate Routes - include_in_menu: false icon: grommet-icons:aggregate + include_in_menu: true + menu_placement: RoutingProtocol inherit_from: - RoutingProtocol attributes: - name: discard - label: Discard kind: Boolean - optional: true + label: Discard default_value: false - order_weight: 1275 + optional: true + order_weight: 1350 - name: import_policies kind: Text optional: true - order_weight: 1300 + order_weight: 1400 - name: export_policies kind: Text optional: true - order_weight: 1350 + order_weight: 1450 relationships: - name: destination - kind: Attribute peer: IpamPrefix - description: Destination network for the static route. - order_weight: 1200 + kind: Attribute + optional: true + description: Destination network aggregated by this route. + order_weight: 1300 ``` \ No newline at end of file diff --git a/docs/docs/reference/routing_bgp.mdx b/docs/docs/reference/routing_bgp.mdx index c185934..d16ac0a 100644 --- a/docs/docs/reference/routing_bgp.mdx +++ b/docs/docs/reference/routing_bgp.mdx @@ -24,8 +24,8 @@ This schema extension contains all you need to model your BGP platform. | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| name | Name of the Autonomous System | Text | | | | -| asn | Autonomous System Number | Number | | | | +| name | Name of the Autonomous System | Text | False | | | +| asn | Autonomous System Number | Number | False | | | | description | Description of the Autonomous System | Text | True | | | #### Relationships @@ -55,7 +55,7 @@ This schema extension contains all you need to model your BGP platform. | maximum_routes | Maximum routes for the BGP Group. | Number | True | | | | local_pref | Force Local Pref for this BGP Peer Group. | Number | True | | | | send_community | Whether to send community attributes. | Checkbox | True | | | -| address_family | The address family for the routing policy indicating the type of IP address. | Dropdown | | ipv4 | ipv4, ipv6 | +| address_family | The address family for the routing policy indicating the type of IP address. | Dropdown | False | ipv4 | ipv4, ipv6 | #### Relationships @@ -78,8 +78,8 @@ This schema extension contains all you need to model your BGP platform. | ---- | ----------- | ---- | -------- | ------------- | ------- | | import_policies | | Text | True | | | | export_policies | | Text | True | | | -| session_type | Type of BGP Session | Dropdown | | | external, internal | -| role | Role of the BGP Session | Dropdown | | | backbone, upstream, peering | +| session_type | Type of BGP Session | Dropdown | False | | external, internal | +| role | Role of the BGP Session | Dropdown | True | | backbone, upstream, peering | | local_pref | Force Local Pref for this BGP Peer Session. | Number | True | | | #### Relationships @@ -90,7 +90,7 @@ This schema extension contains all you need to model your BGP platform. | remote_as | RoutingAutonomousSystem | True | one | Attribute | | local_ip | IpamIPAddress | True | one | Attribute | | remote_ip | IpamIPAddress | True | one | Attribute | -| device | DcimDevice | True | one | | +| device | DcimDevice | True | one | Generic | | peer_group | RoutingBGPPeerGroup | True | one | Attribute | | peer_session | RoutingBGPSession | True | one | Attribute | @@ -116,7 +116,7 @@ In this context "extensions" refer to modifications or additions to the existing | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | -| asn | RoutingAutonomousSystem | True | many | | +| asn | RoutingAutonomousSystem | True | many | Generic | ## Code @@ -129,6 +129,7 @@ nodes: belonging to a network label: Autonomous System icon: mdi:bank-circle-outline + include_in_menu: true menu_placement: RoutingBGPSession human_friendly_id: - asn__value @@ -140,14 +141,16 @@ nodes: attributes: - name: name kind: Text + unique: true + optional: false description: Name of the Autonomous System order_weight: 1000 - unique: true - name: asn kind: Number + unique: true + optional: false description: Autonomous System Number order_weight: 1050 - unique: true - name: description kind: Text optional: true @@ -156,25 +159,29 @@ nodes: relationships: - name: organization peer: OrganizationGeneric - optional: false - cardinality: one kind: Attribute + cardinality: one + optional: false + order_weight: 1200 - name: location peer: LocationGeneric - optional: true - cardinality: one kind: Attribute + cardinality: one + optional: true + order_weight: 1300 - name: devices peer: DcimDevice - optional: true - cardinality: many kind: Attribute + cardinality: many + optional: true + order_weight: 1400 - name: BGPPeerGroup namespace: Routing description: A BGP Peer Group is used to regroup parameters that are shared across multiple peers label: BGP Peer Group icon: mdi:view-grid-plus-outline + include_in_menu: true menu_placement: RoutingBGPSession inherit_from: - RoutingProtocol @@ -187,8 +194,8 @@ nodes: attributes: - name: name kind: Text - optional: false unique: true + optional: false description: Name of the BGP Group order_weight: 1000 - name: import_policies @@ -201,16 +208,16 @@ nodes: order_weight: 1350 - name: maximum_routes kind: Number - optional: true parameters: min_value: 0 + optional: true description: Maximum routes for the BGP Group. order_weight: 1400 - name: local_pref kind: Number - optional: true parameters: min_value: 0 + optional: true description: Force Local Pref for this BGP Peer Group. order_weight: 1450 - name: send_community @@ -219,9 +226,8 @@ nodes: description: Whether to send community attributes. order_weight: 1500 - name: address_family - description: The address family for the routing policy indicating the type of - IP address. kind: Dropdown + default_value: ipv4 choices: - name: ipv4 label: IPv4 @@ -231,26 +237,31 @@ nodes: label: IPv6 description: Policy applies to IPv6 addresses. color: '#E6E6FA' - default_value: ipv4 - order_weight: 1150 + optional: false + description: The address family for the routing policy indicating the type of + IP address. + order_weight: 1250 relationships: - name: local_as - identifier: bgppeergroup__local_as peer: RoutingAutonomousSystem - optional: true - cardinality: one kind: Attribute + cardinality: one + optional: true + identifier: bgppeergroup__local_as + order_weight: 1550 - name: remote_as - identifier: bgppeergroup__remote_as peer: RoutingAutonomousSystem - optional: true - cardinality: one kind: Attribute + cardinality: one + optional: true + identifier: bgppeergroup__remote_as + order_weight: 1600 - name: BGPSession namespace: Routing description: A BGP Session represent a point to point connection between two routers label: BGP Session icon: mdi:router + include_in_menu: true inherit_from: - RoutingProtocol order_by: @@ -260,9 +271,11 @@ nodes: - name: import_policies kind: Text optional: true + order_weight: 1700 - name: export_policies kind: Text optional: true + order_weight: 1750 - name: session_type kind: Dropdown choices: @@ -272,8 +285,9 @@ nodes: - name: internal label: Internal description: Session established with a router in the same autonomous system. + optional: false description: Type of BGP Session - order_weight: 1200 + order_weight: 1250 - name: role kind: Dropdown choices: @@ -289,71 +303,81 @@ nodes: label: Peering description: Connect with other networks via IX. color: '#E6E6FA' + optional: true description: Role of the BGP Session - order_weight: 1600 + order_weight: 1300 - name: local_pref kind: Number - optional: true parameters: min_value: 0 + optional: true description: Force Local Pref for this BGP Peer Session. - order_weight: 1450 + order_weight: 1650 relationships: - name: local_as - identifier: bgpsession__local_as peer: RoutingAutonomousSystem - optional: true - cardinality: one kind: Attribute + cardinality: one + optional: true + identifier: bgpsession__local_as + order_weight: 1350 - name: remote_as - identifier: bgpsession__remote_as peer: RoutingAutonomousSystem - optional: true - cardinality: one kind: Attribute + cardinality: one + optional: true + identifier: bgpsession__remote_as + order_weight: 1400 - name: local_ip - identifier: bgpsession__local_ip peer: IpamIPAddress - optional: true - cardinality: one kind: Attribute + cardinality: one + optional: true + identifier: bgpsession__local_ip + order_weight: 1450 - name: remote_ip - identifier: bgpsession__remote_ip peer: IpamIPAddress - optional: true - cardinality: one kind: Attribute + cardinality: one + optional: true + identifier: bgpsession__remote_ip + order_weight: 1500 - name: device peer: DcimDevice - optional: true + kind: Generic cardinality: one + optional: true + order_weight: 900 - name: peer_group peer: RoutingBGPPeerGroup - optional: true - cardinality: one kind: Attribute + cardinality: one + optional: true + order_weight: 1550 - name: peer_session peer: RoutingBGPSession - optional: true - cardinality: one kind: Attribute + cardinality: one + optional: true + order_weight: 1600 extensions: nodes: - kind: DcimGenericDevice relationships: - name: asn peer: RoutingAutonomousSystem - optional: true - cardinality: one kind: Attribute - order_weight: 1600 + cardinality: one + optional: true + order_weight: 1800 - kind: OrganizationGeneric relationships: - name: asn + peer: RoutingAutonomousSystem label: Autonomous System + kind: Generic cardinality: many optional: true - peer: RoutingAutonomousSystem - order_weight: 2000 + order_weight: 1700 ``` \ No newline at end of file diff --git a/docs/docs/reference/routing_bgp_community.mdx b/docs/docs/reference/routing_bgp_community.mdx index c879687..5fe5b43 100644 --- a/docs/docs/reference/routing_bgp_community.mdx +++ b/docs/docs/reference/routing_bgp_community.mdx @@ -8,7 +8,7 @@ This schema extension adds the BGP Communities models. - **Dependencies:** - [base](dcim) - - [extensions/routing](routing) + - [extensions/routing_policies](routing_policies) ## Nodes @@ -24,15 +24,15 @@ This schema extension adds the BGP Communities models. | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| name | The name of the BGP community. | Text | | | | +| name | The name of the BGP community. | Text | False | | | | description | An optional description of the BGP community. | Text | True | | | -| community | The value of the BGP community (RFC1997, RFC4360, RFC8092). | Text | | | | +| community | The value of the BGP community (RFC1997, RFC4360, RFC8092). | Text | False | | | #### Relationships | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | -| routing_policy | RoutingPolicy | | many | Generic | +| routing_policy | RoutingPolicy | True | many | Generic | | tags | BuiltinTag | True | many | Attribute | ## Code @@ -42,9 +42,10 @@ version: '1.0' nodes: - name: BGPCommunity namespace: Routing - icon: iconoir:community - label: BGP Community description: Defines a BGP community. + label: BGP Community + icon: iconoir:community + include_in_menu: true human_friendly_id: - name__value order_by: @@ -53,31 +54,35 @@ nodes: attributes: - name: name kind: Text + unique: true + optional: false description: The name of the BGP community. order_weight: 1000 - unique: true - name: description kind: Text - description: An optional description of the BGP community. optional: true + description: An optional description of the BGP community. order_weight: 1100 - name: community kind: Text + unique: true + optional: false description: The value of the BGP community (RFC1997, RFC4360, RFC8092). order_weight: 1200 - unique: true relationships: - name: routing_policy - label: Routing Policies peer: RoutingPolicy - description: The BGP Policies using this BGP Community. + label: Routing Policies kind: Generic cardinality: many + optional: true + description: The BGP Policies using this BGP Community. + order_weight: 1300 - name: tags peer: BuiltinTag kind: Attribute - optional: true cardinality: many - order_weight: 3000 + optional: true + order_weight: 2000 ``` \ No newline at end of file diff --git a/docs/docs/reference/routing_bgp_rr.mdx b/docs/docs/reference/routing_bgp_rr.mdx index 8d006af..8cf1f59 100644 --- a/docs/docs/reference/routing_bgp_rr.mdx +++ b/docs/docs/reference/routing_bgp_rr.mdx @@ -8,7 +8,6 @@ This schema extension extend the BGP extension to add BGP Route Reflector Cluste - **Dependencies:** - [base](dcim) - - [extensions/routing](routing) - [extensions/routing_bgp](routing_bgp) ## Nodes @@ -25,7 +24,7 @@ This schema extension extend the BGP extension to add BGP Route Reflector Cluste | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| name | Name of the Route Reflector Cluster | Text | | | | +| name | Name of the Route Reflector Cluster | Text | False | | | | description | Optional description of the Route Reflector Cluster | Text | True | | | #### Relationships @@ -49,7 +48,7 @@ In this context "extensions" refer to modifications or additions to the existing | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | -| rr_cluster | RoutingBGPRRCluster | | one | Attribute | +| rr_cluster | RoutingBGPRRCluster | True | one | Attribute | ## Code @@ -61,45 +60,49 @@ nodes: description: A Route Reflector (RR) Cluster used for grouping internal peers label: Route Reflector Cluster icon: mdi:router-network - include_in_menu: false + include_in_menu: true + menu_placement: RoutingBGPSession human_friendly_id: - name__value display_label: name__value attributes: - name: name kind: Text + unique: true + optional: false description: Name of the Route Reflector Cluster order_weight: 1000 - unique: true - name: description kind: Text - description: Optional description of the Route Reflector Cluster optional: true + description: Optional description of the Route Reflector Cluster order_weight: 1100 relationships: - name: cluster_id - label: Cluster ID peer: IpamIPAddress - description: Cluster ID represented as a reference to an IP Address - cardinality: one + label: Cluster ID kind: Attribute + cardinality: one optional: false + description: Cluster ID represented as a reference to an IP Address order_weight: 1200 - name: peer_groups - label: BGP Peer Groups peer: RoutingBGPPeerGroup - cardinality: many + label: BGP Peer Groups kind: Generic + cardinality: many optional: true + order_weight: 1300 extensions: nodes: - kind: RoutingBGPPeerGroup relationships: - name: rr_cluster - label: RR Cluster peer: RoutingBGPRRCluster - cardinality: one + label: RR Cluster kind: Attribute - order_weight: 1600 + cardinality: one + optional: true + order_weight: 1700 ``` \ No newline at end of file diff --git a/docs/docs/reference/routing_ospf.mdx b/docs/docs/reference/routing_ospf.mdx index ff7079c..b4d5d47 100644 --- a/docs/docs/reference/routing_ospf.mdx +++ b/docs/docs/reference/routing_ospf.mdx @@ -28,7 +28,7 @@ This schema extension contains all you need to model the OSPF Routing Protocol. | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | | reference_bandwidth | Reference bandwidth for OSPF instance (in Mbps). | Number | True | 1000 | | -| version | Version of the OSPF protocol. | Dropdown | | ospf | ospf, ospfv3 | +| version | Version of the OSPF protocol. | Dropdown | False | ospf | ospf, ospfv3 | | import_policies | | Text | True | | | | export_policies | | Text | True | | | @@ -55,10 +55,10 @@ This schema extension contains all you need to model the OSPF Routing Protocol. | ---- | ----------- | ---- | -------- | ------------- | ------- | | description | Description of the OSPF interface. | Text | False | | | | metric | OSPF metric for the interface. | Number | True | | | -| mode | Mode of the OSPF interface. | Dropdown | | normal | normal, passive, peer_to_peer | +| mode | Mode of the OSPF interface. | Dropdown | False | normal | normal, passive, peer_to_peer | | authentication_key | Shared secret used to authenticate and secure routing messages between neighboring routers. | Password | True | | | | authentication_mode | | Dropdown | True | | md5, sha1 | -| area | OSPF area associated with the interface. | Text | | | | +| area | OSPF area associated with the interface. | Text | False | | | #### Relationships @@ -77,31 +77,33 @@ nodes: description: OSPF (Open Shortest Path First) instance on a Virtual Router. label: OSPF icon: mdi:network-outline - include_in_menu: false + include_in_menu: true + menu_placement: RoutingProtocol + inherit_from: + - RoutingProtocol + human_friendly_id: + - device__name__value + - vrf__name__value + - version__value order_by: - router_id__address__value - vrf__name__value - device__name__value + display_label: description__value uniqueness_constraints: - - device - vrf - version__value - human_friendly_id: - - device__name__value - - vrf__name__value - - version__value - display_label: description__value - inherit_from: - - RoutingProtocol attributes: - name: reference_bandwidth kind: Number - optional: true default_value: 1000 + optional: true description: Reference bandwidth for OSPF instance (in Mbps). - order_weight: 1150 + order_weight: 1350 - name: version kind: Dropdown + default_value: ospf choices: - name: ospf label: OSPFv2 @@ -111,51 +113,54 @@ nodes: label: OSPFv3 description: Open Shortest Path First version 3. color: '#E6E6FA' - default_value: ospf + optional: false description: Version of the OSPF protocol. - order_weight: 1100 + order_weight: 1300 - name: import_policies kind: Text optional: true - order_weight: 1300 + order_weight: 1450 - name: export_policies kind: Text optional: true - order_weight: 1350 + order_weight: 1500 relationships: - name: router_id peer: IpamIPAddress - optional: true - cardinality: one kind: Attribute + cardinality: one + optional: true + order_weight: 1400 - name: ospf_interfaces - label: OSPF Interfaces peer: RoutingOSPFInterface - identifier: ospf__ospfinterfaces - optional: true - cardinality: many + label: OSPF Interfaces kind: Component + cardinality: many + optional: true + identifier: ospf__ospfinterfaces + order_weight: 1550 - name: OSPFInterface namespace: Routing description: Pivot table linking OSPF configuration to an interface. label: OSPF Interface icon: mdi:ethernet - include_in_menu: false + include_in_menu: true + menu_placement: RoutingOSPF + human_friendly_id: + - description__value order_by: - description__value display_label: description__value uniqueness_constraints: - - ospf - interface - human_friendly_id: - - description__value attributes: - name: description kind: Text - optional: false unique: true + optional: false description: Description of the OSPF interface. - order_weight: 1500 + order_weight: 1100 - name: metric kind: Number optional: true @@ -163,6 +168,7 @@ nodes: order_weight: 1400 - name: mode kind: Dropdown + default_value: normal choices: - name: normal label: Normal @@ -176,14 +182,14 @@ nodes: label: Peer-to-Peer description: OSPF peer-to-peer interface mode. color: '#E6E6FA' - default_value: normal + optional: false description: Mode of the OSPF interface. order_weight: 1300 - name: authentication_key kind: Password + optional: true description: Shared secret used to authenticate and secure routing messages between neighboring routers. - optional: true order_weight: 1250 - name: authentication_mode kind: Dropdown @@ -198,22 +204,23 @@ nodes: order_weight: 1225 - name: area kind: Text + optional: false description: OSPF area associated with the interface. order_weight: 1200 relationships: - name: ospf - label: OSPF peer: RoutingOSPF - identifier: ospf__ospfinterfaces - optional: false - cardinality: one + label: OSPF kind: Parent - order_weight: 1100 + cardinality: one + optional: false + identifier: ospf__ospfinterfaces + order_weight: 900 - name: interface peer: InterfaceLayer3 - optional: false - cardinality: one kind: Attribute - order_weight: 1200 + cardinality: one + optional: false + order_weight: 1500 ``` \ No newline at end of file diff --git a/docs/docs/reference/routing_pim.mdx b/docs/docs/reference/routing_pim.mdx index c989332..17ee5cc 100644 --- a/docs/docs/reference/routing_pim.mdx +++ b/docs/docs/reference/routing_pim.mdx @@ -52,8 +52,8 @@ This schema extension contains all you need to model the PIM Protocol. | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| description | Description of the OSPF interface. | Text | False | | | -| pim_mode | PIM mode used for multicast routing on this interface. | Dropdown | | | sparse, dense, bidirectional | +| description | Description of the PIM interface. | Text | False | | | +| pim_mode | PIM mode used for multicast routing on this interface. | Dropdown | False | | sparse, dense, bidirectional | | hello_interval | Interval for PIM hello messages (in seconds). | Number | True | 30 | | | dr_priority | Designated Router priority on the interface. | Number | True | 1 | | @@ -74,24 +74,25 @@ nodes: description: Protocol Independent Multicast (PIM) instance on a Virtual Router. label: PIM icon: mdi:network-outline - include_in_menu: false + include_in_menu: true + menu_placement: RoutingProtocol inherit_from: - RoutingProtocol + human_friendly_id: + - device__name__value + - vrf__name__value order_by: - vrf__name__value - device__name__value + display_label: description__value uniqueness_constraints: - - device - vrf - human_friendly_id: - - device__name__value - - vrf__name__value - display_label: description__value attributes: - name: dr_priority kind: Number - optional: true default_value: 1 + optional: true description: Designated Router priority. order_weight: 1250 - name: import_policies @@ -105,37 +106,40 @@ nodes: relationships: - name: rp_address peer: IpamIPAddress + kind: Attribute + cardinality: one optional: true description: Rendezvous Point (RP) address for PIM. - cardinality: one - kind: Attribute + order_weight: 1400 - name: pim_interfaces - label: PIM Interfaces peer: RoutingPIMInterface - identifier: pim__piminterfaces - optional: true - cardinality: many + label: PIM Interfaces kind: Component + cardinality: many + optional: true + identifier: pim__piminterfaces + order_weight: 1450 - name: PIMInterface namespace: Routing description: Interface configuration for PIM. label: PIM Interface icon: mdi:ethernet - include_in_menu: false + include_in_menu: true + menu_placement: RoutingPIM + human_friendly_id: + - description__value order_by: - description__value display_label: description__value uniqueness_constraints: - - pim - interface - human_friendly_id: - - description__value attributes: - name: description kind: Text - optional: false unique: true - description: Description of the OSPF interface. + optional: false + description: Description of the PIM interface. order_weight: 1100 - name: pim_mode kind: Dropdown @@ -152,33 +156,35 @@ nodes: label: Bidirectional Mode description: Bidirectional PIM for efficient traffic forwarding. color: '#E6E6FA' + optional: false description: PIM mode used for multicast routing on this interface. order_weight: 1150 - name: hello_interval kind: Number - optional: true default_value: 30 + optional: true description: Interval for PIM hello messages (in seconds). order_weight: 1300 - name: dr_priority kind: Number - optional: true default_value: 1 + optional: true description: Designated Router priority on the interface. order_weight: 1250 relationships: - name: pim - label: PIM peer: RoutingPIM - identifier: pim__piminterfaces - optional: false - cardinality: one + label: PIM kind: Parent + cardinality: one + optional: false + identifier: pim__piminterfaces + order_weight: 900 - name: interface peer: InterfaceLayer3 - optional: false - cardinality: one kind: Attribute + cardinality: one + optional: false order_weight: 1200 ``` \ No newline at end of file diff --git a/docs/docs/reference/routing_policies.mdx b/docs/docs/reference/routing_policies.mdx index c2dbe9a..77f8749 100644 --- a/docs/docs/reference/routing_policies.mdx +++ b/docs/docs/reference/routing_policies.mdx @@ -13,6 +13,7 @@ This schema extension contains a generic to create Routing Policies. This Generi ### Policy +- **Label:** Routing Policy - **Description:** Policy defining the rules for routing traffic in a network. - **Namespace:** Routing - **Icon:** carbon:deployment-policy @@ -24,9 +25,9 @@ This schema extension contains a generic to create Routing Policies. This Generi | ---- | ----------- | ---- | -------- | ------------- | ------- | | name | The name of the routing policy. | Text | False | | | | description | An optional description of the routing policy. | Text | True | | | -| policy_type | The type of routing policy which specifies the direction of route advertisement. | Dropdown | | | import-policy, export-policy, import-export-policy | +| policy_type | The type of routing policy which specifies the direction of route advertisement. | Dropdown | False | | import_policy, export_policy, import_export_policy | | weight | Priority of the routing policy. The higher the number, the higher the priority. | Number | True | 1000 | | -| address_family | The address family for the routing policy indicating the type of IP address. | Dropdown | | all | ipv4, ipv6, all | +| address_family | The address family for the routing policy indicating the type of IP address. | Dropdown | False | all | ipv4, ipv6, all | ## Code @@ -35,9 +36,10 @@ version: '1.0' generics: - name: Policy namespace: Routing - icon: carbon:deployment-policy - include_in_menu: false description: Policy defining the rules for routing traffic in a network. + label: Routing Policy + icon: carbon:deployment-policy + include_in_menu: true human_friendly_id: - name__value order_by: @@ -46,45 +48,45 @@ generics: attributes: - name: name kind: Text - description: The name of the routing policy. unique: true optional: false + description: The name of the routing policy. order_weight: 1000 - name: description kind: Text - description: An optional description of the routing policy. optional: true + description: An optional description of the routing policy. order_weight: 1100 - name: policy_type - label: Type kind: Dropdown - description: The type of routing policy which specifies the direction of route - advertisement. + label: Type choices: - - name: import-policy + - name: import_policy label: Import description: Policy for incoming routes. color: '#E6E6FA' - - name: export-policy + - name: export_policy label: Export description: Policy for outgoing routes. color: '#E6E6FA' - - name: import-export-policy + - name: import_export_policy label: Import + Export description: Policy for both incoming and outgoing routes. color: '#E6E6FA' + optional: false + description: The type of routing policy which specifies the direction of route + advertisement. order_weight: 1200 - name: weight kind: Number + default_value: 1000 + optional: true description: Priority of the routing policy. The higher the number, the higher the priority. - optional: true - default_value: 1000 order_weight: 1400 - name: address_family - description: The address family for the routing policy indicating the type of - IP address. kind: Dropdown + default_value: all choices: - name: ipv4 label: IPv4 @@ -98,7 +100,9 @@ generics: label: All description: Policy applies to both IPv4 and IPv6 addresses. color: '#E6E6FA' - default_value: all + optional: false + description: The address family for the routing policy indicating the type of + IP address. order_weight: 1150 ``` \ No newline at end of file diff --git a/docs/docs/reference/routing_policies_aggregate.mdx b/docs/docs/reference/routing_policies_aggregate.mdx index 863bac2..7d50551 100644 --- a/docs/docs/reference/routing_policies_aggregate.mdx +++ b/docs/docs/reference/routing_policies_aggregate.mdx @@ -8,16 +8,14 @@ This extension is using the Routing Policies extensions and the Routing Aggregat - **Dependencies:** - [base](dcim) - - [extensions/routing](routing) - [extensions/routing_policies](routing_policies) - - [extensions/routing_aggregate](routing_aggregate) ## Nodes ### PolicyAggregate - **Label:** Aggregate Routing Policies -- **Description:** A routing policiers for Aggregate +- **Description:** A routing policy for Aggregate. - **Namespace:** Routing - **Icon:** carbon:deployment-policy - **Inherit From:** RoutingPolicy @@ -29,10 +27,11 @@ version: '1.0' nodes: - name: PolicyAggregate namespace: Routing - description: A routing policiers for Aggregate + description: A routing policy for Aggregate. label: Aggregate Routing Policies icon: carbon:deployment-policy - include_in_menu: false + include_in_menu: true + menu_placement: RoutingPolicy inherit_from: - RoutingPolicy diff --git a/docs/docs/reference/routing_policies_bgp.mdx b/docs/docs/reference/routing_policies_bgp.mdx index 4884f0c..a4a0667 100644 --- a/docs/docs/reference/routing_policies_bgp.mdx +++ b/docs/docs/reference/routing_policies_bgp.mdx @@ -8,7 +8,6 @@ This extension is using the Routing Policies extensions and the Routing BGP one - **Dependencies:** - [base](dcim) - - [extensions/routing](routing) - [extensions/routing_policies](routing_policies) - [extensions/routing_bgp](routing_bgp) @@ -17,7 +16,7 @@ This extension is using the Routing Policies extensions and the Routing BGP one ### PolicyBGP - **Label:** BGP Routing Policies -- **Description:** A routing policiers for BGP +- **Description:** A routing policy for BGP. - **Namespace:** Routing - **Icon:** carbon:deployment-policy - **Inherit From:** RoutingPolicy @@ -43,8 +42,8 @@ In this context "extensions" refer to modifications or additions to the existing | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | -| import_routing_policies | RoutingPolicyBGP | | many | Generic | -| export_routing_policies | RoutingPolicyBGP | | many | Generic | +| import_routing_policies | RoutingPolicyBGP | True | many | Generic | +| export_routing_policies | RoutingPolicyBGP | True | many | Generic | ### RoutingBGPSession @@ -59,8 +58,8 @@ In this context "extensions" refer to modifications or additions to the existing | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | -| import_routing_policies | RoutingPolicyBGP | | many | Generic | -| export_routing_policies | RoutingPolicyBGP | | many | Generic | +| import_routing_policies | RoutingPolicyBGP | True | many | Generic | +| export_routing_policies | RoutingPolicyBGP | True | many | Generic | ## Code @@ -69,10 +68,11 @@ version: '1.0' nodes: - name: PolicyBGP namespace: Routing - description: A routing policiers for BGP + description: A routing policy for BGP. label: BGP Routing Policies icon: carbon:deployment-policy - include_in_menu: false + include_in_menu: true + menu_placement: RoutingPolicy inherit_from: - RoutingPolicy extensions: @@ -87,19 +87,23 @@ extensions: state: absent relationships: - name: import_routing_policies - label: Import Routing Policies peer: RoutingPolicyBGP - identifier: bgppeergroup__import_policies - description: The routing-policies used by this instance for import. + label: Import Routing Policies kind: Generic cardinality: many + identifier: bgppeergroup__import_policies + optional: true + description: The routing-policies used by this instance for import. + order_weight: 1750 - name: export_routing_policies - label: Export Routing Policies peer: RoutingPolicyBGP - identifier: bgppeergroup__export_policies - description: The routing-policies used by this instance for export. + label: Export Routing Policies kind: Generic cardinality: many + identifier: bgppeergroup__export_policies + optional: true + description: The routing-policies used by this instance for export. + order_weight: 1800 - kind: RoutingBGPSession attributes: - name: import_policies @@ -110,18 +114,22 @@ extensions: state: absent relationships: - name: import_routing_policies - label: Import Routing Policies peer: RoutingPolicyBGP - identifier: bgpsession__import_policies - description: The routing-policies used by this instance for import. + label: Import Routing Policies kind: Generic cardinality: many + identifier: bgpsession__import_policies + optional: true + description: The routing-policies used by this instance for import. + order_weight: 1850 - name: export_routing_policies - label: Export Routing Policies peer: RoutingPolicyBGP - identifier: bgpsession__export_policies - description: The routing-policies used by this instance for export. + label: Export Routing Policies kind: Generic cardinality: many + identifier: bgpsession__export_policies + optional: true + description: The routing-policies used by this instance for export. + order_weight: 1900 ``` \ No newline at end of file diff --git a/docs/docs/reference/routing_policies_ospf.mdx b/docs/docs/reference/routing_policies_ospf.mdx index c2896b5..119aff6 100644 --- a/docs/docs/reference/routing_policies_ospf.mdx +++ b/docs/docs/reference/routing_policies_ospf.mdx @@ -8,7 +8,6 @@ This extension is using the Routing Policies extensions and the Routing OSPF one - **Dependencies:** - [base](dcim) - - [extensions/routing](routing) - [extensions/routing_policies](routing_policies) - [extensions/routing_ospf](routing_ospf) @@ -17,7 +16,7 @@ This extension is using the Routing Policies extensions and the Routing OSPF one ### PolicyOSPF - **Label:** OSPF Routing Policies -- **Description:** A routing policiers for OSPF +- **Description:** A routing policy for OSPF. - **Namespace:** Routing - **Icon:** carbon:deployment-policy - **Inherit From:** RoutingPolicy @@ -43,8 +42,8 @@ In this context "extensions" refer to modifications or additions to the existing | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | -| import_routing_policies | RoutingPolicyOSPF | | many | Generic | -| export_routing_policies | RoutingPolicyOSPF | | many | Generic | +| import_routing_policies | RoutingPolicyOSPF | True | many | Generic | +| export_routing_policies | RoutingPolicyOSPF | True | many | Generic | ## Code @@ -53,10 +52,11 @@ version: '1.0' nodes: - name: PolicyOSPF namespace: Routing - description: A routing policiers for OSPF + description: A routing policy for OSPF. label: OSPF Routing Policies icon: carbon:deployment-policy - include_in_menu: false + include_in_menu: true + menu_placement: RoutingPolicy inherit_from: - RoutingPolicy extensions: @@ -71,18 +71,22 @@ extensions: state: absent relationships: - name: import_routing_policies - label: Import Routing Policies peer: RoutingPolicyOSPF - identifier: ospf__import_policies - description: The routing-policies used by this instance for import. + label: Import Routing Policies kind: Generic cardinality: many + identifier: ospf__import_policies + optional: true + description: The routing-policies used by this instance for import. + order_weight: 1600 - name: export_routing_policies - label: Export Routing Policies peer: RoutingPolicyOSPF - identifier: ospf__export_policies - description: The routing-policies used by this instance for export. + label: Export Routing Policies kind: Generic cardinality: many + identifier: ospf__export_policies + optional: true + description: The routing-policies used by this instance for export. + order_weight: 1650 ``` \ No newline at end of file diff --git a/docs/docs/reference/routing_policies_pim.mdx b/docs/docs/reference/routing_policies_pim.mdx index 189a6c7..ae1e679 100644 --- a/docs/docs/reference/routing_policies_pim.mdx +++ b/docs/docs/reference/routing_policies_pim.mdx @@ -8,7 +8,6 @@ This schema inherits the `RoutingPolicy` schema and removes `import_policies` an - **Dependencies:** - [base](dcim) - - [extensions/routing](routing) - [extensions/routing_policies](routing_policies) - [extensions/routing_pim](routing_pim) @@ -17,7 +16,7 @@ This schema inherits the `RoutingPolicy` schema and removes `import_policies` an ### PolicyPIM - **Label:** PIM Routing Policies -- **Description:** A routing policiers for PIM +- **Description:** A routing policy for PIM. - **Namespace:** Routing - **Icon:** carbon:deployment-policy - **Inherit From:** RoutingPolicy @@ -43,8 +42,8 @@ In this context "extensions" refer to modifications or additions to the existing | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | -| import_routing_policies | RoutingPolicyPIM | | many | Generic | -| export_routing_policies | RoutingPolicyPIM | | many | Generic | +| import_routing_policies | RoutingPolicyPIM | True | many | Generic | +| export_routing_policies | RoutingPolicyPIM | True | many | Generic | ## Code @@ -53,10 +52,11 @@ version: '1.0' nodes: - name: PolicyPIM namespace: Routing - description: A routing policiers for PIM + description: A routing policy for PIM. label: PIM Routing Policies icon: carbon:deployment-policy - include_in_menu: false + include_in_menu: true + menu_placement: RoutingPolicy inherit_from: - RoutingPolicy extensions: @@ -71,18 +71,22 @@ extensions: state: absent relationships: - name: import_routing_policies - label: Import Routing Policies peer: RoutingPolicyPIM - identifier: pim__import_policies - description: The routing-policies used by this instance for import. + label: Import Routing Policies kind: Generic cardinality: many + identifier: pim__import_policies + optional: true + description: The routing-policies used by this instance for import. + order_weight: 1500 - name: export_routing_policies - label: Export Routing Policies peer: RoutingPolicyPIM - identifier: pim__export_policies - description: The routing-policies used by this instance for export. + label: Export Routing Policies kind: Generic cardinality: many + identifier: pim__export_policies + optional: true + description: The routing-policies used by this instance for export. + order_weight: 1550 ``` \ No newline at end of file diff --git a/docs/docs/reference/sfp.mdx b/docs/docs/reference/sfp.mdx index 816bac9..c903639 100644 --- a/docs/docs/reference/sfp.mdx +++ b/docs/docs/reference/sfp.mdx @@ -55,7 +55,7 @@ Improvements: | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| serial | | Text | True | | | +| serial_number | | Text | True | | | | sfp_type | Type of SFP, such as LR, SR, T. | Dropdown | False | | lr, sr, lrm, t, sr4, lr4, zr, er, dac, aoc | | status | | Dropdown | False | plugged | plugged, spare, decommissioned | | form_factor | The physical form factor of the SFP module. | Dropdown | False | | sfp, sfp_plus, qsfp, qsfp_plus, qsfp28, qsfp_dd, cfp, cfp2, cfp4, xfp, sfp56, qsfp56, osfp | @@ -82,7 +82,7 @@ In this context "extensions" refer to modifications or additions to the existing | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | -| plugged_sfp | DcimGenericSFP | True | one | | +| plugged_sfp | DcimGenericSFP | True | one | Generic | ### LocationHosting @@ -90,7 +90,7 @@ In this context "extensions" refer to modifications or additions to the existing | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | -| spare_sfps | DcimGenericSFP | True | many | | +| spare_sfps | DcimGenericSFP | True | many | Generic | ### OrganizationManufacturer @@ -98,7 +98,7 @@ In this context "extensions" refer to modifications or additions to the existing | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | -| sfps | DcimGenericSFP | True | many | | +| sfps | DcimGenericSFP | True | many | Generic | ## Code @@ -113,15 +113,12 @@ generics: include_in_menu: true display_label: '{{ form_factor__value }} {{ sfp_type__value }}' attributes: - - name: serial + - name: serial_number kind: Text optional: true order_weight: 1400 - name: sfp_type kind: Dropdown - description: Type of SFP, such as LR, SR, T. - order_weight: 1100 - optional: false choices: - name: lr label: LR (Long Reach) @@ -164,10 +161,11 @@ generics: label: AOC (Active Optical Cable) description: Active Optical Cable, used for short connections over fiber. color: '#6699ff' + optional: false + description: Type of SFP, such as LR, SR, T. + order_weight: 1100 - name: status kind: Dropdown - optional: false - order_weight: 1300 default_value: plugged choices: - name: plugged @@ -182,11 +180,10 @@ generics: label: Decommissioned description: Decommissioned might be broken or not used anymore. color: '#ffd27f' + optional: false + order_weight: 1200 - name: form_factor kind: Dropdown - description: The physical form factor of the SFP module. - order_weight: 1000 - optional: false choices: - name: sfp label: SFP @@ -227,53 +224,58 @@ generics: - name: osfp label: OSFP color: '#0099cc' + optional: false + description: The physical form factor of the SFP module. + order_weight: 1000 relationships: - name: interface peer: InterfacePhysical kind: Attribute - optional: true cardinality: one - order_weight: 1200 + optional: true identifier: sfp__interface + order_weight: 1300 - name: spare_location peer: LocationHosting kind: Attribute - optional: true cardinality: one + optional: true order_weight: 1500 - name: manufacturer peer: OrganizationManufacturer - cardinality: one kind: Attribute + cardinality: one optional: true order_weight: 1350 nodes: - name: StandardSFP namespace: Dcim - inherit_from: - - DcimGenericSFP description: Standard SFP module for various types (e.g., LR, SR, T). label: Standard SFP icon: mdi:gpu + include_in_menu: true menu_placement: DcimGenericSFP -- name: BidiSFP - namespace: Dcim inherit_from: - DcimGenericSFP +- name: BidiSFP + namespace: Dcim description: Bidirectional SFP supporting two wavelengths for single-fiber operation. label: Bidirectional SFP icon: lineicons:arrow-both-direction-vertical-1 + include_in_menu: true menu_placement: DcimGenericSFP + inherit_from: + - DcimGenericSFP attributes: - name: wavelength_tx - label: Transmit Wavelength (nm) kind: Number + label: Transmit Wavelength (nm) optional: false description: Transmit wavelength in nm. order_weight: 1175 - name: wavelength_rx - label: Receive Wavelength (nm) kind: Number + label: Receive Wavelength (nm) optional: false description: Receive wavelength in nm. order_weight: 1150 @@ -283,21 +285,27 @@ extensions: relationships: - name: plugged_sfp peer: DcimGenericSFP + kind: Generic cardinality: one optional: true identifier: sfp__interface + order_weight: 1700 - kind: LocationHosting relationships: - name: spare_sfps peer: DcimGenericSFP + kind: Generic cardinality: many optional: true + order_weight: 1750 - kind: OrganizationManufacturer relationships: - name: sfps - label: SFPs peer: DcimGenericSFP + kind: Generic + label: SFPs cardinality: many optional: true + order_weight: 1500 ``` \ No newline at end of file diff --git a/docs/docs/reference/snmp.mdx b/docs/docs/reference/snmp.mdx index d14bea5..93f2009 100644 --- a/docs/docs/reference/snmp.mdx +++ b/docs/docs/reference/snmp.mdx @@ -2,7 +2,7 @@ title: SNMP --- -This schema extension contains models for SNMP Communities and SNMP Clients. As you can see this extension is not linked to Tenancy or Device, as you could decide to link the Community to different models based on your use case. +This schema extension contains models for SNMP Communities and SNMP Clients. A community links to the devices it is configured on; any further wiring, to a tenant for instance, is left to you. ## Details @@ -24,8 +24,8 @@ This schema extension contains models for SNMP Communities and SNMP Clients. As | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| community_string | | Password | | | | -| access | | Dropdown | | | read_only, read_write | +| community_string | | Password | False | | | +| access | | Dropdown | False | | read_only, read_write | ### CommunityV3 @@ -40,12 +40,12 @@ This schema extension contains models for SNMP Communities and SNMP Clients. As | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| username | | Text | | | | -| auth_protocol | | Dropdown | | | none, md5, sha | +| username | | Text | False | | | +| auth_protocol | | Dropdown | False | | none, md5, sha | | auth_password | | Password | True | | | -| privacy_protocol | | Dropdown | | | none, des, aes | +| privacy_protocol | | Dropdown | False | | none, des, aes | | privacy_password | | Password | True | | | -| security_level | | Dropdown | | | noAuthNoPriv, authNoPriv, authPriv | +| security_level | | Dropdown | False | | no_auth_no_priv, auth_no_priv, auth_priv | ### Client @@ -59,15 +59,15 @@ This schema extension contains models for SNMP Communities and SNMP Clients. As | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| name | | Text | | | | +| name | | Text | False | | | | client_description | | Text | True | | | #### Relationships | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | -| ip_address | IpamIPAddress | | many | Attribute | -| community | SnmpCommunity | | many | | +| ip_addresses | IpamIPAddress | True | many | Attribute | +| communities | SnmpCommunity | True | many | Attribute | ## Generics @@ -83,15 +83,15 @@ This schema extension contains models for SNMP Communities and SNMP Clients. As | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| name | | Text | | | | +| name | | Text | False | | | | description | | Text | True | | | #### Relationships | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | -| clients | SnmpClient | | many | Component | -| devices | DcimDevice | | many | Attribute | +| clients | SnmpClient | True | many | Component | +| devices | DcimGenericDevice | True | many | Attribute | ## Code @@ -103,48 +103,57 @@ generics: description: Generic model for SNMP community configurations. label: SNMP Community icon: iconoir:community + include_in_menu: true human_friendly_id: - name__value - display_label: name__value order_by: - name__value + display_label: name__value attributes: - name: name kind: Text + unique: true + optional: false order_weight: 1000 - name: description kind: Text - order_weight: 1100 optional: true + order_weight: 1100 relationships: - name: clients peer: SnmpClient - cardinality: many kind: Component + cardinality: many + optional: true + order_weight: 1900 - name: devices + peer: DcimGenericDevice label: Devices - description: Devices this community is configured on. - peer: DcimDevice - cardinality: many kind: Attribute - order_weight: 1200 + cardinality: many + optional: true + identifier: snmp_community__device + description: Devices this community is configured on. + order_weight: 1800 nodes: - name: CommunityV2 namespace: Snmp description: SNMP v1/v2c community configuration. label: SNMP v1/v2c icon: iconoir:community + include_in_menu: true menu_placement: SnmpCommunity + inherit_from: + - SnmpCommunity human_friendly_id: - name__value - display_label: name__value order_by: - name__value - inherit_from: - - SnmpCommunity + display_label: name__value attributes: - name: community_string kind: Password + optional: false order_weight: 1300 - name: access kind: Dropdown @@ -155,27 +164,30 @@ nodes: - name: read_write label: Read-Write description: Read-write access. + optional: false order_weight: 1200 - name: CommunityV3 namespace: Snmp description: SNMP version 3 configuration with enhanced security. label: SNMP v3 icon: iconoir:community + include_in_menu: true menu_placement: SnmpCommunity + inherit_from: + - SnmpCommunity human_friendly_id: - name__value - display_label: name__value order_by: - name__value - inherit_from: - - SnmpCommunity + display_label: name__value attributes: - name: username kind: Text + optional: false order_weight: 1300 - name: auth_protocol - label: Authentication Protocol kind: Dropdown + label: Authentication Protocol choices: - name: none label: None @@ -186,15 +198,16 @@ nodes: - name: sha label: SHA description: SHA authentication. + optional: false order_weight: 1400 - name: auth_password - label: Authentication Password kind: Password - order_weight: 1500 + label: Authentication Password optional: true + order_weight: 1500 - name: privacy_protocol - label: Privacy Protocol kind: Dropdown + label: Privacy Protocol choices: - name: none label: None @@ -205,57 +218,65 @@ nodes: - name: aes label: AES description: AES encryption. + optional: false order_weight: 1600 - name: privacy_password - label: Privacy Password kind: Password - order_weight: 1700 + label: Privacy Password optional: true + order_weight: 1700 - name: security_level - label: Security Level kind: Dropdown + label: Security Level choices: - - name: noAuthNoPriv + - name: no_auth_no_priv label: NoAuthNoPriv description: No authentication and no privacy. - - name: authNoPriv + - name: auth_no_priv label: AuthNoPriv description: Authentication but no privacy. - - name: authPriv + - name: auth_priv label: AuthPriv description: Both authentication and privacy. + optional: false order_weight: 1200 - name: Client namespace: Snmp description: Represents an SNMP client that interacts with SNMP Community. label: SNMP Client icon: ph:user-list-light + include_in_menu: true menu_placement: SnmpCommunity human_friendly_id: - name__value - display_label: name__value order_by: - name__value + display_label: name__value attributes: - name: name kind: Text + unique: true + optional: false order_weight: 1000 - name: client_description - label: Description kind: Text - order_weight: 1100 + label: Description optional: true + order_weight: 1100 relationships: - - name: ip_address - label: IP Address - description: Authorized SNMP client address. + - name: ip_addresses peer: IpamIPAddress - cardinality: many + label: IP Addresses kind: Attribute + cardinality: many + optional: true + description: Authorized SNMP client address. order_weight: 1150 - - name: community + - name: communities peer: SnmpCommunity + kind: Attribute cardinality: many + optional: true order_weight: 1200 ``` \ No newline at end of file diff --git a/docs/docs/reference/tenancy.mdx b/docs/docs/reference/tenancy.mdx index d8d9679..b6d01eb 100644 --- a/docs/docs/reference/tenancy.mdx +++ b/docs/docs/reference/tenancy.mdx @@ -13,8 +13,9 @@ This schema extension introduces a Tenant node that can own devices, IP prefixes ### Tenant +- **Label:** Tenant - **Description:** A tenant is the owner of the corresponding devices, addressing, and locations. -- **Namespace:** Tenancy +- **Namespace:** Organization - **Icon:** mdi:domain - **Inherit From:** OrganizationGeneric @@ -41,7 +42,7 @@ In this context "extensions" refer to modifications or additions to the existing | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | -| tenant | TenancyTenant | True | one | Attribute | +| tenant | OrganizationTenant | True | one | Attribute | ### IpamPrefix @@ -49,7 +50,7 @@ In this context "extensions" refer to modifications or additions to the existing | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | -| tenant | TenancyTenant | True | one | Attribute | +| tenant | OrganizationTenant | True | one | Attribute | ### IpamIPAddress @@ -57,7 +58,7 @@ In this context "extensions" refer to modifications or additions to the existing | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | -| tenant | TenancyTenant | True | one | Attribute | +| tenant | OrganizationTenant | True | one | Attribute | ### LocationHosting @@ -65,7 +66,7 @@ In this context "extensions" refer to modifications or additions to the existing | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | -| tenant | TenancyTenant | True | one | Attribute | +| tenant | OrganizationTenant | True | one | Attribute | ## Code @@ -73,78 +74,85 @@ In this context "extensions" refer to modifications or additions to the existing version: '1.0' nodes: - name: Tenant - namespace: Tenancy + namespace: Organization description: A tenant is the owner of the corresponding devices, addressing, and locations. + label: Tenant icon: mdi:domain include_in_menu: true + menu_placement: OrganizationGeneric inherit_from: - OrganizationGeneric relationships: - name: devices - label: Devices peer: DcimGenericDevice - identifier: tenant__device + label: Devices + kind: Generic cardinality: many optional: true - kind: Generic + identifier: tenant__device + order_weight: 1300 - name: prefixes - label: Prefixes peer: IpamPrefix - identifier: tenant__prefix + label: Prefixes + kind: Generic cardinality: many optional: true - kind: Generic + identifier: tenant__prefix + order_weight: 1350 - name: addresses - label: Addresses peer: IpamIPAddress - identifier: tenant__ipaddress + label: Addresses + kind: Generic cardinality: many optional: true - kind: Generic + identifier: tenant__ip_address + order_weight: 1400 - name: locations - label: Locations peer: LocationHosting - identifier: tenant__location + label: Locations + kind: Generic cardinality: many optional: true - kind: Generic + identifier: tenant__location + order_weight: 1450 extensions: nodes: - kind: DcimGenericDevice relationships: - name: tenant - peer: TenancyTenant - identifier: tenant__device - optional: true - cardinality: one + peer: OrganizationTenant kind: Attribute - order_weight: 1800 + cardinality: one + optional: true + identifier: tenant__device + order_weight: 1850 - kind: IpamPrefix relationships: - name: tenant - peer: TenancyTenant - identifier: tenant__prefix - optional: true - cardinality: one + peer: OrganizationTenant kind: Attribute + cardinality: one + optional: true + identifier: tenant__prefix order_weight: 1400 - kind: IpamIPAddress relationships: - name: tenant - peer: TenancyTenant - identifier: tenant__ipaddress - optional: true - cardinality: one + peer: OrganizationTenant kind: Attribute - order_weight: 1300 + cardinality: one + optional: true + identifier: tenant__ip_address + order_weight: 1350 - kind: LocationHosting relationships: - name: tenant - peer: TenancyTenant - identifier: tenant__location - optional: true - cardinality: one + peer: OrganizationTenant kind: Attribute + cardinality: one + optional: true + identifier: tenant__location + order_weight: 1800 ``` \ No newline at end of file diff --git a/docs/docs/reference/topology.mdx b/docs/docs/reference/topology.mdx index 4d490b5..26ef067 100644 --- a/docs/docs/reference/topology.mdx +++ b/docs/docs/reference/topology.mdx @@ -8,6 +8,7 @@ A schema for defining and managing network topology, strategies, and services. - **Dependencies:** - [base](dcim) + - [extensions/vlan](vlan) ## Nodes @@ -191,8 +192,8 @@ A schema for defining and managing network topology, strategies, and services. | ---- | ---- | -------- | ----------- | ---- | | identifier | TopologyNetworkServiceIdentifier | False | one | Attribute | | topology | TopologyTopology | False | one | Parent | -| vlan | InfraVLAN | True | one | Component | -| prefix | InfraPrefix | True | one | Component | +| vlan | IpamVLAN | True | one | Component | +| prefix | IpamPrefix | True | one | Component | ## Generics @@ -216,7 +217,7 @@ A schema for defining and managing network topology, strategies, and services. | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | | location | LocationGeneric | True | many | | -| ip_addresses | InfraIPAddress | True | many | Component | +| ip_addresses | IpamIPAddress | True | many | Component | ### GenericElement @@ -333,7 +334,7 @@ generics: optional: true cardinality: many - name: ip_addresses - peer: InfraIPAddress + peer: IpamIPAddress optional: true cardinality: many kind: Component @@ -690,13 +691,13 @@ nodes: kind: Parent optional: false - name: vlan - peer: InfraVLAN + peer: IpamVLAN optional: true cardinality: one kind: Component order_weight: 1500 - name: prefix - peer: InfraPrefix + peer: IpamPrefix optional: true cardinality: one kind: Component diff --git a/docs/docs/reference/users.mdx b/docs/docs/reference/users.mdx index b2fc616..c6cea3e 100644 --- a/docs/docs/reference/users.mdx +++ b/docs/docs/reference/users.mdx @@ -23,10 +23,10 @@ This schema extension contains models for account management. | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| name | | Text | | | | +| name | | Text | False | | | | description | | Text | True | | | -| idle_timeout | | Number | | | | -| permissions | | Dropdown | False | | admin, operator, read-only | +| idle_timeout | | Number | False | | | +| permissions | | Dropdown | False | | admin, operator, read_only | ### Account @@ -40,11 +40,11 @@ This schema extension contains models for account management. | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| name | The login username | Text | | | | +| name | The login username | Text | False | | | | full_name | Full name of the account | Text | True | | | | ssh_key | SSH key for secure access | Password | True | | | | password | Password for login (alternative to SSH key) | Password | True | | | -| mfa_enabled | Whether multi-factor authentication is enabled | Boolean | | False | | +| mfa_enabled | Whether multi-factor authentication is enabled | Boolean | False | False | | #### Relationships @@ -67,7 +67,7 @@ In this context "extensions" refer to modifications or additions to the existing | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | -| accounts | UserAccount | | many | Component | +| accounts | UserAccount | True | many | Component | ## Code @@ -79,55 +79,63 @@ nodes: description: User Group label: User Groups icon: iconoir:group - display_label: name__value - order_by: - - name__value + include_in_menu: true human_friendly_id: - name__value + order_by: + - name__value + display_label: name__value attributes: - name: name kind: Text - order_weight: 1000 unique: true + optional: false + order_weight: 1000 - name: description kind: Text optional: true order_weight: 1100 - name: idle_timeout - label: Idle Timeout (s) kind: Number + label: Idle Timeout (s) + optional: false order_weight: 1300 - name: permissions kind: Dropdown - optional: false choices: - name: admin + label: Admin description: All rights on device. color: '#E6E6FA' - name: operator + label: Operator description: Operator right on configuration. color: '#E6E6FA' - - name: read-only + - name: read_only + label: Read Only description: Read only right on configuration. color: '#E6E6FA' + optional: false order_weight: 1200 - name: Account namespace: User description: User login and authentication label: User Account icon: mdi:account-key - display_label: name__value - order_by: - - name__value + include_in_menu: true human_friendly_id: - name__value + order_by: + - name__value + display_label: name__value attributes: - name: name - label: Username kind: Text + label: Username + unique: true + optional: false description: The login username order_weight: 1000 - unique: true - name: full_name kind: Text optional: true @@ -146,28 +154,32 @@ nodes: - name: mfa_enabled kind: Boolean default_value: false + optional: false description: Whether multi-factor authentication is enabled order_weight: 1500 relationships: - name: user_group peer: UserGroup + kind: Attribute cardinality: one optional: false - kind: Attribute order_weight: 1200 - name: organization peer: OrganizationGeneric - optional: false - cardinality: one kind: Parent + cardinality: one + optional: false + order_weight: 900 extensions: nodes: - kind: OrganizationGeneric relationships: - name: accounts - kind: Component peer: UserAccount - description: List of Accounts under this organization + kind: Component cardinality: many + optional: true + description: List of Accounts under this organization + order_weight: 1600 ``` \ No newline at end of file diff --git a/docs/docs/reference/vlan.mdx b/docs/docs/reference/vlan.mdx index 394bda3..14437cb 100644 --- a/docs/docs/reference/vlan.mdx +++ b/docs/docs/reference/vlan.mdx @@ -14,8 +14,11 @@ This schema extension contains models to support VLANs in you network. ### VLAN - **Label:** VLAN +- **Description:** A plain VLAN, with no QinQ role of its own. - **Namespace:** Ipam -- **Inherit From:** GenericVLAN +- **Uniqueness Constraints:** + - vlan_id__value, vlan_group +- **Inherit From:** IpamGenericVLAN ### VLANGroup @@ -29,7 +32,7 @@ This schema extension contains models to support VLANs in you network. | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| name | | Text | | | | +| name | | Text | False | | | | description | | Text | True | | | #### Relationships @@ -37,38 +40,25 @@ This schema extension contains models to support VLANs in you network. | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | | scope | IpamVLANGroupScope | True | one | Attribute | -| vlans | GenericVLAN | True | many | Component | +| vlans | IpamGenericVLAN | True | many | Component | ## Generics -### VLANGroupScope - -- **Description:** Mixin for objects that can scope a VLAN group (e.g. Region, Site, Rack). -- **Namespace:** Ipam - -#### Relationships - -| name | peer | optional | cardinality | kind | -| ---- | ---- | -------- | ----------- | ---- | -| vlan_groups | IpamVLANGroup | True | many | Attribute | - -### VLAN +### GenericVLAN - **Label:** VLAN -- **Description:** A VLAN is isolated layer two domain -- **Namespace:** Generic +- **Description:** A VLAN is an isolated layer two domain. +- **Namespace:** Ipam - **Icon:** mdi:lan-pending -- **Uniqueness Constraints:** - - vlan_id__value, vlan_group - **Human Friendly ID:** name__value #### Attributes | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| name | | Text | | | | +| name | | Text | False | | | | description | | Text | True | | | -| vlan_id | | Number | | | | +| vlan_id | | Number | False | | | | status | | Dropdown | False | active | active, reserved, provisioning, maintenance, deprecated | | role | | Dropdown | True | | server, management, user | @@ -87,13 +77,21 @@ In this context "extensions" refer to modifications or additions to the existing ::: +### IpamVLANGroupScope + +#### Relationships + +| name | peer | optional | cardinality | kind | +| ---- | ---- | -------- | ----------- | ---- | +| vlan_groups | IpamVLANGroup | True | many | Attribute | + ### IpamPrefix #### Relationships | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | -| vlan | GenericVLAN | True | one | Attribute | +| vlan | IpamGenericVLAN | True | one | Attribute | ### InterfaceLayer2 @@ -101,34 +99,20 @@ In this context "extensions" refer to modifications or additions to the existing | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | -| untagged_vlan | GenericVLAN | True | one | Generic | -| tagged_vlan | GenericVLAN | True | many | Generic | +| untagged_vlan | IpamGenericVLAN | True | one | Generic | +| tagged_vlan | IpamGenericVLAN | True | many | Generic | ## Code ```yaml version: '1.0' generics: -- name: VLANGroupScope +- name: GenericVLAN namespace: Ipam - description: Mixin for objects that can scope a VLAN group (e.g. Region, Site, Rack). - include_in_menu: false - relationships: - - name: vlan_groups - label: VLAN Groups - peer: IpamVLANGroup - identifier: vlan_group__scope - cardinality: many - optional: true - kind: Attribute -- name: VLAN - namespace: Generic - description: A VLAN is isolated layer two domain + description: A VLAN is an isolated layer two domain. label: VLAN icon: mdi:lan-pending - uniqueness_constraints: - - - vlan_id__value - - vlan_group + include_in_menu: true human_friendly_id: - name__value order_by: @@ -137,18 +121,19 @@ generics: attributes: - name: name kind: Text - order_weight: 910 + optional: false + order_weight: 1000 - name: description kind: Text optional: true + order_weight: 1100 - name: vlan_id kind: Number - order_weight: 900 + optional: false + order_weight: 1050 - name: status kind: Dropdown - optional: false default_value: active - order_weight: 920 choices: - name: active label: Active @@ -170,9 +155,10 @@ generics: label: Deprecated description: No longer in use and scheduled for removal. color: '#e04040' + optional: false + order_weight: 1200 - name: role kind: Dropdown - optional: true choices: - name: server label: Server @@ -186,84 +172,108 @@ generics: label: User description: Segments designed for end-user access and activities. color: '#a0b78d' + optional: true + order_weight: 1300 relationships: - name: prefixes peer: IpamPrefix - optional: true - cardinality: many kind: Attribute + cardinality: many + optional: true identifier: vlan__prefix + order_weight: 1500 - name: vlan_group - label: VLAN Group peer: IpamVLANGroup - optional: false - cardinality: one + label: VLAN Group kind: Attribute - order_weight: 930 + cardinality: one + optional: false identifier: vlan_group__vlan + order_weight: 1400 nodes: - name: VLAN namespace: Ipam + description: A plain VLAN, with no QinQ role of its own. label: VLAN include_in_menu: false inherit_from: - - GenericVLAN + - IpamGenericVLAN + uniqueness_constraints: + - - vlan_id__value + - vlan_group - name: VLANGroup namespace: Ipam description: A VLAN group scopes VLANs to a domain (site, rack, etc.). label: VLAN Group icon: mdi:domain-switch - menu_placement: GenericVLAN + include_in_menu: true + menu_placement: IpamGenericVLAN human_friendly_id: - name__value display_label: name__value attributes: - name: name kind: Text + unique: true + optional: false order_weight: 1000 - name: description kind: Text optional: true + order_weight: 1100 relationships: - name: scope peer: IpamVLANGroupScope - identifier: vlan_group__scope - optional: true - cardinality: one kind: Attribute + cardinality: one + optional: true + identifier: vlan_group__scope order_weight: 900 - name: vlans - peer: GenericVLAN - optional: true - cardinality: many + peer: IpamGenericVLAN kind: Component + cardinality: many + optional: true identifier: vlan_group__vlan + order_weight: 1500 extensions: nodes: + - kind: IpamVLANGroupScope + relationships: + - name: vlan_groups + peer: IpamVLANGroup + label: VLAN Groups + kind: Attribute + cardinality: many + optional: true + identifier: vlan_group__scope + order_weight: 1600 - kind: IpamPrefix relationships: - name: vlan - peer: GenericVLAN - optional: true - cardinality: one + peer: IpamGenericVLAN kind: Attribute - order_weight: 1400 + cardinality: one + optional: true identifier: vlan__prefix + order_weight: 1450 - kind: InterfaceLayer2 relationships: - name: untagged_vlan + peer: IpamGenericVLAN label: Untagged VLAN - peer: GenericVLAN - optional: true - cardinality: one kind: Generic + cardinality: one + optional: true identifier: interface_l2__untagged_vlan + order_weight: 1500 - name: tagged_vlan + peer: IpamGenericVLAN label: Tagged VLANs - peer: GenericVLAN - optional: true - cardinality: many kind: Generic + cardinality: many + optional: true identifier: interface_l2__tagged_vlan + order_weight: 1550 ``` \ No newline at end of file diff --git a/docs/docs/reference/vrf.mdx b/docs/docs/reference/vrf.mdx index 03db3d9..6e735a2 100644 --- a/docs/docs/reference/vrf.mdx +++ b/docs/docs/reference/vrf.mdx @@ -14,7 +14,7 @@ This schema extension contains models to support VRF in your network. ### VRF - **Label:** VRF -- **Description:** A VRF is isolated layer three domain +- **Description:** A VRF is an isolated layer three domain. - **Namespace:** Ipam - **Icon:** mdi:router - **Human Friendly ID:** name__value @@ -25,7 +25,7 @@ This schema extension contains models to support VRF in your network. | ---- | ----------- | ---- | -------- | ------------- | ------- | | name | | Text | False | | | | vrf_rd | | Text | True | | | -| enforce_unique | | Boolean | True | True | | +| enforce_unique | Declares the intent that prefixes and addresses be unique within this VRF. Infrahub does not enforce this; consume it from a check or a generator. | Boolean | True | True | | | description | | Text | True | | | #### Relationships @@ -47,15 +47,15 @@ This schema extension contains models to support VRF in your network. | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| name | | Text | | | | +| name | | Text | False | | | | description | | Text | True | | | #### Relationships | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | -| import_vrf | IpamVRF | True | many | | -| export_vrf | IpamVRF | True | many | | +| import_vrf | IpamVRF | True | many | Generic | +| export_vrf | IpamVRF | True | many | Generic | ## Extensions @@ -88,9 +88,10 @@ version: '1.0' nodes: - name: VRF namespace: Ipam - description: A VRF is isolated layer three domain + description: A VRF is an isolated layer three domain. label: VRF icon: mdi:router + include_in_menu: true human_friendly_id: - name__value order_by: @@ -99,42 +100,49 @@ nodes: attributes: - name: name kind: Text - optional: false unique: true + optional: false + order_weight: 1000 - name: vrf_rd - label: Route Distinguisher kind: Text + label: Route Distinguisher optional: true + order_weight: 1050 - name: enforce_unique - label: Enforce Unique kind: Boolean + label: Enforce Unique + description: Declares the intent that prefixes and addresses be unique within + this VRF. Infrahub does not enforce this; consume it from a check or a generator. default_value: true optional: true - order_weight: 1100 + order_weight: 1200 - name: description kind: Text optional: true - order_weight: 1200 + order_weight: 1100 relationships: - name: import_rt - identifier: vrf__import - label: Import Targets peer: IpamRouteTarget - optional: true - cardinality: many + label: Import Targets kind: Attribute + cardinality: many + optional: true + identifier: vrf__import + order_weight: 1300 - name: export_rt - identifier: vrf__export - label: Export Targets peer: IpamRouteTarget - optional: true - cardinality: many + label: Export Targets kind: Attribute + cardinality: many + optional: true + identifier: vrf__export + order_weight: 1350 - name: RouteTarget namespace: Ipam description: Route Target (RFC 4360) label: Route Target icon: mdi:target + include_in_menu: true menu_placement: IpamVRF human_friendly_id: - name__value @@ -145,43 +153,50 @@ nodes: - name: name kind: Text unique: true + optional: false + order_weight: 1000 - name: description kind: Text optional: true + order_weight: 1100 relationships: - name: import_vrf - label: Imported by VRFs - identifier: vrf__import peer: IpamVRF - optional: true + kind: Generic + label: Imported by VRFs cardinality: many + optional: true + identifier: vrf__import + order_weight: 1300 - name: export_vrf - label: Exported by VRFs - identifier: vrf__export peer: IpamVRF - optional: true + kind: Generic + label: Exported by VRFs cardinality: many + optional: true + identifier: vrf__export + order_weight: 1350 extensions: nodes: - kind: IpamPrefix relationships: - name: vrf - label: VRF peer: IpamVRF - identifier: prefix__vrf - optional: true - cardinality: one + label: VRF kind: Attribute + cardinality: one + optional: true + identifier: prefix__vrf order_weight: 1150 - kind: IpamIPAddress relationships: - name: vrf - label: VRF peer: IpamVRF - identifier: ip_address__vrf - optional: true - cardinality: one + label: VRF kind: Attribute + cardinality: one + optional: true + identifier: ip_address__vrf order_weight: 1150 ``` \ No newline at end of file diff --git a/docs/docs/reference/vrrp.mdx b/docs/docs/reference/vrrp.mdx index 120d947..cf0407b 100644 --- a/docs/docs/reference/vrrp.mdx +++ b/docs/docs/reference/vrrp.mdx @@ -23,8 +23,8 @@ This schema extension contains models for VRRP. | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| name | Unique name of the entry | Text | | | | -| vrid | Virtual Router ID (VRID, should be between 1 and 255) | Number | | | | +| name | Unique name of the entry | Text | False | | | +| vrid | Virtual Router ID (VRID, should be between 1 and 255) | Number | False | | | | password | VRRP Password/Key | HashedPassword | True | | | #### Relationships @@ -32,7 +32,7 @@ This schema extension contains models for VRRP. | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | | ip_addresses | IpamIPAddress | True | many | Attribute | -| vrrp_interfaces | NetworkVRRPInterface | | many | Component | +| vrrp_interfaces | NetworkVRRPInterface | True | many | Component | ### VRRPInterface @@ -47,7 +47,7 @@ This schema extension contains models for VRRP. | name | description | kind | optional | default_value | choices | | ---- | ----------- | ---- | -------- | ------------- | ------- | -| priority | VRRP Priority (Should be between 1 and 255) | Number | | 100 | | +| priority | VRRP Priority (Should be between 1 and 255) | Number | False | 100 | | #### Relationships @@ -70,7 +70,7 @@ In this context "extensions" refer to modifications or additions to the existing | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | -| vrrp | NetworkVRRPInterface | | one | Component | +| vrrp | NetworkVRRPInterface | True | one | Component | ### IpamIPAddress @@ -78,7 +78,7 @@ In this context "extensions" refer to modifications or additions to the existing | name | peer | optional | cardinality | kind | | ---- | ---- | -------- | ----------- | ---- | -| vrrp | NetworkVRRPGroup | | one | Component | +| vrrp | NetworkVRRPGroup | True | one | Attribute | ## Code @@ -87,58 +87,63 @@ version: '1.0' nodes: - name: VRRPGroup namespace: Network + description: VRRP Group configuration label: VRRP Group icon: fluent:virtual-network-20-filled - description: VRRP Group configuration - display_label: name__value - order_by: - - name__value + include_in_menu: true human_friendly_id: - name__value + order_by: + - name__value + display_label: name__value attributes: - name: name kind: Text label: Name unique: true + optional: false description: Unique name of the entry order_weight: 1000 - name: vrid kind: Number + label: VRID parameters: min_value: 1 max_value: 255 + optional: false description: Virtual Router ID (VRID, should be between 1 and 255) - label: VRID order_weight: 1100 - name: password kind: HashedPassword - description: VRRP Password/Key label: Password optional: true + description: VRRP Password/Key order_weight: 1400 relationships: - name: ip_addresses - on_delete: cascade - description: VRRP IP (v4 or v6) - label: IP Addresses peer: IpamIPAddress - optional: true - cardinality: many + label: IP Addresses kind: Attribute + cardinality: many + optional: true + on_delete: cascade + description: VRRP IP (v4 or v6) order_weight: 1200 - name: vrrp_interfaces - on_delete: cascade - kind: Component peer: NetworkVRRPInterface - cardinality: many label: VRRP Interfaces + kind: Component + cardinality: many + on_delete: cascade + optional: true order_weight: 1300 - name: VRRPInterface namespace: Network + description: VRRP Interface configuration label: VRRP Interface icon: carbon:interface-usage + include_in_menu: true menu_placement: NetworkVRRPGroup - description: VRRP Interface configuration order_by: - priority__value uniqueness_constraints: @@ -148,48 +153,51 @@ nodes: - name: priority kind: Number label: VRRP Priority + default_value: 100 parameters: min_value: 1 max_value: 255 + optional: false description: VRRP Priority (Should be between 1 and 255) - default_value: 100 order_weight: 1100 relationships: - name: vrrp_group - description: VRRP Group - label: VRRP Group peer: NetworkVRRPGroup - optional: false - cardinality: one + label: VRRP Group kind: Attribute + cardinality: one + optional: false + description: VRRP Group order_weight: 1200 - name: interface - description: Interface L3 - label: Interface peer: InterfaceLayer3 - optional: false - cardinality: one + label: Interface kind: Attribute + cardinality: one + optional: false + description: Interface L3 order_weight: 1300 extensions: nodes: - kind: InterfaceLayer3 relationships: - name: vrrp - kind: Component peer: NetworkVRRPInterface - description: VRRP Interface Configuration - cardinality: one label: VRRP - order_weight: 1500 + kind: Component + cardinality: one + optional: true + description: VRRP Interface Configuration + order_weight: 1650 - kind: IpamIPAddress relationships: - name: vrrp - kind: Component peer: NetworkVRRPGroup - description: Part of VRRP Group - cardinality: one label: VRRP Group - order_weight: 1600 + kind: Attribute + cardinality: one + optional: true + description: Part of VRRP Group + order_weight: 1700 ``` \ No newline at end of file From b0c03b358836e5e917ebe1bd68216838c840f003 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 18:55:15 +0200 Subject: [PATCH 50/68] fix(objects): correct stale PSU bay comment and align duplicated provider descriptions M-TEXT leftovers: the device_psu_module header announced three PSU bays while the file creates two (PSU-01); circuit.yml re-upserts Lumen and Colt with descriptions that drifted from objects/base/01_organization.yml, so whichever file loaded last won. Checklist: CC-8. Co-Authored-By: Claude Fable 5 --- objects/extensions/circuit/circuit.yml | 4 ++-- objects/extensions/device_psu_module/device_psu_module.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/objects/extensions/circuit/circuit.yml b/objects/extensions/circuit/circuit.yml index 526b1ab..9ef9130 100644 --- a/objects/extensions/circuit/circuit.yml +++ b/objects/extensions/circuit/circuit.yml @@ -19,9 +19,9 @@ spec: kind: OrganizationProvider data: - name: Lumen - description: Lumen Technologies, circuit provider. + description: Lumen Technologies -- transit and dark fiber provider. - name: Colt - description: Colt Technology Services, circuit provider. + description: Colt Technology Services -- transit and cross connects. --- apiVersion: infrahub.app/v1 diff --git a/objects/extensions/device_psu_module/device_psu_module.yml b/objects/extensions/device_psu_module/device_psu_module.yml index f9e9e4c..0f22cce 100644 --- a/objects/extensions/device_psu_module/device_psu_module.yml +++ b/objects/extensions/device_psu_module/device_psu_module.yml @@ -7,7 +7,7 @@ # Module<->ModuleBay is a strict 1:1 relationship, and nyc1-rtr01's existing # bays ("slot 1", "slot 2", "fan tray 1") are already occupied by DcimModule # instances from extensions/device_module -- so this file creates brand new -# bays ("PSU slot 1"/"PSU slot 2"/"PSU slot 3") to install the PSU modules +# bays ("PSU slot 1"/"PSU slot 2") to install the PSU modules # into, instead of reusing the existing ones. # # Order: DcimPSUModuleType -> DcimModuleBay (new PSU bays) -> DcimPSUModule From a773b7359c125df92ce103ab90fa8096deaa9be5 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 19:56:35 +0200 Subject: [PATCH 51/68] fix: keep node and attribute descriptions within the 128 character limit Infrahub caps `description` at 128 characters. Three descriptions added by review commit 351f655 were over the cap, and the first one aborted the whole base load on a fresh 1.11.0 instance before any node was created: base/dcim.yml generic DcimConnector 212 chars extensions/circuit node DcimCircuitEndpoint 208 chars extensions/vrf attribute enforce_unique 146 chars Each description keeps its factual core; the UI-behaviour half moves to a YAML `#` comment above the field, which has no length limit and stays next to the definition it explains. A scan of every `description` and `label` in base/, extensions/ and experimental/ (recursive walk of the parsed YAML) reports zero remaining values over 128 characters, so these three were the only offenders. Verified on a fresh infrahub-testcontainers 1.11.0 instance: `infrahubctl schema load base` now reports "4 schemas processed in 7.106 seconds" where it previously failed with "Unable to load the schema". Reference pages regenerated with `invoke docs.generate`. The three hand-written mutual-exclusion notes in extensions/*/README.md are restored afterwards because the generator overwrites them with the pointer template. Checklist: CC-8. Co-Authored-By: Claude Fable 5 --- base/dcim.yml | 7 +++---- docs/docs/reference/circuit.mdx | 5 ++--- docs/docs/reference/dcim.mdx | 6 ++---- docs/docs/reference/vrf.mdx | 6 +++--- extensions/circuit/circuit.yml | 5 +++-- extensions/vrf/vrf.yml | 5 +++-- 6 files changed, 16 insertions(+), 18 deletions(-) diff --git a/base/dcim.yml b/base/dcim.yml index cb8906f..faf2d42 100644 --- a/base/dcim.yml +++ b/base/dcim.yml @@ -124,12 +124,11 @@ generics: optional: true identifier: connector__endpoint order_weight: 1600 + # connected_endpoints is kind Attribute so both ends render inline on the connector form. + # A high-fan-out connector kind should override the relationship back to Generic. - name: Connector namespace: Dcim - description: >- - Generic Connector to link two endpoints together. The endpoints are kind Attribute so both - ends render inline on the connector form; a high-fan-out connector kind should override the - relationship back to Generic. + description: Generic Connector to link two endpoints together. include_in_menu: false relationships: - name: connected_endpoints diff --git a/docs/docs/reference/circuit.mdx b/docs/docs/reference/circuit.mdx index 59e8afa..5001418 100644 --- a/docs/docs/reference/circuit.mdx +++ b/docs/docs/reference/circuit.mdx @@ -39,7 +39,7 @@ This schema extension contains Circuits and ways to connect them with your infra ### CircuitEndpoint - **Label:** Circuit Endpoint -- **Description:** One of the two terminations (A or Z) of a circuit, at the location where the provider hands the circuit off. Use the description field for the provider-side reference (patch panel position, cross-connect ID). +- **Description:** One of the two terminations (A or Z) of a circuit, at the location where the provider hands the circuit off. - **Namespace:** Dcim - **Icon:** mdi:ethernet - **Uniqueness Constraints:** @@ -184,8 +184,7 @@ nodes: - name: CircuitEndpoint namespace: Dcim description: One of the two terminations (A or Z) of a circuit, at the location - where the provider hands the circuit off. Use the description field for the provider-side - reference (patch panel position, cross-connect ID). + where the provider hands the circuit off. label: Circuit Endpoint icon: mdi:ethernet include_in_menu: true diff --git a/docs/docs/reference/dcim.mdx b/docs/docs/reference/dcim.mdx index 6801a3c..49d628a 100644 --- a/docs/docs/reference/dcim.mdx +++ b/docs/docs/reference/dcim.mdx @@ -152,7 +152,7 @@ Basic DCIM schema to capture devices, racks, interfaces, and related information ### Connector -- **Description:** Generic Connector to link two endpoints together. The endpoints are kind Attribute so both ends render inline on the connector form; a high-fan-out connector kind should override the relationship back to Generic. +- **Description:** Generic Connector to link two endpoints together. - **Namespace:** Dcim #### Relationships @@ -343,9 +343,7 @@ generics: order_weight: 1600 - name: Connector namespace: Dcim - description: Generic Connector to link two endpoints together. The endpoints are - kind Attribute so both ends render inline on the connector form; a high-fan-out - connector kind should override the relationship back to Generic. + description: Generic Connector to link two endpoints together. include_in_menu: false relationships: - name: connected_endpoints diff --git a/docs/docs/reference/vrf.mdx b/docs/docs/reference/vrf.mdx index 6e735a2..603c1b8 100644 --- a/docs/docs/reference/vrf.mdx +++ b/docs/docs/reference/vrf.mdx @@ -25,7 +25,7 @@ This schema extension contains models to support VRF in your network. | ---- | ----------- | ---- | -------- | ------------- | ------- | | name | | Text | False | | | | vrf_rd | | Text | True | | | -| enforce_unique | Declares the intent that prefixes and addresses be unique within this VRF. Infrahub does not enforce this; consume it from a check or a generator. | Boolean | True | True | | +| enforce_unique | Declares the intent that prefixes and addresses be unique in this VRF. Infrahub does not enforce it; use a check or generator. | Boolean | True | True | | | description | | Text | True | | | #### Relationships @@ -111,8 +111,8 @@ nodes: - name: enforce_unique kind: Boolean label: Enforce Unique - description: Declares the intent that prefixes and addresses be unique within - this VRF. Infrahub does not enforce this; consume it from a check or a generator. + description: Declares the intent that prefixes and addresses be unique in this + VRF. Infrahub does not enforce it; use a check or generator. default_value: true optional: true order_weight: 1200 diff --git a/extensions/circuit/circuit.yml b/extensions/circuit/circuit.yml index 038fc98..984265a 100644 --- a/extensions/circuit/circuit.yml +++ b/extensions/circuit/circuit.yml @@ -99,12 +99,13 @@ nodes: identifier: circuit__endpoint order_weight: 1600 + # The description field carries the provider-side reference for the termination, + # for example a patch panel position or a cross-connect ID. - name: CircuitEndpoint namespace: Dcim description: >- One of the two terminations (A or Z) of a circuit, at the location where the provider hands - the circuit off. Use the description field for the provider-side reference (patch panel - position, cross-connect ID). + the circuit off. label: Circuit Endpoint icon: mdi:ethernet include_in_menu: true diff --git a/extensions/vrf/vrf.yml b/extensions/vrf/vrf.yml index 45cc0af..7ce945d 100644 --- a/extensions/vrf/vrf.yml +++ b/extensions/vrf/vrf.yml @@ -33,8 +33,9 @@ nodes: - name: enforce_unique kind: Boolean label: Enforce Unique - description: Declares the intent that prefixes and addresses be unique within this VRF. - Infrahub does not enforce this; consume it from a check or a generator. + description: >- + Declares the intent that prefixes and addresses be unique in this VRF. Infrahub does + not enforce it; use a check or generator. default_value: true optional: true order_weight: 1200 From 0d7f0029515734b7028f5743c4770b3f08cf89f6 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 19:57:53 +0200 Subject: [PATCH 52/68] fix(physical_disk): make the device name resolvable for the disk HFID Review commit 0ffcd60 gave DcimPhysicalDisk a human_friendly_id of [device__name__value, name__value] to match its uniqueness_constraints, but left the peer generic DcimDeviceWithPhysicalDisks with a plain `name`. Infrahub only accepts an HFID that walks a peer when the referenced attribute combination on that peer is unique, so a fresh 1.11.0 instance rejected the extension outright: HFID of DcimPhysicalDisk refers to peer DcimDeviceWithPhysicalDisks with a non-unique combination of attributes ['name__value'] `unique: true` on that attribute closes the gap. The library ships no implementer of this generic (it is documented in .metadata.yml as one you apply to your own device kind), and every device kind here inherits DcimGenericDevice, which already declares name unique, so no shipped node changes behaviour. The existing `allow_override: any` still lets an implementer restate the attribute. This mirrors DcimPhysicalDevice.name in base/dcim.yml, which carries the same unique + allow_override pair and the same explanatory comment. Verified on a fresh infrahub-testcontainers 1.11.0 instance: `infrahubctl schema load extensions/physical_disk` reports "1 schema processed in 4.891 seconds"; it previously aborted on the HFID error above. Checklist: CC-4. Co-Authored-By: Claude Fable 5 --- docs/docs/reference/physical_disk.mdx | 1 + extensions/physical_disk/physical_disk.yml | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/docs/docs/reference/physical_disk.mdx b/docs/docs/reference/physical_disk.mdx index f569173..e2bcad3 100644 --- a/docs/docs/reference/physical_disk.mdx +++ b/docs/docs/reference/physical_disk.mdx @@ -72,6 +72,7 @@ generics: attributes: - name: name kind: Text + unique: true allow_override: any optional: false order_weight: 1000 diff --git a/extensions/physical_disk/physical_disk.yml b/extensions/physical_disk/physical_disk.yml index 48a771c..39a3513 100644 --- a/extensions/physical_disk/physical_disk.yml +++ b/extensions/physical_disk/physical_disk.yml @@ -13,8 +13,15 @@ generics: description: Generic that hold relationship toward physical disks. To apply on device that can have physical disks. include_in_menu: false attributes: - - name: name # Here so HFIDs and computed names can resolve, see DcimPhysicalDevice.name + # Here so HFIDs and computed names can resolve, see DcimPhysicalDevice.name. + # unique is required because DcimPhysicalDisk.human_friendly_id walks + # device__name__value, and Infrahub only accepts a peer attribute combination that is + # unique. Every device kind this generic is meant to be applied to already inherits + # DcimGenericDevice, which declares name unique, so nothing changes for them; + # allow_override lets an implementer restate the attribute either way. + - name: name kind: Text + unique: true allow_override: any optional: false order_weight: 1000 From de993e8cd19a890fad84d9bc91b4650ddd485f23 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 20:53:55 +0200 Subject: [PATCH 53/68] fix(objects): make circuit objects self-sufficient for standalone loads objects/extensions/circuit loads at schema-dependency position 2 but referenced LocationSite NYC1 and SJC1, which objects/extensions/location_minimal only creates at position 7. On a fresh 1.11.0 instance the file aborted with: Unable to find the node NYC1 / LocationHosting DcimCircuitEndpoint.location is mandatory and its peer LocationHosting is a base generic that base itself never implements, so the fixture has to bring its own sites. They are created with name and description only, without a parent: extensions/location_site has no tier above Site and extensions/location_minimal puts sites under Americas -> United States, so restating either tree would tie this file to one of the two mutually exclusive location extensions. Restating location_minimal's is not possible in any case, re-upserting the hierarchy root fails with "Not supported to assign a value to parent for LocationRegion". Declaring extensions/location_site as a dependency in .metadata.yml (the way extensions/rack does, which would move circuit behind the location fixture) was rejected: CC-1 dropped circuit -> location_minimal as a declared-but-unused edge, and circuit.yml still references no LocationSite kind, only the base LocationHosting generic. On the parent question the brief raised: a partial LocationSite upsert does clear `parent`, confirmed directly (load location_minimal, upsert {name: NYC1, description: ...}, parent goes from "United States" to null). It is not a consequence of this change. objects/extensions/sfp, cross_connect, vlan, compute, dwdm and hosting_cluster already carry fifteen nested {kind: LocationSite, data: {name: ...}} blocks that do exactly the same thing, several of them after location_minimal in the load order, so NYC1 and SJC1 end a full ordered load without a parent with or without this commit. This file adds no new exposure: at position 2 it runs before every other file that touches a site. Cleaning up the fifteen pre-existing blocks (a plain HFID scalar resolves against LocationHosting and does not re-save the node) is a separate sweep. Verified on a fresh infrahub-testcontainers 1.11.0 instance: objects/base plus all 34 objects/extensions directories load in resolver order with zero errors, 35/35, where objects/extensions/circuit previously failed. GraphQL then reports DcimCircuit 3 and DcimCircuitEndpoint 4. Checklist: CC-1. Co-Authored-By: Claude Fable 5 --- objects/extensions/circuit/circuit.yml | 36 ++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/objects/extensions/circuit/circuit.yml b/objects/extensions/circuit/circuit.yml index 9ef9130..495ff2f 100644 --- a/objects/extensions/circuit/circuit.yml +++ b/objects/extensions/circuit/circuit.yml @@ -1,17 +1,43 @@ # --------------------------------------------------------------------------- # Mock data for extensions/circuit. -# Depends on: base, extensions/location_minimal (LocationSite: NYC1, SJC1). +# Self-sufficient: it creates every record it references, so it can be loaded +# on its own on top of base + any extension that provides a concrete +# LocationSite (extensions/location_minimal or extensions/location_site). # -# The sites the endpoints hand off at are owned by -# objects/extensions/location_minimal, which builds them under the Americas -> -# United States hierarchy. They are referenced here by human_friendly_id only: -# restating that tree would re-upsert a hierarchical root, which fails. +# DcimCircuitEndpoint.location is mandatory and its peer LocationHosting is a +# base generic that base itself never implements, so the endpoints need a Site +# to exist. The sites are created below with their name only, deliberately +# without a parent: extensions/location_site has no tier above Site, and +# extensions/location_minimal puts them under Americas -> United States, so +# restating either tree here would tie this file to one of the two mutually +# exclusive location extensions. Restating location_minimal's tree is not an +# option anyway, since re-upserting the hierarchy root fails with "Not +# supported to assign a value to parent for LocationRegion". +# +# ORDER: load this file BEFORE your location fixture. In the .metadata.yml +# resolver order that is what happens (circuit sorts ahead of +# location_minimal), and location_minimal's fuller definition then adopts NYC1 +# and SJC1 into its hierarchy. Loading it the other way round leaves the two +# sites without a parent, because `infrahubctl object load` sends an explicit +# null for every optional cardinality-one relationship a document omits -- see +# the note at the top of objects/extensions/mlag/mlag.yml. # # NOTE: this file also creates the OrganizationProvider (from base) fixtures it # needs. If base's own object file has already loaded the same records (Lumen, # Colt), this upserts/matches them instead of duplicating -- see rule in AGENTS # notes about repeating mandatory fields for an existing target. # --------------------------------------------------------------------------- +--- +apiVersion: infrahub.app/v1 +kind: Object +spec: + kind: LocationSite + data: + - name: NYC1 + description: "Circuit hand-off site, New York metro." + - name: SJC1 + description: "Circuit hand-off site, San Jose metro." + --- apiVersion: infrahub.app/v1 kind: Object From 5c3d0447c650a5e35efd0ab39724d80aedbc3c6b Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 20:54:11 +0200 Subject: [PATCH 54/68] fix(objects): stop later files clearing the MLAG domain membership Mechanism, read out of infrahub-sdk 1.17.0 and then confirmed on a live instance. `infrahubctl object load` builds every record from scratch and saves it with allow_upsert. In InfrahubNodeBase._generate_input_data (node/node.py:213) a relationship that the document leaves out is treated three different ways: cardinality-many is skipped, mandatory cardinality-one is skipped, and OPTIONAL cardinality-one is written into the payload as an explicit None. A partial re-upsert therefore clears exactly the optional cardinality-one links, and `create()` sends that payload unfiltered because allow_upsert never passes exclude_unmodified. DcimDevice.mlag_domain is optional cardinality one and shares the identifier device__mlag_domain with MlagDomain.peers, which is min_count/max_count 2. objects/extensions/mlag wired nyc1-rtr01 and nyc1-rtr02 into NYC1-MLAG-01 at resolver position 16; objects/extensions/rack (17), device_psu_module (18), dwdm (22), routing_ospf (28) and routing_pim (29) each re-upsert nyc1-rtr01 afterwards without it, and all five failed with: ['DcimDeviceUpsert'] Node has 0 peers for device__mlag_domain, no fewer than 2 allowed Restating mlag_domain in those five files was rejected: objects/extensions/rack and four others would then fail whenever extensions/mlag is not loaded, which inverts the layering and contradicts the self-sufficiency rule applied to the circuit fixture. Referencing the device instead of re-declaring it is not available either, DcimModuleBay.device peers with DcimPhysicalDevice, which declares no human_friendly_id, so the nested {kind, data} block that re-saves the device is the only way to express that link. So the fixture owns its own endpoints. The domain is now built on nyc1-rtr02 and a new nyc1-rtr03, and this file is the only one anywhere under objects/ that ever saves either of them; nyc1-rtr01 is left to the files that own it. objects/extensions/routing_bgp and peering_ixp are unaffected, they reference nyc1-rtr02 by human_friendly_id, which does not re-save it. Both peers moved into a single document so the LocationRack block can be shared through a YAML anchor, which does not cross a `---` boundary. The upsert rule is written out once, in this file's header, with the failing error text, so a future file re-declaring a linked node has somewhere to look. objects/extensions/circuit and objects/extensions/vrrp point at it. Verified on a fresh infrahub-testcontainers 1.11.0 instance: all 35 object directories load in resolver order with zero errors, and GraphQL reports NYC1-MLAG-01 with peers nyc1-rtr02 and nyc1-rtr03, two peer_links and MlagInterface 2. Checklist: CC-1, CC-7. Co-Authored-By: Claude Fable 5 --- objects/extensions/mlag/mlag.yml | 115 +++++++++++++++++++++---------- 1 file changed, 79 insertions(+), 36 deletions(-) diff --git a/objects/extensions/mlag/mlag.yml b/objects/extensions/mlag/mlag.yml index 73eefc8..9985722 100644 --- a/objects/extensions/mlag/mlag.yml +++ b/objects/extensions/mlag/mlag.yml @@ -1,20 +1,46 @@ # --------------------------------------------------------------------------- # Mock data for extensions/mlag. -# Depends on: base, extensions/lag (DcimDevice: nyc1-rtr01, in NYC1-RACK-01, -# with interfaces TenGigE0/0/0/1 and /2 bundled into InterfaceLag -# "Bundle-Ether1"). +# Depends on: base, extensions/lag (InterfaceLag, GenericInterfaceBundle), +# extensions/location_minimal (LocationSite: NYC1), extensions/rack +# (LocationRack: NYC1-RACK-01). +# +# UPSERT RULE FOR EVERY FILE UNDER objects/ -- documented once, here. +# +# `infrahubctl object load` builds each record from scratch and saves it with +# allow_upsert, and infrahub-sdk fills in every optional cardinality-one +# relationship the document leaves out with an explicit null. Re-declaring a +# node another file has already linked therefore CLEARS those links. Where the +# link is guarded by a constraint the load fails outright, as here: +# +# ['DcimDeviceUpsert'] Node has 0 peers for device__mlag_domain, +# no fewer than 2 allowed +# +# MlagDomain.peers is min_count/max_count 2 and shares the identifier +# device__mlag_domain with the optional DcimDevice.mlag_domain added by this +# extension, so ANY later document that re-upserts a member device without +# restating mlag_domain breaks the domain. Restating it is not an option +# either: it would make objects/extensions/rack (and four other files) depend +# on this extension's schema, inverting the layering. +# +# So a fixture that owns a relationship owns its endpoints too. This file +# creates, and is the only file anywhere under objects/ that ever saves, +# nyc1-rtr02 and nyc1-rtr03. It deliberately does not build the domain on +# nyc1-rtr01: objects/extensions/rack, device_psu_module, dwdm, routing_ospf +# and routing_pim all re-upsert that device after this file has run. +# objects/extensions/routing_bgp and peering_ixp only reference nyc1-rtr02 by +# human_friendly_id, which does not save it and so is safe. # # A MlagDomain regroups exactly 2 devices (peers, min_count/max_count = 2) -# built over LAG interfaces used as peer-links. So we add a second device, -# nyc1-rtr02, in the same rack/site, with its own pair of physical interfaces -# bundled into its own "Bundle-Ether1" LAG -- mirroring nyc1-rtr01's peer-link -# LAG. Both LAGs then become the domain's peer_links. +# built over LAG interfaces used as peer-links, so both peers are created here +# in the same rack/site, each with its own pair of physical interfaces bundled +# into its own "Bundle-Ether1" LAG. Both LAGs then become the domain's +# peer_links. # # MlagInterface inherits GenericInterfaceBundle (bundle_members, cardinality # many, peer InterfacePhysical) but NOT DcimInterface -- it has no single # "device" of its own. Instead it is "spread across devices in the domain" -# by bundling physical interfaces that live on different peer devices. We -# add TenGigE0/0/0/3 and /4 on both devices to serve as those members. +# by bundling physical interfaces that live on different peer devices. +# TenGigE0/0/0/3 and /4 on both devices serve as those members. # # MlagInterface.mlag_domain is a Parent relationship (mandatory, cardinality # one) paired with MlagDomain.mlag_interfaces (Component, cardinality many), @@ -35,18 +61,31 @@ kind: Object spec: kind: DcimDevice data: - # Upsert against the existing nyc1-rtr01 (created by extensions/rack, - # extended by extensions/lag) -- add the two physical interfaces that - # will become MLAG interface members toward downstream access switches. - - name: nyc1-rtr01 + # First peer of the MLAG domain, with a peer-link LAG over + # TenGigE0/0/0/1-2 and a pair of MLAG-facing interfaces on /3 and /4. + - name: nyc1-rtr02 + status: active + role: edge device_type: ASR9001 platform: Cisco IOS-XR - location: + position: 41 + rack_face: front + location: &nyc1_rack_01 kind: LocationRack data: name: NYC1-RACK-01 site: NYC1 interfaces: + - kind: InterfacePhysical + data: + name: TenGigE0/0/0/1 + status: active + role: core + - kind: InterfacePhysical + data: + name: TenGigE0/0/0/2 + status: active + role: core - kind: InterfacePhysical data: name: TenGigE0/0/0/3 @@ -57,27 +96,31 @@ spec: name: TenGigE0/0/0/4 status: active role: core + - kind: InterfaceLag + data: + name: Bundle-Ether1 + description: MLAG peer-link toward nyc1-rtr03. + status: active + role: core + bundle_number: 1 + lacp_mode: active + lacp_rate: fast + bundle_members: + - ["nyc1-rtr02", "TenGigE0/0/0/1"] + - ["nyc1-rtr02", "TenGigE0/0/0/2"] ---- -apiVersion: infrahub.app/v1 -kind: Object -spec: - kind: DcimDevice - data: - # Second peer of the MLAG domain -- same rack/site as nyc1-rtr01, with a - # mirrored peer-link LAG and its own pair of MLAG-facing interfaces. - - name: nyc1-rtr02 + # Second peer of the MLAG domain -- same rack/site as nyc1-rtr02, with a + # mirrored peer-link LAG and its own pair of MLAG-facing interfaces. Both + # peers live in one document so the LocationRack anchor above can be + # reused: a YAML anchor does not cross a `---` document boundary. + - name: nyc1-rtr03 status: active role: edge device_type: ASR9001 platform: Cisco IOS-XR - position: 41 + position: 42 rack_face: front - location: - kind: LocationRack - data: - name: NYC1-RACK-01 - site: NYC1 + location: *nyc1_rack_01 interfaces: - kind: InterfacePhysical data: @@ -102,15 +145,15 @@ spec: - kind: InterfaceLag data: name: Bundle-Ether1 - description: MLAG peer-link toward nyc1-rtr01. + description: MLAG peer-link toward nyc1-rtr02. status: active role: core bundle_number: 1 lacp_mode: active lacp_rate: fast bundle_members: - - ["nyc1-rtr02", "TenGigE0/0/0/1"] - - ["nyc1-rtr02", "TenGigE0/0/0/2"] + - ["nyc1-rtr03", "TenGigE0/0/0/1"] + - ["nyc1-rtr03", "TenGigE0/0/0/2"] --- apiVersion: infrahub.app/v1 @@ -121,11 +164,11 @@ spec: - domain_id: "NYC1-MLAG-01" reload_delay: 300 peers: - - ["nyc1-rtr01"] - ["nyc1-rtr02"] + - ["nyc1-rtr03"] peer_links: - - ["nyc1-rtr01", "Bundle-Ether1"] - ["nyc1-rtr02", "Bundle-Ether1"] + - ["nyc1-rtr03", "Bundle-Ether1"] mlag_interfaces: kind: MlagInterface data: @@ -135,13 +178,13 @@ spec: role: router bundle_number: 100 bundle_members: - - ["nyc1-rtr01", "TenGigE0/0/0/3"] - ["nyc1-rtr02", "TenGigE0/0/0/3"] + - ["nyc1-rtr03", "TenGigE0/0/0/3"] - name: Bundle-Ether101 description: MLAG port-channel toward nyc1-acc-sw02. status: active role: router bundle_number: 101 bundle_members: - - ["nyc1-rtr01", "TenGigE0/0/0/4"] - ["nyc1-rtr02", "TenGigE0/0/0/4"] + - ["nyc1-rtr03", "TenGigE0/0/0/4"] From 5a1fa550c250fae1dbc9c024430eee21b011901f Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 20:54:23 +0200 Subject: [PATCH 55/68] fix(objects): keep the VRRP fixture on interfaces it owns Same defect family as the MLAG one, uncovered once that fix let objects/extensions/rack get past its device upsert. rack then failed on the nested interface instead: ['InterfacePhysicalUpsert'] Node has -1 peers for interfacelayer3__networkvrrpinterface, no fewer than 1 allowed extensions/vrrp adds InterfaceLayer3.vrrp as an optional cardinality-one relationship, and its counterpart NetworkVRRPInterface.interface is mandatory. objects/extensions/vrrp (resolver position 14) put NYC1-CORE-VRRP on GigabitEthernet0/0/0/0, which objects/extensions/rack (17) owns and re-declares afterwards; the re-declaration nulls the optional side and would orphan the NetworkVRRPInterface, so the server refuses the mutation. The group moves to GigabitEthernet0/0/0/3, which nothing else creates or touches, so all three VRRP groups now sit on interfaces this file creates itself (/1, /2, /3). The header records why /0 is off limits and points at the upsert rule in objects/extensions/mlag/mlag.yml. The stale claim that GigabitEthernet0/0/0/0 "already exists (from extensions/rack)" goes with it: rack loads after this file, sfp is what creates that interface earlier. A sweep of the live 1.11.0 schema for the same shape (an optional cardinality-one relationship whose counterpart is mandatory cardinality-one) found only two others: InterfaceLag.vrrp, which no fixture uses, and DcimModuleBay.installed_module, where objects/extensions/device_psu_module creates fresh bays instead of reusing the occupied ones. Verified on a fresh infrahub-testcontainers 1.11.0 instance: objects/base plus all 34 objects/extensions directories load in resolver order with zero errors, 35/35. GraphQL reports three NetworkVRRPInterface records on GigabitEthernet0/0/0/1, /2 and /3. Checklist: CC-7. Co-Authored-By: Claude Fable 5 --- objects/extensions/vrrp/vrrp.yml | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/objects/extensions/vrrp/vrrp.yml b/objects/extensions/vrrp/vrrp.yml index d79d3ab..859f1fe 100644 --- a/objects/extensions/vrrp/vrrp.yml +++ b/objects/extensions/vrrp/vrrp.yml @@ -1,7 +1,6 @@ # --------------------------------------------------------------------------- # Mock data for extensions/vrrp. -# Depends on: base, extensions/rack (DcimDevice: nyc1-rtr01, in NYC1-RACK-01, -# with interface GigabitEthernet0/0/0/0). +# Depends on: base, extensions/rack (DcimDevice: nyc1-rtr01, in NYC1-RACK-01). # # NetworkVRRPGroup.vrrp_interfaces is a Component relationship of cardinality # many with a CONCRETE peer (NetworkVRRPInterface), so we point it at the @@ -19,11 +18,19 @@ # - LocationRack: name, site (site's peer LocationSite is CONCRETE, so a # plain HFID string is enough there) # This upserts against the existing nyc1-rtr01 / NYC1-RACK-01 fixtures rather -# than duplicating them. GigabitEthernet0/0/0/0 already exists (from -# extensions/rack); GigabitEthernet0/0/0/1 and /2 are fresh interfaces added -# here, created inline the same way. All three VRRP groups live on the single -# available fixture device -- a real deployment would spread group members -# across two physical routers for actual first-hop redundancy. +# than duplicating them. GigabitEthernet0/0/0/1, /2 and /3 are fresh +# interfaces added here, created inline the same way. All three VRRP groups +# live on the single available fixture device -- a real deployment would +# spread group members across two physical routers for actual first-hop +# redundancy. +# +# The groups deliberately stay off GigabitEthernet0/0/0/0. That interface +# belongs to objects/extensions/rack, which re-declares it after this file has +# run, and a re-declaration clears the optional cardinality-one +# InterfaceLayer3.vrrp link this file created -- the load then fails with +# "['InterfacePhysicalUpsert'] Node has -1 peers for +# interfacelayer3__networkvrrpinterface, no fewer than 1 allowed". See the +# upsert rule at the top of objects/extensions/mlag/mlag.yml. # # NOTE: NetworkVRRPInterface has no human_friendly_id of its own (only # order_by + uniqueness_constraints on [vrrp_group, interface]), so @@ -53,7 +60,9 @@ spec: interface: kind: InterfacePhysical data: - name: GigabitEthernet0/0/0/0 + name: GigabitEthernet0/0/0/3 + status: active + role: core device: kind: DcimDevice data: From af2ced0147a533669d16ac1120bf1dbf17b7dffd Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Mon, 31 Aug 2026 21:22:39 +0200 Subject: [PATCH 56/68] fix(docs): keep the trailing newline when generating the home page The markdown lint CI job failed with a single MD047 violation on docs/docs/home.mdx, which is generated from docs/_templates/home_page.j2 by _generate_home_page_documentation(). The template ends with a newline, but the renderer built its environment as jinja2.Environment(trim_blocks=True), and keep_trailing_newline defaults to False, so Jinja stripped the template's final newline from the rendered output. Regenerating the docs therefore reproducibly emits a home page that markdownlint rejects. Set keep_trailing_newline=True and regenerate. The flag only suppresses the lexer's end-of-source newline strip, so the output is the previous output plus one newline, and nothing else changes. Co-Authored-By: Claude Fable 5 --- docs/docs/home.mdx | 2 +- tasks/docs.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/docs/home.mdx b/docs/docs/home.mdx index 4635f9f..9bf3cdf 100644 --- a/docs/docs/home.mdx +++ b/docs/docs/home.mdx @@ -161,4 +161,4 @@ This error indicates that the schema you are trying to load has dependencies on To resolve this, ensure that you have loaded all required schemas before attempting to load the one in question. You can find the list of dependencies in the schema documentation. -::: \ No newline at end of file +::: diff --git a/tasks/docs.py b/tasks/docs.py index cd91d58..89395a5 100644 --- a/tasks/docs.py +++ b/tasks/docs.py @@ -122,7 +122,8 @@ def _generate_home_page_documentation() -> None: template_text = template_file.read_text(encoding="utf-8") # Render the template - environment = jinja2.Environment(trim_blocks=True) + # keep_trailing_newline keeps the template's final newline, which markdownlint (MD047) requires. + environment = jinja2.Environment(trim_blocks=True, keep_trailing_newline=True) template = environment.from_string(template_text) rendered_file = template.render(toc=toc_content) From 745bcc0bf59be4b1a9d1c80f2f08b2c7d5fe544a Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Tue, 1 Sep 2026 10:53:07 +0200 Subject: [PATCH 57/68] chore: convert remaining TODO markers to issues extensions/vrf/vrf.yml -> #82 tasks/schemas.py (schema-less extension dir) -> #83 tasks/schemas.py (loader return value) -> #84 tasks/docs.py (hardcoded base link, trailing comment only) -> #85 extensions/routing/routing.yml -> #86 Drafts 1 (#81), 7 (#87) and 8 (#88) have no marker to delete. Checklist: CC-8 Co-Authored-By: Claude Fable 5 --- extensions/routing/routing.yml | 1 - extensions/vrf/vrf.yml | 1 - tasks/docs.py | 2 +- tasks/schemas.py | 2 -- 4 files changed, 1 insertion(+), 5 deletions(-) diff --git a/extensions/routing/routing.yml b/extensions/routing/routing.yml index 9c7439a..e2b209a 100644 --- a/extensions/routing/routing.yml +++ b/extensions/routing/routing.yml @@ -15,7 +15,6 @@ generics: icon: "carbon:router" include_in_menu: true attributes: - # TODO: Should be computed later - name: description kind: Text unique: true diff --git a/extensions/vrf/vrf.yml b/extensions/vrf/vrf.yml index 7ce945d..3c9977a 100644 --- a/extensions/vrf/vrf.yml +++ b/extensions/vrf/vrf.yml @@ -82,7 +82,6 @@ nodes: - name__value display_label: name__value attributes: - # TODO: regex to comply with RFC 4360 (nautobot doesn't enforce that) - name: name kind: Text unique: true diff --git a/tasks/docs.py b/tasks/docs.py index 89395a5..e5a00c8 100644 --- a/tasks/docs.py +++ b/tasks/docs.py @@ -59,7 +59,7 @@ def _generate_schema_reference_content(schema_key: str, schema_metadata: dict) - if "dependencies" in schema_metadata: for dep in schema_metadata["dependencies"]: if dep == "base": - link = "dcim" # TODO: This is a hack, should be improved ... maybe merging all base references + link = "dcim" else: link = dep.split("/")[1] schema_data["dependencies"].append({"name": dep, "link": link}) diff --git a/tasks/schemas.py b/tasks/schemas.py index 7d2ae07..80188fc 100644 --- a/tasks/schemas.py +++ b/tasks/schemas.py @@ -13,13 +13,11 @@ def _load_extension(context: Context, path: Path) -> None: # Make sure it's a dir - # TODO: here if in extensions folder we have a dir without schema it will fail if os.path.isdir(path): print("#" * 80) print(f"🏗️ Loading `{path}`") # Load extensions - # TODO: Maybe improve what we return here... context.run(f"infrahubctl schema load {path}") print("#" * 80) From 9d18a5315babf8c4cabab60057a504fb5c491439 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Wed, 2 Sep 2026 10:38:06 +0200 Subject: [PATCH 58/68] fix: drop the default_value optionality note from the base schemas (review suggestion) Review threads: base/dcim.yml:169-170 and base/ipam.yml:53-54 (BaptisteGi). The note claimed Infrahub 1.11 treats an attribute with a default_value as optional at runtime, which is not documented in any release note, and it sat at the top of the attributes block rather than on the attribute it described. The explicit `optional: false` lines it was meant to justify stay as they are (CC-6). Both occurrences in the repository are removed; a grep for the same claim finds no others. Co-Authored-By: Claude Fable 5 --- base/dcim.yml | 2 -- base/ipam.yml | 2 -- 2 files changed, 4 deletions(-) diff --git a/base/dcim.yml b/base/dcim.yml index faf2d42..74edd0b 100644 --- a/base/dcim.yml +++ b/base/dcim.yml @@ -166,8 +166,6 @@ generics: optional: true description: "A brief description of the interface" order_weight: 1100 - # NOTE: Infrahub 1.11 treats attributes with a default_value as optional at runtime; - # optional: false documents intent. - name: status kind: Dropdown default_value: "active" diff --git a/base/ipam.yml b/base/ipam.yml index b5ab1f3..8e2eb57 100644 --- a/base/ipam.yml +++ b/base/ipam.yml @@ -50,8 +50,6 @@ nodes: uniqueness_constraints: - [ip_namespace, prefix__value] attributes: - # NOTE: Infrahub 1.11 treats attributes with a default_value as optional at runtime; - # optional: false documents intent. - name: status kind: Dropdown default_value: active From d15aaf8d73a98b53378e06620c87b5bcdaae565a Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Wed, 2 Sep 2026 10:38:22 +0200 Subject: [PATCH 59/68] fix: order uniqueness_constraints most selective first (review suggestion) Review threads: base/ipam.yml:51, base/ipam.yml:123 and extensions/cross_connect/cross_connect.yml:26 (BaptisteGi), citing https://docs.infrahub.app/schema/nodes-and-attributes#optimizing-uniqueness-constraints "Order uniqueness constraint elements from most selective (returning fewer matches) to least selective (returning more matches) to optimize database query performance." A prefix value, an IP address and a provider circuit identifier each return far fewer matches than the namespace or the provider they hang off, so they come first. This reverts the ordering criterion used in fc52a80, which ordered the declared constraint to match the namespace-first human_friendly_id instead. Consequence, kept deliberately: because the declared order no longer matches the HFID, Infrahub adds its HFID-derived constraint on top, so the live schema carries two functionally identical constraints on IpamPrefix, IpamIPAddress and DcimCrossConnect. The HFIDs themselves are unchanged (IPAM-07). Packets: IPAM-07, base_ipam consistency note 3. Checklist: CC-4. Co-Authored-By: Claude Fable 5 --- base/ipam.yml | 4 ++-- extensions/cross_connect/cross_connect.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/base/ipam.yml b/base/ipam.yml index 8e2eb57..65c6f70 100644 --- a/base/ipam.yml +++ b/base/ipam.yml @@ -48,7 +48,7 @@ nodes: - prefix__value display_label: prefix__value uniqueness_constraints: - - [ip_namespace, prefix__value] + - [prefix__value, ip_namespace] attributes: - name: status kind: Dropdown @@ -118,7 +118,7 @@ nodes: - address__value display_label: address__value uniqueness_constraints: - - [ip_namespace, address__value] + - [address__value, ip_namespace] attributes: - name: description kind: Text diff --git a/extensions/cross_connect/cross_connect.yml b/extensions/cross_connect/cross_connect.yml index 6956ddf..d767599 100644 --- a/extensions/cross_connect/cross_connect.yml +++ b/extensions/cross_connect/cross_connect.yml @@ -23,7 +23,7 @@ nodes: - provider__name__value display_label: "{{ identifier__value }} (Provider: {{ provider__name__value }})" uniqueness_constraints: - - [provider, identifier__value] + - [identifier__value, provider] attributes: - name: identifier kind: Text From 0e164cc937b49e732ecadd19361f96dc7008c0f4 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Wed, 2 Sep 2026 10:38:56 +0200 Subject: [PATCH 60/68] fix: apply selective-first uniqueness ordering across the schema files (generalizing review suggestion) Generalizes the review thread on base/ipam.yml:51 (BaptisteGi) to every uniqueness_constraints entry in base/ and extensions/: 24 entries reviewed, 1 more changed. IpamCVLAN was flipped to svlan-first in b26063a under the same rejected criterion (match the human_friendly_id). QinQ has few S-VLANs each encapsulating many C-VLANs, so a C-VLAN id returns fewer matches than an S-VLAN does, and value-first also matches its siblings IpamVLAN and IpamSVLAN, which both read [vlan_id__value, vlan_group]. The remaining parent-first entries stay as they are: they scope a child to a parent that is itself numerous (interfaces per device, ports per patch panel, endpoints per circuit, disks per device), where the parent is the more selective side and the child name repeats across parents. Packets: QINQ-02, base_ipam consistency note 3. Checklist: CC-4. Co-Authored-By: Claude Fable 5 --- extensions/qinq/qinq.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/qinq/qinq.yml b/extensions/qinq/qinq.yml index 51ceac3..147dcf6 100644 --- a/extensions/qinq/qinq.yml +++ b/extensions/qinq/qinq.yml @@ -40,7 +40,7 @@ nodes: - vlan_id__value display_label: "{{ svlan__name__value }}-{{ vlan_id__value }}" uniqueness_constraints: - - [svlan, vlan_id__value] + - [vlan_id__value, svlan] attributes: - name: name kind: Text From 70f177c5ee69596369e8f285305da2e87e094e7d Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Wed, 2 Sep 2026 10:39:49 +0200 Subject: [PATCH 61/68] fix: use >- for every description that does not fit on one line (review suggestion) Review thread: extensions/circuit/circuit.yml:106 (BaptisteGi), "In some places we have `>-` for long YAML string, sometime we don't". Rule adopted, which is the one the repository already follows almost everywhere and the one yamllint can back: a description stays on a single line while it fits inside the 120-character limit from .yamllint.yml, and uses the folded block scalar `>-` when it does not. Swept all 44 schema files in base/ and extensions/ plus objects/ and the .metadata.yml files: 496 descriptions, 492 single-line (longest 119 characters, none over the limit), 4 wrapped. The file Baptiste commented on is already correct, and two deviants needed fixing: - base/ipam.yml:17 wrapped as a plain multi-line scalar (implicit folding) instead of >-. - extensions/dwdm/dwdm.yml:122 used the literal block `|`, which kept a newline inside a prose description that has no meaningful line breaks. Checklist: CC-8. Co-Authored-By: Claude Fable 5 --- base/ipam.yml | 5 +++-- extensions/dwdm/dwdm.yml | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/base/ipam.yml b/base/ipam.yml index 65c6f70..003696e 100644 --- a/base/ipam.yml +++ b/base/ipam.yml @@ -14,8 +14,9 @@ generics: - name: VLANGroupScope namespace: Ipam label: VLAN Group Scope - description: Mixin for objects that can scope a VLAN group (e.g. Region, Site). The - reverse relationship is added by extensions/vlan. + description: >- + Mixin for objects that can scope a VLAN group (e.g. Region, Site). The reverse + relationship is added by extensions/vlan. include_in_menu: false - name: PrefixScope diff --git a/extensions/dwdm/dwdm.yml b/extensions/dwdm/dwdm.yml index e290554..c8dcdd3 100644 --- a/extensions/dwdm/dwdm.yml +++ b/extensions/dwdm/dwdm.yml @@ -119,7 +119,7 @@ generics: nodes: - name: OpticalMultiplexer namespace: Dcim - description: | + description: >- An OADM (Optical Add Drop Multiplexer) supporting various WDM (Wavelength Division Multiplexing) technologies. label: Optical Multiplexer From 62358203200580c4a3e4c12262a8b844498edcff Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Wed, 2 Sep 2026 10:40:23 +0200 Subject: [PATCH 62/68] fix(cable): keep DcimCable.label optional while it backs the HFID (review suggestion) Review thread: extensions/cable/cable.yml:221-225 (BaptisteGi), "I think forcing a label on every cable is quite optimistic, especially if it has to be entered manually by someone. I agree on the other hand not having a HFID is quite annoying when playing with the API". 26280ad made the label mandatory to back the new human_friendly_id. The mandatory half is not needed: the HFID validator requires the attribute to be unique, not mandatory (only relationship components of an HFID must be mandatory, per docs.infrahub.app/schema/nodes-and-attributes#human-friendly-identifier-hfid). So the label goes back to optional, keeps unique: true, and the HFID stays. A cable with no label simply has no HFID until someone labels it. Packets: CABLE-02. Checklist: CC-4. Co-Authored-By: Claude Fable 5 --- extensions/cable/cable.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/extensions/cable/cable.yml b/extensions/cable/cable.yml index d0b2e1c..c51b593 100644 --- a/extensions/cable/cable.yml +++ b/extensions/cable/cable.yml @@ -218,10 +218,12 @@ nodes: color: "#111111" optional: true order_weight: 1300 + # Optional so a cable can be recorded before anyone labels it in the field, unique + # so a labelled cable still resolves through the human_friendly_id. - name: label kind: Text unique: true - optional: false + optional: true order_weight: 1000 # As we can't put float in Number "forcing" length in cm - name: length From 168c168f6a9f2686bcdfd58cb96944ce0761063b Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Wed, 2 Sep 2026 10:41:01 +0200 Subject: [PATCH 63/68] fix(ipam): drop the supernet prefix role now that aggregates have their own node (review suggestion) Review thread: base/ipam.yml:89-92 (BaptisteGi), suggestion block deleting the choice, "As discussed we now have a dedicated aggregate extension". extensions/aggregate models an RIR-assigned top-level prefix as IpamAggregate, so representing the same thing as a role on a generic prefix is a second way to say it. No objects file uses role: supernet, so no fixture changes. Swept the other four choice lists in base/ (device status and role, interface status and role, prefix and address status, address role): no other choice value duplicates a node kind shipped by an extension. Packets: IPAM-04 (prefix roles), ext_ipam digest Q2. Checklist: CC-5. Co-Authored-By: Claude Fable 5 --- base/ipam.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/base/ipam.yml b/base/ipam.yml index 003696e..bdd6cbf 100644 --- a/base/ipam.yml +++ b/base/ipam.yml @@ -85,10 +85,6 @@ nodes: label: Customer description: Prefixes assigned to customers. color: "#77DD77" - - name: supernet - label: Supernet - description: Aggregate covering multiple sub-prefixes. - color: "#CDB4DB" - name: backbone label: Backbone description: Core network infrastructure prefixes. From 8a7730c5c2ee38e376f0498ed4723b62b0e5a0e3 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Wed, 2 Sep 2026 10:42:23 +0200 Subject: [PATCH 64/68] docs: regenerate schema reference pages Follows the review fixes in this branch: `uv run invoke docs.generate`, with the three hand-edited extension READMEs (rack, location_minimal, location_site) restored afterwards because the generator overwrites them. Co-Authored-By: Claude Fable 5 --- docs/docs/reference/cable.mdx | 4 ++-- docs/docs/reference/cross_connect.mdx | 6 +++--- docs/docs/reference/dwdm.mdx | 11 +++-------- docs/docs/reference/ipam.mdx | 18 +++++++----------- docs/docs/reference/qinq.mdx | 6 +++--- 5 files changed, 18 insertions(+), 27 deletions(-) diff --git a/docs/docs/reference/cable.mdx b/docs/docs/reference/cable.mdx index f63d832..fc41462 100644 --- a/docs/docs/reference/cable.mdx +++ b/docs/docs/reference/cable.mdx @@ -27,7 +27,7 @@ This schema extension contains a basic Cable model allowing you to connect two e | status | | Dropdown | False | connected | connected, planned | | cable_type | | Dropdown | True | | cat3, cat5, cat5e, cat6, cat6a, cat7, cat7a, cat8, mmf_om1, mmf_om2, mmf_om3, mmf_om4, mmf_om5, smf_os1, smf_os2, dac_passive, dac_active, aoc, coaxial, mrj21_trunk, power, usb | | color | | Dropdown | True | | dark_red, red, pink, rose, fuchsia, purple, dark_purple, indigo, blue, light_blue, cyan, teal, aqua, dark_green, green, light_green, lime, yellow, amber, orange, dark_orange, brown, light_grey, grey, dark_grey, black | -| label | | Text | False | | | +| label | | Text | True | | | | length | | Number | True | | | ## Code @@ -243,7 +243,7 @@ nodes: - name: label kind: Text unique: true - optional: false + optional: true order_weight: 1000 - name: length kind: Number diff --git a/docs/docs/reference/cross_connect.mdx b/docs/docs/reference/cross_connect.mdx index 287b44c..3ef6e93 100644 --- a/docs/docs/reference/cross_connect.mdx +++ b/docs/docs/reference/cross_connect.mdx @@ -18,7 +18,7 @@ This extension contains schema to capture Cross Connect. You can see it as "a ca - **Namespace:** Dcim - **Icon:** streamline:arrow-crossover-right-solid - **Uniqueness Constraints:** - - provider, identifier__value + - identifier__value, provider - **Human Friendly ID:** provider__name__value, identifier__value - **Inherit From:** DcimConnector @@ -57,8 +57,8 @@ nodes: - provider__name__value display_label: '{{ identifier__value }} (Provider: {{ provider__name__value }})' uniqueness_constraints: - - - provider - - identifier__value + - - identifier__value + - provider attributes: - name: identifier kind: Text diff --git a/docs/docs/reference/dwdm.mdx b/docs/docs/reference/dwdm.mdx index 14ae741..60718db 100644 --- a/docs/docs/reference/dwdm.mdx +++ b/docs/docs/reference/dwdm.mdx @@ -15,9 +15,7 @@ This schema extension contains models for OADM (Optical Add Drop Multiplexer) su ### OpticalMultiplexer - **Label:** Optical Multiplexer -- **Description:** An OADM (Optical Add Drop Multiplexer) supporting various WDM -(Wavelength Division Multiplexing) technologies. - +- **Description:** An OADM (Optical Add Drop Multiplexer) supporting various WDM (Wavelength Division Multiplexing) technologies. - **Namespace:** Dcim - **Icon:** mdi:transit-connection-variant - **Human Friendly ID:** name__value @@ -250,11 +248,8 @@ generics: nodes: - name: OpticalMultiplexer namespace: Dcim - description: 'An OADM (Optical Add Drop Multiplexer) supporting various WDM - - (Wavelength Division Multiplexing) technologies. - - ' + description: An OADM (Optical Add Drop Multiplexer) supporting various WDM (Wavelength + Division Multiplexing) technologies. label: Optical Multiplexer icon: mdi:transit-connection-variant include_in_menu: true diff --git a/docs/docs/reference/ipam.mdx b/docs/docs/reference/ipam.mdx index 462bea8..2faab19 100644 --- a/docs/docs/reference/ipam.mdx +++ b/docs/docs/reference/ipam.mdx @@ -17,7 +17,7 @@ Basic IPAM schema to capture IP addresses, subnets, and related information. - **Namespace:** Ipam - **Icon:** mdi:ip-network - **Uniqueness Constraints:** - - ip_namespace, prefix__value + - prefix__value, ip_namespace - **Human Friendly ID:** ip_namespace__name__value, prefix__value - **Inherit From:** BuiltinIPPrefix @@ -27,7 +27,7 @@ Basic IPAM schema to capture IP addresses, subnets, and related information. | ---- | ----------- | ---- | -------- | ------------- | ------- | | status | | Dropdown | False | active | active, reserved, deprecated | | description | | Text | True | | | -| role | | Dropdown | True | | management, link, customer, supernet, backbone | +| role | | Dropdown | True | | management, link, customer, backbone | #### Relationships @@ -42,7 +42,7 @@ Basic IPAM schema to capture IP addresses, subnets, and related information. - **Namespace:** Ipam - **Icon:** mdi:ip - **Uniqueness Constraints:** - - ip_namespace, address__value + - address__value, ip_namespace - **Human Friendly ID:** ip_namespace__name__value, address__value - **Inherit From:** BuiltinIPAddress @@ -122,8 +122,8 @@ nodes: - prefix__value display_label: prefix__value uniqueness_constraints: - - - ip_namespace - - prefix__value + - - prefix__value + - ip_namespace attributes: - name: status kind: Dropdown @@ -159,10 +159,6 @@ nodes: label: Customer description: Prefixes assigned to customers. color: '#77DD77' - - name: supernet - label: Supernet - description: Aggregate covering multiple sub-prefixes. - color: '#CDB4DB' - name: backbone label: Backbone description: Core network infrastructure prefixes. @@ -192,8 +188,8 @@ nodes: - address__value display_label: address__value uniqueness_constraints: - - - ip_namespace - - address__value + - - address__value + - ip_namespace attributes: - name: description kind: Text diff --git a/docs/docs/reference/qinq.mdx b/docs/docs/reference/qinq.mdx index bd15f53..9d951ac 100644 --- a/docs/docs/reference/qinq.mdx +++ b/docs/docs/reference/qinq.mdx @@ -33,7 +33,7 @@ This schema extension adds the Service VLAN and Customer VLAN nodes needed to mo - **Description:** A VLAN assigned to customer traffic, encapsulated within an S-VLAN. - **Namespace:** Ipam - **Uniqueness Constraints:** - - svlan, vlan_id__value + - vlan_id__value, svlan - **Human Friendly ID:** svlan__name__value, vlan_id__value - **Inherit From:** IpamGenericVLAN @@ -86,8 +86,8 @@ nodes: - vlan_id__value display_label: '{{ svlan__name__value }}-{{ vlan_id__value }}' uniqueness_constraints: - - - svlan - - vlan_id__value + - - vlan_id__value + - svlan attributes: - name: name kind: Text From 0b690f733d51c02248dccf9f41a3e68c7790aee8 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Wed, 2 Sep 2026 12:34:30 +0200 Subject: [PATCH 65/68] feat(device_module): restore a status on modules Packet MOD-07 flagged that v2's DcimGenericModule lost the status the v1 extension carried, and that with module_bay mandatory there is no way to record a module that has failed other than deleting the object. Baptiste's answer: "Indeed, could be nice having a status field". Restores status on DcimGenericModule, following the conventions: - kind Dropdown, optional written explicitly, mandatory with default_value active (CC-6) - choices snake_case with a label, a description and a color; colors are base-palette values, taken verbatim from DcimDevice.status in base/dcim.yml where the state matches (provisioning #f0ad4e, active #00d25b, maintenance #ff9800) and from the same palette for the two new states (#e04040, #6c757d) (CC-5) - order_weight 1200, the base scheme's slot for status (CC-9) Choice set, against the v1 baseline (extensions/modules/modules.yml on main: provisioning, active, maintenance, disabled, outage): the first three are kept as-is. v1's disabled and outage are replaced by failed and rma, which is the case the packet was actually about: a module that is still recorded against its last known bay while it is out of service or away for replacement. deprecated is deliberately not included, as end-of-life belongs to the module type rather than to an installed instance. Co-Authored-By: Claude Fable 5 --- extensions/device_module/device_module.yml | 27 ++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/extensions/device_module/device_module.yml b/extensions/device_module/device_module.yml index c6e15e5..06e8073 100644 --- a/extensions/device_module/device_module.yml +++ b/extensions/device_module/device_module.yml @@ -39,6 +39,33 @@ generics: kind: Text optional: true order_weight: 1100 + - name: status + kind: Dropdown + default_value: active + choices: + - name: provisioning + label: Provisioning + description: "Module is being installed and provisioned." + color: "#f0ad4e" + - name: active + label: Active + description: "Module is installed and operational." + color: "#00d25b" + - name: maintenance + label: Maintenance + description: "Module is under maintenance." + color: "#ff9800" + - name: failed + label: Failed + description: "Module is still installed but is not operational." + color: "#e04040" + - name: rma + label: RMA + description: "Module has failed and is being returned to the manufacturer." + color: "#6c757d" + optional: false + description: "Operational status of the module." + order_weight: 1200 relationships: - name: module_bay peer: DcimModuleBay From edbcebd242fbf0445d55dad88c257f3e17e2f827 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Wed, 2 Sep 2026 12:35:16 +0200 Subject: [PATCH 66/68] refactor(users): remove the account model pending a field-driven design Packet USER-01 asked what UserAccount is for, given that Infrahub already ships builtin accounts and groups: the extension models device login credentials (password, ssh_key, mfa_enabled, a permissions dropdown) under a name that reads like Infrahub's own user management, and nothing in the library consumes it. Baptiste's answer: "I agree it's confusing, perhaps we could just remove it and provide a new implementation when someone face it on the field (would need to try if reusing builtin account/group is doable/wanted)". Scope executed: the whole extensions/users extension, not UserAccount alone. UserGroup exists only to group accounts (its idle_timeout and permissions describe an account's session on a device), and the OrganizationGeneric.accounts extension block has UserAccount as its peer, so neither has a purpose once the account model is gone. Removing UserAccount alone would leave a group node grouping nothing and a dangling extension block. Nothing else references the two kinds: base/, extensions/ and experimental/ are clean, so there is no cross-extension breakage and no experimental extension left pointing at a missing peer. Removed: - extensions/users/users.yml and its generated README - the extensions/users entry in .metadata.yml - objects/extensions/users/users.yml (its mock data) The generated docs page and home page listing are regenerated separately. Co-Authored-By: Claude Fable 5 --- .metadata.yml | 5 -- extensions/users/README.md | 3 - extensions/users/users.yml | 120 ----------------------------- objects/extensions/users/users.yml | 70 ----------------- 4 files changed, 198 deletions(-) delete mode 100644 extensions/users/README.md delete mode 100644 extensions/users/users.yml delete mode 100644 objects/extensions/users/users.yml diff --git a/.metadata.yml b/.metadata.yml index daed45a..1f289a5 100644 --- a/.metadata.yml +++ b/.metadata.yml @@ -430,11 +430,6 @@ extensions/tenancy: `tenancy.yml` for an example of how to extend tenancy onto optional extension nodes such as `DcimCircuit`. name: Tenancy -extensions/users: - dependencies: - - base - description: This schema extension contains models for account management. - name: Users extensions/vlan: dependencies: - base diff --git a/extensions/users/README.md b/extensions/users/README.md deleted file mode 100644 index ccecd1f..0000000 --- a/extensions/users/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# users - -Please refer to the [reference page](https://docs.infrahub.app/schema-library/reference/users) for the corresponding documentation. diff --git a/extensions/users/users.yml b/extensions/users/users.yml deleted file mode 100644 index 1f40f41..0000000 --- a/extensions/users/users.yml +++ /dev/null @@ -1,120 +0,0 @@ ---- -# yaml-language-server: $schema=https://schema.infrahub.app/infrahub/schema/latest.json -# --------------------------------------------------------------------------- -# This schema is a starting point for building with Infrahub, not a finished production model. -# Adapting it for your environment typically requires architectural review, see -# docs.infrahub.app, or reach out to OpsMill for help. -# --------------------------------------------------------------------------- -version: "1.0" - -nodes: - - name: Group - namespace: User - description: "User Group" - label: "User Groups" - icon: "iconoir:group" - include_in_menu: true - human_friendly_id: - - "name__value" - order_by: - - name__value - display_label: name__value - attributes: - - name: name - kind: Text - unique: true - optional: false - order_weight: 1000 - - name: description - kind: Text - optional: true - order_weight: 1100 - - name: idle_timeout - kind: Number - label: Idle Timeout (s) - optional: false - order_weight: 1300 - - name: permissions - kind: Dropdown - choices: - - name: admin - label: Admin - description: "All rights on device." - color: "#E6E6FA" # lavender - - name: operator - label: Operator - description: "Operator right on configuration." - color: "#E6E6FA" # lavender - - name: read_only - label: Read Only - description: "Read only right on configuration." - color: "#E6E6FA" # lavender - optional: false - order_weight: 1200 - - - name: Account - namespace: User - description: "User login and authentication" - label: "User Account" - icon: "mdi:account-key" - include_in_menu: true - human_friendly_id: - - "name__value" - order_by: - - name__value - display_label: name__value - attributes: - - name: name - kind: Text - label: Username - unique: true - optional: false - description: "The login username" - order_weight: 1000 - - name: full_name - kind: Text - optional: true - description: "Full name of the account" - order_weight: 1100 - - name: ssh_key - kind: Password - optional: true - description: "SSH key for secure access" - order_weight: 1300 - - name: password - kind: Password - optional: true - description: "Password for login (alternative to SSH key)" - order_weight: 1400 - - name: mfa_enabled - kind: Boolean - default_value: false - optional: false - description: "Whether multi-factor authentication is enabled" - order_weight: 1500 - relationships: - - name: user_group - peer: UserGroup - kind: Attribute - cardinality: one - optional: false - order_weight: 1200 - - name: organization - peer: OrganizationGeneric - kind: Parent - cardinality: one - optional: false - order_weight: 900 - -extensions: - nodes: - # Organization Extensions - - kind: OrganizationGeneric - relationships: - - name: accounts - peer: UserAccount - kind: Component - cardinality: many - optional: true - description: "List of Accounts under this organization" - order_weight: 1600 diff --git a/objects/extensions/users/users.yml b/objects/extensions/users/users.yml deleted file mode 100644 index 2a08d4d..0000000 --- a/objects/extensions/users/users.yml +++ /dev/null @@ -1,70 +0,0 @@ -# --------------------------------------------------------------------------- -# Mock data for extensions/users. -# Depends on: base only (OrganizationProvider, a concrete OrganizationGeneric -# kind defined in base/organization.yml). -# -# UserGroup is created before UserAccount because UserAccount.user_group -# references it (cardinality one, concrete peer -> plain scalar HFID string). -# -# UserAccount.organization is cardinality one but its peer (OrganizationGeneric) -# is a Generic, so it must use a nested kind+data block where data is a single -# mapping (not a list) repeating all of the target's own mandatory fields -# (name). All three accounts point at the same organization, so this upserts -# the same OrganizationProvider record each time instead of duplicating it. -# -# ssh_key/password are obviously-fake placeholder values, not real secrets. -# --------------------------------------------------------------------------- ---- -apiVersion: infrahub.app/v1 -kind: Object -spec: - kind: UserGroup - data: - - name: Administrators - description: Full administrative access to all managed devices. - idle_timeout: 900 - permissions: admin - - name: Operators - description: Day-to-day operational access for configuration changes. - idle_timeout: 1800 - permissions: operator - - name: Auditors - description: Read-only access for compliance and auditing. - idle_timeout: 3600 - permissions: read_only - ---- -apiVersion: infrahub.app/v1 -kind: Object -spec: - kind: UserAccount - data: - - name: jdoe - full_name: Jane Doe - password: "CHANGEME-placeholder-1!" - mfa_enabled: true - user_group: Administrators - organization: - kind: OrganizationProvider - data: - name: Acme Networks - - - name: bsmith - full_name: Bob Smith - ssh_key: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFAKEPLACEHOLDERKEYDONOTUSE bsmith@example.com" - mfa_enabled: false - user_group: Operators - organization: - kind: OrganizationProvider - data: - name: Acme Networks - - - name: agarcia - full_name: Ana Garcia - password: "CHANGEME-placeholder-2!" - mfa_enabled: true - user_group: Auditors - organization: - kind: OrganizationProvider - data: - name: Acme Networks From 5140d2450f828b29cfd4cb5866190d3915a6c4f4 Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Wed, 2 Sep 2026 12:38:03 +0200 Subject: [PATCH 67/68] docs: regenerate schema reference pages Runs `invoke docs.generate` for the two schema changes in this series: - device_module.mdx picks up the new DcimGenericModule.status attribute - home.mdx drops the Users row, following the removal of the extensions/users entry from .metadata.yml The generator never prunes, so docs/docs/reference/users.mdx is deleted by hand. The hand-written notes in the rack, location_minimal and location_site READMEs are restored: docs.generate overwrites every extension README with the three-line pointer template, and those three carry exclusivity notes that CC-1 requires. Co-Authored-By: Claude Fable 5 --- docs/docs/home.mdx | 1 - docs/docs/reference/device_module.mdx | 28 ++++ docs/docs/reference/users.mdx | 185 -------------------------- 3 files changed, 28 insertions(+), 186 deletions(-) delete mode 100644 docs/docs/reference/users.mdx diff --git a/docs/docs/home.mdx b/docs/docs/home.mdx index 9bf3cdf..0f060e5 100644 --- a/docs/docs/home.mdx +++ b/docs/docs/home.mdx @@ -145,7 +145,6 @@ This list provides an overview of the schemas available in this repository. Each | **[SFP](./reference/sfp.mdx)** | This schema extension gives you all the models you need to document Small Form-factor Pluggable (SFP). You can either plug it into an interface or attach it to a location (e.g. it's a spare SFP stored in a rack). Improvements: - As of now there is no verification with type / form factor / protocol / distance ... - You could plug any SFP into any equipment interface (e.g. a virtual interface ...) - You could link a SFP to an interface AND a location ... | | **[SNMP](./reference/snmp.mdx)** | This schema extension contains models for SNMP Communities and SNMP Clients. A community links to the devices it is configured on; any further wiring, to a tenant for instance, is left to you. | | **[Tenancy](./reference/tenancy.mdx)** | This schema extension introduces a Tenant node that can own devices, IP prefixes/addresses, and hosting locations. See the comment at the bottom of `tenancy.yml` for an example of how to extend tenancy onto optional extension nodes such as `DcimCircuit`. | -| **[Users](./reference/users.mdx)** | This schema extension contains models for account management. | | **[VLAN](./reference/vlan.mdx)** | This schema extension contains models to support VLANs in you network. | | **[VRF](./reference/vrf.mdx)** | This schema extension contains models to support VRF in your network. | | **[VRRP](./reference/vrrp.mdx)** | This schema extension contains models for VRRP. | diff --git a/docs/docs/reference/device_module.mdx b/docs/docs/reference/device_module.mdx index ce1ca16..8c00ec8 100644 --- a/docs/docs/reference/device_module.mdx +++ b/docs/docs/reference/device_module.mdx @@ -85,6 +85,7 @@ NOTE: This extension ships a standard Module/ModuleType node pair ready to use, | computed_name | Name computed from the module bay; concrete module kinds may refine it. | Text | False | | | | serial_number | Serial number of the module, if known. | Text | True | | | | description | | Text | True | | | +| status | Operational status of the module. | Dropdown | False | active | provisioning, active, maintenance, failed, rma | #### Relationships @@ -169,6 +170,33 @@ generics: kind: Text optional: true order_weight: 1100 + - name: status + kind: Dropdown + default_value: active + choices: + - name: provisioning + label: Provisioning + description: Module is being installed and provisioned. + color: '#f0ad4e' + - name: active + label: Active + description: Module is installed and operational. + color: '#00d25b' + - name: maintenance + label: Maintenance + description: Module is under maintenance. + color: '#ff9800' + - name: failed + label: Failed + description: Module is still installed but is not operational. + color: '#e04040' + - name: rma + label: RMA + description: Module has failed and is being returned to the manufacturer. + color: '#6c757d' + optional: false + description: Operational status of the module. + order_weight: 1200 relationships: - name: module_bay peer: DcimModuleBay diff --git a/docs/docs/reference/users.mdx b/docs/docs/reference/users.mdx deleted file mode 100644 index c6cea3e..0000000 --- a/docs/docs/reference/users.mdx +++ /dev/null @@ -1,185 +0,0 @@ ---- -title: Users ---- - -This schema extension contains models for account management. - -## Details - -- **Dependencies:** - - [base](dcim) - -## Nodes - -### Group - -- **Label:** User Groups -- **Description:** User Group -- **Namespace:** User -- **Icon:** iconoir:group -- **Human Friendly ID:** name__value - -#### Attributes - -| name | description | kind | optional | default_value | choices | -| ---- | ----------- | ---- | -------- | ------------- | ------- | -| name | | Text | False | | | -| description | | Text | True | | | -| idle_timeout | | Number | False | | | -| permissions | | Dropdown | False | | admin, operator, read_only | - -### Account - -- **Label:** User Account -- **Description:** User login and authentication -- **Namespace:** User -- **Icon:** mdi:account-key -- **Human Friendly ID:** name__value - -#### Attributes - -| name | description | kind | optional | default_value | choices | -| ---- | ----------- | ---- | -------- | ------------- | ------- | -| name | The login username | Text | False | | | -| full_name | Full name of the account | Text | True | | | -| ssh_key | SSH key for secure access | Password | True | | | -| password | Password for login (alternative to SSH key) | Password | True | | | -| mfa_enabled | Whether multi-factor authentication is enabled | Boolean | False | False | | - -#### Relationships - -| name | peer | optional | cardinality | kind | -| ---- | ---- | -------- | ----------- | ---- | -| user_group | UserGroup | False | one | Attribute | -| organization | OrganizationGeneric | False | one | Parent | - -## Extensions - -:::note - -In this context "extensions" refer to modifications or additions to the existing schema, such as adding new attributes, relationships, or other schema elements. - -::: - -### OrganizationGeneric - -#### Relationships - -| name | peer | optional | cardinality | kind | -| ---- | ---- | -------- | ----------- | ---- | -| accounts | UserAccount | True | many | Component | - -## Code - -```yaml -version: '1.0' -nodes: -- name: Group - namespace: User - description: User Group - label: User Groups - icon: iconoir:group - include_in_menu: true - human_friendly_id: - - name__value - order_by: - - name__value - display_label: name__value - attributes: - - name: name - kind: Text - unique: true - optional: false - order_weight: 1000 - - name: description - kind: Text - optional: true - order_weight: 1100 - - name: idle_timeout - kind: Number - label: Idle Timeout (s) - optional: false - order_weight: 1300 - - name: permissions - kind: Dropdown - choices: - - name: admin - label: Admin - description: All rights on device. - color: '#E6E6FA' - - name: operator - label: Operator - description: Operator right on configuration. - color: '#E6E6FA' - - name: read_only - label: Read Only - description: Read only right on configuration. - color: '#E6E6FA' - optional: false - order_weight: 1200 -- name: Account - namespace: User - description: User login and authentication - label: User Account - icon: mdi:account-key - include_in_menu: true - human_friendly_id: - - name__value - order_by: - - name__value - display_label: name__value - attributes: - - name: name - kind: Text - label: Username - unique: true - optional: false - description: The login username - order_weight: 1000 - - name: full_name - kind: Text - optional: true - description: Full name of the account - order_weight: 1100 - - name: ssh_key - kind: Password - optional: true - description: SSH key for secure access - order_weight: 1300 - - name: password - kind: Password - optional: true - description: Password for login (alternative to SSH key) - order_weight: 1400 - - name: mfa_enabled - kind: Boolean - default_value: false - optional: false - description: Whether multi-factor authentication is enabled - order_weight: 1500 - relationships: - - name: user_group - peer: UserGroup - kind: Attribute - cardinality: one - optional: false - order_weight: 1200 - - name: organization - peer: OrganizationGeneric - kind: Parent - cardinality: one - optional: false - order_weight: 900 -extensions: - nodes: - - kind: OrganizationGeneric - relationships: - - name: accounts - peer: UserAccount - kind: Component - cardinality: many - optional: true - description: List of Accounts under this organization - order_weight: 1600 - -``` \ No newline at end of file From 233a7270441b572ba4e2ef1030b3a654f4a9e1fa Mon Sep 17 00:00:00 2001 From: Matej Lanca Date: Wed, 2 Sep 2026 12:47:56 +0200 Subject: [PATCH 68/68] fix(objects): move the Acme Networks organization into the base mock data Fallout from removing extensions/users, caught by a full object load: objects/extensions/users/users.yml was the only file creating the OrganizationProvider "Acme Networks", as a side effect of upserting the organization its three accounts pointed at. objects/extensions/routing_bgp/routing_bgp.yml uses that record for AS 65000, our own backbone AS, and its header comment already documents it as coming from base. Without it the load fails with "Unable to find the node Acme Networks / OrganizationGeneric in the database", and objects/extensions/peering_ixp fails after it because it needs the AS that never got created. Adds the record to objects/base/01_organization.yml, where routing_bgp already says it lives. OrganizationProvider is the kind extensions/users used and the only concrete OrganizationGeneric kind base ships, so base mock data cannot express it any other way. Co-Authored-By: Claude Fable 5 --- objects/base/01_organization.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/objects/base/01_organization.yml b/objects/base/01_organization.yml index f5aa5c6..26bcb62 100644 --- a/objects/base/01_organization.yml +++ b/objects/base/01_organization.yml @@ -21,6 +21,8 @@ kind: Object spec: kind: OrganizationProvider data: + - name: Acme Networks + description: Acme Networks -- the operator this mock data belongs to. - name: Lumen description: Lumen Technologies -- transit and dark fiber provider. - name: Colt