port-ocean 0.17.5__tar.gz → 0.17.7__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of port-ocean might be problematic. Click here for more details.
- {port_ocean-0.17.5 → port_ocean-0.17.7}/PKG-INFO +1 -1
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/defaults/initialize.py +6 -4
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/event_listener/base.py +11 -3
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/event_listener/http.py +10 -2
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/event_listener/kafka.py +13 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/event_listener/once.py +0 -3
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/event_listener/polling.py +0 -3
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/integrations/mixins/sync_raw.py +5 -2
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/tests/core/handlers/mixins/test_sync_raw.py +152 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/pyproject.toml +1 -1
- {port_ocean-0.17.5 → port_ocean-0.17.7}/LICENSE.md +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/README.md +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/integrations/_infra/Dockerfile.Deb +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/integrations/_infra/Dockerfile.alpine +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/integrations/_infra/Dockerfile.base.builder +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/integrations/_infra/Dockerfile.base.runner +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/integrations/_infra/Dockerfile.dockerignore +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/integrations/_infra/Makefile +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/integrations/_infra/grpcio.sh +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/integrations/_infra/init.sh +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/__init__.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/bootstrap.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/__init__.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cli.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/commands/__init__.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/commands/defaults/__init___.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/commands/defaults/clean.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/commands/defaults/dock.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/commands/defaults/group.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/commands/list_integrations.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/commands/main.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/commands/new.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/commands/pull.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/commands/sail.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/commands/version.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/__init__.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/cookiecutter.json +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/extensions.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/hooks/post_gen_project.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.env.example +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.gitignore +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/.gitignore +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/blueprints.json +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/port-app-config.yml +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/spec.yaml +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/CHANGELOG.md +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/CONTRIBUTING.md +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/README.md +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/changelog/.gitignore +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/debug.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/main.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/poetry.toml +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/pyproject.toml +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/sonar-project.properties +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/tests/__init__.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/tests/test_sample.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/utils.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/clients/__init__.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/clients/port/__init__.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/clients/port/authentication.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/clients/port/client.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/clients/port/mixins/__init__.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/clients/port/mixins/blueprints.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/clients/port/mixins/entities.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/clients/port/mixins/integrations.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/clients/port/mixins/migrations.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/clients/port/retry_transport.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/clients/port/types.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/clients/port/utils.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/config/__init__.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/config/base.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/config/dynamic.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/config/settings.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/consumers/__init__.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/consumers/kafka_consumer.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/context/__init__.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/context/event.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/context/ocean.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/context/resource.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/__init__.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/defaults/__init__.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/defaults/clean.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/defaults/common.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/event_listener/__init__.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/event_listener/factory.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/event_listener/webhooks_only.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/handlers/__init__.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/handlers/base.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/handlers/entities_state_applier/__init__.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/handlers/entities_state_applier/base.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/handlers/entities_state_applier/port/__init__.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/handlers/entities_state_applier/port/applier.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/handlers/entities_state_applier/port/get_related_entities.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/handlers/entities_state_applier/port/order_by_entities_dependencies.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/handlers/entity_processor/__init__.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/handlers/entity_processor/base.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/handlers/entity_processor/jq_entity_processor.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/handlers/port_app_config/__init__.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/handlers/port_app_config/api.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/handlers/port_app_config/base.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/handlers/port_app_config/models.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/handlers/resync_state_updater/__init__.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/handlers/resync_state_updater/updater.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/integrations/__init__.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/integrations/base.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/integrations/mixins/__init__.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/integrations/mixins/events.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/integrations/mixins/handler.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/integrations/mixins/sync.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/integrations/mixins/utils.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/models.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/ocean_types.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/utils/entity_topological_sorter.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/utils/utils.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/debug_cli.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/exceptions/__init__.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/exceptions/api.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/exceptions/base.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/exceptions/clients.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/exceptions/context.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/exceptions/core.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/exceptions/port_defaults.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/exceptions/utils.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/helpers/__init__.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/helpers/async_client.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/helpers/retry.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/log/__init__.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/log/handlers.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/log/logger_setup.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/log/sensetive.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/middlewares.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/ocean.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/py.typed +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/run.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/sonar-project.properties +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/tests/__init__.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/tests/clients/port/mixins/test_entities.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/tests/conftest.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/tests/core/defaults/test_common.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/tests/core/handlers/entity_processor/test_jq_entity_processor.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/tests/core/test_utils.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/tests/core/utils/test_entity_topological_sorter.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/tests/helpers/__init__.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/tests/helpers/fake_port_api.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/tests/helpers/fixtures.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/tests/helpers/integration.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/tests/helpers/ocean_app.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/tests/helpers/port_client.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/tests/helpers/smoke_test.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/tests/log/test_handlers.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/tests/test_smoke.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/tests/utils/test_async_iterators.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/tests/utils/test_cache.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/utils/__init__.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/utils/async_http.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/utils/async_iterators.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/utils/cache.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/utils/misc.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/utils/queue_utils.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/utils/repeat.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/utils/signal.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/utils/time.py +0 -0
- {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/version.py +0 -0
|
@@ -68,7 +68,7 @@ async def _initialize_required_integration_settings(
|
|
|
68
68
|
)
|
|
69
69
|
integration = await port_client.create_integration(
|
|
70
70
|
integration_config.integration.type,
|
|
71
|
-
integration_config.event_listener.
|
|
71
|
+
integration_config.event_listener.get_changelog_destination_details(),
|
|
72
72
|
port_app_config=default_mapping,
|
|
73
73
|
)
|
|
74
74
|
elif not integration.get("config"):
|
|
@@ -77,7 +77,7 @@ async def _initialize_required_integration_settings(
|
|
|
77
77
|
)
|
|
78
78
|
integration = await port_client.patch_integration(
|
|
79
79
|
integration_config.integration.type,
|
|
80
|
-
integration_config.event_listener.
|
|
80
|
+
integration_config.event_listener.get_changelog_destination_details(),
|
|
81
81
|
port_app_config=default_mapping,
|
|
82
82
|
)
|
|
83
83
|
except httpx.HTTPStatusError as err:
|
|
@@ -85,8 +85,10 @@ async def _initialize_required_integration_settings(
|
|
|
85
85
|
raise err
|
|
86
86
|
|
|
87
87
|
logger.info("Checking for diff in integration configuration")
|
|
88
|
-
changelog_destination =
|
|
89
|
-
|
|
88
|
+
changelog_destination = (
|
|
89
|
+
integration_config.event_listener.get_changelog_destination_details().get(
|
|
90
|
+
"changelog_destination"
|
|
91
|
+
)
|
|
90
92
|
)
|
|
91
93
|
if (
|
|
92
94
|
integration.get("changelogDestination") != changelog_destination
|
|
@@ -78,8 +78,16 @@ class EventListenerSettings(BaseOceanModel, extra=Extra.allow):
|
|
|
78
78
|
type: str
|
|
79
79
|
should_resync: bool = True
|
|
80
80
|
|
|
81
|
-
def
|
|
81
|
+
def get_changelog_destination_details(self) -> dict[str, Any]:
|
|
82
82
|
"""
|
|
83
|
-
|
|
83
|
+
Returns the changelog destination configuration for the event listener.
|
|
84
|
+
By default, returns an empty dict. Only KAFKA and WEBHOOK event listeners need to override this
|
|
85
|
+
to provide their specific changelog destination details.
|
|
86
|
+
|
|
87
|
+
Returns:
|
|
88
|
+
dict[str, Any]: The changelog destination configuration. For example:
|
|
89
|
+
- KAFKA returns {"type": "KAFKA"}
|
|
90
|
+
- WEBHOOK returns {"type": "WEBHOOK", "url": "https://example.com/resync"}
|
|
91
|
+
- Other event listeners return {}
|
|
84
92
|
"""
|
|
85
|
-
return {
|
|
93
|
+
return {}
|
|
@@ -27,9 +27,17 @@ class HttpEventListenerSettings(EventListenerSettings):
|
|
|
27
27
|
type: Literal["WEBHOOK"]
|
|
28
28
|
app_host: AnyHttpUrl = Field(..., sensitive=True)
|
|
29
29
|
|
|
30
|
-
def
|
|
30
|
+
def get_changelog_destination_details(self) -> dict[str, Any]:
|
|
31
|
+
"""
|
|
32
|
+
Returns the changelog destination configuration for the webhook event listener.
|
|
33
|
+
For webhook event listeners, this specifies the URL where changelog events should be sent.
|
|
34
|
+
|
|
35
|
+
Returns:
|
|
36
|
+
dict[str, Any]: A dictionary with the webhook URL where changelog events should be sent,
|
|
37
|
+
constructed by appending "/resync" to the app_host.
|
|
38
|
+
"""
|
|
31
39
|
return {
|
|
32
|
-
|
|
40
|
+
"type": self.type,
|
|
33
41
|
"url": self.app_host + "/resync",
|
|
34
42
|
}
|
|
35
43
|
|
|
@@ -46,6 +46,19 @@ class KafkaEventListenerSettings(EventListenerSettings):
|
|
|
46
46
|
kafka_security_enabled: bool = True
|
|
47
47
|
consumer_poll_timeout: int = 1
|
|
48
48
|
|
|
49
|
+
def get_changelog_destination_details(self) -> dict[str, Any]:
|
|
50
|
+
"""
|
|
51
|
+
Returns the changelog destination configuration for the Kafka event listener.
|
|
52
|
+
For Kafka event listeners, this specifies that changelog events should be sent via Kafka.
|
|
53
|
+
|
|
54
|
+
Returns:
|
|
55
|
+
dict[str, Any]: A dictionary with type "KAFKA" to indicate that changelog events
|
|
56
|
+
should be sent through the Kafka message bus.
|
|
57
|
+
"""
|
|
58
|
+
return {
|
|
59
|
+
"type": self.type,
|
|
60
|
+
}
|
|
61
|
+
|
|
49
62
|
|
|
50
63
|
class KafkaEventListener(BaseEventListener):
|
|
51
64
|
"""
|
|
@@ -147,6 +147,7 @@ class SyncRawMixin(HandlerMixin, EventsMixin):
|
|
|
147
147
|
return CalculationResult(
|
|
148
148
|
objects_diff[0].entity_selector_diff._replace(passed=modified_objects),
|
|
149
149
|
errors=objects_diff[0].errors,
|
|
150
|
+
misonfigured_entity_keys=objects_diff[0].misonfigured_entity_keys,
|
|
150
151
|
)
|
|
151
152
|
|
|
152
153
|
async def _unregister_resource_raw(
|
|
@@ -162,7 +163,7 @@ class SyncRawMixin(HandlerMixin, EventsMixin):
|
|
|
162
163
|
return [], []
|
|
163
164
|
|
|
164
165
|
objects_diff = await self._calculate_raw([(resource, results)])
|
|
165
|
-
entities_selector_diff, errors = objects_diff[0]
|
|
166
|
+
entities_selector_diff, errors, _ = objects_diff[0]
|
|
166
167
|
|
|
167
168
|
await self.entities_state_applier.delete(
|
|
168
169
|
entities_selector_diff.passed, user_agent_type
|
|
@@ -245,7 +246,7 @@ class SyncRawMixin(HandlerMixin, EventsMixin):
|
|
|
245
246
|
if not resource_mappings:
|
|
246
247
|
return []
|
|
247
248
|
|
|
248
|
-
diffs, errors = zip(
|
|
249
|
+
diffs, errors, misconfigured_entity_keys = zip(
|
|
249
250
|
*await asyncio.gather(
|
|
250
251
|
*(
|
|
251
252
|
self._register_resource_raw(
|
|
@@ -258,6 +259,8 @@ class SyncRawMixin(HandlerMixin, EventsMixin):
|
|
|
258
259
|
|
|
259
260
|
diffs = list(diffs)
|
|
260
261
|
errors = sum(errors, [])
|
|
262
|
+
misconfigured_entity_keys = list(misconfigured_entity_keys)
|
|
263
|
+
|
|
261
264
|
|
|
262
265
|
if errors:
|
|
263
266
|
message = f"Failed to register {len(errors)} entities. Skipping delete phase due to incomplete state"
|
{port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/tests/core/handlers/mixins/test_sync_raw.py
RENAMED
|
@@ -164,6 +164,14 @@ def mock_sync_raw_mixin(
|
|
|
164
164
|
return sync_raw_mixin
|
|
165
165
|
|
|
166
166
|
|
|
167
|
+
@pytest.fixture
|
|
168
|
+
def mock_sync_raw_mixin_with_jq_processor(
|
|
169
|
+
mock_sync_raw_mixin: SyncRawMixin,
|
|
170
|
+
) -> SyncRawMixin:
|
|
171
|
+
mock_sync_raw_mixin._entity_processor = JQEntityProcessor(mock_context) # type: ignore
|
|
172
|
+
return mock_sync_raw_mixin
|
|
173
|
+
|
|
174
|
+
|
|
167
175
|
@asynccontextmanager
|
|
168
176
|
async def no_op_event_context(
|
|
169
177
|
existing_event: EventContext,
|
|
@@ -398,3 +406,147 @@ async def test_sync_raw_mixin_dependency(
|
|
|
398
406
|
"entity_3-entity_1-entity_4-entity_2-entity_5",
|
|
399
407
|
"entity_3-entity_1-entity_4-entity_5-entity_2",
|
|
400
408
|
)
|
|
409
|
+
|
|
410
|
+
|
|
411
|
+
@pytest.mark.asyncio
|
|
412
|
+
async def test_register_raw(
|
|
413
|
+
mock_sync_raw_mixin_with_jq_processor: SyncRawMixin, mock_ocean: Ocean
|
|
414
|
+
) -> None:
|
|
415
|
+
kind = "service"
|
|
416
|
+
user_agent_type = UserAgentType.exporter
|
|
417
|
+
raw_entity = [
|
|
418
|
+
{"id": "entity_1", "name": "entity_1", "web_url": "https://example.com"},
|
|
419
|
+
]
|
|
420
|
+
expected_result = [
|
|
421
|
+
{
|
|
422
|
+
"identifier": "entity_1",
|
|
423
|
+
"blueprint": "service",
|
|
424
|
+
"name": "entity_1",
|
|
425
|
+
"properties": {"url": "https://example.com"},
|
|
426
|
+
},
|
|
427
|
+
]
|
|
428
|
+
|
|
429
|
+
async with event_context(EventType.HTTP_REQUEST, trigger_type="machine") as event:
|
|
430
|
+
# Use patch to mock the method instead of direct assignment
|
|
431
|
+
with patch.object(
|
|
432
|
+
mock_sync_raw_mixin_with_jq_processor.port_app_config_handler,
|
|
433
|
+
"get_port_app_config",
|
|
434
|
+
return_value=PortAppConfig(
|
|
435
|
+
enable_merge_entity=True,
|
|
436
|
+
delete_dependent_entities=True,
|
|
437
|
+
create_missing_related_entities=False,
|
|
438
|
+
resources=[
|
|
439
|
+
ResourceConfig(
|
|
440
|
+
kind=kind,
|
|
441
|
+
selector=Selector(query="true"),
|
|
442
|
+
port=PortResourceConfig(
|
|
443
|
+
entity=MappingsConfig(
|
|
444
|
+
mappings=EntityMapping(
|
|
445
|
+
identifier=".id | tostring",
|
|
446
|
+
title=".name",
|
|
447
|
+
blueprint='"service"',
|
|
448
|
+
properties={"url": ".web_url"},
|
|
449
|
+
relations={},
|
|
450
|
+
)
|
|
451
|
+
)
|
|
452
|
+
),
|
|
453
|
+
)
|
|
454
|
+
],
|
|
455
|
+
),
|
|
456
|
+
):
|
|
457
|
+
# Ensure the event.port_app_config is set correctly
|
|
458
|
+
event.port_app_config = await mock_sync_raw_mixin_with_jq_processor.port_app_config_handler.get_port_app_config(
|
|
459
|
+
use_cache=False
|
|
460
|
+
)
|
|
461
|
+
|
|
462
|
+
def upsert_side_effect(
|
|
463
|
+
entities: list[Entity], user_agent_type: UserAgentType
|
|
464
|
+
) -> list[Entity]:
|
|
465
|
+
# Simulate returning the passed entities
|
|
466
|
+
return entities
|
|
467
|
+
|
|
468
|
+
# Patch the upsert method with the side effect
|
|
469
|
+
with patch.object(
|
|
470
|
+
mock_sync_raw_mixin_with_jq_processor.entities_state_applier,
|
|
471
|
+
"upsert",
|
|
472
|
+
side_effect=upsert_side_effect,
|
|
473
|
+
):
|
|
474
|
+
# Call the register_raw method
|
|
475
|
+
registered_entities = (
|
|
476
|
+
await mock_sync_raw_mixin_with_jq_processor.register_raw(
|
|
477
|
+
kind, raw_entity, user_agent_type
|
|
478
|
+
)
|
|
479
|
+
)
|
|
480
|
+
|
|
481
|
+
# Assert that the registered entities match the expected results
|
|
482
|
+
assert len(registered_entities) == len(expected_result)
|
|
483
|
+
for entity, result in zip(registered_entities, expected_result):
|
|
484
|
+
assert entity.identifier == result["identifier"]
|
|
485
|
+
assert entity.blueprint == result["blueprint"]
|
|
486
|
+
assert entity.properties == result["properties"]
|
|
487
|
+
|
|
488
|
+
|
|
489
|
+
@pytest.mark.asyncio
|
|
490
|
+
async def test_unregister_raw(
|
|
491
|
+
mock_sync_raw_mixin_with_jq_processor: SyncRawMixin, mock_ocean: Ocean
|
|
492
|
+
) -> None:
|
|
493
|
+
kind = "service"
|
|
494
|
+
user_agent_type = UserAgentType.exporter
|
|
495
|
+
raw_entity = [
|
|
496
|
+
{"id": "entity_1", "name": "entity_1", "web_url": "https://example.com"},
|
|
497
|
+
]
|
|
498
|
+
expected_result = [
|
|
499
|
+
{
|
|
500
|
+
"identifier": "entity_1",
|
|
501
|
+
"blueprint": "service",
|
|
502
|
+
"name": "entity_1",
|
|
503
|
+
"properties": {"url": "https://example.com"},
|
|
504
|
+
},
|
|
505
|
+
]
|
|
506
|
+
|
|
507
|
+
async with event_context(EventType.HTTP_REQUEST, trigger_type="machine") as event:
|
|
508
|
+
# Use patch to mock the method instead of direct assignment
|
|
509
|
+
with patch.object(
|
|
510
|
+
mock_sync_raw_mixin_with_jq_processor.port_app_config_handler,
|
|
511
|
+
"get_port_app_config",
|
|
512
|
+
return_value=PortAppConfig(
|
|
513
|
+
enable_merge_entity=True,
|
|
514
|
+
delete_dependent_entities=True,
|
|
515
|
+
create_missing_related_entities=False,
|
|
516
|
+
resources=[
|
|
517
|
+
ResourceConfig(
|
|
518
|
+
kind=kind,
|
|
519
|
+
selector=Selector(query="true"),
|
|
520
|
+
port=PortResourceConfig(
|
|
521
|
+
entity=MappingsConfig(
|
|
522
|
+
mappings=EntityMapping(
|
|
523
|
+
identifier=".id | tostring",
|
|
524
|
+
title=".name",
|
|
525
|
+
blueprint='"service"',
|
|
526
|
+
properties={"url": ".web_url"},
|
|
527
|
+
relations={},
|
|
528
|
+
)
|
|
529
|
+
)
|
|
530
|
+
),
|
|
531
|
+
)
|
|
532
|
+
],
|
|
533
|
+
),
|
|
534
|
+
):
|
|
535
|
+
# Ensure the event.port_app_config is set correctly
|
|
536
|
+
event.port_app_config = await mock_sync_raw_mixin_with_jq_processor.port_app_config_handler.get_port_app_config(
|
|
537
|
+
use_cache=False
|
|
538
|
+
)
|
|
539
|
+
|
|
540
|
+
# Call the unregister_raw method
|
|
541
|
+
unregistered_entities = (
|
|
542
|
+
await mock_sync_raw_mixin_with_jq_processor.unregister_raw(
|
|
543
|
+
kind, raw_entity, user_agent_type
|
|
544
|
+
)
|
|
545
|
+
)
|
|
546
|
+
|
|
547
|
+
# Assert that the unregistered entities match the expected results
|
|
548
|
+
assert len(unregistered_entities) == len(expected_result)
|
|
549
|
+
for entity, result in zip(unregistered_entities, expected_result):
|
|
550
|
+
assert entity.identifier == result["identifier"]
|
|
551
|
+
assert entity.blueprint == result["blueprint"]
|
|
552
|
+
assert entity.properties == result["properties"]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/hooks/post_gen_project.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/handlers/entities_state_applier/__init__.py
RENAMED
|
File without changes
|
{port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/handlers/entities_state_applier/base.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/handlers/entity_processor/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/handlers/port_app_config/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/handlers/resync_state_updater/__init__.py
RENAMED
|
File without changes
|
{port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/handlers/resync_state_updater/updater.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/tests/clients/port/mixins/test_entities.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|