feat: add custom ETL connector support (YET-1178)#317
Conversation
Add runtime-loaded custom ETL connector infrastructure, mirroring the
existing custom (warehouse) connector scaffolding for ETL use cases.
- Discover and register connectors from /opt/custom-etl-connectors/{name}/
- CustomEtlProxyClient wraps Connector(BaseEtlConnector) modules with
fetch_etl_assets and fetch_etl_runs methods matching DC PR #2390
- Factory routes custom-etl-connector-<hash> types (gated by
MCD_CUSTOM_CONNECTORS_ENABLED)
- Discovery endpoints return custom_etl types alongside native/custom
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Rename _fetch_run_details → fetch_run_details (public method on BaseEtlConnector) and remove the sys.path manipulation that was added to work around the missing etl_connectors import — the package is pip-installed in the agent image, not path-hacked. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…module caching - Move credential validation before module load/Connector instantiation (F1) - Strip None values consistently from all dict-like structures in _serialize (F2) - Cache loaded connector modules to avoid re-executing top-level code (F3) - Add tests for setup_connection failure and close() exception suppression (F4, F5) - Add tearDown to reset registry cache between test classes (F6) - Fix stale _fetch_run_details docstring reference (F8) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
Cross-repo contract check (vs saas-serverless #4279 normalizer + pycarlo wire envelope) — possible asset-drop bug. The ETL metadata wire envelope is asymmetric in pycarlo (
The saas-serverless normalizer matches this exactly — asset path does This PR's Suggested fix: serialize assets through the pycarlo envelope rather than the generic Worth a unit test asserting |
Code Review — 8 findings (7 fixed, 1 skipped)Reviewed: 2026-06-05 UTC | Reviewers: security, correctness, testing, devdocs | Scope: full PR
|
Summary
apollo/integrations/custom_etl/, mirroring the existing custom (warehouse) connector scaffoldingCustomEtlProxyClientwrapsConnector(BaseEtlConnector)modules loaded from/opt/custom-etl-connectors/{name}/, exposingfetch_etl_assetsandfetch_etl_runsmethods that match the agent calls in data-collector PR #2390custom-etl-connector-<hash>connection types through the new proxy client (gated byMCD_CUSTOM_CONNECTORS_ENABLED)/api/v1/agent/connectors/typesand/api/v1/agent/custom-connectors/manifests) now return custom ETL connector types and manifests alongside existing native/custom entriesRelated issues and PRs
Test plan
🤖 Generated with Claude Code