summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVishvananda Ishaya <vishvananda@gmail.com>2011-12-16 16:02:54 -0800
committerVishvananda Ishaya <vishvananda@gmail.com>2011-12-16 16:07:11 -0800
commitfb6850a5b9d7d61a4bb96af8d1cd516fd139c1f8 (patch)
tree36dc6763d3aeac996616f79dae25391cad6a755e
parent106ea5eda8458b44846207a3df69cf1837789828 (diff)
downloadnova-fb6850a5b9d7d61a4bb96af8d1cd516fd139c1f8.tar.gz
nova-fb6850a5b9d7d61a4bb96af8d1cd516fd139c1f8.tar.xz
nova-fb6850a5b9d7d61a4bb96af8d1cd516fd139c1f8.zip
Makes disassociate by timeout work with multi-host
* fixes bug 898485 * updates timeout query to key off of instance host as well * removes unused status=1 in related query Change-Id: Ia11b3d4d3db930eb31ccc2f74635971ba6edc32c
-rw-r--r--nova/db/sqlalchemy/api.py25
1 files changed, 17 insertions, 8 deletions
diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py
index c8ac5ca44..2163ba8ca 100644
--- a/nova/db/sqlalchemy/api.py
+++ b/nova/db/sqlalchemy/api.py
@@ -32,6 +32,7 @@ from nova import log as logging
from nova.compute import vm_states
from nova.db.sqlalchemy import models
from nova.db.sqlalchemy.session import get_session
+from sqlalchemy import and_
from sqlalchemy import or_
from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import joinedload
@@ -774,16 +775,25 @@ def fixed_ip_disassociate(context, address):
@require_admin_context
def fixed_ip_disassociate_all_by_timeout(context, host, time):
session = get_session()
- inner_q = model_query(context, models.Network.id, session=session,
- read_deleted="yes").\
- filter_by(host=host).\
+ # NOTE(vish): only update fixed ips that "belong" to this
+ # host; i.e. the network host or the instance
+ # host matches. Inner queries necessary because
+ # join with update doesn't work.
+ host_filter = or_(and_(models.Instance.host == host,
+ models.Network.multi_host == True),
+ models.Network.host == host)
+ subq = model_query(context, models.FixedIp.id, session=session,
+ read_deleted="yes").\
+ filter(models.FixedIp.updated_at < time).\
+ filter(models.FixedIp.instance_id != None).\
+ filter(models.FixedIp.allocated == False).\
+ join(models.FixedIp.instance).\
+ join(models.FixedIp.network).\
+ filter(host_filter).\
subquery()
result = model_query(context, models.FixedIp, session=session,
read_deleted="yes").\
- filter(models.FixedIp.network_id.in_(inner_q)).\
- filter(models.FixedIp.updated_at < time).\
- filter(models.FixedIp.instance_id != None).\
- filter_by(allocated=False).\
+ filter(models.FixedIp.id.in_(subq)).\
update({'instance_id': None,
'leased': False,
'updated_at': utils.utcnow()},
@@ -826,7 +836,6 @@ def fixed_ip_get_all_by_instance_host(context, host=None):
result = model_query(context, models.FixedIp, read_deleted="yes").\
options(joinedload('floating_ips')).\
join(models.FixedIp.instance).\
- filter_by(state=1).\
filter_by(host=host).\
all()