Merge "Don't set cluster in cluster deletion task"

This commit is contained in:
Jenkins 2016-04-06 10:23:21 +00:00 committed by Gerrit Code Review
commit e9d6680359
6 changed files with 39 additions and 18 deletions

View File

@ -64,16 +64,17 @@ class ClusterHandler(SingleHandler):
"""
cluster = self.get_object_or_404(self.single, obj_id)
task_manager = ClusterDeletionManager(cluster_id=cluster.id)
task = None
try:
logger.debug('Trying to execute cluster deletion task')
task_manager.execute()
task = task_manager.execute()
except Exception as e:
logger.warn('Error while execution '
'cluster deletion task: %s' % str(e))
logger.warn(traceback.format_exc())
raise self.http(400, str(e))
raise self.http(202, '{}')
raise self.http(202, objects.Task.to_json(task))
class ClusterCollectionHandler(CollectionHandler):

View File

@ -86,7 +86,7 @@ class Cluster(Base):
release_id = Column(Integer, ForeignKey('releases.id'), nullable=False)
nodes = relationship(
"Node", backref="cluster", cascade="delete", order_by='Node.id')
tasks = relationship("Task", backref="cluster", cascade="delete")
tasks = relationship("Task", backref="cluster")
plugin_links = relationship(
"ClusterPluginLink", backref="cluster", cascade="delete")
attributes = relationship("Attributes", uselist=False,

View File

@ -309,9 +309,12 @@ class Task(NailgunObject):
cls._update_parent_instance(instance.parent)
@classmethod
def delete(cls, instance):
logger.debug("Mark task as deleted: %s", instance.uuid)
cls.update(instance, {'deleted_at': datetime.utcnow()})
def delete(cls, instance, hard=False):
if hard:
super(Task, cls).delete(instance)
else:
logger.debug("Mark task as deleted: %s", instance.uuid)
cls.update(instance, {'deleted_at': datetime.utcnow()})
@classmethod
def bulk_delete(cls, instance_ids):

View File

@ -182,6 +182,11 @@ class NailgunReceiver(object):
nm = objects.Cluster.get_network_manager(cluster)
admin_nets = nm.get_admin_networks()
objects.Task.delete(task)
for task_ in cluster.tasks:
if task_ != task:
objects.Task.delete(task_, hard=True)
objects.Cluster.delete(cluster)
if admin_nets != nm.get_admin_networks():
# import it here due to cyclic dependencies problem

View File

@ -70,15 +70,14 @@ class TestCharsetIssues(BaseIntegrationTest):
progress=50,
)
self.app.delete(
resp = self.app.delete(
reverse(
'ClusterHandler',
kwargs={'obj_id': cluster_id}),
headers=self.default_headers
)
task_delete = self.db.query(models.Task).filter_by(
cluster_id=cluster_id,
name="cluster_deletion"
uuid=resp.json['uuid']
).first()
NailgunReceiver.remove_cluster_resp(
task_uuid=task_delete.uuid,

View File

@ -49,6 +49,13 @@ class TestTaskManagers(BaseIntegrationTest):
def check_node_presence(self, nodes_count):
return self.db.query(models.Node).count() == nodes_count
def check_cluster_deletion_task(self, task_):
self.assertEqual(task_.name, consts.TASK_NAMES.cluster_deletion)
self.assertEqual(task_.status, consts.TASK_STATUSES.ready)
self.assertEqual(task_.progress, 100)
self.assertEqual(task_.cluster_id, None)
self.assertNotEqual(task_.deleted_at, None)
@fake_tasks(override_state={"progress": 100, "status": "ready"})
def test_deployment_task_managers(self):
cluster = self.env.create(
@ -499,9 +506,9 @@ class TestTaskManagers(BaseIntegrationTest):
self.assertIsNotNone(notification)
tasks = self.db.query(models.Task).all()
# (mihgen) there is cascade removal of task when cluster is removed
# may need a change for store-deployment-tasks-history blueprint
self.assertEqual(tasks, [])
self.assertEqual(len(tasks), 1)
self.check_cluster_deletion_task(tasks[0])
@fake_tasks()
def test_deletion_cluster_task_manager(self):
@ -530,7 +537,9 @@ class TestTaskManagers(BaseIntegrationTest):
self.assertIsNone(self.db.query(models.Cluster).get(cluster_id))
tasks = self.db.query(models.Task).all()
self.assertEqual(tasks, [])
self.assertEqual(len(tasks), 1)
self.check_cluster_deletion_task(tasks[0])
@fake_tasks(tick_interval=10, tick_count=5)
def test_deletion_clusters_one_by_one(self):
@ -587,7 +596,10 @@ class TestTaskManagers(BaseIntegrationTest):
self.assertIsNotNone(notification)
tasks = self.db.query(models.Task).all()
self.assertEqual(tasks, [])
self.assertEqual(len(tasks), 2)
for task_ in tasks:
self.check_cluster_deletion_task(task_)
@fake_tasks(recover_nodes=False, fake_rpc=False)
def test_deletion_during_deployment(self, mock_rpc):
@ -610,15 +622,14 @@ class TestTaskManagers(BaseIntegrationTest):
progress=50,
)
self.app.delete(
resp = self.app.delete(
reverse(
'ClusterHandler',
kwargs={'obj_id': cluster_id}),
headers=self.default_headers
)
task_delete = self.db.query(models.Task).filter_by(
cluster_id=cluster_id,
name="cluster_deletion"
uuid=resp.json_body['uuid'],
).first()
NailgunReceiver.remove_cluster_resp(
task_uuid=task_delete.uuid,
@ -679,7 +690,9 @@ class TestTaskManagers(BaseIntegrationTest):
self.assertIsNotNone(notification)
tasks = self.db.query(models.Task).all()
self.assertEqual(tasks, [])
self.assertEqual(len(tasks), 1)
self.check_cluster_deletion_task(tasks[0])
@fake_tasks()
def test_no_node_no_cry(self):