Skip to content

Commit

Permalink
[Framework] Fix bug search relation error unhashable dict (#956)
Browse files Browse the repository at this point in the history
# 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)

<h4> All tests should be run against the port production
environment(using a testing org). </h4>

### 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 <[email protected]>
  • Loading branch information
omby8888 and talsabagport authored Aug 28, 2024
1 parent 25d13a8 commit 9a5dbb7
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 6 deletions.
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,13 @@ this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm

<!-- towncrier release notes start -->

## 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
Expand All @@ -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
Expand Down
23 changes: 18 additions & 5 deletions port_ocean/clients/port/mixins/entities.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -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"
Expand Down

0 comments on commit 9a5dbb7

Please sign in to comment.