Fix validation error for ImagePullPolicy in charms
[osm/devops.git] / installers / charm / pol / src / charm.py
index b2e5883..36eb8c6 100755 (executable)
 
 
 import logging
 
 
 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 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,
 from opslib.osm.pod import (
     ContainerV3Builder,
     PodSpecV3Builder,
@@ -40,11 +42,14 @@ from opslib.osm.validator import ModelValidator, validator
 logger = logging.getLogger(__name__)
 
 PORT = 9999
 logger = logging.getLogger(__name__)
 
 PORT = 9999
+DEFAULT_MYSQL_DATABASE = "pol"
 
 
 class ConfigModel(ModelValidator):
     log_level: str
     mongodb_uri: Optional[str]
 
 
 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):
 
     @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
 
             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:
 
 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)
 
         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.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 = []
 
     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")
             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)
 
         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.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)
 
         # Check relations
         self._check_missing_dependencies(config)
@@ -96,7 +133,9 @@ class PolCharm(CharmedOsmBase):
         pod_spec_builder = PodSpecV3Builder()
 
         # Build Container
         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(
             {
         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_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()
             }
         )
         container = container_builder.build()
@@ -121,5 +162,26 @@ class PolCharm(CharmedOsmBase):
         return pod_spec_builder.build()
 
 
         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)
 if __name__ == "__main__":
     main(PolCharm)