netbox icon indicating copy to clipboard operation
netbox copied to clipboard

Empty search result for interfaces, power-ports, power-outlets

Open simonzsay opened this issue 1 month ago • 10 comments

NetBox Edition

NetBox Community

NetBox Version

v4.4.1-Docker-3.4.0

Python Version

3.12

Steps to Reproduce

  1. Create device (e.g. Server1) using device-type template. Template has pre-defined interfaces, device-bay for MBD and module-bays for PSU1 and PSU2.
  2. Add MBD from device-type template, add PSU1 and PSU2 from module-type template.
  3. Build query using custom link or in browser, aka: /dcim/interfaces/?site_id=35&location_id=50&rack_id=82&device_role=node&device_role=singlenode /dcim/power-outlets/?site_id=11&location_id=7&rack_id=5&connected=false /dcim/power-ports/?site_id=11&location_id=7&rack_id=5
  4. To fix search for existing devices and newly created Server1 run commands:
docker compose exec netbox python manage.py nbshell

from dcim.models import Device
for dev in Device.objects.all(): dev.save()

or i can edit device from UI and save it without changes, which i guess will make dev.save() as well, but from UI.

  • Seems issue appeared after upgrade from netbox_version: "v4.3-3.3.0" to netbox_version: "v4.4.1-3.4.0".
  • Seems old records added before upgrade appeared in search correctly.

Expected Behavior

I expect to see records in "power-ports, power-outlets, interfaces" tabs without filters and especially according to filters ive set - "site,location,rack, etc..."

Observed Behavior

Search result is empty until the moment i re-save device (or it`s power-port\interface btw) or make nbshell commands.

simonzsay avatar Nov 03 '25 11:11 simonzsay

Thanks @simonzsay , it sounds like something may have changed the behavior of reindexing SearchIndex objects after populating a device with templated components.

To properly reproduce this, could you please provide specifics of how your device type template is set up so that someone working on this can be sure to catch all the details?

Also, could you please try running manage.py reindex and see if that causes the search results to be refreshed properly? (That would confirm the theory above.)

bctiemann avatar Nov 03 '25 20:11 bctiemann

Thanks @simonzsay , it sounds like something may have changed the behavior of reindexing SearchIndex objects after populating a device with templated components.

To properly reproduce this, could you please provide specifics of how your device type template is set up so that someone working on this can be sure to catch all the details?

Also, could you please try running manage.py reindex and see if that causes the search results to be refreshed properly? (That would confirm the theory above.)

Dear @bctiemann thank you for very fast reply. I`ll provide more details as requested. Please give me some time)

simonzsay avatar Nov 04 '25 05:11 simonzsay

@bctiemann First of all manage.py reindex result. Unfortunately, didn`t help me to fix problem.

docker compose exec -T netbox bash -lc 'time -p python manage.py reindex'
🧬 loaded config '/etc/netbox/config/configuration.py'
🧬 loaded config '/etc/netbox/config/extra.py'
🧬 loaded config '/etc/netbox/config/logging.py'
🧬 loaded config '/etc/netbox/config/plugins.py'
Reindexing 90 models.
Clearing cached values... 73205 entries deleted.
Indexing models
  core.datasource... 3 entries cached.
  core.datafile... 20 entries cached.
  circuits.circuit... No objects found.
  circuits.circuitgroup... No objects found.
  circuits.circuittermination... No objects found.
  circuits.circuittype... 6 entries cached.
  circuits.provider... No objects found.
  circuits.provideraccount... No objects found.
  circuits.providernetwork... No objects found.
  circuits.virtualcircuit... No objects found.
  circuits.virtualcircuittermination... No objects found.
  circuits.virtualcircuittype... No objects found.
  dcim.cable... 225 entries cached.
  dcim.consoleport... 646 entries cached.
  dcim.consoleserverport... 228 entries cached.
  dcim.device... 8318 entries cached.
  dcim.devicebay... 1269 entries cached.
  dcim.devicerole... 81 entries cached.
  dcim.devicetype... 938 entries cached.
  dcim.frontport... 6109 entries cached.
  dcim.macaddress... No objects found.
  dcim.interface... 25640 entries cached.
  dcim.inventoryitem... 3 entries cached.
  dcim.location... 251 entries cached.
  dcim.manufacturer... 67 entries cached.
  dcim.module... 318 entries cached.
  dcim.modulebay... 8556 entries cached.
  dcim.moduletypeprofile... 8 entries cached.
  dcim.moduletype... 459 entries cached.
  dcim.platform... 111 entries cached.
  dcim.powerfeed... 720 entries cached.
  dcim.poweroutlet... 3802 entries cached.
  dcim.powerpanel... 72 entries cached.
  dcim.powerport... 5399 entries cached.
  dcim.racktype... 50 entries cached.
  dcim.rack... 579 entries cached.
  dcim.rackreservation... 27 entries cached.
  dcim.rackrole... 6 entries cached.
  dcim.rearport... 6977 entries cached.
  dcim.region... 848 entries cached.
  dcim.site... 427 entries cached.
  dcim.sitegroup... No objects found.
  dcim.virtualchassis... No objects found.
  dcim.virtualdevicecontext... No objects found.
  ipam.aggregate... No objects found.
  ipam.asn... No objects found.
  ipam.asnrange... No objects found.
  ipam.fhrpgroup... No objects found.
  ipam.ipaddress... 243 entries cached.
  ipam.iprange... 3 entries cached.
  ipam.prefix... 26 entries cached.
  ipam.rir... No objects found.
  ipam.role... No objects found.
  ipam.routetarget... No objects found.
  ipam.service... No objects found.
  ipam.servicetemplate... No objects found.
  ipam.vlan... 50 entries cached.
  ipam.vlangroup... No objects found.
  ipam.vlantranslationpolicy... No objects found.
  ipam.vlantranslationrule... No objects found.
  ipam.vrf... No objects found.
  extras.configcontextprofile... No objects found.
  extras.customfield... 102 entries cached.
  extras.imageattachment... 44 entries cached.
  extras.journalentry... No objects found.
  extras.tag... 6 entries cached.
  extras.webhook... No objects found.
  tenancy.contact... 154 entries cached.
  tenancy.contactgroup... 44 entries cached.
  tenancy.contactrole... 13 entries cached.
  tenancy.tenant... 338 entries cached.
  tenancy.tenantgroup... 9 entries cached.
  virtualization.cluster... No objects found.
  virtualization.clustergroup... No objects found.
  virtualization.clustertype... No objects found.
  virtualization.virtualmachine... No objects found.
  virtualization.vminterface... No objects found.
  virtualization.virtualdisk... No objects found.
  vpn.tunnel... No objects found.
  vpn.tunnelgroup... No objects found.
  vpn.ikeproposal... No objects found.
  vpn.ikepolicy... No objects found.
  vpn.ipsecproposal... No objects found.
  vpn.ipsecpolicy... No objects found.
  vpn.ipsecprofile... No objects found.
  vpn.l2vpn... No objects found.
  wireless.wirelesslan... 10 entries cached.
  wireless.wirelesslangroup... No objects found.
  wireless.wirelesslink... No objects found.
  netbox_custom_objects.customobjecttype... No objects found.
Completed. Total entries: 73205
real 67.76
user 44.52
sys 2.51

After this command goto /dcim/power-ports/?site_id=35&location_id=50&rack_id=82 and expect to see all power ports in rack, but search is empty.

Image

And now about specifics. I will try to explain methods how i tested\reproduce the issue. Let`s say i work with the following devices: PDU, Multinode server.

