-
Notifications
You must be signed in to change notification settings - Fork 58
Open
Description
In my organization, we try to reserve the first 10 IPs in any given network. I modified the "get_next_available_ip" function to include the ability to exclude a range starting at the first address in the network. This could easily be further modified for any range. I've named the new function "get_next_available_ip_long":
def get_next_available_ip_long(self, network, num):
""" Implements IBA next_available_ip REST API call
Returns IP v4 address
:param network: network in CIDR format
"""
"""
Modified to include param num
param num is integer, will exclude that many addresses starting at .0
"""
def ip_exclude(start, count):
"""
This sub-function creates a list of excluded IPs for the next_available IP
Right now it only works to exclude the first x addresses in a range
"""
start_addr = start[:-3] #chomps the "/24" off the network name
start_addr_list = start_addr.split(".") #splits the network on each dot
start_oct4 = int(start_addr_list[3]) #changes the 4th octet to an int
start_oct4_str = start_addr_list[3] #creates a string value for the 4th octet
count = int(count)
end_oct4 = start_oct4 + count #sets the end of the reserved range
end_oct4_str = str(end_oct4) #makes a string variable for that
end_addr = start_addr_list[0] + "." + start_addr_list[1] + "." + start_addr_list[2] + "." + end_oct4_str
exclude_range = []
while start_oct4 < end_oct4:
start_oct4 = start_oct4 + 1
temp_oct4 = str(start_oct4)
temp_addr = start_addr_list[0] + "." + start_addr_list[1] + "." + start_addr_list[2] + "." + temp_oct4
exclude_range.append(temp_addr)
return exclude_range #returns a list of excluded addresses for post_data
exclude = ip_exclude(network, num)
rest_url = 'https://' + self.iba_host + '/wapi/v' + self.iba_wapi_version + '/network?network=' + network + '&network_view=' + self.iba_network_view
try:
r = requests.get(url=rest_url, auth=(self.iba_user, self.iba_password), verify=self.iba_verify_ssl)
r_json = r.json()
if r.status_code == 200:
if len(r_json) > 0:
net_ref = r_json[0]['_ref']
rest_url = 'https://' + self.iba_host + '/wapi/v' + self.iba_wapi_version + '/' + net_ref + '?_function=next_available_ip'
post_data = {"num":1,'exclude':exclude}
#this is the infoblox-approved "long-form" version of the "next available IP" call
r = requests.post(url=rest_url, auth=(self.iba_user, self.iba_password), verify=self.iba_verify_ssl, data=json.dumps(post_data))
r_json = r.json()
if r.status_code == 200:
ip_v4 = r_json['ips'][0]
return ip_v4
else:
if 'text' in r_json:
if 'code' in r_json and r_json['code'] == 'Client.Ibap.Data':
raise InfobloxNoIPavailableException(r_json['text'])
else:
raise InfobloxGeneralException(r_json['text'])
else:
r.raise_for_status()
else:
raise InfobloxNotFoundException("No requested network found: " + network)
else:
if 'text' in r_json:
raise InfobloxGeneralException(r_json['text'])
else:
r.raise_for_status()
except ValueError:
raise Exception(r)
except Exception:
raise
Metadata
Metadata
Assignees
Labels
No labels