From 41b263d397781116ec9ea85d39819d19baaab9bc Mon Sep 17 00:00:00 2001 From: yair Date: Tue, 8 Aug 2023 23:07:27 +0300 Subject: [PATCH 1/4] pagerduty improved syntax --- integrations/pagerduty/.port/spec.yaml | 2 +- .../pagerduty/changelog/improvement.md | 1 + integrations/pagerduty/clients/pagerduty.py | 43 +++++++------------ integrations/pagerduty/main.py | 26 ++++++----- integrations/pagerduty/poetry.lock | 8 ++-- integrations/pagerduty/pyproject.toml | 4 +- 6 files changed, 36 insertions(+), 48 deletions(-) create mode 100644 integrations/pagerduty/changelog/improvement.md diff --git a/integrations/pagerduty/.port/spec.yaml b/integrations/pagerduty/.port/spec.yaml index 6d77738237..0bc50ed293 100644 --- a/integrations/pagerduty/.port/spec.yaml +++ b/integrations/pagerduty/.port/spec.yaml @@ -1,4 +1,4 @@ -version: v0.1.1 +version: v0.1.2 type: pagerduty description: pagerduty integration for Port Ocean icon: pagerduty diff --git a/integrations/pagerduty/changelog/improvement.md b/integrations/pagerduty/changelog/improvement.md new file mode 100644 index 0000000000..b6a9dfc3a6 --- /dev/null +++ b/integrations/pagerduty/changelog/improvement.md @@ -0,0 +1 @@ +Improved the integration syntax \ No newline at end of file diff --git a/integrations/pagerduty/clients/pagerduty.py b/integrations/pagerduty/clients/pagerduty.py index 1ccaa69ed7..f90a0954da 100644 --- a/integrations/pagerduty/clients/pagerduty.py +++ b/integrations/pagerduty/clients/pagerduty.py @@ -1,4 +1,5 @@ from typing import Any + import httpx from loguru import logger @@ -66,13 +67,7 @@ async def paginate_request_to_pager_duty(self, data_key: str) -> list[Any]: ) response.raise_for_status() data = response.json() - - # Fetch and update on-call user information for services - if data_key == "services": - service_data = await self.update_oncall_users(data, data_key) - all_data.extend(service_data) - else: - all_data.extend(data[data_key]) + all_data.extend(data[data_key]) has_more_data = data["more"] if has_more_data: @@ -138,7 +133,9 @@ async def create_webhooks_if_not_exists(self) -> None: f"HTTP error with status code: {e.response.status_code} and response text: {e.response.text}" ) - async def get_oncall_user(self, escalation_policy_id: str) -> dict[str, Any]: + async def get_oncall_user( + self, *escalation_policy_ids: str + ) -> list[dict[str, Any]]: url = f"{self.api_url}/oncalls" async with httpx.AsyncClient() as client: @@ -146,14 +143,13 @@ async def get_oncall_user(self, escalation_policy_id: str) -> dict[str, Any]: response = await client.get( url, params={ - "escalation_policy_ids[]": escalation_policy_id, + "escalation_policy_ids[]": ",".join(escalation_policy_ids), "include[]": "users", }, headers=self.api_auth_header, ) response.raise_for_status() - data = response.json() - return data + return response.json()["oncalls"] except httpx.HTTPStatusError as e: logger.error( f"HTTP error with status code: {e.response.status_code} and response text: {e.response.text}" @@ -161,26 +157,19 @@ async def get_oncall_user(self, escalation_policy_id: str) -> dict[str, Any]: raise async def update_oncall_users( - self, data: dict[str, Any], data_key: str - ) -> list[Any]: + self, services: list[dict[str, Any]] + ) -> list[dict[str, Any]]: logger.info("Fetching and matching who is on-call for services") - escalation_policy_ids = [ - service["escalation_policy"]["id"] for service in data[data_key] - ] - - oncall_users = await self.get_oncall_user(",".join(escalation_policy_ids)) - all_data = [] + oncall_users = await self.get_oncall_user( + *[service["escalation_policy"]["id"] for service in services] + ) - for service in data[data_key]: + for service in services: escalation_policy_id = service["escalation_policy"]["id"] - matching_oncall_user = [ + service["oncall_user"] = [ user - for user in oncall_users["oncalls"] + for user in oncall_users if user["escalation_policy"]["id"] == escalation_policy_id ] - - if matching_oncall_user: - service["oncall_user"] = matching_oncall_user - all_data.append(service) - return all_data + return services diff --git a/integrations/pagerduty/main.py b/integrations/pagerduty/main.py index 325ae36f92..59a56072c0 100644 --- a/integrations/pagerduty/main.py +++ b/integrations/pagerduty/main.py @@ -1,7 +1,9 @@ from typing import Any + +from loguru import logger + from clients.pagerduty import PagerDutyClient from port_ocean.context.ocean import ocean -from loguru import logger class ObjectKind: @@ -29,38 +31,34 @@ async def on_incidents_resync(kind: str) -> list[dict[str, Any]]: async def on_services_resync(kind: str) -> list[dict[str, Any]]: logger.info(f"Listing Pagerduty resource: {kind}") - return await pager_duty_client.paginate_request_to_pager_duty( + services = await pager_duty_client.paginate_request_to_pager_duty( data_key=ObjectKind.SERVICES ) + return await pager_duty_client.update_oncall_users(services) @ocean.router.post("/webhook") async def upsert_incident_webhook_handler(data: dict[str, Any]) -> None: - logger.info( - f"Processing Pagerduty webhook for event type: {data['event']['event_type']}" - ) - if data["event"]["event_type"] in pager_duty_client.service_delete_events: + event_type = data["event"]["event_type"] + logger.info(f"Processing Pagerduty webhook for event type: {event_type}") + if event_type in pager_duty_client.service_delete_events: await ocean.unregister_raw(ObjectKind.SERVICES, [data["event"]["data"]]) - elif data["event"]["event_type"] in pager_duty_client.incident_upsert_events: + elif event_type in pager_duty_client.incident_upsert_events: incident_id = data["event"]["data"]["id"] response = await pager_duty_client.get_singular_from_pager_duty( object_type=ObjectKind.INCIDENTS, identifier=incident_id ) await ocean.register_raw(ObjectKind.INCIDENTS, [response["incident"]]) - elif data["event"]["event_type"] in pager_duty_client.service_upsert_events: + elif event_type in pager_duty_client.service_upsert_events: service_id = data["event"]["data"]["id"] response = await pager_duty_client.get_singular_from_pager_duty( object_type=ObjectKind.SERVICES, identifier=service_id ) - service_data = response["service"] - oncall_user = await pager_duty_client.get_oncall_user( - service_data.get("escalation_policy", {}).get("id") - ) - service_data["oncall_user"] = oncall_user["oncalls"] + services = await pager_duty_client.update_oncall_users([response["service"]]) - await ocean.register_raw(ObjectKind.SERVICES, [service_data]) + await ocean.register_raw(ObjectKind.SERVICES, services) @ocean.on_start() diff --git a/integrations/pagerduty/poetry.lock b/integrations/pagerduty/poetry.lock index 1a9089bee7..23b3d26d3d 100644 --- a/integrations/pagerduty/poetry.lock +++ b/integrations/pagerduty/poetry.lock @@ -769,13 +769,13 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "port-ocean" -version = "0.1.2" +version = "0.1.3" description = "Port Ocean is a CLI tool for managing your Port projects." optional = false python-versions = ">=3.11,<4.0" files = [ - {file = "port_ocean-0.1.2-py3-none-any.whl", hash = "sha256:1fa323db88f64cf97afe34baa0b498f02c75d79ae9d7e82487258c81c65ecd79"}, - {file = "port_ocean-0.1.2.tar.gz", hash = "sha256:d1b94607b958e9fe027d55c8175d198172ebe2199aa66fce7f6886f67115fc1b"}, + {file = "port_ocean-0.1.3-py3-none-any.whl", hash = "sha256:c4a02ab9b3e867c53b615aaeff02068ac06a3e8b449cffc962a4a38bba694a8f"}, + {file = "port_ocean-0.1.3.tar.gz", hash = "sha256:3ae6bd92a0da31f678b6f6157ce8a9364daebf24a0d7e683adffa338adba7330"}, ] [package.dependencies] @@ -1320,4 +1320,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "6e73e450101e79152674f7a665f1f1487b996f37ccaa0e8b0f38193395e58ed9" +content-hash = "56ec768a770791057bd89f2a595bf12bef2fd031d676cbdcf9f4f1f2c82ed40b" diff --git a/integrations/pagerduty/pyproject.toml b/integrations/pagerduty/pyproject.toml index 4b71a59752..5ded75514f 100644 --- a/integrations/pagerduty/pyproject.toml +++ b/integrations/pagerduty/pyproject.toml @@ -1,12 +1,12 @@ [tool.poetry] name = "pagerduty" -version = "0.1.0" +version = "0.1.2" description = "Pagerduty Integration" authors = ["Port Team "] [tool.poetry.dependencies] python = "^3.11" -port_ocean = {version = "0.1.2", extras = ["cli"]} +port_ocean = {version = "0.1.3", extras = ["cli"]} httpx = "^0.24.1" [tool.poetry.group.dev.dependencies] From 5d343949caea12e8c01bda373bf7d6847c9e72b9 Mon Sep 17 00:00:00 2001 From: yair Date: Tue, 8 Aug 2023 23:27:16 +0300 Subject: [PATCH 2/4] supporting the terraform deployment --- changelog/improvement.md | 1 + integrations/pagerduty/config.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 5 deletions(-) create mode 100644 changelog/improvement.md diff --git a/changelog/improvement.md b/changelog/improvement.md new file mode 100644 index 0000000000..70bf14701e --- /dev/null +++ b/changelog/improvement.md @@ -0,0 +1 @@ +Bump to ocean 0.1.3 for support in the terraform deployment method \ No newline at end of file diff --git a/integrations/pagerduty/config.yaml b/integrations/pagerduty/config.yaml index 0423ccd9db..39bb0feffd 100644 --- a/integrations/pagerduty/config.yaml +++ b/integrations/pagerduty/config.yaml @@ -2,8 +2,8 @@ # Please copy this file to config.yaml file in the integration folder and edit it to your needs. initializePortResources: true port: - clientId: {{ from env PORT_CLIENT_ID }} # Can be loaded via environment variable: PORT_CLIENT_ID - clientSecret: {{ from env PORT_CLIENT_SECRET }} # Can be loaded via environment variable: PORT_CLIENT_SECRET + clientId: "{{ from env PORT_CLIENT_ID }}" # Can be loaded via environment variable: PORT_CLIENT_ID + clientSecret: "{{ from env PORT_CLIENT_SECRET }}" # Can be loaded via environment variable: PORT_CLIENT_SECRET # The event listener to use for the integration service. eventListener: type: POLLING @@ -13,6 +13,6 @@ integration: # The type of the integration. type: "pagerduty" config: - token: {{ from env PAGERDUTY_TOKEN }} - appHost: {{ from env APP_HOST }} - apiUrl: {{ from env API_URL }} \ No newline at end of file + token: "{{ from env PAGERDUTY_TOKEN }}" + appHost: "{{ from env APP_HOST }}" + apiUrl: "{{ from env API_URL }}" \ No newline at end of file From d44f9e5d0505ce4e9f9b4d29ad6cac3e3ec7b9ad Mon Sep 17 00:00:00 2001 From: yair Date: Wed, 9 Aug 2023 10:31:49 +0300 Subject: [PATCH 3/4] rename of a key --- integrations/pagerduty/clients/pagerduty.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/pagerduty/clients/pagerduty.py b/integrations/pagerduty/clients/pagerduty.py index f90a0954da..69361e3d25 100644 --- a/integrations/pagerduty/clients/pagerduty.py +++ b/integrations/pagerduty/clients/pagerduty.py @@ -167,7 +167,7 @@ async def update_oncall_users( for service in services: escalation_policy_id = service["escalation_policy"]["id"] - service["oncall_user"] = [ + service["__oncall_user"] = [ user for user in oncall_users if user["escalation_policy"]["id"] == escalation_policy_id From 5e50f22c749b1b168e44dbb9587f46f427792b06 Mon Sep 17 00:00:00 2001 From: yair Date: Wed, 9 Aug 2023 10:35:31 +0300 Subject: [PATCH 4/4] changelog --- integrations/pagerduty/changelog/improvement.1.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 integrations/pagerduty/changelog/improvement.1.md diff --git a/integrations/pagerduty/changelog/improvement.1.md b/integrations/pagerduty/changelog/improvement.1.md new file mode 100644 index 0000000000..70bf14701e --- /dev/null +++ b/integrations/pagerduty/changelog/improvement.1.md @@ -0,0 +1 @@ +Bump to ocean 0.1.3 for support in the terraform deployment method \ No newline at end of file