Merge "Limit amount of fixed ips per port"
This commit is contained in:
commit
cab5bbbc1c
@ -189,6 +189,15 @@ notification_topics = notifications
|
|||||||
# of number of items.
|
# of number of items.
|
||||||
# pagination_max_limit = -1
|
# pagination_max_limit = -1
|
||||||
|
|
||||||
|
# Maximum number of DNS nameservers per subnet
|
||||||
|
# max_dns_nameservers = 5
|
||||||
|
|
||||||
|
# Maximum number of host routes per subnet
|
||||||
|
# max_subnet_host_routes = 20
|
||||||
|
|
||||||
|
# Maximum number of fixed ips per port
|
||||||
|
# max_fixed_ips_per_port = 5
|
||||||
|
|
||||||
[QUOTAS]
|
[QUOTAS]
|
||||||
# resource name(s) that are supported in quota features
|
# resource name(s) that are supported in quota features
|
||||||
# quota_items = network,subnet,port
|
# quota_items = network,subnet,port
|
||||||
|
@ -69,6 +69,8 @@ core_opts = [
|
|||||||
help=_("Maximum number of DNS nameservers")),
|
help=_("Maximum number of DNS nameservers")),
|
||||||
cfg.IntOpt('max_subnet_host_routes', default=20,
|
cfg.IntOpt('max_subnet_host_routes', default=20,
|
||||||
help=_("Maximum number of host routes per subnet")),
|
help=_("Maximum number of host routes per subnet")),
|
||||||
|
cfg.IntOpt('max_fixed_ips_per_port', default=5,
|
||||||
|
help=_("Maximum number of fixed ips per port")),
|
||||||
cfg.IntOpt('dhcp_lease_duration', default=120,
|
cfg.IntOpt('dhcp_lease_duration', default=120,
|
||||||
help=_("DHCP lease duration")),
|
help=_("DHCP lease duration")),
|
||||||
cfg.BoolOpt('dhcp_agent_notification', default=True,
|
cfg.BoolOpt('dhcp_agent_notification', default=True,
|
||||||
|
@ -609,6 +609,9 @@ class QuantumDbPluginV2(quantum_plugin_base_v2.QuantumPluginBaseV2):
|
|||||||
'ip_address': fixed['ip_address']})
|
'ip_address': fixed['ip_address']})
|
||||||
else:
|
else:
|
||||||
fixed_ip_set.append({'subnet_id': subnet_id})
|
fixed_ip_set.append({'subnet_id': subnet_id})
|
||||||
|
if len(fixed_ip_set) > cfg.CONF.max_fixed_ips_per_port:
|
||||||
|
msg = _('Exceeded maximim amount of fixed ips per port')
|
||||||
|
raise q_exc.InvalidInput(error_message=msg)
|
||||||
return fixed_ip_set
|
return fixed_ip_set
|
||||||
|
|
||||||
def _allocate_fixed_ips(self, context, network, fixed_ips):
|
def _allocate_fixed_ips(self, context, network, fixed_ips):
|
||||||
@ -636,6 +639,11 @@ class QuantumDbPluginV2(quantum_plugin_base_v2.QuantumPluginBaseV2):
|
|||||||
"""Add or remove IPs from the port."""
|
"""Add or remove IPs from the port."""
|
||||||
ips = []
|
ips = []
|
||||||
|
|
||||||
|
# the new_ips contain all of the fixed_ips that are to be updated
|
||||||
|
if len(new_ips) > cfg.CONF.max_fixed_ips_per_port:
|
||||||
|
msg = _('Exceeded maximim amount of fixed ips per port')
|
||||||
|
raise q_exc.InvalidInput(error_message=msg)
|
||||||
|
|
||||||
# Remove all of the intersecting elements
|
# Remove all of the intersecting elements
|
||||||
for original_ip in original_ips[:]:
|
for original_ip in original_ips[:]:
|
||||||
for new_ip in new_ips[:]:
|
for new_ip in new_ips[:]:
|
||||||
|
@ -750,3 +750,9 @@ class TestMidonetPortsV2(test_plugin.TestPortsV2,
|
|||||||
|
|
||||||
def test_list_ports_with_sort_emulated(self):
|
def test_list_ports_with_sort_emulated(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def test_max_fixed_ips_exceeded(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def test_update_max_fixed_ips_exceeded(self):
|
||||||
|
pass
|
||||||
|
@ -1745,6 +1745,38 @@ fixed_ips=ip_address%%3D%s&fixed_ips=ip_address%%3D%s&fixed_ips=subnet_id%%3D%s
|
|||||||
self.assertEqual(update_context._recycled_networks,
|
self.assertEqual(update_context._recycled_networks,
|
||||||
set([subnet['subnet']['network_id']]))
|
set([subnet['subnet']['network_id']]))
|
||||||
|
|
||||||
|
def test_max_fixed_ips_exceeded(self):
|
||||||
|
with self.subnet(gateway_ip='10.0.0.3',
|
||||||
|
cidr='10.0.0.0/24') as subnet:
|
||||||
|
kwargs = {"fixed_ips":
|
||||||
|
[{'subnet_id': subnet['subnet']['id']},
|
||||||
|
{'subnet_id': subnet['subnet']['id']},
|
||||||
|
{'subnet_id': subnet['subnet']['id']},
|
||||||
|
{'subnet_id': subnet['subnet']['id']},
|
||||||
|
{'subnet_id': subnet['subnet']['id']},
|
||||||
|
{'subnet_id': subnet['subnet']['id']}]}
|
||||||
|
net_id = subnet['subnet']['network_id']
|
||||||
|
res = self._create_port(self.fmt, net_id=net_id, **kwargs)
|
||||||
|
self.assertEqual(res.status_int, 400)
|
||||||
|
|
||||||
|
def test_update_max_fixed_ips_exceeded(self):
|
||||||
|
with self.subnet(gateway_ip='10.0.0.3',
|
||||||
|
cidr='10.0.0.0/24') as subnet:
|
||||||
|
with self.port(subnet) as port:
|
||||||
|
data = {'port': {'fixed_ips':
|
||||||
|
[{'subnet_id': subnet['subnet']['id'],
|
||||||
|
'ip_address': '10.0.0.2'},
|
||||||
|
{'subnet_id': subnet['subnet']['id'],
|
||||||
|
'ip_address': '10.0.0.4'},
|
||||||
|
{'subnet_id': subnet['subnet']['id']},
|
||||||
|
{'subnet_id': subnet['subnet']['id']},
|
||||||
|
{'subnet_id': subnet['subnet']['id']},
|
||||||
|
{'subnet_id': subnet['subnet']['id']}]}}
|
||||||
|
req = self.new_update_request('ports', data,
|
||||||
|
port['port']['id'])
|
||||||
|
res = req.get_response(self.api)
|
||||||
|
self.assertEqual(res.status_int, 400)
|
||||||
|
|
||||||
|
|
||||||
class TestNetworksV2(QuantumDbPluginV2TestCase):
|
class TestNetworksV2(QuantumDbPluginV2TestCase):
|
||||||
# NOTE(cerberus): successful network update and delete are
|
# NOTE(cerberus): successful network update and delete are
|
||||||
|
Loading…
Reference in New Issue
Block a user