Static driver: fix node registration
After fulfilling a node request from zuul, it was possible for the static driver to not have an accurate representation of the nodes that were registered in ZK. It needs to re-read from ZK on each node deletion notification. Change-Id: I82e6934edabcb0c720e15593fb38e8fcfafa121c
This commit is contained in:
@@ -165,11 +165,11 @@ class StaticNodeProvider(Provider):
|
||||
|
||||
def _start(self, zk_conn):
|
||||
self.zk = zk_conn
|
||||
self.registered = self.getRegisteredNodeHostnames()
|
||||
registered = self.getRegisteredNodeHostnames()
|
||||
|
||||
for pool in self.provider.pools.values():
|
||||
for node in pool.nodes:
|
||||
current_count = self.registered[node["name"]]
|
||||
current_count = registered[node["name"]]
|
||||
|
||||
# Register nodes to synchronize with our configuration.
|
||||
if current_count < node["max-parallel-jobs"]:
|
||||
@@ -197,10 +197,10 @@ class StaticNodeProvider(Provider):
|
||||
# De-register nodes to synchronize with our configuration.
|
||||
# This case covers any registered nodes that no longer appear in
|
||||
# the config.
|
||||
for hostname in list(self.registered):
|
||||
for hostname in list(registered):
|
||||
if hostname not in self.static_nodes:
|
||||
try:
|
||||
self.deregisterNode(self.registered[hostname], hostname)
|
||||
self.deregisterNode(registered[hostname], hostname)
|
||||
except Exception:
|
||||
self.log.exception("Couldn't deregister static node:")
|
||||
continue
|
||||
@@ -248,7 +248,13 @@ class StaticNodeProvider(Provider):
|
||||
return
|
||||
|
||||
static_node = self.static_nodes[node.hostname]
|
||||
current_count = self.registered[node.hostname]
|
||||
try:
|
||||
registered = self.getRegisteredNodeHostnames()
|
||||
except Exception:
|
||||
self.log.exception(
|
||||
"Cannot get registered hostnames for node re-registration:")
|
||||
return
|
||||
current_count = registered[node.hostname]
|
||||
|
||||
# It's possible we were not able to de-register nodes due to a config
|
||||
# change (because they were in use). In that case, don't bother to
|
||||
|
||||
@@ -200,3 +200,33 @@ class TestDriverStatic(tests.DBTestCase):
|
||||
req = self.waitForNodeRequest(req)
|
||||
self.assertEqual(req.state, zk.FULFILLED)
|
||||
self.assertEqual(len(req.nodes), 1)
|
||||
|
||||
def test_static_request_handled(self):
|
||||
'''
|
||||
Test that a node is reregistered after handling a request.
|
||||
'''
|
||||
configfile = self.setup_config('static-basic.yaml')
|
||||
pool = self.useNodepool(configfile, watermark_sleep=1)
|
||||
pool.start()
|
||||
nodes = self.waitForNodes('fake-label')
|
||||
self.assertEqual(len(nodes), 1)
|
||||
|
||||
req = zk.NodeRequest()
|
||||
req.state = zk.REQUESTED
|
||||
req.node_types.append('fake-label')
|
||||
self.zk.storeNodeRequest(req)
|
||||
|
||||
self.log.debug("Waiting for request %s", req.id)
|
||||
req = self.waitForNodeRequest(req)
|
||||
self.assertEqual(req.state, zk.FULFILLED)
|
||||
self.assertEqual(len(req.nodes), 1)
|
||||
self.assertEqual(req.nodes[0], nodes[0].id)
|
||||
|
||||
# Mark node as used
|
||||
nodes[0].state = zk.USED
|
||||
self.zk.storeNode(nodes[0])
|
||||
|
||||
# Our single node should have been used, deleted, then reregistered
|
||||
new_nodes = self.waitForNodes('fake-label')
|
||||
self.assertEqual(len(new_nodes), 1)
|
||||
self.assertEqual(nodes[0].hostname, new_nodes[0].hostname)
|
||||
|
||||
Reference in New Issue
Block a user