diff --git a/nodepool/builder.py b/nodepool/builder.py index 69138c58e..c85658598 100755 --- a/nodepool/builder.py +++ b/nodepool/builder.py @@ -536,6 +536,7 @@ class CleanupWorker(BaseWorker): self._checkForZooKeeperChanges(new_config) provider_manager.ProviderManager.reconfigure(self._config, new_config, + self._zk, use_taskmanager=False) self._config = new_config @@ -878,6 +879,7 @@ class UploadWorker(BaseWorker): self._checkForZooKeeperChanges(new_config) provider_manager.ProviderManager.reconfigure(self._config, new_config, + self._zk, use_taskmanager=False) self._config = new_config diff --git a/nodepool/cmd/nodepoolcmd.py b/nodepool/cmd/nodepoolcmd.py index 76ad00772..daf4adcfe 100755 --- a/nodepool/cmd/nodepoolcmd.py +++ b/nodepool/cmd/nodepoolcmd.py @@ -251,7 +251,7 @@ class NodePoolCmd(NodepoolApp): return provider = self.pool.config.providers[node.provider] manager = provider_manager.get_provider(provider, True) - manager.start() + manager.start(self.zk) launcher.NodeDeleter.delete(self.zk, manager, node) manager.stop() else: diff --git a/nodepool/driver/__init__.py b/nodepool/driver/__init__.py index bc957b722..0308bb996 100644 --- a/nodepool/driver/__init__.py +++ b/nodepool/driver/__init__.py @@ -145,11 +145,15 @@ class Provider(object, metaclass=abc.ABCMeta): """ @abc.abstractmethod - def start(self): + def start(self, zk_conn): """Start this provider + :param ZooKeeper zk_conn: A ZooKeeper connection object. + This is called after each configuration change to allow the driver - to perform initialization tasks and start background threads. + to perform initialization tasks and start background threads. The + ZooKeeper connection object is provided if the Provider needs to + interact with it. """ pass diff --git a/nodepool/driver/openstack/provider.py b/nodepool/driver/openstack/provider.py index 46e8e5f3a..62fe6ade4 100755 --- a/nodepool/driver/openstack/provider.py +++ b/nodepool/driver/openstack/provider.py @@ -50,7 +50,7 @@ class OpenStackProvider(Provider): self._taskmanager = None self._current_nodepool_quota = None - def start(self): + def start(self, zk_conn): if self._use_taskmanager: self._taskmanager = TaskManager(None, self.provider.name, self.provider.rate) diff --git a/nodepool/driver/static/provider.py b/nodepool/driver/static/provider.py index 85218da2b..7a2ff5f01 100644 --- a/nodepool/driver/static/provider.py +++ b/nodepool/driver/static/provider.py @@ -57,7 +57,7 @@ class StaticNodeProvider(Provider): raise StaticNodeError("%s: host key mismatches (%s)" % (node["name"], keys)) - def start(self): + def start(self, zk_conn): for pool in self.provider.pools.values(): self.pools[pool.name] = {} for node in pool.nodes: diff --git a/nodepool/driver/test/provider.py b/nodepool/driver/test/provider.py index 88373c59c..0051c9cb9 100644 --- a/nodepool/driver/test/provider.py +++ b/nodepool/driver/test/provider.py @@ -22,7 +22,7 @@ class TestProvider(Provider): def __init__(self, provider): self.provider = provider - def start(self): + def start(self, zk_conn): pass def stop(self): diff --git a/nodepool/launcher.py b/nodepool/launcher.py index be7e1d5c4..2fa5e29a9 100755 --- a/nodepool/launcher.py +++ b/nodepool/launcher.py @@ -819,8 +819,9 @@ class NodePool(threading.Thread): def updateConfig(self): config = self.loadConfig() - provider_manager.ProviderManager.reconfigure(self.config, config) self.reconfigureZooKeeper(config) + provider_manager.ProviderManager.reconfigure(self.config, config, + self.getZK()) self.setConfig(config) def removeCompletedRequests(self): diff --git a/nodepool/provider_manager.py b/nodepool/provider_manager.py index 907fc86a3..0527f6df9 100755 --- a/nodepool/provider_manager.py +++ b/nodepool/provider_manager.py @@ -30,7 +30,18 @@ class ProviderManager(object): log = logging.getLogger("nodepool.ProviderManager") @staticmethod - def reconfigure(old_config, new_config, use_taskmanager=True): + def reconfigure(old_config, new_config, zk_conn, use_taskmanager=True): + ''' + Reconfigure the provider managers on any configuration changes. + + If a provider configuration changes, stop the current provider + manager we have cached and replace it with a new one. + + :param Config old_config: The previously read configuration. + :param Config new_config: The newly read configuration. + :param ZooKeeper zk_conn: A ZooKeeper connection object. + :param bool use_taskmanager: If True, use a task manager. + ''' stop_managers = [] for p in new_config.providers.values(): oldmanager = None @@ -46,7 +57,7 @@ class ProviderManager(object): " for %s" % p.name) new_config.provider_managers[p.name] = \ get_provider(p, use_taskmanager) - new_config.provider_managers[p.name].start() + new_config.provider_managers[p.name].start(zk_conn) for stop_manager in stop_managers: stop_manager.stop() diff --git a/nodepool/tests/test_shade_integration.py b/nodepool/tests/test_shade_integration.py index 625333a54..5208da0bc 100644 --- a/nodepool/tests/test_shade_integration.py +++ b/nodepool/tests/test_shade_integration.py @@ -61,7 +61,7 @@ class TestShadeIntegration(tests.IntegrationTestCase): self.assertIn('real-provider', config.providers) pm = provider_manager.get_provider( config.providers['real-provider'], use_taskmanager=False) - pm.start() + pm.start(None) self.assertEqual(pm._client.auth, auth_data) def test_nodepool_occ_config_reload(self):