Adding Zookeeper charm

Change-Id: I86d907be64fc4c7bee4a6f118fea0be30e606927
Signed-off-by: sousaedu <eduardo.sousa@canonical.com>
diff --git a/installers/charm/zookeeper-k8s/tests/basic_deployment.py b/installers/charm/zookeeper-k8s/tests/basic_deployment.py
new file mode 100644
index 0000000..f24112e
--- /dev/null
+++ b/installers/charm/zookeeper-k8s/tests/basic_deployment.py
@@ -0,0 +1,118 @@
+#!/usr/bin/python3
+# Copyright 2021 Canonical Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+# For those usages not covered by the Apache License, Version 2.0 please
+# contact: legal@canonical.com
+#
+# To get in touch with the maintainers, please contact:
+# osm-charmers@lists.launchpad.net
+##
+
+import unittest
+import zaza.model as model
+from kazoo.client import KazooClient
+
+
+def get_zookeeper_uri():
+    zookeeper_uri = ""
+    zookeeper_units = model.get_status().applications["zookeeper-k8s"]["units"]
+    for i, unit_name in enumerate(zookeeper_units.keys()):
+        if i:
+            zookeeper_uri += ","
+        unit_ip = zookeeper_units[unit_name]["address"]
+        unit_port = 2181
+        zookeeper_uri += "{}:{}".format(unit_ip, unit_port)
+
+    return zookeeper_uri
+
+
+class BasicDeployment(unittest.TestCase):
+    def test_get_zookeeper_uri(self):
+        get_zookeeper_uri()
+
+    def test_zookeeper_connection(self):
+        zookeeper_uri = get_zookeeper_uri()
+        zk = KazooClient(zookeeper_uri)
+        self.assertEqual(zk.state, "LOST")
+        zk.start()
+        self.assertEqual(zk.state, "CONNECTED")
+        zk.stop()
+        self.assertEqual(zk.state, "LOST")
+
+    def test_zookeeper_create_node(self):
+        zookeeper_uri = get_zookeeper_uri()
+        zk = KazooClient(hosts=zookeeper_uri, read_only=True)
+        zk.start()
+
+        zk.ensure_path("/create/new")
+        self.assertTrue(zk.exists("/create/new"))
+
+        zk.create("/create/new/node", b"a value")
+        self.assertTrue(zk.exists("/create/new/node"))
+
+        zk.stop()
+
+    def test_zookeeper_reading_data(self):
+        zookeeper_uri = get_zookeeper_uri()
+        zk = KazooClient(hosts=zookeeper_uri, read_only=True)
+        zk.start()
+
+        zk.ensure_path("/reading/data")
+        zk.create("/reading/data/node", b"a value")
+
+        data, stat = zk.get("/reading/data")
+        self.assertEqual(data.decode("utf-8"), "")
+
+        children = zk.get_children("/reading/data")
+        self.assertEqual(len(children), 1)
+        self.assertEqual("node", children[0])
+
+        data, stat = zk.get("/reading/data/node")
+        self.assertEqual(data.decode("utf-8"), "a value")
+        zk.stop()
+
+    def test_zookeeper_updating_data(self):
+        zookeeper_uri = get_zookeeper_uri()
+        zk = KazooClient(hosts=zookeeper_uri, read_only=True)
+        zk.start()
+
+        zk.ensure_path("/updating/data")
+        zk.create("/updating/data/node", b"a value")
+
+        data, stat = zk.get("/updating/data/node")
+        self.assertEqual(data.decode("utf-8"), "a value")
+
+        zk.set("/updating/data/node", b"b value")
+        data, stat = zk.get("/updating/data/node")
+        self.assertEqual(data.decode("utf-8"), "b value")
+        zk.stop()
+
+    def test_zookeeper_deleting_data(self):
+        zookeeper_uri = get_zookeeper_uri()
+        zk = KazooClient(hosts=zookeeper_uri, read_only=True)
+        zk.start()
+
+        zk.ensure_path("/deleting/data")
+        zk.create("/deleting/data/node", b"a value")
+
+        zk.delete("/deleting/data/node", recursive=True)
+
+        self.assertFalse(zk.exists("/deleting/data/node"))
+        self.assertTrue(zk.exists("/deleting/data"))
+        data, stat = zk.get("/deleting/data")
+        self.assertEqual(stat.numChildren, 0)
+        zk.delete("/deleting", recursive=True)
+        self.assertFalse(zk.exists("/deleting"))
+        zk.stop()