Removing pydantic from MON charm 61/10161/3
authorsousaedu <eduardo.sousa@canonical.com>
Tue, 5 Jan 2021 14:39:30 +0000 (14:39 +0000)
committerbeierlm <mark.beierl@canonical.com>
Tue, 5 Jan 2021 20:23:30 +0000 (21:23 +0100)
Change-Id: Ice1c19c142f16ad8af6b9bc2ac20295f3b5215b9
Signed-off-by: sousaedu <eduardo.sousa@canonical.com>
installers/charm/mon/requirements.txt
installers/charm/mon/src/charm.py
installers/charm/mon/src/pod_spec.py
installers/charm/mon/tests/test_charm.py
installers/charm/mon/tests/test_pod_spec.py
installers/charm/mon/tox.ini

index 24f1672..a26601f 100644 (file)
@@ -20,5 +20,4 @@
 ##
 
 ops
-pydantic
 git+https://github.com/juju-solutions/resource-oci-image/@c5778285d332edf3d9a538f9d0c06154b7ec1b0b#egg=oci-image
index a6f405f..f51213d 100755 (executable)
@@ -21,7 +21,6 @@
 ##
 
 import logging
-from pydantic import ValidationError
 from typing import Any, Dict, NoReturn
 
 from ops.charm import CharmBase, CharmEvents
@@ -112,10 +111,8 @@ class MonCharm(CharmBase):
         Args:
             event (EventBase): Kafka relation event.
         """
-        data_loc = event.unit if event.unit else event.app
-
-        message_host = event.relation.data[data_loc].get("host")
-        message_port = event.relation.data[data_loc].get("port")
+        message_host = event.relation.data[event.unit].get("host")
+        message_port = event.relation.data[event.unit].get("port")
 
         if (
             message_host
@@ -145,9 +142,7 @@ class MonCharm(CharmBase):
         Args:
             event (EventBase): DB relation event.
         """
-        data_loc = event.unit if event.unit else event.app
-
-        database_uri = event.relation.data[data_loc].get("connection_string")
+        database_uri = event.relation.data[event.unit].get("connection_string")
 
         if database_uri and self.state.database_uri != database_uri:
             self.state.database_uri = database_uri
@@ -168,10 +163,8 @@ class MonCharm(CharmBase):
         Args:
             event (EventBase): Prometheus relation event.
         """
-        data_loc = event.unit if event.unit else event.app
-
-        prometheus_host = event.relation.data[data_loc].get("hostname")
-        prometheus_port = event.relation.data[data_loc].get("port")
+        prometheus_host = event.relation.data[event.unit].get("hostname")
+        prometheus_port = event.relation.data[event.unit].get("port")
 
         if (
             prometheus_host
@@ -265,7 +258,7 @@ class MonCharm(CharmBase):
                 self.model.app.name,
                 self.port,
             )
-        except ValidationError as exc:
+        except ValueError as exc:
             LOGGER.exception("Config/Relation data validation error")
             self.unit.status = BlockedStatus(str(exc))
             return
index 5c9182a..1c50565 100644 (file)
 ##
 
 import logging
-from pydantic import BaseModel, constr, PositiveInt
-from typing import Any, Dict, List
+from typing import Any, Dict, List, NoReturn
 
 logger = logging.getLogger(__name__)
 
 
-class ConfigData(BaseModel):
-    """Configuration data model."""
+def _validate_data(
+    config_data: Dict[str, Any], relation_data: Dict[str, Any]
+) -> NoReturn:
+    """Validate input data.
 
