missing test for None in sqlalchemy query filter

Bug #1294756 reported by Chris Friesen
8
This bug affects 1 person
Affects Status Importance Assigned to Milestone
OpenStack Compute (nova)
Fix Released
Undecided
Chris Friesen

Bug Description

In db.sqlalchemy.api.instance_get_all_by_filters() there is code that looks like this:

if not filters.pop('soft_deleted', False):
    query_prefix = query_prefix.\
        filter(models.Instance.vm_state != vm_states.SOFT_DELETED)

In sqlalchemy a comparison against a non-null value will not match null values, so the above filter will not return objects where vm_state is NULL.

The problem is that in the Instance object the "vm_state" field is declared as nullable. In many cases "vm_state" will in fact have a value, but in get_test_instance() in test/utils.py the value of "vm_state" is not specified.

Given the above, it seems that either we need to configure "models.Instance.vm_state" as not nullable (and deal with the fallout), or else we need to update instance_get_all_by_filters() to explicitly check for None--something like this perhaps:

if not filters.pop('soft_deleted', False):
    query_prefix = query_prefix.\
        filter(or_(models.Instance.vm_state != vm_states.SOFT_DELETED,
                   models.Instance.vm_state == None))

If we want to fix the query, I'll happily submit the updated code.

Tags: db
Aaron Rosen (arosen)
tags: added: db
Chris Friesen (cbf123)
Changed in nova:
assignee: nobody → Chris Friesen (cbf123)
Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Fix proposed to nova (master)

Fix proposed to branch: master
Review: https://review.openstack.org/82869

Changed in nova:
status: New → In Progress
Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Fix merged to nova (master)

Reviewed: https://review.openstack.org/82869
Committed: https://git.openstack.org/cgit/openstack/nova/commit/?id=0aecc86987794e3cb433723afbec744a11e1e720
Submitter: Jenkins
Branch: master

commit 0aecc86987794e3cb433723afbec744a11e1e720
Author: Chris Friesen <email address hidden>
Date: Tue Mar 25 08:29:58 2014 -0600

    Add missing test for None in sqlalchemy query filter

    In sqlalchemy a comparison against a non-null value will not match
    null values, so the existing code at the end of
    db.sqlalchemy.api.instance_get_all_by_filters() will not return
    instances where vm_state is NULL.

    This would be fine if the vm_state could never be null, but it
    is declared as "nullable" in the Instance object. In many cases
    "vm_state" will in fact have a value, but not all--in
    get_test_instance() in test/utils.py the value of "vm_state" is not
    specified. There may be other similar cases.

    Accordingly, this commit updates the test to explicitly check for None.

    Without this fix the unit tests for bug 1292963 will fail because
    the test instances have a vm_state of None.

    Closes-Bug: 1294756
    Related-Bug: 1292963
    Change-Id: I271cff22dec160fd0e76abadefd0fe06d32c3227

Changed in nova:
status: In Progress → Fix Committed
Changed in nova:
milestone: none → icehouse-rc1
Thierry Carrez (ttx)
Changed in nova:
status: Fix Committed → Fix Released
Thierry Carrez (ttx)
Changed in nova:
milestone: icehouse-rc1 → 2014.1
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.