PDU device-type has:

  • Power port
  • Outlets
  • Network Interface
  • Console port -> Take a look at screenshot with PDU please.
Image

Miltinode server device-type has:

  • 4 device bays for Nodes (aka Motherboards)
  • 2 module bays for PSUs (PSU1 & PSU2) This means that Netbox also has:
  • Motherboard device type for Miltinode server device-bays
  • PSU module-type for Miltinode server module-bays -> Take a look at screenshot with Multinode server please.
Image

-> Take a look at screenshot with Motherboard for Multinode server please.

Image

-> Take a look at screenshot with PSU for Multinode server please.

In this case i don`t use prefixes aka {module} in types.

How we add device\module types and real devices:

  • via custom script
  • manually via UI
  • via ansible playbook

Methods we use depend on situation. Smth tells that testing via UI here will be the most correct way.

I created new PDU from template (same as above) via UI and run /dcim/power-outlets/?site_id=22&location_id=70&rack_id=13&connected=false

I created new device-type for PDU (clone as above) via UI and crated new PDU from new template and run /dcim/power-outlets/?site_id=22&location_id=70&rack_id=13&connected=false

Both times - empty search result. The problem is general, with all types of devices (not only with PDU and some servers).

Please let me know if i should add more info in future comments.

simonzsay avatar Nov 04 '25 09:11 simonzsay

@simonzsay, thanks for the extra details. The first thing I want to do is make sure that we're all on the same page with respect to concepts here. In particular, the issue indicates this is a bug with search, however that is a very vague term in NetBox context. There are a couple of things at play:

  • global search (/search/), which is available as the very top input field in pretty much every page in NetBox.

  • list view "quick search", the left-most input field above tables in object list views, immediately to the left of of the Saved Filters field. This is actually implemented as a filter (described next) and is usually defined to search pertinent text fields on objects (or sometimes related objects) in the table immediately below the field. This often searches against the name field, for instance, and almost always uses the "contains" lookup, which finds sub-strings within the text fields to be searched.

  • filters, which are found on the "Filters" tab in object list views, but not (usually?) found on child list views (the Interfaces tab of a Device). These allow picking fields to filter the object list against, including things like sites, locations, racks, device role, etc.

While the first two items (global search and quick search) above provide some amount of "free text search", while filters generally provide very specific filtering, currently using pretty strict equality (at least from the filter forms, you can do not exact lookups by manually modifying the URL yourself). I'm trying to be precise here, because each of these things works differently, so it's very important to make sure we're talking about the same things.

Image

I think the early history of this issue confused these items. For instance, the title of the issue just says "empty search results", which clearly led Brian to believe this was a global search issue, as evidenced by his suggestion to run ./manage.py reindex and why it didn't work for you. Then, the steps to reproduce provide URL fragments which are clearly attempting to invoke filters. The provided URL fragments are also referencing other object IDs, which are incredibly NetBox instance specific. You're site_id of 35 is almost surely not the same site_id in my instance. You can see how this is very confusing to someone trying to triage a bug report like this with only the information provided.

All of this to say, I am not able to reproduce your issue. In order for us to make any further progress on this bug report we need exhaustive and explicit and detailed steps to reproduce the bug. That doesn't mean screenshots. It doesn't mean summaries. It doesn't mean abbreviations or vague terms. For instance, "device-type template" is not a thing and using that term leaves the maintainers that have to try to understand the bug guessing as to what you are trying to communicate. For a moment, I wondered if you meant the Device Type Library repo.

When a step, in your "steps to reproduce", says "create a ", you need to include all of the non-default values you used and in what fields you used them. When a steps says "add MDB", you need to specify exactly what "MDB" is (it took me 5+ minutes of reading to figure out you meant "motherboard"), what steps you took to create it, and exactly how you used it. Every step needs to include all of the details we need to reproduce your exact issue, at a minimum.

jnovinger avatar Nov 20 '25 21:11 jnovinger

Dear @jnovinger, thanks, i've got you. Also, thanks for the instructions how to report an issues i hope i can improve my language and terms next time.

Regarding the current case, i will try to construct discussed minimum details next week. Apologize that i can`t do it faster.

simonzsay avatar Nov 21 '25 13:11 simonzsay

Dear @jnovinger my comments below.

  1. You are right, the issue title is too broad, and my use of the word "search" was also imprecise. I can reproduce the problem using filtering via URL query parameters. For example: https://example.nb.net/dcim/power-outlets/?site_id=74&location_id=89&rack_id=179&connected=false

At the very beginning, months ago I went to the "Filters" tab, selected filters via the UI, and watched how NetBox constructed the URL, just to understand the logic. So this issue is specifically about Filters (URL-based filtering), not global search or the list view quick search.

  1. Also, the issue title has words "interfaces, power-ports, power-outlets", but for testing purposes i would like to concentrate only at power-ports. This is the shortest way for making tests and i hope it will save your time a bit. I think (maybe i am wrong) all problems have one nature and if i can fix an issue with power-port i can fix other sources same way later. So, everything below about testing power-port filters.

  2. This weekend i had to update Netbox to the new version and install "custom objects plugin". Changes in docker containers versions (this is just text from playbooks, not anything Netbox related):

From: netbox_version: "v4.4.1-3.4.0" postgres_version: "17-alpine" netbox_custom_objects: null