-    openstack_default_granularity: PositiveInt
-    global_request_timeout: PositiveInt
-    log_level: constr(regex=r"^(INFO|DEBUG)$")
-    collector_interval: PositiveInt
-    evaluator_interval: PositiveInt
-    database_commonkey: constr(min_length=1)
-    vca_host: constr(min_length=1)
-    vca_user: constr(min_length=1)
-    vca_password: constr(min_length=1)
-    vca_cacert: str
+    Args:
+        config_data (Dict[str, Any]): configuration data.
+        relation_data (Dict[str, Any]): relation data.
+    """
+    config_validators = {
+        "openstack_default_granularity": lambda value, _: isinstance(value, int)
+        and value > 0,
+        "global_request_timeout": lambda value, _: isinstance(value, int) and value > 0,
+        "log_level": lambda value, _: isinstance(value, str)
+        and value in ("INFO", "DEBUG"),
+        "collector_interval": lambda value, _: isinstance(value, int) and value > 0,
+        "evaluator_interval": lambda value, _: isinstance(value, int) and value > 0,
+        "database_commonkey": lambda value, _: isinstance(value, str)
+        and len(value) > 0,
+        "vca_host": lambda value, _: isinstance(value, str) and len(value) > 0,
+        "vca_user": lambda value, _: isinstance(value, str) and len(value) > 0,
+        "vca_password": lambda value, _: isinstance(value, str) and len(value) > 0,
+        "vca_cacert": lambda value, _: isinstance(value, str),
+    }
+    relation_validators = {
+        "message_host": lambda value, _: isinstance(value, str) and len(value) > 0,
+        "message_port": lambda value, _: isinstance(value, int) and value > 0,
+        "database_uri": lambda value, _: isinstance(value, str)
+        and value.startswith("mongodb://"),
+        "prometheus_host": lambda value, _: isinstance(value, str) and len(value) > 0,
+        "prometheus_port": lambda value, _: isinstance(value, int) and value > 0,
+    }
+    problems = []
+
+    for key, validator in config_validators.items():
+        valid = validator(config_data.get(key), config_data)
+
+        if not valid:
+            problems.append(key)
 
+    for key, validator in relation_validators.items():
+        valid = validator(relation_data.get(key), relation_data)
 
-class RelationData(BaseModel):
-    """Relation data model."""
+        if not valid:
+            problems.append(key)
 
-    message_host: constr(min_length=1)
-    message_port: PositiveInt
-    database_uri: constr(regex=r"^(mongodb://)")
-    prometheus_host: constr(min_length=1)
-    prometheus_port: PositiveInt
+    if len(problems) > 0:
+        raise ValueError("Errors found in: {}".format(", ".join(problems)))
 
 
 def _make_pod_ports(port: int) -> List[Dict[str, Any]]:
@@ -181,8 +205,7 @@ def make_pod_spec(
     if not image_info:
         return None
 
-    ConfigData(**(config))
-    RelationData(**(relation_state))
+    _validate_data(config, relation_state)
 
     ports = _make_pod_ports(port)
     env_config = _make_pod_envconfig(config, relation_state)
index 5ea4efa..010262f 100644 (file)
@@ -151,35 +151,6 @@ class TestCharm(unittest.TestCase):
 
         self.assertDictEqual(expected_result, pod_spec)
 
-    def test_on_kafka_app_relation_changed(self) -> NoReturn:
-        """Test to see if kafka relation is updated."""
-        self.harness.charm.on.start.emit()
-
-        self.assertIsNone(self.harness.charm.state.message_host)
-        self.assertIsNone(self.harness.charm.state.message_port)
-
-        relation_id = self.harness.add_relation("kafka", "kafka")
-        self.harness.add_relation_unit(relation_id, "kafka/0")
-        self.harness.update_relation_data(
-            relation_id, "kafka", {"host": "kafka", "port": 9092}
-        )
-
-        self.assertEqual(self.harness.charm.state.message_host, "kafka")
-        self.assertEqual(self.harness.charm.state.message_port, 9092)
-
-        # Verifying status
-        self.assertIsInstance(self.harness.charm.unit.status, BlockedStatus)
-
-        # Verifying status message
-        self.assertGreater(len(self.harness.charm.unit.status.message), 0)
-        self.assertTrue(
-            self.harness.charm.unit.status.message.startswith("Waiting for ")
-        )
-        self.assertNotIn("kafka", self.harness.charm.unit.status.message)
-        self.assertIn("mongodb", self.harness.charm.unit.status.message)
-        self.assertIn("prometheus", self.harness.charm.unit.status.message)
-        self.assertTrue(self.harness.charm.unit.status.message.endswith(" relations"))
-
     def test_on_kafka_unit_relation_changed(self) -> NoReturn:
         """Test to see if kafka relation is updated."""
         self.harness.charm.on.start.emit()
@@ -209,33 +180,6 @@ class TestCharm(unittest.TestCase):
         self.assertIn("prometheus", self.harness.charm.unit.status.message)
         self.assertTrue(self.harness.charm.unit.status.message.endswith(" relations"))
 
-    def test_on_mongodb_app_relation_changed(self) -> NoReturn:
-        """Test to see if mongodb relation is updated."""
-        self.harness.charm.on.start.emit()
-
-        self.assertIsNone(self.harness.charm.state.database_uri)
-
-        relation_id = self.harness.add_relation("mongodb", "mongodb")
-        self.harness.add_relation_unit(relation_id, "mongodb/0")
-        self.harness.update_relation_data(
-            relation_id, "mongodb", {"connection_string": "mongodb://mongo:27017"}
-        )
-
-        self.assertEqual(self.harness.charm.state.database_uri, "mongodb://mongo:27017")
-
-        # Verifying status
-        self.assertIsInstance(self.harness.charm.unit.status, BlockedStatus)
-
-        # Verifying status message
-        self.assertGreater(len(self.harness.charm.unit.status.message), 0)
-        self.assertTrue(
-            self.harness.charm.unit.status.message.startswith("Waiting for ")
-        )
-        self.assertIn("kafka", self.harness.charm.unit.status.message)
-        self.assertNotIn("mongodb", self.harness.charm.unit.status.message)
-        self.assertIn("prometheus", self.harness.charm.unit.status.message)
-        self.assertTrue(self.harness.charm.unit.status.message.endswith(" relations"))
-
     def test_on_mongodb_unit_relation_changed(self) -> NoReturn:
         """Test to see if mongodb relation is updated."""
         self.harness.charm.on.start.emit()
@@ -263,35 +207,6 @@ class TestCharm(unittest.TestCase):
         self.assertIn("prometheus", self.harness.charm.unit.status.message)
         self.assertTrue(self.harness.charm.unit.status.message.endswith(" relations"))
 
-    def test_on_prometheus_app_relation_changed(self) -> NoReturn:
-        """Test to see if prometheus relation is updated."""
-        self.harness.charm.on.start.emit()
-
-        self.assertIsNone(self.harness.charm.state.prometheus_host)
-        self.assertIsNone(self.harness.charm.state.prometheus_port)
-
-        relation_id = self.harness.add_relation("prometheus", "prometheus")
-        self.harness.add_relation_unit(relation_id, "prometheus/0")
-        self.harness.update_relation_data(
-            relation_id, "prometheus", {"hostname": "prometheus", "port": 9090}
-        )
-
-        self.assertEqual(self.harness.charm.state.prometheus_host, "prometheus")
-        self.assertEqual(self.harness.charm.state.prometheus_port, 9090)
-
-        # Verifying status
-        self.assertIsInstance(self.harness.charm.unit.status, BlockedStatus)
-
-        # Verifying status message
-        self.assertGreater(len(self.harness.charm.unit.status.message), 0)
-        self.assertTrue(
-            self.harness.charm.unit.status.message.startswith("Waiting for ")
-        )
-        self.assertIn("kafka", self.harness.charm.unit.status.message)
-        self.assertIn("mongodb", self.harness.charm.unit.status.message)
-        self.assertNotIn("prometheus", self.harness.charm.unit.status.message)
-        self.assertTrue(self.harness.charm.unit.status.message.endswith(" relations"))
-
     def test_on_prometheus_unit_relation_changed(self) -> NoReturn:
         """Test to see if prometheus relation is updated."""
         self.harness.charm.on.start.emit()
index eff2713..777c18e 100644 (file)
@@ -20,7 +20,6 @@
 # osm-charmers@lists.launchpad.net
 ##
 
-from pydantic import ValidationError
 from typing import NoReturn
 import unittest
 
@@ -263,7 +262,7 @@ class TestPodSpec(unittest.TestCase):
         app_name = "mon"
         port = 8000
 
-        with self.assertRaises(ValidationError):
+        with self.assertRaises(ValueError):
             pod_spec.make_pod_spec(image_info, config, relation_state, app_name, port)
 
     def test_make_pod_spec_without_relation_state(self) -> NoReturn:
@@ -286,7 +285,7 @@ class TestPodSpec(unittest.TestCase):
         app_name = "mon"
         port = 8000
 
-        with self.assertRaises(ValidationError):
+        with self.assertRaises(ValueError):
             pod_spec.make_pod_spec(image_info, config, relation_state, app_name, port)
 
 
index 7ab02dd..0b1ab82 100644 (file)
@@ -56,7 +56,6 @@ deps =
   stestr
   mock
   ops
-  pydantic
 setenv =
   {[testenv]setenv}
   PYTHON=coverage run