neutron: only list ports if there is a quota limit when validating
The list_ports call can take awhile if the project has a lot of ports. If it turns out that there is unlimited quota, then we don't even need to list the ports, so move that after the show_quota call. Partial-Bug: #1521788 Change-Id: I4d128f182283ffa4479934f640a67d9c536824b5
This commit is contained in:
parent
3f8c69b2ef
commit
bf027800f7
|
@ -1179,24 +1179,24 @@ class API(base_api.NetworkAPI):
|
|||
# from the hypervisor. So we just check the quota and return
|
||||
# how many of the requested number of instances can be created
|
||||
if ports_needed_per_instance:
|
||||
ports = neutron.list_ports(tenant_id=context.project_id)['ports']
|
||||
quotas = neutron.show_quota(tenant_id=context.project_id)['quota']
|
||||
if quotas.get('port', -1) == -1:
|
||||
# Unlimited Port Quota
|
||||
return num_instances
|
||||
|
||||
ports = neutron.list_ports(tenant_id=context.project_id)['ports']
|
||||
free_ports = quotas.get('port') - len(ports)
|
||||
if free_ports < 0:
|
||||
msg = (_("The number of defined ports: %(ports)d "
|
||||
"is over the limit: %(quota)d") %
|
||||
{'ports': len(ports),
|
||||
'quota': quotas.get('port')})
|
||||
raise exception.PortLimitExceeded(msg)
|
||||
ports_needed = ports_needed_per_instance * num_instances
|
||||
if free_ports >= ports_needed:
|
||||
return num_instances
|
||||
else:
|
||||
free_ports = quotas.get('port') - len(ports)
|
||||
if free_ports < 0:
|
||||
msg = (_("The number of defined ports: %(ports)d "
|
||||
"is over the limit: %(quota)d") %
|
||||
{'ports': len(ports),
|
||||
'quota': quotas.get('port')})
|
||||
raise exception.PortLimitExceeded(msg)
|
||||
ports_needed = ports_needed_per_instance * num_instances
|
||||
if free_ports >= ports_needed:
|
||||
return num_instances
|
||||
else:
|
||||
return free_ports // ports_needed_per_instance
|
||||
return free_ports // ports_needed_per_instance
|
||||
return num_instances
|
||||
|
||||
def _get_instance_uuids_by_ip(self, context, address):
|
||||
|
|
|
@ -1463,11 +1463,11 @@ class TestNeutronv2(TestNeutronv2Base):
|
|||
self.moxed_client.list_networks(
|
||||
id=mox.SameElementsAs(ids)).AndReturn(
|
||||
{'networks': self.nets2})
|
||||
self.moxed_client.list_ports(tenant_id='my_tenantid').AndReturn(
|
||||
{'ports': []})
|
||||
self.moxed_client.show_quota(
|
||||
tenant_id='my_tenantid').AndReturn(
|
||||
{'quota': {'port': 50}})
|
||||
self.moxed_client.list_ports(tenant_id='my_tenantid').AndReturn(
|
||||
{'ports': []})
|
||||
self.mox.ReplayAll()
|
||||
api = neutronapi.API()
|
||||
api.validate_networks(self.context, requested_networks, 1)
|
||||
|
@ -1479,8 +1479,6 @@ class TestNeutronv2(TestNeutronv2Base):
|
|||
self.moxed_client.list_networks(
|
||||
id=mox.SameElementsAs(ids)).AndReturn(
|
||||
{'networks': self.nets2})
|
||||
self.moxed_client.list_ports(tenant_id='my_tenantid').AndReturn(
|
||||
{'ports': []})
|
||||
self.moxed_client.show_quota(
|
||||
tenant_id='my_tenantid').AndReturn(
|
||||
{'quota': {}})
|
||||
|
@ -1493,11 +1491,11 @@ class TestNeutronv2(TestNeutronv2Base):
|
|||
self.moxed_client.list_networks(
|
||||
id=mox.SameElementsAs(['my_netid1'])).AndReturn(
|
||||
{'networks': self.nets1})
|
||||
self.moxed_client.list_ports(tenant_id='my_tenantid').AndReturn(
|
||||
{'ports': []})
|
||||
self.moxed_client.show_quota(
|
||||
tenant_id='my_tenantid').AndReturn(
|
||||
{'quota': {'port': 50}})
|
||||
self.moxed_client.list_ports(tenant_id='my_tenantid').AndReturn(
|
||||
{'ports': []})
|
||||
self.mox.ReplayAll()
|
||||
api = neutronapi.API()
|
||||
try:
|
||||
|
@ -1532,11 +1530,11 @@ class TestNeutronv2(TestNeutronv2Base):
|
|||
self.moxed_client.list_networks(
|
||||
id=mox.SameElementsAs(ids)).AndReturn(
|
||||
{'networks': self.nets1})
|
||||
self.moxed_client.list_ports(tenant_id='my_tenantid').AndReturn(
|
||||
{'ports': []})
|
||||
self.moxed_client.show_quota(
|
||||
tenant_id='my_tenantid').AndReturn(
|
||||
{'quota': {'port': 50}})
|
||||
self.moxed_client.list_ports(tenant_id='my_tenantid').AndReturn(
|
||||
{'ports': []})
|
||||
self.mox.ReplayAll()
|
||||
api = neutronapi.API()
|
||||
api.validate_networks(self.context, requested_networks, 1)
|
||||
|
@ -1725,11 +1723,11 @@ class TestNeutronv2(TestNeutronv2Base):
|
|||
self.moxed_client.list_networks(
|
||||
id=mox.SameElementsAs(ids)).AndReturn(
|
||||
{'networks': self.nets2})
|
||||
self.moxed_client.list_ports(tenant_id='my_tenantid').AndReturn(
|
||||
{'ports': self.port_data2})
|
||||
self.moxed_client.show_quota(
|
||||
tenant_id='my_tenantid').AndReturn(
|
||||
{'quota': {'port': 2}})
|
||||
self.moxed_client.list_ports(tenant_id='my_tenantid').AndReturn(
|
||||
{'ports': self.port_data2})
|
||||
self.mox.ReplayAll()
|
||||
api = neutronapi.API()
|
||||
max_count = api.validate_networks(self.context,
|
||||
|
@ -1750,11 +1748,11 @@ class TestNeutronv2(TestNeutronv2Base):
|
|||
self.moxed_client.list_networks(
|
||||
id=mox.SameElementsAs(ids)).AndReturn(
|
||||
{'networks': self.nets1})
|
||||
self.moxed_client.list_ports(tenant_id='my_tenantid').AndReturn(
|
||||
{'ports': self.port_data2})
|
||||
self.moxed_client.show_quota(
|
||||
tenant_id='my_tenantid').AndReturn(
|
||||
{'quota': {'port': 5}})
|
||||
self.moxed_client.list_ports(tenant_id='my_tenantid').AndReturn(
|
||||
{'ports': self.port_data2})
|
||||
self.mox.ReplayAll()
|
||||
api = neutronapi.API()
|
||||
max_count = api.validate_networks(self.context,
|
||||
|
@ -1787,11 +1785,11 @@ class TestNeutronv2(TestNeutronv2Base):
|
|||
self.moxed_client.list_networks(
|
||||
id=mox.SameElementsAs(ids)).AndReturn(
|
||||
{'networks': self.nets2})
|
||||
self.moxed_client.list_ports(tenant_id='my_tenantid').AndReturn(
|
||||
{'ports': self.port_data2})
|
||||
self.moxed_client.show_quota(
|
||||
tenant_id='my_tenantid').AndReturn(
|
||||
{'quota': {'port': 5}})
|
||||
self.moxed_client.list_ports(tenant_id='my_tenantid').AndReturn(
|
||||
{'ports': self.port_data2})
|
||||
self.mox.ReplayAll()
|
||||
api = neutronapi.API()
|
||||
max_count = api.validate_networks(self.context,
|
||||
|
@ -1809,8 +1807,6 @@ class TestNeutronv2(TestNeutronv2Base):
|
|||
self.moxed_client.list_networks(
|
||||
id=mox.SameElementsAs(ids)).AndReturn(
|
||||
{'networks': self.nets2})
|
||||
self.moxed_client.list_ports(tenant_id='my_tenantid').AndReturn(
|
||||
{'ports': self.port_data2})
|
||||
self.moxed_client.show_quota(
|
||||
tenant_id='my_tenantid').AndReturn(
|
||||
{'quota': {'port': -1}})
|
||||
|
|
Loading…
Reference in New Issue