typekro 0.33.10 → 0.35.0
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/dist/.tsbuildinfo +1 -1
- package/dist/alchemy/clickhouse-schema/executor.d.ts +25 -0
- package/dist/alchemy/clickhouse-schema/executor.d.ts.map +1 -0
- package/dist/alchemy/clickhouse-schema/executor.js +144 -0
- package/dist/alchemy/clickhouse-schema/executor.js.map +1 -0
- package/dist/alchemy/clickhouse-schema/index.d.ts +12 -0
- package/dist/alchemy/clickhouse-schema/index.d.ts.map +1 -0
- package/dist/alchemy/clickhouse-schema/index.js +11 -0
- package/dist/alchemy/clickhouse-schema/index.js.map +1 -0
- package/dist/alchemy/clickhouse-schema/resource.d.ts +54 -0
- package/dist/alchemy/clickhouse-schema/resource.d.ts.map +1 -0
- package/dist/alchemy/clickhouse-schema/resource.js +158 -0
- package/dist/alchemy/clickhouse-schema/resource.js.map +1 -0
- package/dist/alchemy/clickhouse-schema/runner.d.ts +154 -0
- package/dist/alchemy/clickhouse-schema/runner.d.ts.map +1 -0
- package/dist/alchemy/clickhouse-schema/runner.js +613 -0
- package/dist/alchemy/clickhouse-schema/runner.js.map +1 -0
- package/dist/alchemy/clickhouse-schema/sql.d.ts +109 -0
- package/dist/alchemy/clickhouse-schema/sql.d.ts.map +1 -0
- package/dist/alchemy/clickhouse-schema/sql.js +368 -0
- package/dist/alchemy/clickhouse-schema/sql.js.map +1 -0
- package/dist/alchemy/clickhouse-schema/types.d.ts +394 -0
- package/dist/alchemy/clickhouse-schema/types.d.ts.map +1 -0
- package/dist/alchemy/clickhouse-schema/types.js +370 -0
- package/dist/alchemy/clickhouse-schema/types.js.map +1 -0
- package/dist/alchemy/index.d.ts +1 -0
- package/dist/alchemy/index.d.ts.map +1 -1
- package/dist/alchemy/index.js +2 -0
- package/dist/alchemy/index.js.map +1 -1
- package/dist/compositions/typekro-runtime/typekro-runtime.d.ts +0 -33
- package/dist/compositions/typekro-runtime/typekro-runtime.d.ts.map +1 -1
- package/dist/compositions/typekro-runtime/typekro-runtime.js +63 -1
- package/dist/compositions/typekro-runtime/typekro-runtime.js.map +1 -1
- package/dist/compositions/typekro-runtime/types.d.ts +8 -0
- package/dist/compositions/typekro-runtime/types.d.ts.map +1 -1
- package/dist/compositions/typekro-runtime/types.js +1 -0
- package/dist/compositions/typekro-runtime/types.js.map +1 -1
- package/dist/core/aspects/values-merge.d.ts +17 -0
- package/dist/core/aspects/values-merge.d.ts.map +1 -1
- package/dist/core/aspects/values-merge.js +67 -8
- package/dist/core/aspects/values-merge.js.map +1 -1
- package/dist/core/deployment/direct-factory.d.ts +9 -0
- package/dist/core/deployment/direct-factory.d.ts.map +1 -1
- package/dist/core/deployment/direct-factory.js +37 -3
- package/dist/core/deployment/direct-factory.js.map +1 -1
- package/dist/core/deployment/engine.d.ts +34 -0
- package/dist/core/deployment/engine.d.ts.map +1 -1
- package/dist/core/deployment/engine.js +173 -29
- package/dist/core/deployment/engine.js.map +1 -1
- package/dist/core/deployment/index.d.ts +2 -0
- package/dist/core/deployment/index.d.ts.map +1 -1
- package/dist/core/deployment/index.js +1 -0
- package/dist/core/deployment/index.js.map +1 -1
- package/dist/core/deployment/k8s-helpers.d.ts +73 -0
- package/dist/core/deployment/k8s-helpers.d.ts.map +1 -1
- package/dist/core/deployment/k8s-helpers.js +198 -4
- package/dist/core/deployment/k8s-helpers.js.map +1 -1
- package/dist/core/deployment/kro-factory.d.ts.map +1 -1
- package/dist/core/deployment/kro-factory.js +21 -1
- package/dist/core/deployment/kro-factory.js.map +1 -1
- package/dist/core/deployment/status-leaf-resolution.d.ts +101 -0
- package/dist/core/deployment/status-leaf-resolution.d.ts.map +1 -0
- package/dist/core/deployment/status-leaf-resolution.js +232 -0
- package/dist/core/deployment/status-leaf-resolution.js.map +1 -0
- package/dist/core/deployment/strategies/base-strategy.d.ts.map +1 -1
- package/dist/core/deployment/strategies/base-strategy.js +31 -3
- package/dist/core/deployment/strategies/base-strategy.js.map +1 -1
- package/dist/core/deployment/strategies/kro-strategy.d.ts.map +1 -1
- package/dist/core/deployment/strategies/kro-strategy.js +8 -1
- package/dist/core/deployment/strategies/kro-strategy.js.map +1 -1
- package/dist/core/kro/index.d.ts +6 -0
- package/dist/core/kro/index.d.ts.map +1 -0
- package/dist/core/kro/index.js +6 -0
- package/dist/core/kro/index.js.map +1 -0
- package/dist/core/kro/label-guard-capability.d.ts +141 -0
- package/dist/core/kro/label-guard-capability.d.ts.map +1 -0
- package/dist/core/kro/label-guard-capability.js +257 -0
- package/dist/core/kro/label-guard-capability.js.map +1 -0
- package/dist/core/kro/labels.d.ts +56 -0
- package/dist/core/kro/labels.d.ts.map +1 -0
- package/dist/core/kro/labels.js +62 -0
- package/dist/core/kro/labels.js.map +1 -0
- package/dist/core/kubernetes/api-capability.d.ts +196 -0
- package/dist/core/kubernetes/api-capability.d.ts.map +1 -0
- package/dist/core/kubernetes/api-capability.js +301 -0
- package/dist/core/kubernetes/api-capability.js.map +1 -0
- package/dist/core/kubernetes/index.d.ts +2 -0
- package/dist/core/kubernetes/index.d.ts.map +1 -1
- package/dist/core/kubernetes/index.js +2 -0
- package/dist/core/kubernetes/index.js.map +1 -1
- package/dist/core/kubernetes/naming.d.ts +100 -0
- package/dist/core/kubernetes/naming.d.ts.map +1 -0
- package/dist/core/kubernetes/naming.js +93 -0
- package/dist/core/kubernetes/naming.js.map +1 -0
- package/dist/core/planning/direct-runtime-adapter.d.ts.map +1 -1
- package/dist/core/planning/direct-runtime-adapter.js +54 -17
- package/dist/core/planning/direct-runtime-adapter.js.map +1 -1
- package/dist/core/planning/planner.d.ts.map +1 -1
- package/dist/core/planning/planner.js +17 -0
- package/dist/core/planning/planner.js.map +1 -1
- package/dist/core/planning/schema.d.ts.map +1 -1
- package/dist/core/planning/schema.js +7 -3
- package/dist/core/planning/schema.js.map +1 -1
- package/dist/core/references/cel-lexical-scanner.d.ts +100 -1
- package/dist/core/references/cel-lexical-scanner.d.ts.map +1 -1
- package/dist/core/references/cel-lexical-scanner.js +196 -2
- package/dist/core/references/cel-lexical-scanner.js.map +1 -1
- package/dist/core/references/cel.d.ts +249 -1
- package/dist/core/references/cel.d.ts.map +1 -1
- package/dist/core/references/cel.js +289 -8
- package/dist/core/references/cel.js.map +1 -1
- package/dist/core/serialization/arktype-ast.d.ts +21 -0
- package/dist/core/serialization/arktype-ast.d.ts.map +1 -0
- package/dist/core/serialization/arktype-ast.js +29 -0
- package/dist/core/serialization/arktype-ast.js.map +1 -0
- package/dist/core/serialization/cel-references.d.ts +133 -32
- package/dist/core/serialization/cel-references.d.ts.map +1 -1
- package/dist/core/serialization/cel-references.js +908 -109
- package/dist/core/serialization/cel-references.js.map +1 -1
- package/dist/core/serialization/schema.d.ts +16 -2
- package/dist/core/serialization/schema.d.ts.map +1 -1
- package/dist/core/serialization/schema.js +113 -21
- package/dist/core/serialization/schema.js.map +1 -1
- package/dist/core/types/composable.d.ts +7 -1
- package/dist/core/types/composable.d.ts.map +1 -1
- package/dist/core/types/deployment.d.ts +32 -2
- package/dist/core/types/deployment.d.ts.map +1 -1
- package/dist/core/types/serialization.d.ts +37 -0
- package/dist/core/types/serialization.d.ts.map +1 -1
- package/dist/core/validation/cel-dialect.d.ts +246 -0
- package/dist/core/validation/cel-dialect.d.ts.map +1 -0
- package/dist/core/validation/cel-dialect.js +1997 -0
- package/dist/core/validation/cel-dialect.js.map +1 -0
- package/dist/core/validation/cel-validator.d.ts.map +1 -1
- package/dist/core/validation/cel-validator.js +8 -1
- package/dist/core/validation/cel-validator.js.map +1 -1
- package/dist/core/validation/literal-status.d.ts +107 -0
- package/dist/core/validation/literal-status.d.ts.map +1 -0
- package/dist/core/validation/literal-status.js +346 -0
- package/dist/core/validation/literal-status.js.map +1 -0
- package/dist/core/validation/structural-spec-dependence.d.ts +179 -0
- package/dist/core/validation/structural-spec-dependence.d.ts.map +1 -0
- package/dist/core/validation/structural-spec-dependence.js +911 -0
- package/dist/core/validation/structural-spec-dependence.js.map +1 -0
- package/dist/factories/apisix/compositions/apisix-bootstrap.d.ts.map +1 -1
- package/dist/factories/apisix/compositions/apisix-bootstrap.js +9 -0
- package/dist/factories/apisix/compositions/apisix-bootstrap.js.map +1 -1
- package/dist/factories/clickhouse/compositions/clickhouse-cluster.d.ts +6 -0
- package/dist/factories/clickhouse/compositions/clickhouse-cluster.d.ts.map +1 -1
- package/dist/factories/clickhouse/compositions/clickhouse-cluster.js +273 -23
- package/dist/factories/clickhouse/compositions/clickhouse-cluster.js.map +1 -1
- package/dist/factories/clickhouse/resources/index.d.ts +1 -0
- package/dist/factories/clickhouse/resources/index.d.ts.map +1 -1
- package/dist/factories/clickhouse/resources/index.js +1 -0
- package/dist/factories/clickhouse/resources/index.js.map +1 -1
- package/dist/factories/clickhouse/resources/installation.d.ts.map +1 -1
- package/dist/factories/clickhouse/resources/installation.js +31 -4
- package/dist/factories/clickhouse/resources/installation.js.map +1 -1
- package/dist/factories/clickhouse/resources/s3-backup.d.ts +215 -0
- package/dist/factories/clickhouse/resources/s3-backup.d.ts.map +1 -0
- package/dist/factories/clickhouse/resources/s3-backup.js +410 -0
- package/dist/factories/clickhouse/resources/s3-backup.js.map +1 -0
- package/dist/factories/clickhouse/types.d.ts +416 -20
- package/dist/factories/clickhouse/types.d.ts.map +1 -1
- package/dist/factories/clickhouse/types.js +235 -11
- package/dist/factories/clickhouse/types.js.map +1 -1
- package/dist/factories/clickhouse/utils/helm-values-mapper.d.ts +42 -0
- package/dist/factories/clickhouse/utils/helm-values-mapper.d.ts.map +1 -1
- package/dist/factories/clickhouse/utils/helm-values-mapper.js +48 -0
- package/dist/factories/clickhouse/utils/helm-values-mapper.js.map +1 -1
- package/dist/factories/clickhouse/utils/index.d.ts +2 -0
- package/dist/factories/clickhouse/utils/index.d.ts.map +1 -1
- package/dist/factories/clickhouse/utils/index.js +2 -0
- package/dist/factories/clickhouse/utils/index.js.map +1 -1
- package/dist/factories/clickhouse/utils/s3-storage.d.ts +503 -0
- package/dist/factories/clickhouse/utils/s3-storage.d.ts.map +1 -0
- package/dist/factories/clickhouse/utils/s3-storage.js +1139 -0
- package/dist/factories/clickhouse/utils/s3-storage.js.map +1 -0
- package/dist/factories/clickhouse/utils/validation.d.ts +103 -0
- package/dist/factories/clickhouse/utils/validation.d.ts.map +1 -1
- package/dist/factories/clickhouse/utils/validation.js +129 -0
- package/dist/factories/clickhouse/utils/validation.js.map +1 -1
- package/dist/factories/clickhouse/utils/xml.d.ts +87 -0
- package/dist/factories/clickhouse/utils/xml.d.ts.map +1 -0
- package/dist/factories/clickhouse/utils/xml.js +151 -0
- package/dist/factories/clickhouse/utils/xml.js.map +1 -0
- package/dist/factories/clickstack/compositions/clickstack-bootstrap.d.ts +57 -0
- package/dist/factories/clickstack/compositions/clickstack-bootstrap.d.ts.map +1 -1
- package/dist/factories/clickstack/compositions/clickstack-bootstrap.js +266 -7
- package/dist/factories/clickstack/compositions/clickstack-bootstrap.js.map +1 -1
- package/dist/factories/clickstack/types.d.ts +205 -26
- package/dist/factories/clickstack/types.d.ts.map +1 -1
- package/dist/factories/clickstack/types.js +106 -8
- package/dist/factories/clickstack/types.js.map +1 -1
- package/dist/factories/clickstack/utils/collector-config.d.ts +104 -0
- package/dist/factories/clickstack/utils/collector-config.d.ts.map +1 -0
- package/dist/factories/clickstack/utils/collector-config.js +266 -0
- package/dist/factories/clickstack/utils/collector-config.js.map +1 -0
- package/dist/factories/clickstack/utils/helm-values-mapper.d.ts +26 -0
- package/dist/factories/clickstack/utils/helm-values-mapper.d.ts.map +1 -1
- package/dist/factories/clickstack/utils/helm-values-mapper.js +53 -12
- package/dist/factories/clickstack/utils/helm-values-mapper.js.map +1 -1
- package/dist/factories/clickstack/utils/index.d.ts +2 -0
- package/dist/factories/clickstack/utils/index.d.ts.map +1 -1
- package/dist/factories/clickstack/utils/index.js +2 -0
- package/dist/factories/clickstack/utils/index.js.map +1 -1
- package/dist/factories/clickstack/utils/storage.d.ts +449 -0
- package/dist/factories/clickstack/utils/storage.d.ts.map +1 -0
- package/dist/factories/clickstack/utils/storage.js +698 -0
- package/dist/factories/clickstack/utils/storage.js.map +1 -0
- package/dist/factories/cnpg/resources/helm.d.ts.map +1 -1
- package/dist/factories/cnpg/resources/helm.js +4 -4
- package/dist/factories/cnpg/resources/helm.js.map +1 -1
- package/dist/factories/cnpg/types.d.ts +10 -1
- package/dist/factories/cnpg/types.d.ts.map +1 -1
- package/dist/factories/cnpg/types.js.map +1 -1
- package/dist/factories/cnpg/utils/helm-values-mapper.d.ts +19 -2
- package/dist/factories/cnpg/utils/helm-values-mapper.d.ts.map +1 -1
- package/dist/factories/cnpg/utils/helm-values-mapper.js +22 -4
- package/dist/factories/cnpg/utils/helm-values-mapper.js.map +1 -1
- package/dist/factories/envoy-ai-gateway/compositions/gateway.d.ts.map +1 -1
- package/dist/factories/envoy-ai-gateway/compositions/gateway.js +16 -3
- package/dist/factories/envoy-ai-gateway/compositions/gateway.js.map +1 -1
- package/dist/factories/envoy-ai-gateway/constants.d.ts +5 -2
- package/dist/factories/envoy-ai-gateway/constants.d.ts.map +1 -1
- package/dist/factories/envoy-ai-gateway/constants.js +5 -2
- package/dist/factories/envoy-ai-gateway/constants.js.map +1 -1
- package/dist/factories/envoy-ai-gateway/resources/gateway.d.ts +12 -0
- package/dist/factories/envoy-ai-gateway/resources/gateway.d.ts.map +1 -1
- package/dist/factories/envoy-ai-gateway/resources/gateway.js +27 -104
- package/dist/factories/envoy-ai-gateway/resources/gateway.js.map +1 -1
- package/dist/factories/envoy-ai-gateway/types.d.ts +15 -47
- package/dist/factories/envoy-ai-gateway/types.d.ts.map +1 -1
- package/dist/factories/envoy-ai-gateway/types.js.map +1 -1
- package/dist/factories/gateway-api/constants.d.ts +27 -0
- package/dist/factories/gateway-api/constants.d.ts.map +1 -0
- package/dist/factories/gateway-api/constants.js +27 -0
- package/dist/factories/gateway-api/constants.js.map +1 -0
- package/dist/factories/gateway-api/index.d.ts +14 -0
- package/dist/factories/gateway-api/index.d.ts.map +1 -0
- package/dist/factories/gateway-api/index.js +14 -0
- package/dist/factories/gateway-api/index.js.map +1 -0
- package/dist/factories/gateway-api/readiness.d.ts +67 -0
- package/dist/factories/gateway-api/readiness.d.ts.map +1 -0
- package/dist/factories/gateway-api/readiness.js +213 -0
- package/dist/factories/gateway-api/readiness.js.map +1 -0
- package/dist/factories/gateway-api/resources/gateway.d.ts +91 -0
- package/dist/factories/gateway-api/resources/gateway.d.ts.map +1 -0
- package/dist/factories/gateway-api/resources/gateway.js +99 -0
- package/dist/factories/gateway-api/resources/gateway.js.map +1 -0
- package/dist/factories/gateway-api/resources/index.d.ts +2 -0
- package/dist/factories/gateway-api/resources/index.d.ts.map +1 -0
- package/dist/factories/gateway-api/resources/index.js +2 -0
- package/dist/factories/gateway-api/resources/index.js.map +1 -0
- package/dist/factories/gateway-api/types.d.ts +1269 -0
- package/dist/factories/gateway-api/types.d.ts.map +1 -0
- package/dist/factories/gateway-api/types.js +417 -0
- package/dist/factories/gateway-api/types.js.map +1 -0
- package/dist/factories/helm/readiness-evaluators.d.ts +21 -3
- package/dist/factories/helm/readiness-evaluators.d.ts.map +1 -1
- package/dist/factories/helm/readiness-evaluators.js +117 -11
- package/dist/factories/helm/readiness-evaluators.js.map +1 -1
- package/dist/factories/helm/types.d.ts +28 -0
- package/dist/factories/helm/types.d.ts.map +1 -1
- package/dist/factories/index.d.ts +2 -0
- package/dist/factories/index.d.ts.map +1 -1
- package/dist/factories/index.js +8 -0
- package/dist/factories/index.js.map +1 -1
- package/dist/factories/inngest/compositions/inngest-bootstrap.d.ts.map +1 -1
- package/dist/factories/inngest/compositions/inngest-bootstrap.js +10 -0
- package/dist/factories/inngest/compositions/inngest-bootstrap.js.map +1 -1
- package/dist/factories/kubernetes/admission/index.d.ts +2 -0
- package/dist/factories/kubernetes/admission/index.d.ts.map +1 -1
- package/dist/factories/kubernetes/admission/index.js +2 -0
- package/dist/factories/kubernetes/admission/index.js.map +1 -1
- package/dist/factories/kubernetes/admission/label-propagation-guard.d.ts +108 -0
- package/dist/factories/kubernetes/admission/label-propagation-guard.d.ts.map +1 -0
- package/dist/factories/kubernetes/admission/label-propagation-guard.js +247 -0
- package/dist/factories/kubernetes/admission/label-propagation-guard.js.map +1 -0
- package/dist/factories/kubernetes/admission/mutating-admission-policy.d.ts +286 -0
- package/dist/factories/kubernetes/admission/mutating-admission-policy.d.ts.map +1 -0
- package/dist/factories/kubernetes/admission/mutating-admission-policy.js +157 -0
- package/dist/factories/kubernetes/admission/mutating-admission-policy.js.map +1 -0
- package/dist/factories/opensearch/compositions/cluster.d.ts.map +1 -1
- package/dist/factories/opensearch/compositions/cluster.js +6 -1
- package/dist/factories/opensearch/compositions/cluster.js.map +1 -1
- package/dist/factories/ory/compositions/ory-identity-stack.d.ts +8 -8
- package/dist/factories/ory/types.d.ts +16 -16
- package/dist/factories/rook/compositions/object-storage-claim.d.ts +1 -1
- package/dist/factories/rook/compositions/rook-ceph-platform.js +8 -1
- package/dist/factories/rook/compositions/rook-ceph-platform.js.map +1 -1
- package/dist/factories/rook/types.d.ts +1 -1
- package/dist/factories/traefik/compositions/index.d.ts +6 -0
- package/dist/factories/traefik/compositions/index.d.ts.map +1 -0
- package/dist/factories/traefik/compositions/index.js +6 -0
- package/dist/factories/traefik/compositions/index.js.map +1 -0
- package/dist/factories/traefik/compositions/traefik-bootstrap.d.ts +185 -0
- package/dist/factories/traefik/compositions/traefik-bootstrap.d.ts.map +1 -0
- package/dist/factories/traefik/compositions/traefik-bootstrap.js +339 -0
- package/dist/factories/traefik/compositions/traefik-bootstrap.js.map +1 -0
- package/dist/factories/traefik/compositions/traefik-helm-repository.d.ts +16 -0
- package/dist/factories/traefik/compositions/traefik-helm-repository.d.ts.map +1 -0
- package/dist/factories/traefik/compositions/traefik-helm-repository.js +31 -0
- package/dist/factories/traefik/compositions/traefik-helm-repository.js.map +1 -0
- package/dist/factories/traefik/constants.d.ts +78 -0
- package/dist/factories/traefik/constants.d.ts.map +1 -0
- package/dist/factories/traefik/constants.js +104 -0
- package/dist/factories/traefik/constants.js.map +1 -0
- package/dist/factories/traefik/index.d.ts +25 -0
- package/dist/factories/traefik/index.d.ts.map +1 -0
- package/dist/factories/traefik/index.js +25 -0
- package/dist/factories/traefik/index.js.map +1 -0
- package/dist/factories/traefik/resources/common.d.ts +68 -0
- package/dist/factories/traefik/resources/common.d.ts.map +1 -0
- package/dist/factories/traefik/resources/common.js +59 -0
- package/dist/factories/traefik/resources/common.js.map +1 -0
- package/dist/factories/traefik/resources/gateway.d.ts +85 -0
- package/dist/factories/traefik/resources/gateway.d.ts.map +1 -0
- package/dist/factories/traefik/resources/gateway.js +109 -0
- package/dist/factories/traefik/resources/gateway.js.map +1 -0
- package/dist/factories/traefik/resources/helm.d.ts +56 -0
- package/dist/factories/traefik/resources/helm.d.ts.map +1 -0
- package/dist/factories/traefik/resources/helm.js +131 -0
- package/dist/factories/traefik/resources/helm.js.map +1 -0
- package/dist/factories/traefik/resources/index.d.ts +10 -0
- package/dist/factories/traefik/resources/index.d.ts.map +1 -0
- package/dist/factories/traefik/resources/index.js +10 -0
- package/dist/factories/traefik/resources/index.js.map +1 -0
- package/dist/factories/traefik/resources/middleware.d.ts +169 -0
- package/dist/factories/traefik/resources/middleware.d.ts.map +1 -0
- package/dist/factories/traefik/resources/middleware.js +225 -0
- package/dist/factories/traefik/resources/middleware.js.map +1 -0
- package/dist/factories/traefik/resources/routing.d.ts +113 -0
- package/dist/factories/traefik/resources/routing.d.ts.map +1 -0
- package/dist/factories/traefik/resources/routing.js +119 -0
- package/dist/factories/traefik/resources/routing.js.map +1 -0
- package/dist/factories/traefik/resources/tls.d.ts +85 -0
- package/dist/factories/traefik/resources/tls.d.ts.map +1 -0
- package/dist/factories/traefik/resources/tls.js +93 -0
- package/dist/factories/traefik/resources/tls.js.map +1 -0
- package/dist/factories/traefik/types.d.ts +2690 -0
- package/dist/factories/traefik/types.d.ts.map +1 -0
- package/dist/factories/traefik/types.js +1084 -0
- package/dist/factories/traefik/types.js.map +1 -0
- package/dist/factories/traefik/utils/helm-values-mapper.d.ts +198 -0
- package/dist/factories/traefik/utils/helm-values-mapper.d.ts.map +1 -0
- package/dist/factories/traefik/utils/helm-values-mapper.js +372 -0
- package/dist/factories/traefik/utils/helm-values-mapper.js.map +1 -0
- package/dist/factories/traefik/utils/index.d.ts +6 -0
- package/dist/factories/traefik/utils/index.d.ts.map +1 -0
- package/dist/factories/traefik/utils/index.js +6 -0
- package/dist/factories/traefik/utils/index.js.map +1 -0
- package/dist/factories/traefik/utils/middleware-validation.d.ts +42 -0
- package/dist/factories/traefik/utils/middleware-validation.d.ts.map +1 -0
- package/dist/factories/traefik/utils/middleware-validation.js +78 -0
- package/dist/factories/traefik/utils/middleware-validation.js.map +1 -0
- package/dist/factories/webapp/compositions/web-app-with-processing.d.ts.map +1 -1
- package/dist/factories/webapp/compositions/web-app-with-processing.js +10 -0
- package/dist/factories/webapp/compositions/web-app-with-processing.js.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/package.json +9 -1
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scheduled `BACKUP ... TO S3(...)` CronJob for an S3-backed ClickHouse.
|
|
3
|
+
*
|
|
4
|
+
* WHY this exists: with `storage.diskType: 's3'` the bucket holds the part
|
|
5
|
+
* DATA but the part METADATA lives on the node's local disk, so the bucket is
|
|
6
|
+
* not self-describing — losing the node loses the map to the objects. That
|
|
7
|
+
* makes durability a backup story, and an "S3-backed" cluster with no backup
|
|
8
|
+
* is a trap. This factory renders that backup explicitly rather than leaving
|
|
9
|
+
* it to a README.
|
|
10
|
+
*
|
|
11
|
+
* SHAPE OF THE JOB
|
|
12
|
+
* - A timestamped backup name (`%Y%m%d%H%M%S`) is generated per run, so each
|
|
13
|
+
* run is a separate, independently restorable backup under
|
|
14
|
+
* `s3://<bucket>/<prefix>/<timestamp>`.
|
|
15
|
+
* - The `BACKUP` statement carries NO credentials: it executes SERVER-side, and
|
|
16
|
+
* the server picks the destination credentials up from the `<s3>` section the
|
|
17
|
+
* storage compiler renders into `config.d/storage.xml` (matched by endpoint
|
|
18
|
+
* prefix). Keys therefore never reach the query text — and never reach
|
|
19
|
+
* `system.query_log`.
|
|
20
|
+
* - With `retention.days`, the backup runs as an initContainer and a prune
|
|
21
|
+
* container follows it, deleting expired timestamped prefixes. The prune step
|
|
22
|
+
* needs S3 `DeleteObject` on the backup prefix (see the IAM policy in the
|
|
23
|
+
* docs).
|
|
24
|
+
*
|
|
25
|
+
* SHARDED CLUSTERS — WHY `ON CLUSTER` IS NOT OPTIONAL
|
|
26
|
+
* A plain `BACKUP DATABASE db TO S3(...)` is executed by the ONE server the
|
|
27
|
+
* client happened to connect to, and that server only holds its own shard's
|
|
28
|
+
* parts. On a multi-shard cluster that silently produces a PARTIAL backup: it
|
|
29
|
+
* succeeds, it is restorable, and it is missing every other shard's data.
|
|
30
|
+
* ClickHouse's answer is `BACKUP ... ON CLUSTER '<cluster>' TO S3(...)`, which
|
|
31
|
+
* fans the statement out to every host of the cluster and coordinates them
|
|
32
|
+
* through [Zoo]Keeper so that all of them contribute to ONE backup at ONE
|
|
33
|
+
* destination path (the `backup_restore_keeper_*` settings in the BACKUP/
|
|
34
|
+
* RESTORE reference exist for exactly this coordination). No `{shard}` /
|
|
35
|
+
* `{replica}` macros belong in the destination: that convention produces N
|
|
36
|
+
* INDEPENDENT per-shard backups, which is a different (external-tool) design
|
|
37
|
+
* and would need N restore statements.
|
|
38
|
+
*
|
|
39
|
+
* Because the coordination is Keeper-based, `ON CLUSTER` is only rendered for
|
|
40
|
+
* topologies that actually have a Keeper — {@link makeClickHouseCluster}
|
|
41
|
+
* REJECTS a multi-shard/multi-replica topology with a backup schedule and no
|
|
42
|
+
* keeper at construction rather than emitting a statement that would back up
|
|
43
|
+
* one shard.
|
|
44
|
+
*
|
|
45
|
+
* RESTORE is deliberately NOT automated — restoring over a live database is a
|
|
46
|
+
* decision, not a schedule. The procedure is documented in
|
|
47
|
+
* `docs/api/clickhouse/index.md`; in short (matching the backup's own shape):
|
|
48
|
+
* `RESTORE DATABASE <db> [ON CLUSTER '<cluster>'] FROM S3('<endpoint>/<timestamp>')`.
|
|
49
|
+
*/
|
|
50
|
+
import { type } from 'arktype';
|
|
51
|
+
import { cronJob } from '../../kubernetes/workloads/cron-job.js';
|
|
52
|
+
import { assertClickHouseClusterName } from '../utils/validation.js';
|
|
53
|
+
import { ResolvedClickHouseS3StorageSchema, S3_ACCESS_KEY_ID_ENV, S3_SECRET_ACCESS_KEY_ENV, clickHouseS3ContainerEnv, clickHouseS3ServiceAccountName, } from '../utils/s3-storage.js';
|
|
54
|
+
/**
|
|
55
|
+
* What `storage` has to be, quoted into the ArkType error on a bad value.
|
|
56
|
+
*
|
|
57
|
+
* Re-exported from `utils/s3-storage.ts`, where it is attached to the `mode`
|
|
58
|
+
* discriminant of the resolved-storage schema; kept on this module's surface
|
|
59
|
+
* because that is where callers of the backup factory look for it.
|
|
60
|
+
*/
|
|
61
|
+
export { RESOLVED_S3_STORAGE_REQUIREMENT } from '../utils/s3-storage.js';
|
|
62
|
+
/** Image used for the prune step (the ClickHouse image has no AWS CLI). */
|
|
63
|
+
export const DEFAULT_S3_PRUNE_IMAGE = 'amazon/aws-cli:2.22.35';
|
|
64
|
+
/**
|
|
65
|
+
* The `storage` input: an already-RESOLVED S3 storage.
|
|
66
|
+
*
|
|
67
|
+
* It IS {@link ResolvedClickHouseS3StorageSchema} — the one description of a
|
|
68
|
+
* resolved S3 storage, which `resolveClickHouseStorage()` also asserts its own
|
|
69
|
+
* output against. There is deliberately no second, looser shape here: this
|
|
70
|
+
* factory field-selects `storage.backup.*`, `storage.bucket`, `storage.region`
|
|
71
|
+
* and `storage.auth` to build the CronJob, so the structure it reads has to be
|
|
72
|
+
* one that runtime validation ESTABLISHES rather than one a predicate claims.
|
|
73
|
+
*
|
|
74
|
+
* Re-exported under the old name so `ClickHouseS3BackupCronJobConfigSchema`
|
|
75
|
+
* reads as a schema of its own fields.
|
|
76
|
+
*/
|
|
77
|
+
export const ClickHouseS3BackupStorageSchema = ResolvedClickHouseS3StorageSchema;
|
|
78
|
+
/**
|
|
79
|
+
* ArkType schema for ClickHouseS3BackupCronJobConfig.
|
|
80
|
+
*
|
|
81
|
+
* Configuration for {@link clickHouseS3BackupCronJob}.
|
|
82
|
+
*/
|
|
83
|
+
export const ClickHouseS3BackupCronJobConfigSchema = type({
|
|
84
|
+
/** CHI name — anchors the CronJob name and the ClickHouse service host. */
|
|
85
|
+
name: 'string',
|
|
86
|
+
/** CHI namespace. */
|
|
87
|
+
namespace: 'string',
|
|
88
|
+
/** ClickHouse server version, used for the `clickhouse-client` image. */
|
|
89
|
+
version: 'string',
|
|
90
|
+
/** Resolved S3 storage (must carry a `backup` schedule). */
|
|
91
|
+
storage: ClickHouseS3BackupStorageSchema,
|
|
92
|
+
/** Native TCP port of the ClickHouse service. */
|
|
93
|
+
nativePort: 'number',
|
|
94
|
+
/**
|
|
95
|
+
* CHI cluster name, required when `onCluster` is set — it becomes the
|
|
96
|
+
* `ON CLUSTER '<name>'` target. Passed to the container as an env var rather
|
|
97
|
+
* than baked into the script text so a schema reference (the runtime
|
|
98
|
+
* `spec.clusterName`) survives serialization the way `database` does.
|
|
99
|
+
*/
|
|
100
|
+
'clusterName?': 'string',
|
|
101
|
+
/**
|
|
102
|
+
* Render `BACKUP ... ON CLUSTER` instead of a single-host statement.
|
|
103
|
+
*
|
|
104
|
+
* BUILD-TIME: true iff the topology has more than one shard or replica, or a
|
|
105
|
+
* Keeper is configured. See the module doc for why a single-host statement is
|
|
106
|
+
* a partial backup on a sharded cluster.
|
|
107
|
+
*/
|
|
108
|
+
'onCluster?': 'boolean',
|
|
109
|
+
/** Resource id for composition references. */
|
|
110
|
+
'id?': 'string',
|
|
111
|
+
});
|
|
112
|
+
/**
|
|
113
|
+
* Env var carrying the `ON CLUSTER` target into the backup container.
|
|
114
|
+
*
|
|
115
|
+
* `CLICKHOUSE_CLUSTER` is NOT a name `clickhouse-client` interprets, so it
|
|
116
|
+
* cannot collide with the client's own configuration.
|
|
117
|
+
*/
|
|
118
|
+
export const BACKUP_CLUSTER_ENV = 'CLICKHOUSE_CLUSTER';
|
|
119
|
+
/**
|
|
120
|
+
* Shell script for the backup step.
|
|
121
|
+
*
|
|
122
|
+
* `set -eu` plus an explicit `--query` exit code means a failed BACKUP fails
|
|
123
|
+
* the Job (and, with `retention`, skips the prune step) rather than reporting
|
|
124
|
+
* success on an empty backup.
|
|
125
|
+
*/
|
|
126
|
+
function backupScript(onCluster) {
|
|
127
|
+
// `ON CLUSTER '<name>'` fans the statement out to every host of the cluster
|
|
128
|
+
// and coordinates them into ONE backup through Keeper. Without it the
|
|
129
|
+
// connected host backs up only its own shard — see the module doc.
|
|
130
|
+
//
|
|
131
|
+
// The clause interpolates `$CLUSTER_SQL`, not the raw env var: see
|
|
132
|
+
// `clusterNameGuard()` for why the value is re-checked and re-escaped inside
|
|
133
|
+
// the container even though it is validated on the way in.
|
|
134
|
+
const onClusterClause = onCluster ? " ON CLUSTER '$CLUSTER_SQL'" : '';
|
|
135
|
+
return [
|
|
136
|
+
'set -eu',
|
|
137
|
+
...(onCluster ? clusterNameGuard() : []),
|
|
138
|
+
// DEFENCE IN DEPTH, mirroring `clusterNameGuard()`: the destination URL is
|
|
139
|
+
// composed and validated as a WHOLE at construction time (see
|
|
140
|
+
// `composeS3EndpointUrl` in `utils/s3-storage.ts`), and by that check it
|
|
141
|
+
// cannot contain a quote at all. But the value reaching this statement is an
|
|
142
|
+
// env var on a rendered CronJob, so the script escapes it the way
|
|
143
|
+
// ClickHouse escapes a quote in a string literal — doubling it — rather
|
|
144
|
+
// than trusting that the manifest was never edited. The pair's failure mode
|
|
145
|
+
// is a backup written to a nonsense path, never an injected statement; the
|
|
146
|
+
// construction-time validation is what makes the path correct, and this is
|
|
147
|
+
// only what keeps the LITERAL closed if that validation is ever weakened.
|
|
148
|
+
'ENDPOINT_SQL="$(printf \'%s\' "$BACKUP_ENDPOINT" | sed "s/\'/\'\'/g")"',
|
|
149
|
+
'NAME="$(date -u +%Y%m%d%H%M%S)"',
|
|
150
|
+
onCluster
|
|
151
|
+
? 'echo "Backing up database $CLICKHOUSE_DATABASE on cluster' +
|
|
152
|
+
` $${BACKUP_CLUSTER_ENV} to $BACKUP_ENDPOINT$NAME"`
|
|
153
|
+
: 'echo "Backing up database $CLICKHOUSE_DATABASE to $BACKUP_ENDPOINT$NAME"',
|
|
154
|
+
// The destination credentials come from the server's `<s3>` config section
|
|
155
|
+
// (rendered by the storage compiler and matched by endpoint prefix), so the
|
|
156
|
+
// statement itself carries none — nothing sensitive reaches query_log.
|
|
157
|
+
// The database name is validated as a bare SQL identifier at resolve time;
|
|
158
|
+
// the cluster name and the endpoint are checked and escaped above.
|
|
159
|
+
'clickhouse-client --host "$CLICKHOUSE_HOST" --port "$CLICKHOUSE_PORT"' +
|
|
160
|
+
' --user "$CLICKHOUSE_USER" --password "$CLICKHOUSE_PASSWORD"' +
|
|
161
|
+
` --query "BACKUP DATABASE $CLICKHOUSE_DATABASE${onClusterClause} TO` +
|
|
162
|
+
" S3('$ENDPOINT_SQL$NAME')\"",
|
|
163
|
+
'echo "Backup $NAME complete"',
|
|
164
|
+
].join('\n');
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Re-validate and escape the `ON CLUSTER` target inside the container.
|
|
168
|
+
*
|
|
169
|
+
* DEFENCE IN DEPTH, and the depth is real: the name is checked on the way in
|
|
170
|
+
* ({@link assertClickHouseClusterName}) only when it is a CONCRETE string, and
|
|
171
|
+
* carried into the RGD as a `pattern=` marker for the kro path — but the value
|
|
172
|
+
* that actually reaches this script is an environment variable, resolved by
|
|
173
|
+
* KRO at instance time and editable on the rendered CronJob afterwards. So the
|
|
174
|
+
* script asserts the same rule itself and REFUSES to run rather than issue a
|
|
175
|
+
* statement built from a name it does not recognise.
|
|
176
|
+
*
|
|
177
|
+
* The escape (doubling `'`, ClickHouse's own string-literal escape) is
|
|
178
|
+
* redundant after that check by construction. It is emitted anyway so the
|
|
179
|
+
* statement stays well-formed if the guard is ever relaxed — the failure mode
|
|
180
|
+
* of the pair is a refused backup, never an injected one.
|
|
181
|
+
*/
|
|
182
|
+
function clusterNameGuard() {
|
|
183
|
+
return [
|
|
184
|
+
`CLUSTER="$${BACKUP_CLUSTER_ENV}"`,
|
|
185
|
+
// POSIX `case` globs, matched against the WHOLE word: empty, any
|
|
186
|
+
// disallowed character (the `-` sits last in the bracket expression, where
|
|
187
|
+
// it is literal), a first character that is not a letter, or a trailing
|
|
188
|
+
// dash. Same rule as CLICKHOUSE_CLUSTER_NAME_PATTERN.
|
|
189
|
+
'case "$CLUSTER" in',
|
|
190
|
+
' "" | *[!A-Za-z0-9-]* | [!A-Za-z]* | *-)',
|
|
191
|
+
` echo "Refusing to back up: $${BACKUP_CLUSTER_ENV} is not a cluster identifier" >&2`,
|
|
192
|
+
' exit 1 ;;',
|
|
193
|
+
'esac',
|
|
194
|
+
// The Altinity CRD caps `clusters[].name` at 15 characters; a longer value
|
|
195
|
+
// cannot name a real cluster, so it is a bug or an edit, not a backup.
|
|
196
|
+
// biome-ignore lint/suspicious/noTemplateCurlyInString: POSIX shell string length
|
|
197
|
+
'if [ "${#CLUSTER}" -gt 15 ]; then',
|
|
198
|
+
` echo "Refusing to back up: $${BACKUP_CLUSTER_ENV} is longer than 15 characters" >&2`,
|
|
199
|
+
' exit 1',
|
|
200
|
+
'fi',
|
|
201
|
+
// ClickHouse escapes a quote inside a string literal by doubling it.
|
|
202
|
+
'CLUSTER_SQL="$(printf \'%s\' "$CLUSTER" | sed "s/\'/\'\'/g")"',
|
|
203
|
+
];
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Shell script for the retention prune step.
|
|
207
|
+
*
|
|
208
|
+
* Backup prefixes are pure-numeric timestamps, so expiry is a string
|
|
209
|
+
* comparison against a cutoff stamp — no date parsing of listing output, and
|
|
210
|
+
* anything that is not a timestamped backup directory is skipped rather than
|
|
211
|
+
* deleted.
|
|
212
|
+
*/
|
|
213
|
+
function pruneScript() {
|
|
214
|
+
return [
|
|
215
|
+
'set -eu',
|
|
216
|
+
'CUTOFF="$(date -u -d "-$RETENTION_DAYS days" +%Y%m%d%H%M%S)"',
|
|
217
|
+
'echo "Pruning backups older than $CUTOFF"',
|
|
218
|
+
// The braced form here is a POSIX default-value expansion (the variable is
|
|
219
|
+
// absent for real AWS), the one place braces are actually required.
|
|
220
|
+
// biome-ignore lint/suspicious/noTemplateCurlyInString: POSIX shell default value
|
|
221
|
+
'if [ -n "${AWS_ENDPOINT_URL:-}" ]; then ENDPOINT_ARGS="--endpoint-url $AWS_ENDPOINT_URL";',
|
|
222
|
+
'else ENDPOINT_ARGS=""; fi',
|
|
223
|
+
// ENDPOINT_ARGS must word-split into two arguments, so it stays unquoted.
|
|
224
|
+
'# shellcheck disable=SC2086',
|
|
225
|
+
'aws s3 ls "s3://$BACKUP_BUCKET/$BACKUP_PREFIX/" $ENDPOINT_ARGS |',
|
|
226
|
+
' awk \'$1 == "PRE" { print $2 }\' | tr -d "/" | while read -r NAME; do',
|
|
227
|
+
// Skip anything that is not a pure-numeric backup timestamp rather than
|
|
228
|
+
// deleting it — the bucket prefix may hold other objects.
|
|
229
|
+
' case "$NAME" in "" | *[!0-9]*) continue ;; esac',
|
|
230
|
+
' if [ "$NAME" -lt "$CUTOFF" ]; then',
|
|
231
|
+
' echo "Deleting expired backup $NAME"',
|
|
232
|
+
' aws s3 rm --recursive "s3://$BACKUP_BUCKET/$BACKUP_PREFIX/$NAME" $ENDPOINT_ARGS',
|
|
233
|
+
' fi',
|
|
234
|
+
' done',
|
|
235
|
+
].join('\n');
|
|
236
|
+
}
|
|
237
|
+
/** ClickHouse connection env for the backup step. */
|
|
238
|
+
function clickHouseConnectionEnv(config) {
|
|
239
|
+
const backup = config.storage.backup;
|
|
240
|
+
const auth = backup?.auth;
|
|
241
|
+
return [
|
|
242
|
+
{
|
|
243
|
+
name: 'CLICKHOUSE_HOST',
|
|
244
|
+
value: `clickhouse-${config.name}.${config.namespace}.svc.cluster.local`,
|
|
245
|
+
},
|
|
246
|
+
{ name: 'CLICKHOUSE_PORT', value: String(config.nativePort) },
|
|
247
|
+
{ name: 'CLICKHOUSE_DATABASE', value: backup?.database ?? 'default' },
|
|
248
|
+
auth === undefined
|
|
249
|
+
? { name: 'CLICKHOUSE_USER', value: 'default' }
|
|
250
|
+
: {
|
|
251
|
+
name: 'CLICKHOUSE_USER',
|
|
252
|
+
valueFrom: {
|
|
253
|
+
secretKeyRef: { name: auth.secretName, key: auth.usernameKey, optional: false },
|
|
254
|
+
},
|
|
255
|
+
},
|
|
256
|
+
auth === undefined
|
|
257
|
+
? { name: 'CLICKHOUSE_PASSWORD', value: '' }
|
|
258
|
+
: {
|
|
259
|
+
name: 'CLICKHOUSE_PASSWORD',
|
|
260
|
+
valueFrom: {
|
|
261
|
+
secretKeyRef: { name: auth.secretName, key: auth.passwordKey, optional: false },
|
|
262
|
+
},
|
|
263
|
+
},
|
|
264
|
+
{ name: 'BACKUP_ENDPOINT', value: backup?.endpointUrl ?? '' },
|
|
265
|
+
...(config.onCluster === true
|
|
266
|
+
? // `clusterName` is required when `onCluster` is set (checked by the
|
|
267
|
+
// factory below), but it may legitimately be a schema reference, so it
|
|
268
|
+
// travels as an env value exactly like `database` does.
|
|
269
|
+
[{ name: BACKUP_CLUSTER_ENV, value: config.clusterName }]
|
|
270
|
+
: []),
|
|
271
|
+
];
|
|
272
|
+
}
|
|
273
|
+
/** AWS env for the prune step: bucket coordinates plus the same credentials. */
|
|
274
|
+
function pruneEnv(config) {
|
|
275
|
+
const backup = config.storage.backup;
|
|
276
|
+
const env = [
|
|
277
|
+
{ name: 'BACKUP_BUCKET', value: backup?.bucket ?? '' },
|
|
278
|
+
{ name: 'BACKUP_PREFIX', value: backup?.prefix ?? '' },
|
|
279
|
+
{ name: 'RETENTION_DAYS', value: String(backup?.retentionDays ?? 0) },
|
|
280
|
+
];
|
|
281
|
+
if (config.storage.region !== undefined) {
|
|
282
|
+
env.push({ name: 'AWS_REGION', value: config.storage.region });
|
|
283
|
+
}
|
|
284
|
+
if (config.storage.endpoint !== undefined) {
|
|
285
|
+
env.push({ name: 'AWS_ENDPOINT_URL', value: config.storage.endpoint });
|
|
286
|
+
}
|
|
287
|
+
// The AWS CLI reads the standard variable names while the storage compiler's
|
|
288
|
+
// env helper emits ClickHouse-specific ones, so map them here rather than
|
|
289
|
+
// duplicating the secretKeyRef shape. IRSA needs no mapping at all — the CLI
|
|
290
|
+
// picks up the same projected web-identity token as the server.
|
|
291
|
+
//
|
|
292
|
+
// A `Map`, not an object literal, so the lookup below cannot read
|
|
293
|
+
// `Object.prototype`: `({})['constructor']` is a FUNCTION, not `undefined`,
|
|
294
|
+
// so the "unexpected env var" guard would have passed such a name straight
|
|
295
|
+
// through and pushed a container env var whose `name` is not a string. The
|
|
296
|
+
// env names are ours today, but the guard is the thing that has to hold.
|
|
297
|
+
const awsNameByChName = new Map([
|
|
298
|
+
[S3_ACCESS_KEY_ID_ENV, 'AWS_ACCESS_KEY_ID'],
|
|
299
|
+
[S3_SECRET_ACCESS_KEY_ENV, 'AWS_SECRET_ACCESS_KEY'],
|
|
300
|
+
]);
|
|
301
|
+
for (const entry of clickHouseS3ContainerEnv(config.storage)) {
|
|
302
|
+
const awsName = awsNameByChName.get(entry.name);
|
|
303
|
+
if (awsName === undefined) {
|
|
304
|
+
throw new Error(`clickHouseS3BackupCronJob: unexpected S3 credential env var '${entry.name}'.`);
|
|
305
|
+
}
|
|
306
|
+
env.push({ name: awsName, valueFrom: entry.valueFrom });
|
|
307
|
+
}
|
|
308
|
+
return env;
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Create the scheduled backup CronJob for an S3-backed ClickHouse cluster.
|
|
312
|
+
*
|
|
313
|
+
* @param config - Backup CronJob configuration
|
|
314
|
+
* @returns Enhanced CronJob resource with schedule-based readiness evaluation
|
|
315
|
+
* @throws Error when the resolved storage carries no `backup` schedule, when
|
|
316
|
+
* `onCluster` is set without a `clusterName`, or when a concrete
|
|
317
|
+
* `clusterName` is not a bare identifier
|
|
318
|
+
*
|
|
319
|
+
* @example
|
|
320
|
+
* ```typescript
|
|
321
|
+
* const backup = clickHouseS3BackupCronJob({
|
|
322
|
+
* name: 'observability',
|
|
323
|
+
* namespace: 'observability',
|
|
324
|
+
* version: '25.12.5',
|
|
325
|
+
* storage: resolved,
|
|
326
|
+
* nativePort: 9000,
|
|
327
|
+
* // Sharded/replicated topology: back up EVERY shard, coordinated by Keeper.
|
|
328
|
+
* onCluster: true,
|
|
329
|
+
* clusterName: 'cluster',
|
|
330
|
+
* id: 'clickhouseBackup',
|
|
331
|
+
* });
|
|
332
|
+
* ```
|
|
333
|
+
*/
|
|
334
|
+
export function clickHouseS3BackupCronJob(config) {
|
|
335
|
+
const backup = config.storage.backup;
|
|
336
|
+
if (backup === undefined) {
|
|
337
|
+
throw new Error('clickHouseS3BackupCronJob: the resolved storage carries no backup schedule. ' +
|
|
338
|
+
'Set storage.backup.schedule to render a backup CronJob.');
|
|
339
|
+
}
|
|
340
|
+
const onCluster = config.onCluster === true;
|
|
341
|
+
if (onCluster && config.clusterName === undefined) {
|
|
342
|
+
throw new Error('clickHouseS3BackupCronJob: `onCluster` requires `clusterName` — it is the ' +
|
|
343
|
+
"`ON CLUSTER '<name>'` target of the BACKUP statement.");
|
|
344
|
+
}
|
|
345
|
+
if (onCluster) {
|
|
346
|
+
// Concrete names only — a schema reference is validated by the generated
|
|
347
|
+
// KRO schema (`ClickHouseClusterNameSchema`) and, at run time, by the
|
|
348
|
+
// guard the script itself carries.
|
|
349
|
+
assertClickHouseClusterName('clickHouseS3BackupCronJob', 'clusterName', config.clusterName);
|
|
350
|
+
}
|
|
351
|
+
const backupContainer = {
|
|
352
|
+
name: 'backup',
|
|
353
|
+
image: `clickhouse/clickhouse-server:${config.version}`,
|
|
354
|
+
command: ['sh', '-c', backupScript(onCluster)],
|
|
355
|
+
env: clickHouseConnectionEnv(config),
|
|
356
|
+
};
|
|
357
|
+
const prune = backup.retentionDays === undefined
|
|
358
|
+
? undefined
|
|
359
|
+
: {
|
|
360
|
+
name: 'prune',
|
|
361
|
+
image: DEFAULT_S3_PRUNE_IMAGE,
|
|
362
|
+
command: ['sh', '-c', pruneScript()],
|
|
363
|
+
env: pruneEnv(config),
|
|
364
|
+
};
|
|
365
|
+
const serviceAccountName = clickHouseS3ServiceAccountName(config.storage, config.name);
|
|
366
|
+
return cronJob({
|
|
367
|
+
...(config.id !== undefined && { id: config.id }),
|
|
368
|
+
metadata: {
|
|
369
|
+
name: `${config.name}-s3-backup`,
|
|
370
|
+
namespace: config.namespace,
|
|
371
|
+
labels: {
|
|
372
|
+
'app.kubernetes.io/name': 'clickhouse-s3-backup',
|
|
373
|
+
'app.kubernetes.io/instance': config.name,
|
|
374
|
+
'app.kubernetes.io/managed-by': 'typekro',
|
|
375
|
+
},
|
|
376
|
+
},
|
|
377
|
+
spec: {
|
|
378
|
+
schedule: backup.schedule,
|
|
379
|
+
// A backup that overlaps its predecessor competes for the same server
|
|
380
|
+
// and the same object keys; skip instead.
|
|
381
|
+
concurrencyPolicy: 'Forbid',
|
|
382
|
+
successfulJobsHistoryLimit: 3,
|
|
383
|
+
failedJobsHistoryLimit: 3,
|
|
384
|
+
jobTemplate: {
|
|
385
|
+
spec: {
|
|
386
|
+
backoffLimit: 2,
|
|
387
|
+
template: {
|
|
388
|
+
metadata: {
|
|
389
|
+
labels: {
|
|
390
|
+
'app.kubernetes.io/name': 'clickhouse-s3-backup',
|
|
391
|
+
'app.kubernetes.io/instance': config.name,
|
|
392
|
+
},
|
|
393
|
+
},
|
|
394
|
+
spec: {
|
|
395
|
+
restartPolicy: 'Never',
|
|
396
|
+
...(serviceAccountName !== undefined && { serviceAccountName }),
|
|
397
|
+
// Sequencing: with retention the backup must COMPLETE before the
|
|
398
|
+
// prune reads the listing, and Job containers run in parallel —
|
|
399
|
+
// so the backup becomes an initContainer.
|
|
400
|
+
...(prune === undefined
|
|
401
|
+
? { containers: [backupContainer] }
|
|
402
|
+
: { initContainers: [backupContainer], containers: [prune] }),
|
|
403
|
+
},
|
|
404
|
+
},
|
|
405
|
+
},
|
|
406
|
+
},
|
|
407
|
+
},
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
//# sourceMappingURL=s3-backup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"s3-backup.js","sourceRoot":"","sources":["../../../../src/factories/clickhouse/resources/s3-backup.ts"],"names":[],"mappings":"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"}
|