Adding VIM refresh period to RO charm config
[osm/devops.git] / installers / charm / ro / src / charm.py
index 3b6b7e2..b76fba7 100755 (executable)
 
 import base64
 import logging
-from typing import NoReturn, Optional
+from typing import Dict, 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.kafka import KafkaClient
 from opslib.osm.interfaces.mongo import MongoClient
 from opslib.osm.interfaces.mysql import MysqlClient
 from opslib.osm.pod import (
@@ -79,6 +79,9 @@ class ConfigModel(ModelValidator):
     openmano_tenant: str
     certificates: Optional[str]
     image_pull_policy: str
+    debug_mode: bool
+    security_context: bool
+    period_refresh_active: Optional[int]
 
     @validator("log_level")
     def validate_log_level(cls, v):
@@ -120,23 +123,41 @@ class ConfigModel(ModelValidator):
     def certificates_dict(cls):
         return _extract_certificates(cls.certificates) if cls.certificates else {}
 
+    @validator("period_refresh_active")
+    def validate_vim_refresh_period(cls, v):
+        if v and v < 60 and v != -1:
+            raise ValueError(
+                "Refresh Period is too tight, insert >= 60 seconds or disable using -1"
+            )
+        return v
+
 
 class RoCharm(CharmedOsmBase):
     """GrafanaCharm Charm."""
 
+    on = KafkaEvents()
+
     def __init__(self, *args) -> NoReturn:
         """Prometheus Charm constructor."""
         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.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={
+                    "osm_common": {
+                        "hostpath": self.config.get("debug_common_local_path"),
+                        "container-path": "/usr/lib/python3/dist-packages/osm_common",
+                    },
+                    **_get_ro_host_paths(self.config.get("debug_ro_local_path")),
+                },
+            )
+        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.mysql_client = MysqlClient(self, "mysql")
         self.framework.observe(self.on["mysql"].relation_changed, self.configure_pod)
@@ -166,7 +187,7 @@ class RoCharm(CharmedOsmBase):
         missing_relations = []
 
         if config.enable_ng_ro:
-            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")
@@ -216,12 +237,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)
 
@@ -250,7 +280,12 @@ class RoCharm(CharmedOsmBase):
                 "OSMRO_LOG_LEVEL": config.log_level,
             }
         )
-
+        if config.period_refresh_active:
+            container_builder.add_envs(
+                {
+                    "OSMRO_PERIOD_REFRESH_ACTIVE": config.period_refresh_active,
+                }
+            )
         if config.enable_ng_ro:
             # Add secrets to the pod
             mongodb_secret_name = f"{self.app.name}-mongodb-secret"
