From 38b734557027e056c7f3006b32c8c1f197ce4721 Mon Sep 17 00:00:00 2001 From: Karel van Klink <karel.vanklink@geant.org> Date: Fri, 1 Sep 2023 19:44:10 +0200 Subject: [PATCH] add Infoblox service --- gso/services/infoblox.py | 47 ++++++++++++++++++++++++++++++++++++++++ setup.py | 4 ++-- 2 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 gso/services/infoblox.py diff --git a/gso/services/infoblox.py b/gso/services/infoblox.py new file mode 100644 index 00000000..652e63f6 --- /dev/null +++ b/gso/services/infoblox.py @@ -0,0 +1,47 @@ +import ipaddress + +from infoblox_client import connector, objects + +from gso.settings import load_oss_params + + +def _setup_connection() -> connector.Connector: + oss = load_oss_params() + options = { + "host": oss.IPAM.INFOBLOX.host, + "username": oss.IPAM.INFOBLOX.username, + "password": oss.IPAM.INFOBLOX.password, + "wapi_version": oss.IPAM.INFOBLOX.wapi_version[1:], # remove the 'v' in front of the version number + "ssl_verify": True if oss.IPAM.INFOBLOX.scheme == "https" else False, + } + return connector.Connector(options) + + +def allocate_network(ip_network: ipaddress.IPv4Network | ipaddress.IPv6Network) -> objects.Network: + conn = _setup_connection() + return objects.Network.create(conn, str(ip_network)) + + +def delete_network(ip_network: ipaddress.IPv4Network | ipaddress.IPv6Network) -> None: + conn = _setup_connection() + network = objects.Network.search(conn, cidr=str(ip_network)) + network.delete() + + +def allocate_host(hostname: str, net_cidr: ipaddress.IPv4Network | ipaddress.IPv6Network) -> objects.HostRecord: + conn = _setup_connection() + address = objects.IPAllocation.next_available_ip_from_cidr("default", net_cidr) + ip_object = objects.IP.create(address, "00:00:00:00:00:00", configure_for_dhcp=False) + return objects.HostRecord.create(conn, name=hostname, ip=ip_object) + + +def delete_host_by_ip(ip_addr: ipaddress.IPv4Address | ipaddress.IPv6Address) -> None: + conn = _setup_connection() + host = objects.HostRecord.search(conn, ipv4addr=ip_addr) + host.delete() + + +def delete_host_by_fqdn(fqdn: str) -> None: + conn = _setup_connection() + host = objects.HostRecord.search(conn, name=fqdn) + host.delete() diff --git a/setup.py b/setup.py index 97e32111..c88af354 100644 --- a/setup.py +++ b/setup.py @@ -10,8 +10,8 @@ setup( packages=find_packages(), install_requires=[ "orchestrator-core==1.2.2", - "pydantic", - "requests", + "requests~=2.31.0", + "infoblox-client~=0.6.0", "pycountry", ], ) -- GitLab