feat(network): Batch requests when filtering on interfaces

This avoids an issue where the requested URI is too long when many
interfaces are present
This commit is contained in:
Tom Hubrecht 2024-05-07 13:54:27 +02:00
parent ba4cdb217b
commit e04d0c6d59

View file

@ -1,7 +1,7 @@
import logging import logging
import os import os
import re import re
from itertools import chain from itertools import chain, islice
import netifaces import netifaces
from netaddr import IPAddress from netaddr import IPAddress
@ -413,11 +413,16 @@ class Network(object):
# delete IP on netbox that are not known on this server # delete IP on netbox that are not known on this server
if len(nb_nics): if len(nb_nics):
netbox_ips = nb.ipam.ip_addresses.filter( def batched(it, n):
**{self.intf_type: [x.id for x in nb_nics]} while batch := tuple(islice(it, n)):
) yield batch
netbox_ips = []
for ids in batched((x.id for x in nb_nics), 25):
netbox_ips += list(
nb.ipam.ip_addresses.filter(**{self.intf_type: ids})
)
netbox_ips = list(netbox_ips)
all_local_ips = list(chain.from_iterable([ all_local_ips = list(chain.from_iterable([
x['ip'] for x in self.nics if x['ip'] is not None x['ip'] for x in self.nics if x['ip'] is not None
])) ]))