From 4b58e035fb867015cd261f2e7f148b1712668aee Mon Sep 17 00:00:00 2001 From: Jan Klecka Date: Mon, 11 Aug 2025 19:40:13 +0200 Subject: [PATCH 1/4] feat(contact-point): support retrieval by name --- grafana_api/alerting_provisioning.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/grafana_api/alerting_provisioning.py b/grafana_api/alerting_provisioning.py index a8257ec..022afb8 100644 --- a/grafana_api/alerting_provisioning.py +++ b/grafana_api/alerting_provisioning.py @@ -226,6 +226,30 @@ def get_all_contact_points(self) -> list: else: return api_call + def get_contact_point(self, name: str) -> list: + """Return contact points that exactly match the given name. + + This method does not support partial matching — the `name` value must + match exactly. + + Raises: + Exception: If an unspecified error occurs during the API call. + + Returns: + list: A list of contact points whose `name` property exactly matches + the provided `name`. + """ + + api_call: list = Api(self.grafana_api_model).call_the_api( + f"{APIEndpoints.ALERTING_PROVISIONING.value}/contact-points?name={name}" + ) + + if api_call == list(): + logging.error(f"Check the error: {api_call}.") + raise Exception + else: + return api_call + def add_contact_point( self, embedded_contact_point: EmbeddedContactPoint, From 88a631d66a4780c033fe0e93728961ca174d5ba7 Mon Sep 17 00:00:00 2001 From: Jan Klecka Date: Mon, 11 Aug 2025 20:01:47 +0200 Subject: [PATCH 2/4] add tests and readme --- README.md | 1 + tests/integrationtest/test_alerting_provisioning.py | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/README.md b/README.md index bf0dceb..faa7a02 100644 --- a/README.md +++ b/README.md @@ -137,6 +137,7 @@ In general, my focus on this project is to implement and deliver old and new fea - Update ethe interval fo the alert rule group - Delete alert rule - Get all contact points +- Get contact point by name - Add contact point - Update contact point - Delete contact point diff --git a/tests/integrationtest/test_alerting_provisioning.py b/tests/integrationtest/test_alerting_provisioning.py index 1094ff6..fcc40d3 100644 --- a/tests/integrationtest/test_alerting_provisioning.py +++ b/tests/integrationtest/test_alerting_provisioning.py @@ -119,6 +119,12 @@ def test_i_update_contact_point(self): "test1", self.alerting_provisioning.get_all_contact_points()[1].get("name") ) + def test_j_get_specific_contact_points(self): + self.assertEqual( + "email receiver", + self.alerting_provisioning.get_contact_point("email receiver")[0], + ) + def test_j_get_notification_policies(self): self.assertEqual( "grafana-default-email", From a7a7e4b02ad975f7bbc984768cbe5e7605765564 Mon Sep 17 00:00:00 2001 From: Jan Klecka Date: Tue, 12 Aug 2025 20:56:26 +0200 Subject: [PATCH 3/4] tests(contact-point): Extend unittests of contact point new functionality --- grafana_api/alerting_provisioning.py | 6 +--- tests/unittests/test_alerting_provisioning.py | 32 +++++++++++++++++-- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/grafana_api/alerting_provisioning.py b/grafana_api/alerting_provisioning.py index 022afb8..d98249a 100644 --- a/grafana_api/alerting_provisioning.py +++ b/grafana_api/alerting_provisioning.py @@ -244,11 +244,7 @@ def get_contact_point(self, name: str) -> list: f"{APIEndpoints.ALERTING_PROVISIONING.value}/contact-points?name={name}" ) - if api_call == list(): - logging.error(f"Check the error: {api_call}.") - raise Exception - else: - return api_call + return api_call def add_contact_point( self, diff --git a/tests/unittests/test_alerting_provisioning.py b/tests/unittests/test_alerting_provisioning.py index 65acf7f..3677832 100644 --- a/tests/unittests/test_alerting_provisioning.py +++ b/tests/unittests/test_alerting_provisioning.py @@ -223,13 +223,41 @@ def test_get_all_contact_points(self, call_the_api_mock): grafana_api_model=model ) - call_the_api_mock.return_value = list([{"test": "test"}]) + call_the_api_mock.return_value = list([{"test": "test"}, {"specific-contact-point": "specific contact point"}]) self.assertEqual( - list([{"test": "test"}]), + list([{"test": "test"}, {"specific-contact-point": "specific contact point"}]), alerting_provisioning.get_all_contact_points(), ) + @patch("grafana_api.api.Api.call_the_api") + def test_get_specific_contact_points(self, call_the_api_mock): + model: APIModel = APIModel(host=MagicMock(), token=MagicMock()) + alerting_provisioning: AlertingProvisioning = AlertingProvisioning( + grafana_api_model=model + ) + + call_the_api_mock.return_value = list([{"specific-contact-point": "specific contact point"}]) + + self.assertEqual( + list([{"specific-contact-point": "specific contact point"}]), + alerting_provisioning.get_contact_point("specific-contact-point"), + ) + + @patch("grafana_api.api.Api.call_the_api") + def test_get_specific_contact_points_empty_on_partial_name_should_return_empty_list(self, call_the_api_mock): + model: APIModel = APIModel(host=MagicMock(), token=MagicMock()) + alerting_provisioning: AlertingProvisioning = AlertingProvisioning( + grafana_api_model=model + ) + + call_the_api_mock.return_value = list([]) + + self.assertEqual( + list([]), + alerting_provisioning.get_contact_point("contact-point-invalid-name"), + ) + @patch("grafana_api.api.Api.call_the_api") def test_get_all_contact_points_not_possible(self, call_the_api_mock): model: APIModel = APIModel(host=MagicMock(), token=MagicMock()) From 250f0f295c866b3c21b27db0cfa0c39758d87f7f Mon Sep 17 00:00:00 2001 From: Jan Klecka Date: Tue, 12 Aug 2025 20:59:05 +0200 Subject: [PATCH 4/4] better handling for cp response to catch errors --- grafana_api/alerting_provisioning.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/grafana_api/alerting_provisioning.py b/grafana_api/alerting_provisioning.py index d98249a..0a292e1 100644 --- a/grafana_api/alerting_provisioning.py +++ b/grafana_api/alerting_provisioning.py @@ -244,6 +244,10 @@ def get_contact_point(self, name: str) -> list: f"{APIEndpoints.ALERTING_PROVISIONING.value}/contact-points?name={name}" ) + if not isinstance(api_call, list): + logging.error(f"Check the error: {api_call}.") + raise Exception + return api_call def add_contact_point(