blob: a03b215bf89a97ddcefd93b21939e83ccec38e10 [file] [log] [blame]
from resources.net import Net
import threading
lock = threading.Lock()
__issued_ips = dict()
__default_subnet_size = 256
__default_subnet_bitmask = 24
__first_ip = Net.ip_2_int('10.0.0.0')
__last_ip = Net.ip_2_int('10.255.255.255')
__current_ip = __first_ip
def get_new_cidr(uuid):
"""
Calculates a unused cidr for a subnet.
:param uuid: The UUID of the subnet - Thus it can store which subnet gets which CIDR
:type uuid: ``str``
:return: Returns None if all available CIDR are used. Otherwise returns a valid CIDR.
:rtype: ``str``
"""
global lock
lock.acquire()
global __current_ip
while __first_ip <= __current_ip < __last_ip and __current_ip in __issued_ips:
__current_ip += __default_subnet_size
if __current_ip >= __last_ip or __current_ip < __first_ip or __current_ip in __issued_ips:
return None
__issued_ips[__current_ip] = uuid
lock.release()
return Net.int_2_ip(__current_ip) + '/' + str(__default_subnet_bitmask)
def free_cidr(cidr, uuid):
"""
Frees a issued CIDR thus it can be reused.
:param cidr: The currently used CIDR.
:type cidr: ``str``
:param uuid: The UUID of the Subnet, which uses this CIDR.
:type uuid: ``str``
:return: Returns False if the CIDR is None or the UUID did not correspond tho the used CIDR. Else it returns True.
:rtype: ``bool``
"""
if cidr is None:
return False
global __current_ip
int_ip = Net.cidr_2_int(cidr)
global lock
lock.acquire()
if int_ip in __issued_ips and __issued_ips[int_ip] == uuid:
del __issued_ips[int_ip]
if int_ip < __current_ip:
__current_ip = int_ip
lock.release()
return True
lock.release()
return False
def is_cidr_issued(cidr):
"""
Returns True if the CIDR is used.
:param cidr: The requested CIDR.
:type cidr: ``str``
:return: Returns True if the CIDR is used, else False.
:rtype: ``bool``
"""
if cidr is None:
return False
int_ip = Net.cidr_2_int(cidr)
if int_ip in __issued_ips:
return True
return False
def is_my_cidr(cidr, uuid):
"""
Checks if the UUID and the used CIDR are related.
:param cidr: The issued CIDR.
:type cidr: ``str``
:param uuid: The Subnet UUID.
:type uuid: ``str``
:return: Returns False if the CIDR is None or if the CIDR is not issued. Else returns True.
:rtype: ``bool``
"""
if cidr is None:
return False
int_ip = Net.cidr_2_int(cidr)
if not int_ip in __issued_ips:
return False
if __issued_ips[int_ip] == uuid:
return True
return False
def assign_cidr(cidr, uuid):
"""
Allows a subnet to request a specific CIDR.
:param cidr: The requested CIDR.
:type cidr: ``str``
:param uuid: The Subnet UUID.
:type uuid: ``str``
:return: Returns False if the CIDR is None or if the CIDR is already issued. Returns True if the CIDR could be
assigned to the UUID.
"""
if cidr is None:
return False
int_ip = Net.cidr_2_int(cidr)
if int_ip in __issued_ips:
return False
global lock
lock.acquire()
__issued_ips[int_ip] = uuid
lock.release()
return True