From 9a5dbb71723fc5b690dda8f53b52bb20515c88db Mon Sep 17 00:00:00 2001
From: omby8888 <160610297+omby8888@users.noreply.github.com>
Date: Wed, 28 Aug 2024 12:48:47 +0300
Subject: [PATCH] [Framework] Fix bug search relation error unhashable dict
(#956)
# Description
What - Refer to entity key in upsert entity response, if the response is
not 200 then turn raw search relations into None to not harm the
deletion proccess
Why - Response from upsert entity api isn't processed right and causes
ocean core to use the raw entity that contains dict typed relations
instead of string which is the relation's entity identifier
How - refer to the entity key in a response that looks like {ok: true,
entity: {...}}, if the response is not 200 turn the dict typed relations
into None
## Type of change
Please leave one option from the following and delete the rest:
- [X] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] New Integration (non-breaking change which adds a new integration)
- [ ] Breaking change (fix or feature that would cause existing
functionality to not work as expected)
- [ ] Non-breaking change (fix of existing functionality that will not
change current behavior)
- [ ] Documentation (added/updated documentation)
All tests should be run against the port production
environment(using a testing org).
### Core testing checklist
- [X] Integration able to create all default resources from scratch
- [X] Resync finishes successfully
- [X] Resync able to create entities
- [X] Resync able to update entities
- [X] Resync able to detect and delete entities
- [x] Scheduled resync able to abort existing resync and start a new one
- [x] Tested with at least 2 integrations from scratch
- [x] Tested with Kafka and Polling event listeners
### Integration testing checklist
- [ ] Integration able to create all default resources from scratch
- [ ] Resync able to create entities
- [ ] Resync able to update entities
- [ ] Resync able to detect and delete entities
- [ ] Resync finishes successfully
- [ ] If new resource kind is added or updated in the integration, add
example raw data, mapping and expected result to the `examples` folder
in the integration directory.
- [ ] If resource kind is updated, run the integration with the example
data and check if the expected result is achieved
- [ ] If new resource kind is added or updated, validate that
live-events for that resource are working as expected
- [ ] Docs PR link [here](#)
### Preflight checklist
- [ ] Handled rate limiting
- [ ] Handled pagination
- [ ] Implemented the code in async
- [ ] Support Multi account
## Screenshots
Include screenshots from your environment showing how the resources of
the integration will look.
## API Documentation
Provide links to the API documentation used for this integration.
---------
Co-authored-by: talsabagport
---
CHANGELOG.md | 8 ++++++++
port_ocean/clients/port/mixins/entities.py | 23 +++++++++++++++++-----
pyproject.toml | 2 +-
3 files changed, 27 insertions(+), 6 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 97a8ae2297..13a4575fef 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,13 @@ this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
+## 0.10.4 (2024-08-28)
+
+### Bug Fixes
+
+- Fixed upsert entity failure when saving modified data for search relations calculations
+
+
## 0.10.3 (2024-08-28)
### Bug Fixes
@@ -20,6 +27,7 @@ this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
- Reverted last bugfix
+
## 0.10.1 (2024-08-26)
### Bug Fixes
diff --git a/port_ocean/clients/port/mixins/entities.py b/port_ocean/clients/port/mixins/entities.py
index b8a510a65e..a18f4f5e8d 100644
--- a/port_ocean/clients/port/mixins/entities.py
+++ b/port_ocean/clients/port/mixins/entities.py
@@ -58,11 +58,24 @@ async def upsert_entity(
)
handle_status_code(response, should_raise)
result = response.json()
- result_entity = Entity.parse_obj(result)
- # Set the results of the search relation and identifier to the entity
- entity.identifier = result_entity.identifier or entity.identifier
- entity.relations = result_entity.relations or entity.relations
- return entity
+ result_entity = (
+ Entity.parse_obj(result["entity"]) if result.get("entity") else entity
+ )
+ # In order to save memory we'll keep only the identifier, blueprint and relations of the
+ # upserted entity result for later calculations
+ reduced_entity = Entity(
+ identifier=result_entity.identifier, blueprint=result_entity.blueprint
+ )
+
+ # Turning dict typed relations (raw search relations) is required
+ # for us to be able to successfully calculate the participation related entities
+ # and ignore the ones that don't as they weren't upserted
+ reduced_entity.relations = {
+ key: None if isinstance(relation, dict) else relation
+ for key, relation in result_entity.relations.items()
+ }
+
+ return reduced_entity
async def batch_upsert_entities(
self,
diff --git a/pyproject.toml b/pyproject.toml
index 8de129f669..07dd1785a7 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[tool.poetry]
name = "port-ocean"
-version = "0.10.3"
+version = "0.10.4"
description = "Port Ocean is a CLI tool for managing your Port projects."
readme = "README.md"
homepage = "https://app.getport.io"