@@ -264,8 +299,8 @@ class RoCharm(CharmedOsmBase):
             container_builder.add_envs(
                 {
                     "OSMRO_MESSAGE_DRIVER": "kafka",
-                    "OSMRO_MESSAGE_HOST": self.kafka_client.host,
-                    "OSMRO_MESSAGE_PORT": self.kafka_client.port,
+                    "OSMRO_MESSAGE_HOST": self.kafka.host,
+                    "OSMRO_MESSAGE_PORT": self.kafka.port,
                     # MongoDB configuration
                     "OSMRO_DATABASE_DRIVER": "mongo",
                 }
@@ -327,8 +362,9 @@ VSCODE_WORKSPACE = {
         {"path": "/usr/lib/python3/dist-packages/osm_rosdn_onosof"},
         {"path": "/usr/lib/python3/dist-packages/osm_rovim_aws"},
         {"path": "/usr/lib/python3/dist-packages/osm_rovim_azure"},
+        {"path": "/usr/lib/python3/dist-packages/osm_rovim_gcp"},
         {"path": "/usr/lib/python3/dist-packages/osm_rovim_fos"},
-        {"path": "/usr/lib/python3/dist-packages/osm_rovim_opennebula"},
+        {"path": "/usr/lib/python3/dist-packages/osm_rovim_opennebula"},
         {"path": "/usr/lib/python3/dist-packages/osm_rovim_openstack"},
         {"path": "/usr/lib/python3/dist-packages/osm_rovim_openvim"},
         {"path": "/usr/lib/python3/dist-packages/osm_rovim_vmware"},
@@ -348,5 +384,92 @@ VSCODE_WORKSPACE = {
     "settings": {},
 }
 
+
+def _get_ro_host_paths(ro_host_path: str) -> Dict:
+    """Get RO host paths"""
+    return (
+        {
+            "NG-RO": {
+                "hostpath": f"{ro_host_path}/NG-RO",
+                "container-path": "/usr/lib/python3/dist-packages/osm_ng_ro",
+            },
+            "RO-plugin": {
+                "hostpath": f"{ro_host_path}/RO-plugin",
+                "container-path": "/usr/lib/python3/dist-packages/osm_ro_plugin",
+            },
+            "RO-SDN-arista_cloudvision": {
+                "hostpath": f"{ro_host_path}/RO-SDN-arista_cloudvision",
+                "container-path": "/usr/lib/python3/dist-packages/osm_rosdn_arista_cloudvision",
+            },
+            "RO-SDN-dpb": {
+                "hostpath": f"{ro_host_path}/RO-SDN-dpb",
+                "container-path": "/usr/lib/python3/dist-packages/osm_rosdn_dpb",
+            },
+            "RO-SDN-dynpac": {
+                "hostpath": f"{ro_host_path}/RO-SDN-dynpac",
+                "container-path": "/usr/lib/python3/dist-packages/osm_rosdn_dynpac",
+            },
+            "RO-SDN-floodlight_openflow": {
+                "hostpath": f"{ro_host_path}/RO-SDN-floodlight_openflow",
+                "container-path": "/usr/lib/python3/dist-packages/osm_rosdn_floodlightof",
+            },
+            "RO-SDN-ietfl2vpn": {
+                "hostpath": f"{ro_host_path}/RO-SDN-ietfl2vpn",
+                "container-path": "/usr/lib/python3/dist-packages/osm_rosdn_ietfl2vpn",
+            },
+            "RO-SDN-juniper_contrail": {
+                "hostpath": f"{ro_host_path}/RO-SDN-juniper_contrail",
+                "container-path": "/usr/lib/python3/dist-packages/osm_rosdn_juniper_contrail",
+            },
+            "RO-SDN-odl_openflow": {
+                "hostpath": f"{ro_host_path}/RO-SDN-odl_openflow",
+                "container-path": "/usr/lib/python3/dist-packages/osm_rosdn_odlof",
+            },
+            "RO-SDN-onos_openflow": {
+                "hostpath": f"{ro_host_path}/RO-SDN-onos_openflow",
+                "container-path": "/usr/lib/python3/dist-packages/osm_rosdn_onosof",
+            },
+            "RO-SDN-onos_vpls": {
+                "hostpath": f"{ro_host_path}/RO-SDN-onos_vpls",
+                "container-path": "/usr/lib/python3/dist-packages/osm_rosdn_onos_vpls",
+            },
+            "RO-VIM-aws": {
+                "hostpath": f"{ro_host_path}/RO-VIM-aws",
+                "container-path": "/usr/lib/python3/dist-packages/osm_rovim_aws",
+            },
+            "RO-VIM-azure": {
+                "hostpath": f"{ro_host_path}/RO-VIM-azure",
+                "container-path": "/usr/lib/python3/dist-packages/osm_rovim_azure",
+            },
+            "RO-VIM-gcp": {
+                "hostpath": f"{ro_host_path}/RO-VIM-gcp",
+                "container-path": "/usr/lib/python3/dist-packages/osm_rovim_gcp",
+            },
+            "RO-VIM-fos": {
+                "hostpath": f"{ro_host_path}/RO-VIM-fos",
+                "container-path": "/usr/lib/python3/dist-packages/osm_rovim_fos",
+            },
+            "RO-VIM-opennebula": {
+                "hostpath": f"{ro_host_path}/RO-VIM-opennebula",
+                "container-path": "/usr/lib/python3/dist-packages/osm_rovim_opennebula",
+            },
+            "RO-VIM-openstack": {
+                "hostpath": f"{ro_host_path}/RO-VIM-openstack",
+                "container-path": "/usr/lib/python3/dist-packages/osm_rovim_openstack",
+            },
+            "RO-VIM-openvim": {
+                "hostpath": f"{ro_host_path}/RO-VIM-openvim",
+                "container-path": "/usr/lib/python3/dist-packages/osm_rovim_openvim",
+            },
+            "RO-VIM-vmware": {
+                "hostpath": f"{ro_host_path}/RO-VIM-vmware",
+                "container-path": "/usr/lib/python3/dist-packages/osm_rovim_vmware",
+            },
+        }
+        if ro_host_path
+        else {}
+    )
+
+
 if __name__ == "__main__":
     main(RoCharm)