diff options
Diffstat (limited to 'kazoo/testing/harness.py')
-rw-r--r-- | kazoo/testing/harness.py | 145 |
1 files changed, 100 insertions, 45 deletions
diff --git a/kazoo/testing/harness.py b/kazoo/testing/harness.py index de56795..6cb5cb1 100644 --- a/kazoo/testing/harness.py +++ b/kazoo/testing/harness.py @@ -16,52 +16,104 @@ from kazoo.testing.common import ZookeeperCluster log = logging.getLogger(__name__) CLUSTER = None +CLUSTER_CONF = None +CLUSTER_DEFAULTS = { + "ZOOKEEPER_PORT_OFFSET": 20000, + "ZOOKEEPER_CLUSTER_SIZE": 3, + "ZOOKEEPER_OBSERVER_START_ID": -1, +} def get_global_cluster(): - global CLUSTER - if CLUSTER is None: - ZK_HOME = os.environ.get("ZOOKEEPER_PATH") - ZK_CLASSPATH = os.environ.get("ZOOKEEPER_CLASSPATH") - ZK_PORT_OFFSET = int(os.environ.get("ZOOKEEPER_PORT_OFFSET", 20000)) - ZK_CLUSTER_SIZE = int(os.environ.get("ZOOKEEPER_CLUSTER_SIZE", 3)) - ZK_VERSION = os.environ.get("ZOOKEEPER_VERSION") - if '-' in ZK_VERSION: - # Ignore pre-release markers like -alpha - ZK_VERSION = ZK_VERSION.split('-')[0] - ZK_VERSION = tuple([int(n) for n in ZK_VERSION.split('.')]) - - ZK_OBSERVER_START_ID = int( - os.environ.get("ZOOKEEPER_OBSERVER_START_ID", -1)) - - assert ZK_HOME or ZK_CLASSPATH or ZK_VERSION, ( - "Either ZOOKEEPER_PATH or ZOOKEEPER_CLASSPATH or " - "ZOOKEEPER_VERSION environment variable must be defined.\n" - "For deb package installations this is /usr/share/java") - - if ZK_VERSION >= (3, 5): - additional_configuration_entries = [ - "4lw.commands.whitelist=*", - "reconfigEnabled=true" - ] - # If defines, this sets the superuser password to "test" - additional_java_system_properties = [ - "-Dzookeeper.DigestAuthenticationProvider.superDigest=" - "super:D/InIHSb7yEEbrWz8b9l71RjZJU=" - ] + global CLUSTER, CLUSTER_CONF + cluster_conf = { + k: os.environ.get(k, CLUSTER_DEFAULTS.get(k)) + for k in ["ZOOKEEPER_PATH", + "ZOOKEEPER_CLASSPATH", + "ZOOKEEPER_PORT_OFFSET", + "ZOOKEEPER_CLUSTER_SIZE", + "ZOOKEEPER_VERSION", + "ZOOKEEPER_OBSERVER_START_ID", + "ZOOKEEPER_JAAS_AUTH"] + } + if CLUSTER is not None: + if CLUSTER_CONF == cluster_conf: + return CLUSTER else: - additional_configuration_entries = [] - additional_java_system_properties = [] - CLUSTER = ZookeeperCluster( - install_path=ZK_HOME, - classpath=ZK_CLASSPATH, - port_offset=ZK_PORT_OFFSET, - size=ZK_CLUSTER_SIZE, - observer_start_id=ZK_OBSERVER_START_ID, - configuration_entries=additional_configuration_entries, - java_system_properties=additional_java_system_properties - ) - atexit.register(lambda cluster: cluster.terminate(), CLUSTER) + log.info('Config change detected. Reconfiguring cluster...') + CLUSTER.terminate() + CLUSTER = None + # Create a new cluster + ZK_HOME = cluster_conf.get("ZOOKEEPER_PATH") + ZK_CLASSPATH = cluster_conf.get("ZOOKEEPER_CLASSPATH") + ZK_PORT_OFFSET = int(cluster_conf.get("ZOOKEEPER_PORT_OFFSET")) + ZK_CLUSTER_SIZE = int(cluster_conf.get("ZOOKEEPER_CLUSTER_SIZE")) + ZK_VERSION = cluster_conf.get("ZOOKEEPER_VERSION") + if '-' in ZK_VERSION: + # Ignore pre-release markers like -alpha + ZK_VERSION = ZK_VERSION.split('-')[0] + ZK_VERSION = tuple([int(n) for n in ZK_VERSION.split('.')]) + ZK_OBSERVER_START_ID = int(cluster_conf.get("ZOOKEEPER_OBSERVER_START_ID")) + + assert ZK_HOME or ZK_CLASSPATH or ZK_VERSION, ( + "Either ZOOKEEPER_PATH or ZOOKEEPER_CLASSPATH or " + "ZOOKEEPER_VERSION environment variable must be defined.\n" + "For deb package installations this is /usr/share/java") + + if ZK_VERSION >= (3, 5): + additional_configuration_entries = [ + "4lw.commands.whitelist=*", + "reconfigEnabled=true" + ] + # If defined, this sets the superuser password to "test" + additional_java_system_properties = [ + "-Dzookeeper.DigestAuthenticationProvider.superDigest=" + "super:D/InIHSb7yEEbrWz8b9l71RjZJU=" + ] + else: + additional_configuration_entries = [] + additional_java_system_properties = [] + ZOOKEEPER_JAAS_AUTH = cluster_conf.get("ZOOKEEPER_JAAS_AUTH") + if ZOOKEEPER_JAAS_AUTH == "digest": + jaas_config = """ +Server { + org.apache.zookeeper.server.auth.DigestLoginModule required + user_super="super_secret" + user_jaasuser="jaas_password"; +};""" + elif ZOOKEEPER_JAAS_AUTH == "gssapi": + # Configure Zookeeper to use our test KDC. + additional_java_system_properties += [ + "-Djava.security.krb5.conf=%s" % os.path.expandvars( + "${KRB5_CONFIG}" + ), + "-Dsun.security.krb5.debug=true", + ] + jaas_config = """ +Server { + com.sun.security.auth.module.Krb5LoginModule required + debug=true + useKeyTab=true + keyTab="%s" + storeKey=true + useTicketCache=false + principal="zookeeper/127.0.0.1@KAZOOTEST.ORG"; +};""" % os.path.expandvars("${KRB5_TEST_ENV}/server.keytab") + else: + jaas_config = None + + CLUSTER = ZookeeperCluster( + install_path=ZK_HOME, + classpath=ZK_CLASSPATH, + port_offset=ZK_PORT_OFFSET, + size=ZK_CLUSTER_SIZE, + observer_start_id=ZK_OBSERVER_START_ID, + configuration_entries=additional_configuration_entries, + java_system_properties=additional_java_system_properties, + jaas_config=jaas_config + ) + CLUSTER_CONF = cluster_conf + atexit.register(lambda cluster: cluster.terminate(), CLUSTER) return CLUSTER @@ -90,6 +142,7 @@ class KazooTestHarness(unittest.TestCase): something_that_needs_zk_servers(self.servers) """ + DEFAULT_CLIENT_TIMEOUT = 15 def __init__(self, *args, **kw): super(KazooTestHarness, self).__init__(*args, **kw) @@ -109,8 +162,10 @@ class KazooTestHarness(unittest.TestCase): self._clients.append(c) return c - def _get_client(self, **kwargs): - c = KazooClient(self.hosts, **kwargs) + def _get_client(self, **client_options): + if 'timeout' not in client_options: + client_options['timeout'] = self.DEFAULT_CLIENT_TIMEOUT + c = KazooClient(self.hosts, **client_options) self._clients.append(c) return c @@ -139,7 +194,7 @@ class KazooTestHarness(unittest.TestCase): namespace = "/kazootests" + uuid.uuid4().hex self.hosts = self.servers + namespace if 'timeout' not in client_options: - client_options['timeout'] = 0.8 + client_options['timeout'] = self.DEFAULT_CLIENT_TIMEOUT self.client = self._get_client(**client_options) self.client.start() self.client.ensure_path("/") |