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.
Files changed (199) hide show
  1. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/.gitignore +5 -1
  2. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/PKG-INFO +9 -6
  3. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/__init__.py +1 -1
  4. cloudwright_ai-0.2.25/cloudwright/adapters/databricks.py +146 -0
  5. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/architect.py +69 -9
  6. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/catalog/formula.py +34 -0
  7. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/catalog/store.py +15 -1
  8. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/cost.py +2 -1
  9. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/analytics.yaml +9 -0
  10. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/compute.yaml +8 -0
  11. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/database_nosql.yaml +9 -0
  12. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/ml.yaml +9 -0
  13. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/orchestration.yaml +9 -0
  14. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/security_auth.yaml +15 -0
  15. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/storage_object.yaml +9 -0
  16. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/streaming.yaml +9 -0
  17. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/exporter/terraform.py +158 -0
  18. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/icons.py +27 -1
  19. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/providers/__init__.py +23 -7
  20. cloudwright_ai-0.2.25/cloudwright/providers/databricks.py +88 -0
  21. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/templates.py +194 -0
  22. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/validator.py +14 -0
  23. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/pyproject.toml +4 -3
  24. cloudwright_ai-0.2.25/tests/test_adapter_databricks.py +75 -0
  25. cloudwright_ai-0.2.25/tests/test_databricks.py +255 -0
  26. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_formula.py +1 -1
  27. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_registry.py +3 -3
  28. cloudwright_ai-0.2.23/.claude/notepad.json +0 -5
  29. cloudwright_ai-0.2.23/CLAUDE.md +0 -23
  30. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/README.md +0 -0
  31. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/adapters/__init__.py +0 -0
  32. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/adapters/aws.py +0 -0
  33. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/adapters/azure.py +0 -0
  34. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/adapters/gcp.py +0 -0
  35. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/analyzer.py +0 -0
  36. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/ascii_diagram.py +0 -0
  37. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/catalog/__init__.py +0 -0
  38. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/catalog/refresh.py +0 -0
  39. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/catalog.db +0 -0
  40. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/_generate_icons.py +0 -0
  41. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/alb.svg +0 -0
  42. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/api_gateway.svg +0 -0
  43. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/cloudfront.svg +0 -0
  44. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/cloudtrail.svg +0 -0
  45. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/cloudwatch.svg +0 -0
  46. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/cognito.svg +0 -0
  47. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/dynamodb.svg +0 -0
  48. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/ebs.svg +0 -0
  49. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/ec2.svg +0 -0
  50. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/ecr.svg +0 -0
  51. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/ecs.svg +0 -0
  52. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/eks.svg +0 -0
  53. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/elasticache.svg +0 -0
  54. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/emr.svg +0 -0
  55. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/glue.svg +0 -0
  56. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/guardduty.svg +0 -0
  57. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/kinesis.svg +0 -0
  58. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/kms.svg +0 -0
  59. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/lambda.svg +0 -0
  60. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/nlb.svg +0 -0
  61. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/rds.svg +0 -0
  62. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/redshift.svg +0 -0
  63. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/route53.svg +0 -0
  64. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/s3.svg +0 -0
  65. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/sagemaker.svg +0 -0
  66. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/sns.svg +0 -0
  67. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/sqs.svg +0 -0
  68. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/step_functions.svg +0 -0
  69. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/aws/waf.svg +0 -0
  70. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/azure/aks.svg +0 -0
  71. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/azure/app_gateway.svg +0 -0
  72. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/azure/azure_cache.svg +0 -0
  73. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/azure/azure_functions.svg +0 -0
  74. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/azure/azure_sql.svg +0 -0
  75. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/azure/blob_storage.svg +0 -0
  76. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/azure/cosmos_db.svg +0 -0
  77. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/azure/service_bus.svg +0 -0
  78. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/azure/virtual_machines.svg +0 -0
  79. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/gcp/bigquery.svg +0 -0
  80. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/gcp/cloud_cdn.svg +0 -0
  81. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/gcp/cloud_functions.svg +0 -0
  82. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/gcp/cloud_load_balancing.svg +0 -0
  83. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/gcp/cloud_run.svg +0 -0
  84. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/gcp/cloud_sql.svg +0 -0
  85. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/gcp/cloud_storage.svg +0 -0
  86. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/gcp/compute_engine.svg +0 -0
  87. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/gcp/gke.svg +0 -0
  88. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/gcp/memorystore.svg +0 -0
  89. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/gcp/pub_sub.svg +0 -0
  90. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/generic/cache.svg +0 -0
  91. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/generic/cdn.svg +0 -0
  92. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/generic/compute.svg +0 -0
  93. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/generic/database.svg +0 -0
  94. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/generic/firewall.svg +0 -0
  95. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/generic/internet.svg +0 -0
  96. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/generic/load_balancer.svg +0 -0
  97. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/generic/queue.svg +0 -0
  98. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/generic/storage.svg +0 -0
  99. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/icons/generic/user.svg +0 -0
  100. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/cache.yaml +0 -0
  101. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/containers.yaml +0 -0
  102. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/database_relational.yaml +0 -0
  103. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/messaging.yaml +0 -0
  104. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/networking_api.yaml +0 -0
  105. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/networking_cdn.yaml +0 -0
  106. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/networking_dns.yaml +0 -0
  107. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/networking_lb.yaml +0 -0
  108. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/security_waf.yaml +0 -0
  109. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/serverless.yaml +0 -0
  110. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/registry/storage_block.yaml +0 -0
  111. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/templates/_index.yaml +0 -0
  112. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/templates/azure-microservices.yaml +0 -0
  113. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/templates/azure-serverless-api.yaml +0 -0
  114. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/templates/azure-three-tier-web.yaml +0 -0
  115. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/templates/batch-processing.yaml +0 -0
  116. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/templates/data-lake.yaml +0 -0
  117. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/templates/event-driven.yaml +0 -0
  118. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/templates/gcp-microservices.yaml +0 -0
  119. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/templates/gcp-serverless-api.yaml +0 -0
  120. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/templates/gcp-three-tier-web.yaml +0 -0
  121. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/templates/microservices.yaml +0 -0
  122. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/templates/ml_pipeline.yaml +0 -0
  123. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/templates/serverless_api.yaml +0 -0
  124. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/templates/static-site.yaml +0 -0
  125. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/data/templates/three_tier_web.yaml +0 -0
  126. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/differ.py +0 -0
  127. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/drift.py +0 -0
  128. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/evolution.py +0 -0
  129. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/exporter/__init__.py +0 -0
  130. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/exporter/aibom.py +0 -0
  131. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/exporter/c4.py +0 -0
  132. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/exporter/cloudformation.py +0 -0
  133. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/exporter/compliance_report.py +0 -0
  134. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/exporter/d2.py +0 -0
  135. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/exporter/diff_diagram.py +0 -0
  136. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/exporter/mermaid.py +0 -0
  137. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/exporter/presentation.py +0 -0
  138. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/exporter/renderer.py +0 -0
  139. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/exporter/sbom.py +0 -0
  140. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/importer/__init__.py +0 -0
  141. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/importer/cloudformation.py +0 -0
  142. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/importer/terraform_state.py +0 -0
  143. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/importer/utils.py +0 -0
  144. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/layout.py +0 -0
  145. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/linter.py +0 -0
  146. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/llm/__init__.py +0 -0
  147. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/llm/anthropic.py +0 -0
  148. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/llm/base.py +0 -0
  149. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/llm/openai.py +0 -0
  150. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/plugins.py +0 -0
  151. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/policy.py +0 -0
  152. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/providers/aws.py +0 -0
  153. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/providers/azure.py +0 -0
  154. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/providers/gcp.py +0 -0
  155. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/py.typed +0 -0
  156. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/registry.py +0 -0
  157. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/scorer.py +0 -0
  158. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/cloudwright/spec.py +0 -0
  159. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/conftest.py +0 -0
  160. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/fixtures/aws.tfstate +0 -0
  161. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/fixtures/aws_serverless.tfstate +0 -0
  162. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/fixtures/azure.tfstate +0 -0
  163. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/fixtures/cloudformation_template.json +0 -0
  164. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/fixtures/gcp.tfstate +0 -0
  165. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/fixtures/serverless_api.json +0 -0
  166. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/fixtures/three_tier.yaml +0 -0
  167. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_adapter_aws.py +0 -0
  168. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_adapter_azure.py +0 -0
  169. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_adapter_gcp.py +0 -0
  170. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_analyzer.py +0 -0
  171. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_architect.py +0 -0
  172. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_architect_chat.py +0 -0
  173. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_ascii_diagram.py +0 -0
  174. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_c4_exporter.py +0 -0
  175. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_catalog.py +0 -0
  176. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_cfn_importer.py +0 -0
  177. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_constraint_propagation.py +0 -0
  178. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_cost.py +0 -0
  179. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_diff_viz.py +0 -0
  180. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_differ.py +0 -0
  181. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_drift.py +0 -0
  182. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_e2e.py +0 -0
  183. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_evolution.py +0 -0
  184. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_exporter.py +0 -0
  185. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_icons.py +0 -0
  186. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_importer.py +0 -0
  187. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_importer_cfn.py +0 -0
  188. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_layout_engine.py +0 -0
  189. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_linter.py +0 -0
  190. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_packaging.py +0 -0
  191. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_plugins.py +0 -0
  192. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_policy.py +0 -0
  193. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_presentation.py +0 -0
  194. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_refresh.py +0 -0
  195. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_renderer.py +0 -0
  196. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_scorer.py +0 -0
  197. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_spec.py +0 -0
  198. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_validator.py +0 -0
  199. {cloudwright_ai-0.2.23 → cloudwright_ai-0.2.25}/tests/test_validator_fedramp_gdpr.py +0 -0
