summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVishvananda Ishaya <vishvananda@gmail.com>2011-07-05 12:16:46 -0700
committerVishvananda Ishaya <vishvananda@gmail.com>2011-07-05 12:16:46 -0700
commit8d2f3f26e8089020616312334689f1c594a67b4f (patch)
treeca30611aebba56b6d8efa77f9fd894cf3d14a9d1
parent9a8254ef2751e1b7502107a9c6afe05ea1e2efd4 (diff)
make sure to filter out ips associated by host and add some sync for allocating ip to host
-rw-r--r--nova/db/sqlalchemy/api.py1
-rw-r--r--nova/network/manager.py13
2 files changed, 13 insertions, 1 deletions
diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py
index 6db142276..7065de00f 100644
--- a/nova/db/sqlalchemy/api.py
+++ b/nova/db/sqlalchemy/api.py
@@ -665,6 +665,7 @@ def fixed_ip_associate_pool(context, network_id, instance_id=None, host=None):
filter_by(reserved=False).\
filter_by(deleted=False).\
filter_by(instance=None).\
+ filter_by(host=None).\
with_lockmode('update').\
first()
# NOTE(vish): if with_lockmode isn't supported, as in sqlite,
diff --git a/nova/network/manager.py b/nova/network/manager.py
index 84d2cbbcb..55f81da9e 100644
--- a/nova/network/manager.py
+++ b/nova/network/manager.py
@@ -310,7 +310,18 @@ class NetworkManager(manager.SchedulerDependentManager):
If it is a multi_host network, get the ip assigned to this host,
otherwise, assume that dhcp is listening on the gateway."""
if network_ref['multi_host']:
- return self.db.network_get_host_ip(context, FLAGS.host)
+
+ @utils.synchronized('get_dhcp')
+ def _sync_get_dhcp_ip():
+ try:
+ return self.db.fixed_ip_get_by_network_host(context,
+ FLAGS.host)
+ except exception.FixedIpNotFoundForNetworkHost:
+ return self.db.fixed_ip_associate_pool(context.elevated(),
+ network_ref['id'],
+ host=FLAGS.host)
+ return _sync_get_dhcp_ip()
+
else:
return network_ref['gateway']