From fb8bda31a30ee03a65707c230214abe411530e29 Mon Sep 17 00:00:00 2001 From: "James E. Blair" Date: Fri, 17 Jun 2016 10:29:18 -0700 Subject: [PATCH] Revoke nodes via gearman on deletion If a node is deleted without having run a job, the launcher it was assigned to will not know about it. Send it a notification. Change-Id: I9d44a3297aba2b05d64a97041de09f8140dbc295 Depends-On: Ib1dc0879e1cbbbdb6c0b16b6bb52ff9f8b98a25d --- nodepool/jobs.py | 9 +++++++++ nodepool/nodepool.py | 14 ++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/nodepool/jobs.py b/nodepool/jobs.py index 0bfd18d1c..eb86bc900 100644 --- a/nodepool/jobs.py +++ b/nodepool/jobs.py @@ -184,3 +184,12 @@ class NodeAssignmentJob(NodepoolJob): self.node_id = node_id job_name = 'node_assign:%s' % target_name super(NodeAssignmentJob, self).__init__(job_name, data, nodepool) + + +class NodeRevokeJob(NodepoolJob): + log = logging.getLogger("jobs.NodeRevokeJob") + + def __init__(self, node_id, manager_name, data, nodepool): + self.node_id = node_id + job_name = 'node_revoke:%s' % manager_name + super(NodeRevokeJob, self).__init__(job_name, data, nodepool) diff --git a/nodepool/nodepool.py b/nodepool/nodepool.py index eda233c8d..af7a13722 100644 --- a/nodepool/nodepool.py +++ b/nodepool/nodepool.py @@ -1819,6 +1819,13 @@ class NodePool(threading.Thread): finally: self._delete_threads_lock.release() + def revokeAssignedNode(self, node): + args = dict(name=node.nodename) + job = jobs.NodeRevokeJob(node.id, node.manager_name, + args, self) + self.gearman_client.submitJob(job, timeout=300) + # Do not wait for completion in case the manager is offline + def _deleteNode(self, session, node): self.log.debug("Deleting node id: %s which has been in %s " "state for %s hours" % @@ -1845,6 +1852,13 @@ class NodePool(threading.Thread): jenkins.deleteNode(jenkins_name) self.log.info("Deleted jenkins node id: %s" % node.id) + if node.manager_name is not None: + try: + self.revokeAssignedNode(node) + except Exception: + self.log.exception("Exception revoking node id: %s" % + node.id) + for subnode in node.subnodes: if subnode.external_id: try: