SLIDER-628 Cleanup a few unwanted test related kazoo files
diff --git a/slider-agent/src/main/python/kazoo/testing/__init__.py b/slider-agent/src/main/python/kazoo/testing/__init__.py
deleted file mode 100644
index 660546b..0000000
--- a/slider-agent/src/main/python/kazoo/testing/__init__.py
+++ /dev/null
@@ -1,6 +0,0 @@
-"""license: Apache License 2.0, see LICENSE for more details."""
-from kazoo.testing.harness import KazooTestCase
-from kazoo.testing.harness import KazooTestHarness
-
-
-__all__ = ('KazooTestHarness', 'KazooTestCase', )
diff --git a/slider-agent/src/main/python/kazoo/testing/common.py b/slider-agent/src/main/python/kazoo/testing/common.py
deleted file mode 100644
index b497a8e..0000000
--- a/slider-agent/src/main/python/kazoo/testing/common.py
+++ /dev/null
@@ -1,284 +0,0 @@
-"""license: Apache License 2.0, see LICENSE for more details."""
-#
-# Copyright (C) 2010-2011, 2011 Canonical Ltd. All Rights Reserved
-#
-# This file was originally taken from txzookeeper and modified later.
-#
-# Authors:
-# Kapil Thangavelu and the Kazoo team
-#
-# txzookeeper is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# txzookeeper is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with txzookeeper. If not, see <http://www.gnu.org/licenses/>.
-
-
-import code
-import os
-import os.path
-import shutil
-import signal
-import subprocess
-import tempfile
-import traceback
-
-from itertools import chain
-from collections import namedtuple
-from glob import glob
-
-
-def debug(sig, frame):
- """Interrupt running process, and provide a python prompt for
- interactive debugging."""
- d = {'_frame': frame} # Allow access to frame object.
- d.update(frame.f_globals) # Unless shadowed by global
- d.update(frame.f_locals)
-
- i = code.InteractiveConsole(d)
- message = "Signal recieved : entering python shell.\nTraceback:\n"
- message += ''.join(traceback.format_stack(frame))
- i.interact(message)
-
-
-def listen():
- if os.name != 'nt': # SIGUSR1 is not supported on Windows
- signal.signal(signal.SIGUSR1, debug) # Register handler
-listen()
-
-
-def to_java_compatible_path(path):
- if os.name == 'nt':
- path = path.replace('\\', '/')
- return path
-
-ServerInfo = namedtuple(
- "ServerInfo", "server_id client_port election_port leader_port")
-
-
-class ManagedZooKeeper(object):
- """Class to manage the running of a ZooKeeper instance for testing.
-
- Note: no attempt is made to probe the ZooKeeper instance is
- actually available, or that the selected port is free. In the
- future, we may want to do that, especially when run in a
- Hudson/Buildbot context, to ensure more test robustness."""
-
- def __init__(self, software_path, server_info, peers=(), classpath=None):
- """Define the ZooKeeper test instance.
-
- @param install_path: The path to the install for ZK
- @param port: The port to run the managed ZK instance
- """
- self.install_path = software_path
- self._classpath = classpath
- self.server_info = server_info
- self.host = "127.0.0.1"
- self.peers = peers
- self.working_path = tempfile.mkdtemp()
- self._running = False
-
- def run(self):
- """Run the ZooKeeper instance under a temporary directory.
-
- Writes ZK log messages to zookeeper.log in the current directory.
- """
- if self.running:
- return
- config_path = os.path.join(self.working_path, "zoo.cfg")
- log_path = os.path.join(self.working_path, "log")
- log4j_path = os.path.join(self.working_path, "log4j.properties")
- data_path = os.path.join(self.working_path, "data")
-
- # various setup steps
- if not os.path.exists(self.working_path):
- os.mkdir(self.working_path)
- if not os.path.exists(log_path):
- os.mkdir(log_path)
- if not os.path.exists(data_path):
- os.mkdir(data_path)
-
- with open(config_path, "w") as config:
- config.write("""
-tickTime=2000
-dataDir=%s
-clientPort=%s
-maxClientCnxns=0
-""" % (to_java_compatible_path(data_path), self.server_info.client_port))
-
- # setup a replicated setup if peers are specified
- if self.peers:
- servers_cfg = []
- for p in chain((self.server_info,), self.peers):
- servers_cfg.append("server.%s=localhost:%s:%s" % (
- p.server_id, p.leader_port, p.election_port))
-
- with open(config_path, "a") as config:
- config.write("""
-initLimit=4
-syncLimit=2
-%s
-""" % ("\n".join(servers_cfg)))
-
- # Write server ids into datadir
- with open(os.path.join(data_path, "myid"), "w") as myid_file:
- myid_file.write(str(self.server_info.server_id))
-
- with open(log4j_path, "w") as log4j:
- log4j.write("""
-# DEFAULT: console appender only
-log4j.rootLogger=INFO, ROLLINGFILE
-log4j.appender.ROLLINGFILE.layout=org.apache.log4j.PatternLayout
-log4j.appender.ROLLINGFILE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n
-log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender
-log4j.appender.ROLLINGFILE.Threshold=DEBUG
-log4j.appender.ROLLINGFILE.File=""" + to_java_compatible_path(
- self.working_path + os.sep + "zookeeper.log\n"))
-
- self.process = subprocess.Popen(
- args=["java",
- "-cp", self.classpath,
- "-Dreadonlymode.enabled=true",
- "-Dzookeeper.log.dir=%s" % log_path,
- "-Dzookeeper.root.logger=INFO,CONSOLE",
- "-Dlog4j.configuration=file:%s" % log4j_path,
- # "-Dlog4j.debug",
- "org.apache.zookeeper.server.quorum.QuorumPeerMain",
- config_path])
- self._running = True
-
- @property
- def classpath(self):
- """Get the classpath necessary to run ZooKeeper."""
-
- if self._classpath:
- return self._classpath
-
- # Two possibilities, as seen in zkEnv.sh:
- # Check for a release - top-level zookeeper-*.jar?
- jars = glob((os.path.join(
- self.install_path, 'zookeeper-*.jar')))
- if jars:
- # Release build (`ant package`)
- jars.extend(glob(os.path.join(
- self.install_path,
- "lib/*.jar")))
- # support for different file locations on Debian/Ubuntu
- jars.extend(glob(os.path.join(
- self.install_path,
- "log4j-*.jar")))
- jars.extend(glob(os.path.join(
- self.install_path,
- "slf4j-api-*.jar")))
- jars.extend(glob(os.path.join(
- self.install_path,
- "slf4j-log4j-*.jar")))
- else:
- # Development build (plain `ant`)
- jars = glob((os.path.join(
- self.install_path, 'build/zookeeper-*.jar')))
- jars.extend(glob(os.path.join(
- self.install_path,
- "build/lib/*.jar")))
-
- return os.pathsep.join(jars)
-
- @property
- def address(self):
- """Get the address of the ZooKeeper instance."""
- return "%s:%s" % (self.host, self.client_port)
-
- @property
- def running(self):
- return self._running
-
- @property
- def client_port(self):
- return self.server_info.client_port
-
- def reset(self):
- """Stop the zookeeper instance, cleaning out its on disk-data."""
- self.stop()
- shutil.rmtree(os.path.join(self.working_path, "data"))
- os.mkdir(os.path.join(self.working_path, "data"))
- with open(os.path.join(self.working_path, "data", "myid"), "w") as fh:
- fh.write(str(self.server_info.server_id))
-
- def stop(self):
- """Stop the Zookeeper instance, retaining on disk state."""
- if not self.running:
- return
- self.process.terminate()
- self.process.wait()
- self._running = False
-
- def destroy(self):
- """Stop the ZooKeeper instance and destroy its on disk-state"""
- # called by at exit handler, reimport to avoid cleanup race.
- import shutil
- self.stop()
-
- shutil.rmtree(self.working_path)
-
-
-class ZookeeperCluster(object):
-
- def __init__(self, install_path=None, classpath=None, size=3, port_offset=20000):
- self._install_path = install_path
- self._classpath = classpath
- self._servers = []
-
- # Calculate ports and peer group
- port = port_offset
- peers = []
-
- for i in range(size):
- info = ServerInfo(i + 1, port, port + 1, port + 2)
- peers.append(info)
- port += 10
-
- # Instantiate Managed ZK Servers
- for i in range(size):
- server_peers = list(peers)
- server_info = server_peers.pop(i)
- self._servers.append(
- ManagedZooKeeper(
- self._install_path, server_info, server_peers, classpath=self._classpath))
-
- def __getitem__(self, k):
- return self._servers[k]
-
- def __iter__(self):
- return iter(self._servers)
-
- def start(self):
- # Zookeeper client expresses a preference for either lower ports or
- # lexicographical ordering of hosts, to ensure that all servers have a
- # chance to startup, start them in reverse order.
- for server in reversed(list(self)):
- server.run()
- # Giving the servers a moment to start, decreases the overall time
- # required for a client to successfully connect (2s vs. 4s without
- # the sleep).
- import time
- time.sleep(2)
-
- def stop(self):
- for server in self:
- server.stop()
- self._servers = []
-
- def terminate(self):
- for server in self:
- server.destroy()
-
- def reset(self):
- for server in self:
- server.reset()
diff --git a/slider-agent/src/main/python/kazoo/testing/harness.py b/slider-agent/src/main/python/kazoo/testing/harness.py
deleted file mode 100644
index 93cc744..0000000
--- a/slider-agent/src/main/python/kazoo/testing/harness.py
+++ /dev/null
@@ -1,181 +0,0 @@
-"""license: Apache License 2.0, see LICENSE for more details."""
-"""Kazoo testing harnesses"""
-import atexit
-import logging
-import os
-import uuid
-import threading
-import unittest
-
-from kazoo.client import KazooClient
-from kazoo.exceptions import NotEmptyError
-from kazoo.protocol.states import (
- KazooState
-)
-from kazoo.testing.common import ZookeeperCluster
-from kazoo.protocol.connection import _SESSION_EXPIRED
-
-log = logging.getLogger(__name__)
-
-CLUSTER = None
-
-
-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))
-
- assert ZK_HOME or ZK_CLASSPATH, (
- "either ZOOKEEPER_PATH or ZOOKEEPER_CLASSPATH environment variable "
- "must be defined.\n"
- "For deb package installations this is /usr/share/java")
-
- CLUSTER = ZookeeperCluster(
- install_path=ZK_HOME,
- classpath=ZK_CLASSPATH,
- port_offset=ZK_PORT_OFFSET,
- )
- atexit.register(lambda cluster: cluster.terminate(), CLUSTER)
- return CLUSTER
-
-
-class KazooTestHarness(unittest.TestCase):
- """Harness for testing code that uses Kazoo
-
- This object can be used directly or as a mixin. It supports starting
- and stopping a complete ZooKeeper cluster locally and provides an
- API for simulating errors and expiring sessions.
-
- Example::
-
- class MyTestCase(KazooTestHarness):
- def setUp(self):
- self.setup_zookeeper()
-
- # additional test setup
-
- def tearDown(self):
- self.teardown_zookeeper()
-
- def test_something(self):
- something_that_needs_a_kazoo_client(self.client)
-
- def test_something_else(self):
- something_that_needs_zk_servers(self.servers)
-
- """
-
- def __init__(self, *args, **kw):
- super(KazooTestHarness, self).__init__(*args, **kw)
- self.client = None
- self._clients = []
-
- @property
- def cluster(self):
- return get_global_cluster()
-
- @property
- def servers(self):
- return ",".join([s.address for s in self.cluster])
-
- def _get_nonchroot_client(self):
- return KazooClient(self.servers)
-
- def _get_client(self, **kwargs):
- c = KazooClient(self.hosts, **kwargs)
- try:
- self._clients.append(c)
- except AttributeError:
- self._client = [c]
- return c
-
- def expire_session(self, client_id=None):
- """Force ZK to expire a client session
-
- :param client_id: id of client to expire. If unspecified, the id of
- self.client will be used.
-
- """
- client_id = client_id or self.client.client_id
-
- lost = threading.Event()
- safe = threading.Event()
-
- def watch_loss(state):
- if state == KazooState.LOST:
- lost.set()
- if lost.is_set() and state == KazooState.CONNECTED:
- safe.set()
- return True
-
- self.client.add_listener(watch_loss)
-
- self.client._call(_SESSION_EXPIRED, None)
-
- lost.wait(5)
- if not lost.isSet():
- raise Exception("Failed to get notified of session loss")
-
- # Wait for the reconnect now
- safe.wait(15)
- if not safe.isSet():
- raise Exception("Failed to see client reconnect")
- self.client.retry(self.client.get_async, '/')
-
- def setup_zookeeper(self, **client_options):
- """Create a ZK cluster and chrooted :class:`KazooClient`
-
- The cluster will only be created on the first invocation and won't be
- fully torn down until exit.
- """
- if not self.cluster[0].running:
- self.cluster.start()
- namespace = "/kazootests" + uuid.uuid4().hex
- self.hosts = self.servers + namespace
-
- if 'timeout' not in client_options:
- client_options['timeout'] = 0.8
- self.client = self._get_client(**client_options)
- self.client.start()
- self.client.ensure_path("/")
-
- def teardown_zookeeper(self):
- """Clean up any ZNodes created during the test
- """
- if not self.cluster[0].running:
- self.cluster.start()
-
- tries = 0
- if self.client and self.client.connected:
- while tries < 3:
- try:
- self.client.retry(self.client.delete, '/', recursive=True)
- break
- except NotEmptyError:
- pass
- tries += 1
- self.client.stop()
- self.client.close()
- del self.client
- else:
- client = self._get_client()
- client.start()
- client.retry(client.delete, '/', recursive=True)
- client.stop()
- client.close()
- del client
-
- for client in self._clients:
- client.stop()
- del client
- self._clients = None
-
-
-class KazooTestCase(KazooTestHarness):
- def setUp(self):
- self.setup_zookeeper()
-
- def tearDown(self):
- self.teardown_zookeeper()