diff --git a/gso/services/infoblox.py b/gso/services/infoblox.py new file mode 100644 index 0000000000000000000000000000000000000000..652e63f6812857b22ca7175c39c74273dfe4554f --- /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 97e32111f2347c5bffdd9d3da9485013a1de115a..c88af354257a3600ed927a8182dd4b70bc3e6329 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", ], )