X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=installers%2Fcharm%2Fpol%2Fsrc%2Fcharm.py;h=1ad1e266415e7ffa32c45220f4e9e3f55a734cb5;hb=318551148eb32854ea4959e340eaba56f1f2de5f;hp=d339e1ce0f679f55e40e7a85f53a8e8ffeb3ba70;hpb=c753dc5f89180d11c1049f6398d74a4f99d7acd5;p=osm%2Fdevops.git diff --git a/installers/charm/pol/src/charm.py b/installers/charm/pol/src/charm.py index d339e1ce..1ad1e266 100755 --- a/installers/charm/pol/src/charm.py +++ b/installers/charm/pol/src/charm.py @@ -24,12 +24,14 @@ import logging -from typing import NoReturn +import re +from typing import NoReturn, Optional from ops.main import main from opslib.osm.charm import CharmedOsmBase, RelationsMissing from opslib.osm.interfaces.kafka import KafkaClient from opslib.osm.interfaces.mongo import MongoClient +from opslib.osm.interfaces.mysql import MysqlClient from opslib.osm.pod import ( ContainerV3Builder, PodSpecV3Builder, @@ -40,10 +42,13 @@ from opslib.osm.validator import ModelValidator, validator logger = logging.getLogger(__name__) PORT = 9999 +DEFAULT_MYSQL_DATABASE = "pol" class ConfigModel(ModelValidator): log_level: str + mongodb_uri: Optional[str] + mysql_uri: Optional[str] @validator("log_level") def validate_log_level(cls, v): @@ -51,6 +56,19 @@ class ConfigModel(ModelValidator): raise ValueError("value must be INFO or DEBUG") return v + @validator("mongoddb_uri") + def validate_mongodb_uri(cls, v): + if v and not v.startswith("mongodb://"): + raise ValueError("mongodb_uri is not properly formed") + return v + + @validator("mysql_uri") + def validate_mysql_uri(cls, v): + pattern = re.compile("^mysql:\/\/.*:.*@.*:\d+\/.*$") # noqa: W605 + if v and not pattern.search(v): + raise ValueError("mysql_uri is not properly formed") + return v + class PolCharm(CharmedOsmBase): def __init__(self, *args) -> NoReturn: @@ -64,24 +82,37 @@ class PolCharm(CharmedOsmBase): self.framework.observe(self.on["mongodb"].relation_changed, self.configure_pod) self.framework.observe(self.on["mongodb"].relation_broken, self.configure_pod) + self.mysql_client = MysqlClient(self, "mysql") + self.framework.observe(self.on["mysql"].relation_changed, self.configure_pod) + self.framework.observe(self.on["mysql"].relation_broken, self.configure_pod) + def _check_missing_dependencies(self, config: ConfigModel): missing_relations = [] if self.kafka_client.is_missing_data_in_unit(): missing_relations.append("kafka") - if self.mongodb_client.is_missing_data_in_unit(): + if not config.mongodb_uri and self.mongodb_client.is_missing_data_in_unit(): missing_relations.append("mongodb") - + if not config.mysql_uri and self.mysql_client.is_missing_data_in_unit(): + missing_relations.append("mysql") if missing_relations: raise RelationsMissing(missing_relations) def build_pod_spec(self, image_info): # Validate config config = ConfigModel(**dict(self.config)) + + if config.mongodb_uri and not self.mongodb_client.is_missing_data_in_unit(): + raise Exception("Mongodb data cannot be provided via config and relation") + if config.mysql_uri and not self.mysql_client.is_missing_data_in_unit(): + raise Exception("Mysql data cannot be provided via config and relation") + # Check relations self._check_missing_dependencies(config) + # Create Builder for the PodSpec pod_spec_builder = PodSpecV3Builder() + # Build Container container_builder = ContainerV3Builder(self.app.name, image_info) container_builder.add_port(name=self.app.name, port=PORT) @@ -96,13 +127,17 @@ class PolCharm(CharmedOsmBase): "OSMPOL_MESSAGE_PORT": self.kafka_client.port, # Database configuration "OSMPOL_DATABASE_DRIVER": "mongo", - "OSMPOL_DATABASE_URI": self.mongodb_client.connection_string, + "OSMPOL_DATABASE_URI": config.mongodb_uri + or self.mongodb_client.connection_string, + "OSMPOL_SQL_DATABASE_URI": config.mysql_uri + or self.mysql_client.get_root_uri(DEFAULT_MYSQL_DATABASE), } ) - container = container_builder.build() + # Add container to pod spec pod_spec_builder.add_container(container) + return pod_spec_builder.build()