Changed to: netbox_version: "v4.4.6-3.4.2" postgres_version: "17-alpine" netbox_custom_objects: "v0.4.1"

  1. Steps i do to reproduce the problem
  • Everywhere below {address} is my url inside our company. For example, "dev.nb.int.domain.net"
  • I show resulting API representation after creating them via UI

Inside extra.py ive added the following configs:

FIELD_CHOICES = {
    'dcim.Site.status': (
        ('planned',  'Planned',  'blue'),
        ('activated',  'Activated',  'green'),
        ('staging',   'Staging',   'yellow'),
        ('decommissioned',     'Decommissioned', 'orange'),
        ('retired',   'Retired',   'red'),
    ),
    'dcim.Location.status': (
        ('planned',  'Planned',  'blue'),
        ('activated',  'Activated',  'green'),
        ('staging',   'Staging',   'yellow'),
        ('decommissioned',     'Decommissioned', 'orange'),
        ('retired',   'Retired',   'red'),
    ),
    'dcim.Device.status': (
        ('planned',  'Planned',  'black'),
        ('reserved',  'Reserved',  'blue'),
        ('available',   'Available',   'yellow'),
        ('in_use',     'In use', 'green'),
        ('broken',   'Broken',   'red'),
        ('decommissioned', 'Decommissioned', 'orange')
    ),
    'dcim.Module.status': (
        ('planned',  'Planned',  'black'),
        ('reserved',  'Reserved',  'blue'),
        ('available',   'Available',   'yellow'),
        ('in_use',     'In use', 'green'),
        ('broken',   'Broken',   'red'),
        ('decommissioned', 'Decommissioned', 'orange')
    ),
    'dcim.Rack.status': (
        ('planned',  'Planned',  'black'),
        ('reserved',  'Reserved',  'blue'),
        ('available',   'Available',   'yellow'),
        ('in_use',     'In use', 'green'),
        ('broken',   'Broken',   'red'),
        ('decommissioned', 'Decommissioned', 'orange')
    ),
    'dcim.PowerFeed.status+': (
        ('virtual', 'Virtual', 'orange'),
    )
}

CUSTOM_VALIDATORS = {
    "dcim.site": [
        {
        "region":
            { 
            "required": True, 
            },
        "tenant":
            { 
            "required": True, 
            },
        "time_zone":
            { 
            "required": True, 
            },
        "physical_address":
            { 
            "required": True, 
            },
        "shipping_address":
            { 
            "required": True, 
            },
        "facility":
            { 
            "required": True, 
            },
        },
    ],

    "dcim.location": [
        {
        "tenant":
            { 
            "required": True, 
            },
        },
    ],

    "dcim.rack": [
        {
        "location":
            { 
            "required": True, 
            },
        "role":
            { 
            "required": True, 
            },
        "tenant":
            { 
            "required": True, 
            },
        },
    ],

    "dcim.rackreservation": [
        {
        "tenant":
            { 
            "required": True, 
            },
        },
    ],

    "dcim.device": [
        {
        "name":
            { 
            "required": True, 
            },
        "tenant":
            { 
            "required": True, 
            },
        "location":
            { 
            "required": True, 
            },
        "rack":
            { 
            "required": True, 
            },
        },
    ],
}

