From 1905b3bcb258e2876d6e1cbe190a8463d2cdda0f Mon Sep 17 00:00:00 2001
From: Neda Moeini <neda.moeini@GA0479-NMOEINI.local>
Date: Tue, 10 Oct 2023 19:02:12 +0200
Subject: [PATCH] Improved interface speed functionality.

---
 gso/services/netbox_client.py | 29 ++++++++++++++++++++++-------
 1 file changed, 22 insertions(+), 7 deletions(-)

diff --git a/gso/services/netbox_client.py b/gso/services/netbox_client.py
index a94da723..5de76f90 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
         )
-- 
GitLab