-
Notifications
You must be signed in to change notification settings - Fork 2.9k
Description
Deployment Type
Self-hosted
NetBox Version
v4.2.3
Python Version
3.12
Steps to Reproduce
Use Python or Postman API to GET the clusters from Netbox by paging through the resources.
The real-world use case is to load a larger list of clusters using the paging mechanism.
To reproduce Run the following code
import requests
def main():
"""
Pull netbox clusters for demo.netbox.dev using limit=5
The idea of small limit is just to simulate a bigger database where we have to do multiple
requests of 50 items to load a larger list of for example 250 clusters.
The idea is to show that within the returned items few duplicates appear.
:return:
"""
cluster_list = [] # Place to store the clusters after with each requests call
cluster_unique_ids = set() # Set to store the unique IDs of clusters loaded from netbox
# Collect the clusters
headers = {
'Accept': 'application/json',
'Authorization': 'Token 6a768e6363830a536ffa07abf261c1d64d365b9a'
}
parameters = {
'limit': 5,
'offset': 0
}
while True:
response = requests.get('https://demo.netbox.dev/api/virtualization/clusters', headers=headers,
params=parameters)
if response.status_code == 200:
print(f'Collected clusters from Netbox with offset: {parameters["offset"]}, limit: {parameters["limit"]}')
cluster_list.extend(response.json()['results'])
parameters['offset'] += parameters['limit']
if not response.json()['next']:
break
# Check if there are any duplicates in the clusters
for cluster in cluster_list:
if cluster['name'] not in cluster_unique_ids:
cluster_unique_ids.add(cluster['name'])
else:
print(f'Duplicate Cluster. Name: {cluster["name"]}, ID: {cluster["id"]}')
if __name__ == '__main__':
main()
To Reproduce in Postman:
Issue the GET requests with following path:
https://demo.netbox.dev/api/virtualization/clusters/?limit=5&offset=5
and then issue again with
https://demo.netbox.dev/api/virtualization/clusters/?limit=5&offset=30
You will see that Cluster with ID 10 repeats in two responses. The ID might differ at times.
The Example above uses demo.netbox.dev, but the same behavior we experience on our on-prem self-hosted instance. With 150 clusters we see about 30-35 duplicates.
Expected Behavior
Expect not to have duplicates returned as we page through the clusters.
Observed Behavior
Clusters with duplicate IDs are present in the responses.
We see that few IDs are duplicated in the response
Collected clusters from Netbox with offset: 0, limit: 5
Collected clusters from Netbox with offset: 5, limit: 5
Collected clusters from Netbox with offset: 10, limit: 5
Collected clusters from Netbox with offset: 15, limit: 5
Collected clusters from Netbox with offset: 20, limit: 5
Collected clusters from Netbox with offset: 25, limit: 5
Collected clusters from Netbox with offset: 30, limit: 5
Duplicate Cluster. Name: gc-us-west1, ID: 10
Duplicate Cluster. Name: gc-europe-west4, ID: 22

