Device components duplicated in paginated API responses when not filtered by device #2414

Closed
opened 2025-12-29 17:25:52 +01:00 by adam · 1 comment
Owner

Originally created by @shugotek on GitHub (Feb 28, 2019).

Environment

  • Python version: 3.6.7
  • NetBox version: 2.5.7

Steps to Reproduce

1.GET /api/dcim/console-ports/?limit=200&offset=0
2.GET /api/dcim/console-ports/?limit=200&offset=200 (and continue to have all)

Expected Behavior

List all console ports

Observed Behavior

If we compare all page, we have duplicate console ports and we have missing console ports.
If we do a Get with a limit greater than the number of console ports, we don't have any duplicate or missing console ports.

Originally created by @shugotek on GitHub (Feb 28, 2019). <!-- NOTE: This form is only for reproducible bugs. If you need assistance with NetBox installation, or if you have a general question, DO NOT open an issue. Instead, post to our mailing list: https://groups.google.com/forum/#!forum/netbox-discuss Please describe the environment in which you are running NetBox. Be sure that you are running an unmodified instance of the latest stable release before submitting a bug report. --> ### Environment * Python version: 3.6.7 * NetBox version: 2.5.7 <!-- Describe in detail the exact steps that someone else can take to reproduce this bug using the current stable release of NetBox (or the current beta release where applicable). Begin with the creation of any necessary database objects and call out every operation being performed explicitly. If reporting a bug in the REST API, be sure to reconstruct the raw HTTP request(s) being made: Don't rely on a wrapper like pynetbox. --> ### Steps to Reproduce 1.GET /api/dcim/console-ports/?limit=200&offset=0 2.GET /api/dcim/console-ports/?limit=200&offset=200 (and continue to have all) <!-- What did you expect to happen? --> ### Expected Behavior List all console ports <!-- What happened instead? --> ### Observed Behavior If we compare all page, we have duplicate console ports and we have missing console ports. If we do a Get with a limit greater than the number of console ports, we don't have any duplicate or missing console ports.
adam added the type: bugstatus: accepted labels 2025-12-29 17:25:52 +01:00
adam closed this issue 2025-12-29 17:25:52 +01:00
Author
Owner

@jeremystretch commented on GitHub (Feb 28, 2019):

This applies to all device components and component templates (except interfaces), not just console ports. Code to reproduce:

import requests

url='http://localhost:8000/api/dcim/console-ports/'
params = {
    'limit': 200,
    'offset': 0,
}
r = requests.get(url, params)
ids = [obj['id'] for obj in r.json()['results']]

params['offset'] = 200
r = requests.get(url, params)
for obj in r.json()['results']:
    if obj['id'] in ids:
        print("Duplicate ID: {}".format(obj['id']))

The issue here is that DeviceComponentManager.get_queryset() orders objects only by name, not by unique ID. This is fine when the list is filtered by device, but does not ensure deterministic ordering when the query includes objects with the same name. Nice catch!

@jeremystretch commented on GitHub (Feb 28, 2019): This applies to all device components and component templates (except interfaces), not just console ports. Code to reproduce: ``` import requests url='http://localhost:8000/api/dcim/console-ports/' params = { 'limit': 200, 'offset': 0, } r = requests.get(url, params) ids = [obj['id'] for obj in r.json()['results']] params['offset'] = 200 r = requests.get(url, params) for obj in r.json()['results']: if obj['id'] in ids: print("Duplicate ID: {}".format(obj['id'])) ``` The issue here is that `DeviceComponentManager.get_queryset()` orders objects only by name, not by unique ID. This is fine when the list is filtered by device, but does not ensure deterministic ordering when the query includes objects with the same name. Nice catch!
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: starred/netbox#2414