diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index 0789515e74e1..10ab8111f781 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -1833,11 +1833,15 @@ def instance_create(context, values): def _instance_data_get_for_user(context, project_id, user_id): + not_soft_deleted = or_( + models.Instance.vm_state != vm_states.SOFT_DELETED, + models.Instance.vm_state == null() + ) result = model_query(context, models.Instance, ( func.count(models.Instance.id), func.sum(models.Instance.vcpus), func.sum(models.Instance.memory_mb))).\ - filter_by(project_id=project_id) + filter_by(project_id=project_id).filter(not_soft_deleted) if user_id: result = result.filter_by(user_id=user_id).first() else: diff --git a/nova/tests/unit/db/test_db_api.py b/nova/tests/unit/db/test_db_api.py index 4751d7bb0f88..a01440cf44a4 100644 --- a/nova/tests/unit/db/test_db_api.py +++ b/nova/tests/unit/db/test_db_api.py @@ -1347,6 +1347,24 @@ class SqlAlchemyDbApiTestCase(DbTestCase): filters={}, sort_keys=keys) + def test_instance_data_get_for_user(self): + ctxt = context.get_admin_context() + instance_1 = self.create_instance_with_args(project_id='project-HHD') + self.create_instance_with_args(project_id='project-HHD') + + @sqlalchemy_api.pick_context_manager_reader + def test(context): + return sqlalchemy_api._instance_data_get_for_user( + context, 'project-HHD', None) + + inst_num, _, _ = test(ctxt) + self.assertEqual(2, inst_num) + + db.instance_update(ctxt, instance_1['uuid'], + {"vm_state": vm_states.SOFT_DELETED}) + inst_num_2, _, _ = test(ctxt) + self.assertEqual(1, inst_num_2) + class ProcessSortParamTestCase(test.TestCase):