コード例 #1
0
 def test_resource_folder_cleanup(self):
     harness = Harness(CharmBase,
                       meta='''
         name: test-app
         resources:
           image:
             type: oci-image
             description: "Image to deploy."
         ''')
     self.addCleanup(harness.cleanup)
     harness.populate_oci_resources()
     path = harness.model.resources.fetch('image')
     self.assertTrue(path.exists())
     harness.cleanup()
     self.assertFalse(path.exists())
     self.assertFalse(path.parent.exists())
     self.assertFalse(path.parent.parent.exists())
コード例 #2
0
ファイル: conftest.py プロジェクト: dasm/charm-opensearch-k8s
def harness():
    _harness = Harness(CharmOpenSearch)
    _harness.set_model_name("testing")
    _harness.begin()
    yield _harness
    _harness.cleanup()
コード例 #3
0
ファイル: conftest.py プロジェクト: addyess/charm-splunk-k8s
def harness():
    _harness = Harness(SplunkCharm)
    _harness.set_model_name("testing")
    _harness.begin()
    yield _harness
    _harness.cleanup()
コード例 #4
0
class TestKuberneteseInfluxdbCharm(unittest.TestCase):
    def setUp(self) -> None:
        """Setup the harness object."""
        self.harness = Harness(KubernetesInfluxdbCharm)
        self.harness.begin()
        self.harness.add_oci_resource("influxdb2-image")

    def tearDown(self):
        """Cleanup the harness."""
        self.harness.cleanup()

    #
    # Hooks
    #
    def test__on_config_changed(self) -> None:
        self.harness.update_config({"port": "9999"})
        self.assertEqual(self.harness.charm.unit.status,
                         ActiveStatus("Pod is ready"))

    def test__on_config_changed_pebble_api_connection_error_1(self) -> None:
        self.harness.charm.unit.get_container = mock.MagicMock()
        self.harness.charm.unit.get_container.return_value.get_plan = mock.MagicMock(
            side_effect=ConnectionError("connection timeout"))
        with self.assertLogs(level="DEBUG") as logger:
            self.harness.update_config({"port": "9999"})
            self.assertIn(
                "DEBUG:charm:The Pebble API is not ready yet. Error message: connection timeout",
                logger.output,
            )
            self.assertNotIn(
                "DEBUG:charm:Pebble plan has already been loaded. No need to update the config.",
                logger.output,
            )

    def test__on_config_changed_pebble_api_connection_error_2(self) -> None:
        self.harness.charm.unit.get_container = mock.MagicMock()
        self.harness.charm.unit.get_container.return_value.get_plan.return_value.to_dict = (
            mock.MagicMock(return_value={}))
        self.harness.charm.unit.get_container.return_value.add_layer = mock.MagicMock(
            side_effect=ConnectionError("connection timeout"))
        with self.assertLogs(level="DEBUG") as logger:
            self.harness.update_config({"port": "9999"})
            self.assertIn(
                "DEBUG:charm:The Pebble API is not ready yet. Error message: connection timeout",
                logger.output,
            )
            self.assertNotIn(
                "DEBUG:charm:Pebble plan has already been loaded. No need to update the config.",
                logger.output,
            )

    def test__on_config_changed_same_plan(self) -> None:
        self.harness.charm.unit.get_container = mock.MagicMock()
        self.harness.charm.unit.get_container.return_value.get_plan.return_value.to_dict = (
            mock.MagicMock(return_value=self.harness.charm._influxdb2_layer()))
        with self.assertLogs(level="DEBUG") as logger:
            self.harness.update_config({"port": "9999"})
            self.assertIn(
                "DEBUG:charm:Pebble plan has already been loaded. No need to update the config.",
                logger.output,
            )
            self.assertNotIn(
                "DEBUG:charm:The Pebble API is not ready yet. Error message: connection timeout",
                logger.output,
            )

    #
    # Test Relations
    #
    def test__grafana_source_data(self,
                                  expected_reldata: Optional[Dict] = None
                                  ) -> None:
        # Initialize values
        interface: str = "grafana-source"
        rel_app: str = "grafana"
        rel_unit: str = "grafana/0"
        rel_data: Dict[str, str] = {}
        expected: Dict[str, str] = {}

        if expected_reldata is None:
            # relation not initialized
            expected_reldata = {
                key: ""
                for key in ["private-address", "port", "source-type"]
            }

        # Initialize unit state (related to grafana)
        rel_id = self.harness.add_relation(interface, rel_app)
        self.harness.add_relation_unit(rel_id, rel_unit)

        # Trigger the -relation-changed hook, which will call the observed event
        self.harness.update_relation_data(rel_id, rel_app, rel_data)

        self.assertIsInstance(rel_id, int)

        # Verify the relation data set by the influxdb2 charm
        relation = self.harness.model.get_relation(interface)

        for key, expected_val in expected.items():
            self.assertEqual(
                relation.data[self.harness.charm.unit].get(key, ""),
                expected_val)

    @mock.patch("subprocess.check_output")
    def test__grafana_source_data_leader(
            self, mock_check_output: mock.MagicMock) -> None:
        mock_check_output.return_value = b"10.0.0.1"
        expected_reldata: Dict[str, str] = {
            "private-address": "10.0.0.1",
            "port": "8086",
            "source-type": "influxdb",
        }
        self.harness.set_leader(True)
        self.test__grafana_source_data(expected_reldata=expected_reldata)

    #
    # Test Helpers
    #
    def test__influxdb2_layer(self) -> None:
        expected = {
            "summary": "influxdb2 layer",
            "description": "pebble config layer for influxdb2",
            "services": {
                "influxdb2": {
                    "override": "replace",
                    "summary": "influxdb2 service",
                    "command": "/entrypoint.sh influxd",
                    "startup": "enabled",
                    "environment": {
                        "DOCKER_INFLUXDB_INIT_MODE": "setup",
                        "DOCKER_INFLUXDB_INIT_USERNAME": "******",
                        "DOCKER_INFLUXDB_INIT_PASSWORD": "******",
                        "DOCKER_INFLUXDB_INIT_ORG": "influxdata",
                        "DOCKER_INFLUXDB_INIT_BUCKET": "default",
                        "DOCKER_INFLUXDB_INIT_RETENTION": "0s",
                        "DOCKER_INFLUXDB_INIT_ADMIN_TOKEN": "asdfasdfasdf",
                        "INFLUXD_BOLT_PATH":
                        "/var/lib/influxdbv2/influxd.bolt",
                        "INFLUXD_ENGINE_PATH": "/var/lib/influxdbv2",
                        "INFLUXD_HTTP_BIND_ADDRESS": ":8086",
                    },
                }
            },
        }

        self.assertEqual(set(self.harness.charm._influxdb2_layer()),
                         set(expected))

    def test__is_running(self) -> None:
        container = self.harness.charm.unit.get_container(WORKLOAD_CONTAINER)
        service_not_running = self.harness.charm._is_running(
            container, "influxd")
        self.assertFalse(service_not_running)