cloudwright-ai 0.2.23__tar.gz → 0.2.25__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.
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/.gitignore +5 -1
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/PKG-INFO +9 -6
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/__init__.py +1 -1
- cloudwright_ai-0.2.25/cloudwright/adapters/databricks.py +146 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/architect.py +69 -9
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/catalog/formula.py +34 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/catalog/store.py +15 -1
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/cost.py +2 -1
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/analytics.yaml +9 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/compute.yaml +8 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/database_nosql.yaml +9 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/ml.yaml +9 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/orchestration.yaml +9 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/security_auth.yaml +15 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/storage_object.yaml +9 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/streaming.yaml +9 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/exporter/terraform.py +158 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/icons.py +27 -1
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/providers/__init__.py +23 -7
- cloudwright_ai-0.2.25/cloudwright/providers/databricks.py +88 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/templates.py +194 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/validator.py +14 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/pyproject.toml +4 -3
- cloudwright_ai-0.2.25/tests/test_adapter_databricks.py +75 -0
- cloudwright_ai-0.2.25/tests/test_databricks.py +255 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_formula.py +1 -1
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_registry.py +3 -3
- cloudwright_ai-0.2.23/.claude/notepad.json +0 -5
- cloudwright_ai-0.2.23/CLAUDE.md +0 -23
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/README.md +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/adapters/__init__.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/adapters/aws.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/adapters/azure.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/adapters/gcp.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/analyzer.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/ascii_diagram.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/catalog/__init__.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/catalog/refresh.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/catalog.db +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/_generate_icons.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/alb.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/api_gateway.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/cloudfront.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/cloudtrail.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/cloudwatch.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/cognito.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/dynamodb.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/ebs.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/ec2.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/ecr.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/ecs.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/eks.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/elasticache.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/emr.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/glue.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/guardduty.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/kinesis.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/kms.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/lambda.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/nlb.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/rds.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/redshift.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/route53.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/s3.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/sagemaker.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/sns.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/sqs.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/step_functions.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/waf.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/azure/aks.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/azure/app_gateway.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/azure/azure_cache.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/azure/azure_functions.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/azure/azure_sql.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/azure/blob_storage.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/azure/cosmos_db.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/azure/service_bus.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/azure/virtual_machines.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/gcp/bigquery.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/gcp/cloud_cdn.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/gcp/cloud_functions.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/gcp/cloud_load_balancing.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/gcp/cloud_run.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/gcp/cloud_sql.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/gcp/cloud_storage.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/gcp/compute_engine.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/gcp/gke.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/gcp/memorystore.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/gcp/pub_sub.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/generic/cache.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/generic/cdn.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/generic/compute.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/generic/database.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/generic/firewall.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/generic/internet.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/generic/load_balancer.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/generic/queue.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/generic/storage.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/generic/user.svg +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/cache.yaml +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/containers.yaml +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/database_relational.yaml +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/messaging.yaml +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/networking_api.yaml +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/networking_cdn.yaml +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/networking_dns.yaml +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/networking_lb.yaml +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/security_waf.yaml +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/serverless.yaml +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/storage_block.yaml +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/templates/_index.yaml +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/templates/azure-microservices.yaml +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/templates/azure-serverless-api.yaml +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/templates/azure-three-tier-web.yaml +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/templates/batch-processing.yaml +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/templates/data-lake.yaml +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/templates/event-driven.yaml +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/templates/gcp-microservices.yaml +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/templates/gcp-serverless-api.yaml +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/templates/gcp-three-tier-web.yaml +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/templates/microservices.yaml +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/templates/ml_pipeline.yaml +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/templates/serverless_api.yaml +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/templates/static-site.yaml +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/templates/three_tier_web.yaml +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/differ.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/drift.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/evolution.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/exporter/__init__.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/exporter/aibom.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/exporter/c4.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/exporter/cloudformation.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/exporter/compliance_report.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/exporter/d2.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/exporter/diff_diagram.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/exporter/mermaid.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/exporter/presentation.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/exporter/renderer.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/exporter/sbom.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/importer/__init__.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/importer/cloudformation.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/importer/terraform_state.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/importer/utils.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/layout.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/linter.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/llm/__init__.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/llm/anthropic.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/llm/base.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/llm/openai.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/plugins.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/policy.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/providers/aws.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/providers/azure.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/providers/gcp.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/py.typed +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/registry.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/scorer.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/spec.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/conftest.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/fixtures/aws.tfstate +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/fixtures/aws_serverless.tfstate +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/fixtures/azure.tfstate +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/fixtures/cloudformation_template.json +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/fixtures/gcp.tfstate +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/fixtures/serverless_api.json +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/fixtures/three_tier.yaml +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_adapter_aws.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_adapter_azure.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_adapter_gcp.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_analyzer.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_architect.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_architect_chat.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_ascii_diagram.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_c4_exporter.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_catalog.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_cfn_importer.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_constraint_propagation.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_cost.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_diff_viz.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_differ.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_drift.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_e2e.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_evolution.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_exporter.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_icons.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_importer.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_importer_cfn.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_layout_engine.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_linter.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_packaging.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_plugins.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_policy.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_presentation.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_refresh.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_renderer.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_scorer.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_spec.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_validator.py +0 -0
- {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_validator_fedramp_gdpr.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cloudwright-ai
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.25
|
|
4
4
|
Summary: Architecture intelligence for cloud engineers — design, cost, compare, export
|
|
5
5
|
Project-URL: Homepage, https://github.com/xmpuspus/cloudwright
|
|
6
6
|
Project-URL: Repository, https://github.com/xmpuspus/cloudwright
|
|
@@ -21,16 +21,19 @@ Requires-Dist: openai<3,>=1.50
|
|
|
21
21
|
Requires-Dist: pydantic<3,>=2.11
|
|
22
22
|
Requires-Dist: pyyaml<7,>=6.0
|
|
23
23
|
Provides-Extra: all
|
|
24
|
-
Requires-Dist: cloudwright-ai-cli==0.2.
|
|
25
|
-
Requires-Dist: cloudwright-ai-web==0.2.
|
|
24
|
+
Requires-Dist: cloudwright-ai-cli==0.2.25; extra == 'all'
|
|
25
|
+
Requires-Dist: cloudwright-ai-web==0.2.25; extra == 'all'
|
|
26
|
+
Requires-Dist: databricks-sdk>=0.38.0; extra == 'all'
|
|
26
27
|
Provides-Extra: cli
|
|
27
|
-
Requires-Dist: cloudwright-ai-cli==0.2.
|
|
28
|
+
Requires-Dist: cloudwright-ai-cli==0.2.25; extra == 'cli'
|
|
29
|
+
Provides-Extra: databricks
|
|
30
|
+
Requires-Dist: databricks-sdk>=0.38.0; extra == 'databricks'
|
|
28
31
|
Provides-Extra: pdf
|
|
29
32
|
Requires-Dist: markdown2; extra == 'pdf'
|
|
30
33
|
Requires-Dist: weasyprint; extra == 'pdf'
|
|
31
34
|
Provides-Extra: web
|
|
32
|
-
Requires-Dist: cloudwright-ai-cli==0.2.
|
|
33
|
-
Requires-Dist: cloudwright-ai-web==0.2.
|
|
35
|
+
Requires-Dist: cloudwright-ai-cli==0.2.25; extra == 'web'
|
|
36
|
+
Requires-Dist: cloudwright-ai-web==0.2.25; extra == 'web'
|
|
34
37
|
Description-Content-Type: text/markdown
|
|
35
38
|
|
|
36
39
|
# Cloudwright
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Iterator
|
|
4
|
+
|
|
5
|
+
from cloudwright.adapters import InstancePrice, ManagedServicePrice, PricingAdapter
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class DatabricksPricingAdapter(PricingAdapter):
|
|
9
|
+
"""Databricks pricing adapter — returns static DBU rates."""
|
|
10
|
+
|
|
11
|
+
provider = "databricks"
|
|
12
|
+
|
|
13
|
+
DBU_RATES = {
|
|
14
|
+
"jobs": 0.15,
|
|
15
|
+
"all_purpose": 0.40,
|
|
16
|
+
"sql_serverless": 0.55,
|
|
17
|
+
"sql_classic": 0.22,
|
|
18
|
+
"model_serving": 0.07,
|
|
19
|
+
"dlt_core": 0.20,
|
|
20
|
+
"dlt_pro": 0.25,
|
|
21
|
+
"dlt_advanced": 0.36,
|
|
22
|
+
"vector_search": 0.40,
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
def fetch_instance_pricing(self, region: str) -> Iterator[InstancePrice]:
|
|
26
|
+
# DBU-based pricing doesn't map to instance types
|
|
27
|
+
return iter([])
|
|
28
|
+
|
|
29
|
+
def fetch_managed_service_pricing(self, service: str, region: str) -> list[ManagedServicePrice]:
|
|
30
|
+
rates = []
|
|
31
|
+
for compute_type, rate in self.DBU_RATES.items():
|
|
32
|
+
rates.append(
|
|
33
|
+
ManagedServicePrice(
|
|
34
|
+
service=service,
|
|
35
|
+
tier_name=compute_type,
|
|
36
|
+
price_per_hour=rate,
|
|
37
|
+
price_per_month=round(rate * 730, 2),
|
|
38
|
+
description=f"DBU rate for {compute_type}",
|
|
39
|
+
)
|
|
40
|
+
)
|
|
41
|
+
return rates
|
|
42
|
+
|
|
43
|
+
def supported_managed_services(self) -> list[str]:
|
|
44
|
+
return [
|
|
45
|
+
"databricks_sql_warehouse",
|
|
46
|
+
"databricks_cluster",
|
|
47
|
+
"databricks_job",
|
|
48
|
+
"databricks_pipeline",
|
|
49
|
+
"databricks_model_serving",
|
|
50
|
+
"databricks_vector_search",
|
|
51
|
+
"databricks_genie",
|
|
52
|
+
"databricks_notebook",
|
|
53
|
+
"databricks_dashboard",
|
|
54
|
+
]
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class DatabricksWorkspaceAdapter:
|
|
58
|
+
"""Validates ArchSpec components against a live Databricks workspace.
|
|
59
|
+
|
|
60
|
+
Requires databricks-sdk: pip install cloudwright-ai[databricks]
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
def __init__(self, host: str | None = None, token: str | None = None):
|
|
64
|
+
try:
|
|
65
|
+
from databricks.sdk import WorkspaceClient
|
|
66
|
+
except ImportError:
|
|
67
|
+
raise ImportError(
|
|
68
|
+
"databricks-sdk is required for workspace validation. "
|
|
69
|
+
"Install with: pip install cloudwright-ai[databricks]"
|
|
70
|
+
)
|
|
71
|
+
kwargs = {}
|
|
72
|
+
if host:
|
|
73
|
+
kwargs["host"] = host
|
|
74
|
+
if token:
|
|
75
|
+
kwargs["token"] = token
|
|
76
|
+
self._client = WorkspaceClient(**kwargs)
|
|
77
|
+
|
|
78
|
+
def validate_spec(self, spec) -> list[dict]:
|
|
79
|
+
"""Validate Databricks components against the workspace."""
|
|
80
|
+
issues = []
|
|
81
|
+
for comp in spec.components:
|
|
82
|
+
if comp.provider != "databricks":
|
|
83
|
+
continue
|
|
84
|
+
try:
|
|
85
|
+
if comp.service == "databricks_sql_warehouse":
|
|
86
|
+
self._validate_warehouse(comp, issues)
|
|
87
|
+
elif comp.service == "databricks_unity_catalog":
|
|
88
|
+
self._validate_catalog(comp, issues)
|
|
89
|
+
elif comp.service == "databricks_cluster":
|
|
90
|
+
self._validate_cluster(comp, issues)
|
|
91
|
+
except Exception as e:
|
|
92
|
+
issues.append(
|
|
93
|
+
{
|
|
94
|
+
"component": comp.id,
|
|
95
|
+
"service": comp.service,
|
|
96
|
+
"severity": "warning",
|
|
97
|
+
"message": f"Could not validate: {e}",
|
|
98
|
+
}
|
|
99
|
+
)
|
|
100
|
+
return issues
|
|
101
|
+
|
|
102
|
+
def _validate_warehouse(self, comp, issues):
|
|
103
|
+
warehouses = list(self._client.warehouses.list())
|
|
104
|
+
if not warehouses:
|
|
105
|
+
issues.append(
|
|
106
|
+
{
|
|
107
|
+
"component": comp.id,
|
|
108
|
+
"service": comp.service,
|
|
109
|
+
"severity": "info",
|
|
110
|
+
"message": "No existing SQL warehouses found; one will be created",
|
|
111
|
+
}
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
def _validate_catalog(self, comp, issues):
|
|
115
|
+
catalogs = [c.name for c in self._client.catalogs.list()]
|
|
116
|
+
if not catalogs:
|
|
117
|
+
issues.append(
|
|
118
|
+
{
|
|
119
|
+
"component": comp.id,
|
|
120
|
+
"service": comp.service,
|
|
121
|
+
"severity": "warning",
|
|
122
|
+
"message": "No Unity Catalog catalogs found; Unity Catalog may not be enabled",
|
|
123
|
+
}
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
def _validate_cluster(self, comp, issues):
|
|
127
|
+
clusters = list(self._client.clusters.list())
|
|
128
|
+
running = [c for c in clusters if c.state and c.state.value == "RUNNING"]
|
|
129
|
+
if running:
|
|
130
|
+
issues.append(
|
|
131
|
+
{
|
|
132
|
+
"component": comp.id,
|
|
133
|
+
"service": comp.service,
|
|
134
|
+
"severity": "info",
|
|
135
|
+
"message": f"{len(running)} cluster(s) currently running",
|
|
136
|
+
}
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
def list_warehouses(self) -> list[dict]:
|
|
140
|
+
return [{"id": w.id, "name": w.name, "state": str(w.state)} for w in self._client.warehouses.list()]
|
|
141
|
+
|
|
142
|
+
def list_catalogs(self) -> list[str]:
|
|
143
|
+
return [c.name for c in self._client.catalogs.list()]
|
|
144
|
+
|
|
145
|
+
def list_schemas(self, catalog: str) -> list[str]:
|
|
146
|
+
return [s.name for s in self._client.schemas.list(catalog_name=catalog)]
|
|
@@ -41,6 +41,8 @@ _DATA_STORE_SERVICES = {
|
|
|
41
41
|
"alloydb",
|
|
42
42
|
"fsx",
|
|
43
43
|
"efs",
|
|
44
|
+
"databricks_vector_search",
|
|
45
|
+
"databricks_volume",
|
|
44
46
|
}
|
|
45
47
|
|
|
46
48
|
# Databases that support multi-AZ / replication
|
|
@@ -55,6 +57,7 @@ _DATABASE_SERVICES = {
|
|
|
55
57
|
"redshift",
|
|
56
58
|
"bigquery",
|
|
57
59
|
"alloydb",
|
|
60
|
+
"databricks_sql_warehouse",
|
|
58
61
|
}
|
|
59
62
|
|
|
60
63
|
_COMPUTE_SERVICES = {
|
|
@@ -73,12 +76,14 @@ _COMPUTE_SERVICES = {
|
|
|
73
76
|
"container_apps",
|
|
74
77
|
"app_engine",
|
|
75
78
|
"fargate",
|
|
79
|
+
"databricks_cluster",
|
|
80
|
+
"databricks_notebook",
|
|
76
81
|
}
|
|
77
82
|
|
|
78
83
|
# HIPAA required service types (by service key or category)
|
|
79
84
|
_HIPAA_REQUIRED = {
|
|
80
|
-
"audit_logging": {"cloudtrail", "cloud_logging", "azure_monitor"},
|
|
81
|
-
"access_control": {"cognito", "firebase_auth", "azure_ad", "iam"},
|
|
85
|
+
"audit_logging": {"cloudtrail", "cloud_logging", "azure_monitor", "databricks_unity_catalog"},
|
|
86
|
+
"access_control": {"cognito", "firebase_auth", "azure_ad", "iam", "databricks_unity_catalog"},
|
|
82
87
|
}
|
|
83
88
|
|
|
84
89
|
_COMPLIANCE_CONTROLS: dict[str, str] = {
|
|
@@ -121,7 +126,11 @@ Azure: azure_cdn, azure_dns, app_gateway, azure_waf, azure_lb, virtual_machines,
|
|
|
121
126
|
container_apps, azure_functions, app_service, azure_sql, cosmos_db, azure_cache,
|
|
122
127
|
service_bus, event_hubs, blob_storage, synapse, azure_ml, azure_ad, logic_apps,
|
|
123
128
|
azure_monitor, azure_devops, azure_migrate, expressroute, azure_firewall,
|
|
124
|
-
azure_sentinel, azure_policy, data_factory, api_management
|
|
129
|
+
azure_sentinel, azure_policy, data_factory, api_management
|
|
130
|
+
Databricks: databricks_sql_warehouse, databricks_cluster, databricks_job, databricks_pipeline,
|
|
131
|
+
databricks_model_serving, databricks_unity_catalog, databricks_vector_search,
|
|
132
|
+
databricks_genie, databricks_notebook, databricks_secret_scope,
|
|
133
|
+
databricks_dashboard, databricks_volume"""
|
|
125
134
|
|
|
126
135
|
# Last updated: 2026-03-01
|
|
127
136
|
_MODEL_VERSION_GUIDANCE = """
|
|
@@ -138,13 +147,13 @@ _DESIGN_SYSTEM = f"""You generate cloud architectures as structured JSON.
|
|
|
138
147
|
Given a natural language description, produce a JSON object with this exact structure:
|
|
139
148
|
{{
|
|
140
149
|
"name": "Short descriptive name for the architecture",
|
|
141
|
-
"provider": "aws|gcp|azure",
|
|
150
|
+
"provider": "aws|gcp|azure|databricks",
|
|
142
151
|
"region": "primary region (e.g. us-east-1, us-central1, eastus)",
|
|
143
152
|
"components": [
|
|
144
153
|
{{
|
|
145
154
|
"id": "unique_snake_case_id",
|
|
146
155
|
"service": "<service_key>",
|
|
147
|
-
"provider": "aws|gcp|azure",
|
|
156
|
+
"provider": "aws|gcp|azure|databricks",
|
|
148
157
|
"label": "Human-readable label",
|
|
149
158
|
"description": "Brief purpose note (instance type, config)",
|
|
150
159
|
"tier": <integer 0-4>,
|
|
@@ -265,6 +274,17 @@ TERRAFORM RESOURCE TYPE MAPPING (use these when parsing Terraform state/config):
|
|
|
265
274
|
- azurerm_mssql_server -> azure_sql
|
|
266
275
|
- azurerm_cosmosdb_account -> cosmos_db
|
|
267
276
|
- azurerm_storage_account -> blob_storage
|
|
277
|
+
- databricks_sql_endpoint -> databricks_sql_warehouse
|
|
278
|
+
- databricks_cluster -> databricks_cluster
|
|
279
|
+
- databricks_job -> databricks_job
|
|
280
|
+
- databricks_pipeline -> databricks_pipeline
|
|
281
|
+
- databricks_serving_endpoint -> databricks_model_serving
|
|
282
|
+
- databricks_catalog -> databricks_unity_catalog
|
|
283
|
+
- databricks_vector_search_endpoint -> databricks_vector_search
|
|
284
|
+
- databricks_notebook -> databricks_notebook
|
|
285
|
+
- databricks_secret_scope -> databricks_secret_scope
|
|
286
|
+
- databricks_volume -> databricks_volume
|
|
287
|
+
- databricks_sql_dashboard -> databricks_dashboard
|
|
268
288
|
|
|
269
289
|
RULES:
|
|
270
290
|
- Map every resource to its closest service key
|
|
@@ -412,6 +432,20 @@ _PROVIDER_SERVICES: dict[str, set[str]] = {
|
|
|
412
432
|
"data_factory",
|
|
413
433
|
"api_management",
|
|
414
434
|
},
|
|
435
|
+
"databricks": {
|
|
436
|
+
"databricks_sql_warehouse",
|
|
437
|
+
"databricks_cluster",
|
|
438
|
+
"databricks_job",
|
|
439
|
+
"databricks_pipeline",
|
|
440
|
+
"databricks_model_serving",
|
|
441
|
+
"databricks_unity_catalog",
|
|
442
|
+
"databricks_vector_search",
|
|
443
|
+
"databricks_genie",
|
|
444
|
+
"databricks_notebook",
|
|
445
|
+
"databricks_secret_scope",
|
|
446
|
+
"databricks_dashboard",
|
|
447
|
+
"databricks_volume",
|
|
448
|
+
},
|
|
415
449
|
}
|
|
416
450
|
|
|
417
451
|
_ALL_VALID_SERVICES: set[str] = set().union(*_PROVIDER_SERVICES.values())
|
|
@@ -421,6 +455,7 @@ _DEFAULT_INSTANCE_TYPES: dict[str, dict[str, str]] = {
|
|
|
421
455
|
"aws": {"compute": "m5.large", "database": "db.r5.large", "cache": "cache.r5.large"},
|
|
422
456
|
"gcp": {"compute": "n2-standard-4", "database": "db-n1-standard-4", "cache": "M1"},
|
|
423
457
|
"azure": {"compute": "Standard_D4s_v3", "database": "GP_Gen5_4", "cache": "C3"},
|
|
458
|
+
"databricks": {"compute": "i3.xlarge", "database": "Small", "cache": "Small"},
|
|
424
459
|
}
|
|
425
460
|
|
|
426
461
|
# Default connection ports by tier relationship
|
|
@@ -594,9 +629,22 @@ class Architect:
|
|
|
594
629
|
def _is_complex_use_case(description: str) -> bool:
|
|
595
630
|
desc_lower = description.lower()
|
|
596
631
|
complex_keywords = {
|
|
597
|
-
"import",
|
|
598
|
-
"
|
|
599
|
-
"
|
|
632
|
+
"import",
|
|
633
|
+
"migrate",
|
|
634
|
+
"re-architect",
|
|
635
|
+
"compare",
|
|
636
|
+
"versus",
|
|
637
|
+
"modernize",
|
|
638
|
+
"multi-cloud",
|
|
639
|
+
"multi cloud",
|
|
640
|
+
"hybrid",
|
|
641
|
+
"bridging",
|
|
642
|
+
"cross-cloud",
|
|
643
|
+
"multi-tier",
|
|
644
|
+
"multi tier",
|
|
645
|
+
"6 tier",
|
|
646
|
+
"5 tier",
|
|
647
|
+
"microservice",
|
|
600
648
|
}
|
|
601
649
|
if any(kw in desc_lower for kw in complex_keywords):
|
|
602
650
|
return True
|
|
@@ -949,6 +997,16 @@ _SERVICE_NORMALIZATION: dict[str, str] = {
|
|
|
949
997
|
"mongodb": "cosmos_db",
|
|
950
998
|
"kubernetes": "eks",
|
|
951
999
|
"docker": "ecs",
|
|
1000
|
+
# Databricks aliases
|
|
1001
|
+
"sql_warehouse": "databricks_sql_warehouse",
|
|
1002
|
+
"dlt": "databricks_pipeline",
|
|
1003
|
+
"delta_live_tables": "databricks_pipeline",
|
|
1004
|
+
"dbx_cluster": "databricks_cluster",
|
|
1005
|
+
"dbx_job": "databricks_job",
|
|
1006
|
+
"mlflow_serving": "databricks_model_serving",
|
|
1007
|
+
"databricks_dlt": "databricks_pipeline",
|
|
1008
|
+
"unity_catalog": "databricks_unity_catalog",
|
|
1009
|
+
"secret_scope": "databricks_secret_scope",
|
|
952
1010
|
}
|
|
953
1011
|
|
|
954
1012
|
# Services that carry engine info in their compound name
|
|
@@ -1176,4 +1234,6 @@ def _diff_services(original: ArchSpec, mapped: ArchSpec) -> list[str]:
|
|
|
1176
1234
|
|
|
1177
1235
|
|
|
1178
1236
|
def _default_region(provider: str) -> str:
|
|
1179
|
-
return {"aws": "us-east-1", "gcp": "us-central1", "azure": "eastus"
|
|
1237
|
+
return {"aws": "us-east-1", "gcp": "us-central1", "azure": "eastus", "databricks": "us-east-1"}.get(
|
|
1238
|
+
provider, "us-east-1"
|
|
1239
|
+
)
|
|
@@ -95,6 +95,26 @@ def per_node_hour(config: dict[str, Any], base_rate: float = 0.0) -> float:
|
|
|
95
95
|
return compute + storage
|
|
96
96
|
|
|
97
97
|
|
|
98
|
+
def per_dbu(config: dict, base_rate: float = 0.0) -> float:
|
|
99
|
+
"""Databricks Unit (DBU) based pricing."""
|
|
100
|
+
dbu_rates = {
|
|
101
|
+
"jobs": 0.15,
|
|
102
|
+
"all_purpose": 0.40,
|
|
103
|
+
"sql_serverless": 0.55,
|
|
104
|
+
"sql_classic": 0.22,
|
|
105
|
+
"model_serving": 0.07,
|
|
106
|
+
"dlt_core": 0.20,
|
|
107
|
+
"dlt_pro": 0.25,
|
|
108
|
+
"dlt_advanced": 0.36,
|
|
109
|
+
"vector_search": 0.40,
|
|
110
|
+
}
|
|
111
|
+
compute_type = config.get("compute_type", "all_purpose")
|
|
112
|
+
dbu_rate = base_rate or dbu_rates.get(compute_type, 0.40)
|
|
113
|
+
dbu_per_hour = config.get("dbu_per_hour", 2.0)
|
|
114
|
+
hours = config.get("hours_per_month", 730)
|
|
115
|
+
return round(dbu_rate * dbu_per_hour * hours, 2)
|
|
116
|
+
|
|
117
|
+
|
|
98
118
|
PRICING_FORMULAS = {
|
|
99
119
|
"per_hour": per_hour,
|
|
100
120
|
"per_request": per_request,
|
|
@@ -106,6 +126,7 @@ PRICING_FORMULAS = {
|
|
|
106
126
|
"per_shard_hour": per_shard_hour,
|
|
107
127
|
"per_tb_query": per_tb_query,
|
|
108
128
|
"per_node_hour": per_node_hour,
|
|
129
|
+
"per_dbu": per_dbu,
|
|
109
130
|
}
|
|
110
131
|
|
|
111
132
|
_FALLBACK_PRICES: dict[str, float] = {
|
|
@@ -231,6 +252,19 @@ _FALLBACK_PRICES: dict[str, float] = {
|
|
|
231
252
|
"ses": 1.0,
|
|
232
253
|
"sendgrid": 0.0,
|
|
233
254
|
"terraform_cloud": 0.0,
|
|
255
|
+
# Databricks
|
|
256
|
+
"databricks_sql_warehouse": 300.0,
|
|
257
|
+
"databricks_cluster": 400.0,
|
|
258
|
+
"databricks_job": 100.0,
|
|
259
|
+
"databricks_pipeline": 150.0,
|
|
260
|
+
"databricks_model_serving": 200.0,
|
|
261
|
+
"databricks_unity_catalog": 0.0,
|
|
262
|
+
"databricks_vector_search": 50.0,
|
|
263
|
+
"databricks_genie": 25.0,
|
|
264
|
+
"databricks_notebook": 0.0,
|
|
265
|
+
"databricks_secret_scope": 0.0,
|
|
266
|
+
"databricks_dashboard": 0.0,
|
|
267
|
+
"databricks_volume": 15.0,
|
|
234
268
|
}
|
|
235
269
|
|
|
236
270
|
|
|
@@ -137,6 +137,15 @@ REGION_MAP = {
|
|
|
137
137
|
"westeurope": ("eu_west", "West Europe"),
|
|
138
138
|
"southeastasia": ("ap_southeast", "Southeast Asia"),
|
|
139
139
|
},
|
|
140
|
+
"databricks": {
|
|
141
|
+
"us-east-1": ("us_east", "US East (Virginia)"),
|
|
142
|
+
"us-west-2": ("us_west", "US West (Oregon)"),
|
|
143
|
+
"eu-west-1": ("eu_west", "EU (Ireland)"),
|
|
144
|
+
"ap-southeast-1": ("ap_southeast", "Asia Pacific (Singapore)"),
|
|
145
|
+
"eastus": ("us_east", "East US"),
|
|
146
|
+
"westeurope": ("eu_west", "West Europe"),
|
|
147
|
+
"europe-west1": ("eu_west", "EU (Belgium)"),
|
|
148
|
+
},
|
|
140
149
|
}
|
|
141
150
|
|
|
142
151
|
|
|
@@ -184,7 +193,12 @@ class Catalog:
|
|
|
184
193
|
def _seed(self, conn: sqlite3.Connection):
|
|
185
194
|
"""Load catalog data from JSON files into SQLite."""
|
|
186
195
|
# Insert providers
|
|
187
|
-
for pid, name in [
|
|
196
|
+
for pid, name in [
|
|
197
|
+
("aws", "Amazon Web Services"),
|
|
198
|
+
("gcp", "Google Cloud"),
|
|
199
|
+
("azure", "Microsoft Azure"),
|
|
200
|
+
("databricks", "Databricks"),
|
|
201
|
+
]:
|
|
188
202
|
conn.execute("INSERT OR IGNORE INTO providers (id, name) VALUES (?, ?)", (pid, name))
|
|
189
203
|
|
|
190
204
|
# Insert regions
|
|
@@ -13,13 +13,14 @@ from cloudwright.spec import Alternative, ArchSpec, Component, ComponentCost, Co
|
|
|
13
13
|
|
|
14
14
|
log = logging.getLogger(__name__)
|
|
15
15
|
|
|
16
|
-
_CONTAINER_ORCHESTRATION = {"eks", "gke", "aks", "ecs"}
|
|
16
|
+
_CONTAINER_ORCHESTRATION = {"eks", "gke", "aks", "ecs", "databricks_cluster"}
|
|
17
17
|
|
|
18
18
|
# Per-provider internet egress rates ($/GB) by transfer type
|
|
19
19
|
_EGRESS_RATES = {
|
|
20
20
|
"aws": {"same_region": 0.01, "cross_region": 0.02, "internet": 0.09},
|
|
21
21
|
"gcp": {"same_region": 0.01, "cross_region": 0.08, "internet": 0.12},
|
|
22
22
|
"azure": {"same_region": 0.01, "cross_region": 0.02, "internet": 0.087},
|
|
23
|
+
"databricks": {"same_region": 0.01, "cross_region": 0.02, "internet": 0.09},
|
|
23
24
|
"cross_provider": 0.09,
|
|
24
25
|
}
|
|
25
26
|
|
|
@@ -26,7 +26,16 @@ services:
|
|
|
26
26
|
pricing_formula: per_hour
|
|
27
27
|
default_config: {dwu: 100, storage_gb: 100}
|
|
28
28
|
|
|
29
|
+
databricks:
|
|
30
|
+
databricks_sql_warehouse:
|
|
31
|
+
name: "Databricks SQL Warehouse"
|
|
32
|
+
description: "Serverless SQL compute for BI and analytics"
|
|
33
|
+
terraform_types: ["databricks_sql_endpoint"]
|
|
34
|
+
pricing_formula: per_dbu
|
|
35
|
+
default_config: {compute_type: sql_serverless, dbu_per_hour: 4.0}
|
|
36
|
+
|
|
29
37
|
equivalences:
|
|
30
38
|
- aws: redshift
|
|
31
39
|
gcp: bigquery
|
|
32
40
|
azure: synapse
|
|
41
|
+
databricks: databricks_sql_warehouse
|
|
@@ -32,6 +32,14 @@ services:
|
|
|
32
32
|
instance_type: Standard_D2s_v5
|
|
33
33
|
storage_gb: 30
|
|
34
34
|
|
|
35
|
+
databricks:
|
|
36
|
+
databricks_cluster:
|
|
37
|
+
name: "Databricks Cluster"
|
|
38
|
+
description: "General purpose compute clusters"
|
|
39
|
+
terraform_types: ["databricks_cluster"]
|
|
40
|
+
pricing_formula: per_dbu
|
|
41
|
+
default_config: {compute_type: all_purpose, dbu_per_hour: 2.0}
|
|
42
|
+
|
|
35
43
|
equivalences:
|
|
36
44
|
- aws: ec2
|
|
37
45
|
gcp: compute_engine
|
{cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/database_nosql.yaml
RENAMED
|
@@ -27,7 +27,16 @@ services:
|
|
|
27
27
|
request_units: 400
|
|
28
28
|
storage_gb: 10
|
|
29
29
|
|
|
30
|
+
databricks:
|
|
31
|
+
databricks_vector_search:
|
|
32
|
+
name: "Databricks Vector Search"
|
|
33
|
+
description: "Managed vector database for similarity search"
|
|
34
|
+
terraform_types: ["databricks_vector_search_endpoint", "databricks_vector_search_index"]
|
|
35
|
+
pricing_formula: per_dbu
|
|
36
|
+
default_config: {compute_type: vector_search, dbu_per_hour: 2.0}
|
|
37
|
+
|
|
30
38
|
equivalences:
|
|
31
39
|
- aws: dynamodb
|
|
32
40
|
gcp: firestore
|
|
33
41
|
azure: cosmos_db
|
|
42
|
+
databricks: databricks_vector_search
|
|
@@ -26,7 +26,16 @@ services:
|
|
|
26
26
|
pricing_formula: per_hour
|
|
27
27
|
default_config: {instance_type: Standard_DS3_v2, training_hours: 10}
|
|
28
28
|
|
|
29
|
+
databricks:
|
|
30
|
+
databricks_model_serving:
|
|
31
|
+
name: "Databricks Model Serving"
|
|
32
|
+
description: "Real-time ML model inference endpoints"
|
|
33
|
+
terraform_types: ["databricks_serving_endpoint"]
|
|
34
|
+
pricing_formula: per_dbu
|
|
35
|
+
default_config: {compute_type: model_serving, dbu_per_hour: 10.0}
|
|
36
|
+
|
|
29
37
|
equivalences:
|
|
30
38
|
- aws: sagemaker
|
|
31
39
|
gcp: vertex_ai
|
|
32
40
|
azure: azure_ml
|
|
41
|
+
databricks: databricks_model_serving
|
{cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/orchestration.yaml
RENAMED
|
@@ -26,7 +26,16 @@ services:
|
|
|
26
26
|
pricing_formula: per_request
|
|
27
27
|
default_config: {monthly_actions: 1000000}
|
|
28
28
|
|
|
29
|
+
databricks:
|
|
30
|
+
databricks_job:
|
|
31
|
+
name: "Databricks Job"
|
|
32
|
+
description: "Scheduled workflow orchestration"
|
|
33
|
+
terraform_types: ["databricks_job"]
|
|
34
|
+
pricing_formula: per_dbu
|
|
35
|
+
default_config: {compute_type: jobs, dbu_per_hour: 2.0}
|
|
36
|
+
|
|
29
37
|
equivalences:
|
|
30
38
|
- aws: step_functions
|
|
31
39
|
gcp: workflows
|
|
32
40
|
azure: logic_apps
|
|
41
|
+
databricks: databricks_job
|
{cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/security_auth.yaml
RENAMED
|
@@ -23,7 +23,22 @@ services:
|
|
|
23
23
|
monthly_active_users: 10000
|
|
24
24
|
tier: P1
|
|
25
25
|
|
|
26
|
+
databricks:
|
|
27
|
+
databricks_unity_catalog:
|
|
28
|
+
name: "Databricks Unity Catalog"
|
|
29
|
+
description: "Unified governance for data and AI assets"
|
|
30
|
+
terraform_types: ["databricks_catalog", "databricks_schema", "databricks_grants"]
|
|
31
|
+
pricing_formula: per_mau
|
|
32
|
+
default_config: {monthly_active_users: 0}
|
|
33
|
+
databricks_secret_scope:
|
|
34
|
+
name: "Databricks Secret Scope"
|
|
35
|
+
description: "Secrets management for credentials and tokens"
|
|
36
|
+
terraform_types: ["databricks_secret_scope", "databricks_secret"]
|
|
37
|
+
pricing_formula: per_mau
|
|
38
|
+
default_config: {monthly_active_users: 0}
|
|
39
|
+
|
|
26
40
|
equivalences:
|
|
27
41
|
- aws: cognito
|
|
28
42
|
gcp: firebase_auth
|
|
29
43
|
azure: azure_ad
|
|
44
|
+
databricks: databricks_unity_catalog
|
{cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/storage_object.yaml
RENAMED
|
@@ -25,10 +25,19 @@ services:
|
|
|
25
25
|
storage_gb: 100
|
|
26
26
|
access_tier: hot
|
|
27
27
|
|
|
28
|
+
databricks:
|
|
29
|
+
databricks_volume:
|
|
30
|
+
name: "Databricks Volume"
|
|
31
|
+
description: "Unity Catalog managed and external volumes"
|
|
32
|
+
terraform_types: ["databricks_volume"]
|
|
33
|
+
pricing_formula: per_gb
|
|
34
|
+
default_config: {storage_gb: 100}
|
|
35
|
+
|
|
28
36
|
equivalences:
|
|
29
37
|
- aws: s3
|
|
30
38
|
gcp: cloud_storage
|
|
31
39
|
azure: blob_storage
|
|
40
|
+
databricks: databricks_volume
|
|
32
41
|
|
|
33
42
|
feature_parity:
|
|
34
43
|
- equivalence: [s3, cloud_storage, blob_storage]
|
|
@@ -26,7 +26,16 @@ services:
|
|
|
26
26
|
pricing_formula: per_shard_hour
|
|
27
27
|
default_config: {throughput_units: 1, retention_days: 1}
|
|
28
28
|
|
|
29
|
+
databricks:
|
|
30
|
+
databricks_pipeline:
|
|
31
|
+
name: "Databricks Delta Live Tables"
|
|
32
|
+
description: "Declarative ETL pipelines"
|
|
33
|
+
terraform_types: ["databricks_pipeline"]
|
|
34
|
+
pricing_formula: per_dbu
|
|
35
|
+
default_config: {compute_type: dlt_core, dbu_per_hour: 3.0}
|
|
36
|
+
|
|
29
37
|
equivalences:
|
|
30
38
|
- aws: kinesis
|
|
31
39
|
gcp: dataflow
|
|
32
40
|
azure: event_hubs
|
|
41
|
+
databricks: databricks_pipeline
|