For Sites, i have to create custom field choices and custom field linked to this choice set. I don` t know if i have to list them all. Currently i have 9 choices, but i changed names. Names might have uppercase,lowercase, dots,quotes symbols and non-English words.

 {
            "id": 1,
            "url": "https://{address}/api/extras/custom-field-choice-sets/1/",
            "display_url": "https://{address}/extras/custom-field-choices/1/",
            "display": "holding_company_choices",
            "name": "holding_company_choices",
            "description": "Choose holding company",
            "base_choices": null,
            "extra_choices": [
                [
                    "A",
                    "A"
                ],
                [
                    "B",
                    "B"
                ],
                [
                    "C",
                    "C"
                ],
                [
                    "D",
                    "D"
                ],
                [
                    "E",
                    "E"
                ],
                [
                    "F",
                    "F"
                ],
                [
                    "G",
                    "G"
                ],
                [
                    "H",
                    "H"
                ],
                [
                    "I",
                    "I"
                ]
            ],
            "order_alphabetically": false,
            "choices_count": 9,
            "created": "2025-08-04T12:13:08.292329Z",
            "last_updated": "2025-08-04T12:13:08.292346Z"
        }

and

{
            "id": 1,
            "url": "https://{address}/api/extras/custom-fields/1/",
            "display_url": "https://{address}/extras/custom-fields/1/",
            "display": "Holding Company",
            "object_types": [
                "dcim.site"
            ],
            "type": {
                "value": "select",
                "label": "Selection"
            },
            "related_object_type": null,
            "data_type": "string",
            "name": "site_holding_company",
            "label": "Holding Company",
            "group_name": "",
            "description": "holding company which has a direct contract (including ancillary services) with the data center",
            "required": true,
            "unique": false,
            "search_weight": 1000,
            "filter_logic": {
                "value": "loose",
                "label": "Loose"
            },
            "ui_visible": {
                "value": "always",
                "label": "Always"
            },
            "ui_editable": {
                "value": "yes",
                "label": "Yes"
            },
            "is_cloneable": false,
            "default": null,
            "related_object_filter": null,
            "weight": 100,
            "validation_minimum": null,
            "validation_maximum": null,
            "validation_regex": "",
            "choice_set": {
                "id": 1,
                "url": "https://{address}/api/extras/custom-field-choice-sets/1/",
                "display": "holding_company_choices",
                "name": "holding_company_choices",
                "description": "Choose holding company",
                "choices_count": 9
            },
            "comments": "",
            "created": "2025-08-04T12:14:34.234426Z",
            "last_updated": "2025-08-04T12:14:34.234452Z"
        },

Also, i have to create tenant group "MyCompanyGroup"

{
            "id": 1,
            "url": "https://{address}/api/tenancy/tenant-groups/1/",
            "display_url": "https://{address}/tenancy/tenant-groups/1/",
            "display": "MyCompanyGroup",
            "name": "MyCompanyGroup",
            "slug": "mycompanygroup",
            "parent": null,
            "description": "Group related ONLY to my companies",
            "tags": [],
            "custom_fields": {},
            "created": "2025-08-04T12:14:54.008051Z",
            "last_updated": "2025-08-04T12:14:54.008076Z",
            "tenant_count": 1,
            "comments": "",
            "_depth": 0
}

and tenant "MyCompany" (you could see here a lot of other custom fields, but they appeared after i first time saw the bug, however if needed i can list them in my next comments)

{
            "id": 2,
            "url": "https://{address}/api/tenancy/tenants/2/",
            "display_url": "https://{address}/tenancy/tenants/2/",
            "display": "",
            "name": "MyCompany",
            "slug": "mycompany",
            "group": {
                "id": 1,
                "url": "https://{address}/api/tenancy/tenant-groups/1/",
                "display": "MyCompanyGroup",
                "name": "MyCompanyGroup",
                "slug": "mycompanygroup",
                "description": "Group related ONLY to my  companies",
                "tenant_count": 0,
                "_depth": 0
            },
            "description": "All-in-One companies",
            "comments": "",
            "tags": [],
            "custom_fields": {
                "tenant_erp_id": null,
                "tenant_is_active": null,
                "tenant_alias": null,
                "tenant_reference_tenant": null,
                "tenant_account_manager": null,
                "tenant_reference_manager": null,
                "tenant_is_customer": null,
                "tenant_is_peering": null,
                "tenant_is_vendor": null,
                "tenant_legal_check": null,
                "tenant_is_personal": null,
                "tenant_rturl": null,
                "tenant_is_rh": null
            },
            "created": "2025-08-04T12:15:28.865482Z",
            "last_updated": "2025-10-29T10:04:01.004247Z",
            "circuit_count": 0,
            "device_count": 1534,
            "ipaddress_count": 15,
            "prefix_count": 78,
            "rack_count": 151,
            "site_count": 70,
            "virtualmachine_count": 0,
            "vlan_count": 127,
            "vrf_count": 0,
            "cluster_count": 0
        },

Create Region (will be top level parent) "North America"

{
            "id": 2,
            "url": "https://{address}/api/dcim/regions/2/",
            "display_url": "https://{address}/dcim/regions/2/",
            "display": "North America",
            "name": "North America",
            "slug": "north-america",
            "parent": null,
            "description": "",
            "tags": [],
            "custom_fields": {},
            "created": "2025-08-04T12:17:55.460788Z",
            "last_updated": "2025-08-04T12:17:55.460806Z",
            "site_count": 12,
            "prefix_count": 0,
            "comments": "",
            "_depth": 0
}

Create Region (will be child for top level parent) "United States"

{
            "id": 23,
            "url": "https://{address}/api/dcim/regions/23/",
            "display_url": "https://{address}/dcim/regions/23/",
            "display": "United States",
            "name": "United States",
            "slug": "united-states",
            "parent": {
                "id": 2,
                "url": "https://{address}/api/dcim/regions/2/",
                "display_url": "https://{address}/dcim/regions/2/",
                "display": "North America",
                "name": "North America",
                "slug": "north-america",
                "_depth": 0
            },
            "description": "",
            "tags": [],
            "custom_fields": {},
            "created": "2025-08-04T12:18:17.119187Z",
            "last_updated": "2025-08-04T12:18:17.119205Z",
            "site_count": 11,
            "prefix_count": 0,
            "comments": "",
            "_depth": 1
        },

Create Region (will be child for child of top level parent) "Los Angeles"

{
            "id": 234,
            "url": "https://{address}/api/dcim/regions/234/",
            "display_url": "https://{address}/dcim/regions/234/",
            "display": "Los Angeles",
            "name": "Los Angeles",
            "slug": "los-angeles",
            "parent": {
                "id": 23,
                "url": "https://{address}/api/dcim/regions/23/",
                "display_url": "https://{address}/dcim/regions/23/",
                "display": "United States",
                "name": "United States",
                "slug": "united-states",
                "_depth": 1
            },
            "description": "",
            "tags": [],
            "custom_fields": {},
            "created": "2025-08-04T12:22:04.931932Z",
            "last_updated": "2025-08-04T12:22:04.931948Z",
            "site_count": 3,
            "prefix_count": 2,
            "comments": "",
            "_depth": 2

Create Site "MyTestSite" (represent Data Center)

{
            "id": 74,
            "url": "https://{address}/api/dcim/sites/74/",
            "display_url": "https://{address}/dcim/sites/74/",
            "display": "myTestSite",
            "name": "myTestSite",
            "slug": "mytestsite",
            "status": {
                "value": "activated",
                "label": "Activated"
            },
            "region": {
                "id": 234,
                "url": "https://{address}/api/dcim/regions/234/",
                "display": "Los Angeles",
                "name": "Los Angeles",
                "slug": "los-angeles",
                "description": "",
                "site_count": 0,
                "_depth": 2
            },
            "group": null,
            "tenant": {
                "id": 2,
                "url": "https://{address}/api/tenancy/tenants/2/",
                "display": "MyCompany",
                "name": "MyCompany",
                "slug": "mycompany",
                "description": "All-in-One"
            },
            "facility": "Test1",
            "time_zone": "America/Los_Angeles",
            "description": "myTestSite",
            "physical_address": "myTestSite",
            "shipping_address": "myTestSite",
            "latitude": null,
            "longitude": null,
            "comments": "",
            "asns": [],
            "tags": [],
            "custom_fields": {
                "site_holding_company": "A"
            },
            "created": "2025-11-24T07:56:08.410930Z",
            "last_updated": "2025-11-24T07:56:08.410952Z",
            "circuit_count": 0,
            "device_count": 2,
            "prefix_count": 0,
            "rack_count": 1,
            "virtualmachine_count": 0,
            "vlan_count": 0
        }

Create Location "MytestLocation"

{
            "id": 89,
            "url": "https://{address}/api/dcim/locations/89/",
            "display_url": "https://{address}/dcim/locations/89/",
            "display": "mytestLocation",
            "name": "mytestLocation",
            "slug": "mytestlocation",
            "site": {
                "id": 74,
                "url": "https://{address}/api/dcim/sites/74/",
                "display": "myTestSite",
                "name": "myTestSite",
                "slug": "mytestsite",
                "description": "myTestSite"
            },
            "parent": null,
            "status": {
                "value": "activated",
                "label": "Activated"
            },
            "tenant": {
                "id": 2,
                "url": "https://{address}/api/tenancy/tenants/2/",
                "display": "MyCompany",
                "name": "MyCompany",
                "slug": "mycompany",
                "description": "All-in-One companies"
            },
            "facility": "",
            "description": "mytestLocation",
            "tags": [],
            "custom_fields": {},
            "created": "2025-11-24T07:57:21.319219Z",
            "last_updated": "2025-11-24T07:57:21.319243Z",
            "rack_count": 1,
            "device_count": 2,
            "prefix_count": 0,
            "comments": "",
            "_depth": 0

Create Manufacturer for rack "Generic", Rack Roles "Mixed", Rack Types "Rack 42U (Narrow)", Rack "MyTestRack", Power feeds ( i show only rack, but inside you can see related objects - type, role, etc, please tell if i have to list them all, but it will be rather huge list...)

  {
            "id": 179,
            "url": "https://{address}/api/dcim/racks/179/",
            "display_url": "https://{address}/dcim/racks/179/",
            "display": "MyTestRack",
            "name": "MyTestRack",
            "facility_id": null,
            "site": {
                "id": 74,
                "url": "https://{address}/api/dcim/sites/74/",
                "display": "myTestSite",
                "name": "myTestSite",
                "slug": "mytestsite",
                "description": "myTestSite"
            },
            "location": {
                "id": 89,
                "url": "https://{address}/api/dcim/locations/89/",
                "display": "mytestLocation",
                "name": "mytestLocation",
                "slug": "mytestlocation",
                "description": "mytestLocation",
                "rack_count": 0,
                "_depth": 0
            },
            "tenant": {
                "id": 2,
                "url": "https://{address}/api/tenancy/tenants/2/",
                "display": "MyCompany",
                "name": "MyCompany",
                "slug": "mycompany",
                "description": "All-in-One companies"
            },
            "status": {
                "value": "in_use",
                "label": "In use"
            },
            "role": {
                "id": 1,
                "url": "https://{address}/api/dcim/rack-roles/1/",
                "display": "Mixed",
                "name": "Mixed",
                "slug": "mixed",
                "description": "Mixed rack with  Customers / Partners equipment"
            },
            "serial": "",
            "asset_tag": null,
            "rack_type": {
                "id": 2,
                "url": "https://{address}/api/dcim/rack-types/2/",
                "display": "Rack 42U (Narrow)",
                "manufacturer": {
                    "id": 7,
                    "url": "https://{address}/api/dcim/manufacturers/7/",
                    "display": "Generic",
                    "name": "Generic",
                    "slug": "generic",
                    "description": "Generic manufacturer"
                },
                "model": "Rack 42U (Narrow)",
                "slug": "rack-42u-narrow",
                "description": "Generic Rack 42U (Narrow) with unknown technical details"
            },
            "form_factor": {
                "value": "4-post-cabinet",
                "label": "4-post cabinet"
            },
            "width": {
                "value": 19,
                "label": "19 inches"
            },
            "u_height": 42,
            "starting_unit": 1,
            "weight": null,
            "max_weight": null,
            "weight_unit": null,
            "desc_units": false,
            "outer_width": 600,
            "outer_height": null,
            "outer_depth": null,
            "outer_unit": {
                "value": "mm",
                "label": "Millimeters"
            },
            "mounting_depth": null,
            "airflow": null,
            "description": "MyTestRack",
            "comments": "MyComment",
            "tags": [],
            "custom_fields": {
                "rack_owner": {
                    "id": 2,
                    "url": "https://{address}/api/tenancy/tenants/2/",
                    "display": "MyCompany",
                    "name": "MyCompany",
                    "slug": "mycompany",
                    "description": "All-in-One companies"
                },
                "rack_locker_keys_code": "0609",
                "rack_customer_sof": null,
                "rack_reservation_expdate": null,
                "rack_reservation_projecturl": null,
                "rack_contract_power_limit": 4000,
                "rack_contract_power_dashboard": null,
                "rack_contract_power_limit_comment": "MyPowerDetails",
                "rack_todo": "MyTodo",
                "rack_stock": "MyStock"
            },
            "created": "2025-11-24T07:59:23.267767Z",
            "last_updated": "2025-11-24T07:59:23.267789Z",
            "powerfeed_count": 2
        },

Create manufacturer "APC" and device type ""AP7922B" ( i show only device type, but inside you can see related objects - manufacturer, please tell if i have to list them all, but it will be rather huge list as well)

{
            "id": 138,
            "url": "https://{address}/api/dcim/device-types/138/",
            "display_url": "https://{address}/dcim/device-types/138/",
            "display": "AP7922B",
            "manufacturer": {
                "id": 4,
                "url": "https://{address}/api/dcim/manufacturers/4/",
                "display": "APC",
                "name": "APC",
                "slug": "apc",
                "description": "APC by Schneider Electric"
            },
            "default_platform": null,
            "model": "AP7922B",
            "slug": "ap7922b",
            "part_number": "AP7922B",
            "u_height": 2.0,
            "exclude_from_utilization": false,
            "is_full_depth": false,
            "subdevice_role": null,
            "airflow": {
                "value": "passive",
                "label": "Passive"
            },
            "weight": 4.5,
            "weight_unit": {
                "value": "kg",
                "label": "Kilograms"
            },
            "front_image": "https://{address}/media/devicetype-images/front_fqHXvQe.png",
            "rear_image": null,
            "description": "Rack PDU, Switched, 2U, 32A, 230V, (16)C13",
            "comments": "[APC AP7922B [datasheet](https://www.se.com/us/en/product/AP7922B/)](http://datasheet](https//www.se.com/us/en/product/AP7922B/))<br>",
            "tags": [],
            "custom_fields": {},
            "created": "2025-08-06T13:13:58.431759Z",
            "last_updated": "2025-08-07T05:41:52.499831Z",
            "device_count": 30,
            "console_port_template_count": 1,
            "console_server_port_template_count": 0,
            "power_port_template_count": 1,
            "power_outlet_template_count": 16,
            "interface_template_count": 1,
            "front_port_template_count": 0,
            "rear_port_template_count": 0,
            "device_bay_template_count": 0,
            "module_bay_template_count": 0,
            "inventory_item_template_count

In addition to device type i created inside:

  • Power Port: name "PDU Input", type "Hardwired" (only these fields filled)
  • Power Outlets (x16 in total):
    • name "Group 1 Port 1 ", type "C13", status "Enabled", Power Port "PDU Input" (only these fields filled)
    • ... here all ports in group 1 between 1 and 8
    • name "Group 1 Port 8 ", type "C13", status "Enabled", Power Port "PDU Input" (only these fields filled)
    • name "Group 2 Port 1 ", type "C13", status "Enabled", Power Port "PDU Input" (only these fields filled)
    • ... here all ports in group 2 between 1 and 8
    • name "Group 2 Port 8 ", type "C13", status "Enabled", Power Port "PDU Input" (only these fields filled)

Create device "MyPDU1" and "MyPDU2" (only name,id,slug, position are different)

{
            "id": 3386,
            "url": "https://{address}/api/dcim/devices/3386/",
            "display_url": "https://{address}/dcim/devices/3386/",
            "display": "MyPDU1",
            "name": "MyPDU1",
            "device_type": {
                "id": 138,
                "url": "https://{address}/api/dcim/device-types/138/",
                "display": "AP7922B",
                "manufacturer": {
                    "id": 4,
                    "url": "https://{address}/api/dcim/manufacturers/4/",
                    "display": "APC",
                    "name": "APC",
                    "slug": "apc",
                    "description": "APC by Schneider Electric"
                },
                "model": "AP7922B",
                "slug": "ap7922b",
                "description": "Rack PDU, Switched, 2U, 32A, 230V, (16)C13"
            },
            "role": {
                "id": 10,
                "url": "https://{address}/api/dcim/device-roles/10/",
                "display": "PDU",
                "name": "PDU",
                "slug": "pdu",
                "description": "Role for Power Distribution Unit",
                "device_count": 0,
                "virtualmachine_count": 0,
                "_depth": 1
            },
            "tenant": {
                "id": 2,
                "url": "https://{address}/api/tenancy/tenants/2/",
                "display": "MyCompany",
                "name": "MyCompany",
                "slug": "mycompany",
                "description": "All-in-One companies"
            },
            "platform": null,
            "serial": "987654321",
            "asset_tag": null,
            "site": {
                "id": 74,
                "url": "https://{address}/api/dcim/sites/74/",
                "display": "myTestSite",
                "name": "myTestSite",
                "slug": "mytestsite",
                "description": "myTestSite"
            },
            "location": {
                "id": 89,
                "url": "https://{address}/api/dcim/locations/89/",
                "display": "mytestLocation",
                "name": "mytestLocation",
                "slug": "mytestlocation",
                "description": "mytestLocation",
                "rack_count": 0,
                "_depth": 0
            },
            "rack": {
                "id": 179,
                "url": "https://{address}/api/dcim/racks/179/",
                "display": "MyTestRack",
                "name": "MyTestRack",
                "description": "MyTestRack"
            },
            "position": 3.0,
            "face": {
                "value": "rear",
                "label": "Rear"
            },
            "latitude": null,
            "longitude": null,
            "parent_device": null,
            "status": {
                "value": "in_use",
                "label": "In use"
            },
            "airflow": {
                "value": "passive",
                "label": "Passive"
            },
            "primary_ip": null,
            "primary_ip4": null,
            "primary_ip6": null,
            "oob_ip": null,
            "cluster": null,
            "virtual_chassis": null,
            "vc_position": null,
            "vc_priority": null,
            "description": "",
            "comments": "",
            "config_template": null,
            "config_context": null,
            "local_context_data": null,
            "tags": [],
            "custom_fields": {
                "device_owner": {
                    "id": 2,
                    "url": "https://{address}/api/tenancy/tenants/2/",
                    "display": "MyCompany",
                    "name": "MyCompany",
                    "slug": "mycompany",
                    "description": "All-in-One companies"
                },
                "device_customer_sof": null,
                "device_erp_assembling": null,
                "device_erp_assembling_data": null,
                "device_reservation_expdate": null,
                "device_reservation_projecturl": null,
                "device_service_role": "Internal"
            },
            "created": "2025-11-24T08:01:31.627502Z",
            "last_updated": "2025-11-24T08:01:31.627533Z",
            "console_port_count": 1,
            "console_server_port_count": 0,
            "power_port_count": 1,
            "power_outlet_count": 16,
            "interface_count": 1,
            "front_port_count": 0,
            "rear_port_count": 0,
            "device_bay_count": 0,
            "module_bay_count": 0,
            "inventory_item_count": 0
        }

Crate custom link "Show all power ports"

{
            "id": 10,
            "url": "https://{address}/api/extras/custom-links/10/",
            "display_url": "https://{address}/extras/custom-links/10/",
            "display": "Show all power ports",
            "object_types": [
                "dcim.rack"
            ],
            "name": "Show all power ports",
            "enabled": true,
            "link_text": "Show power ports {{ object }}",
            "link_url": "{{ '/dcim/power-ports/?site_id=' ~ object.site.id ~ (object.location and '&location_id=' ~ object.location.id or '') ~ '&rack_id=' ~ object.id }}",
            "weight": 10,
            "group_name": "FAST ACTIONS",
            "button_class": "white",
            "new_window": true,
            "created": "2025-08-12T12:36:53.932326Z",
            "last_updated": "2025-08-12T12:36:53.932338Z"
}

Click on custom link from Rack page:

  1. Click on "Fast actions" tab

  2. Click on "Show free PDU outlets MyTestRack"

  3. I expect to see 32 available ports (16 from each PDU AP7922B - MyPDU1 and MyPDU2), but list is empty. Image

  4. Click edit button at myPDU1 page and save without changes. I see outlets now in UI for MyPDU1

Image
  1. Run command in console and click on "Show free PDU outlets MyTestRack" once again
docker compose exec netbox python manage.py nbshell

from dcim.models import Device
for dev in Device.objects.all(): dev.save()
  1. I see outlets now in UI for MyPDU1 and myPDU2
Image

This comment took me about four hours to write, so I understand it's still too difficult for an external specialist to fully understand all the details of our design. Maybe smth else affects my setup that i didn`t mentioned here, well, anyway this is why a here... to try find a way to fix it. However, I'm willing to provide as much information as possible further if needed.

