This is an automated email from the ASF dual-hosted git repository.

eladkal pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new 38860c1627 Add `OpsgenieDeleteAlertOperator` (#23405)
38860c1627 is described below

commit 38860c1627ad88b6391af29e85828579ec2fdf76
Author: eladkal <[email protected]>
AuthorDate: Fri May 6 14:37:03 2022 +0300

    Add `OpsgenieDeleteAlertOperator` (#23405)
    
    * Add `OpsgenieDeleteAlertOperator`
---
 .../example_dags/example_opsgenie_alert.py         |  7 +++
 airflow/providers/opsgenie/hooks/opsgenie.py       | 30 ++++++++++++
 airflow/providers/opsgenie/operators/opsgenie.py   | 53 ++++++++++++++++++++++
 .../operators/opsgenie_alert.rst                   | 18 ++++++++
 tests/providers/opsgenie/hooks/test_opsgenie.py    | 16 +++++++
 .../providers/opsgenie/operators/test_opsgenie.py  | 30 ++++++++++++
 6 files changed, 154 insertions(+)

diff --git a/airflow/providers/opsgenie/example_dags/example_opsgenie_alert.py 
b/airflow/providers/opsgenie/example_dags/example_opsgenie_alert.py
index 96e6293d3b..ad294e5e6e 100644
--- a/airflow/providers/opsgenie/example_dags/example_opsgenie_alert.py
+++ b/airflow/providers/opsgenie/example_dags/example_opsgenie_alert.py
@@ -20,6 +20,7 @@ from airflow import DAG
 from airflow.providers.opsgenie.operators.opsgenie import (
     OpsgenieCloseAlertOperator,
     OpsgenieCreateAlertOperator,
+    OpsgenieDeleteAlertOperator,
 )
 
 with DAG(
@@ -38,3 +39,9 @@ with DAG(
         task_id="opsgenie_close_task", identifier="identifier_example"
     )
     # [END howto_opsgenie_close_alert_operator]
+
+    # [START howto_opsgenie_delete_alert_operator]
+    opsgenie_delete_alert_operator = OpsgenieDeleteAlertOperator(
+        task_id="opsgenie_delete_task", identifier="identifier_example"
+    )
+    # [END howto_opsgenie_delete_alert_operator]
diff --git a/airflow/providers/opsgenie/hooks/opsgenie.py 
b/airflow/providers/opsgenie/hooks/opsgenie.py
index 28e7c7452a..567e90c17e 100644
--- a/airflow/providers/opsgenie/hooks/opsgenie.py
+++ b/airflow/providers/opsgenie/hooks/opsgenie.py
@@ -132,3 +132,33 @@ class OpsgenieAlertHook(BaseHook):
         except OpenApiException as e:
             self.log.exception('Exception when closing alert in opsgenie with 
payload: %s', payload)
             raise e
+
+    def delete_alert(
+        self,
+        identifier: str,
+        identifier_type: Optional[str] = None,
+        user: Optional[str] = None,
+        source: Optional[str] = None,
+    ) -> SuccessResponse:
+        """
+        Delete an alert in Opsgenie
+
+        :param identifier: Identifier of alert which could be alert id, tiny 
id or alert alias.
+        :param identifier_type: Type of the identifier that is provided as an 
in-line parameter.
+            Possible values are 'id', 'alias' or 'tiny'
+        :param user: Display name of the request owner.
+        :param source: Display name of the request source
+        :return: SuccessResponse
+        :rtype: opsgenie_sdk.SuccessResponse
+        """
+        try:
+            api_response = self.alert_api_instance.delete_alert(
+                identifier=identifier,
+                identifier_type=identifier_type,
+                user=user,
+                source=source,
+            )
+            return api_response
+        except OpenApiException as e:
+            self.log.exception('Exception when calling AlertApi->delete_alert: 
%s\n', e)
+            raise e
diff --git a/airflow/providers/opsgenie/operators/opsgenie.py 
b/airflow/providers/opsgenie/operators/opsgenie.py
index d072d82f41..7521316313 100644
--- a/airflow/providers/opsgenie/operators/opsgenie.py
+++ b/airflow/providers/opsgenie/operators/opsgenie.py
@@ -208,3 +208,56 @@ class OpsgenieCloseAlertOperator(BaseOperator):
             payload=self._build_opsgenie_close_alert_payload(),
             kwargs=self.close_alert_kwargs,
         )
+
+
+class OpsgenieDeleteAlertOperator(BaseOperator):
+    """
+    This operator allows you to delete alerts in Opsgenie.
+    Accepts a connection that has an Opsgenie API key as the connection's 
password.
+    This operator sets the domain to conn_id.host, and if not set will default
+    to ``https://api.opsgenie.com``.
+
+    Each Opsgenie API key can be pre-configured to a team integration.
+    You can override these defaults in this operator.
+
+    .. seealso::
+        For more information on how to use this operator, take a look at the 
guide:
+        :ref:`howto/operator:OpsgenieDeleteAlertOperator`
+
+    :param opsgenie_conn_id: The name of the Opsgenie connection to use
+    :param identifier: Identifier of alert which could be alert id, tiny id or 
alert alias
+    :param identifier_type: Type of the identifier that is provided as an 
in-line parameter.
+        Possible values are 'id', 'alias' or 'tiny'
+    :param user: Display name of the request owner
+    :param source: Display name of the request source
+    """
+
+    template_fields: Sequence[str] = ('identifier',)
+
+    def __init__(
+        self,
+        *,
+        identifier: str,
+        opsgenie_conn_id: str = 'opsgenie_default',
+        identifier_type: Optional[str] = None,
+        user: Optional[str] = None,
+        source: Optional[str] = None,
+        **kwargs,
+    ) -> None:
+        super().__init__(**kwargs)
+
+        self.opsgenie_conn_id = opsgenie_conn_id
+        self.identifier = identifier
+        self.identifier_type = identifier_type
+        self.user = user
+        self.source = source
+
+    def execute(self, context: 'Context') -> None:
+        """Call the OpsgenieAlertHook to delete alert"""
+        hook = OpsgenieAlertHook(self.opsgenie_conn_id)
+        hook.delete_alert(
+            identifier=self.identifier,
+            identifier_type=self.identifier_type,
+            user=self.user,
+            source=self.source,
+        )
diff --git 
a/docs/apache-airflow-providers-opsgenie/operators/opsgenie_alert.rst 
b/docs/apache-airflow-providers-opsgenie/operators/opsgenie_alert.rst
index 8fad51f52f..7da63f55e5 100644
--- a/docs/apache-airflow-providers-opsgenie/operators/opsgenie_alert.rst
+++ b/docs/apache-airflow-providers-opsgenie/operators/opsgenie_alert.rst
@@ -48,3 +48,21 @@ Close alert in Opsgenie.
     :language: python
     :start-after: [START howto_opsgenie_close_alert_operator]
     :end-before: [END howto_opsgenie_close_alert_operator]
+
+.. _howto/operator:OpsgenieDeleteAlertOperator:
+
+OpsgenieDeleteAlertOperator
+===========================
+
+Use the 
:class:`~airflow.providers.opsgenie.operators.opsgenie.OpsgenieDeleteAlertOperator`
 to delete alert in opsgenie.
+
+
+Using the Operator
+^^^^^^^^^^^^^^^^^^
+Delete alert in Opsgenie.
+
+.. exampleinclude:: 
/../../airflow/providers/opsgenie/example_dags/example_opsgenie_alert.py
+    :language: python
+    :dedent: 4
+    :start-after: [START howto_opsgenie_delete_alert_operator]
+    :end-before: [END howto_opsgenie_delete_alert_operator]
diff --git a/tests/providers/opsgenie/hooks/test_opsgenie.py 
b/tests/providers/opsgenie/hooks/test_opsgenie.py
index 0c6c573044..8963c1b561 100644
--- a/tests/providers/opsgenie/hooks/test_opsgenie.py
+++ b/tests/providers/opsgenie/hooks/test_opsgenie.py
@@ -138,3 +138,19 @@ class TestOpsgenieAlertHook(unittest.TestCase):
             close_alert_payload=CloseAlertPayload(**pay_load),
             kwargs=kwargs,
         )
+
+    @mock.patch.object(AlertApi, 'delete_alert')
+    def test_delete_alert(self, delete_alert_mock):
+        hook = OpsgenieAlertHook(opsgenie_conn_id=self.conn_id)
+
+        # When
+        identifier = 'identifier_example'
+        identifier_type = 'id'
+        user = "some_user"
+        source = "airflow"
+
+        # Then
+        hook.delete_alert(identifier=identifier, 
identifier_type=identifier_type, user=user, source=source)
+        delete_alert_mock.assert_called_once_with(
+            identifier=identifier, identifier_type=identifier_type, user=user, 
source=source
+        )
diff --git a/tests/providers/opsgenie/operators/test_opsgenie.py 
b/tests/providers/opsgenie/operators/test_opsgenie.py
index 444b19b165..cbded2f04d 100644
--- a/tests/providers/opsgenie/operators/test_opsgenie.py
+++ b/tests/providers/opsgenie/operators/test_opsgenie.py
@@ -18,11 +18,13 @@
 #
 
 import unittest
+from unittest import mock
 
 from airflow.models.dag import DAG
 from airflow.providers.opsgenie.operators.opsgenie import (
     OpsgenieCloseAlertOperator,
     OpsgenieCreateAlertOperator,
+    OpsgenieDeleteAlertOperator,
 )
 from airflow.utils import timezone
 
@@ -141,3 +143,31 @@ class TestOpsgenieCloseAlertOperator(unittest.TestCase):
         assert self._config['user'] == operator.user
         assert self._config['note'] == operator.note
         assert self._config['source'] == operator.source
+
+
+class TestOpsgenieDeleteAlertOperator(unittest.TestCase):
+    def setUp(self):
+        args = {'owner': 'airflow', 'start_date': DEFAULT_DATE}
+        self.dag = DAG('test_dag_id', default_args=args)
+
+    
@mock.patch('airflow.providers.opsgenie.operators.opsgenie.OpsgenieAlertHook')
+    def test_operator(self, mock_opsgenie_hook):
+        mock_opsgenie_hook.return_value = mock.Mock()
+        mock_opsgenie_hook.return_value.delete_alert.return_value = True
+
+        operator = OpsgenieDeleteAlertOperator(
+            task_id='opsgenie_test_delete_job',
+            dag=self.dag,
+            identifier="id",
+            identifier_type='id',
+            user="name",
+            source="source",
+        )
+        operator.execute(None)
+        mock_opsgenie_hook.assert_called_once_with('opsgenie_default')
+        mock_opsgenie_hook.return_value.delete_alert.assert_called_once_with(
+            identifier='id',
+            identifier_type='id',
+            source='source',
+            user='name',
+        )

Reply via email to