Adding security_context flag to charms
[osm/devops.git] / installers / charm / ro / src / charm.py
index 9b2934f..2a8c110 100755 (executable)
@@ -31,7 +31,12 @@ 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, FilesV3Builder, PodSpecV3Builder
+from opslib.osm.pod import (
+    ContainerV3Builder,
+    FilesV3Builder,
+    PodRestartPolicy,
+    PodSpecV3Builder,
+)
 from opslib.osm.validator import ModelValidator, validator
 
 logger = logging.getLogger(__name__)
@@ -74,6 +79,8 @@ class ConfigModel(ModelValidator):
     openmano_tenant: str
     certificates: Optional[str]
     image_pull_policy: str
+    debug_mode: bool
+    security_context: bool
 
     @validator("log_level")
     def validate_log_level(cls, v):
@@ -211,12 +218,21 @@ class RoCharm(CharmedOsmBase):
         # Check relations
         self._check_missing_dependencies(config)
 
+        security_context_enabled = (
+            config.security_context if not config.debug_mode else False
+        )
+
         # Create Builder for the PodSpec
-        pod_spec_builder = PodSpecV3Builder()
+        pod_spec_builder = PodSpecV3Builder(
+            enable_security_context=security_context_enabled
+        )
 
         # Build Container
         container_builder = ContainerV3Builder(
-            self.app.name, image_info, config.image_pull_policy
+            self.app.name,
+            image_info,
+            config.image_pull_policy,
+            run_as_non_root=security_context_enabled,
         )
         certs_files = self._build_cert_files(config)
 
@@ -247,6 +263,15 @@ class RoCharm(CharmedOsmBase):
         )
 
         if config.enable_ng_ro:
+            # Add secrets to the pod
+            mongodb_secret_name = f"{self.app.name}-mongodb-secret"
+            pod_spec_builder.add_secret(
+                mongodb_secret_name,
+                {
+                    "uri": config.mongodb_uri or self.mongodb_client.connection_string,
+                    "commonkey": config.database_commonkey,
+                },
+            )
             container_builder.add_envs(
                 {
                     "OSMRO_MESSAGE_DRIVER": "kafka",
@@ -254,11 +279,18 @@ class RoCharm(CharmedOsmBase):
                     "OSMRO_MESSAGE_PORT": self.kafka_client.port,
                     # MongoDB configuration
                     "OSMRO_DATABASE_DRIVER": "mongo",
-                    "OSMRO_DATABASE_URI": config.mongodb_uri
-                    or self.mongodb_client.connection_string,
-                    "OSMRO_DATABASE_COMMONKEY": config.database_commonkey,
                 }
             )
+            container_builder.add_secret_envs(
+                secret_name=mongodb_secret_name,
+                envs={
+                    "OSMRO_DATABASE_URI": "uri",
+                    "OSMRO_DATABASE_COMMONKEY": "commonkey",
+                },
+            )
+            restart_policy = PodRestartPolicy()
+            restart_policy.add_secrets(secret_names=(mongodb_secret_name,))
+            pod_spec_builder.set_restart_policy(restart_policy)
 
         else:
             container_builder.add_envs(