simonzsay avatar Nov 24 '25 11:11 simonzsay

This is a reminder that additional information is needed in order to further triage this issue. If the requested details are not provided, the issue will soon be closed automatically.

github-actions[bot] avatar Dec 02 '25 04:12 github-actions[bot]

@simonzsay What you have provided is something of a data-dump of your system, which is way too much information for us to try and go through and figure out the relevant parts and hopefully try and reproduce your issue. For example - I think it's very unlikely that 15 custom validators are required to reproduce this issue.

What we would need you to do is come up with a minimal data that will reproduce the problem, something like:

  1. Create site "xxx" (specify any needed fields)
  2. create device-type: "zzzz"
  3. etc..

Just the minimum steps that you can find that helps to reproduce the issue. As Jason stated previously: "When a step, in your "steps to reproduce", says "create a ", you need to include all of the non-default values you used and in what fields you used them. When a steps says "add MDB", you need to specify exactly what "MDB" is (it took me 5+ minutes of reading to figure out you meant "motherboard"), what steps you took to create it, and exactly how you used it. Every step needs to include all of the details we need to reproduce your exact issue, at a minimum."

It is very important that it is narrowed down to the minimum steps needed to reproduce.

arthanson avatar Dec 09 '25 17:12 arthanson

Dear @arthanson, to be honest, I understand what you and your colleagues mean. I’m trying to provide as much information as possible about my custom changes because netbox is incredibly customizable — fortunately — and I don’t know whether any of these changes might have broken something or affected my setup. In netbox demo i cant reproduce an issue. I just had feeling that this is because of custom FIELD_CHOICES (i sent them before here ) I removed them from extra.py, didn`t help, same issue.

Nevertheless, I’m very grateful that netbox team still not giving up on this issue.

I’ve changed my approach. I deployed a fresh, empty netbox instance and tried to follow the steps to reproduce the problem. Comment is big because of json with all data, but it took around 10 minutes for me to make this test. Will be two parts - short and extended (extended i think you can skip).

Short:

  1. Create Region - "Region"
  2. Create Tenant Group - "Create Tenant Group"
  3. Create Tenant - "Tenant"
  4. Create Site - "Site"
  5. Create Location - "Location"
  6. Create Rack Role - "Role"
  7. Create Rack - "Rack"
  8. Create Manufacturer - "APC"
  9. Create Device Type - "AP7922B"
  10. Create Custom Link - Group Name - "FAST ACTIONS" Link text - "Show free PDU outlets {{ object }}" Link URL -"{{ '/dcim/power-outlets/?site_id=' ~ object.site.id ~ (object.location and '&location_id=' ~ object.location.id or '') ~ '&rack_id=' ~ object.id ~ '&connected=false' }}"
  11. Create Device Role - "Power"
  12. In only one exiting device type PDU AP7922B add Power Outlets and Power Port.
Power Port > 
Name - PDU Input, type - Hardwired

Power Outlets >
Name - Group 1 Outlet [1-8], type - C13, Power Port - PDU Input
Name - Group 2 Outlet [1-8], type - C13, Power Port - PDU Input
  1. Click on custom link from Rack page:
  • Click on "Fast actions" tab
  • Click on "Show free PDU outlets MyTestRack"
  • I expect to see 16 available ports, but list is empty.
  1. Go to only one existing PDU page, edit without changes and save. Now link shows 16 free PDU outlets.

Extended:

  1. Create Region
{
            "id": 1,
            "url": "",
            "display_url": "",
            "display": "Region",
            "name": "Region",
            "slug": "region",
            "parent": null,
            "description": "",
            "tags": [],
            "custom_fields": {},
            "created": "2025-12-10T06:29:19.820671Z",
            "last_updated": "2025-12-10T06:29:19.820696Z",
            "site_count": 1,
            "prefix_count": 0,
            "comments": "",
            "_depth": 0
        }
  1. Create Tenant Group
{
            "id": 1,
            "url": "",
            "display_url": "",
            "display": "Tenant Group",
            "name": "Tenant Group",
            "slug": "tenant-group",
            "parent": null,
            "description": "",
            "tags": [],
            "custom_fields": {},
            "created": "2025-12-10T06:30:40.077642Z",
            "last_updated": "2025-12-10T06:30:40.077665Z",
            "tenant_count": 1,
            "comments": "",
            "_depth": 0
        }
  1. Create Tenant
{
            "id": 1,
            "url": "",
            "display_url": "",
            "display": "Tenant",
            "name": "Tenant",
            "slug": "tenant",
            "group": {
                "id": 1,
                "url": "",
                "display": "Tenant Group",
                "name": "Tenant Group",
                "slug": "tenant-group",
                "description": "",
                "tenant_count": 0,
                "_depth": 0
            },
            "description": "",
            "comments": "",
            "tags": [],
            "custom_fields": {},
            "created": "2025-12-10T06:30:52.516748Z",
            "last_updated": "2025-12-10T06:30:52.516769Z",
            "circuit_count": 0,
            "device_count": 1,
            "ipaddress_count": 0,
            "prefix_count": 0,
            "rack_count": 1,
            "site_count": 1,
            "virtualmachine_count": 0,
            "vlan_count": 0,
            "vrf_count": 0,
            "cluster_count": 0
        }
  1. Create Site
{
            "id": 1,
            "url": "",
            "display_url": "",
            "display": "Site",
            "name": "Site",
            "slug": "site",
            "status": {
                "value": "activated",
                "label": "Activated"
            },
            "region": {
                "id": 1,
                "url": "",
                "display": "Region",
                "name": "Region",
                "slug": "region",
                "description": "",
                "site_count": 0,
                "_depth": 0
            },
            "group": null,
            "tenant": {
                "id": 1,
                "url": "",
                "display": "Tenant",
                "name": "Tenant",
                "slug": "tenant",
                "description": ""
            },
            "facility": "A",
            "time_zone": "localtime",
            "description": "",
            "physical_address": "Address",
            "shipping_address": "Address",
            "latitude": null,
            "longitude": null,
            "comments": "",
            "asns": [],
            "tags": [],
            "custom_fields": {},
            "created": "2025-12-10T06:31:21.857938Z",
            "last_updated": "2025-12-10T06:31:21.857974Z",
            "circuit_count": 0,
            "device_count": 1,
            "prefix_count": 0,
            "rack_count": 1,
            "virtualmachine_count": 0,
            "vlan_count": 0
        }
  1. Create Location
{
            "id": 1,
            "url": "",
            "display_url": "",
            "display": "Location",
            "name": "Location",
            "slug": "location",
            "site": {
                "id": 1,
                "url": "",
                "display": "Site",
                "name": "Site",
                "slug": "site",
                "description": ""
            },
            "parent": null,
            "status": {
                "value": "activated",
                "label": "Activated"
            },
            "tenant": {
                "id": 1,
                "url": "",
                "display": "Tenant",
                "name": "Tenant",
                "slug": "tenant",
                "description": ""
            },
            "facility": "A",
            "description": "",
            "tags": [],
            "custom_fields": {},
            "created": "2025-12-10T06:31:50.191611Z",
            "last_updated": "2025-12-10T06:31:50.191634Z",
            "rack_count": 1,
            "device_count": 1,
            "prefix_count": 0,
            "comments": "",
            "_depth": 0
        }
  1. Create Rack Role
{
            "id": 1,
            "url": "",
            "display_url": "",
            "display": "Role",
            "name": "Role",
            "slug": "role",
            "color": "9e9e9e",
            "description": "",
            "tags": [],
            "custom_fields": {},
            "created": "2025-12-10T06:32:56.107140Z",
            "last_updated": "2025-12-10T06:32:56.107164Z",
            "rack_count": 1
        }
  1. Create Rack
{
            "id": 1,
            "url": "",
            "display_url": "",
            "display": "Rack",
            "name": "Rack",
            "facility_id": null,
            "site": {
                "id": 1,
                "url": "",
                "display": "Site",
                "name": "Site",
                "slug": "site",
                "description": ""
            },
            "location": {
                "id": 1,
                "url": "",
                "display": "Location",
                "name": "Location",
                "slug": "location",
                "description": "",
                "rack_count": 0,
                "_depth": 0
            },
            "tenant": {
                "id": 1,
                "url": "",
                "display": "Tenant",
                "name": "Tenant",
                "slug": "tenant",
                "description": ""
            },
            "status": {
                "value": "in_use",
                "label": "In use"
            },
            "role": {
                "id": 1,
                "url": "",
                "display": "Role",
                "name": "Role",
                "slug": "role",
                "description": ""
            },
            "serial": "",
            "asset_tag": null,
            "rack_type": null,
            "form_factor": {
                "value": "4-post-cabinet",
                "label": "4-post cabinet"
            },
            "width": {
                "value": 19,
                "label": "19 inches"
            },
            "u_height": 42,
            "starting_unit": 1,
            "weight": null,
            "max_weight": null,
            "weight_unit": null,
            "desc_units": false,
            "outer_width": null,
            "outer_height": null,
            "outer_depth": null,
            "outer_unit": null,
            "mounting_depth": null,
            "airflow": null,
            "description": "",
            "comments": "",
            "tags": [],
            "custom_fields": {},
            "created": "2025-12-10T06:33:02.860557Z",
            "last_updated": "2025-12-10T06:33:02.860578Z",
            "device_count": 1,
            "powerfeed_count": 0
        }
  1. Create Manufacturer
{
            "id": 1,
            "url": "",
            "display_url": "",
            "display": "APC",
            "name": "APC",
            "slug": "apc",
            "description": "",
            "tags": [],
            "custom_fields": {},
            "created": "2025-12-10T06:33:26.675735Z",
            "last_updated": "2025-12-10T06:33:26.675759Z",
            "devicetype_count": 1,
            "inventoryitem_count": 0,
            "platform_count": 0
        }
  1. Create Device Type
{
            "id": 1,
            "url": "",
            "display_url": "",
            "display": "AP7922B",
            "manufacturer": {
                "id": 1,
                "url": "",
                "display": "APC",
                "name": "APC",
                "slug": "apc",
                "description": ""
            },
            "default_platform": null,
            "model": "AP7922B",
            "slug": "ap7922b",
            "part_number": "AP7922B",
            "u_height": 2.0,
            "exclude_from_utilization": false,
            "is_full_depth": false,
            "subdevice_role": null,
            "airflow": null,
            "weight": 4.5,
            "weight_unit": {
                "value": "kg",
                "label": "Kilograms"
            },
            "front_image": null,
            "rear_image": null,
            "description": "",
            "comments": "",
            "tags": [],
            "custom_fields": {},
            "created": "2025-12-10T06:34:37.826628Z",
            "last_updated": "2025-12-10T06:34:37.826650Z",
            "device_count": 1,
            "console_port_template_count": 0,
            "console_server_port_template_count": 0,
            "power_port_template_count": 1,
            "power_outlet_template_count": 16,
            "interface_template_count": 0,
            "front_port_template_count": 0,
            "rear_port_template_count": 0,
            "device_bay_template_count": 0,
            "module_bay_template_count": 0,
            "inventory_item_template_count": 0
        }
  1. Create Custom Link
{
            "id": 1,
            "url": "",
            "display_url": "",
            "display": "Show all free PDU outlets",
            "object_types": [
                "dcim.rack"
            ],
            "name": "Show all free PDU outlets",
            "enabled": true,
            "link_text": "Show free PDU outlets {{ object }}",
            "link_url": "{{ '/dcim/power-outlets/?site_id=' ~ object.site.id ~ (object.location and '&location_id=' ~ object.location.id or '') ~ '&rack_id=' ~ object.id ~ '&connected=false' }}",
            "weight": 100,
            "group_name": "FAST ACTIONS",
            "button_class": "default",
            "new_window": true,
            "created": "2025-12-10T06:37:31.747792Z",
            "last_updated": "2025-12-10T06:37:31.747813Z"
        }
  1. Create Device Role
{
            "id": 1,
            "url": "",
            "display_url": "",
            "display": "Power",
            "name": "Power",
            "slug": "power",
            "color": "9e9e9e",
            "vm_role": false,
            "config_template": null,
            "parent": null,
            "description": "",
            "tags": [],
            "custom_fields": {},
            "created": "2025-12-10T06:38:07.224516Z",
            "last_updated": "2025-12-10T06:38:07.224537Z",
            "device_count": 1,
            "virtualmachine_count": 0,
            "comments": "",
            "_depth": 0
        }
  1. In only one exiting PDU add Power Outlets and Power Port.
Power Port > 
Name - PDU Input, type - Hardwired

Power Outlets >
Name - Group 1 Outlet [1-8], type - C13, Power Port - PDU Input
Name - Group 2 Outlet [1-8], type - C13, Power Port - PDU Input
  1. Click on custom link from Rack page:
  • Click on "Fast actions" tab
  • Click on "Show free PDU outlets MyTestRack"
  • I expect to see 16 available ports, but list is empty.
  1. Go to only one existing PDU page, edit without changes and save. Now link shows 16 free PDU outlets.

simonzsay avatar Dec 10 '25 07:12 simonzsay

Started from scratch, but in demo netbox. Made same steps as above. I am feeling crazy, but see the same issue only at my PDU. Some PDUs made by other users shows free outlets correctly, but maybe they re-saved them as well. Ive added to some rack exiting device-type PDU (made by someone) and issue appeared for this new PDU in rack.

Image

after re-save device...

Image

simonzsay avatar Dec 10 '25 09:12 simonzsay