CharmHub and new kafka and zookeeper charms
[osm/devops.git] / installers / charm / lcm / src / charm.py
index b034624..16e6f89 100755 (executable)
@@ -27,10 +27,10 @@ import logging
 from typing import NoReturn, Optional
 
 
 from typing import NoReturn, Optional
 
 
+from charms.kafka_k8s.v0.kafka import KafkaEvents, KafkaRequires
 from ops.main import main
 from opslib.osm.charm import CharmedOsmBase, RelationsMissing
 from opslib.osm.interfaces.http import HttpClient
 from ops.main import main
 from opslib.osm.charm import CharmedOsmBase, RelationsMissing
 from opslib.osm.interfaces.http import HttpClient
-from opslib.osm.interfaces.kafka import KafkaClient
 from opslib.osm.interfaces.mongo import MongoClient
 from opslib.osm.pod import ContainerV3Builder, PodRestartPolicy, PodSpecV3Builder
 from opslib.osm.validator import ModelValidator, validator
 from opslib.osm.interfaces.mongo import MongoClient
 from opslib.osm.pod import ContainerV3Builder, PodRestartPolicy, PodSpecV3Builder
 from opslib.osm.validator import ModelValidator, validator
@@ -111,6 +111,8 @@ class ConfigModel(ModelValidator):
     vca_stablerepourl: Optional[str]
     vca_helm_ca_certs: Optional[str]
     image_pull_policy: str
     vca_stablerepourl: Optional[str]
     vca_helm_ca_certs: Optional[str]
     image_pull_policy: str
+    debug_mode: bool
+    security_context: bool
 
     @validator("log_level")
     def validate_log_level(cls, v):
 
     @validator("log_level")
     def validate_log_level(cls, v):
@@ -138,17 +140,36 @@ class ConfigModel(ModelValidator):
 
 
 class LcmCharm(CharmedOsmBase):
 
 
 class LcmCharm(CharmedOsmBase):
+
+    on = KafkaEvents()
+
     def __init__(self, *args) -> NoReturn:
         super().__init__(
             *args,
             oci_image="image",
     def __init__(self, *args) -> NoReturn:
         super().__init__(
             *args,
             oci_image="image",
-            debug_mode_config_key="debug_mode",
-            debug_pubkey_config_key="debug_pubkey",
             vscode_workspace=VSCODE_WORKSPACE,
         )
             vscode_workspace=VSCODE_WORKSPACE,
         )
-        self.kafka_client = KafkaClient(self, "kafka")
-        self.framework.observe(self.on["kafka"].relation_changed, self.configure_pod)
-        self.framework.observe(self.on["kafka"].relation_broken, self.configure_pod)
+        if self.config.get("debug_mode"):
+            self.enable_debug_mode(
+                pubkey=self.config.get("debug_pubkey"),
+                hostpaths={
+                    "LCM": {
+                        "hostpath": self.config.get("debug_lcm_local_path"),
+                        "container-path": "/usr/lib/python3/dist-packages/osm_lcm",
+                    },
+                    "N2VC": {
+                        "hostpath": self.config.get("debug_n2vc_local_path"),
+                        "container-path": "/usr/lib/python3/dist-packages/n2vc",
+                    },
+                    "osm_common": {
+                        "hostpath": self.config.get("debug_common_local_path"),
+                        "container-path": "/usr/lib/python3/dist-packages/osm_common",
+                    },
+                },
+            )
+        self.kafka = KafkaRequires(self)
+        self.framework.observe(self.on.kafka_available, self.configure_pod)
+        self.framework.observe(self.on.kafka_broken, self.configure_pod)
 
         self.mongodb_client = MongoClient(self, "mongodb")
         self.framework.observe(self.on["mongodb"].relation_changed, self.configure_pod)
 
         self.mongodb_client = MongoClient(self, "mongodb")
         self.framework.observe(self.on["mongodb"].relation_changed, self.configure_pod)
@@ -161,7 +182,7 @@ class LcmCharm(CharmedOsmBase):
     def _check_missing_dependencies(self, config: ConfigModel):
         missing_relations = []
 
     def _check_missing_dependencies(self, config: ConfigModel):
         missing_relations = []
 
-        if self.kafka_client.is_missing_data_in_unit():
+        if not self.kafka.host or not self.kafka.port:
             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")
@@ -181,8 +202,14 @@ class LcmCharm(CharmedOsmBase):
         # Check relations
         self._check_missing_dependencies(config)
 
         # 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
         # Create Builder for the PodSpec
-        pod_spec_builder = PodSpecV3Builder()
+        pod_spec_builder = PodSpecV3Builder(
+            enable_security_context=security_context_enabled
+        )
 
         # Add secrets to the pod
         lcm_secret_name = f"{self.app.name}-lcm-secret"
 
         # Add secrets to the pod
         lcm_secret_name = f"{self.app.name}-lcm-secret"
@@ -197,7 +224,10 @@ class LcmCharm(CharmedOsmBase):
 
         # Build Container
         container_builder = ContainerV3Builder(
 
         # 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,
         )
         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(
@@ -211,8 +241,8 @@ class LcmCharm(CharmedOsmBase):
                 "OSMLCM_RO_TENANT": "osm",
                 # Kafka configuration
                 "OSMLCM_MESSAGE_DRIVER": "kafka",
                 "OSMLCM_RO_TENANT": "osm",
                 # Kafka configuration
                 "OSMLCM_MESSAGE_DRIVER": "kafka",
-                "OSMLCM_MESSAGE_HOST": self.kafka_client.host,
-                "OSMLCM_MESSAGE_PORT": self.kafka_client.port,
+                "OSMLCM_MESSAGE_HOST": self.kafka.host,
+                "OSMLCM_MESSAGE_PORT": self.kafka.port,
                 # Database configuration
                 "OSMLCM_DATABASE_DRIVER": "mongo",
                 # Storage configuration
                 # Database configuration
                 "OSMLCM_DATABASE_DRIVER": "mongo",
                 # Storage configuration
@@ -286,7 +316,7 @@ class LcmCharm(CharmedOsmBase):
 VSCODE_WORKSPACE = {
     "folders": [
         {"path": "/usr/lib/python3/dist-packages/osm_lcm"},
 VSCODE_WORKSPACE = {
     "folders": [
         {"path": "/usr/lib/python3/dist-packages/osm_lcm"},
-        {"path": "/usr/lib/python3/dist-packages/osm_n2vc"},
+        {"path": "/usr/lib/python3/dist-packages/n2vc"},
         {"path": "/usr/lib/python3/dist-packages/osm_common"},
     ],
     "settings": {},
         {"path": "/usr/lib/python3/dist-packages/osm_common"},
     ],
     "settings": {},