X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=installers%2Fcharm%2Fpol%2Fsrc%2Fcharm.py;h=36eb8c608946597fb3ef3580f0cafd187bfb1bd5;hb=refs%2Fchanges%2F27%2F11127%2F2;hp=b2e588368362556fe1978280d7167d1abf7666c3;hpb=996a5604c7d31f3758503b08a426f1f40619b17b;p=osm%2Fdevops.git diff --git a/installers/charm/pol/src/charm.py b/installers/charm/pol/src/charm.py index b2e58836..36eb8c60 100755 --- a/installers/charm/pol/src/charm.py +++ b/installers/charm/pol/src/charm.py @@ -24,12 +24,14 @@ import logging +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,11 +42,14 @@ 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] + image_pull_policy: str @validator("log_level") def validate_log_level(cls, v): @@ -58,10 +63,35 @@ class ConfigModel(ModelValidator): 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 + + @validator("image_pull_policy") + def validate_image_pull_policy(cls, v): + values = { + "always": "Always", + "ifnotpresent": "IfNotPresent", + "never": "Never", + } + v = v.lower() + if v not in values.keys(): + raise ValueError("value must be always, ifnotpresent or never") + return values[v] + class PolCharm(CharmedOsmBase): def __init__(self, *args) -> NoReturn: - super().__init__(*args, oci_image="image") + super().__init__( + *args, + oci_image="image", + debug_mode_config_key="debug_mode", + debug_pubkey_config_key="debug_pubkey", + vscode_workspace=VSCODE_WORKSPACE, + ) self.kafka_client = KafkaClient(self, "kafka") self.framework.observe(self.on["kafka"].relation_changed, self.configure_pod) @@ -71,6 +101,10 @@ 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 = [] @@ -78,7 +112,8 @@ class PolCharm(CharmedOsmBase): missing_relations.append("kafka") 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) @@ -88,6 +123,8 @@ class PolCharm(CharmedOsmBase): 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) @@ -96,7 +133,9 @@ class PolCharm(CharmedOsmBase): pod_spec_builder = PodSpecV3Builder() # Build Container - container_builder = ContainerV3Builder(self.app.name, image_info) + container_builder = ContainerV3Builder( + self.app.name, image_info, config.image_pull_policy + ) container_builder.add_port(name=self.app.name, port=PORT) container_builder.add_envs( { @@ -111,6 +150,8 @@ class PolCharm(CharmedOsmBase): "OSMPOL_DATABASE_DRIVER": "mongo", "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() @@ -121,5 +162,26 @@ class PolCharm(CharmedOsmBase): return pod_spec_builder.build() +VSCODE_WORKSPACE = { + "folders": [ + {"path": "/usr/lib/python3/dist-packages/osm_policy_module"}, + {"path": "/usr/lib/python3/dist-packages/osm_common"}, + ], + "settings": {}, + "launch": { + "version": "0.2.0", + "configurations": [ + { + "name": "POL", + "type": "python", + "request": "launch", + "module": "osm_policy_module.cmd.policy_module_agent", + "justMyCode": False, + } + ], + }, +} + + if __name__ == "__main__": main(PolCharm)