Merge "distribute ip from cidr when ip ranges were None" into stable/mitaka

This commit is contained in:
Jenkins
2017-02-23 14:55:46 +00:00
committed by Gerrit Code Review
2 changed files with 193 additions and 40 deletions

View File

@@ -337,9 +337,12 @@ def check_ip_exist(cluster_id, network_plane_name,
def check_ip_ranges(ip_ranges_one,available_ip_list):
ip_range = copy.deepcopy(ip_ranges_one.values())
ip_ranges_end = ip_range[1]
ip_ranges_start = ip_range[0]
# ip_range = copy.deepcopy(ip_ranges_one.values())
ip_ranges_end = ip_ranges_one[1]
ip_ranges_start = ip_ranges_one[0]
ip_range_gw = ip_ranges_one[3]
if ip_range_gw:
available_ip_list.append(ip_range_gw)
inter_num = ip_into_int(ip_ranges_start)
ip_ranges_end_inter = ip_into_int(ip_ranges_end)
while True:
@@ -385,17 +388,23 @@ def compare_same_cidr_ip(x, y):
def sort_ip_ranges_with_cidr(ip_ranges, net_cidr=None):
'''
ip_ranges=[('12.18.1.5', '12.18.1.6', '12.18.1.1/24', '12.18.1.5'),
ip_ranges=[(start,end,cidr,gateway),
('12.18.1.5', '12.18.1.6', '12.18.1.1/24', '12.18.1.5'),
('12.18.1.15', '12.18.1.16', '12.18.1.1/24', '12.18.1.5'),
('13.18.1.5', '13.18.1.5', '13.18.1.1/24', '13.18.1.5'),
('2.1.1.12', '2.1.1.12', '2.1.1.1/24', '2.1.1.1'),
('2.1.1.17', '2.1.1.32', '2.1.1.1/24', '2.1.1.1'),
('9.18.1.1', '9.18.1.2', '9.18.1.1/24', '9.18.1.1')]
('9.18.1.1', '9.18.1.2', '9.18.1.1/24', '9.18.1.1'),
('', '', '9.8.1.1/24', '9.8.1.1'),
('9.18.1.1', '9.18.1.2', '', ''),]
'''
tmp_ip_ranges = copy.deepcopy(ip_ranges)
convert_ip_ranges=[]
for ip_range in tmp_ip_ranges:
int_start_ip = ip_into_int(ip_range[0])
if ip_range[0]:
int_start_ip = ip_into_int(ip_range[0])
else:
int_start_ip = 0
cidr = ip_range[2]
if cidr and cidr != 'None':
cidr_ip = cidr.split('/')[0]
@@ -418,8 +427,8 @@ def according_to_cidr_distribution_ip(cluster_id, network_plane_name,
ip_ranges_cidr = []
distribution_ip = ""
sql_network_plane_info = "select networks.id,networks.cidr,\
networks.network_type,networks.segmentation_type from networks \
sql_network_plane_info = "select networks.id,cidr,network_type,\
segmentation_type,gateway from networks \
where networks.name='" + network_plane_name + \
"' and networks.cluster_id='" + cluster_id + \
"' and networks.deleted=0"
@@ -429,6 +438,7 @@ def according_to_cidr_distribution_ip(cluster_id, network_plane_name,
network_cidr = query_network_plane_info.values()[1]
network_type = query_network_plane_info.values()[2]
segmentation_type = query_network_plane_info.values()[3]
network_gw = query_network_plane_info.values()[4]
if network_type not in ['EXTERNAL']:
if network_type == 'DATAPLANE' and segmentation_type == 'vlan':
return distribution_ip
@@ -436,42 +446,60 @@ def according_to_cidr_distribution_ip(cluster_id, network_plane_name,
cluster_id, network_plane_name, session, exclude_ips)
sql_ip_ranges = "select ip_ranges.start,end,cidr,gateway from \
ip_ranges where network_id='" + network_id + \
"' and ip_ranges.deleted=0 and start"
"' and ip_ranges.deleted=0"
query_ip_ranges = session.execute(sql_ip_ranges).fetchall()
LOG.info('query_ip_ranges: %s ' % query_ip_ranges)
#query_ip_ranges = sorted(query_ip_ranges, cmp=compare_same_cidr_ip)
LOG.info('sorted query_ip_ranges: %s ' % query_ip_ranges)
used_cidrs = []
all_full_ip_ranges = []
if query_ip_ranges:
query_ip_ranges = \
sort_ip_ranges_with_cidr(query_ip_ranges, network_cidr)
for ip_ranges_one in query_ip_ranges:
check_ip_exist_list = \
check_ip_ranges(ip_ranges_one, available_ip_list)
if check_ip_exist_list[0]:
distribution_ip = check_ip_exist_list[1]
return distribution_ip
msg = "Error:The IP address assigned by \
ip ranges is already insufficient."
LOG.error(msg)
raise exception.Forbidden(msg)
else:
ip_ranges_cidr = cidr_convert_ip_ranges(network_cidr)
ip_min_inter = ip_into_int(ip_ranges_cidr[0])
ip_max_inter = ip_into_int(ip_ranges_cidr[1])
while True:
distribution_ip = inter_into_ip(ip_min_inter + 1)
if distribution_ip not in available_ip_list:
distribution_ip_inter = ip_into_int(distribution_ip)
if distribution_ip_inter < ip_max_inter:
break
for ip_range in query_ip_ranges:
tmp_full_ip_ranges = []
if ip_range[0] and not ip_range[2]:
# with start_ip, without ip_range_cidr
if is_in_cidr_range(ip_range[0], network_cidr):
tmp_full_ip_ranges = \
[ip_range[0], ip_range[1], network_cidr, '']
used_cidrs.append(network_cidr)
else:
msg = "Error:The IP address assigned by \
CIDR is already insufficient."
msg = 'Ip range: %s maybe invalid data.' % ip_range
LOG.error(msg)
raise exception.Forbidden(msg)
else:
ip_min_inter = ip_min_inter + 1
elif ip_range[0] and ip_range[2]:
# with start_ip and ip_range_cidr
tmp_full_ip_ranges = \
[ip_range[0], ip_range[1], ip_range[2], ip_range[3]]
used_cidrs.append(ip_range[2])
elif not ip_range[0] and ip_range[2]:
# without start_ip, with ip_range_cidr
tmp_cidr_ranges = cidr_convert_ip_ranges(ip_range[2])
tmp_full_ip_ranges = [tmp_cidr_ranges[0],
tmp_cidr_ranges[1], ip_range[2], ip_range[3]]
used_cidrs.append(ip_range[2])
all_full_ip_ranges.append(tmp_full_ip_ranges)
if network_cidr and network_cidr not in used_cidrs:
tmp_gw = ''
if network_type == 'DATAPLANE':
tmp_gw = network_gw
tmp_cidr_ranges = cidr_convert_ip_ranges(network_cidr)
tmp_full_ip_ranges = [tmp_cidr_ranges[0], tmp_cidr_ranges[1],
network_cidr, tmp_gw]
used_cidrs.append(network_cidr)
all_full_ip_ranges.append(tmp_full_ip_ranges)
LOG.info("network_type: %s, all_full_ip_ranges: %s" % (network_type,
all_full_ip_ranges))
query_ip_ranges = \
sort_ip_ranges_with_cidr(all_full_ip_ranges, network_cidr)
for ip_ranges_one in query_ip_ranges:
check_ip_exist_list = \
check_ip_ranges(ip_ranges_one, available_ip_list)
if check_ip_exist_list[0]:
distribution_ip = check_ip_exist_list[1]
return distribution_ip
msg = "Error:The IP address assigned by \
ip ranges is already insufficient."
LOG.error(msg)
raise exception.Forbidden(msg)
return distribution_ip
@@ -4319,7 +4347,7 @@ def get_network_ip_range(context, network_id):
with session.begin():
sql_ip_ranges="select ip_ranges.start,end,cidr,gateway from ip_ranges \
where ip_ranges.network_id='"+network_id+"' and \
ip_ranges.deleted=0 and start order by ip_ranges.start"
ip_ranges.deleted=0;"
ip_ranges = session.execute(sql_ip_ranges).fetchall()
#ip_ranges_sorted = sorted(ip_ranges, cmp=compare_same_cidr_ip)
ip_ranges_sorted=sort_ip_ranges_with_cidr(ip_ranges)

View File

@@ -670,7 +670,8 @@ class TestSqlalchemyApi(test.TestCase):
session = api.get_session()
distribution_ip1 = api.according_to_cidr_distribution_ip(
cluster_id, network_plane_name, session)
self.assertEqual('112.18.1.2', distribution_ip1)
# gateway = '112.18.1.2'
self.assertEqual('112.18.1.3', distribution_ip1)
def test_get_network_ip_range(self):
network_values = {
@@ -815,3 +816,127 @@ class TestSqlalchemyApi(test.TestCase):
ret = api.host_interfaces_get_all(self.req.context)
self.assertEqual(ret[0]["host_id"], host_id)
api.host_destroy(self.req.context, host_id)
def test_according_to_cidr_distribution_ip_without_cidr(self):
ip_ranges = [{'start': '112.18.1.2', 'end': '112.18.1.5', }, ]
network_values = {
'cluster_id': '737adb89-ee6f-4642-8196-9ee6926fbe50',
'cidr': '112.18.1.2/25',
'gateway': '112.18.1.1',
'ip_ranges': str(ip_ranges),
'name': 'physnet1',
'segmentation_type': 'vxlan',
'physnet_name': 'physnet_enp2s0',
'type': 'default',
'network_type': 'DATAPLANE',
}
network_info = api.network_add(self.req.context, network_values)
network_id = network_info.__dict__['id']
cluster_id = '737adb89-ee6f-4642-8196-9ee6926fbe50'
network_plane_name = 'physnet1'
session = api.get_session()
distribution_ip1 = api.according_to_cidr_distribution_ip(
cluster_id, network_plane_name, session)
self.assertEqual('112.18.1.2', distribution_ip1)
def test_according_to_cidr_distribution_ip_without_ip(self):
network_values = {
'cluster_id': '737adb89-ee6f-4642-8196-9ee6926fbe50',
'cidr': None,
'gateway': None,
'name': 'physnet1',
'segmentation_type': 'vxlan',
'physnet_name': 'physnet_enp2s0',
'type': 'default',
'network_type': 'DATAPLANE',
}
network_info = api.network_add(self.req.context, network_values)
network_id = network_info.__dict__['id']
cluster_id = '737adb89-ee6f-4642-8196-9ee6926fbe50'
network_plane_name = 'physnet1'
session = api.get_session()
self.assertRaises(exception.Forbidden,
api.according_to_cidr_distribution_ip, cluster_id,
network_plane_name, session)
def test_according_to_cidr_distribution_ip_from_net_cidr(self):
network_values = {
'cluster_id': '737adb89-ee6f-4642-8196-9ee6926fbe50',
'cidr': '112.18.1.2/25',
'gateway': '112.18.1.1',
'name': 'physnet1',
'segmentation_type': 'vxlan',
'physnet_name': 'physnet_enp2s0',
'type': 'default',
'network_type': 'DATAPLANE',
}
network_info = api.network_add(self.req.context, network_values)
network_id = network_info.__dict__['id']
cluster_id = '737adb89-ee6f-4642-8196-9ee6926fbe50'
network_plane_name = 'physnet1'
session = api.get_session()
distribution_ip1 = api.according_to_cidr_distribution_ip(
cluster_id, network_plane_name, session)
self.assertEqual('112.18.1.2', distribution_ip1)
def test_according_to_cidr_distribution_ip_from_range_cidr(self):
ip_ranges = [
{'start': None,
'cidr': '112.18.1.1/24',
'end': None,
'gateway': '112.18.1.2'
}, ]
network_values = {
'cluster_id': '737adb89-ee6f-4642-8196-9ee6926fbe50',
'cidr': '112.18.1.2/25',
'gateway': '112.18.1.1',
'ip_ranges': str(ip_ranges),
'name': 'physnet1',
'segmentation_type': 'vxlan',
'physnet_name': 'physnet_enp2s0',
'type': 'default',
'network_type': 'DATAPLANE',
}
network_info = api.network_add(self.req.context, network_values)
network_id = network_info.__dict__['id']
cluster_id = '737adb89-ee6f-4642-8196-9ee6926fbe50'
network_plane_name = 'physnet1'
session = api.get_session()
distribution_ip1 = api.according_to_cidr_distribution_ip(
cluster_id, network_plane_name, session)
self.assertEqual('112.18.1.1', distribution_ip1)
def test_check_ip_ranges(self):
ip_ranges = ('12.1.1.10', '12.1.1.15', '12.1.1.1/24', '12.1.1.1')
check_result = api.check_ip_ranges(ip_ranges, [])
self.assertEqual('12.1.1.10', check_result[1])
def test_sort_ip_ranges_with_cidr(self):
ip_ranges = \
[('12.1.1.10', '12.1.1.10', '12.1.1.1/24', '12.1.1.1'),
('16.168.1.100', '16.168.1.100', '16.168.1.10/24', '16.168.1.1'),
('17.168.1.10', '17.168.1.10', '17.168.1.1/24', '17.168.1.1'),
('5.5.5.5', '5.5.5.5', '5.5.5.1/24', '5.5.5.1')]
sorted_ip_ranges = api.sort_ip_ranges_with_cidr(ip_ranges)
# print 'sorted_ip_ranges:', sorted_ip_ranges
self.assertEqual(('5.5.5.5', '5.5.5.5', '5.5.5.1/24', '5.5.5.1'),
sorted_ip_ranges[0])
self.assertEqual(('12.1.1.10', '12.1.1.10', '12.1.1.1/24', '12.1.1.1'),
sorted_ip_ranges[1])
def test_sort_ip_ranges_with_cidr_no_startip(self):
ip_ranges = \
[('12.1.1.10', '12.1.1.10', '12.1.1.1/24', '12.1.1.1'),
('16.168.1.100', '16.168.1.100', '16.168.1.10/24', '16.168.1.1'),
(None, None, '17.168.1.1/24', '17.168.1.1'),
('5.5.5.5', '5.5.5.5', '5.5.5.1/24', '5.5.5.1')]
sorted_ip_ranges = api.sort_ip_ranges_with_cidr(ip_ranges)
# print 'sorted_ip_ranges:', sorted_ip_ranges
self.assertEqual(('5.5.5.5', '5.5.5.5', '5.5.5.1/24', '5.5.5.1'),
sorted_ip_ranges[0])
self.assertEqual(('12.1.1.10', '12.1.1.10', '12.1.1.1/24', '12.1.1.1'),
sorted_ip_ranges[1])