Removing pydantic from MON charm
Change-Id: Ice1c19c142f16ad8af6b9bc2ac20295f3b5215b9
Signed-off-by: sousaedu <eduardo.sousa@canonical.com>
diff --git a/installers/charm/mon/src/charm.py b/installers/charm/mon/src/charm.py
index a6f405f..f51213d 100755
--- a/installers/charm/mon/src/charm.py
+++ b/installers/charm/mon/src/charm.py
@@ -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 @@
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 @@
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 @@
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 @@
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
diff --git a/installers/charm/mon/src/pod_spec.py b/installers/charm/mon/src/pod_spec.py
index 5c9182a..1c50565 100644
--- a/installers/charm/mon/src/pod_spec.py
+++ b/installers/charm/mon/src/pod_spec.py
@@ -21,35 +21,59 @@
##
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)
-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
+ for key, validator in relation_validators.items():
+ valid = validator(relation_data.get(key), relation_data)
+
+ if not valid:
+ problems.append(key)
+
+ 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 @@
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)