@@ -12,5 +12,9 @@ node_modules/
12
12
  .pytest_cache/
13
13
  .mypy_cache/
14
14
 
15
- # Codebase intelligence (auto-generated)
15
+ # AI tooling
16
+ .claude/
16
17
  .planning/
18
+ CLAUDE.md
19
+ packages/*/CLAUDE.md
20
+ docs/fix-plan.md
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cloudwright-ai
3
- Version: 0.2.23
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.23; extra == 'all'
25
- Requires-Dist: cloudwright-ai-web==0.2.23; extra == 'all'
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.23; extra == 'cli'
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.23; extra == 'web'
33
- Requires-Dist: cloudwright-ai-web==0.2.23; extra == 'web'
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
@@ -17,7 +17,7 @@ from cloudwright.spec import (
17
17
  ValidationResult,
18
18
  )
19
19
 
20
- __version__ = "0.2.23"
20
+ __version__ = "0.2.25"
21
21
 
22
22
  __all__ = [
23
23
  "Alternative",
@@ -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", "migrate", "re-architect", "compare", "versus", "modernize",
598
- "multi-cloud", "multi cloud", "hybrid", "bridging", "cross-cloud",
599
- "multi-tier", "multi tier", "6 tier", "5 tier", "microservice",
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"}.get(provider, "us-east-1")
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 [("aws", "Amazon Web Services"), ("gcp", "Google Cloud"), ("azure", "Microsoft Azure")]:
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
@@ -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
@@ -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
@@ -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
@@ -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