diff options
-rw-r--r-- | nova/db/api.py | 5 | ||||
-rw-r--r-- | nova/db/sqlalchemy/api.py | 14 | ||||
-rw-r--r-- | nova/network/manager.py | 18 |
3 files changed, 23 insertions, 14 deletions
diff --git a/nova/db/api.py b/nova/db/api.py index ecfcfab15..13873936b 100644 --- a/nova/db/api.py +++ b/nova/db/api.py @@ -497,6 +497,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 cb3d69f78..970332896 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -1195,6 +1195,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 7b69c7a36..91b1c92d7 100644 --- a/nova/network/manager.py +++ b/nova/network/manager.py @@ -1926,21 +1926,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): |