summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nova/db/api.py5
-rw-r--r--nova/db/sqlalchemy/api.py14
-rw-r--r--nova/network/manager.py18
3 files changed, 23 insertions, 14 deletions
diff --git a/nova/db/api.py b/nova/db/api.py
index 3a57e71af..6527add23 100644
--- a/nova/db/api.py
+++ b/nova/db/api.py
@@ -494,6 +494,11 @@ def fixed_ip_get_by_address_detailed(context, address):
return IMPL.fixed_ip_get_by_address_detailed(context, address)
+def fixed_ip_get_by_floating_address(context, floating_address):
+ """Get a fixed ip by a floating address."""
+ return IMPL.fixed_ip_get_by_floating_address(context, floating_address)
+
+
def fixed_ip_get_by_instance(context, instance_uuid):
"""Get fixed ips by instance or raise if none exist."""
return IMPL.fixed_ip_get_by_instance(context, instance_uuid)
diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py
index 698f79317..a152da98c 100644
--- a/nova/db/sqlalchemy/api.py
+++ b/nova/db/sqlalchemy/api.py
@@ -1196,6 +1196,20 @@ 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()
+
+ # NOTE(tr3buchet) please don't invent an exception here, empty list is fine
+
+
+@require_context
def fixed_ip_get_by_instance(context, instance_uuid):
if not uuidutils.is_uuid_like(instance_uuid):
raise exception.InvalidUUID(uuid=instance_uuid)
diff --git a/nova/network/manager.py b/nova/network/manager.py
index 8d9255dac..7ad5af5bf 100644
--- a/nova/network/manager.py
+++ b/nova/network/manager.py
@@ -1924,21 +1924,11 @@ class NetworkManager(manager.SchedulerDependentManager):
def get_instance_id_by_floating_address(self, context, address):
"""Returns the instance id a floating ip's fixed ip is allocated to."""
- floating_ip = self.db.floating_ip_get_by_address(context, address)
- if floating_ip['fixed_ip_id'] is None:
+ fixed_ip = self.db.fixed_ip_get_by_floating_address(context, address)
+ if fixed_ip is None:
return None
-
- fixed_ip = self.db.fixed_ip_get(context, floating_ip['fixed_ip_id'])
-
- # NOTE(tr3buchet): this can be None
- # NOTE(mikal): we need to return the instance id here because its used
- # by ec2 (and possibly others)
- uuid = fixed_ip['instance_uuid']
- if not uuid:
- return uuid
-
- instance = self.db.instance_get_by_uuid(context, uuid)
- return instance['id']
+ else:
+ return fixed_ip['instance_uuid']
@wrap_check_policy
def get_network(self, context, network_uuid):