@tdk-landscape/tdk-cli-core 1.3.15 → 1.3.22
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.
- package/Tiltfile +144 -0
- package/discovery/AGENTS.md +362 -0
- package/discovery/TILT_DISCOVERY.star +424 -0
- package/discovery/Tiltfile +58 -0
- package/discovery/config.star +258 -0
- package/discovery/constants.star +127 -0
- package/discovery/deterministic.star +211 -0
- package/discovery/discovery_daemon.star +191 -0
- package/discovery/discovery_orchestrator.star +460 -0
- package/discovery/filtering.star +5 -0
- package/discovery/identity-management-backend/service.yaml +26 -0
- package/discovery/identity-management-frontend/service.yaml +29 -0
- package/discovery/identity-sdk/service.yaml +9 -0
- package/discovery/incremental_discovery.star +213 -0
- package/discovery/indexing.star +7 -0
- package/discovery/json_manifest_scanner.star +51 -0
- package/discovery/libraries.star +46 -0
- package/discovery/loading.star +23 -0
- package/discovery/manifest/constants.star +104 -0
- package/discovery/manifest/loading.star +386 -0
- package/discovery/manifest/normalize.star +281 -0
- package/discovery/manifest/validation.star +108 -0
- package/discovery/normalization.star +11 -0
- package/discovery/registry.star +544 -0
- package/discovery/resource_snapshot.py +382 -0
- package/discovery/resource_snapshot.star +143 -0
- package/discovery/schemas.star +1 -0
- package/discovery/services/platform/cdc/debezium/nats-connector/service.yaml +9 -0
- package/discovery/services/platform/cdc/nats-http-bridge/service.yaml +9 -0
- package/discovery/services/platform/orchestrator/orchestrator-glue-backend/service.yaml +26 -0
- package/discovery/services/platform/synthetic-monitor/service.yaml +9 -0
- package/discovery/test_resource_snapshot.py +251 -0
- package/discovery/validation.star +78 -0
- package/discovery/versioning.star +1 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +11 -0
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +1 -2
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/project.d.ts.map +1 -1
- package/dist/commands/project.js +36 -41
- package/dist/commands/project.js.map +1 -1
- package/dist/commands/resource.d.ts.map +1 -1
- package/dist/commands/resource.js +51 -55
- package/dist/commands/resource.js.map +1 -1
- package/dist/commands/stack.d.ts.map +1 -1
- package/dist/commands/stack.js +22 -24
- package/dist/commands/stack.js.map +1 -1
- package/dist/commands/ui.d.ts.map +1 -1
- package/dist/commands/ui.js +1 -2
- package/dist/commands/ui.js.map +1 -1
- package/dist/commands/up.d.ts.map +1 -1
- package/dist/commands/up.js +1 -2
- package/dist/commands/up.js.map +1 -1
- package/dist/commands/upgrade.d.ts +8 -0
- package/dist/commands/upgrade.d.ts.map +1 -1
- package/dist/commands/upgrade.js +59 -18
- package/dist/commands/upgrade.js.map +1 -1
- package/dist/generator/extension-fetch.d.ts +19 -0
- package/dist/generator/extension-fetch.d.ts.map +1 -1
- package/dist/generator/extension-fetch.js +71 -5
- package/dist/generator/extension-fetch.js.map +1 -1
- package/dist/generator/template-engine.d.ts +1 -0
- package/dist/generator/template-engine.d.ts.map +1 -1
- package/dist/generator/template-engine.js +50 -6
- package/dist/generator/template-engine.js.map +1 -1
- package/dist/utils/command-helpers.d.ts.map +1 -1
- package/dist/utils/command-helpers.js +7 -9
- package/dist/utils/command-helpers.js.map +1 -1
- package/dist/utils/constants.d.ts +1 -0
- package/dist/utils/constants.d.ts.map +1 -1
- package/dist/utils/constants.js +1 -0
- package/dist/utils/constants.js.map +1 -1
- package/dist/utils/errors.d.ts +2 -0
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +6 -1
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/project-features.d.ts.map +1 -1
- package/dist/utils/project-features.js +1 -1
- package/dist/utils/project-features.js.map +1 -1
- package/dist/utils/resource-features.d.ts.map +1 -1
- package/dist/utils/resource-features.js +2 -2
- package/dist/utils/resource-features.js.map +1 -1
- package/dist/utils/tar.js +4 -4
- package/dist/utils/tar.js.map +1 -1
- package/dist/utils/validation.d.ts +7 -0
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +9 -0
- package/dist/utils/validation.js.map +1 -1
- package/engine/AGENTS.md +705 -0
- package/engine/README.md +29 -0
- package/engine/REFACTORING_MANIFEST_SYSTEM.md +974 -0
- package/engine/Tiltfile +80 -0
- package/engine/assets/docker/golden-layers.Dockerfile +221 -0
- package/engine/assets/scripts/cleanup-completed-migrator-images.sh +37 -0
- package/engine/assets/scripts/cleanup-tilt-images.sh +120 -0
- package/engine/assets/scripts/mac-m1-resource-monitor.sh +121 -0
- package/engine/config.star +3 -0
- package/engine/docs/AUTODISCOVERY_TEST.md +182 -0
- package/engine/docs/C4-ARCHITECTURE-operations.md +396 -0
- package/engine/docs/C4-ARCHITECTURE-overview.md +284 -0
- package/engine/docs/C4-ARCHITECTURE.md +17 -0
- package/engine/docs/GOLDEN_IMAGE_INTEGRATION.md +349 -0
- package/engine/docs/MANIFEST_DRIVEN_ARCHITECTURE.md +357 -0
- package/engine/docs/README.md +284 -0
- package/engine/entrypoint.star +97 -0
- package/engine/lifecycle/orchestrator.star +260 -0
- package/engine/paths.star +717 -0
- package/engine/schemas/manifest-schema.json +301 -0
- package/engine/schemas/service-schema.json +301 -0
- package/engine/scripts/README.md +89 -0
- package/engine/scripts/build-and-publish-lib.sh +205 -0
- package/engine/scripts/check-lib-publish.sh +85 -0
- package/engine/scripts/debug-container.sh +258 -0
- package/engine/scripts/generate-manifest.sh +197 -0
- package/engine/spec.master +702 -0
- package/engine/spec.master.example +341 -0
- package/engine/topologies/README.md +34 -0
- package/engine/topologies/platform/docker/AGENTS.md +59 -0
- package/engine/topologies/platform/docker/auth/auth.star +167 -0
- package/engine/topologies/platform/docker/build/golden_image.star +37 -0
- package/engine/topologies/platform/docker/build/golden_image_build.star +82 -0
- package/engine/topologies/platform/docker/build/golden_image_constants.star +93 -0
- package/engine/topologies/platform/docker/build/golden_image_dockerfile.star +291 -0
- package/engine/topologies/platform/docker/compose/compose.star +636 -0
- package/engine/topologies/platform/docker/compose/compose_helpers.star +52 -0
- package/engine/topologies/platform/docker/compose/traefik_standalone.star +53 -0
- package/engine/topologies/platform/docker/config/bunignore.star +142 -0
- package/engine/topologies/platform/docker/config/dockerignore.star +150 -0
- package/engine/topologies/platform/docker/constants.star +170 -0
- package/engine/topologies/platform/docker/dockerfile/dockerfile.star +54 -0
- package/engine/topologies/platform/docker/generators/golden_docker_generator_v2.star +73 -0
- package/engine/topologies/platform/docker/index.star +27 -0
- package/engine/topologies/platform/docker/layers/bun_helpers.star +23 -0
- package/engine/topologies/platform/docker/layers/infisical/index.star +40 -0
- package/engine/topologies/platform/docker/layers/infisical/infisical_docker.star +262 -0
- package/engine/topologies/platform/docker/layers/l1_base_layers.star +87 -0
- package/engine/topologies/platform/docker/layers/l2_dependency_layers.star +125 -0
- package/engine/topologies/platform/docker/layers/l3_builder_layers.star +209 -0
- package/engine/topologies/platform/docker/layers/l4_runtime_layers.star +214 -0
- package/engine/topologies/platform/docker/layers/prisma/constants.star +135 -0
- package/engine/topologies/platform/docker/layers/prisma/db_readiness.star +96 -0
- package/engine/topologies/platform/docker/layers/prisma/filesystem_setup.star +109 -0
- package/engine/topologies/platform/docker/layers/prisma/migrate_script.star +98 -0
- package/engine/topologies/platform/docker/layers/prisma/prisma_build.star +126 -0
- package/engine/topologies/platform/docker/layers/prisma/prisma_runtime.star +161 -0
- package/engine/topologies/platform/docker/layers/prisma/secret_resolution.star +119 -0
- package/engine/topologies/platform/docker/networking/api_path_constants.star +230 -0
- package/engine/topologies/platform/docker/networking/sablier_container_cycle.star +27 -0
- package/engine/topologies/platform/docker/networking/traefik.star +232 -0
- package/engine/topologies/platform/docker/networking/traefik_constants.star +146 -0
- package/engine/topologies/platform/docker/networking/traefik_helpers.star +160 -0
- package/engine/topologies/platform/docker/secrets/infisical.star +135 -0
- package/engine/topologies/platform/net/proxy.star +4 -0
- package/engine/topologies/platform/registries/local.star +4 -0
- package/engine/topologies/platform/security/secrets.star +239 -0
- package/engine/topologies/platform/state/relational.star +4 -0
- package/engine/topologies/tilt/common/AGENTS.md +59 -0
- package/engine/topologies/tilt/common/utils.star +364 -0
- package/engine/topologies/tilt/common/utils_debug.star +69 -0
- package/engine/topologies/tilt/common/utils_deterministic.star +168 -0
- package/engine/topologies/tilt/common/utils_docker_networks.star +46 -0
- package/engine/topologies/tilt/common/utils_env.star +43 -0
- package/engine/topologies/tilt/common/utils_output.star +97 -0
- package/engine/topologies/tilt/config/AGENTS.md +68 -0
- package/engine/topologies/tilt/config/defaults.star +3 -0
- package/engine/topologies/tilt/config/feature_flags.star +10 -0
- package/engine/topologies/tilt/config/global.star +55 -0
- package/engine/topologies/tilt/config/profiles.star +382 -0
- package/engine/topologies/tilt/generators/agents_md.star +62 -0
- package/engine/topologies/tilt/generators/api_gateway.star +145 -0
- package/engine/topologies/tilt/generators/index.star +124 -0
- package/engine/topologies/tilt/generators/infisical/README.md +424 -0
- package/engine/topologies/tilt/generators/infisical/examples.star +312 -0
- package/engine/topologies/tilt/generators/infisical/index.star +57 -0
- package/engine/topologies/tilt/generators/infisical/machine_identity.star +420 -0
- package/engine/topologies/tilt/generators/infisical/organization.star +534 -0
- package/engine/topologies/tilt/generators/infisical/path_manager.star +476 -0
- package/engine/topologies/tilt/generators/infisical/secrets_generator.star +420 -0
- package/engine/topologies/tilt/generators/nginx_conf.star +143 -0
- package/engine/topologies/tilt/generators/npmrc.star +111 -0
- package/engine/topologies/tilt/generators/tsconfig.star +23 -0
- package/engine/topologies/tilt/generators/typescript/backend_library_tsconfig.star +71 -0
- package/engine/topologies/tilt/generators/typescript/backend_tsconfig.star +124 -0
- package/engine/topologies/tilt/generators/typescript/common.star +7 -0
- package/engine/topologies/tilt/generators/typescript/frontend_library_tsconfig.star +76 -0
- package/engine/topologies/tilt/generators/typescript/frontend_tsconfig.star +110 -0
- package/engine/topologies/tilt/generators/typescript/include.star +23 -0
- package/engine/topologies/tilt/generators/typescript/playwright_config.star +40 -0
- package/engine/topologies/tilt/generators/typescript/prisma_config.star +49 -0
- package/engine/topologies/tilt/generators/validators.star +853 -0
- package/engine/topologies/tilt/generators/vite/backend.star +78 -0
- package/engine/topologies/tilt/generators/vite/frontend.star +98 -0
- package/engine/topologies/tilt/generators/vite/generators.star +43 -0
- package/engine/topologies/tilt/generators/vite/helpers.star +244 -0
- package/engine/topologies/tilt/generators/vite/library.star +65 -0
- package/engine/topologies/tilt/generators/vite/sdk.star +73 -0
- package/engine/topologies/tilt/generators/vite/templates.star +737 -0
- package/engine/topologies/tilt/generators/vite_config.star +22 -0
- package/engine/topologies/tilt/manifest/AGENTS.md +61 -0
- package/engine/topologies/tilt/manifest/README.md +693 -0
- package/engine/topologies/tilt/manifest/__init__.star +218 -0
- package/engine/topologies/tilt/manifest/constants.star +252 -0
- package/engine/topologies/tilt/manifest/errors.star +266 -0
- package/engine/topologies/tilt/manifest/integration.star +339 -0
- package/engine/topologies/tilt/manifest/json_to_yaml.py +54 -0
- package/engine/topologies/tilt/manifest/loader.star +214 -0
- package/engine/topologies/tilt/manifest/mapper.star +227 -0
- package/engine/topologies/tilt/manifest/parser.star +400 -0
- package/engine/topologies/tilt/manifest/schema.star +462 -0
- package/engine/topologies/tilt/manifest/tests/test_integration.star +276 -0
- package/engine/topologies/tilt/manifest/tests/test_loader_parser.star +397 -0
- package/engine/topologies/tilt/manifest/tests/test_manifest.star +316 -0
- package/engine/topologies/tilt/manifest/tests/test_validator.star +470 -0
- package/engine/topologies/tilt/manifest/validator.star +717 -0
- package/engine/topologies/tilt/manifest/yaml_to_json.py +18 -0
- package/engine/topologies/tilt/resources/AGENTS.md +71 -0
- package/engine/topologies/tilt/resources/conditions.star +3 -0
- package/engine/topologies/tilt/resources/databases.star +244 -0
- package/engine/topologies/tilt/resources/declaration.star +3 -0
- package/engine/topologies/tilt/resources/deps.star +3 -0
- package/engine/topologies/tilt/resources/infra-loader.star +437 -0
- package/engine/topologies/tilt/resources/libs.star +30 -0
- package/engine/topologies/tilt/resources/libs_discovery.star +102 -0
- package/engine/topologies/tilt/resources/libs_paths.star +79 -0
- package/engine/topologies/tilt/resources/libs_resource_definition.star +151 -0
- package/engine/topologies/tilt/resources/libs_setup.star +164 -0
- package/engine/topologies/tilt/resources/libs_tsconfig.star +37 -0
- package/engine/topologies/tilt/resources/orchestrator/apply.star +77 -0
- package/engine/topologies/tilt/resources/orchestrator/apply_compose_resource_registration.star +431 -0
- package/engine/topologies/tilt/resources/orchestrator/apply_manifest_orchestration.star +81 -0
- package/engine/topologies/tilt/resources/orchestrator/apply_migrator_orchestration.star +148 -0
- package/engine/topologies/tilt/resources/orchestrator/apply_resource_validation.star +36 -0
- package/engine/topologies/tilt/resources/orchestrator/apply_runtime_flags.star +44 -0
- package/engine/topologies/tilt/resources/orchestrator/builders/typescript.star +164 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/AGENTS.md +75 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/index.star +21 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/resolver.star +134 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/env.star +258 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/frontend.star +169 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/manifest_resource.star +524 -0
- package/engine/topologies/tilt/resources/orchestrator/helpers.star +33 -0
- package/engine/topologies/tilt/resources/orchestrator.star +54 -0
- package/engine/topologies/tilt/resources/ordering.star +3 -0
- package/engine/topologies/tilt/resources/triggers.star +3 -0
- package/engine/topologies/tilt/resources/watchers.star +299 -0
- package/engine/where-things-live.star +717 -0
- package/ext/Tiltfile +66 -0
- package/ext/ide-components/README.md +219 -0
- package/ext/ide-components/code_executor/server.py +268 -0
- package/ext/ide-components/code_viewer/server.py +206 -0
- package/ext/ide-components/config_inspector/server.py +1050 -0
- package/ext/ide-components/file_browser/server.py +285 -0
- package/ext/ide-components/shared/config_service.py +469 -0
- package/ext/ide-components/shared/file_utils.py +298 -0
- package/ext/ide-components/shared/http_utils.py +232 -0
- package/ext/ide-components/shared/static/styles.css +1334 -0
- package/ext/ide-components/shared/syntax_highlighter.py +140 -0
- package/ext/ide-components/shared/template_engine.py +123 -0
- package/ext/ide-components/shared/templates/base.html +121 -0
- package/ext/ide-components/shared/test_config_service.py +326 -0
- package/ext/ide-components/shared/tilt_integration.py +158 -0
- package/ext/ui-enhancements/cron-status-server.sh +49 -0
- package/ext/ui-enhancements/cron-status-tracker.sh +146 -0
- package/ext/ui-enhancements/extension.yaml +36 -0
- package/ext/ui-enhancements/tiltfile.py +99 -0
- package/ext/ui-enhancements/ui/cron-jobs-tab.css +396 -0
- package/ext/ui-enhancements/ui/help-panel.css +279 -0
- package/ext/ui-enhancements/ui/icons.css +125 -0
- package/ext/ui-enhancements/ui/tooltips.css +114 -0
- package/package.json +13 -9
- package/specs/specs/TILT_SERVICE_DEFAULTS.star +205 -0
- package/specs/specs/TILT_TECH_STACK.star +159 -0
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
# =============================================================================
|
|
2
|
+
# 🌐 - API PATH CONSTANTS (Dynamic)
|
|
3
|
+
# =============================================================================
|
|
4
|
+
# API paths are generated dynamically from manifest stack and appName fields
|
|
5
|
+
# No hardcoded resource names - all from service.json
|
|
6
|
+
# =============================================================================
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
# =============================================================================
|
|
11
|
+
# API VERSION AND BASE PATH
|
|
12
|
+
# =============================================================================
|
|
13
|
+
|
|
14
|
+
# === INLINED CONSTANTS for pure extension loading ===
|
|
15
|
+
HEALTH_CHECK_PATH = "/health"
|
|
16
|
+
# === END INLINED CONSTANTS ===
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
API_VERSION_V1 = "v1"
|
|
20
|
+
API_BASE_PATH = "/api"
|
|
21
|
+
|
|
22
|
+
# =============================================================================
|
|
23
|
+
# DYNAMIC API PATH GENERATION
|
|
24
|
+
# =============================================================================
|
|
25
|
+
|
|
26
|
+
def generate_api_path(stack, app_name):
|
|
27
|
+
"""Generate API path from manifest stack and appName.
|
|
28
|
+
|
|
29
|
+
URL Restructuring: Changed from /api/v1/{app-name} to /api/{stack}-management
|
|
30
|
+
This provides clean separation between frontend and backend while removing version from path.
|
|
31
|
+
"""
|
|
32
|
+
# NEW: Use /api/{stack}-management pattern
|
|
33
|
+
# Examples: /api/user-management, /api/order-management
|
|
34
|
+
return "/api/" + stack + "-management"
|
|
35
|
+
|
|
36
|
+
# =============================================================================
|
|
37
|
+
# SERVICE STACK TO API PATH MAPPING (Dynamic)
|
|
38
|
+
# =============================================================================
|
|
39
|
+
# This is populated at runtime from discovered manifests
|
|
40
|
+
# No hardcoded resource names
|
|
41
|
+
|
|
42
|
+
RESOURCE_STACK_TO_API_PATH = {}
|
|
43
|
+
|
|
44
|
+
# =============================================================================
|
|
45
|
+
# API PATH TO SERVICE MAPPING (Dynamic)
|
|
46
|
+
# =============================================================================
|
|
47
|
+
|
|
48
|
+
API_PATH_TO_RESOURCE_STACK = {}
|
|
49
|
+
API_PATH_TO_RESOURCE_DOMAIN = API_PATH_TO_RESOURCE_STACK
|
|
50
|
+
|
|
51
|
+
# =============================================================================
|
|
52
|
+
# HELPER FUNCTIONS
|
|
53
|
+
# =============================================================================
|
|
54
|
+
|
|
55
|
+
def _pluralize_stack(stack):
|
|
56
|
+
"""Convert stack to proper plural form.
|
|
57
|
+
|
|
58
|
+
Handles irregular plurals and special cases for platform stacks.
|
|
59
|
+
|
|
60
|
+
Args:
|
|
61
|
+
stack: Singular stack name (e.g., "user", "order", "product")
|
|
62
|
+
|
|
63
|
+
Returns:
|
|
64
|
+
str: Pluralized stack name (e.g., "users", "orders", "products")
|
|
65
|
+
"""
|
|
66
|
+
# Already plural
|
|
67
|
+
if stack.endswith("s"):
|
|
68
|
+
return stack
|
|
69
|
+
|
|
70
|
+
# Special cases - irregular plurals (common English patterns)
|
|
71
|
+
irregulars = {
|
|
72
|
+
"category": "categories",
|
|
73
|
+
"city": "cities",
|
|
74
|
+
"company": "companies",
|
|
75
|
+
"story": "stories",
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if stack in irregulars:
|
|
79
|
+
return irregulars[stack]
|
|
80
|
+
|
|
81
|
+
# Words ending in 'y' (not preceded by a vowel) -> 'ies'
|
|
82
|
+
if stack.endswith("y") and len(stack) > 1 and stack[-2] not in "aeiou":
|
|
83
|
+
return stack[:-1] + "ies"
|
|
84
|
+
|
|
85
|
+
# Words ending in 'ch', 'sh', 'ss', 'x', 'z', 'o' -> add 'es'
|
|
86
|
+
if stack.endswith(("ch", "sh", "ss", "x", "z", "o")):
|
|
87
|
+
return stack + "es"
|
|
88
|
+
|
|
89
|
+
# Default: add 's'
|
|
90
|
+
return stack + "s"
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def get_api_path_for_stack(stack, manifest=None):
|
|
94
|
+
"""Returns the full API path for a service stack.
|
|
95
|
+
|
|
96
|
+
URL Restructuring: Changed from /api/v1/{stack}s to /api/{stack}-management
|
|
97
|
+
This aligns API paths with resource naming conventions.
|
|
98
|
+
|
|
99
|
+
Args:
|
|
100
|
+
stack: Service stack name from manifest.json
|
|
101
|
+
manifest: Optional manifest dict that may contain 'apiPath' override
|
|
102
|
+
|
|
103
|
+
Returns:
|
|
104
|
+
Full API path string (e.g., "/api/user-management")
|
|
105
|
+
Falls back to "/api/{stack}-management" if not found
|
|
106
|
+
Returns apiPath from manifest if explicitly specified
|
|
107
|
+
"""
|
|
108
|
+
# Check for explicit apiPath override in manifest
|
|
109
|
+
if manifest and manifest.get("apiPath"):
|
|
110
|
+
return manifest.get("apiPath")
|
|
111
|
+
|
|
112
|
+
# NEW: Use /api/{stack}-management pattern instead of /api/v1/{pluralized}
|
|
113
|
+
return RESOURCE_STACK_TO_API_PATH.get(stack, "/api/" + stack + "-management")
|
|
114
|
+
|
|
115
|
+
# Backwards compatibility alias
|
|
116
|
+
get_api_path_for_domain = get_api_path_for_stack
|
|
117
|
+
|
|
118
|
+
def get_api_path_for_resource(resource_name):
|
|
119
|
+
"""Returns the full API path for a resource name.
|
|
120
|
+
|
|
121
|
+
Args:
|
|
122
|
+
resource_name: Resource appName from manifest
|
|
123
|
+
|
|
124
|
+
Returns:
|
|
125
|
+
Full API path string
|
|
126
|
+
"""
|
|
127
|
+
# Extract stack from resource name using pattern matching
|
|
128
|
+
# No hardcoded resource names - all patterns derived from naming conventions
|
|
129
|
+
if "-management-backend" in resource_name:
|
|
130
|
+
stack = resource_name.replace("-management-backend", "")
|
|
131
|
+
elif "-management-frontend" in resource_name:
|
|
132
|
+
stack = resource_name.replace("-management-frontend", "")
|
|
133
|
+
elif "-planner-backend" in resource_name:
|
|
134
|
+
stack = resource_name.replace("-planner-backend", "")
|
|
135
|
+
elif "-planner-frontend" in resource_name:
|
|
136
|
+
stack = resource_name.replace("-planner-frontend", "")
|
|
137
|
+
elif "-backend" in resource_name:
|
|
138
|
+
stack = resource_name.replace("-backend", "")
|
|
139
|
+
elif "-frontend" in resource_name:
|
|
140
|
+
stack = resource_name.replace("-frontend", "")
|
|
141
|
+
else:
|
|
142
|
+
stack = resource_name
|
|
143
|
+
|
|
144
|
+
return get_api_path_for_stack(stack)
|
|
145
|
+
|
|
146
|
+
# Backwards compatibility alias
|
|
147
|
+
get_api_path_for_service = get_api_path_for_resource
|
|
148
|
+
|
|
149
|
+
def get_stack_for_api_path(api_path):
|
|
150
|
+
"""Returns the service stack for an API path (reverse lookup).
|
|
151
|
+
|
|
152
|
+
Args:
|
|
153
|
+
api_path: Full API path
|
|
154
|
+
|
|
155
|
+
Returns:
|
|
156
|
+
Service stack string
|
|
157
|
+
"""
|
|
158
|
+
return API_PATH_TO_RESOURCE_STACK.get(api_path, "")
|
|
159
|
+
|
|
160
|
+
# Backwards compatibility alias
|
|
161
|
+
get_domain_for_api_path = get_stack_for_api_path
|
|
162
|
+
|
|
163
|
+
# Load project name for dynamic localhost domain
|
|
164
|
+
# Use TDK_PROJECT_ROOT env var set by Tilt, fallback to current directory
|
|
165
|
+
def _load_project_localhost():
|
|
166
|
+
project_root = os.environ.get('TDK_PROJECT_ROOT', '')
|
|
167
|
+
project_json_path = '.tdk/project.json'
|
|
168
|
+
if project_root:
|
|
169
|
+
project_json_path = project_root + '/' + project_json_path
|
|
170
|
+
|
|
171
|
+
if os.path.exists(project_json_path):
|
|
172
|
+
_project_json = read_json(project_json_path)
|
|
173
|
+
return _project_json.get('project', {}).get('name', 'tdk-project') + ".localhost"
|
|
174
|
+
return "tdk-project.localhost"
|
|
175
|
+
|
|
176
|
+
_PROJECT_LOCALHOST = _load_project_localhost()
|
|
177
|
+
|
|
178
|
+
def build_traefik_url(api_path, host=None, scheme="http"):
|
|
179
|
+
"""Builds full Traefik gateway URL from API path.
|
|
180
|
+
|
|
181
|
+
Args:
|
|
182
|
+
api_path: API path
|
|
183
|
+
host: Gateway host (default: {project}.localhost from project.json)
|
|
184
|
+
scheme: URL scheme (default: http)
|
|
185
|
+
|
|
186
|
+
Returns:
|
|
187
|
+
Full URL string
|
|
188
|
+
"""
|
|
189
|
+
if host == None:
|
|
190
|
+
host = _PROJECT_LOCALHOST
|
|
191
|
+
return scheme + "://" + host + api_path
|
|
192
|
+
|
|
193
|
+
def build_health_endpoint(api_path, health_path="/health"):
|
|
194
|
+
"""Builds health check endpoint path from API path.
|
|
195
|
+
|
|
196
|
+
Args:
|
|
197
|
+
api_path: API path
|
|
198
|
+
health_path: Health endpoint suffix (default: /health)
|
|
199
|
+
|
|
200
|
+
Returns:
|
|
201
|
+
Full health endpoint path
|
|
202
|
+
"""
|
|
203
|
+
return api_path + health_path
|
|
204
|
+
|
|
205
|
+
def get_all_api_paths():
|
|
206
|
+
"""Returns a list of all defined API paths from discovered services.
|
|
207
|
+
|
|
208
|
+
Returns:
|
|
209
|
+
List of API path strings
|
|
210
|
+
"""
|
|
211
|
+
return RESOURCE_DOMAIN_TO_API_PATH.values()
|
|
212
|
+
|
|
213
|
+
def is_valid_api_path(api_path):
|
|
214
|
+
"""Checks if an API path is valid/defined.
|
|
215
|
+
|
|
216
|
+
Args:
|
|
217
|
+
api_path: API path to check
|
|
218
|
+
|
|
219
|
+
Returns:
|
|
220
|
+
True if valid, False otherwise
|
|
221
|
+
"""
|
|
222
|
+
return api_path in API_PATH_TO_RESOURCE_DOMAIN
|
|
223
|
+
|
|
224
|
+
# =============================================================================
|
|
225
|
+
# LEGACY COMPATIBILITY (Deprecated - for migration only)
|
|
226
|
+
# =============================================================================
|
|
227
|
+
# All legacy paths removed - use dynamic path generation from manifests
|
|
228
|
+
|
|
229
|
+
LEGACY_DOMAIN_TO_API_PATH = {}
|
|
230
|
+
RESOURCE_DOMAIN_TO_API_PATH = LEGACY_DOMAIN_TO_API_PATH
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
def _sablier_middleware_suffix(manifest):
|
|
2
|
+
"""Return (middleware_suffix, group, enabled) for a manifest's Sablier block.
|
|
3
|
+
|
|
4
|
+
When a workload opts in via a `sablier` block, it is fronted by the file-provider
|
|
5
|
+
middleware `sablier-<group>@file` (defined in the platform proxy dynamic config).
|
|
6
|
+
The leading comma lets callers append the suffix to an existing middlewares list.
|
|
7
|
+
"""
|
|
8
|
+
sablier_cfg = manifest.get('sablier', {}) if manifest else {}
|
|
9
|
+
if not sablier_cfg.get('enable', False):
|
|
10
|
+
return "", "", False
|
|
11
|
+
group = sablier_cfg.get('group', manifest.get('stack', '') if manifest else '')
|
|
12
|
+
if not group:
|
|
13
|
+
return ",sablier-base@file", "", True
|
|
14
|
+
return ",sablier-" + group + "@file", group, True
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def _sablier_container_labels(group, indent):
|
|
18
|
+
"""Container labels that let Sablier discover, wake, and stop this workload.
|
|
19
|
+
|
|
20
|
+
`traefik.docker.allownonrunning=true` keeps the router registered while the
|
|
21
|
+
container is stopped, so the next request can trigger the wake.
|
|
22
|
+
"""
|
|
23
|
+
lines = [indent + '- "sablier.enable=true"']
|
|
24
|
+
if group:
|
|
25
|
+
lines.append(indent + '- "sablier.group=' + group + '"')
|
|
26
|
+
lines.append(indent + '- "traefik.docker.allownonrunning=true"')
|
|
27
|
+
return "\n" + "\n".join(lines)
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
# =============================================================================
|
|
2
|
+
# 🐳 TILT SDK - TRAEFIK LABELS GENERATOR
|
|
3
|
+
# =============================================================================
|
|
4
|
+
|
|
5
|
+
load(
|
|
6
|
+
"./traefik_constants.star",
|
|
7
|
+
"TRAEFIK_BACKEND_ENABLE_HTTP",
|
|
8
|
+
"TRAEFIK_BACKEND_ENABLE_HTTPS",
|
|
9
|
+
"TRAEFIK_PROJECT_HOST",
|
|
10
|
+
"TRAEFIK_PROJECT_API_HOST",
|
|
11
|
+
"TRAEFIK_DOCKER_NETWORK",
|
|
12
|
+
"TRAEFIK_ENABLE_LABEL",
|
|
13
|
+
"TRAEFIK_FRONTEND_ENABLE_HTTP",
|
|
14
|
+
"TRAEFIK_FRONTEND_ENABLE_HTTPS",
|
|
15
|
+
"TRAEFIK_FRONTEND_PRIORITY_BASE",
|
|
16
|
+
"TRAEFIK_MIDDLEWARE_SUFFIX",
|
|
17
|
+
"TRAEFIK_WEB_ENTRYPOINT",
|
|
18
|
+
"TRAEFIK_WEBSECURE_ENTRYPOINT",
|
|
19
|
+
"TRAEFIK_API_VERSION",
|
|
20
|
+
"TRAEFIK_HEALTHCHECK_INTERVAL",
|
|
21
|
+
"TRAEFIK_HEALTHCHECK_TIMEOUT",
|
|
22
|
+
"TRAEFIK_HEALTHCHECK_RETRIES",
|
|
23
|
+
"TRAEFIK_STARTUP_GRACE_PERIOD",
|
|
24
|
+
"TRAEFIK_API_BASE_PATH",
|
|
25
|
+
)
|
|
26
|
+
load("./traefik_helpers.star",
|
|
27
|
+
"backend_rule",
|
|
28
|
+
"build_entrypoints",
|
|
29
|
+
"cli_api_path",
|
|
30
|
+
"frontend_rule",
|
|
31
|
+
"get_api_path",
|
|
32
|
+
"project_backend_rule",
|
|
33
|
+
)
|
|
34
|
+
# load("./sablier_container_cycle.star",
|
|
35
|
+
# "_sablier_middleware_suffix",
|
|
36
|
+
# "_sablier_container_labels",
|
|
37
|
+
# )
|
|
38
|
+
|
|
39
|
+
def _sablier_middleware_suffix(_):
|
|
40
|
+
# Stub: no Sablier middleware needed
|
|
41
|
+
return "", "", False
|
|
42
|
+
|
|
43
|
+
def _sablier_container_labels(_, __):
|
|
44
|
+
# Stub: no extra labels needed
|
|
45
|
+
return ""
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
# Sablier functions imported from sablier_container_cycle.star
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def get_frontend_traefik_labels(res_name, domain, base_path, port, traefik_host=None, manifest=None):
|
|
52
|
+
"""Generate Traefik labels for frontend services."""
|
|
53
|
+
# Priority based on path length ensures more specific paths win over broader ones
|
|
54
|
+
router_priority = TRAEFIK_FRONTEND_PRIORITY_BASE + len(base_path or "")
|
|
55
|
+
frontend_route_rule = frontend_rule(res_name, base_path, traefik_host)
|
|
56
|
+
frontend_entrypoints = build_entrypoints(
|
|
57
|
+
TRAEFIK_FRONTEND_ENABLE_HTTP,
|
|
58
|
+
TRAEFIK_FRONTEND_ENABLE_HTTPS,
|
|
59
|
+
)
|
|
60
|
+
middleware_name = res_name + TRAEFIK_MIDDLEWARE_SUFFIX
|
|
61
|
+
|
|
62
|
+
# Check if maintenance feature is enabled
|
|
63
|
+
features = manifest.get('features', []) if manifest else []
|
|
64
|
+
maintenance_middleware = ""
|
|
65
|
+
if 'maintenance' in features:
|
|
66
|
+
maintenance_middleware = ",maintenance@file"
|
|
67
|
+
|
|
68
|
+
# On-demand scaling: attach the Sablier middleware when opted in via the manifest
|
|
69
|
+
sablier_middleware, sablier_group, sablier_enabled = _sablier_middleware_suffix(manifest)
|
|
70
|
+
|
|
71
|
+
labels = """ - "{traefik_enable_label}"
|
|
72
|
+
- 'traefik.http.routers.{res_name}.rule={frontend_route_rule}'
|
|
73
|
+
- "traefik.http.routers.{res_name}.entrypoints={frontend_entrypoints}"
|
|
74
|
+
- "traefik.http.routers.{res_name}.priority={router_priority}"
|
|
75
|
+
- "traefik.http.routers.{res_name}.middlewares={middleware_name}{maintenance_middleware}{sablier_middleware}"
|
|
76
|
+
- "traefik.http.middlewares.{middleware_name}.stripprefix.prefixes={base_path}"
|
|
77
|
+
- "traefik.http.services.{res_name}.loadbalancer.server.port={port}"
|
|
78
|
+
- "traefik.docker.network={traefik_network}\"""".format(
|
|
79
|
+
res_name=res_name,
|
|
80
|
+
traefik_enable_label=TRAEFIK_ENABLE_LABEL,
|
|
81
|
+
frontend_route_rule=frontend_route_rule,
|
|
82
|
+
frontend_entrypoints=frontend_entrypoints,
|
|
83
|
+
middleware_name=middleware_name,
|
|
84
|
+
base_path=base_path,
|
|
85
|
+
port=port,
|
|
86
|
+
router_priority=router_priority,
|
|
87
|
+
traefik_network=TRAEFIK_DOCKER_NETWORK,
|
|
88
|
+
maintenance_middleware=maintenance_middleware,
|
|
89
|
+
sablier_middleware=sablier_middleware,
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
if sablier_enabled:
|
|
93
|
+
labels += _sablier_container_labels(sablier_group, " ")
|
|
94
|
+
|
|
95
|
+
return labels
|
|
96
|
+
|
|
97
|
+
def get_backend_traefik_labels(
|
|
98
|
+
resource_entry_name,
|
|
99
|
+
traefik_host,
|
|
100
|
+
traefik_path,
|
|
101
|
+
traefik_resource_name,
|
|
102
|
+
internal_port,
|
|
103
|
+
health_path,
|
|
104
|
+
manifest=None,
|
|
105
|
+
):
|
|
106
|
+
"""Generate Traefik labels for backend services with enhanced health checks."""
|
|
107
|
+
backend_route_rule = backend_rule(traefik_host, traefik_path)
|
|
108
|
+
backend_entrypoints = build_entrypoints(
|
|
109
|
+
TRAEFIK_BACKEND_ENABLE_HTTP,
|
|
110
|
+
TRAEFIK_BACKEND_ENABLE_HTTPS,
|
|
111
|
+
)
|
|
112
|
+
middleware_name = resource_entry_name + TRAEFIK_MIDDLEWARE_SUFFIX
|
|
113
|
+
|
|
114
|
+
# Check if maintenance feature is enabled
|
|
115
|
+
features = manifest.get('features', []) if manifest else []
|
|
116
|
+
maintenance_middleware = ""
|
|
117
|
+
if 'maintenance' in features:
|
|
118
|
+
maintenance_middleware = ",maintenance@file"
|
|
119
|
+
|
|
120
|
+
# On-demand scaling: attach the Sablier middleware when opted in via the manifest
|
|
121
|
+
sablier_middleware, sablier_group, sablier_enabled = _sablier_middleware_suffix(manifest)
|
|
122
|
+
|
|
123
|
+
# Build middleware config only if traefik_path is not empty
|
|
124
|
+
if traefik_path:
|
|
125
|
+
middleware_config_lines = [
|
|
126
|
+
' - "traefik.http.routers.' + resource_entry_name + '.middlewares=' + middleware_name + maintenance_middleware + sablier_middleware + '"',
|
|
127
|
+
' - "traefik.http.middlewares.' + middleware_name + '.stripprefix.prefixes=' + traefik_path + '"',
|
|
128
|
+
]
|
|
129
|
+
middleware_config = "\n".join(middleware_config_lines)
|
|
130
|
+
elif sablier_middleware:
|
|
131
|
+
# No strip-prefix path, but still front the router with the Sablier middleware
|
|
132
|
+
middleware_config = ' - "traefik.http.routers.' + resource_entry_name + '.middlewares=' + sablier_middleware.lstrip(",") + '"'
|
|
133
|
+
else:
|
|
134
|
+
# No middleware if path is empty - router has no middlewares
|
|
135
|
+
middleware_config = ""
|
|
136
|
+
|
|
137
|
+
labels = """ - "{traefik_enable_label}"
|
|
138
|
+
- "traefik.http.routers.{resource_entry_name}.rule={backend_route_rule}"
|
|
139
|
+
- "traefik.http.routers.{resource_entry_name}.entrypoints={backend_entrypoints}"
|
|
140
|
+
- "traefik.http.routers.{resource_entry_name}.service={traefik_resource_name}"
|
|
141
|
+
{middleware_config}
|
|
142
|
+
- "traefik.http.services.{traefik_resource_name}.loadbalancer.server.port={internal_port}"
|
|
143
|
+
- "traefik.http.services.{traefik_resource_name}.loadbalancer.healthcheck.path={health_path}"
|
|
144
|
+
- "traefik.http.services.{traefik_resource_name}.loadbalancer.healthcheck.interval={health_interval}"
|
|
145
|
+
- "traefik.http.services.{traefik_resource_name}.loadbalancer.healthcheck.timeout={health_timeout}"
|
|
146
|
+
- "traefik.http.services.{traefik_resource_name}.loadbalancer.healthcheck.followredirects=false"
|
|
147
|
+
- "traefik.docker.network={traefik_network}"
|
|
148
|
+
""".format(
|
|
149
|
+
resource_entry_name=resource_entry_name,
|
|
150
|
+
traefik_enable_label=TRAEFIK_ENABLE_LABEL,
|
|
151
|
+
backend_route_rule=backend_route_rule,
|
|
152
|
+
backend_entrypoints=backend_entrypoints,
|
|
153
|
+
traefik_resource_name=traefik_resource_name,
|
|
154
|
+
middleware_config=middleware_config,
|
|
155
|
+
internal_port=internal_port,
|
|
156
|
+
health_path=health_path,
|
|
157
|
+
health_interval=TRAEFIK_HEALTHCHECK_INTERVAL,
|
|
158
|
+
health_timeout=TRAEFIK_HEALTHCHECK_TIMEOUT,
|
|
159
|
+
traefik_network=TRAEFIK_DOCKER_NETWORK,
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
# Emit Sablier discovery labels so the Sablier container can wake/stop this workload
|
|
163
|
+
if sablier_enabled:
|
|
164
|
+
labels += _sablier_container_labels(sablier_group, " ")
|
|
165
|
+
|
|
166
|
+
# Generate project localhost routing to match `tdk up` URLs:
|
|
167
|
+
# http://api.{project}.localhost/api/{resource-name}
|
|
168
|
+
if manifest:
|
|
169
|
+
stack = manifest.get("stack", "")
|
|
170
|
+
api_path = cli_api_path(resource_entry_name, manifest)
|
|
171
|
+
project_rule = project_backend_rule(manifest, resource_entry_name)
|
|
172
|
+
project_entrypoints = build_entrypoints(
|
|
173
|
+
TRAEFIK_BACKEND_ENABLE_HTTP,
|
|
174
|
+
TRAEFIK_BACKEND_ENABLE_HTTPS,
|
|
175
|
+
)
|
|
176
|
+
# Calculate priority based on path length (more specific = higher priority)
|
|
177
|
+
router_priority = TRAEFIK_FRONTEND_PRIORITY_BASE + len(api_path)
|
|
178
|
+
|
|
179
|
+
# Generate old path pattern for redirect (e.g., /{stack}-management/api/v1/)
|
|
180
|
+
old_path_pattern = "/{stack}-management/api/v1".format(stack=stack) if stack else ""
|
|
181
|
+
management_path = get_api_path(stack, manifest) if stack else ""
|
|
182
|
+
|
|
183
|
+
labels += """
|
|
184
|
+
- "traefik.http.routers.{resource_entry_name}-project.rule={project_rule}"
|
|
185
|
+
- "traefik.http.routers.{resource_entry_name}-project.entrypoints={project_entrypoints}"
|
|
186
|
+
- "traefik.http.routers.{resource_entry_name}-project.service={traefik_resource_name}"
|
|
187
|
+
- "traefik.http.routers.{resource_entry_name}-project.middlewares={middleware_name}-project{maintenance_middleware}{sablier_middleware}"
|
|
188
|
+
- "traefik.http.middlewares.{middleware_name}-project.stripprefix.prefixes={api_path}"
|
|
189
|
+
- "traefik.http.routers.{resource_entry_name}-project.priority={router_priority}"
|
|
190
|
+
""".format(
|
|
191
|
+
resource_entry_name=resource_entry_name,
|
|
192
|
+
traefik_resource_name=traefik_resource_name,
|
|
193
|
+
project_rule=project_rule,
|
|
194
|
+
project_entrypoints=project_entrypoints,
|
|
195
|
+
middleware_name=middleware_name,
|
|
196
|
+
maintenance_middleware=maintenance_middleware,
|
|
197
|
+
sablier_middleware=sablier_middleware,
|
|
198
|
+
api_path=api_path,
|
|
199
|
+
router_priority=router_priority,
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
if management_path and management_path != api_path:
|
|
203
|
+
labels += """
|
|
204
|
+
- "traefik.http.routers.{resource_entry_name}-management.rule=Host(`{api_host}`) && PathPrefix(`{management_path}`)"
|
|
205
|
+
- "traefik.http.routers.{resource_entry_name}-management.entrypoints={project_entrypoints}"
|
|
206
|
+
- "traefik.http.routers.{resource_entry_name}-management.service={traefik_resource_name}"
|
|
207
|
+
- "traefik.http.routers.{resource_entry_name}-management.middlewares={middleware_name}-management"
|
|
208
|
+
- "traefik.http.middlewares.{middleware_name}-management.stripprefix.prefixes={management_path}"
|
|
209
|
+
- "traefik.http.routers.{resource_entry_name}-management.priority={mgmt_priority}"
|
|
210
|
+
""".format(
|
|
211
|
+
resource_entry_name=resource_entry_name,
|
|
212
|
+
traefik_resource_name=traefik_resource_name,
|
|
213
|
+
api_host=TRAEFIK_PROJECT_API_HOST,
|
|
214
|
+
management_path=management_path,
|
|
215
|
+
project_entrypoints=project_entrypoints,
|
|
216
|
+
middleware_name=middleware_name,
|
|
217
|
+
mgmt_priority=TRAEFIK_FRONTEND_PRIORITY_BASE + len(management_path),
|
|
218
|
+
)
|
|
219
|
+
|
|
220
|
+
if old_path_pattern:
|
|
221
|
+
labels += """
|
|
222
|
+
# Redirect middleware for URL restructuring: old path -> new path
|
|
223
|
+
- "traefik.http.middlewares.{resource_entry_name}-redirect.redirectregex.regex=^`{old_path_pattern}/(.*)`"
|
|
224
|
+
- "traefik.http.middlewares.{resource_entry_name}-redirect.redirectregex.replacement=`{api_path}/$$1`"
|
|
225
|
+
- "traefik.http.middlewares.{resource_entry_name}-redirect.redirectregex.permanent=true"
|
|
226
|
+
""".format(
|
|
227
|
+
resource_entry_name=resource_entry_name,
|
|
228
|
+
old_path_pattern=old_path_pattern,
|
|
229
|
+
api_path=api_path,
|
|
230
|
+
)
|
|
231
|
+
|
|
232
|
+
return labels
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
#!/usr/bin/env starlark
|
|
2
|
+
# =============================================================================
|
|
3
|
+
# 🐳 TILT SDK - TRAEFIK CONSTANTS
|
|
4
|
+
# =============================================================================
|
|
5
|
+
# STORY 4 FIX: API Gateway 504 Error Prevention
|
|
6
|
+
# - Startup grace period: 30s (allows services to fully initialize)
|
|
7
|
+
# - Extended timeouts for cold-start services
|
|
8
|
+
# - Proper health check sequencing
|
|
9
|
+
# =============================================================================
|
|
10
|
+
|
|
11
|
+
# === INLINED CONSTANTS for pure extension loading ===
|
|
12
|
+
TRAEFIK_CONFIG = {
|
|
13
|
+
"entrypoint": "web",
|
|
14
|
+
"web_entrypoint": "web",
|
|
15
|
+
"network": "traefik-public",
|
|
16
|
+
"default_host": "localhost",
|
|
17
|
+
"default_port": 8080,
|
|
18
|
+
"tls_enabled": False,
|
|
19
|
+
"entrypoints": ["web"],
|
|
20
|
+
"middlewares": [],
|
|
21
|
+
"tls": {"enabled": False},
|
|
22
|
+
"healthcheck_path": "/health",
|
|
23
|
+
"healthcheck_interval": "10s",
|
|
24
|
+
"healthcheck_timeout": "5s",
|
|
25
|
+
"frontend_priority_base": 100,
|
|
26
|
+
"websecure_entrypoint": "websecure",
|
|
27
|
+
"enable_strip_prefix": True,
|
|
28
|
+
"localhost_suffix": ".localhost",
|
|
29
|
+
"healthcheck_retries": 3,
|
|
30
|
+
"resource_startup_delay": "30s",
|
|
31
|
+
"startup_grace_period": "30s",
|
|
32
|
+
"response_timeout": "30s",
|
|
33
|
+
"connection_timeout": "10s",
|
|
34
|
+
"retry_attempts": 3,
|
|
35
|
+
"circuit_breaker_threshold": 5,
|
|
36
|
+
"strip_prefix_middleware_suffix": "-strip-prefix",
|
|
37
|
+
"retry_initial_interval": "1s",
|
|
38
|
+
"retry_max_interval": "10s",
|
|
39
|
+
"rate_limit_requests": 100,
|
|
40
|
+
"rate_limit_period": "1m",
|
|
41
|
+
"buffer_request_body": True,
|
|
42
|
+
"forward_auth_url": "",
|
|
43
|
+
"api_base_path": "/api",
|
|
44
|
+
"api_version": "v1"
|
|
45
|
+
}
|
|
46
|
+
DEFAULTS = {}
|
|
47
|
+
|
|
48
|
+
# === END INLINED CONSTANTS ===
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
load("../constants.star", "PlatformDockerConstants")
|
|
52
|
+
# =============================================================================
|
|
53
|
+
# MASTER CONFIG IMPORTS - Use centralized configuration
|
|
54
|
+
# =============================================================================
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
# =============================================================================
|
|
58
|
+
# API PATH CONSTANTS - Import for dynamic API path generation
|
|
59
|
+
# =============================================================================
|
|
60
|
+
load("./api_path_constants.star",
|
|
61
|
+
"get_api_path_for_domain",
|
|
62
|
+
"get_api_path_for_service",
|
|
63
|
+
"build_traefik_url",
|
|
64
|
+
"build_health_endpoint")
|
|
65
|
+
|
|
66
|
+
TRAEFIK_ENABLE_LABEL = "traefik.enable=true"
|
|
67
|
+
TRAEFIK_DOCKER_NETWORK = PlatformDockerConstants.NETWORK_TRAEFIK_PUBLIC
|
|
68
|
+
|
|
69
|
+
# Entrypoints from master config
|
|
70
|
+
TRAEFIK_WEBSECURE_ENTRYPOINT = TRAEFIK_CONFIG["websecure_entrypoint"]
|
|
71
|
+
|
|
72
|
+
TRAEFIK_FRONTEND_ENABLE_HTTP = True
|
|
73
|
+
TRAEFIK_FRONTEND_ENABLE_HTTPS = True
|
|
74
|
+
TRAEFIK_BACKEND_ENABLE_HTTP = True
|
|
75
|
+
TRAEFIK_BACKEND_ENABLE_HTTPS = False
|
|
76
|
+
|
|
77
|
+
# Middleware settings from master config
|
|
78
|
+
TRAEFIK_ENABLE_STRIP_PREFIX_MIDDLEWARE = TRAEFIK_CONFIG["enable_strip_prefix"]
|
|
79
|
+
TRAEFIK_ENABLE_FRONTEND_HOST_RULE = True
|
|
80
|
+
TRAEFIK_ENABLE_FRONTEND_PATH_RULE = True
|
|
81
|
+
TRAEFIK_ENABLE_BACKEND_HOST_RULE = True
|
|
82
|
+
TRAEFIK_ENABLE_BACKEND_PATH_RULE = True
|
|
83
|
+
|
|
84
|
+
TRAEFIK_PROJECT_HOST = PlatformDockerConstants.LOCAL_DOMAIN
|
|
85
|
+
TRAEFIK_PROJECT_APP_HOST = PlatformDockerConstants.APP_LOCAL_DOMAIN
|
|
86
|
+
TRAEFIK_PROJECT_API_HOST = PlatformDockerConstants.API_LOCAL_DOMAIN
|
|
87
|
+
TRAEFIK_FRONTEND_LOCALHOST_SUFFIX = TRAEFIK_CONFIG["localhost_suffix"]
|
|
88
|
+
|
|
89
|
+
# Priority from master config
|
|
90
|
+
TRAEFIK_FRONTEND_PRIORITY_BASE = TRAEFIK_CONFIG["frontend_priority_base"]
|
|
91
|
+
|
|
92
|
+
# =============================================================================
|
|
93
|
+
# STORY 4 FIX: Health check configuration with 30-second grace period
|
|
94
|
+
# =============================================================================
|
|
95
|
+
# From TILT_RESOURCE_DEFAULTS.star - centralized configuration
|
|
96
|
+
# Health check configuration - optimized to prevent 504s on startup
|
|
97
|
+
TRAEFIK_HEALTHCHECK_RETRIES = TRAEFIK_CONFIG["healthcheck_retries"]
|
|
98
|
+
|
|
99
|
+
# STORY 4 FIX: 30-second grace period (matches issue requirement)
|
|
100
|
+
TRAEFIK_RESOURCE_STARTUP_DELAY = TRAEFIK_CONFIG["resource_startup_delay"]
|
|
101
|
+
TRAEFIK_HEALTHY_THRESHOLD = TRAEFIK_CONFIG["retry_attempts"]
|
|
102
|
+
TRAEFIK_MIDDLEWARE_SUFFIX = TRAEFIK_CONFIG["strip_prefix_middleware_suffix"]
|
|
103
|
+
|
|
104
|
+
# =============================================================================
|
|
105
|
+
# API ROUTING PATHS - Dynamic from Manifests
|
|
106
|
+
# =============================================================================
|
|
107
|
+
# API paths are generated dynamically from manifest domain and appName fields
|
|
108
|
+
# No hardcoded service names - all from service.json
|
|
109
|
+
# =============================================================================
|
|
110
|
+
|
|
111
|
+
# Planner service paths are generated dynamically from manifests
|
|
112
|
+
# Use get_api_path_for_domain() function instead of hardcoded constants
|
|
113
|
+
|
|
114
|
+
# API paths are now generated dynamically - no hardcoded constants
|
|
115
|
+
# Use get_api_path_for_domain() function instead
|
|
116
|
+
|
|
117
|
+
# =============================================================================
|
|
118
|
+
# API ROUTING PATTERN
|
|
119
|
+
# =============================================================================
|
|
120
|
+
# Standard API path pattern generated from manifest: /api/v1/{appName}
|
|
121
|
+
# Domain comes from service manifest, allowing dynamic service discovery
|
|
122
|
+
# No hardcoded examples - all paths from service.json
|
|
123
|
+
# =============================================================================
|
|
124
|
+
# TRAEFIK_API_VERSION and TRAEFIK_API_BASE_PATH now imported from master config
|
|
125
|
+
|
|
126
|
+
# =============================================================================
|
|
127
|
+
# STORY 4 FIX: Retry middleware configuration for transient failures
|
|
128
|
+
# =============================================================================
|
|
129
|
+
TRAEFIK_RETRY_ATTEMPTS = TRAEFIK_CONFIG["retry_attempts"]
|
|
130
|
+
TRAEFIK_RETRY_INITIAL_INTERVAL = TRAEFIK_CONFIG["retry_initial_interval"]
|
|
131
|
+
|
|
132
|
+
# =============================================================================
|
|
133
|
+
# MASTER CONFIG RE-EXPORTS
|
|
134
|
+
# =============================================================================
|
|
135
|
+
# Re-export all values imported from master config so other files can load them
|
|
136
|
+
# from this module. This maintains backward compatibility.
|
|
137
|
+
|
|
138
|
+
# Define traefik constants from master config (available for other files to load)
|
|
139
|
+
TRAEFIK_WEB_ENTRYPOINT = TRAEFIK_CONFIG["web_entrypoint"]
|
|
140
|
+
TRAEFIK_WEBSECURE_ENTRYPOINT = TRAEFIK_CONFIG["websecure_entrypoint"]
|
|
141
|
+
TRAEFIK_HEALTHCHECK_INTERVAL = TRAEFIK_CONFIG["healthcheck_interval"]
|
|
142
|
+
TRAEFIK_HEALTHCHECK_TIMEOUT = TRAEFIK_CONFIG["healthcheck_timeout"]
|
|
143
|
+
TRAEFIK_HEALTHCHECK_RETRIES = TRAEFIK_CONFIG["healthcheck_retries"]
|
|
144
|
+
TRAEFIK_STARTUP_GRACE_PERIOD = TRAEFIK_CONFIG["startup_grace_period"]
|
|
145
|
+
TRAEFIK_API_BASE_PATH = TRAEFIK_CONFIG["api_base_path"]
|
|
146
|
+
TRAEFIK_API_VERSION = TRAEFIK_CONFIG["api_version"]
|