summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nova/db/sqlalchemy/api.py28
-rw-r--r--nova/tests/test_db_api.py26
2 files changed, 37 insertions, 17 deletions
diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py
index 5567ad811..5317487cd 100644
--- a/nova/db/sqlalchemy/api.py
+++ b/nova/db/sqlalchemy/api.py
@@ -891,15 +891,12 @@ def _floating_ip_get_by_address(context, address, session=None):
@require_context
def floating_ip_get_by_fixed_address(context, fixed_address):
- subq = model_query(context, models.FixedIp.id).\
- filter_by(address=fixed_address).\
- limit(1).\
- subquery()
return model_query(context, models.FloatingIp).\
- filter_by(fixed_ip_id=subq.as_scalar()).\
- all()
-
- # NOTE(tr3buchet) please don't invent an exception here, empty list is fine
+ outerjoin(models.FixedIp,
+ models.FixedIp.id ==
+ models.FloatingIp.fixed_ip_id).\
+ filter(models.FixedIp.address == fixed_address).\
+ all()
@require_context
@@ -1197,15 +1194,12 @@ def fixed_ip_get_by_address_detailed(context, address, session=None):
@require_context
def fixed_ip_get_by_floating_address(context, floating_address):
- subq = model_query(context, models.FloatingIp.fixed_ip_id,
- read_deleted="no").\
- filter_by(address=floating_address).\
- limit(1).\
- subquery()
- return model_query(context, models.FixedIp, read_deleted="no").\
- filter_by(id=subq.as_scalar()).\
- first()
-
+ return model_query(context, models.FixedIp).\
+ outerjoin(models.FloatingIp,
+ models.FloatingIp.fixed_ip_id ==
+ models.FixedIp.id).\
+ filter(models.FloatingIp.address == floating_address).\
+ first()
# NOTE(tr3buchet) please don't invent an exception here, empty list is fine
diff --git a/nova/tests/test_db_api.py b/nova/tests/test_db_api.py
index c70e96cdc..e43a32c19 100644
--- a/nova/tests/test_db_api.py
+++ b/nova/tests/test_db_api.py
@@ -261,6 +261,32 @@ class DbApiTestCase(test.TestCase):
res = db.floating_ip_disassociate(ctxt, floating)
self.assertEqual(res, None)
+ def test_fixed_ip_get_by_floating_address(self):
+ ctxt = context.get_admin_context()
+ values = {'address': 'fixed'}
+ fixed = db.fixed_ip_create(ctxt, values)
+ fixed_ip_ref = db.fixed_ip_get_by_address(ctxt, fixed)
+ values = {'address': 'floating',
+ 'fixed_ip_id': fixed_ip_ref['id']}
+ floating = db.floating_ip_create(ctxt, values)
+ fixed_ip_ref = db.fixed_ip_get_by_floating_address(ctxt, floating)
+ self.assertEqual(fixed, fixed_ip_ref['address'])
+
+ def test_floating_ip_get_by_fixed_address(self):
+ ctxt = context.get_admin_context()
+ values = {'address': 'fixed'}
+ fixed = db.fixed_ip_create(ctxt, values)
+ fixed_ip_ref = db.fixed_ip_get_by_address(ctxt, fixed)
+ values = {'address': 'floating1',
+ 'fixed_ip_id': fixed_ip_ref['id']}
+ floating1 = db.floating_ip_create(ctxt, values)
+ values = {'address': 'floating2',
+ 'fixed_ip_id': fixed_ip_ref['id']}
+ floating2 = db.floating_ip_create(ctxt, values)
+ floating_ip_refs = db.floating_ip_get_by_fixed_address(ctxt, fixed)
+ self.assertEqual(floating1, floating_ip_refs[0]['address'])
+ self.assertEqual(floating2, floating_ip_refs[1]['address'])
+
def test_network_create_safe(self):
ctxt = context.get_admin_context()
values = {'host': 'localhost', 'project_id': 'project1'}