You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by el...@apache.org on 2025/04/17 11:27:23 UTC

(airflow) branch main updated: Replace pdpyras with pagerduty library (#48919)

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 47722929d27 Replace pdpyras with pagerduty library (#48919)
47722929d27 is described below

commit 47722929d2711199c3ed6a10e1fb0e9d0f6a995b
Author: simonprydden <72...@users.noreply.github.com>
AuthorDate: Thu Apr 17 12:27:16 2025 +0100

    Replace pdpyras with pagerduty library (#48919)
    
    * refactor(pagerduty): replace pdpyras with pagerduty
    
    * Update changelog for PagerDuty integration changes in version 5.0.0
    
    * refactor(pagerduty): replace pdpyras with pagerduty
    
    * fix rebase error
    
    ---------
    
    Co-authored-by: Simon Prydden <me...@aol.com>
---
 providers/pagerduty/README.rst                     |  2 +-
 providers/pagerduty/docs/changelog.rst             | 12 +++++++++++
 providers/pagerduty/pyproject.toml                 |  2 +-
 .../airflow/providers/pagerduty/hooks/pagerduty.py | 23 ++++++++++------------
 .../providers/pagerduty/hooks/pagerduty_events.py  | 16 +++++++--------
 .../tests/unit/pagerduty/hooks/test_pagerduty.py   |  4 ++--
 .../unit/pagerduty/hooks/test_pagerduty_events.py  |  8 +++++---
 7 files changed, 39 insertions(+), 28 deletions(-)

diff --git a/providers/pagerduty/README.rst b/providers/pagerduty/README.rst
index 1b4f8128af5..d1c34ab882f 100644
--- a/providers/pagerduty/README.rst
+++ b/providers/pagerduty/README.rst
@@ -55,7 +55,7 @@ PIP package                                 Version required
 ==========================================  ==================
 ``apache-airflow``                          ``>=2.9.0``
 ``apache-airflow-providers-common-compat``  ``>=1.6.0``
-``pdpyras``                                 ``>=4.2.0``
+``pagerduty``                               ``>=1.0.0``
 ==========================================  ==================
 
 Cross provider package dependencies
diff --git a/providers/pagerduty/docs/changelog.rst b/providers/pagerduty/docs/changelog.rst
index f4382ab4cfc..d4b48167775 100644
--- a/providers/pagerduty/docs/changelog.rst
+++ b/providers/pagerduty/docs/changelog.rst
@@ -27,6 +27,18 @@
 Changelog
 ---------
 
+5.0.0
+.....
+
+Breaking changes
+~~~~~~~~~~~~~~~~
+
+* ``Replace pdpyras with pagerduty library in PagerDuty integration (#48919)``
+
+In the PagerDutyHook the get_session method has been renamed with the client method to
+align with standard naming conventions.
+Update any references to PagerDutyHook.get_session in your code to use PagerDutyHook.client.
+
 4.0.3
 .....
 
diff --git a/providers/pagerduty/pyproject.toml b/providers/pagerduty/pyproject.toml
index f201ec4c80b..ad43c3d6fd4 100644
--- a/providers/pagerduty/pyproject.toml
+++ b/providers/pagerduty/pyproject.toml
@@ -59,7 +59,7 @@ requires-python = "~=3.9"
 dependencies = [
     "apache-airflow>=2.9.0",
     "apache-airflow-providers-common-compat>=1.6.0",
-    "pdpyras>=4.2.0",
+    "pagerduty>=1.0.0",
 ]
 
 [dependency-groups]
diff --git a/providers/pagerduty/src/airflow/providers/pagerduty/hooks/pagerduty.py b/providers/pagerduty/src/airflow/providers/pagerduty/hooks/pagerduty.py
index de917893743..d0172615b57 100644
--- a/providers/pagerduty/src/airflow/providers/pagerduty/hooks/pagerduty.py
+++ b/providers/pagerduty/src/airflow/providers/pagerduty/hooks/pagerduty.py
@@ -21,7 +21,7 @@ from __future__ import annotations
 
 from typing import Any
 
-import pdpyras
+import pagerduty
 
 from airflow.exceptions import AirflowException
 from airflow.hooks.base import BaseHook
@@ -79,7 +79,7 @@ class PagerdutyHook(BaseHook):
     def __init__(self, token: str | None = None, pagerduty_conn_id: str | None = None) -> None:
         super().__init__()
         self.routing_key = None
-        self._session = None
+        self._client = None
 
         if pagerduty_conn_id is not None:
             conn = self.get_connection(pagerduty_conn_id)
@@ -95,23 +95,20 @@ class PagerdutyHook(BaseHook):
         if self.token is None:
             raise AirflowException("Cannot get token: No valid api token nor pagerduty_conn_id supplied.")
 
-    def get_session(self) -> pdpyras.APISession:
+    def client(self) -> pagerduty.RestApiV2Client:
         """
-        Return `pdpyras.APISession` for use with sending or receiving data through the PagerDuty REST API.
+        Return `pagerduty.RestApiV2Client` for use with sending or receiving data through the PagerDuty REST API.
 
-        The `pdpyras` library supplies a class `pdpyras.APISession` extending `requests.Session` from the
-        Requests HTTP library.
-
-        Documentation on how to use the `APISession` class can be found at:
-        https://pagerduty.github.io/pdpyras/#data-access-abstraction
+        Documentation on how to use the `RestApiV2Client` class can be found at:
+        https://pagerduty.github.io/python-pagerduty/user_guide.html#generic-client-features
         """
-        self._session = pdpyras.APISession(self.token)
-        return self._session
+        self._client = pagerduty.RestApiV2Client(self.token)
+        return self._client
 
     def test_connection(self):
         try:
-            session = pdpyras.APISession(self.token)
-            session.list_all("services", params={"query": "some_non_existing_service"})
+            client = pagerduty.RestApiV2Client(self.token)
+            client.list_all("services", params={"query": "some_non_existing_service"})
         except Exception:
             return False, "connection test failed, invalid token"
         return True, "connection tested successfully"
diff --git a/providers/pagerduty/src/airflow/providers/pagerduty/hooks/pagerduty_events.py b/providers/pagerduty/src/airflow/providers/pagerduty/hooks/pagerduty_events.py
index d052825974c..61ad9930b3d 100644
--- a/providers/pagerduty/src/airflow/providers/pagerduty/hooks/pagerduty_events.py
+++ b/providers/pagerduty/src/airflow/providers/pagerduty/hooks/pagerduty_events.py
@@ -21,7 +21,7 @@ from __future__ import annotations
 
 from typing import TYPE_CHECKING, Any
 
-import pdpyras
+import pagerduty
 
 from airflow.exceptions import AirflowException
 from airflow.hooks.base import BaseHook
@@ -62,7 +62,7 @@ class PagerdutyEventsHook(BaseHook):
     ) -> None:
         super().__init__()
         self.integration_key = None
-        self._session = None
+        self._client = None
 
         if pagerduty_events_conn_id is not None:
             conn = self.get_connection(pagerduty_events_conn_id)
@@ -132,8 +132,8 @@ class PagerdutyEventsHook(BaseHook):
             links=links,
         )
 
-        session = pdpyras.EventsAPISession(self.integration_key)
-        return session.send_event(**data)
+        client = pagerduty.EventsApiV2Client(self.integration_key)
+        return client.send_event(**data)
 
     @staticmethod
     def prepare_event_data(
@@ -225,13 +225,13 @@ class PagerdutyEventsHook(BaseHook):
         if links is not None:
             data["links"] = links
 
-        session = pdpyras.ChangeEventsAPISession(self.integration_key)
-        return session.send_change_event(payload=payload, links=links)
+        client = pagerduty.EventsApiV2Client(self.integration_key)
+        return client.send_change_event(payload=payload, links=links)
 
     def test_connection(self):
         try:
-            session = pdpyras.EventsAPISession(self.integration_key)
-            session.resolve("some_dedup_key_that_dont_exist")
+            client = pagerduty.EventsApiV2Client(self.integration_key)
+            client.resolve("some_dedup_key_that_dont_exist")
         except Exception:
             return False, "connection test failed, invalid routing key"
         return True, "connection tested successfully"
diff --git a/providers/pagerduty/tests/unit/pagerduty/hooks/test_pagerduty.py b/providers/pagerduty/tests/unit/pagerduty/hooks/test_pagerduty.py
index f642f4a09df..e5aaa66dafa 100644
--- a/providers/pagerduty/tests/unit/pagerduty/hooks/test_pagerduty.py
+++ b/providers/pagerduty/tests/unit/pagerduty/hooks/test_pagerduty.py
@@ -72,6 +72,6 @@ class TestPagerdutyHook:
             "self": "https://api.pagerduty.com/services/PZYX321",
         }
         requests_mock.get("https://api.pagerduty.com/services/PZYX321", json={"service": mock_response_body})
-        session = hook.get_session()
-        resp = session.rget("/services/PZYX321")
+        client = hook.client()
+        resp = client.rget("/services/PZYX321")
         assert resp == mock_response_body
diff --git a/providers/pagerduty/tests/unit/pagerduty/hooks/test_pagerduty_events.py b/providers/pagerduty/tests/unit/pagerduty/hooks/test_pagerduty_events.py
index 3e4ecb23058..c8037be4afe 100644
--- a/providers/pagerduty/tests/unit/pagerduty/hooks/test_pagerduty_events.py
+++ b/providers/pagerduty/tests/unit/pagerduty/hooks/test_pagerduty_events.py
@@ -44,11 +44,13 @@ class TestPagerdutyEventsHook:
 
     def test_create_change_event(self, requests_mock, events_connections):
         hook = PagerdutyEventsHook(pagerduty_events_conn_id=DEFAULT_CONN_ID)
-        change_event_id = "change_event_id"
-        mock_response_body = {"id": change_event_id}
+        mock_response_body = {
+            "message": "Change event processed",
+            "status": "success",
+        }
         requests_mock.post("https://events.pagerduty.com/v2/change/enqueue", json=mock_response_body)
         resp = hook.create_change_event(summary="test", source="airflow")
-        assert resp == change_event_id
+        assert resp is None, "No response expected for change event"
 
     def test_send_event(self, requests_mock, events_connections):
         hook = PagerdutyEventsHook(pagerduty_events_conn_id=DEFAULT_CONN_ID)