Merge "Optimize db.instance_floating_address_get_all method"
This commit is contained in:
@@ -1914,14 +1914,23 @@ def instance_get_floating_address(context, instance_id):
|
||||
|
||||
@require_context
|
||||
def instance_floating_address_get_all(context, instance_uuid):
|
||||
fixed_ips = fixed_ip_get_by_instance(context, instance_uuid)
|
||||
if not uuidutils.is_uuid_like(instance_uuid):
|
||||
raise exception.InvalidUUID(uuid=instance_uuid)
|
||||
|
||||
floating_ips = []
|
||||
for fixed_ip in fixed_ips:
|
||||
_floating_ips = floating_ip_get_by_fixed_ip_id(context, fixed_ip['id'])
|
||||
floating_ips += _floating_ips
|
||||
fixed_ip_ids = model_query(context, models.FixedIp.id,
|
||||
base_model=models.FixedIp).\
|
||||
filter_by(instance_uuid=instance_uuid).\
|
||||
all()
|
||||
if not fixed_ip_ids:
|
||||
raise exception.FixedIpNotFoundForInstance(instance_uuid=instance_uuid)
|
||||
|
||||
return floating_ips
|
||||
fixed_ip_ids = [fixed_ip_id.id for fixed_ip_id in fixed_ip_ids]
|
||||
|
||||
floating_ips = model_query(context, models.FloatingIp.address,
|
||||
base_model=models.FloatingIp).\
|
||||
filter(models.FloatingIp.fixed_ip_id.in_(fixed_ip_ids)).\
|
||||
all()
|
||||
return [floating_ip.address for floating_ip in floating_ips]
|
||||
|
||||
|
||||
@require_admin_context
|
||||
|
||||
@@ -484,7 +484,7 @@ class API(base.Base):
|
||||
def _get_floating_ip_addresses(self, context, instance):
|
||||
floating_ips = self.db.instance_floating_address_get_all(context,
|
||||
instance['uuid'])
|
||||
return [floating_ip['address'] for floating_ip in floating_ips]
|
||||
return floating_ips
|
||||
|
||||
@wrap_check_policy
|
||||
def migrate_instance_start(self, context, instance, migration):
|
||||
|
||||
@@ -1024,6 +1024,34 @@ class DbApiTestCase(DbTestCase):
|
||||
self.assertEqual(db.network_in_use_on_host(ctxt, 1, 'foo'), True)
|
||||
self.assertEqual(db.network_in_use_on_host(ctxt, 1, 'bar'), False)
|
||||
|
||||
def test_instance_floating_address_get_all(self):
|
||||
ctxt = context.get_admin_context()
|
||||
|
||||
instance1 = db.instance_create(ctxt, {'host': 'h1', 'hostname': 'n1'})
|
||||
instance2 = db.instance_create(ctxt, {'host': 'h2', 'hostname': 'n2'})
|
||||
|
||||
fixed_addresses = ['1.1.1.1', '1.1.1.2', '1.1.1.3']
|
||||
float_addresses = ['2.1.1.1', '2.1.1.2', '2.1.1.3']
|
||||
instance_uuids = [instance1['uuid'], instance1['uuid'],
|
||||
instance2['uuid']]
|
||||
|
||||
for fixed_addr, float_addr, instance_uuid in zip(fixed_addresses,
|
||||
float_addresses,
|
||||
instance_uuids):
|
||||
db.fixed_ip_create(ctxt, {'address': fixed_addr,
|
||||
'instance_uuid': instance_uuid})
|
||||
fixed_id = db.fixed_ip_get_by_address(ctxt, fixed_addr)['id']
|
||||
db.floating_ip_create(ctxt,
|
||||
{'address': float_addr,
|
||||
'fixed_ip_id': fixed_id})
|
||||
|
||||
real_float_addresses = \
|
||||
db.instance_floating_address_get_all(ctxt, instance_uuids[0])
|
||||
self.assertEqual(set(float_addresses[:2]), set(real_float_addresses))
|
||||
real_float_addresses = \
|
||||
db.instance_floating_address_get_all(ctxt, instance_uuids[2])
|
||||
self.assertEqual(set([float_addresses[2]]), set(real_float_addresses))
|
||||
|
||||
def test_get_vol_mapping_non_admin(self):
|
||||
ref = db.ec2_volume_create(self.context, 'fake-uuid')
|
||||
ec2_id = db.get_ec2_volume_id_by_uuid(self.context, 'fake-uuid')
|
||||
|
||||
Reference in New Issue
Block a user