Adding security_context flag to charms
[osm/devops.git] / installers / charm / mysqld-exporter / src / charm.py
index bcd43b5..91be02a 100755 (executable)
@@ -36,6 +36,7 @@ from opslib.osm.interfaces.prometheus import PrometheusScrapeTarget
 from opslib.osm.pod import (
     ContainerV3Builder,
     IngressResourceV3Builder,
+    PodRestartPolicy,
     PodSpecV3Builder,
 )
 from opslib.osm.validator import ModelValidator, validator
@@ -53,6 +54,8 @@ class ConfigModel(ModelValidator):
     ingress_whitelist_source_range: Optional[str]
     tls_secret_name: Optional[str]
     mysql_uri: Optional[str]
+    image_pull_policy: str
+    security_context: bool
 
     @validator("site_url")
     def validate_site_url(cls, v):
@@ -74,6 +77,18 @@ class ConfigModel(ModelValidator):
             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 MysqlExporterCharm(CharmedOsmBase):
     def __init__(self, *args) -> NoReturn:
@@ -131,7 +146,7 @@ class MysqlExporterCharm(CharmedOsmBase):
         if self.unit.is_leader():
             self.dashboard_target.publish_info(
                 name="osm-mysql",
-                dashboard=Path("files/mysql_exporter_dashboard.json").read_text(),
+                dashboard=Path("templates/mysql_exporter_dashboard.json").read_text(),
             )
 
     def _check_missing_dependencies(self, config: ConfigModel):
@@ -169,11 +184,31 @@ class MysqlExporterCharm(CharmedOsmBase):
         # Check relations
         self._check_missing_dependencies(config)
 
+        data_source = (
+            config.mysql_uri.replace("mysql://", "").split("/")[0]
+            if config.mysql_uri
+            else f"root:{self.mysql_client.root_password}@{self.mysql_client.host}:{self.mysql_client.port}"
+        )
+
         # Create Builder for the PodSpec
-        pod_spec_builder = PodSpecV3Builder()
+        pod_spec_builder = PodSpecV3Builder(
+            enable_security_context=config.security_context
+        )
+
+        # Add secrets to the pod
+        mysql_secret_name = f"{self.app.name}-mysql-secret"
+        pod_spec_builder.add_secret(
+            mysql_secret_name,
+            {"data_source": data_source},
+        )
 
         # Build container
-        container_builder = ContainerV3Builder(self.app.name, image_info)
+        container_builder = ContainerV3Builder(
+            self.app.name,
+            image_info,
+            config.image_pull_policy,
+            run_as_non_root=config.security_context,
+        )
         container_builder.add_port(name=self.app.name, port=PORT)
         container_builder.add_http_readiness_probe(
             path="/api/health",
@@ -191,23 +226,20 @@ class MysqlExporterCharm(CharmedOsmBase):
             timeout_seconds=30,
             failure_threshold=10,
         )
-
-        data_source = (
-            config.mysql_uri.replace("mysql://", "").split("/")[0]
-            if config.mysql_uri
-            else f"root:{self.mysql_client.root_password}@{self.mysql_client.host}:{self.mysql_client.port}"
+        container_builder.add_secret_envs(
+            mysql_secret_name, {"DATA_SOURCE_NAME": "data_source"}
         )
 
-        container_builder.add_envs(
-            {
-                "DATA_SOURCE_NAME": data_source,
-            }
-        )
         container = container_builder.build()
 
         # Add container to PodSpec
         pod_spec_builder.add_container(container)
 
+        # Add Pod restart policy
+        restart_policy = PodRestartPolicy()
+        restart_policy.add_secrets(secret_names=(mysql_secret_name))
+        pod_spec_builder.set_restart_policy(restart_policy)
+
         # Add ingress resources to PodSpec if site url exists
         if config.site_url:
             parsed = urlparse(config.site_url)
@@ -237,8 +269,6 @@ class MysqlExporterCharm(CharmedOsmBase):
             ingress_resource = ingress_resource_builder.build()
             pod_spec_builder.add_ingress_resource(ingress_resource)
 
-        logger.debug(pod_spec_builder.build())
-
         return pod_spec_builder.build()