aboutsummaryrefslogtreecommitdiff
path: root/bigtop-packages
diff options
context:
space:
mode:
authorKevin W Monroe <kevin.monroe@canonical.com>2016-10-27 21:55:18 +0000
committerKevin W Monroe <kevin.monroe@canonical.com>2016-11-16 14:18:00 -0600
commitf4515e8c6d27a158449141264be066e0c43b2772 (patch)
tree8b45ced6eff3e46bde76a6818b90ffbb842f943b /bigtop-packages
parentcf19b047f02cfdb019e47e881c58db82372cd810 (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.md4
-rwxr-xr-xbigtop-packages/src/charm/zookeeper/layer-zookeeper/actions/restart7
-rwxr-xr-xbigtop-packages/src/charm/zookeeper/layer-zookeeper/actions/smoke-test6
-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.py6
-rwxr-xr-xbigtop-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-xbigtop-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__':