diff --git a/gso/services/netbox_client.py b/gso/services/netbox_client.py index a94da723333ef6804dea2605e255d6ccd9760cb5..5de76f908e6f74c76ff84705916085c350d41934 100644 --- a/gso/services/netbox_client.py +++ b/gso/services/netbox_client.py @@ -106,6 +106,15 @@ class NetboxClient: device_manufacturer = Manufacturer(**{"name": name, "slug": slug}) return self.netbox.dcim.manufacturers.create(dict(device_manufacturer)) + @staticmethod + def calculate_interface_speed(interface: Interfaces) -> int | None: + """Calculate the interface speed in bits per second.""" + + type_parts = interface.type.value.split("-") + if "gbase" in type_parts[0]: + return int("".join(filter(str.isdigit, type_parts[0]))) * 1000000 + return None + def create_device(self, router_name: str, site_tier: str) -> Devices: """Create a new device in netbox.""" @@ -137,12 +146,7 @@ class NetboxClient: ) for interface in self.netbox.dcim.interfaces.filter(device_id=device.id): - speed = None - type_parts = interface.type.value.split("-") - if "gbase" in type_parts[0]: - # Extract the numeric part and convert to bits per second - speed = int("".join(filter(str.isdigit, type_parts[0]))) * 1000000 - interface.speed = speed + interface.speed = self.calculate_interface_speed(interface) interface.enabled = False interface.save() @@ -237,9 +241,20 @@ class NetboxClient: # Return available lags not assigned to the device return [lag for lag in all_feasible_lags if lag not in lag_interface_names] + @staticmethod + def calculate_speed_bits_per_sec(speed: str) -> int: + """Extract the numeric part from the speed.""" + + numeric_part = int("".join(filter(str.isdigit, speed))) + # Convert to bits per second + return numeric_part * 1000000 + def get_available_interfaces(self, router_id: UUID, speed: str) -> Interfaces: + """Return all available interfaces of a device filtered by speed.""" + router = Router.from_subscription(router_id).router.router_fqdn device = self.get_device_by_name(router) + speed_bps = self.calculate_speed_bits_per_sec(speed) return self.netbox.dcim.interfaces.filter( - device=device.name, enabled=False, mark_connected=False, speed=int(speed.split("G")[0]) * 1000000 + device=device.name, enabled=False, mark_connected=False, speed=speed_bps )