From 6857fd2d952e5602a227a5f24173c75ba3e70f7b Mon Sep 17 00:00:00 2001 From: John Garbutt Date: Wed, 29 Feb 2012 11:28:12 +0000 Subject: Fixes bug 943188 Enusre when an aggregate is re-created, it is in the created state, not just the state it was when last created. Change-Id: Ie8d63e3d334a872d52d81a9bd66730f08323d5c9 --- nova/compute/api.py | 2 -- nova/db/sqlalchemy/api.py | 9 +++++---- nova/tests/test_db_api.py | 3 +++ 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/nova/compute/api.py b/nova/compute/api.py index 0aee6dc2f..9c5323911 100644 --- a/nova/compute/api.py +++ b/nova/compute/api.py @@ -1710,8 +1710,6 @@ class AggregateAPI(base.Base): raise exception.InvalidAggregateAction(action='delete', aggregate_id=aggregate_id, reason='not empty') - values = {'operational_state': aggregate_states.DISMISSED} - self.db.aggregate_update(context, aggregate_id, values) self.db.aggregate_delete(context, aggregate_id) def add_host_to_aggregate(self, context, aggregate_id, host): diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index ba3c12b41..9fff21050 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -4303,15 +4303,15 @@ def aggregate_create(context, values, metadata=None): values['name'], session=session, read_deleted='yes').first() + values.setdefault('operational_state', aggregate_states.CREATED) if not aggregate: aggregate = models.Aggregate() - values.setdefault('operational_state', aggregate_states.CREATED) aggregate.update(values) aggregate.save(session=session) elif aggregate.deleted: - aggregate.update({'deleted': False, - 'deleted_at': None, - 'availability_zone': values['availability_zone']}) + values['deleted'] = False + values['deleted_at'] = None + aggregate.update(values) aggregate.save(session=session) else: raise exception.AggregateNameExists(aggregate_name=values['name']) @@ -4380,6 +4380,7 @@ def aggregate_delete(context, aggregate_id): if query.first(): query.update({'deleted': True, 'deleted_at': utils.utcnow(), + 'operational_state': aggregate_states.DISMISSED, 'updated_at': literal_column('updated_at')}) else: raise exception.AggregateNotFound(aggregate_id=aggregate_id) diff --git a/nova/tests/test_db_api.py b/nova/tests/test_db_api.py index 7236f6167..a8fe53223 100644 --- a/nova/tests/test_db_api.py +++ b/nova/tests/test_db_api.py @@ -336,6 +336,7 @@ class AggregateDBApiTestCase(test.TestCase): r2 = _create_aggregate(values=values) self.assertEqual(r2.name, values['name']) self.assertEqual(r2.availability_zone, values['availability_zone']) + self.assertEqual(r2.operational_state, "created") def test_aggregate_create_raise_exist_exc(self): """Ensure aggregate names are distinct.""" @@ -412,6 +413,8 @@ class AggregateDBApiTestCase(test.TestCase): db.aggregate_delete(ctxt, result['id']) expected = db.aggregate_get_all(ctxt, read_deleted='no') self.assertEqual(0, len(expected)) + aggregate = db.aggregate_get(ctxt, result['id'], read_deleted='yes') + self.assertEqual(aggregate["operational_state"], "dismissed") def test_aggregate_update(self): """Ensure an aggregate can be updated.""" -- cgit