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"""
"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)
# 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:
# 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")
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")