serverless-data-mesh 0.2.0__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.
- serverless_data_mesh-0.2.0/.gitignore +61 -0
- serverless_data_mesh-0.2.0/CHANGELOG.md +81 -0
- serverless_data_mesh-0.2.0/LICENSE +17 -0
- serverless_data_mesh-0.2.0/PKG-INFO +143 -0
- serverless_data_mesh-0.2.0/PYPI.md +92 -0
- serverless_data_mesh-0.2.0/README.md +409 -0
- serverless_data_mesh-0.2.0/VERSION +1 -0
- serverless_data_mesh-0.2.0/benchmarks/README.md +54 -0
- serverless_data_mesh-0.2.0/benchmarks/results/2026-06-baseline.json +52 -0
- serverless_data_mesh-0.2.0/benchmarks/run_benchmark.sh +21 -0
- serverless_data_mesh-0.2.0/benchmarks/run_cost_estimate.py +135 -0
- serverless_data_mesh-0.2.0/benchmarks/workloads/100k_rows.py +7 -0
- serverless_data_mesh-0.2.0/benchmarks/workloads/10m_rows.py +7 -0
- serverless_data_mesh-0.2.0/benchmarks/workloads/1m_rows.py +7 -0
- serverless_data_mesh-0.2.0/docs/architecture.md +149 -0
- serverless_data_mesh-0.2.0/docs/blog-the-vaquar-pattern.md +676 -0
- serverless_data_mesh-0.2.0/docs/data-mesh-end-to-end.md +595 -0
- serverless_data_mesh-0.2.0/docs/data-mesh-patterns.md +423 -0
- serverless_data_mesh-0.2.0/docs/deployment.md +42 -0
- serverless_data_mesh-0.2.0/docs/domain-contracts.md +47 -0
- serverless_data_mesh-0.2.0/docs/getting-started.md +529 -0
- serverless_data_mesh-0.2.0/docs/glue-connector.md +389 -0
- serverless_data_mesh-0.2.0/docs/images/lambda-execution-flow.png +0 -0
- serverless_data_mesh-0.2.0/docs/images/serverless-data-mesh-hero.png +0 -0
- serverless_data_mesh-0.2.0/docs/images/three-account-data-mesh.png +0 -0
- serverless_data_mesh-0.2.0/docs/images/vaquar-pattern-blog-hero.png +0 -0
- serverless_data_mesh-0.2.0/docs/images/vaquar-pattern-e2e-journey.png +0 -0
- serverless_data_mesh-0.2.0/docs/images/vaquar-pattern-invariant.png +0 -0
- serverless_data_mesh-0.2.0/docs/images/why-sdm-four-phase-connectivity.png +0 -0
- serverless_data_mesh-0.2.0/docs/images/why-sdm-hero-connectivity.png +0 -0
- serverless_data_mesh-0.2.0/docs/images/why-sdm-trust-gap.png +0 -0
- serverless_data_mesh-0.2.0/docs/mesh-trust-dashboard.md +71 -0
- serverless_data_mesh-0.2.0/docs/pypi.md +135 -0
- serverless_data_mesh-0.2.0/docs/sparkrules-connector.md +194 -0
- serverless_data_mesh-0.2.0/docs/terraform-guide.md +283 -0
- serverless_data_mesh-0.2.0/docs/vaquar-pattern.md +319 -0
- serverless_data_mesh-0.2.0/docs/why-serverless-data-mesh.md +736 -0
- serverless_data_mesh-0.2.0/examples/__init__.py +0 -0
- serverless_data_mesh-0.2.0/examples/domain_writer/README.md +62 -0
- serverless_data_mesh-0.2.0/examples/domain_writer/__init__.py +0 -0
- serverless_data_mesh-0.2.0/examples/domain_writer/handler.py +63 -0
- serverless_data_mesh-0.2.0/examples/domain_writer/io.py +33 -0
- serverless_data_mesh-0.2.0/examples/domain_writer/rules_io.py +34 -0
- serverless_data_mesh-0.2.0/examples/domain_writer/spark_io.py +49 -0
- serverless_data_mesh-0.2.0/examples/domain_writer/workload.py +37 -0
- serverless_data_mesh-0.2.0/examples/multi-domain-orders-payments/README.md +42 -0
- serverless_data_mesh-0.2.0/examples/multi-domain-orders-payments/coordinator_config.yaml +24 -0
- serverless_data_mesh-0.2.0/examples/multi-domain-orders-payments/domains/orders/handler.py +22 -0
- serverless_data_mesh-0.2.0/examples/multi-domain-orders-payments/domains/payments/handler.py +22 -0
- serverless_data_mesh-0.2.0/examples/multi-domain-orders-payments/test_atomicity.py +81 -0
- serverless_data_mesh-0.2.0/examples/tutorials/README.md +39 -0
- serverless_data_mesh-0.2.0/examples/tutorials/verification_gate_demo.py +59 -0
- serverless_data_mesh-0.2.0/examples/tutorials/walkthrough.py +296 -0
- serverless_data_mesh-0.2.0/infrastructure/grafana/mesh-trust-dashboard.json +104 -0
- serverless_data_mesh-0.2.0/infrastructure/sam/README.md +25 -0
- serverless_data_mesh-0.2.0/infrastructure/sam/template.yaml +84 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/README.md +191 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/environments/dev/main.tf +160 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/environments/dev/terraform.tfvars.example +10 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/environments/multi-account/README.md +47 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/environments/multi-account/producer/main.tf +137 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/environments/multi-account/producer/terraform.tfvars.example +17 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/environments/multi-account/publisher/main.tf +70 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/environments/multi-account/publisher/terraform.tfvars.example +4 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/environments/multi-account/steward/main.tf +104 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/environments/multi-account/steward/terraform.tfvars.example +5 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/environments/prod/main.tf +124 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/environments/prod/outputs.tf +61 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/environments/prod/providers.tf +13 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/environments/prod/terraform.tfvars.example +34 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/environments/prod/variables.tf +146 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/environments/prod/versions.tf +20 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/modules/eventbridge/main.tf +46 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/modules/eventbridge/outputs.tf +3 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/modules/eventbridge/variables.tf +33 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/modules/eventbridge/versions.tf +9 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/modules/governance/main.tf +98 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/modules/governance/versions.tf +9 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/modules/iam/main.tf +137 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/modules/iam/outputs.tf +11 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/modules/iam/variables.tf +33 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/modules/iam/versions.tf +9 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/modules/lambda/main.tf +64 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/modules/lambda/outputs.tf +30 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/modules/lambda/variables.tf +89 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/modules/lambda/versions.tf +9 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/modules/messaging/main.tf +6 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/modules/messaging/outputs.tf +7 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/modules/messaging/variables.tf +8 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/modules/messaging/versions.tf +9 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/modules/monitoring/dashboard.tf +151 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/modules/monitoring/main.tf +87 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/modules/monitoring/outputs.tf +19 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/modules/monitoring/variables.tf +34 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/modules/monitoring/versions.tf +9 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/modules/stepfunctions/main.tf +31 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/modules/stepfunctions/outputs.tf +7 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/modules/stepfunctions/state_machine.asl.json.tpl +115 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/modules/stepfunctions/variables.tf +47 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/modules/stepfunctions/versions.tf +9 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/modules/storage/main.tf +83 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/modules/storage/outputs.tf +23 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/modules/storage/variables.tf +46 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/modules/storage/versions.tf +9 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/scripts/package_lambda.ps1 +31 -0
- serverless_data_mesh-0.2.0/infrastructure/terraform/scripts/package_lambda.sh +42 -0
- serverless_data_mesh-0.2.0/pyproject.toml +134 -0
- serverless_data_mesh-0.2.0/src/serverless_data_mesh/__init__.py +93 -0
- serverless_data_mesh-0.2.0/src/serverless_data_mesh/catalog/__init__.py +6 -0
- serverless_data_mesh-0.2.0/src/serverless_data_mesh/catalog/glue_connector.py +17 -0
- serverless_data_mesh-0.2.0/src/serverless_data_mesh/catalog/glue_rest.py +134 -0
- serverless_data_mesh-0.2.0/src/serverless_data_mesh/cli.py +165 -0
- serverless_data_mesh-0.2.0/src/serverless_data_mesh/config.py +42 -0
- serverless_data_mesh-0.2.0/src/serverless_data_mesh/dashboard/__init__.py +5 -0
- serverless_data_mesh-0.2.0/src/serverless_data_mesh/dashboard/cloudwatch.py +80 -0
- serverless_data_mesh-0.2.0/src/serverless_data_mesh/dashboard/trust.py +162 -0
- serverless_data_mesh-0.2.0/src/serverless_data_mesh/exceptions.py +23 -0
- serverless_data_mesh-0.2.0/src/serverless_data_mesh/governance/__init__.py +9 -0
- serverless_data_mesh-0.2.0/src/serverless_data_mesh/governance/consumer_sla.py +109 -0
- serverless_data_mesh-0.2.0/src/serverless_data_mesh/lineage/__init__.py +5 -0
- serverless_data_mesh-0.2.0/src/serverless_data_mesh/lineage/openlineage.py +96 -0
- serverless_data_mesh-0.2.0/src/serverless_data_mesh/local/__init__.py +5 -0
- serverless_data_mesh-0.2.0/src/serverless_data_mesh/local/runtime.py +380 -0
- serverless_data_mesh-0.2.0/src/serverless_data_mesh/metrics/__init__.py +5 -0
- serverless_data_mesh-0.2.0/src/serverless_data_mesh/metrics/mesh_trust.py +56 -0
- serverless_data_mesh-0.2.0/src/serverless_data_mesh/orchestration/__init__.py +28 -0
- serverless_data_mesh-0.2.0/src/serverless_data_mesh/orchestration/canary.py +127 -0
- serverless_data_mesh-0.2.0/src/serverless_data_mesh/orchestration/coordinator.py +265 -0
- serverless_data_mesh-0.2.0/src/serverless_data_mesh/orchestration/durable_steps.py +74 -0
- serverless_data_mesh-0.2.0/src/serverless_data_mesh/orchestration/reprocess.py +143 -0
- serverless_data_mesh-0.2.0/src/serverless_data_mesh/orchestration/state.py +16 -0
- serverless_data_mesh-0.2.0/src/serverless_data_mesh/py.typed +0 -0
- serverless_data_mesh-0.2.0/src/serverless_data_mesh/rules/__init__.py +8 -0
- serverless_data_mesh-0.2.0/src/serverless_data_mesh/rules/sparkrules_connector.py +193 -0
- serverless_data_mesh-0.2.0/src/serverless_data_mesh/scaffold/__init__.py +5 -0
- serverless_data_mesh-0.2.0/src/serverless_data_mesh/scaffold/init_domain.py +210 -0
- serverless_data_mesh-0.2.0/src/serverless_data_mesh/types/__init__.py +21 -0
- serverless_data_mesh-0.2.0/src/serverless_data_mesh/types/workload.py +123 -0
- serverless_data_mesh-0.2.0/src/serverless_data_mesh/verification/__init__.py +21 -0
- serverless_data_mesh-0.2.0/src/serverless_data_mesh/verification/backend.py +41 -0
- serverless_data_mesh-0.2.0/src/serverless_data_mesh/verification/fallback.py +200 -0
- serverless_data_mesh-0.2.0/src/serverless_data_mesh/verification/vrp.py +202 -0
- serverless_data_mesh-0.2.0/tests/__init__.py +0 -0
- serverless_data_mesh-0.2.0/tests/conftest.py +30 -0
- serverless_data_mesh-0.2.0/tests/eval/test_consumer_safety.py +27 -0
- serverless_data_mesh-0.2.0/tests/unit/__init__.py +0 -0
- serverless_data_mesh-0.2.0/tests/unit/test_auto_repair_demo.py +12 -0
- serverless_data_mesh-0.2.0/tests/unit/test_canary.py +46 -0
- serverless_data_mesh-0.2.0/tests/unit/test_catalog.py +73 -0
- serverless_data_mesh-0.2.0/tests/unit/test_cli_scaffold.py +31 -0
- serverless_data_mesh-0.2.0/tests/unit/test_config.py +22 -0
- serverless_data_mesh-0.2.0/tests/unit/test_consumer_sla.py +80 -0
- serverless_data_mesh-0.2.0/tests/unit/test_example_workload.py +36 -0
- serverless_data_mesh-0.2.0/tests/unit/test_fallback_verifier.py +73 -0
- serverless_data_mesh-0.2.0/tests/unit/test_local_runtime.py +36 -0
- serverless_data_mesh-0.2.0/tests/unit/test_openlineage.py +44 -0
- serverless_data_mesh-0.2.0/tests/unit/test_reprocess.py +64 -0
- serverless_data_mesh-0.2.0/tests/unit/test_sparkrules_connector.py +43 -0
- serverless_data_mesh-0.2.0/tests/unit/test_types.py +38 -0
- serverless_data_mesh-0.2.0/tests/unit/test_verification.py +56 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Byte-compiled / cache
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
*.so
|
|
6
|
+
.Python
|
|
7
|
+
|
|
8
|
+
# Virtual environments
|
|
9
|
+
.venv/
|
|
10
|
+
venv/
|
|
11
|
+
env/
|
|
12
|
+
|
|
13
|
+
# Packaging
|
|
14
|
+
dist/
|
|
15
|
+
build/
|
|
16
|
+
*.egg-info/
|
|
17
|
+
.eggs/
|
|
18
|
+
*.whl
|
|
19
|
+
|
|
20
|
+
# Test / coverage
|
|
21
|
+
.pytest_cache/
|
|
22
|
+
.coverage
|
|
23
|
+
htmlcov/
|
|
24
|
+
.mypy_cache/
|
|
25
|
+
.ruff_cache/
|
|
26
|
+
|
|
27
|
+
# IDE / editor
|
|
28
|
+
.idea/
|
|
29
|
+
.vscode/
|
|
30
|
+
.cursor/
|
|
31
|
+
*.swp
|
|
32
|
+
|
|
33
|
+
# AWS SAM
|
|
34
|
+
.aws-sam/
|
|
35
|
+
samconfig.toml
|
|
36
|
+
|
|
37
|
+
# Terraform
|
|
38
|
+
infrastructure/terraform/build/*
|
|
39
|
+
!infrastructure/terraform/build/.gitkeep
|
|
40
|
+
.terraform/
|
|
41
|
+
*.tfplan
|
|
42
|
+
*.tfstate
|
|
43
|
+
*.tfstate.*
|
|
44
|
+
.terraform.lock.hcl
|
|
45
|
+
terraform.tfvars
|
|
46
|
+
**/terraform.tfvars
|
|
47
|
+
!**/terraform.tfvars.example
|
|
48
|
+
|
|
49
|
+
# OS
|
|
50
|
+
.DS_Store
|
|
51
|
+
Thumbs.db
|
|
52
|
+
|
|
53
|
+
# Secrets / keys
|
|
54
|
+
.env
|
|
55
|
+
.env.*
|
|
56
|
+
*.pem
|
|
57
|
+
VRP_SIGNING_KEY*
|
|
58
|
+
|
|
59
|
+
# Local scratch / agent artifacts
|
|
60
|
+
tests/_scratch_*
|
|
61
|
+
agent-transcripts/
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
## [0.2.0] - 2026-06-15
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- **Auto VRP reprocessing** (`orchestration/reprocess.py`): detect drops, repair sink, re-proof, commit or escalate
|
|
10
|
+
- **Consumer SLA enforcement** (`governance/consumer_sla.py`): freshness, completeness, required columns; LF grant hook
|
|
11
|
+
- **Live CloudWatch trust dashboard** (Terraform `monitoring/dashboard.tf` + `publish_vrp_metric`)
|
|
12
|
+
- **Grafana template** (`infrastructure/grafana/mesh-trust-dashboard.json`)
|
|
13
|
+
- **Lake Formation governance module** (`terraform/modules/governance/`)
|
|
14
|
+
- CLI: `serverless-data-mesh canary`, `reprocess-demo`, `dashboard --cloudwatch`
|
|
15
|
+
- Scaffold: `consumer_sla.yaml`, `step_function.asl.json`, richer handler imports
|
|
16
|
+
- Docs: `docs/mesh-trust-dashboard.md`
|
|
17
|
+
- Tests: reprocess, consumer SLA, canary, auto-repair demo
|
|
18
|
+
|
|
19
|
+
### Changed
|
|
20
|
+
|
|
21
|
+
- `IceGuardDurableCoordinator` supports optional `sink_reader` + `enable_auto_repair`
|
|
22
|
+
- Trust dashboard supports proofs scan, CloudWatch live mode, and demo fallback
|
|
23
|
+
|
|
24
|
+
## [0.1.3] - 2026-06-15
|
|
25
|
+
|
|
26
|
+
### Added
|
|
27
|
+
|
|
28
|
+
- **Pure-Python fallback verifier** when veridata-recon wheels unavailable (Windows/Mac demo works)
|
|
29
|
+
- `serverless-data-mesh init` domain scaffold CLI
|
|
30
|
+
- `serverless-data-mesh dashboard` mesh trust dashboard HTML
|
|
31
|
+
- `benchmarks/run_cost_estimate.py` with published cost estimates (100K/1M/10M)
|
|
32
|
+
- `ConsumerSLAContract` type and `run_canary_comparison` for progressive delivery
|
|
33
|
+
- Tests: fallback verifier, scaffold, dashboard
|
|
34
|
+
|
|
35
|
+
### Changed
|
|
36
|
+
|
|
37
|
+
- Local demo, gate demo, multi-domain, and benchmark use `create_proof_generator()` auto-backend
|
|
38
|
+
- `benchmarks/results/2026-06-baseline.json` populated (pricing model estimated)
|
|
39
|
+
|
|
40
|
+
## [0.1.2] - 2026-06-15
|
|
41
|
+
|
|
42
|
+
### Added
|
|
43
|
+
|
|
44
|
+
- **Local demo**: `serverless-data-mesh demo` runs PVDM in <60s without AWS (`LocalPVDMRuntime`)
|
|
45
|
+
- `examples/tutorials/verification_gate_demo.py`: corrupt data blocked before consumers
|
|
46
|
+
- `examples/multi-domain-orders-payments/`: deferred mesh leader commit + `test_atomicity.py`
|
|
47
|
+
- `benchmarks/`: cost comparison methodology, workloads (100k/1M/10M), results placeholder
|
|
48
|
+
- `serverless_data_mesh.lineage`: OpenLineage `emit_openlineage_event` on commit
|
|
49
|
+
- Tests: `test_local_runtime.py`, `test_openlineage.py`
|
|
50
|
+
|
|
51
|
+
## [0.1.1] - 2026-06-15
|
|
52
|
+
|
|
53
|
+
### Added
|
|
54
|
+
|
|
55
|
+
- **Vaquar Pattern** (`docs/vaquar-pattern.md`): proof-gated serverless lakehouse publication (PVDM)
|
|
56
|
+
- Blog-style [why-serverless-data-mesh.md](docs/why-serverless-data-mesh.md) with connectivity diagrams
|
|
57
|
+
- New diagram assets: `why-sdm-hero-connectivity.png`, `why-sdm-four-phase-connectivity.png`, `why-sdm-trust-gap.png`
|
|
58
|
+
|
|
59
|
+
### Fixed
|
|
60
|
+
|
|
61
|
+
- Hatch `VERSION` parsing: `pattern` for plain semver file (CI build green)
|
|
62
|
+
- `__version__` reads from package metadata when installed; dev fallback uses `parents[2]`
|
|
63
|
+
- Multi-account Terraform: Steward creates only checkpoint/proof buckets; Publisher creates only lakehouse
|
|
64
|
+
- Storage module: optional per-bucket creation via nullable bucket names
|
|
65
|
+
|
|
66
|
+
### Changed
|
|
67
|
+
|
|
68
|
+
- Pattern catalog: Vaquar Pattern as flagship pattern #0 in [data-mesh-patterns.md](docs/data-mesh-patterns.md)
|
|
69
|
+
|
|
70
|
+
## [0.1.0] - 2026-06-14
|
|
71
|
+
|
|
72
|
+
### Added
|
|
73
|
+
|
|
74
|
+
- Initial release: IceGuard + Durable Execution + veridata-recon + Glue REST
|
|
75
|
+
- `IceGuardDurableCoordinator` for cross-domain transaction boundaries
|
|
76
|
+
- `GlueRestCatalogAdapter` for SigV4 Iceberg metadata commits
|
|
77
|
+
- `VRPProofGenerator` and `validate_then_commit` hooks
|
|
78
|
+
- Domain writer Lambda example with SAM template
|
|
79
|
+
- `VERSION` file, pre-commit, Dependabot, SECURITY.md, consumer safety benchmark
|
|
80
|
+
- `SparkRulesConnector` (`[rules]` extra), PyPI publish workflow
|
|
81
|
+
- CI workflow, unit tests, and documentation
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
Apache License
|
|
2
|
+
Version 2.0, January 2004
|
|
3
|
+
http://www.apache.org/licenses/
|
|
4
|
+
|
|
5
|
+
Copyright 2026 Serverless Data Mesh Contributors
|
|
6
|
+
|
|
7
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
you may not use this file except in compliance with the License.
|
|
9
|
+
You may obtain a copy of the License at
|
|
10
|
+
|
|
11
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
|
|
13
|
+
Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
See the License for the specific language governing permissions and
|
|
17
|
+
limitations under the License.
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: serverless-data-mesh
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: Federated data mesh framework for proof-gated, exactly-once Iceberg data product publication on AWS Lambda.
|
|
5
|
+
Project-URL: Homepage, https://github.com/vaquarkhan/aws-serverless-datamesh-framework
|
|
6
|
+
Project-URL: Documentation, https://github.com/vaquarkhan/aws-serverless-datamesh-framework#readme
|
|
7
|
+
Project-URL: Repository, https://github.com/vaquarkhan/aws-serverless-datamesh-framework
|
|
8
|
+
Project-URL: Changelog, https://github.com/vaquarkhan/aws-serverless-datamesh-framework/blob/main/CHANGELOG.md
|
|
9
|
+
Project-URL: PyPI, https://pypi.org/project/serverless-data-mesh/
|
|
10
|
+
Author: Serverless Data Mesh Contributors
|
|
11
|
+
License-Expression: Apache-2.0
|
|
12
|
+
License-File: LICENSE
|
|
13
|
+
Keywords: aws,data-as-a-product,data-mesh,domain-oriented,durable-execution,federated-data-mesh,federated-governance,iceberg,iceguard,lakehouse,lambda,pyiceberg,rule-engine,serverless,sparkrules,vaquar-pattern,veridata-recon
|
|
14
|
+
Classifier: Development Status :: 3 - Alpha
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
17
|
+
Classifier: Operating System :: OS Independent
|
|
18
|
+
Classifier: Programming Language :: Python :: 3
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
21
|
+
Classifier: Topic :: Database
|
|
22
|
+
Classifier: Topic :: Scientific/Engineering :: Information Analysis
|
|
23
|
+
Classifier: Topic :: System :: Distributed Computing
|
|
24
|
+
Classifier: Typing :: Typed
|
|
25
|
+
Requires-Python: >=3.12
|
|
26
|
+
Requires-Dist: aws-durable-execution-sdk-python>=1.0.0
|
|
27
|
+
Requires-Dist: boto3>=1.34
|
|
28
|
+
Requires-Dist: iceguard>=1.0.0
|
|
29
|
+
Requires-Dist: pyiceberg[glue,rest-sigv4]>=0.7.0
|
|
30
|
+
Requires-Dist: veridata-recon>=0.1.0
|
|
31
|
+
Provides-Extra: all
|
|
32
|
+
Requires-Dist: pyspark>=3.5.0; extra == 'all'
|
|
33
|
+
Requires-Dist: sparkrules>=1.2.0; extra == 'all'
|
|
34
|
+
Provides-Extra: dev
|
|
35
|
+
Requires-Dist: build>=1.2; extra == 'dev'
|
|
36
|
+
Requires-Dist: mypy>=1.8; extra == 'dev'
|
|
37
|
+
Requires-Dist: pre-commit>=4; extra == 'dev'
|
|
38
|
+
Requires-Dist: pytest-cov>=5; extra == 'dev'
|
|
39
|
+
Requires-Dist: pytest>=8; extra == 'dev'
|
|
40
|
+
Requires-Dist: ruff>=0.4; extra == 'dev'
|
|
41
|
+
Requires-Dist: twine>=5; extra == 'dev'
|
|
42
|
+
Provides-Extra: publish
|
|
43
|
+
Requires-Dist: build>=1.2; extra == 'publish'
|
|
44
|
+
Requires-Dist: twine>=5; extra == 'publish'
|
|
45
|
+
Provides-Extra: rules
|
|
46
|
+
Requires-Dist: sparkrules>=1.2.0; extra == 'rules'
|
|
47
|
+
Provides-Extra: spark
|
|
48
|
+
Requires-Dist: pyspark>=3.5.0; extra == 'spark'
|
|
49
|
+
Requires-Dist: sparkrules>=1.2.0; extra == 'spark'
|
|
50
|
+
Description-Content-Type: text/markdown
|
|
51
|
+
|
|
52
|
+
# Serverless Data Mesh
|
|
53
|
+
|
|
54
|
+
**Federated data mesh lakehouse publication on AWS Lambda - with cryptographic proof, not just green job logs.**
|
|
55
|
+
|
|
56
|
+
An open Python framework for **domain-oriented**, **federated data mesh** teams on AWS. Implements **data as a product**, **self-serve write infrastructure**, and **federated computational governance** at the Iceberg lakehouse layer.
|
|
57
|
+
|
|
58
|
+
- **Producer** domains publish governed **data products**
|
|
59
|
+
- **Steward** notaries enforce mesh contracts with VRP proofs
|
|
60
|
+
- **Publisher** zones expose consumer-ready **Iceberg data products**
|
|
61
|
+
|
|
62
|
+
Introduces the **[Vaquar Pattern](https://github.com/vaquarkhan/aws-serverless-datamesh-framework/blob/main/docs/vaquar-pattern.md)** (PVDM): Physical → Verify → Durable → Metadata. Invariant: `commit_metadata ⟹ VRP = PASS`.
|
|
63
|
+
|
|
64
|
+
## Install
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
pip install serverless-data-mesh
|
|
68
|
+
serverless-data-mesh demo # <60s local PVDM demo, no AWS
|
|
69
|
+
pip install "serverless-data-mesh[rules]" # + SparkRules on Lambda
|
|
70
|
+
pip install "serverless-data-mesh[spark]" # + PySpark + SparkRules
|
|
71
|
+
pip install "serverless-data-mesh[all]" # rules + spark
|
|
72
|
+
pip install "serverless-data-mesh[dev]" # pytest, ruff, pre-commit
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**Works on **Windows, Mac, and Linux**. Uses veridata-recon cryptographic VRP when wheels are available; **pure-Python fallback** otherwise (same PASS/FAIL gate).**
|
|
76
|
+
|
|
77
|
+
## What it solves
|
|
78
|
+
|
|
79
|
+
| Problem | Answer |
|
|
80
|
+
|---------|--------|
|
|
81
|
+
| Silent data loss on backfill | VRP `FAIL` blocks Iceberg snapshot |
|
|
82
|
+
| "Job succeeded" is not proof | Cryptographic multiset proof per chunk |
|
|
83
|
+
| Lambda 15-minute limit | Durable Execution + Step Functions (90+ min) |
|
|
84
|
+
| Retry duplicates data | IceGuard rollback + `workload_id` checkpoints |
|
|
85
|
+
| Central ETL bottleneck | Per-domain Lambda writer + transaction boundary |
|
|
86
|
+
| Federated blast radius | Producer · Steward · Publisher accounts |
|
|
87
|
+
|
|
88
|
+
## Building blocks
|
|
89
|
+
|
|
90
|
+
| Package | Role |
|
|
91
|
+
|---------|------|
|
|
92
|
+
| [iceguard](https://pypi.org/project/iceguard/) | Physical SafeWriter, timeout rollback, S3 resume |
|
|
93
|
+
| [veridata-recon](https://pypi.org/project/veridata-recon/) | VRP proof generation and validation |
|
|
94
|
+
| [aws-durable-execution-sdk-python](https://pypi.org/project/aws-durable-execution-sdk-python/) | Cross-invocation step replay |
|
|
95
|
+
| [pyiceberg](https://pypi.org/project/pyiceberg/) | Glue Iceberg REST metadata via `GlueCatalogConnector` |
|
|
96
|
+
| [sparkrules](https://pypi.org/project/sparkrules/) | Optional DRL business rules (`[rules]` extra) |
|
|
97
|
+
|
|
98
|
+
## Quick example
|
|
99
|
+
|
|
100
|
+
```python
|
|
101
|
+
from serverless_data_mesh import (
|
|
102
|
+
IceGuardDurableCoordinator,
|
|
103
|
+
DomainTransactionBoundary,
|
|
104
|
+
VRPProofGenerator,
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
boundary = DomainTransactionBoundary(
|
|
108
|
+
domain_id="orders-domain",
|
|
109
|
+
source_namespace="raw_orders",
|
|
110
|
+
target_table="orders_curated",
|
|
111
|
+
partition_spec={"dt": "2026-06-14"},
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
coordinator = IceGuardDurableCoordinator(
|
|
115
|
+
durable_context=durable_ctx,
|
|
116
|
+
lambda_context=lambda_ctx,
|
|
117
|
+
proof_generator=VRPProofGenerator(),
|
|
118
|
+
catalog_adapter=glue_adapter,
|
|
119
|
+
)
|
|
120
|
+
outcome = coordinator.run_workload(workload)
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Optional extras
|
|
124
|
+
|
|
125
|
+
| Extra | Adds |
|
|
126
|
+
|-------|------|
|
|
127
|
+
| `rules` | SparkRules DRL on Lambda |
|
|
128
|
+
| `spark` | PySpark + SparkRules |
|
|
129
|
+
| `all` | `rules` + `spark` |
|
|
130
|
+
| `dev` | pytest, ruff, mypy, pre-commit |
|
|
131
|
+
| `publish` | build, twine |
|
|
132
|
+
|
|
133
|
+
## Documentation
|
|
134
|
+
|
|
135
|
+
- [GitHub README](https://github.com/vaquarkhan/aws-serverless-datamesh-framework#readme)
|
|
136
|
+
- [Vaquar Pattern](https://github.com/vaquarkhan/aws-serverless-datamesh-framework/blob/main/docs/vaquar-pattern.md)
|
|
137
|
+
- [Getting started](https://github.com/vaquarkhan/aws-serverless-datamesh-framework/blob/main/docs/getting-started.md)
|
|
138
|
+
- [PyPI guide](https://github.com/vaquarkhan/aws-serverless-datamesh-framework/blob/main/docs/pypi.md)
|
|
139
|
+
- [Full documentation](https://github.com/vaquarkhan/aws-serverless-datamesh-framework/tree/main/docs)
|
|
140
|
+
|
|
141
|
+
## License
|
|
142
|
+
|
|
143
|
+
Apache-2.0
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Serverless Data Mesh
|
|
2
|
+
|
|
3
|
+
**Federated data mesh lakehouse publication on AWS Lambda - with cryptographic proof, not just green job logs.**
|
|
4
|
+
|
|
5
|
+
An open Python framework for **domain-oriented**, **federated data mesh** teams on AWS. Implements **data as a product**, **self-serve write infrastructure**, and **federated computational governance** at the Iceberg lakehouse layer.
|
|
6
|
+
|
|
7
|
+
- **Producer** domains publish governed **data products**
|
|
8
|
+
- **Steward** notaries enforce mesh contracts with VRP proofs
|
|
9
|
+
- **Publisher** zones expose consumer-ready **Iceberg data products**
|
|
10
|
+
|
|
11
|
+
Introduces the **[Vaquar Pattern](https://github.com/vaquarkhan/aws-serverless-datamesh-framework/blob/main/docs/vaquar-pattern.md)** (PVDM): Physical → Verify → Durable → Metadata. Invariant: `commit_metadata ⟹ VRP = PASS`.
|
|
12
|
+
|
|
13
|
+
## Install
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
pip install serverless-data-mesh
|
|
17
|
+
serverless-data-mesh demo # <60s local PVDM demo, no AWS
|
|
18
|
+
pip install "serverless-data-mesh[rules]" # + SparkRules on Lambda
|
|
19
|
+
pip install "serverless-data-mesh[spark]" # + PySpark + SparkRules
|
|
20
|
+
pip install "serverless-data-mesh[all]" # rules + spark
|
|
21
|
+
pip install "serverless-data-mesh[dev]" # pytest, ruff, pre-commit
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**Works on **Windows, Mac, and Linux**. Uses veridata-recon cryptographic VRP when wheels are available; **pure-Python fallback** otherwise (same PASS/FAIL gate).**
|
|
25
|
+
|
|
26
|
+
## What it solves
|
|
27
|
+
|
|
28
|
+
| Problem | Answer |
|
|
29
|
+
|---------|--------|
|
|
30
|
+
| Silent data loss on backfill | VRP `FAIL` blocks Iceberg snapshot |
|
|
31
|
+
| "Job succeeded" is not proof | Cryptographic multiset proof per chunk |
|
|
32
|
+
| Lambda 15-minute limit | Durable Execution + Step Functions (90+ min) |
|
|
33
|
+
| Retry duplicates data | IceGuard rollback + `workload_id` checkpoints |
|
|
34
|
+
| Central ETL bottleneck | Per-domain Lambda writer + transaction boundary |
|
|
35
|
+
| Federated blast radius | Producer · Steward · Publisher accounts |
|
|
36
|
+
|
|
37
|
+
## Building blocks
|
|
38
|
+
|
|
39
|
+
| Package | Role |
|
|
40
|
+
|---------|------|
|
|
41
|
+
| [iceguard](https://pypi.org/project/iceguard/) | Physical SafeWriter, timeout rollback, S3 resume |
|
|
42
|
+
| [veridata-recon](https://pypi.org/project/veridata-recon/) | VRP proof generation and validation |
|
|
43
|
+
| [aws-durable-execution-sdk-python](https://pypi.org/project/aws-durable-execution-sdk-python/) | Cross-invocation step replay |
|
|
44
|
+
| [pyiceberg](https://pypi.org/project/pyiceberg/) | Glue Iceberg REST metadata via `GlueCatalogConnector` |
|
|
45
|
+
| [sparkrules](https://pypi.org/project/sparkrules/) | Optional DRL business rules (`[rules]` extra) |
|
|
46
|
+
|
|
47
|
+
## Quick example
|
|
48
|
+
|
|
49
|
+
```python
|
|
50
|
+
from serverless_data_mesh import (
|
|
51
|
+
IceGuardDurableCoordinator,
|
|
52
|
+
DomainTransactionBoundary,
|
|
53
|
+
VRPProofGenerator,
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
boundary = DomainTransactionBoundary(
|
|
57
|
+
domain_id="orders-domain",
|
|
58
|
+
source_namespace="raw_orders",
|
|
59
|
+
target_table="orders_curated",
|
|
60
|
+
partition_spec={"dt": "2026-06-14"},
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
coordinator = IceGuardDurableCoordinator(
|
|
64
|
+
durable_context=durable_ctx,
|
|
65
|
+
lambda_context=lambda_ctx,
|
|
66
|
+
proof_generator=VRPProofGenerator(),
|
|
67
|
+
catalog_adapter=glue_adapter,
|
|
68
|
+
)
|
|
69
|
+
outcome = coordinator.run_workload(workload)
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Optional extras
|
|
73
|
+
|
|
74
|
+
| Extra | Adds |
|
|
75
|
+
|-------|------|
|
|
76
|
+
| `rules` | SparkRules DRL on Lambda |
|
|
77
|
+
| `spark` | PySpark + SparkRules |
|
|
78
|
+
| `all` | `rules` + `spark` |
|
|
79
|
+
| `dev` | pytest, ruff, mypy, pre-commit |
|
|
80
|
+
| `publish` | build, twine |
|
|
81
|
+
|
|
82
|
+
## Documentation
|
|
83
|
+
|
|
84
|
+
- [GitHub README](https://github.com/vaquarkhan/aws-serverless-datamesh-framework#readme)
|
|
85
|
+
- [Vaquar Pattern](https://github.com/vaquarkhan/aws-serverless-datamesh-framework/blob/main/docs/vaquar-pattern.md)
|
|
86
|
+
- [Getting started](https://github.com/vaquarkhan/aws-serverless-datamesh-framework/blob/main/docs/getting-started.md)
|
|
87
|
+
- [PyPI guide](https://github.com/vaquarkhan/aws-serverless-datamesh-framework/blob/main/docs/pypi.md)
|
|
88
|
+
- [Full documentation](https://github.com/vaquarkhan/aws-serverless-datamesh-framework/tree/main/docs)
|
|
89
|
+
|
|
90
|
+
## License
|
|
91
|
+
|
|
92
|
+
Apache-2.0
|