From 38861584eb597355a4159adbb4a86081efa4298a Mon Sep 17 00:00:00 2001
From: Hakan Calim <hakan.calim@fau.de>
Date: Wed, 20 Sep 2023 12:15:41 -0400
Subject: [PATCH] NAT-243: added reserve of an interface

---
 gso/services/netbox_client.py | 30 +++++++++++++++++++++++++++++-
 1 file changed, 29 insertions(+), 1 deletion(-)

diff --git a/gso/services/netbox_client.py b/gso/services/netbox_client.py
index d73ba0ce..e227032b 100644
--- a/gso/services/netbox_client.py
+++ b/gso/services/netbox_client.py
@@ -49,6 +49,12 @@ class Site(pydantic.BaseModel):
     slug: str
 
 
+# An exception for not found search
+class NotFoundError(Exception):
+    """Exception raised for not found search."""
+    pass
+
+
 def connect(api, token):
     """
     Creates a netbox client to communicate
@@ -77,7 +83,7 @@ def get_device_by_name(nbclient, device_name):
     device = nbclient.dcim.devices.get(name=device_name)
 
     if device is None:
-        raise ValueError(f"Device: {device_name} not found")
+        raise NotFoundError(f"Device: {device_name} not found")
     else:
         return device
 
@@ -207,5 +213,27 @@ def attach_interface_to_lag(nbclient, device_name: str, lag_name: str, iface_nam
     return dict(updated_iface)
 
 
+def reserve_interface(nbclient, device_name: str, iface_name: str) -> dict:
+    # First get interface from device
+    device = get_device_by_name(nbclient, device_name)
+    interface = nbclient.dcim.interfaces.get(device_id=device.id,
+                                             name=iface_name)
+
+    # Reserve interface by enabling it
+    if interface is None:
+        raise NotFoundError(f"Interface: {iface_name} on device: {device_name} not found.")
+    
+    # Check if interface is reserved
+    if interface.enabled:
+        print("Interface is reserved")
+
+    # Reserve interface by enabling it
+    interface.enabled = True
+    interface.save()
+
+    return dict(interface)
+
+
+
 if __name__ == "__main__":
     print(dict(create_device_manufacturer("Juniper", "juniper")))
-- 
GitLab