Fix validation error for ImagePullPolicy in charms
[osm/devops.git] / installers / charm / lcm / tests / test_charm.py
index bff3cee..1378e5c 100644 (file)
 import sys
 from typing import NoReturn
 import unittest
-from ops.model import ActiveStatus, BlockedStatus
-from ops.testing import Harness
 
 from charm import LcmCharm
+import mock
+from ops.model import ActiveStatus, BlockedStatus
+from ops.testing import Harness
 
 
 class TestCharm(unittest.TestCase):
-    """Prometheus Charm unit tests."""
+    """LCM Charm unit tests."""
 
     def setUp(self) -> NoReturn:
         """Test setup"""
@@ -42,12 +43,13 @@ class TestCharm(unittest.TestCase):
             "vca_host": "192.168.0.13",
             "vca_port": 17070,
             "vca_user": "admin",
-            "vca_password": "admin",
+            "vca_secret": "admin",
             "vca_pubkey": "key",
             "vca_cacert": "cacert",
             "vca_cloud": "cloud",
             "vca_k8s_cloud": "k8scloud",
             "database_commonkey": "commonkey",
+            "mongodb_uri": "",
             "log_level": "INFO",
         }
         self.harness.update_config(self.config)
@@ -78,6 +80,16 @@ class TestCharm(unittest.TestCase):
         # Assertions
         self.assertIsInstance(self.harness.charm.unit.status, ActiveStatus)
 
+    def test_with_relations_and_mongodb_config(
+        self,
+    ) -> NoReturn:
+        "Test with relations and mongodb config"
+        self.initialize_kafka_relation()
+        self.initialize_mongo_config()
+        self.initialize_ro_relation()
+        # Verifying status
+        self.assertNotIsInstance(self.harness.charm.unit.status, BlockedStatus)
+
     def test_with_relations(
         self,
     ) -> NoReturn:
@@ -88,6 +100,119 @@ class TestCharm(unittest.TestCase):
         # Verifying status
         self.assertNotIsInstance(self.harness.charm.unit.status, BlockedStatus)
 
