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"