diff options
author | Kevin W Monroe <kevin.monroe@canonical.com> | 2016-10-27 21:55:18 +0000 |
---|---|---|
committer | Kevin W Monroe <kevin.monroe@canonical.com> | 2016-11-16 14:18:00 -0600 |
commit | f4515e8c6d27a158449141264be066e0c43b2772 (patch) | |
tree | 8b45ced6eff3e46bde76a6818b90ffbb842f943b /bigtop-packages | |
parent | cf19b047f02cfdb019e47e881c58db82372cd810 (diff) |
BIGTOP-2575: zk charm test updates (closes #156)
Signed-off-by: Kevin W Monroe <kevin.monroe@canonical.com>
Diffstat (limited to 'bigtop-packages')
-rw-r--r-- | bigtop-packages/src/charm/zookeeper/layer-zookeeper/README.md | 4 | ||||
-rwxr-xr-x | bigtop-packages/src/charm/zookeeper/layer-zookeeper/actions/restart | 7 | ||||
-rwxr-xr-x | bigtop-packages/src/charm/zookeeper/layer-zookeeper/actions/smoke-test | 6 | ||||
-rw-r--r-- | bigtop-packages/src/charm/zookeeper/layer-zookeeper/lib/charms/layer/bigtop_zookeeper.py (renamed from bigtop-packages/src/charm/zookeeper/layer-zookeeper/lib/charms/layer/zookeeper.py) | 6 | ||||
-rw-r--r-- | bigtop-packages/src/charm/zookeeper/layer-zookeeper/reactive/zookeeper.py | 6 | ||||
-rwxr-xr-x | bigtop-packages/src/charm/zookeeper/layer-zookeeper/tests/01-deploy-smoke.py (renamed from bigtop-packages/src/charm/zookeeper/layer-zookeeper/tests/01-deploy) | 31 | ||||
-rwxr-xr-x | bigtop-packages/src/charm/zookeeper/layer-zookeeper/tests/10-bind-address.py (renamed from bigtop-packages/src/charm/zookeeper/layer-zookeeper/tests/10-bind-address) | 74 |
7 files changed, 66 insertions, 68 deletions
diff --git a/bigtop-packages/src/charm/zookeeper/layer-zookeeper/README.md b/bigtop-packages/src/charm/zookeeper/layer-zookeeper/README.md index 69aa650a..af9f449c 100644 --- a/bigtop-packages/src/charm/zookeeper/layer-zookeeper/README.md +++ b/bigtop-packages/src/charm/zookeeper/layer-zookeeper/README.md @@ -153,9 +153,9 @@ The Zookeeper nodes will automatically perform a rolling restart to update the Zookeeper quorum without losing any jobs in progress. Once the rolling restart has completed, all of the Zookeeper nodes should report the following status: - ready (n zk nodes) + ready (n units) -(Where 'n' is the total number of Zookeeper nodes in your quorum.) +(Where 'n' is the total number of Zookeeper units in the quorum.) # Integrating diff --git a/bigtop-packages/src/charm/zookeeper/layer-zookeeper/actions/restart b/bigtop-packages/src/charm/zookeeper/layer-zookeeper/actions/restart index 4dcf6ae7..7bb51364 100755 --- a/bigtop-packages/src/charm/zookeeper/layer-zookeeper/actions/restart +++ b/bigtop-packages/src/charm/zookeeper/layer-zookeeper/actions/restart @@ -18,14 +18,15 @@ import sys sys.path.append('lib') # Add our helpers to our path. -from charmhelpers.core import hookenv -from charms.layer.zookeeper import Zookeeper -from charms.reactive import is_state +from charmhelpers.core import hookenv # noqa: E402 +from charms.layer.bigtop_zookeeper import Zookeeper # noqa: E402 +from charms.reactive import is_state # noqa: E402 LOG = hookenv.log LOG("starting restart handler.") + def main(): if not is_state('zookeeper.started'): hookenv.action_fail('Cannot restart: Zookeeper has not yet started!') diff --git a/bigtop-packages/src/charm/zookeeper/layer-zookeeper/actions/smoke-test b/bigtop-packages/src/charm/zookeeper/layer-zookeeper/actions/smoke-test index 37264cfa..64814629 100755 --- a/bigtop-packages/src/charm/zookeeper/layer-zookeeper/actions/smoke-test +++ b/bigtop-packages/src/charm/zookeeper/layer-zookeeper/actions/smoke-test @@ -18,9 +18,9 @@ import sys sys.path.append('lib') -from charmhelpers.core import hookenv -from charms.layer.apache_bigtop_base import Bigtop -from charms.reactive import is_state +from charmhelpers.core import hookenv # noqa: E402 +from charms.layer.apache_bigtop_base import Bigtop # noqa: E402 +from charms.reactive import is_state # noqa: E402 def fail(msg, output=None): diff --git a/bigtop-packages/src/charm/zookeeper/layer-zookeeper/lib/charms/layer/zookeeper.py b/bigtop-packages/src/charm/zookeeper/layer-zookeeper/lib/charms/layer/bigtop_zookeeper.py index 4b4932b2..5f1695cb 100644 --- a/bigtop-packages/src/charm/zookeeper/layer-zookeeper/lib/charms/layer/zookeeper.py +++ b/bigtop-packages/src/charm/zookeeper/layer-zookeeper/lib/charms/layer/bigtop_zookeeper.py @@ -178,11 +178,11 @@ class Zookeeper(object): ''' node_count = len(self.read_peers()) if node_count == 1: - count_str = "{} zk node".format(node_count) + count_str = "{} unit".format(node_count) else: - count_str = "{} zk nodes".format(node_count) + count_str = "{} units".format(node_count) if node_count < 3: - return " ({}; less than 3 nodes is suboptimal)".format(count_str) + return " ({}; less than 3 is suboptimal)".format(count_str) if node_count % 2 == 0: return " ({}; an even number is suboptimal)".format(count_str) return "({})".format(count_str) diff --git a/bigtop-packages/src/charm/zookeeper/layer-zookeeper/reactive/zookeeper.py b/bigtop-packages/src/charm/zookeeper/layer-zookeeper/reactive/zookeeper.py index 825c2198..a4c7773b 100644 --- a/bigtop-packages/src/charm/zookeeper/layer-zookeeper/reactive/zookeeper.py +++ b/bigtop-packages/src/charm/zookeeper/layer-zookeeper/reactive/zookeeper.py @@ -16,7 +16,8 @@ import json import time from charmhelpers.core import hookenv -from charms.layer.zookeeper import Zookeeper +from charms.layer.apache_bigtop_base import get_package_version +from charms.layer.bigtop_zookeeper import Zookeeper from charms.leadership import leader_set, leader_get from charms.reactive import set_state, when, when_not, is_state from charms.reactive.helpers import data_changed @@ -44,6 +45,9 @@ def install_zookeeper(): set_state('zookeeper.installed') set_state('zookeeper.started') hookenv.status_set('active', 'ready {}'.format(zookeeper.quorum_check())) + # set app version string for juju status output + zoo_version = get_package_version('zookeeper') or 'unknown' + hookenv.application_version_set(zoo_version) def _restart_zookeeper(msg): diff --git a/bigtop-packages/src/charm/zookeeper/layer-zookeeper/tests/01-deploy b/bigtop-packages/src/charm/zookeeper/layer-zookeeper/tests/01-deploy-smoke.py index 744a71fb..1ef64d85 100755 --- a/bigtop-packages/src/charm/zookeeper/layer-zookeeper/tests/01-deploy +++ b/bigtop-packages/src/charm/zookeeper/layer-zookeeper/tests/01-deploy-smoke.py @@ -15,15 +15,15 @@ # See the License for the specific language governing permissions and # limitations under the License. -import unittest import amulet +import unittest TIMEOUT = 1800 class TestDeploy(unittest.TestCase): """ - Deployment test for Apache Zookkepper quorum + Deployment test for Apache Zookeeper quorum """ @classmethod @@ -33,22 +33,20 @@ class TestDeploy(unittest.TestCase): cls.d.add('zookeeper', charm='zookeeper', units=3) cls.d.setup(timeout=TIMEOUT) - cls.d.sentry.wait(timeout=TIMEOUT) + cls.d.sentry.wait_for_messages({'zookeeper': 'ready (3 units)'}, + timeout=TIMEOUT) cls.unit = cls.d.sentry['zookeeper'][0] def test_deploy(self): + """Verify zk quorum is running""" output, retcode = self.unit.run("pgrep -a java") - assert 'QuorumPeerMain' in output, "zookeeper QuorumPeerMain daemon is not started" + assert 'QuorumPeerMain' in output, "Zookeeper QuorumPeerMain daemon is not started" def test_quorum(self): - ''' + """ Verify that our peers are talking to each other, and taking on appropriate roles. - - ''' - self.assertEqual(3, len(self.d.sentry['zookeeper'])) - - # Verify that everything worked. + """ for unit in self.d.sentry['zookeeper']: output, _ = unit.run( "/usr/lib/zookeeper/bin/zkServer.sh status" @@ -61,14 +59,15 @@ class TestDeploy(unittest.TestCase): smk_uuids = [] for unit in self.d.sentry['zookeeper']: - smk_uuids.append(unit.action_do("smoke-test")) + smk_uuids.append(unit.run_action('smoke-test')) for smk_uuid in smk_uuids: - result = self.d.action_fetch(smk_uuid, full_output=True) - # zookeeper smoke-test sets outcome=success on success - if (result['outcome'] != "success"): - error = "Zookeeper smoke-test failed" - amulet.raise_status(amulet.FAIL, msg=error) + # 'zookeeper' smoke takes a while (bigtop tests are slow) + result = self.d.action_fetch(smk_uuid, timeout=1800, full_output=True) + # actions set status=completed on success + if (result['status'] != "completed"): + self.fail('Zookeeper smoke-test failed: %s' % result) + if __name__ == '__main__': unittest.main() diff --git a/bigtop-packages/src/charm/zookeeper/layer-zookeeper/tests/10-bind-address b/bigtop-packages/src/charm/zookeeper/layer-zookeeper/tests/10-bind-address.py index 66e42eb0..8fa2bb7b 100755 --- a/bigtop-packages/src/charm/zookeeper/layer-zookeeper/tests/10-bind-address +++ b/bigtop-packages/src/charm/zookeeper/layer-zookeeper/tests/10-bind-address.py @@ -15,13 +15,12 @@ # See the License for the specific language governing permissions and # limitations under the License. -import unittest -import re import amulet -import subprocess +import re +import time +import unittest -DEPLOY_TIMEOUT = 1800 -CONFIG_TIMEOUT = 900 +TIMEOUT = 1800 class TestBindClientPort(unittest.TestCase): @@ -34,16 +33,16 @@ class TestBindClientPort(unittest.TestCase): def setUpClass(cls): cls.d = amulet.Deployment(series='xenial') - cls.d.add('zookeeper', charm='zookeeper', units=3) + cls.d.add('zk-test', charm='zookeeper') - cls.d.setup(timeout=CONFIG_TIMEOUT) - cls.d.sentry.wait(timeout=DEPLOY_TIMEOUT) - cls.unit = cls.d.sentry['zookeeper'][0] + cls.d.setup(timeout=TIMEOUT) + cls.d.sentry.wait_for_messages({'zk-test': re.compile('ready')}, + timeout=TIMEOUT) + cls.unit = cls.d.sentry['zk-test'][0] def test_bind_port(self): """ - Test to verify that we update client port bindings successfully. - + Verify that we update client port bindings successfully. """ network_interface = None # Regular expression should handle interfaces in the format @@ -62,43 +61,35 @@ class TestBindClientPort(unittest.TestCase): raise Exception( "Could not find any interface on the unit that matched my " "criteria.") - # self.d.configure broken due to change in juju api. TODO: - # switch this out when fixed. - subprocess.check_call( - ['juju', 'config', 'zookeeper', 'network_interface={}'.format( - network_interface)]) - #self.d.configure('zookeeper', {'network_interface': network_interface}) - self.d.sentry.wait_for_messages( - {'zookeeper': 'updating network interface'}, timeout=CONFIG_TIMEOUT) - self.d.sentry.wait_for_messages( - {'zookeeper': 'ready (3 zk nodes)'}, timeout=CONFIG_TIMEOUT) + self.d.configure('zk-test', {'network_interface': network_interface}) + + # NB: we used to watch for a maintenance status message, but every now + # and then, we'd miss it. Wait 2m to let the config-changed hook settle. + time.sleep(120) ret = self.unit.run( 'grep clientPortAddress /etc/zookeeper/conf/zoo.cfg')[0] + matcher = re.compile( "^clientPortAddress=\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}.*") - self.assertTrue(matcher.match(ret)) # Verify that smoke tests still run - smk_uuid = self.unit.action_do("smoke-test") - result = self.d.action_fetch(smk_uuid, full_output=True) - # zookeeper smoke-test sets outcome=success on success - if (result['outcome'] != "success"): - error = "Zookeeper smoke-test failed" - amulet.raise_status(amulet.FAIL, msg=error) - - @unittest.skip( - 'Broken handling of 0.0.0.0 bindings upstream, in Zookeeper project.') + smk_uuid = self.unit.run_action('smoke-test') + # 'zookeeper' smoke takes a while (bigtop tests are slow) + result = self.d.action_fetch(smk_uuid, timeout=1800, full_output=True) + # actions set status=completed on success + if (result['status'] != "completed"): + self.fail('Zookeeper smoke-test failed: %s' % result) + def test_reset_bindings(self): """ Verify that we can reset the client port bindings to 0.0.0.0 - """ - self.d.configure('zookeeper', {'network_interface': '0.0.0.0'}) - self.d.sentry.wait_for_messages( - {'zookeeper': 'updating network interface'}, timeout=CONFIG_TIMEOUT) - self.d.sentry.wait_for_messages( - {'zookeeper': 'ready (3 zk nodes)'}, timeout=CONFIG_TIMEOUT) + self.d.configure('zk-test', {'network_interface': '0.0.0.0'}) + + # NB: we used to watch for a maintenance status message, but every now + # and then, we'd miss it. Wait 2m to let the config-changed hook settle. + time.sleep(120) ret = self.unit.run( 'grep clientPortAddress /etc/zookeeper/conf/zoo.cfg')[0] @@ -106,9 +97,12 @@ class TestBindClientPort(unittest.TestCase): self.assertTrue(matcher.match(ret)) # Verify that smoke tests still run - smk_uuid = self.unit.action_do("smoke-test") - output = self.d.action_fetch(smk_uuid, full_output=True) - assert "completed" in output['status'] + smk_uuid = self.unit.run_action('smoke-test') + # 'zookeeper' smoke takes a while (bigtop tests are slow) + result = self.d.action_fetch(smk_uuid, timeout=1800, full_output=True) + # actions set status=completed on success + if (result['status'] != "completed"): + self.fail('Zookeeper smoke-test failed: %s' % result) if __name__ == '__main__': |