+    def test_exception_mongodb_relation_and_config(
+        self,
+    ) -> NoReturn:
+        "Test with all relations and config for mongodb. Must fail"
+        self.initialize_mongo_relation()
+        self.initialize_mongo_config()
+        # Verifying status
+        self.assertIsInstance(self.harness.charm.unit.status, BlockedStatus)
+
+    def test_build_pod_spec(
+        self,
+    ) -> NoReturn:
+        expected_config = {
+            "OSMLCM_GLOBAL_LOGLEVEL": self.config["log_level"],
+            "OSMLCM_DATABASE_COMMONKEY": self.config["database_commonkey"],
+        }
+        expected_config.update(
+            {
+                f"OSMLCM_{k.upper()}": v
+                for k, v in self.config.items()
+                if k.startswith("vca_")
+            }
+        )
+        self.harness.charm._check_missing_dependencies = mock.Mock()
+        pod_spec = self.harness.charm.build_pod_spec(
+            {"imageDetails": {"imagePath": "lcm-image"}}
+        )
+        actual_config = pod_spec["containers"][0]["envConfig"]
+
+        self.assertDictContainsSubset(
+            expected_config,
+            actual_config,
+        )
+        for config_key in actual_config:
+            self.assertNotIn("VCA_MODEL_CONFIG", config_key)
+
+    def test_build_pod_spec_with_model_config(
+        self,
+    ) -> NoReturn:
+        self.harness.update_config(
+            {
+                "vca_model_config_agent_metadata_url": "string",
+                "vca_model_config_agent_stream": "string",
+                "vca_model_config_apt_ftp_proxy": "string",
+                "vca_model_config_apt_http_proxy": "string",
+                "vca_model_config_apt_https_proxy": "string",
+                "vca_model_config_apt_mirror": "string",
+                "vca_model_config_apt_no_proxy": "string",
+                "vca_model_config_automatically_retry_hooks": False,
+                "vca_model_config_backup_dir": "string",
+                "vca_model_config_cloudinit_userdata": "string",
+                "vca_model_config_container_image_metadata_url": "string",
+                "vca_model_config_container_image_stream": "string",
+                "vca_model_config_container_inherit_properties": "string",
+                "vca_model_config_container_networking_method": "string",
+                "vca_model_config_default_series": "string",
+                "vca_model_config_default_space": "string",
+                "vca_model_config_development": False,
+                "vca_model_config_disable_network_management": False,
+                "vca_model_config_egress_subnets": "string",
+                "vca_model_config_enable_os_refresh_update": False,
+                "vca_model_config_enable_os_upgrade": False,
+                "vca_model_config_fan_config": "string",
+                "vca_model_config_firewall_mode": "string",
+                "vca_model_config_ftp_proxy": "string",
+                "vca_model_config_http_proxy": "string",
+                "vca_model_config_https_proxy": "string",
+                "vca_model_config_ignore_machine_addresses": False,
+                "vca_model_config_image_metadata_url": "string",
+                "vca_model_config_image_stream": "string",
+                "vca_model_config_juju_ftp_proxy": "string",
+                "vca_model_config_juju_http_proxy": "string",
+                "vca_model_config_juju_https_proxy": "string",
+                "vca_model_config_juju_no_proxy": "string",
+                "vca_model_config_logforward_enabled": False,
+                "vca_model_config_logging_config": "string",
+                "vca_model_config_lxd_snap_channel": "string",
+                "vca_model_config_max_action_results_age": "string",
+                "vca_model_config_max_action_results_size": "string",
+                "vca_model_config_max_status_history_age": "string",
+                "vca_model_config_max_status_history_size": "string",
+                "vca_model_config_net_bond_reconfigure_delay": "string",
+                "vca_model_config_no_proxy": "string",
+                "vca_model_config_provisioner_harvest_mode": "string",
+                "vca_model_config_proxy_ssh": False,
+                "vca_model_config_snap_http_proxy": "string",
+                "vca_model_config_snap_https_proxy": "string",
+                "vca_model_config_snap_store_assertions": "string",
+                "vca_model_config_snap_store_proxy": "string",
+                "vca_model_config_snap_store_proxy_url": "string",
+                "vca_model_config_ssl_hostname_verification": False,
+                "vca_model_config_test_mode": False,
+                "vca_model_config_transmit_vendor_metrics": False,
+                "vca_model_config_update_status_hook_interval": "string",
+            }
+        )
+        expected_config = {
+            f"OSMLCM_{k.upper()}": v
+            for k, v in self.config.items()
+            if k.startswith("vca_model_config_")
+        }
+
+        self.harness.charm._check_missing_dependencies = mock.Mock()
+        pod_spec = self.harness.charm.build_pod_spec(
+            {"imageDetails": {"imagePath": "lcm-image"}}
+        )
+        actual_config = pod_spec["containers"][0]["envConfig"]
+
+        self.assertDictContainsSubset(
+            expected_config,
+            actual_config,
+        )
+
     def initialize_kafka_relation(self):
         kafka_relation_id = self.harness.add_relation("kafka", "kafka")
         self.harness.add_relation_unit(kafka_relation_id, "kafka/0")
@@ -95,6 +220,9 @@ class TestCharm(unittest.TestCase):
             kafka_relation_id, "kafka/0", {"host": "kafka", "port": 9092}
         )
 
+    def initialize_mongo_config(self):
+        self.harness.update_config({"mongodb_uri": "mongodb://mongo:27017"})
+
     def initialize_mongo_relation(self):
         mongodb_relation_id = self.harness.add_relation("mongodb", "mongodb")
         self.harness.add_relation_unit(mongodb_relation_id, "mongodb/0")