typekro 0.3.1 → 0.5.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/README.md +142 -1054
- package/dist/.tsbuildinfo +1 -1
- package/dist/advanced/index.d.ts +52 -0
- package/dist/advanced/index.d.ts.map +1 -0
- package/dist/advanced/index.js +60 -0
- package/dist/advanced/index.js.map +1 -0
- package/dist/alchemy/deployers.d.ts +0 -5
- package/dist/alchemy/deployers.d.ts.map +1 -1
- package/dist/alchemy/deployers.js +26 -89
- package/dist/alchemy/deployers.js.map +1 -1
- package/dist/alchemy/index.d.ts +8 -8
- package/dist/alchemy/index.d.ts.map +1 -1
- package/dist/alchemy/index.js +12 -11
- package/dist/alchemy/index.js.map +1 -1
- package/dist/alchemy/resolver.d.ts.map +1 -1
- package/dist/alchemy/resolver.js +6 -5
- package/dist/alchemy/resolver.js.map +1 -1
- package/dist/alchemy/resource-registration.d.ts.map +1 -1
- package/dist/alchemy/resource-registration.js +20 -8
- package/dist/alchemy/resource-registration.js.map +1 -1
- package/dist/alchemy/type-inference.d.ts.map +1 -1
- package/dist/alchemy/type-inference.js +6 -5
- package/dist/alchemy/type-inference.js.map +1 -1
- package/dist/alchemy/types.d.ts +1 -1
- package/dist/alchemy/types.d.ts.map +1 -1
- package/dist/alchemy/utilities.d.ts.map +1 -1
- package/dist/alchemy/utilities.js +1 -1
- package/dist/alchemy/utilities.js.map +1 -1
- package/dist/alchemy/wrapper.d.ts +4 -2
- package/dist/alchemy/wrapper.d.ts.map +1 -1
- package/dist/alchemy/wrapper.js +2 -1
- package/dist/alchemy/wrapper.js.map +1 -1
- package/dist/compositions/typekro-runtime/index.d.ts +3 -0
- package/dist/compositions/typekro-runtime/index.d.ts.map +1 -0
- package/dist/compositions/typekro-runtime/index.js.map +1 -0
- package/dist/{core/composition → compositions}/typekro-runtime/typekro-runtime.d.ts +7 -10
- package/dist/compositions/typekro-runtime/typekro-runtime.d.ts.map +1 -0
- package/dist/compositions/typekro-runtime/typekro-runtime.js +404 -0
- package/dist/compositions/typekro-runtime/typekro-runtime.js.map +1 -0
- package/dist/compositions/typekro-runtime/types.d.ts +45 -0
- package/dist/compositions/typekro-runtime/types.d.ts.map +1 -0
- package/dist/compositions/typekro-runtime/types.js.map +1 -0
- package/dist/core/composition/context.d.ts +91 -0
- package/dist/core/composition/context.d.ts.map +1 -0
- package/dist/core/composition/context.js +125 -0
- package/dist/core/composition/context.js.map +1 -0
- package/dist/core/composition/imperative.d.ts +37 -11
- package/dist/core/composition/imperative.d.ts.map +1 -1
- package/dist/core/composition/imperative.js +433 -37
- package/dist/core/composition/imperative.js.map +1 -1
- package/dist/core/composition/index.d.ts +2 -4
- package/dist/core/composition/index.d.ts.map +1 -1
- package/dist/core/composition/index.js +1 -4
- package/dist/core/composition/index.js.map +1 -1
- package/dist/core/composition-debugger.d.ts +78 -0
- package/dist/core/composition-debugger.d.ts.map +1 -0
- package/dist/core/composition-debugger.js +142 -0
- package/dist/core/composition-debugger.js.map +1 -0
- package/dist/core/config/defaults.d.ts +109 -0
- package/dist/core/config/defaults.d.ts.map +1 -0
- package/dist/core/config/defaults.js +150 -0
- package/dist/core/config/defaults.js.map +1 -0
- package/dist/core/config/env.d.ts +12 -0
- package/dist/core/config/env.d.ts.map +1 -0
- package/dist/core/config/env.js +16 -0
- package/dist/core/config/env.js.map +1 -0
- package/dist/core/config/index.d.ts +3 -0
- package/dist/core/config/index.d.ts.map +1 -0
- package/dist/core/config/index.js +3 -0
- package/dist/core/config/index.js.map +1 -0
- package/dist/core/constants/brands.d.ts +4 -37
- package/dist/core/constants/brands.d.ts.map +1 -1
- package/dist/core/constants/brands.js +4 -40
- package/dist/core/constants/brands.js.map +1 -1
- package/dist/core/dependencies/graph.d.ts.map +1 -1
- package/dist/core/dependencies/graph.js +4 -4
- package/dist/core/dependencies/graph.js.map +1 -1
- package/dist/core/dependencies/resolver.d.ts.map +1 -1
- package/dist/core/dependencies/resolver.js +3 -3
- package/dist/core/dependencies/resolver.js.map +1 -1
- package/dist/core/deployment/client-provider-manager.d.ts +40 -0
- package/dist/core/deployment/client-provider-manager.d.ts.map +1 -0
- package/dist/core/deployment/client-provider-manager.js +63 -0
- package/dist/core/deployment/client-provider-manager.js.map +1 -0
- package/dist/core/deployment/closure-planner.d.ts +20 -0
- package/dist/core/deployment/closure-planner.d.ts.map +1 -0
- package/dist/core/deployment/closure-planner.js +96 -0
- package/dist/core/deployment/closure-planner.js.map +1 -0
- package/dist/core/deployment/crd-manager.d.ts +52 -0
- package/dist/core/deployment/crd-manager.d.ts.map +1 -0
- package/dist/core/deployment/crd-manager.js +227 -0
- package/dist/core/deployment/crd-manager.js.map +1 -0
- package/dist/core/deployment/debug-logger.d.ts +3 -14
- package/dist/core/deployment/debug-logger.d.ts.map +1 -1
- package/dist/core/deployment/debug-logger.js +41 -12
- package/dist/core/deployment/debug-logger.js.map +1 -1
- package/dist/core/deployment/direct-factory.d.ts +59 -9
- package/dist/core/deployment/direct-factory.d.ts.map +1 -1
- package/dist/core/deployment/direct-factory.js +494 -117
- package/dist/core/deployment/direct-factory.js.map +1 -1
- package/dist/core/deployment/engine.d.ts +126 -64
- package/dist/core/deployment/engine.d.ts.map +1 -1
- package/dist/core/deployment/engine.js +611 -1227
- package/dist/core/deployment/engine.js.map +1 -1
- package/dist/core/deployment/errors.d.ts +30 -0
- package/dist/core/deployment/errors.d.ts.map +1 -0
- package/dist/core/deployment/errors.js +84 -0
- package/dist/core/deployment/errors.js.map +1 -0
- package/dist/core/deployment/event-filter.d.ts.map +1 -1
- package/dist/core/deployment/event-filter.js +21 -18
- package/dist/core/deployment/event-filter.js.map +1 -1
- package/dist/core/deployment/event-monitor.d.ts +36 -2
- package/dist/core/deployment/event-monitor.d.ts.map +1 -1
- package/dist/core/deployment/event-monitor.js +279 -51
- package/dist/core/deployment/event-monitor.js.map +1 -1
- package/dist/core/deployment/index.d.ts +5 -2
- package/dist/core/deployment/index.d.ts.map +1 -1
- package/dist/core/deployment/index.js +5 -3
- package/dist/core/deployment/index.js.map +1 -1
- package/dist/core/deployment/k8s-helpers.d.ts +44 -0
- package/dist/core/deployment/k8s-helpers.d.ts.map +1 -0
- package/dist/core/deployment/k8s-helpers.js +109 -0
- package/dist/core/deployment/k8s-helpers.js.map +1 -0
- package/dist/core/deployment/kro-factory.d.ts +41 -13
- package/dist/core/deployment/kro-factory.d.ts.map +1 -1
- package/dist/core/deployment/kro-factory.js +355 -210
- package/dist/core/deployment/kro-factory.js.map +1 -1
- package/dist/core/deployment/kro-readiness.d.ts +54 -0
- package/dist/core/deployment/kro-readiness.d.ts.map +1 -0
- package/dist/core/deployment/kro-readiness.js +140 -0
- package/dist/core/deployment/kro-readiness.js.map +1 -0
- package/dist/core/deployment/readiness-waiter.d.ts +60 -0
- package/dist/core/deployment/readiness-waiter.d.ts.map +1 -0
- package/dist/core/deployment/readiness-waiter.js +245 -0
- package/dist/core/deployment/readiness-waiter.js.map +1 -0
- package/dist/core/deployment/readiness.d.ts +3 -9
- package/dist/core/deployment/readiness.d.ts.map +1 -1
- package/dist/core/deployment/readiness.js +16 -30
- package/dist/core/deployment/readiness.js.map +1 -1
- package/dist/core/deployment/resource-applier.d.ts +58 -0
- package/dist/core/deployment/resource-applier.d.ts.map +1 -0
- package/dist/core/deployment/resource-applier.js +385 -0
- package/dist/core/deployment/resource-applier.js.map +1 -0
- package/dist/core/deployment/rollback-manager.d.ts +21 -3
- package/dist/core/deployment/rollback-manager.d.ts.map +1 -1
- package/dist/core/deployment/rollback-manager.js +132 -13
- package/dist/core/deployment/rollback-manager.js.map +1 -1
- package/dist/core/deployment/shared-utilities.d.ts +38 -9
- package/dist/core/deployment/shared-utilities.d.ts.map +1 -1
- package/dist/core/deployment/shared-utilities.js +92 -22
- package/dist/core/deployment/shared-utilities.js.map +1 -1
- package/dist/core/deployment/status-hydrator.d.ts +1 -1
- package/dist/core/deployment/status-hydrator.d.ts.map +1 -1
- package/dist/core/deployment/status-hydrator.js +21 -15
- package/dist/core/deployment/status-hydrator.js.map +1 -1
- package/dist/core/deployment/strategies/alchemy-strategy.d.ts.map +1 -1
- package/dist/core/deployment/strategies/alchemy-strategy.js +16 -9
- package/dist/core/deployment/strategies/alchemy-strategy.js.map +1 -1
- package/dist/core/deployment/strategies/base-strategy.d.ts +14 -0
- package/dist/core/deployment/strategies/base-strategy.d.ts.map +1 -1
- package/dist/core/deployment/strategies/base-strategy.js +326 -206
- package/dist/core/deployment/strategies/base-strategy.js.map +1 -1
- package/dist/core/deployment/strategies/direct-strategy.d.ts +10 -3
- package/dist/core/deployment/strategies/direct-strategy.d.ts.map +1 -1
- package/dist/core/deployment/strategies/direct-strategy.js +60 -1
- package/dist/core/deployment/strategies/direct-strategy.js.map +1 -1
- package/dist/core/deployment/strategies/kro-strategy.d.ts +16 -6
- package/dist/core/deployment/strategies/kro-strategy.d.ts.map +1 -1
- package/dist/core/deployment/strategies/kro-strategy.js +57 -105
- package/dist/core/deployment/strategies/kro-strategy.js.map +1 -1
- package/dist/core/errors.d.ts +134 -83
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +177 -300
- package/dist/core/errors.js.map +1 -1
- package/dist/core/expressions/analysis/analyzer.d.ts +155 -0
- package/dist/core/expressions/analysis/analyzer.d.ts.map +1 -0
- package/dist/core/expressions/analysis/analyzer.js +540 -0
- package/dist/core/expressions/analysis/analyzer.js.map +1 -0
- package/dist/core/expressions/analysis/array-method-converters.d.ts +19 -0
- package/dist/core/expressions/analysis/array-method-converters.d.ts.map +1 -0
- package/dist/core/expressions/analysis/array-method-converters.js +175 -0
- package/dist/core/expressions/analysis/array-method-converters.js.map +1 -0
- package/dist/core/expressions/analysis/ast-helpers.d.ts +49 -0
- package/dist/core/expressions/analysis/ast-helpers.d.ts.map +1 -0
- package/dist/core/expressions/analysis/ast-helpers.js +106 -0
- package/dist/core/expressions/analysis/ast-helpers.js.map +1 -0
- package/dist/core/expressions/analysis/ast-node-converters.d.ts +15 -0
- package/dist/core/expressions/analysis/ast-node-converters.d.ts.map +1 -0
- package/dist/core/expressions/analysis/ast-node-converters.js +123 -0
- package/dist/core/expressions/analysis/ast-node-converters.js.map +1 -0
- package/dist/core/expressions/analysis/ast-type-guards.d.ts +14 -0
- package/dist/core/expressions/analysis/ast-type-guards.d.ts.map +1 -0
- package/dist/core/expressions/analysis/ast-type-guards.js +15 -0
- package/dist/core/expressions/analysis/ast-type-guards.js.map +1 -0
- package/dist/core/expressions/{cache.d.ts → analysis/cache.d.ts} +1 -1
- package/dist/core/expressions/analysis/cache.d.ts.map +1 -0
- package/dist/core/expressions/{cache.js → analysis/cache.js} +13 -13
- package/dist/core/expressions/analysis/cache.js.map +1 -0
- package/dist/core/expressions/analysis/call-expression-converters.d.ts +18 -0
- package/dist/core/expressions/analysis/call-expression-converters.d.ts.map +1 -0
- package/dist/core/expressions/analysis/call-expression-converters.js +220 -0
- package/dist/core/expressions/analysis/call-expression-converters.js.map +1 -0
- package/dist/core/expressions/analysis/cel-emitter.d.ts +85 -0
- package/dist/core/expressions/analysis/cel-emitter.d.ts.map +1 -0
- package/dist/core/expressions/analysis/cel-emitter.js +455 -0
- package/dist/core/expressions/analysis/cel-emitter.js.map +1 -0
- package/dist/core/expressions/analysis/expression-classifier.d.ts +77 -0
- package/dist/core/expressions/analysis/expression-classifier.d.ts.map +1 -0
- package/dist/core/expressions/analysis/expression-classifier.js +487 -0
- package/dist/core/expressions/analysis/expression-classifier.js.map +1 -0
- package/dist/core/expressions/analysis/fn-toString-self-test.d.ts +146 -0
- package/dist/core/expressions/analysis/fn-toString-self-test.d.ts.map +1 -0
- package/dist/core/expressions/analysis/fn-toString-self-test.js +243 -0
- package/dist/core/expressions/analysis/fn-toString-self-test.js.map +1 -0
- package/dist/core/expressions/analysis/operator-utils.d.ts +35 -0
- package/dist/core/expressions/analysis/operator-utils.d.ts.map +1 -0
- package/dist/core/expressions/analysis/operator-utils.js +167 -0
- package/dist/core/expressions/analysis/operator-utils.js.map +1 -0
- package/dist/core/expressions/analysis/parse-core.d.ts +63 -0
- package/dist/core/expressions/analysis/parse-core.d.ts.map +1 -0
- package/dist/core/expressions/analysis/parse-core.js +115 -0
- package/dist/core/expressions/analysis/parse-core.js.map +1 -0
- package/dist/core/expressions/analysis/parser.d.ts +127 -0
- package/dist/core/expressions/analysis/parser.d.ts.map +1 -0
- package/dist/core/expressions/analysis/parser.js +212 -0
- package/dist/core/expressions/analysis/parser.js.map +1 -0
- package/dist/core/expressions/analysis/scope-resolver.d.ts +57 -0
- package/dist/core/expressions/analysis/scope-resolver.d.ts.map +1 -0
- package/dist/core/expressions/analysis/scope-resolver.js +440 -0
- package/dist/core/expressions/analysis/scope-resolver.js.map +1 -0
- package/dist/core/expressions/analysis/shared-types.d.ts +132 -0
- package/dist/core/expressions/analysis/shared-types.d.ts.map +1 -0
- package/dist/core/expressions/analysis/shared-types.js +13 -0
- package/dist/core/expressions/analysis/shared-types.js.map +1 -0
- package/dist/core/expressions/analysis/source-map.d.ts.map +1 -0
- package/dist/core/expressions/{source-map.js → analysis/source-map.js} +16 -17
- package/dist/core/expressions/analysis/source-map.js.map +1 -0
- package/dist/core/expressions/analysis/string-method-converters.d.ts +27 -0
- package/dist/core/expressions/analysis/string-method-converters.d.ts.map +1 -0
- package/dist/core/expressions/analysis/string-method-converters.js +208 -0
- package/dist/core/expressions/analysis/string-method-converters.js.map +1 -0
- package/dist/core/expressions/{types.d.ts → analysis/types.d.ts} +5 -5
- package/dist/core/expressions/analysis/types.d.ts.map +1 -0
- package/dist/core/expressions/analysis/types.js.map +1 -0
- package/dist/core/expressions/composition/composition-analyzer-helpers.d.ts +92 -0
- package/dist/core/expressions/composition/composition-analyzer-helpers.d.ts.map +1 -0
- package/dist/core/expressions/composition/composition-analyzer-helpers.js +301 -0
- package/dist/core/expressions/composition/composition-analyzer-helpers.js.map +1 -0
- package/dist/core/expressions/composition/composition-analyzer-ternary.d.ts +77 -0
- package/dist/core/expressions/composition/composition-analyzer-ternary.d.ts.map +1 -0
- package/dist/core/expressions/composition/composition-analyzer-ternary.js +364 -0
- package/dist/core/expressions/composition/composition-analyzer-ternary.js.map +1 -0
- package/dist/core/expressions/composition/composition-analyzer-traversal.d.ts +37 -0
- package/dist/core/expressions/composition/composition-analyzer-traversal.d.ts.map +1 -0
- package/dist/core/expressions/composition/composition-analyzer-traversal.js +375 -0
- package/dist/core/expressions/composition/composition-analyzer-traversal.js.map +1 -0
- package/dist/core/expressions/composition/composition-analyzer-types.d.ts +140 -0
- package/dist/core/expressions/composition/composition-analyzer-types.d.ts.map +1 -0
- package/dist/core/expressions/composition/composition-analyzer-types.js +8 -0
- package/dist/core/expressions/composition/composition-analyzer-types.js.map +1 -0
- package/dist/core/expressions/composition/composition-analyzer.d.ts +39 -0
- package/dist/core/expressions/composition/composition-analyzer.d.ts.map +1 -0
- package/dist/core/expressions/composition/composition-analyzer.js +144 -0
- package/dist/core/expressions/composition/composition-analyzer.js.map +1 -0
- package/dist/core/expressions/composition/context-tracker.d.ts +39 -0
- package/dist/core/expressions/composition/context-tracker.d.ts.map +1 -0
- package/dist/core/expressions/composition/context-tracker.js +64 -0
- package/dist/core/expressions/composition/context-tracker.js.map +1 -0
- package/dist/core/expressions/composition/expression-analyzer.d.ts +101 -0
- package/dist/core/expressions/composition/expression-analyzer.d.ts.map +1 -0
- package/dist/core/expressions/composition/expression-analyzer.js +425 -0
- package/dist/core/expressions/composition/expression-analyzer.js.map +1 -0
- package/dist/core/expressions/{imperative-analyzer.d.ts → composition/imperative-analyzer.d.ts} +3 -3
- package/dist/core/expressions/composition/imperative-analyzer.d.ts.map +1 -0
- package/dist/core/expressions/{imperative-analyzer.js → composition/imperative-analyzer.js} +68 -30
- package/dist/core/expressions/composition/imperative-analyzer.js.map +1 -0
- package/dist/core/expressions/composition/index.d.ts +17 -0
- package/dist/core/expressions/composition/index.d.ts.map +1 -0
- package/dist/core/expressions/composition/index.js +18 -0
- package/dist/core/expressions/composition/index.js.map +1 -0
- package/dist/core/expressions/composition/integration-hooks.d.ts +71 -0
- package/dist/core/expressions/composition/integration-hooks.d.ts.map +1 -0
- package/dist/core/expressions/composition/integration-hooks.js +248 -0
- package/dist/core/expressions/composition/integration-hooks.js.map +1 -0
- package/dist/core/expressions/composition/scope-manager.d.ts +93 -0
- package/dist/core/expressions/composition/scope-manager.d.ts.map +1 -0
- package/dist/core/expressions/composition/scope-manager.js +215 -0
- package/dist/core/expressions/composition/scope-manager.js.map +1 -0
- package/dist/core/expressions/composition/types.d.ts +41 -0
- package/dist/core/expressions/composition/types.d.ts.map +1 -0
- package/dist/core/expressions/composition/types.js +7 -0
- package/dist/core/expressions/composition/types.js.map +1 -0
- package/dist/core/expressions/{conditional-expression-processor.d.ts → conditional/conditional-expression-processor.d.ts} +3 -3
- package/dist/core/expressions/conditional/conditional-expression-processor.d.ts.map +1 -0
- package/dist/core/expressions/{conditional-expression-processor.js → conditional/conditional-expression-processor.js} +59 -50
- package/dist/core/expressions/conditional/conditional-expression-processor.js.map +1 -0
- package/dist/core/expressions/{conditional-integration.d.ts → conditional/conditional-integration.d.ts} +13 -35
- package/dist/core/expressions/conditional/conditional-integration.d.ts.map +1 -0
- package/dist/core/expressions/{conditional-integration.js → conditional/conditional-integration.js} +92 -86
- package/dist/core/expressions/conditional/conditional-integration.js.map +1 -0
- package/dist/core/expressions/{context-aware-generator.d.ts → context/context-aware-generator.d.ts} +4 -28
- package/dist/core/expressions/context/context-aware-generator.d.ts.map +1 -0
- package/dist/core/expressions/{context-aware-generator.js → context/context-aware-generator.js} +27 -121
- package/dist/core/expressions/context/context-aware-generator.js.map +1 -0
- package/dist/core/expressions/{context-detector.d.ts → context/context-detector.d.ts} +7 -13
- package/dist/core/expressions/context/context-detector.d.ts.map +1 -0
- package/dist/core/expressions/{context-detector.js → context/context-detector.js} +45 -63
- package/dist/core/expressions/context/context-detector.js.map +1 -0
- package/dist/core/expressions/{context-validator.d.ts → context/context-validator.d.ts} +5 -36
- package/dist/core/expressions/context/context-validator.d.ts.map +1 -0
- package/dist/core/expressions/{context-validator.js → context/context-validator.js} +55 -124
- package/dist/core/expressions/context/context-validator.js.map +1 -0
- package/dist/core/expressions/{cel-conversion-engine.d.ts → factory/cel-conversion-engine.d.ts} +3 -3
- package/dist/core/expressions/factory/cel-conversion-engine.d.ts.map +1 -0
- package/dist/core/expressions/{cel-conversion-engine.js → factory/cel-conversion-engine.js} +19 -19
- package/dist/core/expressions/factory/cel-conversion-engine.js.map +1 -0
- package/dist/core/expressions/factory/dependency-tracker.d.ts +222 -0
- package/dist/core/expressions/factory/dependency-tracker.d.ts.map +1 -0
- package/dist/core/expressions/factory/dependency-tracker.js +512 -0
- package/dist/core/expressions/factory/dependency-tracker.js.map +1 -0
- package/dist/core/expressions/{factory-integration.d.ts → factory/factory-integration.d.ts} +3 -18
- package/dist/core/expressions/factory/factory-integration.d.ts.map +1 -0
- package/dist/core/expressions/{factory-integration.js → factory/factory-integration.js} +28 -29
- package/dist/core/expressions/factory/factory-integration.js.map +1 -0
- package/dist/core/expressions/{factory-pattern-handler.d.ts → factory/factory-pattern-handler.d.ts} +8 -8
- package/dist/core/expressions/factory/factory-pattern-handler.d.ts.map +1 -0
- package/dist/core/expressions/{factory-pattern-handler.js → factory/factory-pattern-handler.js} +101 -73
- package/dist/core/expressions/factory/factory-pattern-handler.js.map +1 -0
- package/dist/core/expressions/{migration-helpers.d.ts → factory/migration-helpers.d.ts} +4 -4
- package/dist/core/expressions/factory/migration-helpers.d.ts.map +1 -0
- package/dist/core/expressions/{migration-helpers.js → factory/migration-helpers.js} +28 -26
- package/dist/core/expressions/factory/migration-helpers.js.map +1 -0
- package/dist/core/expressions/factory/resource-analyzer.d.ts +139 -0
- package/dist/core/expressions/factory/resource-analyzer.d.ts.map +1 -0
- package/dist/core/expressions/factory/resource-analyzer.js +286 -0
- package/dist/core/expressions/factory/resource-analyzer.js.map +1 -0
- package/dist/core/expressions/factory/resource-type-validator.d.ts +149 -0
- package/dist/core/expressions/factory/resource-type-validator.d.ts.map +1 -0
- package/dist/core/expressions/factory/resource-type-validator.js +318 -0
- package/dist/core/expressions/factory/resource-type-validator.js.map +1 -0
- package/dist/core/expressions/factory/status-ast-utils.d.ts +36 -0
- package/dist/core/expressions/factory/status-ast-utils.d.ts.map +1 -0
- package/dist/core/expressions/factory/status-ast-utils.js +320 -0
- package/dist/core/expressions/factory/status-ast-utils.js.map +1 -0
- package/dist/core/expressions/factory/status-builder-analyzer.d.ts +91 -0
- package/dist/core/expressions/factory/status-builder-analyzer.d.ts.map +1 -0
- package/dist/core/expressions/factory/status-builder-analyzer.js +374 -0
- package/dist/core/expressions/factory/status-builder-analyzer.js.map +1 -0
- package/dist/core/expressions/factory/status-builder-types.d.ts +166 -0
- package/dist/core/expressions/factory/status-builder-types.d.ts.map +1 -0
- package/dist/core/expressions/factory/status-builder-types.js +8 -0
- package/dist/core/expressions/factory/status-builder-types.js.map +1 -0
- package/dist/core/expressions/factory/status-cel-generation.d.ts +67 -0
- package/dist/core/expressions/factory/status-cel-generation.d.ts.map +1 -0
- package/dist/core/expressions/factory/status-cel-generation.js +330 -0
- package/dist/core/expressions/factory/status-cel-generation.js.map +1 -0
- package/dist/core/expressions/factory/status-field-analysis.d.ts +57 -0
- package/dist/core/expressions/factory/status-field-analysis.d.ts.map +1 -0
- package/dist/core/expressions/factory/status-field-analysis.js +475 -0
- package/dist/core/expressions/factory/status-field-analysis.js.map +1 -0
- package/dist/core/expressions/index.d.ts +39 -49
- package/dist/core/expressions/index.d.ts.map +1 -1
- package/dist/core/expressions/index.js +46 -45
- package/dist/core/expressions/index.js.map +1 -1
- package/dist/core/expressions/{magic-assignable-analyzer.d.ts → magic-proxy/magic-assignable-analyzer.d.ts} +5 -5
- package/dist/core/expressions/magic-proxy/magic-assignable-analyzer.d.ts.map +1 -0
- package/dist/core/expressions/{magic-assignable-analyzer.js → magic-proxy/magic-assignable-analyzer.js} +29 -24
- package/dist/core/expressions/magic-proxy/magic-assignable-analyzer.js.map +1 -0
- package/dist/core/expressions/{magic-proxy-analyzer.d.ts → magic-proxy/magic-proxy-analyzer.d.ts} +15 -68
- package/dist/core/expressions/magic-proxy/magic-proxy-analyzer.d.ts.map +1 -0
- package/dist/core/expressions/{magic-proxy-analyzer.js → magic-proxy/magic-proxy-analyzer.js} +45 -195
- package/dist/core/expressions/magic-proxy/magic-proxy-analyzer.js.map +1 -0
- package/dist/core/expressions/magic-proxy/magic-proxy-ast.d.ts +44 -0
- package/dist/core/expressions/magic-proxy/magic-proxy-ast.d.ts.map +1 -0
- package/dist/core/expressions/magic-proxy/magic-proxy-ast.js +175 -0
- package/dist/core/expressions/magic-proxy/magic-proxy-ast.js.map +1 -0
- package/dist/core/expressions/{magic-proxy-detector.d.ts → magic-proxy/magic-proxy-detector.d.ts} +7 -7
- package/dist/core/expressions/magic-proxy/magic-proxy-detector.d.ts.map +1 -0
- package/dist/core/expressions/{magic-proxy-detector.js → magic-proxy/magic-proxy-detector.js} +36 -28
- package/dist/core/expressions/magic-proxy/magic-proxy-detector.js.map +1 -0
- package/dist/core/expressions/magic-proxy/magic-proxy-types.d.ts +36 -0
- package/dist/core/expressions/magic-proxy/magic-proxy-types.d.ts.map +1 -0
- package/dist/core/expressions/magic-proxy/magic-proxy-types.js +8 -0
- package/dist/core/expressions/magic-proxy/magic-proxy-types.js.map +1 -0
- package/dist/core/expressions/magic-proxy/optionality-analysis.d.ts +54 -0
- package/dist/core/expressions/magic-proxy/optionality-analysis.d.ts.map +1 -0
- package/dist/core/expressions/magic-proxy/optionality-analysis.js +239 -0
- package/dist/core/expressions/magic-proxy/optionality-analysis.js.map +1 -0
- package/dist/core/expressions/magic-proxy/optionality-cel-generation.d.ts +51 -0
- package/dist/core/expressions/magic-proxy/optionality-cel-generation.d.ts.map +1 -0
- package/dist/core/expressions/magic-proxy/optionality-cel-generation.js +201 -0
- package/dist/core/expressions/magic-proxy/optionality-cel-generation.js.map +1 -0
- package/dist/core/expressions/magic-proxy/optionality-handler.d.ts +119 -0
- package/dist/core/expressions/magic-proxy/optionality-handler.d.ts.map +1 -0
- package/dist/core/expressions/magic-proxy/optionality-handler.js +321 -0
- package/dist/core/expressions/magic-proxy/optionality-handler.js.map +1 -0
- package/dist/core/expressions/magic-proxy/optionality-hydration.d.ts +84 -0
- package/dist/core/expressions/magic-proxy/optionality-hydration.d.ts.map +1 -0
- package/dist/core/expressions/magic-proxy/optionality-hydration.js +378 -0
- package/dist/core/expressions/magic-proxy/optionality-hydration.js.map +1 -0
- package/dist/core/expressions/magic-proxy/optionality-optional-chaining.d.ts +61 -0
- package/dist/core/expressions/magic-proxy/optionality-optional-chaining.d.ts.map +1 -0
- package/dist/core/expressions/magic-proxy/optionality-optional-chaining.js +218 -0
- package/dist/core/expressions/magic-proxy/optionality-optional-chaining.js.map +1 -0
- package/dist/core/expressions/magic-proxy/optionality-types.d.ts +206 -0
- package/dist/core/expressions/magic-proxy/optionality-types.d.ts.map +1 -0
- package/dist/core/expressions/magic-proxy/optionality-types.js +9 -0
- package/dist/core/expressions/magic-proxy/optionality-types.js.map +1 -0
- package/dist/core/expressions/validation/compile-time-checker.d.ts +74 -0
- package/dist/core/expressions/validation/compile-time-checker.d.ts.map +1 -0
- package/dist/core/expressions/{compile-time-validation.js → validation/compile-time-checker.js} +44 -91
- package/dist/core/expressions/validation/compile-time-checker.js.map +1 -0
- package/dist/core/expressions/validation/compile-time-errors.d.ts +70 -0
- package/dist/core/expressions/validation/compile-time-errors.d.ts.map +1 -0
- package/dist/core/expressions/validation/compile-time-errors.js +63 -0
- package/dist/core/expressions/validation/compile-time-errors.js.map +1 -0
- package/dist/core/expressions/validation/compile-time-types.d.ts +147 -0
- package/dist/core/expressions/validation/compile-time-types.d.ts.map +1 -0
- package/dist/core/expressions/validation/compile-time-types.js +8 -0
- package/dist/core/expressions/validation/compile-time-types.js.map +1 -0
- package/dist/core/expressions/validation/compile-time-validation.d.ts +13 -0
- package/dist/core/expressions/validation/compile-time-validation.d.ts.map +1 -0
- package/dist/core/expressions/validation/compile-time-validation.js +14 -0
- package/dist/core/expressions/validation/compile-time-validation.js.map +1 -0
- package/dist/core/expressions/validation/kubernetes-field-types.d.ts +35 -0
- package/dist/core/expressions/validation/kubernetes-field-types.d.ts.map +1 -0
- package/dist/core/expressions/validation/kubernetes-field-types.js +230 -0
- package/dist/core/expressions/validation/kubernetes-field-types.js.map +1 -0
- package/dist/core/expressions/validation/resource-field-utils.d.ts +69 -0
- package/dist/core/expressions/validation/resource-field-utils.d.ts.map +1 -0
- package/dist/core/expressions/validation/resource-field-utils.js +280 -0
- package/dist/core/expressions/validation/resource-field-utils.js.map +1 -0
- package/dist/core/expressions/{resource-validation.d.ts → validation/resource-validation-types.d.ts} +6 -63
- package/dist/core/expressions/validation/resource-validation-types.d.ts.map +1 -0
- package/dist/core/expressions/validation/resource-validation-types.js +69 -0
- package/dist/core/expressions/validation/resource-validation-types.js.map +1 -0
- package/dist/core/expressions/validation/resource-validation.d.ts +49 -0
- package/dist/core/expressions/validation/resource-validation.d.ts.map +1 -0
- package/dist/core/expressions/validation/resource-validation.js +288 -0
- package/dist/core/expressions/validation/resource-validation.js.map +1 -0
- package/dist/core/expressions/{type-inference.d.ts → validation/type-inference-types.d.ts} +34 -88
- package/dist/core/expressions/validation/type-inference-types.d.ts.map +1 -0
- package/dist/core/expressions/validation/type-inference-types.js +52 -0
- package/dist/core/expressions/validation/type-inference-types.js.map +1 -0
- package/dist/core/expressions/validation/type-inference.d.ts +86 -0
- package/dist/core/expressions/validation/type-inference.d.ts.map +1 -0
- package/dist/core/expressions/{type-inference.js → validation/type-inference.js} +66 -299
- package/dist/core/expressions/validation/type-inference.js.map +1 -0
- package/dist/core/expressions/{type-safety.d.ts → validation/type-safety.d.ts} +6 -5
- package/dist/core/expressions/validation/type-safety.d.ts.map +1 -0
- package/dist/core/expressions/{type-safety.js → validation/type-safety.js} +34 -19
- package/dist/core/expressions/validation/type-safety.js.map +1 -0
- package/dist/core/kubernetes/api.d.ts.map +1 -1
- package/dist/core/kubernetes/api.js +26 -18
- package/dist/core/kubernetes/api.js.map +1 -1
- package/dist/core/kubernetes/bun-api-client.d.ts +117 -0
- package/dist/core/kubernetes/bun-api-client.d.ts.map +1 -0
- package/dist/core/kubernetes/bun-api-client.js +183 -0
- package/dist/core/kubernetes/bun-api-client.js.map +1 -0
- package/dist/core/kubernetes/bun-http-library.d.ts +104 -0
- package/dist/core/kubernetes/bun-http-library.d.ts.map +1 -0
- package/dist/core/kubernetes/bun-http-library.js +240 -0
- package/dist/core/kubernetes/bun-http-library.js.map +1 -0
- package/dist/core/kubernetes/client-provider.d.ts +124 -35
- package/dist/core/kubernetes/client-provider.d.ts.map +1 -1
- package/dist/core/kubernetes/client-provider.js +209 -84
- package/dist/core/kubernetes/client-provider.js.map +1 -1
- package/dist/core/kubernetes/errors.d.ts +189 -0
- package/dist/core/kubernetes/errors.d.ts.map +1 -0
- package/dist/core/kubernetes/errors.js +298 -0
- package/dist/core/kubernetes/errors.js.map +1 -0
- package/dist/core/kubernetes/index.d.ts +20 -0
- package/dist/core/kubernetes/index.d.ts.map +1 -0
- package/dist/core/kubernetes/index.js +23 -0
- package/dist/core/kubernetes/index.js.map +1 -0
- package/dist/core/kubernetes/type-guards.d.ts +142 -0
- package/dist/core/kubernetes/type-guards.d.ts.map +1 -0
- package/dist/core/kubernetes/type-guards.js +151 -0
- package/dist/core/kubernetes/type-guards.js.map +1 -0
- package/dist/core/logging/config.d.ts.map +1 -1
- package/dist/core/logging/config.js +20 -4
- package/dist/core/logging/config.js.map +1 -1
- package/dist/core/logging/logger.d.ts +3 -3
- package/dist/core/logging/logger.d.ts.map +1 -1
- package/dist/core/logging/logger.js +19 -11
- package/dist/core/logging/logger.js.map +1 -1
- package/dist/core/logging/types.d.ts +13 -8
- package/dist/core/logging/types.d.ts.map +1 -1
- package/dist/core/metadata/index.d.ts +9 -0
- package/dist/core/metadata/index.d.ts.map +1 -0
- package/dist/core/metadata/index.js +9 -0
- package/dist/core/metadata/index.js.map +1 -0
- package/dist/core/metadata/resource-metadata.d.ts +116 -0
- package/dist/core/metadata/resource-metadata.d.ts.map +1 -0
- package/dist/core/metadata/resource-metadata.js +217 -0
- package/dist/core/metadata/resource-metadata.js.map +1 -0
- package/dist/core/proxy/create-resource.d.ts +50 -0
- package/dist/core/proxy/create-resource.d.ts.map +1 -0
- package/dist/core/proxy/create-resource.js +393 -0
- package/dist/core/proxy/create-resource.js.map +1 -0
- package/dist/core/proxy/index.d.ts +8 -0
- package/dist/core/proxy/index.d.ts.map +1 -0
- package/dist/core/proxy/index.js +7 -0
- package/dist/core/proxy/index.js.map +1 -0
- package/dist/core/proxy/known-status-fields.d.ts +27 -0
- package/dist/core/proxy/known-status-fields.d.ts.map +1 -0
- package/dist/core/proxy/known-status-fields.js +185 -0
- package/dist/core/proxy/known-status-fields.js.map +1 -0
- package/dist/core/readiness/evaluator-factories.d.ts +100 -0
- package/dist/core/readiness/evaluator-factories.d.ts.map +1 -0
- package/dist/core/readiness/evaluator-factories.js +168 -0
- package/dist/core/readiness/evaluator-factories.js.map +1 -0
- package/dist/core/readiness/evaluator.d.ts +21 -0
- package/dist/core/readiness/evaluator.d.ts.map +1 -0
- package/dist/core/readiness/evaluator.js +38 -0
- package/dist/core/readiness/evaluator.js.map +1 -0
- package/dist/core/readiness/index.d.ts +3 -0
- package/dist/core/readiness/index.d.ts.map +1 -1
- package/dist/core/readiness/index.js +2 -0
- package/dist/core/readiness/index.js.map +1 -1
- package/dist/core/readiness/registry.d.ts +3 -3
- package/dist/core/readiness/registry.d.ts.map +1 -1
- package/dist/core/readiness/registry.js +2 -0
- package/dist/core/readiness/registry.js.map +1 -1
- package/dist/core/references/cel-evaluator.d.ts +11 -0
- package/dist/core/references/cel-evaluator.d.ts.map +1 -1
- package/dist/core/references/cel-evaluator.js +77 -29
- package/dist/core/references/cel-evaluator.js.map +1 -1
- package/dist/core/references/cel.d.ts +66 -23
- package/dist/core/references/cel.d.ts.map +1 -1
- package/dist/core/references/cel.js +184 -117
- package/dist/core/references/cel.js.map +1 -1
- package/dist/core/references/external-refs.d.ts +39 -21
- package/dist/core/references/external-refs.d.ts.map +1 -1
- package/dist/core/references/external-refs.js +70 -30
- package/dist/core/references/external-refs.js.map +1 -1
- package/dist/core/references/index.d.ts +5 -4
- package/dist/core/references/index.d.ts.map +1 -1
- package/dist/core/references/index.js +6 -6
- package/dist/core/references/index.js.map +1 -1
- package/dist/core/references/resolver.d.ts +26 -3
- package/dist/core/references/resolver.d.ts.map +1 -1
- package/dist/core/references/resolver.js +322 -47
- package/dist/core/references/resolver.js.map +1 -1
- package/dist/core/references/schema-proxy.d.ts.map +1 -1
- package/dist/core/references/schema-proxy.js +105 -14
- package/dist/core/references/schema-proxy.js.map +1 -1
- package/dist/core/resources/factory-registry.d.ts +99 -0
- package/dist/core/resources/factory-registry.d.ts.map +1 -0
- package/dist/core/resources/factory-registry.js +166 -0
- package/dist/core/resources/factory-registry.js.map +1 -0
- package/dist/core/resources/id.d.ts +44 -0
- package/dist/core/resources/id.d.ts.map +1 -0
- package/dist/core/resources/id.js +78 -0
- package/dist/core/resources/id.js.map +1 -0
- package/dist/core/resources/index.d.ts +7 -0
- package/dist/core/resources/index.d.ts.map +1 -0
- package/dist/core/resources/index.js +6 -0
- package/dist/core/resources/index.js.map +1 -0
- package/dist/core/runtime-patches/crd-patcher.d.ts +30 -0
- package/dist/core/runtime-patches/crd-patcher.d.ts.map +1 -0
- package/dist/core/runtime-patches/crd-patcher.js +124 -0
- package/dist/core/runtime-patches/crd-patcher.js.map +1 -0
- package/dist/core/runtime-patches/crd-schema-fix.d.ts +145 -0
- package/dist/core/runtime-patches/crd-schema-fix.d.ts.map +1 -0
- package/dist/core/runtime-patches/crd-schema-fix.js +349 -0
- package/dist/core/runtime-patches/crd-schema-fix.js.map +1 -0
- package/dist/core/runtime-patches/index.d.ts +8 -0
- package/dist/core/runtime-patches/index.d.ts.map +1 -0
- package/dist/core/runtime-patches/index.js +8 -0
- package/dist/core/runtime-patches/index.js.map +1 -0
- package/dist/core/{evaluation → serialization}/cel-optimizer.d.ts +2 -2
- package/dist/core/serialization/cel-optimizer.d.ts.map +1 -0
- package/dist/core/{evaluation → serialization}/cel-optimizer.js +11 -23
- package/dist/core/serialization/cel-optimizer.js.map +1 -0
- package/dist/core/serialization/cel-references.d.ts +36 -0
- package/dist/core/serialization/cel-references.d.ts.map +1 -0
- package/dist/core/serialization/cel-references.js +183 -0
- package/dist/core/serialization/cel-references.js.map +1 -0
- package/dist/core/serialization/core.d.ts +168 -3
- package/dist/core/serialization/core.d.ts.map +1 -1
- package/dist/core/serialization/core.js +392 -691
- package/dist/core/serialization/core.js.map +1 -1
- package/dist/core/serialization/index.d.ts +3 -1
- package/dist/core/serialization/index.d.ts.map +1 -1
- package/dist/core/serialization/index.js +5 -1
- package/dist/core/serialization/index.js.map +1 -1
- package/dist/core/serialization/schema.d.ts +34 -3
- package/dist/core/serialization/schema.d.ts.map +1 -1
- package/dist/core/serialization/schema.js +141 -11
- package/dist/core/serialization/schema.js.map +1 -1
- package/dist/core/serialization/status-analysis-helpers.d.ts +68 -0
- package/dist/core/serialization/status-analysis-helpers.d.ts.map +1 -0
- package/dist/core/serialization/status-analysis-helpers.js +284 -0
- package/dist/core/serialization/status-analysis-helpers.js.map +1 -0
- package/dist/core/serialization/status-analysis-pipeline.d.ts +63 -0
- package/dist/core/serialization/status-analysis-pipeline.d.ts.map +1 -0
- package/dist/core/serialization/status-analysis-pipeline.js +419 -0
- package/dist/core/serialization/status-analysis-pipeline.js.map +1 -0
- package/dist/core/serialization/validation.d.ts.map +1 -1
- package/dist/core/serialization/validation.js +5 -3
- package/dist/core/serialization/validation.js.map +1 -1
- package/dist/core/serialization/yaml.d.ts +14 -3
- package/dist/core/serialization/yaml.d.ts.map +1 -1
- package/dist/core/serialization/yaml.js +453 -13
- package/dist/core/serialization/yaml.js.map +1 -1
- package/dist/core/types/common.d.ts +66 -9
- package/dist/core/types/common.d.ts.map +1 -1
- package/dist/core/types/deployment.d.ts +289 -81
- package/dist/core/types/deployment.d.ts.map +1 -1
- package/dist/core/types/deployment.js +1 -23
- package/dist/core/types/deployment.js.map +1 -1
- package/dist/core/types/index.d.ts +6 -10
- package/dist/core/types/index.d.ts.map +1 -1
- package/dist/core/types/index.js +32 -4
- package/dist/core/types/index.js.map +1 -1
- package/dist/core/types/kubernetes.d.ts +371 -19
- package/dist/core/types/kubernetes.d.ts.map +1 -1
- package/dist/core/types/kubernetes.js +11 -1
- package/dist/core/types/kubernetes.js.map +1 -1
- package/dist/core/types/references.d.ts +74 -4
- package/dist/core/types/references.d.ts.map +1 -1
- package/dist/core/types/references.js +3 -2
- package/dist/core/types/references.js.map +1 -1
- package/dist/core/types/resource-graph.d.ts +9 -33
- package/dist/core/types/resource-graph.d.ts.map +1 -1
- package/dist/core/types/resource-graph.js +2 -2
- package/dist/core/types/schema.d.ts +51 -0
- package/dist/core/types/schema.d.ts.map +1 -0
- package/dist/core/types/schema.js +9 -0
- package/dist/core/types/schema.js.map +1 -0
- package/dist/core/types/serialization.d.ts +105 -35
- package/dist/core/types/serialization.d.ts.map +1 -1
- package/dist/core/types/yaml.d.ts +0 -24
- package/dist/core/types/yaml.d.ts.map +1 -1
- package/dist/core/validation/cel-validator.d.ts +5 -5
- package/dist/core/validation/cel-validator.d.ts.map +1 -1
- package/dist/core/validation/cel-validator.js +83 -19
- package/dist/core/validation/cel-validator.js.map +1 -1
- package/dist/core/yaml/path-resolver.d.ts +21 -6
- package/dist/core/yaml/path-resolver.d.ts.map +1 -1
- package/dist/core/yaml/path-resolver.js +404 -38
- package/dist/core/yaml/path-resolver.js.map +1 -1
- package/dist/factories/apisix/compositions/apisix-bootstrap.d.ts +42 -0
- package/dist/factories/apisix/compositions/apisix-bootstrap.d.ts.map +1 -0
- package/dist/factories/apisix/compositions/apisix-bootstrap.js +267 -0
- package/dist/factories/apisix/compositions/apisix-bootstrap.js.map +1 -0
- package/dist/factories/apisix/compositions/index.d.ts +5 -0
- package/dist/factories/apisix/compositions/index.d.ts.map +1 -0
- package/dist/factories/apisix/compositions/index.js +5 -0
- package/dist/factories/apisix/compositions/index.js.map +1 -0
- package/dist/factories/apisix/index.d.ts +11 -0
- package/dist/factories/apisix/index.d.ts.map +1 -0
- package/dist/factories/apisix/index.js +11 -0
- package/dist/factories/apisix/index.js.map +1 -0
- package/dist/factories/apisix/resources/helm.d.ts +59 -0
- package/dist/factories/apisix/resources/helm.d.ts.map +1 -0
- package/dist/factories/apisix/resources/helm.js +148 -0
- package/dist/factories/apisix/resources/helm.js.map +1 -0
- package/dist/factories/apisix/resources/index.d.ts +5 -0
- package/dist/factories/apisix/resources/index.d.ts.map +1 -0
- package/dist/factories/apisix/resources/index.js +5 -0
- package/dist/factories/apisix/resources/index.js.map +1 -0
- package/dist/factories/apisix/types.d.ts +372 -0
- package/dist/factories/apisix/types.d.ts.map +1 -0
- package/dist/factories/apisix/types.js +88 -0
- package/dist/factories/apisix/types.js.map +1 -0
- package/dist/factories/apisix/utils/admin-credentials.d.ts +43 -0
- package/dist/factories/apisix/utils/admin-credentials.d.ts.map +1 -0
- package/dist/factories/apisix/utils/admin-credentials.js +82 -0
- package/dist/factories/apisix/utils/admin-credentials.js.map +1 -0
- package/dist/factories/apisix/utils/helm-values-mapper.d.ts +19 -0
- package/dist/factories/apisix/utils/helm-values-mapper.d.ts.map +1 -0
- package/dist/factories/apisix/utils/helm-values-mapper.js +106 -0
- package/dist/factories/apisix/utils/helm-values-mapper.js.map +1 -0
- package/dist/factories/apisix/utils/index.d.ts +6 -0
- package/dist/factories/apisix/utils/index.d.ts.map +1 -0
- package/dist/factories/apisix/utils/index.js +6 -0
- package/dist/factories/apisix/utils/index.js.map +1 -0
- package/dist/factories/cert-manager/compositions/cert-manager-bootstrap.d.ts +45 -0
- package/dist/factories/cert-manager/compositions/cert-manager-bootstrap.d.ts.map +1 -0
- package/dist/factories/cert-manager/compositions/cert-manager-bootstrap.js +309 -0
- package/dist/factories/cert-manager/compositions/cert-manager-bootstrap.js.map +1 -0
- package/dist/factories/cert-manager/compositions/index.d.ts +2 -0
- package/dist/factories/cert-manager/compositions/index.d.ts.map +1 -0
- package/dist/factories/cert-manager/compositions/index.js +2 -0
- package/dist/factories/cert-manager/compositions/index.js.map +1 -0
- package/dist/factories/cert-manager/index.d.ts +10 -0
- package/dist/factories/cert-manager/index.d.ts.map +1 -0
- package/dist/factories/cert-manager/index.js +19 -0
- package/dist/factories/cert-manager/index.js.map +1 -0
- package/dist/factories/cert-manager/resources/certificates.d.ts +39 -0
- package/dist/factories/cert-manager/resources/certificates.d.ts.map +1 -0
- package/dist/factories/cert-manager/resources/certificates.js +97 -0
- package/dist/factories/cert-manager/resources/certificates.js.map +1 -0
- package/dist/factories/cert-manager/resources/challenges.d.ts +113 -0
- package/dist/factories/cert-manager/resources/challenges.d.ts.map +1 -0
- package/dist/factories/cert-manager/resources/challenges.js +281 -0
- package/dist/factories/cert-manager/resources/challenges.js.map +1 -0
- package/dist/factories/cert-manager/resources/helm.d.ts +37 -0
- package/dist/factories/cert-manager/resources/helm.d.ts.map +1 -0
- package/dist/factories/cert-manager/resources/helm.js +253 -0
- package/dist/factories/cert-manager/resources/helm.js.map +1 -0
- package/dist/factories/cert-manager/resources/index.d.ts +5 -0
- package/dist/factories/cert-manager/resources/index.d.ts.map +1 -0
- package/dist/factories/cert-manager/resources/index.js +6 -0
- package/dist/factories/cert-manager/resources/index.js.map +1 -0
- package/dist/factories/cert-manager/resources/issuers.d.ts +79 -0
- package/dist/factories/cert-manager/resources/issuers.d.ts.map +1 -0
- package/dist/factories/cert-manager/resources/issuers.js +109 -0
- package/dist/factories/cert-manager/resources/issuers.js.map +1 -0
- package/dist/factories/cert-manager/types.d.ts +942 -0
- package/dist/factories/cert-manager/types.d.ts.map +1 -0
- package/dist/factories/cert-manager/types.js +178 -0
- package/dist/factories/cert-manager/types.js.map +1 -0
- package/dist/factories/cert-manager/utils/helm-values-mapper.d.ts +23 -0
- package/dist/factories/cert-manager/utils/helm-values-mapper.d.ts.map +1 -0
- package/dist/factories/cert-manager/utils/helm-values-mapper.js +116 -0
- package/dist/factories/cert-manager/utils/helm-values-mapper.js.map +1 -0
- package/dist/factories/cert-manager/utils/index.d.ts +2 -0
- package/dist/factories/cert-manager/utils/index.d.ts.map +1 -0
- package/dist/factories/cert-manager/utils/index.js +2 -0
- package/dist/factories/cert-manager/utils/index.js.map +1 -0
- package/dist/factories/cilium/compositions/cilium-bootstrap.d.ts +220 -0
- package/dist/factories/cilium/compositions/cilium-bootstrap.d.ts.map +1 -0
- package/dist/factories/cilium/compositions/cilium-bootstrap.js +321 -0
- package/dist/factories/cilium/compositions/cilium-bootstrap.js.map +1 -0
- package/dist/factories/cilium/compositions/index.d.ts +8 -0
- package/dist/factories/cilium/compositions/index.d.ts.map +1 -0
- package/dist/factories/cilium/compositions/index.js +11 -0
- package/dist/factories/cilium/compositions/index.js.map +1 -0
- package/dist/factories/cilium/errors.d.ts +41 -0
- package/dist/factories/cilium/errors.d.ts.map +1 -0
- package/dist/factories/cilium/errors.js +75 -0
- package/dist/factories/cilium/errors.js.map +1 -0
- package/dist/factories/cilium/index.d.ts +11 -0
- package/dist/factories/cilium/index.d.ts.map +1 -0
- package/dist/factories/cilium/index.js +23 -0
- package/dist/factories/cilium/index.js.map +1 -0
- package/dist/factories/cilium/resources/gateway.d.ts +72 -0
- package/dist/factories/cilium/resources/gateway.d.ts.map +1 -0
- package/dist/factories/cilium/resources/gateway.js +116 -0
- package/dist/factories/cilium/resources/gateway.js.map +1 -0
- package/dist/factories/cilium/resources/helm.d.ts +93 -0
- package/dist/factories/cilium/resources/helm.d.ts.map +1 -0
- package/dist/factories/cilium/resources/helm.js +369 -0
- package/dist/factories/cilium/resources/helm.js.map +1 -0
- package/dist/factories/cilium/resources/index.d.ts +10 -0
- package/dist/factories/cilium/resources/index.d.ts.map +1 -0
- package/dist/factories/cilium/resources/index.js +19 -0
- package/dist/factories/cilium/resources/index.js.map +1 -0
- package/dist/factories/cilium/resources/networking.d.ts +198 -0
- package/dist/factories/cilium/resources/networking.d.ts.map +1 -0
- package/dist/factories/cilium/resources/networking.js +482 -0
- package/dist/factories/cilium/resources/networking.js.map +1 -0
- package/dist/factories/cilium/types.d.ts +957 -0
- package/dist/factories/cilium/types.d.ts.map +1 -0
- package/dist/factories/cilium/types.js +10 -0
- package/dist/factories/cilium/types.js.map +1 -0
- package/dist/factories/external-dns/compositions/external-dns-bootstrap.d.ts +32 -0
- package/dist/factories/external-dns/compositions/external-dns-bootstrap.d.ts.map +1 -0
- package/dist/factories/external-dns/compositions/external-dns-bootstrap.js +146 -0
- package/dist/factories/external-dns/compositions/external-dns-bootstrap.js.map +1 -0
- package/dist/factories/external-dns/compositions/index.d.ts +2 -0
- package/dist/factories/external-dns/compositions/index.d.ts.map +1 -0
- package/dist/factories/external-dns/compositions/index.js +3 -0
- package/dist/factories/external-dns/compositions/index.js.map +1 -0
- package/dist/factories/external-dns/index.d.ts +10 -0
- package/dist/factories/external-dns/index.d.ts.map +1 -0
- package/dist/factories/external-dns/index.js +19 -0
- package/dist/factories/external-dns/index.js.map +1 -0
- package/dist/factories/external-dns/resources/dns-endpoint.d.ts +54 -0
- package/dist/factories/external-dns/resources/dns-endpoint.d.ts.map +1 -0
- package/dist/factories/external-dns/resources/dns-endpoint.js +53 -0
- package/dist/factories/external-dns/resources/dns-endpoint.js.map +1 -0
- package/dist/factories/external-dns/resources/helm.d.ts +57 -0
- package/dist/factories/external-dns/resources/helm.d.ts.map +1 -0
- package/dist/factories/external-dns/resources/helm.js +440 -0
- package/dist/factories/external-dns/resources/helm.js.map +1 -0
- package/dist/factories/external-dns/resources/index.d.ts +3 -0
- package/dist/factories/external-dns/resources/index.d.ts.map +1 -0
- package/dist/factories/external-dns/resources/index.js +4 -0
- package/dist/factories/external-dns/resources/index.js.map +1 -0
- package/dist/factories/external-dns/types.d.ts +180 -0
- package/dist/factories/external-dns/types.d.ts.map +1 -0
- package/dist/factories/external-dns/types.js +39 -0
- package/dist/factories/external-dns/types.js.map +1 -0
- package/dist/factories/flux/git-repository.d.ts +14 -4
- package/dist/factories/flux/git-repository.d.ts.map +1 -1
- package/dist/factories/flux/git-repository.js +33 -0
- package/dist/factories/flux/git-repository.js.map +1 -1
- package/dist/factories/flux/kustomize/kustomization.d.ts +2 -0
- package/dist/factories/flux/kustomize/kustomization.d.ts.map +1 -1
- package/dist/factories/flux/kustomize/kustomization.js.map +1 -1
- package/dist/factories/flux/kustomize/readiness-evaluators.d.ts +1 -1
- package/dist/factories/flux/kustomize/readiness-evaluators.d.ts.map +1 -1
- package/dist/factories/flux/kustomize/readiness-evaluators.js +3 -1
- package/dist/factories/flux/kustomize/readiness-evaluators.js.map +1 -1
- package/dist/factories/helm/helm-release.d.ts +13 -0
- package/dist/factories/helm/helm-release.d.ts.map +1 -1
- package/dist/factories/helm/helm-release.js +35 -16
- package/dist/factories/helm/helm-release.js.map +1 -1
- package/dist/factories/helm/helm-repository.d.ts +26 -1
- package/dist/factories/helm/helm-repository.d.ts.map +1 -1
- package/dist/factories/helm/helm-repository.js +30 -17
- package/dist/factories/helm/helm-repository.js.map +1 -1
- package/dist/factories/helm/index.d.ts +10 -4
- package/dist/factories/helm/index.d.ts.map +1 -1
- package/dist/factories/helm/index.js +10 -4
- package/dist/factories/helm/index.js.map +1 -1
- package/dist/factories/helm/readiness-evaluators.d.ts +21 -8
- package/dist/factories/helm/readiness-evaluators.d.ts.map +1 -1
- package/dist/factories/helm/readiness-evaluators.js +98 -82
- package/dist/factories/helm/readiness-evaluators.js.map +1 -1
- package/dist/factories/helm/types.d.ts +37 -3
- package/dist/factories/helm/types.d.ts.map +1 -1
- package/dist/factories/index.d.ts +8 -3
- package/dist/factories/index.d.ts.map +1 -1
- package/dist/factories/index.js +27 -4
- package/dist/factories/index.js.map +1 -1
- package/dist/factories/kro/kro-crd.d.ts.map +1 -1
- package/dist/factories/kro/kro-crd.js +3 -2
- package/dist/factories/kro/kro-crd.js.map +1 -1
- package/dist/factories/kro/kro-custom-resource.d.ts.map +1 -1
- package/dist/factories/kro/kro-custom-resource.js +3 -2
- package/dist/factories/kro/kro-custom-resource.js.map +1 -1
- package/dist/factories/kro/resource-graph-definition.d.ts +29 -1
- package/dist/factories/kro/resource-graph-definition.d.ts.map +1 -1
- package/dist/factories/kro/resource-graph-definition.js +26 -8
- package/dist/factories/kro/resource-graph-definition.js.map +1 -1
- package/dist/factories/kubernetes/admission/mutating-webhook-configuration.d.ts +3 -2
- package/dist/factories/kubernetes/admission/mutating-webhook-configuration.d.ts.map +1 -1
- package/dist/factories/kubernetes/admission/mutating-webhook-configuration.js +3 -2
- package/dist/factories/kubernetes/admission/mutating-webhook-configuration.js.map +1 -1
- package/dist/factories/kubernetes/admission/validating-webhook-configuration.d.ts +3 -2
- package/dist/factories/kubernetes/admission/validating-webhook-configuration.d.ts.map +1 -1
- package/dist/factories/kubernetes/admission/validating-webhook-configuration.js +3 -2
- package/dist/factories/kubernetes/admission/validating-webhook-configuration.js.map +1 -1
- package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler-v1.d.ts +3 -1
- package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler-v1.d.ts.map +1 -1
- package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler-v1.js.map +1 -1
- package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler.d.ts +3 -1
- package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler.d.ts.map +1 -1
- package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler.js +2 -1
- package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler.js.map +1 -1
- package/dist/factories/kubernetes/certificates/certificate-signing-request.d.ts +3 -1
- package/dist/factories/kubernetes/certificates/certificate-signing-request.d.ts.map +1 -1
- package/dist/factories/kubernetes/certificates/certificate-signing-request.js.map +1 -1
- package/dist/factories/kubernetes/config/config-map.d.ts +17 -1
- package/dist/factories/kubernetes/config/config-map.d.ts.map +1 -1
- package/dist/factories/kubernetes/config/config-map.js +25 -7
- package/dist/factories/kubernetes/config/config-map.js.map +1 -1
- package/dist/factories/kubernetes/config/secret.d.ts +23 -1
- package/dist/factories/kubernetes/config/secret.d.ts.map +1 -1
- package/dist/factories/kubernetes/config/secret.js +31 -7
- package/dist/factories/kubernetes/config/secret.js.map +1 -1
- package/dist/factories/kubernetes/coordination/lease.d.ts +3 -1
- package/dist/factories/kubernetes/coordination/lease.d.ts.map +1 -1
- package/dist/factories/kubernetes/coordination/lease.js +2 -1
- package/dist/factories/kubernetes/coordination/lease.js.map +1 -1
- package/dist/factories/kubernetes/core/component-status.d.ts +3 -1
- package/dist/factories/kubernetes/core/component-status.d.ts.map +1 -1
- package/dist/factories/kubernetes/core/component-status.js.map +1 -1
- package/dist/factories/kubernetes/core/namespace.d.ts +10 -0
- package/dist/factories/kubernetes/core/namespace.d.ts.map +1 -1
- package/dist/factories/kubernetes/core/namespace.js +13 -2
- package/dist/factories/kubernetes/core/namespace.js.map +1 -1
- package/dist/factories/kubernetes/core/node.d.ts +3 -1
- package/dist/factories/kubernetes/core/node.d.ts.map +1 -1
- package/dist/factories/kubernetes/core/node.js.map +1 -1
- package/dist/factories/kubernetes/core/pod.d.ts +3 -1
- package/dist/factories/kubernetes/core/pod.d.ts.map +1 -1
- package/dist/factories/kubernetes/core/pod.js +2 -1
- package/dist/factories/kubernetes/core/pod.js.map +1 -1
- package/dist/factories/kubernetes/extensions/custom-resource-definition.d.ts +3 -1
- package/dist/factories/kubernetes/extensions/custom-resource-definition.d.ts.map +1 -1
- package/dist/factories/kubernetes/extensions/custom-resource-definition.js.map +1 -1
- package/dist/factories/kubernetes/extensions/custom-resource.d.ts +1 -0
- package/dist/factories/kubernetes/extensions/custom-resource.d.ts.map +1 -1
- package/dist/factories/kubernetes/extensions/custom-resource.js +5 -1
- package/dist/factories/kubernetes/extensions/custom-resource.js.map +1 -1
- package/dist/factories/kubernetes/index.d.ts +0 -2
- package/dist/factories/kubernetes/index.d.ts.map +1 -1
- package/dist/factories/kubernetes/index.js +3 -8
- package/dist/factories/kubernetes/index.js.map +1 -1
- package/dist/factories/kubernetes/networking/endpoint-slice.d.ts +3 -1
- package/dist/factories/kubernetes/networking/endpoint-slice.d.ts.map +1 -1
- package/dist/factories/kubernetes/networking/endpoint-slice.js.map +1 -1
- package/dist/factories/kubernetes/networking/endpoints.d.ts +3 -1
- package/dist/factories/kubernetes/networking/endpoints.d.ts.map +1 -1
- package/dist/factories/kubernetes/networking/endpoints.js +3 -2
- package/dist/factories/kubernetes/networking/endpoints.js.map +1 -1
- package/dist/factories/kubernetes/networking/ingress-class.d.ts +3 -1
- package/dist/factories/kubernetes/networking/ingress-class.d.ts.map +1 -1
- package/dist/factories/kubernetes/networking/ingress-class.js +2 -7
- package/dist/factories/kubernetes/networking/ingress-class.js.map +1 -1
- package/dist/factories/kubernetes/networking/ingress.d.ts +15 -2
- package/dist/factories/kubernetes/networking/ingress.d.ts.map +1 -1
- package/dist/factories/kubernetes/networking/ingress.js +64 -11
- package/dist/factories/kubernetes/networking/ingress.js.map +1 -1
- package/dist/factories/kubernetes/networking/network-policy.d.ts +3 -1
- package/dist/factories/kubernetes/networking/network-policy.d.ts.map +1 -1
- package/dist/factories/kubernetes/networking/network-policy.js +2 -8
- package/dist/factories/kubernetes/networking/network-policy.js.map +1 -1
- package/dist/factories/kubernetes/networking/service.d.ts +14 -1
- package/dist/factories/kubernetes/networking/service.d.ts.map +1 -1
- package/dist/factories/kubernetes/networking/service.js +28 -3
- package/dist/factories/kubernetes/networking/service.js.map +1 -1
- package/dist/factories/kubernetes/policy/limit-range.d.ts +3 -1
- package/dist/factories/kubernetes/policy/limit-range.d.ts.map +1 -1
- package/dist/factories/kubernetes/policy/limit-range.js +2 -8
- package/dist/factories/kubernetes/policy/limit-range.js.map +1 -1
- package/dist/factories/kubernetes/policy/pod-disruption-budget.d.ts +3 -1
- package/dist/factories/kubernetes/policy/pod-disruption-budget.d.ts.map +1 -1
- package/dist/factories/kubernetes/policy/pod-disruption-budget.js +3 -2
- package/dist/factories/kubernetes/policy/pod-disruption-budget.js.map +1 -1
- package/dist/factories/kubernetes/policy/resource-quota.d.ts +3 -1
- package/dist/factories/kubernetes/policy/resource-quota.d.ts.map +1 -1
- package/dist/factories/kubernetes/policy/resource-quota.js +3 -2
- package/dist/factories/kubernetes/policy/resource-quota.js.map +1 -1
- package/dist/factories/kubernetes/rbac/cluster-role-binding.d.ts +20 -1
- package/dist/factories/kubernetes/rbac/cluster-role-binding.d.ts.map +1 -1
- package/dist/factories/kubernetes/rbac/cluster-role-binding.js +19 -8
- package/dist/factories/kubernetes/rbac/cluster-role-binding.js.map +1 -1
- package/dist/factories/kubernetes/rbac/cluster-role.d.ts +3 -1
- package/dist/factories/kubernetes/rbac/cluster-role.d.ts.map +1 -1
- package/dist/factories/kubernetes/rbac/cluster-role.js +2 -8
- package/dist/factories/kubernetes/rbac/cluster-role.js.map +1 -1
- package/dist/factories/kubernetes/rbac/role-binding.d.ts +3 -1
- package/dist/factories/kubernetes/rbac/role-binding.d.ts.map +1 -1
- package/dist/factories/kubernetes/rbac/role-binding.js +2 -8
- package/dist/factories/kubernetes/rbac/role-binding.js.map +1 -1
- package/dist/factories/kubernetes/rbac/role.d.ts +3 -1
- package/dist/factories/kubernetes/rbac/role.d.ts.map +1 -1
- package/dist/factories/kubernetes/rbac/role.js +2 -8
- package/dist/factories/kubernetes/rbac/role.js.map +1 -1
- package/dist/factories/kubernetes/rbac/service-account.d.ts +3 -1
- package/dist/factories/kubernetes/rbac/service-account.d.ts.map +1 -1
- package/dist/factories/kubernetes/rbac/service-account.js +2 -8
- package/dist/factories/kubernetes/rbac/service-account.js.map +1 -1
- package/dist/factories/kubernetes/scheduling/priority-class.d.ts +3 -1
- package/dist/factories/kubernetes/scheduling/priority-class.d.ts.map +1 -1
- package/dist/factories/kubernetes/scheduling/priority-class.js +2 -7
- package/dist/factories/kubernetes/scheduling/priority-class.js.map +1 -1
- package/dist/factories/kubernetes/scheduling/runtime-class.d.ts +3 -2
- package/dist/factories/kubernetes/scheduling/runtime-class.d.ts.map +1 -1
- package/dist/factories/kubernetes/scheduling/runtime-class.js +2 -1
- package/dist/factories/kubernetes/scheduling/runtime-class.js.map +1 -1
- package/dist/factories/kubernetes/storage/csi-driver.d.ts +3 -1
- package/dist/factories/kubernetes/storage/csi-driver.d.ts.map +1 -1
- package/dist/factories/kubernetes/storage/csi-driver.js +2 -7
- package/dist/factories/kubernetes/storage/csi-driver.js.map +1 -1
- package/dist/factories/kubernetes/storage/csi-node.d.ts +3 -1
- package/dist/factories/kubernetes/storage/csi-node.d.ts.map +1 -1
- package/dist/factories/kubernetes/storage/csi-node.js +2 -1
- package/dist/factories/kubernetes/storage/csi-node.js.map +1 -1
- package/dist/factories/kubernetes/storage/persistent-volume-claim.d.ts +14 -1
- package/dist/factories/kubernetes/storage/persistent-volume-claim.d.ts.map +1 -1
- package/dist/factories/kubernetes/storage/persistent-volume-claim.js +13 -1
- package/dist/factories/kubernetes/storage/persistent-volume-claim.js.map +1 -1
- package/dist/factories/kubernetes/storage/persistent-volume.d.ts +3 -1
- package/dist/factories/kubernetes/storage/persistent-volume.d.ts.map +1 -1
- package/dist/factories/kubernetes/storage/persistent-volume.js +3 -2
- package/dist/factories/kubernetes/storage/persistent-volume.js.map +1 -1
- package/dist/factories/kubernetes/storage/storage-class.d.ts +3 -1
- package/dist/factories/kubernetes/storage/storage-class.d.ts.map +1 -1
- package/dist/factories/kubernetes/storage/storage-class.js +2 -8
- package/dist/factories/kubernetes/storage/storage-class.js.map +1 -1
- package/dist/factories/kubernetes/storage/volume-attachment.d.ts +3 -1
- package/dist/factories/kubernetes/storage/volume-attachment.d.ts.map +1 -1
- package/dist/factories/kubernetes/storage/volume-attachment.js +10 -0
- package/dist/factories/kubernetes/storage/volume-attachment.js.map +1 -1
- package/dist/factories/kubernetes/workloads/cron-job.d.ts +14 -1
- package/dist/factories/kubernetes/workloads/cron-job.d.ts.map +1 -1
- package/dist/factories/kubernetes/workloads/cron-job.js +14 -2
- package/dist/factories/kubernetes/workloads/cron-job.js.map +1 -1
- package/dist/factories/kubernetes/workloads/daemon-set.d.ts +14 -1
- package/dist/factories/kubernetes/workloads/daemon-set.d.ts.map +1 -1
- package/dist/factories/kubernetes/workloads/daemon-set.js +13 -1
- package/dist/factories/kubernetes/workloads/daemon-set.js.map +1 -1
- package/dist/factories/kubernetes/workloads/deployment.d.ts +14 -1
- package/dist/factories/kubernetes/workloads/deployment.d.ts.map +1 -1
- package/dist/factories/kubernetes/workloads/deployment.js +35 -5
- package/dist/factories/kubernetes/workloads/deployment.js.map +1 -1
- package/dist/factories/kubernetes/workloads/job.d.ts +14 -1
- package/dist/factories/kubernetes/workloads/job.d.ts.map +1 -1
- package/dist/factories/kubernetes/workloads/job.js +19 -2
- package/dist/factories/kubernetes/workloads/job.js.map +1 -1
- package/dist/factories/kubernetes/workloads/replica-set.d.ts +3 -1
- package/dist/factories/kubernetes/workloads/replica-set.d.ts.map +1 -1
- package/dist/factories/kubernetes/workloads/replica-set.js +2 -1
- package/dist/factories/kubernetes/workloads/replica-set.js.map +1 -1
- package/dist/factories/kubernetes/workloads/replication-controller.d.ts +3 -1
- package/dist/factories/kubernetes/workloads/replication-controller.d.ts.map +1 -1
- package/dist/factories/kubernetes/workloads/replication-controller.js +3 -2
- package/dist/factories/kubernetes/workloads/replication-controller.js.map +1 -1
- package/dist/factories/kubernetes/workloads/stateful-set.d.ts +14 -1
- package/dist/factories/kubernetes/workloads/stateful-set.d.ts.map +1 -1
- package/dist/factories/kubernetes/workloads/stateful-set.js +22 -2
- package/dist/factories/kubernetes/workloads/stateful-set.js.map +1 -1
- package/dist/factories/kubernetes/yaml/conflict-handler.d.ts +23 -0
- package/dist/factories/kubernetes/yaml/conflict-handler.d.ts.map +1 -0
- package/dist/factories/kubernetes/yaml/conflict-handler.js +83 -0
- package/dist/factories/kubernetes/yaml/conflict-handler.js.map +1 -0
- package/dist/factories/kubernetes/yaml/yaml-directory.d.ts +6 -11
- package/dist/factories/kubernetes/yaml/yaml-directory.d.ts.map +1 -1
- package/dist/factories/kubernetes/yaml/yaml-directory.js +10 -75
- package/dist/factories/kubernetes/yaml/yaml-directory.js.map +1 -1
- package/dist/factories/kubernetes/yaml/yaml-file.d.ts +72 -13
- package/dist/factories/kubernetes/yaml/yaml-file.d.ts.map +1 -1
- package/dist/factories/kubernetes/yaml/yaml-file.js +271 -91
- package/dist/factories/kubernetes/yaml/yaml-file.js.map +1 -1
- package/dist/factories/pebble/compositions/index.d.ts +2 -0
- package/dist/factories/pebble/compositions/index.d.ts.map +1 -0
- package/dist/factories/pebble/compositions/index.js +3 -0
- package/dist/factories/pebble/compositions/index.js.map +1 -0
- package/dist/factories/pebble/compositions/pebble-bootstrap.d.ts +56 -0
- package/dist/factories/pebble/compositions/pebble-bootstrap.d.ts.map +1 -0
- package/dist/factories/pebble/compositions/pebble-bootstrap.js +95 -0
- package/dist/factories/pebble/compositions/pebble-bootstrap.js.map +1 -0
- package/dist/factories/pebble/index.d.ts +10 -0
- package/dist/factories/pebble/index.d.ts.map +1 -0
- package/dist/factories/pebble/index.js +19 -0
- package/dist/factories/pebble/index.js.map +1 -0
- package/dist/factories/pebble/resources/helm.d.ts +99 -0
- package/dist/factories/pebble/resources/helm.d.ts.map +1 -0
- package/dist/factories/pebble/resources/helm.js +148 -0
- package/dist/factories/pebble/resources/helm.js.map +1 -0
- package/dist/factories/pebble/resources/index.d.ts +2 -0
- package/dist/factories/pebble/resources/index.d.ts.map +1 -0
- package/dist/factories/pebble/resources/index.js +3 -0
- package/dist/factories/pebble/resources/index.js.map +1 -0
- package/dist/factories/pebble/types.d.ts +184 -0
- package/dist/factories/pebble/types.d.ts.map +1 -0
- package/dist/factories/pebble/types.js +23 -0
- package/dist/factories/pebble/types.js.map +1 -0
- package/dist/factories/pebble/utils/helm-values-mapper.d.ts +21 -0
- package/dist/factories/pebble/utils/helm-values-mapper.d.ts.map +1 -0
- package/dist/factories/pebble/utils/helm-values-mapper.js +96 -0
- package/dist/factories/pebble/utils/helm-values-mapper.js.map +1 -0
- package/dist/factories/shared.d.ts +12 -54
- package/dist/factories/shared.d.ts.map +1 -1
- package/dist/factories/shared.js +10 -450
- package/dist/factories/shared.js.map +1 -1
- package/dist/factories/simple/autoscaling/horizontal-pod-autoscaler.d.ts +11 -0
- package/dist/factories/simple/autoscaling/horizontal-pod-autoscaler.d.ts.map +1 -1
- package/dist/factories/simple/autoscaling/horizontal-pod-autoscaler.js +12 -0
- package/dist/factories/simple/autoscaling/horizontal-pod-autoscaler.js.map +1 -1
- package/dist/factories/simple/compositions/web-service.d.ts +35 -0
- package/dist/factories/simple/compositions/web-service.d.ts.map +1 -0
- package/dist/{core/composition/composition.js → factories/simple/compositions/web-service.js} +15 -2
- package/dist/factories/simple/compositions/web-service.js.map +1 -0
- package/dist/factories/simple/config/config-map.d.ts +18 -2
- package/dist/factories/simple/config/config-map.d.ts.map +1 -1
- package/dist/factories/simple/config/config-map.js +14 -0
- package/dist/factories/simple/config/config-map.js.map +1 -1
- package/dist/factories/simple/config/secret.d.ts +22 -2
- package/dist/factories/simple/config/secret.d.ts.map +1 -1
- package/dist/factories/simple/config/secret.js +39 -3
- package/dist/factories/simple/config/secret.js.map +1 -1
- package/dist/factories/simple/helm/index.d.ts +10 -0
- package/dist/factories/simple/helm/index.d.ts.map +1 -1
- package/dist/factories/simple/helm/index.js +10 -0
- package/dist/factories/simple/helm/index.js.map +1 -1
- package/dist/factories/simple/index.d.ts +1 -1
- package/dist/factories/simple/networking/ingress.d.ts +14 -2
- package/dist/factories/simple/networking/ingress.d.ts.map +1 -1
- package/dist/factories/simple/networking/ingress.js +12 -0
- package/dist/factories/simple/networking/ingress.js.map +1 -1
- package/dist/factories/simple/networking/network-policy.d.ts +11 -1
- package/dist/factories/simple/networking/network-policy.d.ts.map +1 -1
- package/dist/factories/simple/networking/network-policy.js +10 -0
- package/dist/factories/simple/networking/network-policy.js.map +1 -1
- package/dist/factories/simple/networking/service.d.ts +10 -0
- package/dist/factories/simple/networking/service.d.ts.map +1 -1
- package/dist/factories/simple/networking/service.js +10 -0
- package/dist/factories/simple/networking/service.js.map +1 -1
- package/dist/factories/simple/storage/persistent-volume-claim.d.ts +10 -0
- package/dist/factories/simple/storage/persistent-volume-claim.d.ts.map +1 -1
- package/dist/factories/simple/storage/persistent-volume-claim.js +11 -0
- package/dist/factories/simple/storage/persistent-volume-claim.js.map +1 -1
- package/dist/factories/simple/storage/persistent-volume.d.ts +11 -0
- package/dist/factories/simple/storage/persistent-volume.d.ts.map +1 -1
- package/dist/factories/simple/storage/persistent-volume.js +12 -0
- package/dist/factories/simple/storage/persistent-volume.js.map +1 -1
- package/dist/factories/simple/types.d.ts +21 -1
- package/dist/factories/simple/types.d.ts.map +1 -1
- package/dist/factories/simple/workloads/cron-job.d.ts +10 -0
- package/dist/factories/simple/workloads/cron-job.d.ts.map +1 -1
- package/dist/factories/simple/workloads/cron-job.js +11 -0
- package/dist/factories/simple/workloads/cron-job.js.map +1 -1
- package/dist/factories/simple/workloads/daemon-set.d.ts +9 -0
- package/dist/factories/simple/workloads/daemon-set.d.ts.map +1 -1
- package/dist/factories/simple/workloads/daemon-set.js +9 -0
- package/dist/factories/simple/workloads/daemon-set.js.map +1 -1
- package/dist/factories/simple/workloads/deployment.d.ts +11 -1
- package/dist/factories/simple/workloads/deployment.d.ts.map +1 -1
- package/dist/factories/simple/workloads/deployment.js +19 -9
- package/dist/factories/simple/workloads/deployment.js.map +1 -1
- package/dist/factories/simple/workloads/job.d.ts +10 -0
- package/dist/factories/simple/workloads/job.d.ts.map +1 -1
- package/dist/factories/simple/workloads/job.js +11 -0
- package/dist/factories/simple/workloads/job.js.map +1 -1
- package/dist/factories/simple/workloads/stateful-set.d.ts +11 -0
- package/dist/factories/simple/workloads/stateful-set.d.ts.map +1 -1
- package/dist/factories/simple/workloads/stateful-set.js +12 -0
- package/dist/factories/simple/workloads/stateful-set.js.map +1 -1
- package/dist/factories/simple/yaml/index.d.ts +8 -0
- package/dist/factories/simple/yaml/index.d.ts.map +1 -1
- package/dist/factories/simple/yaml/index.js +8 -0
- package/dist/factories/simple/yaml/index.js.map +1 -1
- package/dist/index.d.ts +105 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +115 -42
- package/dist/index.js.map +1 -1
- package/dist/shared/brands.d.ts +32 -0
- package/dist/shared/brands.d.ts.map +1 -0
- package/dist/shared/brands.js +32 -0
- package/dist/shared/brands.js.map +1 -0
- package/dist/utils/helpers.d.ts +31 -57
- package/dist/utils/helpers.d.ts.map +1 -1
- package/dist/utils/helpers.js +47 -428
- package/dist/utils/helpers.js.map +1 -1
- package/dist/utils/index.d.ts +5 -4
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +8 -6
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/string.d.ts +31 -0
- package/dist/utils/string.d.ts.map +1 -0
- package/dist/utils/string.js +82 -0
- package/dist/utils/string.js.map +1 -0
- package/dist/utils/type-guards.d.ts +20 -6
- package/dist/utils/type-guards.d.ts.map +1 -1
- package/dist/utils/type-guards.js +78 -20
- package/dist/utils/type-guards.js.map +1 -1
- package/package.json +66 -16
- package/dist/core/composition/composition.d.ts +0 -10
- package/dist/core/composition/composition.d.ts.map +0 -1
- package/dist/core/composition/composition.js.map +0 -1
- package/dist/core/composition/typekro-runtime/index.d.ts +0 -3
- package/dist/core/composition/typekro-runtime/index.d.ts.map +0 -1
- package/dist/core/composition/typekro-runtime/index.js.map +0 -1
- package/dist/core/composition/typekro-runtime/typekro-runtime.d.ts.map +0 -1
- package/dist/core/composition/typekro-runtime/typekro-runtime.js +0 -99
- package/dist/core/composition/typekro-runtime/typekro-runtime.js.map +0 -1
- package/dist/core/composition/typekro-runtime/types.d.ts +0 -16
- package/dist/core/composition/typekro-runtime/types.d.ts.map +0 -1
- package/dist/core/composition/typekro-runtime/types.js.map +0 -1
- package/dist/core/composition/types.d.ts +0 -27
- package/dist/core/composition/types.d.ts.map +0 -1
- package/dist/core/composition/types.js +0 -8
- package/dist/core/composition/types.js.map +0 -1
- package/dist/core/dependencies/type-guards.d.ts +0 -17
- package/dist/core/dependencies/type-guards.d.ts.map +0 -1
- package/dist/core/dependencies/type-guards.js +0 -40
- package/dist/core/dependencies/type-guards.js.map +0 -1
- package/dist/core/deployment/deployment-strategies.d.ts +0 -12
- package/dist/core/deployment/deployment-strategies.d.ts.map +0 -1
- package/dist/core/deployment/deployment-strategies.js +0 -11
- package/dist/core/deployment/deployment-strategies.js.map +0 -1
- package/dist/core/deployment/event-streamer.d.ts +0 -112
- package/dist/core/deployment/event-streamer.d.ts.map +0 -1
- package/dist/core/deployment/event-streamer.js +0 -348
- package/dist/core/deployment/event-streamer.js.map +0 -1
- package/dist/core/direct-deployment.d.ts +0 -8
- package/dist/core/direct-deployment.d.ts.map +0 -1
- package/dist/core/direct-deployment.js +0 -9
- package/dist/core/direct-deployment.js.map +0 -1
- package/dist/core/evaluation/cel-optimizer.d.ts.map +0 -1
- package/dist/core/evaluation/cel-optimizer.js.map +0 -1
- package/dist/core/expressions/analyzer.d.ts +0 -584
- package/dist/core/expressions/analyzer.d.ts.map +0 -1
- package/dist/core/expressions/analyzer.js +0 -2956
- package/dist/core/expressions/analyzer.js.map +0 -1
- package/dist/core/expressions/cache.d.ts.map +0 -1
- package/dist/core/expressions/cache.js.map +0 -1
- package/dist/core/expressions/cel-conversion-engine.d.ts.map +0 -1
- package/dist/core/expressions/cel-conversion-engine.js.map +0 -1
- package/dist/core/expressions/compile-time-validation.d.ts +0 -270
- package/dist/core/expressions/compile-time-validation.d.ts.map +0 -1
- package/dist/core/expressions/compile-time-validation.js.map +0 -1
- package/dist/core/expressions/composition-integration.d.ts +0 -315
- package/dist/core/expressions/composition-integration.d.ts.map +0 -1
- package/dist/core/expressions/composition-integration.js +0 -936
- package/dist/core/expressions/composition-integration.js.map +0 -1
- package/dist/core/expressions/conditional-expression-processor.d.ts.map +0 -1
- package/dist/core/expressions/conditional-expression-processor.js.map +0 -1
- package/dist/core/expressions/conditional-integration.d.ts.map +0 -1
- package/dist/core/expressions/conditional-integration.js.map +0 -1
- package/dist/core/expressions/conditional-validation.d.ts +0 -181
- package/dist/core/expressions/conditional-validation.d.ts.map +0 -1
- package/dist/core/expressions/conditional-validation.js +0 -460
- package/dist/core/expressions/conditional-validation.js.map +0 -1
- package/dist/core/expressions/context-aware-generator.d.ts.map +0 -1
- package/dist/core/expressions/context-aware-generator.js.map +0 -1
- package/dist/core/expressions/context-detector.d.ts.map +0 -1
- package/dist/core/expressions/context-detector.js.map +0 -1
- package/dist/core/expressions/context-switcher.d.ts +0 -185
- package/dist/core/expressions/context-switcher.d.ts.map +0 -1
- package/dist/core/expressions/context-switcher.js +0 -515
- package/dist/core/expressions/context-switcher.js.map +0 -1
- package/dist/core/expressions/context-validator.d.ts.map +0 -1
- package/dist/core/expressions/context-validator.js.map +0 -1
- package/dist/core/expressions/custom-context-manager.d.ts +0 -194
- package/dist/core/expressions/custom-context-manager.d.ts.map +0 -1
- package/dist/core/expressions/custom-context-manager.js +0 -390
- package/dist/core/expressions/custom-context-manager.js.map +0 -1
- package/dist/core/expressions/expression-proxy.d.ts +0 -80
- package/dist/core/expressions/expression-proxy.d.ts.map +0 -1
- package/dist/core/expressions/expression-proxy.js +0 -227
- package/dist/core/expressions/expression-proxy.js.map +0 -1
- package/dist/core/expressions/factory-integration.d.ts.map +0 -1
- package/dist/core/expressions/factory-integration.js.map +0 -1
- package/dist/core/expressions/factory-pattern-handler.d.ts.map +0 -1
- package/dist/core/expressions/factory-pattern-handler.js.map +0 -1
- package/dist/core/expressions/field-hydration-processor.d.ts +0 -188
- package/dist/core/expressions/field-hydration-processor.d.ts.map +0 -1
- package/dist/core/expressions/field-hydration-processor.js +0 -562
- package/dist/core/expressions/field-hydration-processor.js.map +0 -1
- package/dist/core/expressions/imperative-analyzer.d.ts.map +0 -1
- package/dist/core/expressions/imperative-analyzer.js.map +0 -1
- package/dist/core/expressions/lazy-analysis.d.ts +0 -1128
- package/dist/core/expressions/lazy-analysis.d.ts.map +0 -1
- package/dist/core/expressions/lazy-analysis.js +0 -2443
- package/dist/core/expressions/lazy-analysis.js.map +0 -1
- package/dist/core/expressions/magic-assignable-analyzer.d.ts.map +0 -1
- package/dist/core/expressions/magic-assignable-analyzer.js.map +0 -1
- package/dist/core/expressions/magic-proxy-analyzer.d.ts.map +0 -1
- package/dist/core/expressions/magic-proxy-analyzer.js.map +0 -1
- package/dist/core/expressions/magic-proxy-detector.d.ts.map +0 -1
- package/dist/core/expressions/magic-proxy-detector.js.map +0 -1
- package/dist/core/expressions/migration-helpers.d.ts.map +0 -1
- package/dist/core/expressions/migration-helpers.js.map +0 -1
- package/dist/core/expressions/optionality-handler.d.ts +0 -503
- package/dist/core/expressions/optionality-handler.d.ts.map +0 -1
- package/dist/core/expressions/optionality-handler.js +0 -1306
- package/dist/core/expressions/optionality-handler.js.map +0 -1
- package/dist/core/expressions/readiness-integration.d.ts +0 -119
- package/dist/core/expressions/readiness-integration.d.ts.map +0 -1
- package/dist/core/expressions/readiness-integration.js +0 -386
- package/dist/core/expressions/readiness-integration.js.map +0 -1
- package/dist/core/expressions/resource-analyzer.d.ts +0 -486
- package/dist/core/expressions/resource-analyzer.d.ts.map +0 -1
- package/dist/core/expressions/resource-analyzer.js +0 -1086
- package/dist/core/expressions/resource-analyzer.js.map +0 -1
- package/dist/core/expressions/resource-validation.d.ts.map +0 -1
- package/dist/core/expressions/resource-validation.js +0 -552
- package/dist/core/expressions/resource-validation.js.map +0 -1
- package/dist/core/expressions/runtime-error-mapper.d.ts +0 -138
- package/dist/core/expressions/runtime-error-mapper.d.ts.map +0 -1
- package/dist/core/expressions/runtime-error-mapper.js +0 -412
- package/dist/core/expressions/runtime-error-mapper.js.map +0 -1
- package/dist/core/expressions/source-map.d.ts.map +0 -1
- package/dist/core/expressions/source-map.js.map +0 -1
- package/dist/core/expressions/status-builder-analyzer.d.ts +0 -353
- package/dist/core/expressions/status-builder-analyzer.d.ts.map +0 -1
- package/dist/core/expressions/status-builder-analyzer.js +0 -1311
- package/dist/core/expressions/status-builder-analyzer.js.map +0 -1
- package/dist/core/expressions/type-inference.d.ts.map +0 -1
- package/dist/core/expressions/type-inference.js.map +0 -1
- package/dist/core/expressions/type-safety.d.ts.map +0 -1
- package/dist/core/expressions/type-safety.js.map +0 -1
- package/dist/core/expressions/types.d.ts.map +0 -1
- package/dist/core/expressions/types.js.map +0 -1
- package/dist/core/factory.d.ts +0 -12
- package/dist/core/factory.d.ts.map +0 -1
- package/dist/core/factory.js +0 -13
- package/dist/core/factory.js.map +0 -1
- package/dist/core/readiness/cluster-state.d.ts +0 -229
- package/dist/core/readiness/cluster-state.d.ts.map +0 -1
- package/dist/core/readiness/cluster-state.js +0 -366
- package/dist/core/readiness/cluster-state.js.map +0 -1
- package/dist/core.d.ts +0 -30
- package/dist/core.d.ts.map +0 -1
- package/dist/core.js +0 -59
- package/dist/core.js.map +0 -1
- /package/dist/{core/composition → compositions}/typekro-runtime/index.js +0 -0
- /package/dist/{core/composition → compositions}/typekro-runtime/types.js +0 -0
- /package/dist/core/expressions/{source-map.d.ts → analysis/source-map.d.ts} +0 -0
- /package/dist/core/expressions/{types.js → analysis/types.js} +0 -0
|
@@ -4,17 +4,23 @@
|
|
|
4
4
|
* Orchestrates the deployment of Kubernetes resources directly to a cluster
|
|
5
5
|
* without requiring the Kro controller, using in-process dependency resolution.
|
|
6
6
|
*/
|
|
7
|
-
import
|
|
8
|
-
import { ensureReadinessEvaluator } from '../../utils/helpers.js';
|
|
7
|
+
import { DEFAULT_CRD_READY_TIMEOUT, DEFAULT_DEPLOYMENT_TIMEOUT, DEFAULT_READINESS_TIMEOUT, } from '../config/defaults.js';
|
|
9
8
|
import { DependencyResolver } from '../dependencies/index.js';
|
|
10
|
-
import { CircularDependencyError } from '../errors.js';
|
|
9
|
+
import { CircularDependencyError, ensureError, ResourceGraphFactoryError } from '../errors.js';
|
|
10
|
+
import { createBunCompatibleKubernetesObjectApi } from '../kubernetes/index.js';
|
|
11
11
|
import { getComponentLogger } from '../logging/index.js';
|
|
12
|
+
import { getResourceId as getResourceMetadataId } from '../metadata/index.js';
|
|
13
|
+
import { ensureReadinessEvaluator } from '../readiness/index.js';
|
|
12
14
|
import { DeploymentMode, ReferenceResolver } from '../references/index.js';
|
|
13
|
-
import {
|
|
15
|
+
import { getResourceId } from '../resources/id.js';
|
|
16
|
+
import { analyzeClosureDependencies, integrateClosuresIntoPlan } from './closure-planner.js';
|
|
17
|
+
import { CRDManager } from './crd-manager.js';
|
|
14
18
|
import { createDebugLoggerFromDeploymentOptions } from './debug-logger.js';
|
|
15
|
-
import { ResourceReadinessChecker } from './readiness.js';
|
|
16
|
-
import { StatusHydrator } from './status-hydrator.js';
|
|
17
19
|
import { createEventMonitor } from './event-monitor.js';
|
|
20
|
+
import { ResourceReadinessChecker } from './readiness.js';
|
|
21
|
+
import { ReadinessWaiter } from './readiness-waiter.js';
|
|
22
|
+
import { ResourceApplier } from './resource-applier.js';
|
|
23
|
+
import { ResourceRollbackManager } from './rollback-manager.js';
|
|
18
24
|
export class DirectDeploymentEngine {
|
|
19
25
|
kubeClient;
|
|
20
26
|
deploymentMode;
|
|
@@ -22,22 +28,35 @@ export class DirectDeploymentEngine {
|
|
|
22
28
|
referenceResolver;
|
|
23
29
|
k8sApi;
|
|
24
30
|
readinessChecker;
|
|
25
|
-
|
|
31
|
+
resourceApplier;
|
|
32
|
+
rollbackManager;
|
|
33
|
+
readinessWaiter;
|
|
26
34
|
debugLogger;
|
|
27
35
|
eventMonitor;
|
|
28
36
|
deploymentState = new Map();
|
|
37
|
+
crdManager;
|
|
29
38
|
readyResources = new Set(); // Track resources that are already ready
|
|
39
|
+
activeAbortControllers = new Set(); // Track active abort controllers for cleanup
|
|
30
40
|
logger = getComponentLogger('deployment-engine');
|
|
31
|
-
constructor(kubeClient, k8sApi, referenceResolver, deploymentMode = DeploymentMode.DIRECT) {
|
|
41
|
+
constructor(kubeClient, k8sApi, referenceResolver, deploymentMode = DeploymentMode.DIRECT, httpTimeouts) {
|
|
32
42
|
this.kubeClient = kubeClient;
|
|
33
43
|
this.deploymentMode = deploymentMode;
|
|
34
44
|
this.dependencyResolver = new DependencyResolver();
|
|
35
45
|
this.referenceResolver =
|
|
36
46
|
referenceResolver || new ReferenceResolver(kubeClient, this.deploymentMode, k8sApi);
|
|
37
|
-
|
|
47
|
+
// Use createBunCompatibleKubernetesObjectApi which handles both Bun and Node.js
|
|
48
|
+
// This works around Bun's fetch TLS issues (https://github.com/oven-sh/bun/issues/10642)
|
|
49
|
+
// Pass HTTP timeout configuration if provided
|
|
50
|
+
this.k8sApi = k8sApi || createBunCompatibleKubernetesObjectApi(kubeClient, httpTimeouts);
|
|
38
51
|
this.readinessChecker = new ResourceReadinessChecker(this.k8sApi);
|
|
39
|
-
this.
|
|
40
|
-
|
|
52
|
+
this.resourceApplier = new ResourceApplier(this.k8sApi, this.referenceResolver, this.logger);
|
|
53
|
+
this.rollbackManager = new ResourceRollbackManager(this.k8sApi);
|
|
54
|
+
this.readinessWaiter = new ReadinessWaiter(this.k8sApi, this.readyResources, this.readinessChecker, this.logger, undefined, {
|
|
55
|
+
abortableDelay: this.abortableDelay.bind(this),
|
|
56
|
+
withAbortSignal: this.withAbortSignal.bind(this),
|
|
57
|
+
emitEvent: this.emitEvent.bind(this),
|
|
58
|
+
});
|
|
59
|
+
this.crdManager = new CRDManager(this.k8sApi, kubeClient, this.abortableDelay.bind(this), this.withAbortSignal.bind(this));
|
|
41
60
|
// Set up callback to track ready resources
|
|
42
61
|
this.readinessChecker.setOnResourceReady((resource) => {
|
|
43
62
|
const resourceKey = `${resource.kind}/${resource.name}/${resource.namespace}`;
|
|
@@ -48,6 +67,94 @@ export class DirectDeploymentEngine {
|
|
|
48
67
|
});
|
|
49
68
|
});
|
|
50
69
|
}
|
|
70
|
+
/**
|
|
71
|
+
* Create an abortable delay that can be cancelled via AbortSignal
|
|
72
|
+
* @param ms - Delay in milliseconds
|
|
73
|
+
* @param signal - Optional AbortSignal to cancel the delay
|
|
74
|
+
* @returns Promise that resolves after the delay or rejects if aborted
|
|
75
|
+
*/
|
|
76
|
+
abortableDelay(ms, signal) {
|
|
77
|
+
return new Promise((resolve, reject) => {
|
|
78
|
+
if (signal?.aborted) {
|
|
79
|
+
reject(new DOMException('Delay aborted', 'AbortError'));
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const timeoutId = setTimeout(() => {
|
|
83
|
+
resolve();
|
|
84
|
+
}, ms);
|
|
85
|
+
signal?.addEventListener('abort', () => {
|
|
86
|
+
clearTimeout(timeoutId);
|
|
87
|
+
reject(new DOMException('Delay aborted', 'AbortError'));
|
|
88
|
+
}, { once: true });
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Wrap an async operation with abort signal handling
|
|
93
|
+
* If the signal is aborted, the promise will reject with AbortError
|
|
94
|
+
* Note: This doesn't actually cancel the underlying operation, but it allows
|
|
95
|
+
* the caller to stop waiting for it and handle the abort gracefully
|
|
96
|
+
* @param operation - The async operation to wrap
|
|
97
|
+
* @param signal - Optional AbortSignal to cancel the wait
|
|
98
|
+
* @returns Promise that resolves with the operation result or rejects if aborted
|
|
99
|
+
*/
|
|
100
|
+
async withAbortSignal(operation, signal) {
|
|
101
|
+
if (!signal) {
|
|
102
|
+
return operation;
|
|
103
|
+
}
|
|
104
|
+
if (signal.aborted) {
|
|
105
|
+
throw new DOMException('Operation aborted', 'AbortError');
|
|
106
|
+
}
|
|
107
|
+
return new Promise((resolve, reject) => {
|
|
108
|
+
const abortHandler = () => {
|
|
109
|
+
reject(new DOMException('Operation aborted', 'AbortError'));
|
|
110
|
+
};
|
|
111
|
+
signal.addEventListener('abort', abortHandler, { once: true });
|
|
112
|
+
operation
|
|
113
|
+
.then((result) => {
|
|
114
|
+
signal.removeEventListener('abort', abortHandler);
|
|
115
|
+
resolve(result);
|
|
116
|
+
})
|
|
117
|
+
.catch((error) => {
|
|
118
|
+
signal.removeEventListener('abort', abortHandler);
|
|
119
|
+
// If the signal was aborted, throw AbortError instead of the original error
|
|
120
|
+
if (signal.aborted) {
|
|
121
|
+
reject(new DOMException('Operation aborted', 'AbortError'));
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
reject(error);
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Create and track an AbortController for a deployment operation
|
|
131
|
+
* @returns AbortController that is tracked for cleanup
|
|
132
|
+
*/
|
|
133
|
+
createTrackedAbortController() {
|
|
134
|
+
const controller = new AbortController();
|
|
135
|
+
this.activeAbortControllers.add(controller);
|
|
136
|
+
return controller;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Remove an AbortController from tracking
|
|
140
|
+
* @param controller - The AbortController to remove
|
|
141
|
+
*/
|
|
142
|
+
removeTrackedAbortController(controller) {
|
|
143
|
+
this.activeAbortControllers.delete(controller);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Abort all active operations and clean up
|
|
147
|
+
* This is called when a deployment times out or is cancelled
|
|
148
|
+
*/
|
|
149
|
+
abortAllOperations() {
|
|
150
|
+
this.logger.debug('Aborting all active operations', {
|
|
151
|
+
activeControllers: this.activeAbortControllers.size,
|
|
152
|
+
});
|
|
153
|
+
for (const controller of this.activeAbortControllers) {
|
|
154
|
+
controller.abort();
|
|
155
|
+
}
|
|
156
|
+
this.activeAbortControllers.clear();
|
|
157
|
+
}
|
|
51
158
|
/**
|
|
52
159
|
* Get the Kubernetes API client for external integrations
|
|
53
160
|
* @returns The configured KubernetesObjectApi instance
|
|
@@ -59,69 +166,7 @@ export class DirectDeploymentEngine {
|
|
|
59
166
|
* Check if a deployed resource is ready using the factory-provided readiness evaluator
|
|
60
167
|
*/
|
|
61
168
|
async isDeployedResourceReady(deployedResource) {
|
|
62
|
-
|
|
63
|
-
// Check if the deployed resource has a factory-provided readiness evaluator
|
|
64
|
-
const readinessEvaluator = deployedResource.manifest
|
|
65
|
-
.readinessEvaluator;
|
|
66
|
-
if (readinessEvaluator) {
|
|
67
|
-
// Use the factory-provided readiness evaluator
|
|
68
|
-
// Create a resource reference for the API call
|
|
69
|
-
const resourceRef = {
|
|
70
|
-
apiVersion: deployedResource.manifest.apiVersion || '',
|
|
71
|
-
kind: deployedResource.kind,
|
|
72
|
-
metadata: {
|
|
73
|
-
name: deployedResource.name,
|
|
74
|
-
namespace: deployedResource.namespace,
|
|
75
|
-
},
|
|
76
|
-
};
|
|
77
|
-
// Get the live resource from the cluster
|
|
78
|
-
const liveResource = await this.k8sApi.read(resourceRef);
|
|
79
|
-
// Use the factory-provided readiness evaluator
|
|
80
|
-
const result = readinessEvaluator(liveResource.body);
|
|
81
|
-
let readinessResult;
|
|
82
|
-
if (typeof result === 'boolean') {
|
|
83
|
-
readinessResult = { ready: result };
|
|
84
|
-
}
|
|
85
|
-
else if (result && typeof result === 'object' && 'ready' in result) {
|
|
86
|
-
readinessResult = result;
|
|
87
|
-
}
|
|
88
|
-
else {
|
|
89
|
-
this.logger.warn('Readiness evaluator returned unexpected result', {
|
|
90
|
-
resourceId: deployedResource.id,
|
|
91
|
-
result,
|
|
92
|
-
});
|
|
93
|
-
readinessResult = { ready: false, reason: 'Invalid evaluator result' };
|
|
94
|
-
}
|
|
95
|
-
// Debug logging for readiness evaluation
|
|
96
|
-
if (this.debugLogger) {
|
|
97
|
-
this.debugLogger.logReadinessEvaluation(deployedResource, readinessEvaluator, readinessResult);
|
|
98
|
-
}
|
|
99
|
-
return readinessResult.ready;
|
|
100
|
-
}
|
|
101
|
-
else {
|
|
102
|
-
// Fallback to generic readiness checker
|
|
103
|
-
const resourceRef = {
|
|
104
|
-
apiVersion: deployedResource.manifest.apiVersion || '',
|
|
105
|
-
kind: deployedResource.kind,
|
|
106
|
-
metadata: {
|
|
107
|
-
name: deployedResource.name,
|
|
108
|
-
namespace: deployedResource.namespace,
|
|
109
|
-
},
|
|
110
|
-
};
|
|
111
|
-
const liveResource = await this.k8sApi.read(resourceRef);
|
|
112
|
-
return this.readinessChecker.isResourceReady(liveResource.body);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
catch (error) {
|
|
116
|
-
this.logger.debug('Failed to check resource readiness', {
|
|
117
|
-
error: error,
|
|
118
|
-
resourceId: deployedResource.id,
|
|
119
|
-
kind: deployedResource.kind,
|
|
120
|
-
name: deployedResource.name,
|
|
121
|
-
namespace: deployedResource.namespace,
|
|
122
|
-
});
|
|
123
|
-
return false;
|
|
124
|
-
}
|
|
169
|
+
return this.readinessWaiter.isDeployedResourceReady(deployedResource);
|
|
125
170
|
}
|
|
126
171
|
/**
|
|
127
172
|
* Get all deployment states for health checking
|
|
@@ -133,6 +178,14 @@ export class DirectDeploymentEngine {
|
|
|
133
178
|
* Deploy a resource graph to the Kubernetes cluster
|
|
134
179
|
*/
|
|
135
180
|
async deploy(graph, options) {
|
|
181
|
+
// Delegate to deployWithClosures with no closures and a dummy spec.
|
|
182
|
+
// The closure integration code is a no-op when the closures map is empty.
|
|
183
|
+
return this.deployWithClosures(graph, {}, options, undefined);
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Deploy a resource graph with deployment closures integrated into level-based execution
|
|
187
|
+
*/
|
|
188
|
+
async deployWithClosures(graph, closures, options, spec, alchemyScope) {
|
|
136
189
|
const deploymentId = this.generateDeploymentId();
|
|
137
190
|
const startTime = Date.now();
|
|
138
191
|
const deployedResources = [];
|
|
@@ -140,244 +193,39 @@ export class DirectDeploymentEngine {
|
|
|
140
193
|
const deploymentLogger = this.logger.child({
|
|
141
194
|
deploymentId,
|
|
142
195
|
resourceCount: graph.resources.length,
|
|
196
|
+
closureCount: Object.keys(closures).length,
|
|
197
|
+
});
|
|
198
|
+
const { abortController: deploymentAbortController, timeoutId } = this.setupDeploymentTimeout(deploymentId, options, deploymentLogger);
|
|
199
|
+
const abortSignal = deploymentAbortController.signal;
|
|
200
|
+
deploymentLogger.info(Object.keys(closures).length === 0
|
|
201
|
+
? 'Starting deployment'
|
|
202
|
+
: 'Starting deployment with closures', {
|
|
203
|
+
options,
|
|
204
|
+
closures: Object.keys(closures),
|
|
143
205
|
});
|
|
144
|
-
deploymentLogger.info('Starting deployment', { options });
|
|
145
206
|
try {
|
|
146
207
|
this.emitEvent(options, {
|
|
147
208
|
type: 'started',
|
|
148
|
-
message: `Starting deployment of ${graph.resources.length} resources`,
|
|
209
|
+
message: `Starting deployment of ${graph.resources.length} resources and ${Object.keys(closures).length} closures`,
|
|
149
210
|
timestamp: new Date(),
|
|
150
211
|
});
|
|
151
|
-
//
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
// 2. Analyze deployment order and identify parallel stages
|
|
157
|
-
deploymentLogger.debug('Analyzing deployment order for parallel execution');
|
|
158
|
-
const deploymentPlan = this.dependencyResolver.analyzeDeploymentOrder(graph.dependencyGraph);
|
|
159
|
-
deploymentLogger.debug('Deployment plan determined', {
|
|
160
|
-
levels: deploymentPlan.levels.length,
|
|
161
|
-
totalResources: deploymentPlan.totalResources,
|
|
162
|
-
maxParallelism: deploymentPlan.maxParallelism,
|
|
163
|
-
});
|
|
164
|
-
// 3. Initialize and start event monitoring if enabled
|
|
165
|
-
if (options.eventMonitoring?.enabled) {
|
|
166
|
-
try {
|
|
167
|
-
this.eventMonitor = createEventMonitor(this.kubeClient, {
|
|
168
|
-
namespace: options.namespace || 'default',
|
|
169
|
-
eventTypes: options.eventMonitoring.eventTypes || ['Warning', 'Error'],
|
|
170
|
-
includeChildResources: options.eventMonitoring.includeChildResources ?? true,
|
|
171
|
-
startTime: new Date(startTime),
|
|
172
|
-
...(options.progressCallback && { progressCallback: options.progressCallback }),
|
|
173
|
-
});
|
|
174
|
-
// Start monitoring immediately to capture all deployment events
|
|
175
|
-
await this.eventMonitor.startMonitoring([]);
|
|
176
|
-
deploymentLogger.debug('Event monitoring started for deployment');
|
|
177
|
-
}
|
|
178
|
-
catch (error) {
|
|
179
|
-
deploymentLogger.warn('Failed to initialize event monitoring, continuing without it', error);
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
// 3.1. Initialize debug logging if enabled
|
|
183
|
-
if (options.debugLogging?.enabled) {
|
|
184
|
-
this.debugLogger = createDebugLoggerFromDeploymentOptions(options);
|
|
185
|
-
this.readinessChecker.setDebugLogger(this.debugLogger);
|
|
186
|
-
deploymentLogger.debug('Debug logging initialized');
|
|
187
|
-
}
|
|
188
|
-
// 4. Create resolution context
|
|
189
|
-
const context = {
|
|
190
|
-
deployedResources,
|
|
191
|
-
kubeClient: this.kubeClient,
|
|
192
|
-
...(options.namespace && { namespace: options.namespace }),
|
|
193
|
-
timeout: options.timeout || 30000,
|
|
194
|
-
};
|
|
195
|
-
// 5. Deploy resources in parallel stages
|
|
196
|
-
for (let levelIndex = 0; levelIndex < deploymentPlan.levels.length; levelIndex++) {
|
|
197
|
-
const currentLevel = deploymentPlan.levels[levelIndex];
|
|
212
|
+
// Validate, plan, initialize monitoring, and build resolution context
|
|
213
|
+
const { enhancedPlan, context, resourceKeyMapping } = await this.validateAndPlanDeployment(graph, closures, spec, options, startTime, deployedResources, deploymentLogger);
|
|
214
|
+
// Deploy resources and closures level by level with proper dependency handling
|
|
215
|
+
for (let levelIndex = 0; levelIndex < enhancedPlan.levels.length; levelIndex++) {
|
|
216
|
+
const currentLevel = enhancedPlan.levels[levelIndex];
|
|
198
217
|
if (!currentLevel) {
|
|
199
218
|
continue;
|
|
200
219
|
}
|
|
201
|
-
const
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
// Track performance metrics for this level
|
|
207
|
-
const levelStartTime = Date.now();
|
|
208
|
-
// Deploy all resources in this level in parallel
|
|
209
|
-
const levelPromises = currentLevel.map(async (resourceId) => {
|
|
210
|
-
const resourceLogger = deploymentLogger.child({ resourceId });
|
|
211
|
-
resourceLogger.debug('Starting resource deployment');
|
|
212
|
-
const resource = graph.resources.find((r) => r.id === resourceId);
|
|
213
|
-
if (!resource) {
|
|
214
|
-
resourceLogger.error('Resource not found in graph');
|
|
215
|
-
const error = new Error(`Resource with id '${resourceId}' not found in graph`);
|
|
216
|
-
return {
|
|
217
|
-
success: false,
|
|
218
|
-
resourceId,
|
|
219
|
-
error: {
|
|
220
|
-
resourceId,
|
|
221
|
-
phase: 'validation',
|
|
222
|
-
error,
|
|
223
|
-
timestamp: new Date(),
|
|
224
|
-
},
|
|
225
|
-
};
|
|
226
|
-
}
|
|
227
|
-
resourceLogger.debug('Found resource in graph', {
|
|
228
|
-
resourceId: resource.id,
|
|
229
|
-
kind: resource.manifest?.kind,
|
|
230
|
-
name: resource.manifest?.metadata?.name,
|
|
231
|
-
});
|
|
232
|
-
try {
|
|
233
|
-
resourceLogger.debug('Calling deploySingleResource');
|
|
234
|
-
// Wait for CRD establishment if this is a custom resource
|
|
235
|
-
await this.waitForCRDIfCustomResource(resource.manifest, options, resourceLogger);
|
|
236
|
-
// FIX: Unconditionally ensure the readiness evaluator is attached just before deployment.
|
|
237
|
-
const resourceWithEvaluator = ensureReadinessEvaluator(resource.manifest);
|
|
238
|
-
// Add resource to event monitoring before deployment to capture creation events
|
|
239
|
-
if (this.eventMonitor) {
|
|
240
|
-
const preDeployedResource = {
|
|
241
|
-
id: resourceId,
|
|
242
|
-
kind: resourceWithEvaluator.kind,
|
|
243
|
-
name: resourceWithEvaluator.metadata?.name || 'unknown',
|
|
244
|
-
namespace: resourceWithEvaluator.metadata?.namespace || options.namespace || 'default',
|
|
245
|
-
manifest: resourceWithEvaluator,
|
|
246
|
-
status: 'deployed',
|
|
247
|
-
deployedAt: new Date(),
|
|
248
|
-
};
|
|
249
|
-
try {
|
|
250
|
-
await this.eventMonitor.addResources([preDeployedResource]);
|
|
251
|
-
resourceLogger.debug('Added resource to event monitoring before deployment');
|
|
252
|
-
}
|
|
253
|
-
catch (error) {
|
|
254
|
-
resourceLogger.warn('Failed to add resource to event monitoring, continuing deployment', error);
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
const deployedResource = await this.deploySingleResource(resourceWithEvaluator, context, options);
|
|
258
|
-
resourceLogger.debug('Resource deployed successfully');
|
|
259
|
-
return {
|
|
260
|
-
success: true,
|
|
261
|
-
resourceId,
|
|
262
|
-
deployedResource,
|
|
263
|
-
};
|
|
264
|
-
}
|
|
265
|
-
catch (error) {
|
|
266
|
-
resourceLogger.error('Resource deployment failed', error);
|
|
267
|
-
const failedResource = {
|
|
268
|
-
id: resourceId,
|
|
269
|
-
kind: resource.manifest.kind,
|
|
270
|
-
name: resource.manifest.metadata?.name || 'unknown',
|
|
271
|
-
namespace: resource.manifest.metadata?.namespace || 'default',
|
|
272
|
-
manifest: resource.manifest,
|
|
273
|
-
status: 'failed',
|
|
274
|
-
deployedAt: new Date(),
|
|
275
|
-
error: error,
|
|
276
|
-
};
|
|
277
|
-
return {
|
|
278
|
-
success: false,
|
|
279
|
-
resourceId,
|
|
280
|
-
deployedResource: failedResource,
|
|
281
|
-
error: {
|
|
282
|
-
resourceId,
|
|
283
|
-
phase: 'deployment',
|
|
284
|
-
error: error,
|
|
285
|
-
timestamp: new Date(),
|
|
286
|
-
},
|
|
287
|
-
};
|
|
288
|
-
}
|
|
289
|
-
});
|
|
290
|
-
// Wait for all resources in this level to complete
|
|
291
|
-
const levelResults = await Promise.allSettled(levelPromises);
|
|
292
|
-
// Process results and handle errors
|
|
293
|
-
let levelHasFailures = false;
|
|
294
|
-
for (const result of levelResults) {
|
|
295
|
-
if (result.status === 'fulfilled') {
|
|
296
|
-
const deploymentResult = result.value;
|
|
297
|
-
if (deploymentResult.success && deploymentResult.deployedResource) {
|
|
298
|
-
deployedResources.push(deploymentResult.deployedResource);
|
|
299
|
-
}
|
|
300
|
-
else {
|
|
301
|
-
levelHasFailures = true;
|
|
302
|
-
if (deploymentResult.error) {
|
|
303
|
-
errors.push(deploymentResult.error);
|
|
304
|
-
}
|
|
305
|
-
if (deploymentResult.deployedResource) {
|
|
306
|
-
deployedResources.push(deploymentResult.deployedResource);
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
else {
|
|
311
|
-
// Promise was rejected
|
|
312
|
-
levelHasFailures = true;
|
|
313
|
-
levelLogger.error('Unexpected promise rejection in parallel deployment', result.reason);
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
// Resources are now added to event monitoring before deployment (see individual resource deployment above)
|
|
317
|
-
// Handle rollback if there are failures and rollback is enabled
|
|
318
|
-
if (levelHasFailures && options.rollbackOnFailure) {
|
|
319
|
-
levelLogger.warn('Level deployment failed, initiating rollback');
|
|
320
|
-
await this.rollbackDeployedResources(deployedResources, options);
|
|
321
|
-
const duration = Date.now() - startTime;
|
|
322
|
-
this.emitEvent(options, {
|
|
323
|
-
type: 'rollback',
|
|
324
|
-
message: `Deployment failed and rolled back in ${duration}ms`,
|
|
325
|
-
timestamp: new Date(),
|
|
326
|
-
});
|
|
327
|
-
return {
|
|
328
|
-
deploymentId,
|
|
329
|
-
resources: deployedResources,
|
|
330
|
-
dependencyGraph: graph.dependencyGraph,
|
|
331
|
-
duration,
|
|
332
|
-
status: 'failed',
|
|
333
|
-
errors,
|
|
334
|
-
};
|
|
335
|
-
}
|
|
336
|
-
// Calculate level performance metrics
|
|
337
|
-
const levelDuration = Date.now() - levelStartTime;
|
|
338
|
-
const successfulCount = levelResults.filter((r) => r.status === 'fulfilled' && r.value.success).length;
|
|
339
|
-
const failedCount = levelResults.filter((r) => r.status === 'rejected' || (r.status === 'fulfilled' && !r.value.success)).length;
|
|
340
|
-
levelLogger.info(`Level ${levelIndex + 1} deployment completed`, {
|
|
341
|
-
successful: successfulCount,
|
|
342
|
-
failed: failedCount,
|
|
343
|
-
duration: levelDuration,
|
|
344
|
-
parallelism: currentLevel.length,
|
|
345
|
-
averageTimePerResource: Math.round(levelDuration / currentLevel.length),
|
|
346
|
-
});
|
|
347
|
-
}
|
|
348
|
-
const duration = Date.now() - startTime;
|
|
349
|
-
const successfulResources = deployedResources.filter((r) => r.status !== 'failed');
|
|
350
|
-
const status = errors.length === 0 ? 'success' : successfulResources.length > 0 ? 'partial' : 'failed';
|
|
351
|
-
// Log comprehensive performance metrics
|
|
352
|
-
deploymentLogger.info('Parallel deployment performance metrics', {
|
|
353
|
-
totalDuration: duration,
|
|
354
|
-
totalResources: deploymentPlan.totalResources,
|
|
355
|
-
parallelLevels: deploymentPlan.levels.length,
|
|
356
|
-
maxParallelism: deploymentPlan.maxParallelism,
|
|
357
|
-
averageTimePerResource: Math.round(duration / deploymentPlan.totalResources),
|
|
358
|
-
successfulResources: successfulResources.length,
|
|
359
|
-
failedResources: errors.length,
|
|
360
|
-
parallelismEfficiency: Math.round((deploymentPlan.totalResources /
|
|
361
|
-
deploymentPlan.levels.length /
|
|
362
|
-
deploymentPlan.maxParallelism) *
|
|
363
|
-
100),
|
|
364
|
-
status,
|
|
365
|
-
});
|
|
366
|
-
this.emitEvent(options, {
|
|
367
|
-
type: status === 'success' ? 'completed' : 'failed',
|
|
368
|
-
message: `Deployment ${status} in ${duration}ms (${deploymentPlan.levels.length} parallel levels, max ${deploymentPlan.maxParallelism} concurrent)`,
|
|
369
|
-
timestamp: new Date(),
|
|
370
|
-
});
|
|
371
|
-
// Stop event monitoring
|
|
372
|
-
if (this.eventMonitor) {
|
|
373
|
-
try {
|
|
374
|
-
await this.eventMonitor.stopMonitoring();
|
|
375
|
-
deploymentLogger.debug('Event monitoring stopped');
|
|
376
|
-
}
|
|
377
|
-
catch (error) {
|
|
378
|
-
deploymentLogger.warn('Failed to stop event monitoring cleanly', error);
|
|
220
|
+
const earlyReturn = await this.deployLevel(levelIndex, currentLevel, graph, deployedResources, errors, context, resourceKeyMapping, options, alchemyScope, abortSignal, startTime, deploymentId, deploymentLogger);
|
|
221
|
+
// If deployLevel returned a result, it means rollback occurred — return immediately
|
|
222
|
+
if (earlyReturn) {
|
|
223
|
+
await this.cleanupDeployment(deploymentAbortController, timeoutId, deploymentLogger);
|
|
224
|
+
return earlyReturn;
|
|
379
225
|
}
|
|
380
226
|
}
|
|
227
|
+
const result = this.buildDeploymentResult(deploymentId, graph, enhancedPlan, deployedResources, errors, startTime, options, deploymentLogger);
|
|
228
|
+
await this.cleanupDeployment(deploymentAbortController, timeoutId, deploymentLogger);
|
|
381
229
|
// Store deployment state for rollback
|
|
382
230
|
this.deploymentState.set(deploymentId, {
|
|
383
231
|
deploymentId,
|
|
@@ -385,39 +233,31 @@ export class DirectDeploymentEngine {
|
|
|
385
233
|
dependencyGraph: graph.dependencyGraph,
|
|
386
234
|
startTime: new Date(startTime),
|
|
387
235
|
endTime: new Date(),
|
|
388
|
-
status: status === 'success'
|
|
236
|
+
status: result.status === 'success'
|
|
237
|
+
? 'completed'
|
|
238
|
+
: result.status === 'partial'
|
|
239
|
+
? 'completed'
|
|
240
|
+
: 'failed',
|
|
389
241
|
options,
|
|
390
242
|
});
|
|
391
|
-
return
|
|
392
|
-
deploymentId,
|
|
393
|
-
resources: deployedResources,
|
|
394
|
-
dependencyGraph: graph.dependencyGraph,
|
|
395
|
-
duration,
|
|
396
|
-
status,
|
|
397
|
-
errors,
|
|
398
|
-
};
|
|
243
|
+
return result;
|
|
399
244
|
}
|
|
400
245
|
catch (error) {
|
|
401
246
|
// Re-throw circular dependency errors immediately - these are configuration errors
|
|
402
247
|
if (error instanceof CircularDependencyError) {
|
|
248
|
+
// Clean up abort controller and timeout before re-throwing
|
|
249
|
+
await this.cleanupDeployment(deploymentAbortController, timeoutId, deploymentLogger);
|
|
403
250
|
throw error;
|
|
404
251
|
}
|
|
252
|
+
// Clean up abort controller and timeout
|
|
253
|
+
await this.cleanupDeployment(deploymentAbortController, timeoutId, deploymentLogger);
|
|
405
254
|
const duration = Date.now() - startTime;
|
|
406
255
|
this.emitEvent(options, {
|
|
407
256
|
type: 'failed',
|
|
408
|
-
message: `Deployment failed: ${error}`,
|
|
257
|
+
message: `Deployment with closures failed: ${ensureError(error).message}`,
|
|
409
258
|
timestamp: new Date(),
|
|
410
|
-
error: error,
|
|
259
|
+
error: ensureError(error),
|
|
411
260
|
});
|
|
412
|
-
// Stop event monitoring on error
|
|
413
|
-
if (this.eventMonitor) {
|
|
414
|
-
try {
|
|
415
|
-
await this.eventMonitor.stopMonitoring();
|
|
416
|
-
}
|
|
417
|
-
catch (_cleanupError) {
|
|
418
|
-
// Ignore cleanup errors in error path
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
261
|
// Store deployment state even for failed deployments (for rollback)
|
|
422
262
|
this.deploymentState.set(deploymentId, {
|
|
423
263
|
deploymentId,
|
|
@@ -438,7 +278,7 @@ export class DirectDeploymentEngine {
|
|
|
438
278
|
{
|
|
439
279
|
resourceId: 'deployment',
|
|
440
280
|
phase: 'deployment',
|
|
441
|
-
error: error,
|
|
281
|
+
error: ensureError(error),
|
|
442
282
|
timestamp: new Date(),
|
|
443
283
|
},
|
|
444
284
|
],
|
|
@@ -446,439 +286,484 @@ export class DirectDeploymentEngine {
|
|
|
446
286
|
}
|
|
447
287
|
}
|
|
448
288
|
/**
|
|
449
|
-
*
|
|
289
|
+
* Create an AbortController and set up a timeout that aborts the deployment
|
|
290
|
+
* when the configured timeout is reached. Also stops event monitoring on timeout.
|
|
291
|
+
* @param deploymentId - The unique deployment ID for logging
|
|
292
|
+
* @param options - Deployment options containing the timeout configuration
|
|
293
|
+
* @param deploymentLogger - Logger scoped to this deployment
|
|
294
|
+
* @returns The AbortController and timeout ID for cleanup
|
|
450
295
|
*/
|
|
451
|
-
|
|
452
|
-
const
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
// Determine execution level based on dependencies
|
|
459
|
-
// For now, assign all closures to level -1 to ensure they run before all resources
|
|
460
|
-
// This is especially important for closures that install CRDs (like fluxSystem)
|
|
461
|
-
let level = -1;
|
|
462
|
-
if (dependencies.length > 0) {
|
|
463
|
-
// Find the maximum level of any dependency + 1
|
|
464
|
-
for (const depId of dependencies) {
|
|
465
|
-
const depLevel = this.getResourceLevel(depId, dependencyGraph);
|
|
466
|
-
level = Math.max(level, depLevel + 1);
|
|
467
|
-
}
|
|
468
|
-
}
|
|
469
|
-
closureDependencies.push({
|
|
470
|
-
name,
|
|
471
|
-
closure,
|
|
472
|
-
dependencies,
|
|
473
|
-
level,
|
|
296
|
+
setupDeploymentTimeout(deploymentId, options, deploymentLogger) {
|
|
297
|
+
const abortController = this.createTrackedAbortController();
|
|
298
|
+
const timeout = options.timeout || DEFAULT_DEPLOYMENT_TIMEOUT;
|
|
299
|
+
const timeoutId = setTimeout(() => {
|
|
300
|
+
deploymentLogger.debug('Deployment timeout reached, aborting operations', {
|
|
301
|
+
deploymentId,
|
|
302
|
+
timeout,
|
|
474
303
|
});
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
304
|
+
// Stop event monitoring immediately when timeout is reached
|
|
305
|
+
// This prevents watch connections from continuing to run and throwing errors
|
|
306
|
+
if (this.eventMonitor) {
|
|
307
|
+
this.eventMonitor.stopMonitoring().catch((error) => {
|
|
308
|
+
deploymentLogger.debug('Error stopping event monitoring on timeout', {
|
|
309
|
+
error: ensureError(error).message,
|
|
310
|
+
});
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
abortController.abort();
|
|
314
|
+
}, timeout);
|
|
315
|
+
return { abortController, timeoutId };
|
|
486
316
|
}
|
|
487
317
|
/**
|
|
488
|
-
*
|
|
318
|
+
* Validate the dependency graph for cycles, analyze deployment order,
|
|
319
|
+
* integrate closures into the plan, initialize event/debug monitoring,
|
|
320
|
+
* and build the resource key mapping and resolution context.
|
|
321
|
+
* @param graph - The deployment resource graph
|
|
322
|
+
* @param closures - Map of deployment closures keyed by name
|
|
323
|
+
* @param spec - The resource graph spec for closure dependency analysis
|
|
324
|
+
* @param options - Deployment options
|
|
325
|
+
* @param startTime - Deployment start timestamp for event monitoring
|
|
326
|
+
* @param deployedResources - Mutable array of deployed resources (used in resolution context)
|
|
327
|
+
* @param deploymentLogger - Logger scoped to this deployment
|
|
328
|
+
* @returns Enhanced plan, resolution context, and resource key mapping
|
|
489
329
|
*/
|
|
490
|
-
|
|
491
|
-
//
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
330
|
+
async validateAndPlanDeployment(graph, closures, spec, options, startTime, deployedResources, deploymentLogger) {
|
|
331
|
+
// 1. Validate no cycles in dependency graph
|
|
332
|
+
deploymentLogger.debug('Validating dependency graph', {
|
|
333
|
+
dependencyGraph: graph.dependencyGraph,
|
|
334
|
+
});
|
|
335
|
+
this.dependencyResolver.validateNoCycles(graph.dependencyGraph);
|
|
336
|
+
// 2. Analyze deployment order and identify parallel stages
|
|
337
|
+
deploymentLogger.debug('Analyzing deployment order for parallel execution');
|
|
338
|
+
const deploymentPlan = this.dependencyResolver.analyzeDeploymentOrder(graph.dependencyGraph);
|
|
339
|
+
deploymentLogger.debug('Deployment plan determined', {
|
|
340
|
+
levels: deploymentPlan.levels.length,
|
|
341
|
+
totalResources: deploymentPlan.totalResources,
|
|
342
|
+
maxParallelism: deploymentPlan.maxParallelism,
|
|
343
|
+
});
|
|
344
|
+
// 3. Initialize and start event monitoring if enabled
|
|
345
|
+
await this.initializeEventMonitoring(options, startTime, deploymentLogger);
|
|
346
|
+
// 3.1. Initialize debug logging if enabled
|
|
347
|
+
if (options.debugLogging?.enabled) {
|
|
348
|
+
this.debugLogger = createDebugLoggerFromDeploymentOptions(options);
|
|
349
|
+
this.readinessChecker.setDebugLogger(this.debugLogger);
|
|
350
|
+
deploymentLogger.debug('Debug logging initialized');
|
|
351
|
+
}
|
|
352
|
+
// 4. Analyze closure dependencies and integrate into deployment plan
|
|
353
|
+
const closureDependencies = analyzeClosureDependencies(closures, spec, graph.dependencyGraph, this.dependencyResolver);
|
|
354
|
+
const enhancedPlan = integrateClosuresIntoPlan(deploymentPlan, closureDependencies);
|
|
355
|
+
deploymentLogger.debug('Enhanced deployment plan with closures', {
|
|
356
|
+
levels: enhancedPlan.levels.length,
|
|
357
|
+
totalResources: enhancedPlan.totalResources,
|
|
358
|
+
totalClosures: enhancedPlan.totalClosures,
|
|
359
|
+
maxParallelism: enhancedPlan.maxParallelism,
|
|
360
|
+
});
|
|
361
|
+
// 5. Create resolution context with resourceKeyMapping for cross-resource references
|
|
362
|
+
// The resourceKeyMapping maps original resource IDs (like 'webappDeployment') to their manifests
|
|
363
|
+
const resourceKeyMapping = new Map();
|
|
364
|
+
for (const resource of graph.resources) {
|
|
365
|
+
const manifest = resource.manifest;
|
|
366
|
+
const originalResourceId = getResourceMetadataId(manifest);
|
|
367
|
+
if (originalResourceId) {
|
|
368
|
+
// Convert the Enhanced proxy to a plain object for reliable field extraction
|
|
369
|
+
// The proxy's toJSON method returns a clean object without proxy behavior
|
|
370
|
+
const plainManifest = typeof manifest.toJSON === 'function'
|
|
371
|
+
? manifest.toJSON()
|
|
372
|
+
: JSON.parse(JSON.stringify(manifest));
|
|
373
|
+
resourceKeyMapping.set(originalResourceId, plainManifest);
|
|
374
|
+
deploymentLogger.debug('Added resource to resourceKeyMapping', {
|
|
375
|
+
originalResourceId,
|
|
376
|
+
kind: manifest.kind,
|
|
377
|
+
name: manifest.metadata?.name,
|
|
378
|
+
});
|
|
497
379
|
}
|
|
498
380
|
}
|
|
499
|
-
|
|
381
|
+
const context = {
|
|
382
|
+
deployedResources,
|
|
383
|
+
kubeClient: this.kubeClient,
|
|
384
|
+
resourceKeyMapping,
|
|
385
|
+
...(options.namespace && { namespace: options.namespace }),
|
|
386
|
+
timeout: options.timeout || DEFAULT_READINESS_TIMEOUT,
|
|
387
|
+
};
|
|
388
|
+
return { enhancedPlan, context, resourceKeyMapping };
|
|
500
389
|
}
|
|
501
390
|
/**
|
|
502
|
-
*
|
|
391
|
+
* Initialize and start Kubernetes event monitoring if enabled in deployment options.
|
|
392
|
+
* Logs a warning and continues if initialization fails.
|
|
393
|
+
* @param options - Deployment options containing event monitoring configuration
|
|
394
|
+
* @param startTime - Deployment start timestamp to filter events
|
|
395
|
+
* @param deploymentLogger - Logger scoped to this deployment
|
|
503
396
|
*/
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
for (let i = 0; i < deploymentPlan.levels.length; i++) {
|
|
518
|
-
enhancedLevels.push({
|
|
519
|
-
resources: deploymentPlan.levels[i] || [],
|
|
520
|
-
closures: [],
|
|
521
|
-
});
|
|
522
|
-
}
|
|
523
|
-
// Add closures to their appropriate levels (excluding level -1 which we already handled)
|
|
524
|
-
for (const closureInfo of closureDependencies) {
|
|
525
|
-
if (closureInfo.level === -1) {
|
|
526
|
-
continue; // Already handled above
|
|
527
|
-
}
|
|
528
|
-
// Adjust level index if we added a pre-resource level
|
|
529
|
-
const adjustedLevel = preResourceClosures.length > 0 ? closureInfo.level + 1 : closureInfo.level;
|
|
530
|
-
// Ensure we have enough levels
|
|
531
|
-
while (enhancedLevels.length <= adjustedLevel) {
|
|
532
|
-
enhancedLevels.push({ resources: [], closures: [] });
|
|
397
|
+
async initializeEventMonitoring(options, startTime, deploymentLogger) {
|
|
398
|
+
if (options.eventMonitoring?.enabled) {
|
|
399
|
+
try {
|
|
400
|
+
this.eventMonitor = createEventMonitor(this.kubeClient, {
|
|
401
|
+
namespace: options.namespace || 'default',
|
|
402
|
+
eventTypes: options.eventMonitoring.eventTypes || ['Warning', 'Error'],
|
|
403
|
+
includeChildResources: options.eventMonitoring.includeChildResources ?? true,
|
|
404
|
+
startTime: new Date(startTime),
|
|
405
|
+
...(options.progressCallback && { progressCallback: options.progressCallback }),
|
|
406
|
+
});
|
|
407
|
+
// Start monitoring immediately to capture all deployment events
|
|
408
|
+
await this.eventMonitor.startMonitoring([]);
|
|
409
|
+
deploymentLogger.debug('Event monitoring started for deployment');
|
|
533
410
|
}
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
411
|
+
catch (error) {
|
|
412
|
+
deploymentLogger.warn('Failed to initialize event monitoring, continuing without it', {
|
|
413
|
+
error: ensureError(error).message,
|
|
414
|
+
});
|
|
537
415
|
}
|
|
538
416
|
}
|
|
539
|
-
return {
|
|
540
|
-
levels: enhancedLevels,
|
|
541
|
-
totalResources: deploymentPlan.totalResources,
|
|
542
|
-
totalClosures: closureDependencies.length,
|
|
543
|
-
maxParallelism: Math.max(deploymentPlan.maxParallelism, Math.max(...enhancedLevels.map((level) => level.closures.length))),
|
|
544
|
-
};
|
|
545
417
|
}
|
|
546
418
|
/**
|
|
547
|
-
* Deploy a
|
|
419
|
+
* Deploy a single level of resources and closures in parallel. Processes results,
|
|
420
|
+
* handles rollback on failure if configured, and logs level performance metrics.
|
|
421
|
+
* Returns a DeploymentResult if rollback occurred (early exit), or undefined to continue.
|
|
422
|
+
* @param levelIndex - Zero-based index of the current level
|
|
423
|
+
* @param currentLevel - The level definition containing resource IDs and closures
|
|
424
|
+
* @param graph - The full deployment resource graph
|
|
425
|
+
* @param deployedResources - Mutable array accumulating deployed resources across levels
|
|
426
|
+
* @param errors - Mutable array accumulating deployment errors across levels
|
|
427
|
+
* @param context - Resolution context for cross-resource references
|
|
428
|
+
* @param resourceKeyMapping - Map from resource IDs to their manifests (updated with live data)
|
|
429
|
+
* @param options - Deployment options
|
|
430
|
+
* @param alchemyScope - Optional alchemy scope for closure deployment context
|
|
431
|
+
* @param abortSignal - Signal to abort deployment operations
|
|
432
|
+
* @param startTime - Deployment start timestamp (used for rollback duration calculation)
|
|
433
|
+
* @param deploymentId - Unique deployment ID for result building
|
|
434
|
+
* @param deploymentLogger - Logger scoped to this deployment
|
|
435
|
+
* @returns DeploymentResult if rollback occurred, undefined otherwise
|
|
548
436
|
*/
|
|
549
|
-
async
|
|
550
|
-
const
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
const deploymentLogger = this.logger.child({
|
|
555
|
-
deploymentId,
|
|
556
|
-
resourceCount: graph.resources.length,
|
|
557
|
-
closureCount: Object.keys(closures).length,
|
|
558
|
-
});
|
|
559
|
-
deploymentLogger.info('Starting deployment with closures', {
|
|
560
|
-
options,
|
|
561
|
-
closures: Object.keys(closures),
|
|
437
|
+
async deployLevel(levelIndex, currentLevel, graph, deployedResources, errors, context, resourceKeyMapping, options, alchemyScope, abortSignal, startTime, deploymentId, deploymentLogger) {
|
|
438
|
+
const levelLogger = deploymentLogger.child({
|
|
439
|
+
level: levelIndex + 1,
|
|
440
|
+
resourceCount: currentLevel.resources.length,
|
|
441
|
+
closureCount: currentLevel.closures.length,
|
|
562
442
|
});
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
this.
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
443
|
+
levelLogger.debug(`Deploying level ${levelIndex + 1} with ${currentLevel.resources.length} resources and ${currentLevel.closures.length} closures in parallel`);
|
|
444
|
+
const levelStartTime = Date.now();
|
|
445
|
+
// Create deployment context for closures at this level
|
|
446
|
+
const deployedResourcesMap = new Map();
|
|
447
|
+
// Populate with resources from previous levels
|
|
448
|
+
for (const resource of deployedResources) {
|
|
449
|
+
deployedResourcesMap.set(resource.id, resource);
|
|
450
|
+
}
|
|
451
|
+
const deploymentContext = {
|
|
452
|
+
kubernetesApi: this.k8sApi,
|
|
453
|
+
kubeConfig: this.kubeClient,
|
|
454
|
+
...(alchemyScope && { alchemyScope }),
|
|
455
|
+
...(options.namespace && { namespace: options.namespace }),
|
|
456
|
+
deployedResources: deployedResourcesMap,
|
|
457
|
+
resolveReference: async (ref) => {
|
|
458
|
+
// Enhanced reference resolution - will be improved in future tasks
|
|
459
|
+
return ref;
|
|
460
|
+
},
|
|
461
|
+
};
|
|
462
|
+
// Prepare promises for both resources and closures
|
|
463
|
+
const levelPromises = [];
|
|
464
|
+
// Add resource deployment promises
|
|
465
|
+
const resourcePromises = currentLevel.resources.map(async (resourceId) => {
|
|
466
|
+
const resourceLogger = deploymentLogger.child({ resourceId });
|
|
467
|
+
resourceLogger.debug('Starting resource deployment');
|
|
468
|
+
const resource = graph.resources.find((r) => r.id === resourceId);
|
|
469
|
+
if (!resource) {
|
|
470
|
+
resourceLogger.error('Resource not found in graph');
|
|
471
|
+
const error = new Error(`Resource with id '${resourceId}' not found in graph`);
|
|
472
|
+
return {
|
|
473
|
+
success: false,
|
|
474
|
+
resourceId,
|
|
475
|
+
error: {
|
|
476
|
+
resourceId,
|
|
477
|
+
phase: 'validation',
|
|
478
|
+
error,
|
|
479
|
+
timestamp: new Date(),
|
|
480
|
+
},
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
resourceLogger.debug('Found resource in graph', {
|
|
484
|
+
resourceId: resource.id,
|
|
485
|
+
kind: resource.manifest?.kind,
|
|
486
|
+
name: resource.manifest?.metadata?.name,
|
|
590
487
|
});
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
// Populate with resources from previous levels
|
|
614
|
-
for (const resource of deployedResources) {
|
|
615
|
-
deployedResourcesMap.set(resource.id, resource);
|
|
488
|
+
try {
|
|
489
|
+
resourceLogger.debug('Calling deploySingleResource');
|
|
490
|
+
// Wait for CRD establishment if this is a custom resource
|
|
491
|
+
await this.crdManager.waitForCRDIfCustomResource(resource.manifest, options, resourceLogger, abortSignal);
|
|
492
|
+
const resourceWithEvaluator = ensureReadinessEvaluator(resource.manifest);
|
|
493
|
+
// Add resource to event monitoring before deployment to capture creation events
|
|
494
|
+
// NOTE: This is fire-and-forget to avoid blocking the deployment path.
|
|
495
|
+
if (this.eventMonitor) {
|
|
496
|
+
const preDeployedResource = {
|
|
497
|
+
id: resourceId,
|
|
498
|
+
kind: resourceWithEvaluator.kind,
|
|
499
|
+
name: resourceWithEvaluator.metadata?.name || 'unknown',
|
|
500
|
+
namespace: resourceWithEvaluator.metadata?.namespace || options.namespace || 'default',
|
|
501
|
+
manifest: resourceWithEvaluator,
|
|
502
|
+
status: 'deployed',
|
|
503
|
+
deployedAt: new Date(),
|
|
504
|
+
};
|
|
505
|
+
this.eventMonitor.addResources([preDeployedResource]).then(() => {
|
|
506
|
+
resourceLogger.debug('Added resource to event monitoring before deployment');
|
|
507
|
+
}, (error) => {
|
|
508
|
+
resourceLogger.warn('Failed to add resource to event monitoring, continuing deployment', { error: ensureError(error).message });
|
|
509
|
+
});
|
|
616
510
|
}
|
|
617
|
-
const
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
511
|
+
const deployedResource = await this.deploySingleResource(resourceWithEvaluator, context, options, abortSignal);
|
|
512
|
+
resourceLogger.debug('Resource deployed successfully');
|
|
513
|
+
return {
|
|
514
|
+
success: true,
|
|
515
|
+
resourceId,
|
|
516
|
+
deployedResource,
|
|
517
|
+
};
|
|
518
|
+
}
|
|
519
|
+
catch (error) {
|
|
520
|
+
resourceLogger.error('Resource deployment failed', ensureError(error));
|
|
521
|
+
const failedResource = {
|
|
522
|
+
id: resourceId,
|
|
523
|
+
kind: resource.manifest.kind,
|
|
524
|
+
name: resource.manifest.metadata?.name || 'unknown',
|
|
525
|
+
namespace: resource.manifest.metadata?.namespace || 'default',
|
|
526
|
+
manifest: resource.manifest,
|
|
527
|
+
status: 'failed',
|
|
528
|
+
deployedAt: new Date(),
|
|
529
|
+
error: ensureError(error),
|
|
530
|
+
};
|
|
531
|
+
return {
|
|
532
|
+
success: false,
|
|
533
|
+
resourceId,
|
|
534
|
+
deployedResource: failedResource,
|
|
535
|
+
error: {
|
|
536
|
+
resourceId,
|
|
537
|
+
phase: 'deployment',
|
|
538
|
+
error: ensureError(error),
|
|
539
|
+
timestamp: new Date(),
|
|
625
540
|
},
|
|
626
541
|
};
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
return {
|
|
638
|
-
success: false,
|
|
639
|
-
resourceId,
|
|
640
|
-
error: {
|
|
641
|
-
resourceId,
|
|
642
|
-
phase: 'validation',
|
|
643
|
-
error,
|
|
644
|
-
timestamp: new Date(),
|
|
645
|
-
},
|
|
646
|
-
};
|
|
647
|
-
}
|
|
648
|
-
resourceLogger.debug('Found resource in graph', {
|
|
649
|
-
resourceId: resource.id,
|
|
650
|
-
kind: resource.manifest?.kind,
|
|
651
|
-
name: resource.manifest?.metadata?.name,
|
|
652
|
-
});
|
|
653
|
-
try {
|
|
654
|
-
resourceLogger.debug('Calling deploySingleResource');
|
|
655
|
-
const resourceWithEvaluator = ensureReadinessEvaluator(resource.manifest);
|
|
656
|
-
const deployedResource = await this.deploySingleResource(resourceWithEvaluator, context, options);
|
|
657
|
-
resourceLogger.debug('Resource deployed successfully');
|
|
658
|
-
return {
|
|
659
|
-
success: true,
|
|
660
|
-
resourceId,
|
|
661
|
-
deployedResource,
|
|
662
|
-
};
|
|
663
|
-
}
|
|
664
|
-
catch (error) {
|
|
665
|
-
resourceLogger.error('Resource deployment failed', error);
|
|
666
|
-
const failedResource = {
|
|
667
|
-
id: resourceId,
|
|
668
|
-
kind: resource.manifest.kind,
|
|
669
|
-
name: resource.manifest.metadata?.name || 'unknown',
|
|
670
|
-
namespace: resource.manifest.metadata?.namespace || 'default',
|
|
671
|
-
manifest: resource.manifest,
|
|
672
|
-
status: 'failed',
|
|
673
|
-
deployedAt: new Date(),
|
|
674
|
-
error: error,
|
|
675
|
-
};
|
|
676
|
-
return {
|
|
677
|
-
success: false,
|
|
678
|
-
resourceId,
|
|
679
|
-
deployedResource: failedResource,
|
|
680
|
-
error: {
|
|
681
|
-
resourceId,
|
|
682
|
-
phase: 'deployment',
|
|
683
|
-
error: error,
|
|
684
|
-
timestamp: new Date(),
|
|
685
|
-
},
|
|
686
|
-
};
|
|
687
|
-
}
|
|
542
|
+
}
|
|
543
|
+
});
|
|
544
|
+
// Add closure execution promises
|
|
545
|
+
const closurePromises = currentLevel.closures.map(async (closureInfo) => {
|
|
546
|
+
const closureLogger = levelLogger.child({ closureName: closureInfo.name });
|
|
547
|
+
closureLogger.debug('Executing closure at level', { level: levelIndex + 1 });
|
|
548
|
+
try {
|
|
549
|
+
const result = await closureInfo.closure(deploymentContext);
|
|
550
|
+
closureLogger.debug('Closure executed successfully', {
|
|
551
|
+
resultCount: result?.length || 0,
|
|
688
552
|
});
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
}
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
553
|
+
return {
|
|
554
|
+
success: true,
|
|
555
|
+
type: 'closure',
|
|
556
|
+
name: closureInfo.name,
|
|
557
|
+
result,
|
|
558
|
+
};
|
|
559
|
+
}
|
|
560
|
+
catch (error) {
|
|
561
|
+
closureLogger.error('Closure execution failed', ensureError(error));
|
|
562
|
+
return {
|
|
563
|
+
success: false,
|
|
564
|
+
type: 'closure',
|
|
565
|
+
name: closureInfo.name,
|
|
566
|
+
error: {
|
|
567
|
+
resourceId: `closure-${closureInfo.name}`,
|
|
568
|
+
phase: 'deployment',
|
|
569
|
+
error: ensureError(error),
|
|
570
|
+
timestamp: new Date(),
|
|
571
|
+
},
|
|
572
|
+
};
|
|
573
|
+
}
|
|
574
|
+
});
|
|
575
|
+
// Combine all promises for this level
|
|
576
|
+
levelPromises.push(...resourcePromises, ...closurePromises);
|
|
577
|
+
// Wait for all resources and closures in this level to complete
|
|
578
|
+
const levelResults = await Promise.allSettled(levelPromises);
|
|
579
|
+
// Process results and handle errors
|
|
580
|
+
let levelHasFailures = false;
|
|
581
|
+
let successfulResources = 0;
|
|
582
|
+
let successfulClosures = 0;
|
|
583
|
+
let failedResources = 0;
|
|
584
|
+
let failedClosures = 0;
|
|
585
|
+
for (const result of levelResults) {
|
|
586
|
+
if (result.status === 'fulfilled') {
|
|
587
|
+
const deploymentResult = result.value;
|
|
588
|
+
if (deploymentResult.type === 'closure') {
|
|
589
|
+
// Handle closure result
|
|
590
|
+
if (deploymentResult.success) {
|
|
591
|
+
successfulClosures++;
|
|
718
592
|
}
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
// Process results and handle errors
|
|
725
|
-
let levelHasFailures = false;
|
|
726
|
-
let successfulResources = 0;
|
|
727
|
-
let successfulClosures = 0;
|
|
728
|
-
let failedResources = 0;
|
|
729
|
-
let failedClosures = 0;
|
|
730
|
-
for (const result of levelResults) {
|
|
731
|
-
if (result.status === 'fulfilled') {
|
|
732
|
-
const deploymentResult = result.value;
|
|
733
|
-
if (deploymentResult.type === 'closure') {
|
|
734
|
-
// Handle closure result
|
|
735
|
-
if (deploymentResult.success) {
|
|
736
|
-
successfulClosures++;
|
|
737
|
-
}
|
|
738
|
-
else {
|
|
739
|
-
levelHasFailures = true;
|
|
740
|
-
failedClosures++;
|
|
741
|
-
if (deploymentResult.error) {
|
|
742
|
-
errors.push(deploymentResult.error);
|
|
743
|
-
}
|
|
744
|
-
}
|
|
745
|
-
}
|
|
746
|
-
else {
|
|
747
|
-
// Handle resource result
|
|
748
|
-
if (deploymentResult.success && deploymentResult.deployedResource) {
|
|
749
|
-
deployedResources.push(deploymentResult.deployedResource);
|
|
750
|
-
successfulResources++;
|
|
751
|
-
}
|
|
752
|
-
else {
|
|
753
|
-
levelHasFailures = true;
|
|
754
|
-
failedResources++;
|
|
755
|
-
if (deploymentResult.error) {
|
|
756
|
-
errors.push(deploymentResult.error);
|
|
757
|
-
}
|
|
758
|
-
if (deploymentResult.deployedResource) {
|
|
759
|
-
deployedResources.push(deploymentResult.deployedResource);
|
|
760
|
-
}
|
|
761
|
-
}
|
|
593
|
+
else {
|
|
594
|
+
levelHasFailures = true;
|
|
595
|
+
failedClosures++;
|
|
596
|
+
if (deploymentResult.error) {
|
|
597
|
+
errors.push(deploymentResult.error);
|
|
762
598
|
}
|
|
763
599
|
}
|
|
600
|
+
}
|
|
601
|
+
else {
|
|
602
|
+
// Handle resource result
|
|
603
|
+
if (deploymentResult.success && deploymentResult.deployedResource) {
|
|
604
|
+
deployedResources.push(deploymentResult.deployedResource);
|
|
605
|
+
successfulResources++;
|
|
606
|
+
await this.updateResourceKeyMappingWithLiveResource(deploymentResult.deployedResource, resourceKeyMapping, deploymentLogger);
|
|
607
|
+
}
|
|
764
608
|
else {
|
|
765
609
|
levelHasFailures = true;
|
|
766
|
-
|
|
610
|
+
failedResources++;
|
|
611
|
+
if (deploymentResult.error) {
|
|
612
|
+
errors.push(deploymentResult.error);
|
|
613
|
+
}
|
|
614
|
+
if (deploymentResult.deployedResource) {
|
|
615
|
+
deployedResources.push(deploymentResult.deployedResource);
|
|
616
|
+
}
|
|
767
617
|
}
|
|
768
618
|
}
|
|
769
|
-
// Handle rollback if there are failures and rollback is enabled
|
|
770
|
-
if (levelHasFailures && options.rollbackOnFailure) {
|
|
771
|
-
levelLogger.warn('Level deployment failed, initiating rollback');
|
|
772
|
-
await this.rollbackDeployedResources(deployedResources, options);
|
|
773
|
-
const duration = Date.now() - startTime;
|
|
774
|
-
this.emitEvent(options, {
|
|
775
|
-
type: 'rollback',
|
|
776
|
-
message: `Deployment failed and rolled back in ${duration}ms`,
|
|
777
|
-
timestamp: new Date(),
|
|
778
|
-
});
|
|
779
|
-
return {
|
|
780
|
-
deploymentId,
|
|
781
|
-
resources: deployedResources,
|
|
782
|
-
dependencyGraph: graph.dependencyGraph,
|
|
783
|
-
duration,
|
|
784
|
-
status: 'failed',
|
|
785
|
-
errors,
|
|
786
|
-
};
|
|
787
|
-
}
|
|
788
|
-
// Calculate level performance metrics
|
|
789
|
-
const levelDuration = Date.now() - levelStartTime;
|
|
790
|
-
const totalOperations = currentLevel.resources.length + currentLevel.closures.length;
|
|
791
|
-
levelLogger.info(`Level ${levelIndex + 1} deployment completed`, {
|
|
792
|
-
resources: { successful: successfulResources, failed: failedResources },
|
|
793
|
-
closures: { successful: successfulClosures, failed: failedClosures },
|
|
794
|
-
duration: levelDuration,
|
|
795
|
-
parallelism: totalOperations,
|
|
796
|
-
averageTimePerOperation: totalOperations > 0 ? Math.round(levelDuration / totalOperations) : 0,
|
|
797
|
-
});
|
|
798
619
|
}
|
|
620
|
+
else {
|
|
621
|
+
levelHasFailures = true;
|
|
622
|
+
levelLogger.error('Unexpected promise rejection in parallel deployment', result.reason);
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
// Handle rollback if there are failures and rollback is enabled
|
|
626
|
+
if (levelHasFailures && options.rollbackOnFailure) {
|
|
627
|
+
levelLogger.warn('Level deployment failed, initiating rollback');
|
|
628
|
+
await this.rollbackDeployedResources(deployedResources, options);
|
|
799
629
|
const duration = Date.now() - startTime;
|
|
800
|
-
const successfulResources = deployedResources.filter((r) => r.status !== 'failed');
|
|
801
|
-
const status = errors.length === 0 ? 'success' : successfulResources.length > 0 ? 'partial' : 'failed';
|
|
802
|
-
// Log comprehensive performance metrics
|
|
803
|
-
deploymentLogger.info('Parallel deployment with closures performance metrics', {
|
|
804
|
-
totalDuration: duration,
|
|
805
|
-
totalResources: enhancedPlan.totalResources,
|
|
806
|
-
totalClosures: enhancedPlan.totalClosures,
|
|
807
|
-
parallelLevels: enhancedPlan.levels.length,
|
|
808
|
-
maxParallelism: enhancedPlan.maxParallelism,
|
|
809
|
-
averageTimePerResource: enhancedPlan.totalResources > 0 ? Math.round(duration / enhancedPlan.totalResources) : 0,
|
|
810
|
-
successfulResources: successfulResources.length,
|
|
811
|
-
failedResources: errors.length,
|
|
812
|
-
status,
|
|
813
|
-
});
|
|
814
630
|
this.emitEvent(options, {
|
|
815
|
-
type:
|
|
816
|
-
message: `Deployment
|
|
631
|
+
type: 'rollback',
|
|
632
|
+
message: `Deployment failed and rolled back in ${duration}ms`,
|
|
817
633
|
timestamp: new Date(),
|
|
818
634
|
});
|
|
819
|
-
// Store deployment state for rollback
|
|
820
|
-
this.deploymentState.set(deploymentId, {
|
|
821
|
-
deploymentId,
|
|
822
|
-
resources: deployedResources,
|
|
823
|
-
dependencyGraph: graph.dependencyGraph,
|
|
824
|
-
startTime: new Date(startTime),
|
|
825
|
-
endTime: new Date(),
|
|
826
|
-
status: status === 'success' ? 'completed' : status === 'partial' ? 'completed' : 'failed',
|
|
827
|
-
options,
|
|
828
|
-
});
|
|
829
635
|
return {
|
|
830
636
|
deploymentId,
|
|
831
637
|
resources: deployedResources,
|
|
832
638
|
dependencyGraph: graph.dependencyGraph,
|
|
833
639
|
duration,
|
|
834
|
-
status,
|
|
640
|
+
status: 'failed',
|
|
835
641
|
errors,
|
|
836
642
|
};
|
|
837
643
|
}
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
644
|
+
// Calculate level performance metrics
|
|
645
|
+
const levelDuration = Date.now() - levelStartTime;
|
|
646
|
+
const totalOperations = currentLevel.resources.length + currentLevel.closures.length;
|
|
647
|
+
levelLogger.info(`Level ${levelIndex + 1} deployment completed`, {
|
|
648
|
+
resources: { successful: successfulResources, failed: failedResources },
|
|
649
|
+
closures: { successful: successfulClosures, failed: failedClosures },
|
|
650
|
+
duration: levelDuration,
|
|
651
|
+
parallelism: totalOperations,
|
|
652
|
+
averageTimePerOperation: totalOperations > 0 ? Math.round(levelDuration / totalOperations) : 0,
|
|
653
|
+
});
|
|
654
|
+
return undefined;
|
|
655
|
+
}
|
|
656
|
+
/**
|
|
657
|
+
* Build the final DeploymentResult after all levels have been deployed.
|
|
658
|
+
* Logs comprehensive performance metrics and emits completion/failure events.
|
|
659
|
+
* @param deploymentId - Unique deployment ID
|
|
660
|
+
* @param graph - The deployment resource graph
|
|
661
|
+
* @param enhancedPlan - The enhanced deployment plan with closure information
|
|
662
|
+
* @param deployedResources - All deployed resources across all levels
|
|
663
|
+
* @param errors - All deployment errors across all levels
|
|
664
|
+
* @param startTime - Deployment start timestamp
|
|
665
|
+
* @param options - Deployment options for event emission
|
|
666
|
+
* @param deploymentLogger - Logger scoped to this deployment
|
|
667
|
+
* @returns The final deployment result
|
|
668
|
+
*/
|
|
669
|
+
buildDeploymentResult(deploymentId, graph, enhancedPlan, deployedResources, errors, startTime, options, deploymentLogger) {
|
|
670
|
+
const duration = Date.now() - startTime;
|
|
671
|
+
const successfulResources = deployedResources.filter((r) => r.status !== 'failed');
|
|
672
|
+
const status = errors.length === 0 ? 'success' : successfulResources.length > 0 ? 'partial' : 'failed';
|
|
673
|
+
// Log comprehensive performance metrics
|
|
674
|
+
deploymentLogger.info('Parallel deployment with closures performance metrics', {
|
|
675
|
+
totalDuration: duration,
|
|
676
|
+
totalResources: enhancedPlan.totalResources,
|
|
677
|
+
totalClosures: enhancedPlan.totalClosures,
|
|
678
|
+
parallelLevels: enhancedPlan.levels.length,
|
|
679
|
+
maxParallelism: enhancedPlan.maxParallelism,
|
|
680
|
+
averageTimePerResource: enhancedPlan.totalResources > 0 ? Math.round(duration / enhancedPlan.totalResources) : 0,
|
|
681
|
+
successfulResources: successfulResources.length,
|
|
682
|
+
failedResources: errors.length,
|
|
683
|
+
status,
|
|
684
|
+
});
|
|
685
|
+
this.emitEvent(options, {
|
|
686
|
+
type: status === 'success' ? 'completed' : 'failed',
|
|
687
|
+
message: `Deployment with closures ${status} in ${duration}ms (${enhancedPlan.totalClosures} closures + ${enhancedPlan.totalResources} resources across ${enhancedPlan.levels.length} levels)`,
|
|
688
|
+
timestamp: new Date(),
|
|
689
|
+
});
|
|
690
|
+
return {
|
|
691
|
+
deploymentId,
|
|
692
|
+
resources: deployedResources,
|
|
693
|
+
dependencyGraph: graph.dependencyGraph,
|
|
694
|
+
duration,
|
|
695
|
+
status,
|
|
696
|
+
errors,
|
|
697
|
+
};
|
|
698
|
+
}
|
|
699
|
+
/**
|
|
700
|
+
* Stop event monitoring, clear the deployment timeout, and remove the
|
|
701
|
+
* abort controller from tracking. Safe to call multiple times.
|
|
702
|
+
* @param abortController - The deployment's AbortController to untrack
|
|
703
|
+
* @param timeoutId - The timeout ID to clear
|
|
704
|
+
* @param deploymentLogger - Logger scoped to this deployment
|
|
705
|
+
*/
|
|
706
|
+
async cleanupDeployment(abortController, timeoutId, deploymentLogger) {
|
|
707
|
+
// Stop event monitoring
|
|
708
|
+
if (this.eventMonitor) {
|
|
709
|
+
try {
|
|
710
|
+
await this.eventMonitor.stopMonitoring();
|
|
711
|
+
deploymentLogger.debug('Event monitoring stopped');
|
|
842
712
|
}
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
713
|
+
catch (error) {
|
|
714
|
+
deploymentLogger.warn('Failed to stop event monitoring cleanly', {
|
|
715
|
+
error: ensureError(error).message,
|
|
716
|
+
});
|
|
717
|
+
}
|
|
718
|
+
}
|
|
719
|
+
// Clean up abort controller and timeout
|
|
720
|
+
clearTimeout(timeoutId);
|
|
721
|
+
this.removeTrackedAbortController(abortController);
|
|
722
|
+
}
|
|
723
|
+
/**
|
|
724
|
+
* Update the resourceKeyMapping with a live resource fetched from the cluster.
|
|
725
|
+
* This is critical for CEL expression evaluation which needs access to resource status.
|
|
726
|
+
*/
|
|
727
|
+
async updateResourceKeyMappingWithLiveResource(deployedRes, resourceKeyMapping, logger) {
|
|
728
|
+
const originalResourceId = getResourceMetadataId(deployedRes.manifest);
|
|
729
|
+
if (!originalResourceId || !resourceKeyMapping.has(originalResourceId)) {
|
|
730
|
+
return;
|
|
731
|
+
}
|
|
732
|
+
try {
|
|
733
|
+
const liveResource = await this.k8sApi.read({
|
|
734
|
+
apiVersion: deployedRes.manifest.apiVersion || '',
|
|
735
|
+
kind: deployedRes.kind,
|
|
736
|
+
metadata: {
|
|
737
|
+
name: deployedRes.name,
|
|
738
|
+
namespace: deployedRes.namespace,
|
|
739
|
+
},
|
|
849
740
|
});
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
741
|
+
resourceKeyMapping.set(originalResourceId, liveResource);
|
|
742
|
+
logger.debug('Updated resourceKeyMapping with live resource status', {
|
|
743
|
+
originalResourceId,
|
|
744
|
+
kind: deployedRes.kind,
|
|
745
|
+
name: deployedRes.name,
|
|
746
|
+
hasStatus: !!liveResource.status,
|
|
747
|
+
});
|
|
748
|
+
}
|
|
749
|
+
catch (error) {
|
|
750
|
+
logger.warn('Failed to update resourceKeyMapping with live resource', {
|
|
751
|
+
originalResourceId,
|
|
752
|
+
error: ensureError(error).message,
|
|
859
753
|
});
|
|
860
|
-
return {
|
|
861
|
-
deploymentId,
|
|
862
|
-
resources: deployedResources,
|
|
863
|
-
dependencyGraph: graph.dependencyGraph,
|
|
864
|
-
duration,
|
|
865
|
-
status: 'failed',
|
|
866
|
-
errors: [
|
|
867
|
-
{
|
|
868
|
-
resourceId: 'deployment',
|
|
869
|
-
phase: 'deployment',
|
|
870
|
-
error: error,
|
|
871
|
-
timestamp: new Date(),
|
|
872
|
-
},
|
|
873
|
-
],
|
|
874
|
-
};
|
|
875
754
|
}
|
|
876
|
-
}
|
|
877
|
-
|
|
755
|
+
}
|
|
756
|
+
/**
|
|
878
757
|
* Deploy a single resource
|
|
879
758
|
*/
|
|
880
|
-
async deploySingleResource(resource, context, options) {
|
|
881
|
-
|
|
759
|
+
async deploySingleResource(resource, context, options, abortSignal) {
|
|
760
|
+
// Check if already aborted
|
|
761
|
+
if (abortSignal?.aborted) {
|
|
762
|
+
throw new DOMException('Operation aborted', 'AbortError');
|
|
763
|
+
}
|
|
764
|
+
// Resource ID from WeakMap metadata or deterministic ID generation
|
|
765
|
+
const internalId = getResourceMetadataId(resource);
|
|
766
|
+
const resourceId = internalId || getResourceId(resource);
|
|
882
767
|
const resourceLogger = this.logger.child({
|
|
883
768
|
resourceId,
|
|
884
769
|
kind: resource.kind,
|
|
@@ -892,146 +777,11 @@ export class DirectDeploymentEngine {
|
|
|
892
777
|
timestamp: new Date(),
|
|
893
778
|
});
|
|
894
779
|
// 1. Resolve all references in the resource
|
|
895
|
-
|
|
896
|
-
try {
|
|
897
|
-
resourceLogger.debug('Resolving resource references', {
|
|
898
|
-
originalMetadata: resource.metadata,
|
|
899
|
-
});
|
|
900
|
-
const resolveTimeout = options.timeout || 30000;
|
|
901
|
-
resolvedResource = (await Promise.race([
|
|
902
|
-
this.referenceResolver.resolveReferences(resource, context),
|
|
903
|
-
new Promise((_, reject) => setTimeout(() => reject(new Error('Reference resolution timeout')), resolveTimeout)),
|
|
904
|
-
]));
|
|
905
|
-
resourceLogger.debug('References resolved successfully', {
|
|
906
|
-
resolvedMetadata: resolvedResource.metadata,
|
|
907
|
-
hasReadinessEvaluator: !!resolvedResource.readinessEvaluator,
|
|
908
|
-
});
|
|
909
|
-
}
|
|
910
|
-
catch (error) {
|
|
911
|
-
resourceLogger.warn('Reference resolution failed, using original resource', error);
|
|
912
|
-
resolvedResource = resource;
|
|
913
|
-
}
|
|
780
|
+
const resolvedRef = await this.resourceApplier.resolveResourceReferences(resource, context, options, resourceLogger);
|
|
914
781
|
// 2. Apply namespace if specified, but only if resource doesn't already have one
|
|
915
|
-
|
|
916
|
-
resolvedResource.metadata &&
|
|
917
|
-
typeof resolvedResource.metadata.namespace !== 'string') {
|
|
918
|
-
resourceLogger.debug('Applying namespace from deployment options', {
|
|
919
|
-
targetNamespace: options.namespace,
|
|
920
|
-
currentNamespace: resolvedResource.metadata.namespace,
|
|
921
|
-
currentNamespaceType: typeof resolvedResource.metadata.namespace,
|
|
922
|
-
});
|
|
923
|
-
// Create a completely new metadata object to avoid proxy issues
|
|
924
|
-
const newMetadata = {
|
|
925
|
-
...resolvedResource.metadata,
|
|
926
|
-
namespace: options.namespace,
|
|
927
|
-
};
|
|
928
|
-
// Preserve the readiness evaluator when creating the new resource
|
|
929
|
-
const newResolvedResource = {
|
|
930
|
-
...resolvedResource,
|
|
931
|
-
metadata: newMetadata,
|
|
932
|
-
};
|
|
933
|
-
// Copy the non-enumerable readiness evaluator if it exists
|
|
934
|
-
const readinessEvaluator = resolvedResource.readinessEvaluator;
|
|
935
|
-
if (readinessEvaluator) {
|
|
936
|
-
Object.defineProperty(newResolvedResource, 'readinessEvaluator', {
|
|
937
|
-
value: readinessEvaluator,
|
|
938
|
-
enumerable: false,
|
|
939
|
-
configurable: true,
|
|
940
|
-
writable: false,
|
|
941
|
-
});
|
|
942
|
-
}
|
|
943
|
-
resolvedResource = newResolvedResource;
|
|
944
|
-
}
|
|
782
|
+
const resolvedResource = this.resourceApplier.applyNamespaceToResource(resolvedRef, options.namespace, resourceLogger);
|
|
945
783
|
// 3. Apply the resource to the cluster (or simulate for dry run)
|
|
946
|
-
|
|
947
|
-
if (options.dryRun) {
|
|
948
|
-
// In dry run mode, don't actually create the resource
|
|
949
|
-
resourceLogger.debug('Dry run mode: simulating resource creation');
|
|
950
|
-
appliedResource = {
|
|
951
|
-
...resolvedResource,
|
|
952
|
-
metadata: {
|
|
953
|
-
...resolvedResource.metadata,
|
|
954
|
-
uid: 'dry-run-uid',
|
|
955
|
-
},
|
|
956
|
-
};
|
|
957
|
-
}
|
|
958
|
-
else {
|
|
959
|
-
// Apply resource with retry logic
|
|
960
|
-
const retryPolicy = options.retryPolicy || {
|
|
961
|
-
maxRetries: 3,
|
|
962
|
-
backoffMultiplier: 2,
|
|
963
|
-
initialDelay: 1000,
|
|
964
|
-
maxDelay: 30000,
|
|
965
|
-
};
|
|
966
|
-
let lastError;
|
|
967
|
-
for (let attempt = 0; attempt <= retryPolicy.maxRetries; attempt++) {
|
|
968
|
-
try {
|
|
969
|
-
resourceLogger.debug('Applying resource to cluster', { attempt });
|
|
970
|
-
// Check if resource already exists
|
|
971
|
-
let existing;
|
|
972
|
-
try {
|
|
973
|
-
const readResult = await this.k8sApi.read({
|
|
974
|
-
apiVersion: resolvedResource.apiVersion,
|
|
975
|
-
kind: resolvedResource.kind,
|
|
976
|
-
metadata: {
|
|
977
|
-
name: resolvedResource.metadata?.name || '',
|
|
978
|
-
namespace: resolvedResource.metadata?.namespace || 'default',
|
|
979
|
-
},
|
|
980
|
-
});
|
|
981
|
-
existing = readResult.body;
|
|
982
|
-
}
|
|
983
|
-
catch (error) {
|
|
984
|
-
// If it's a 404, the resource doesn't exist, which is expected for creation
|
|
985
|
-
if (error.statusCode !== 404) {
|
|
986
|
-
resourceLogger.error('Error checking resource existence', error);
|
|
987
|
-
throw error;
|
|
988
|
-
}
|
|
989
|
-
}
|
|
990
|
-
if (existing) {
|
|
991
|
-
// Resource exists, use patch for safer updates
|
|
992
|
-
resourceLogger.debug('Resource exists, patching');
|
|
993
|
-
const patchResult = await this.patchResourceWithCorrectContentType(resolvedResource);
|
|
994
|
-
appliedResource = patchResult.body;
|
|
995
|
-
}
|
|
996
|
-
else {
|
|
997
|
-
// Resource does not exist, create it
|
|
998
|
-
resourceLogger.debug('Resource does not exist, creating');
|
|
999
|
-
const createResult = await this.k8sApi.create(resolvedResource);
|
|
1000
|
-
appliedResource = createResult.body;
|
|
1001
|
-
}
|
|
1002
|
-
resourceLogger.debug('Resource applied successfully', {
|
|
1003
|
-
appliedName: appliedResource.metadata?.name,
|
|
1004
|
-
appliedNamespace: appliedResource.metadata?.namespace,
|
|
1005
|
-
operation: existing ? 'patched' : 'created',
|
|
1006
|
-
attempt,
|
|
1007
|
-
});
|
|
1008
|
-
// Success - break out of retry loop
|
|
1009
|
-
break;
|
|
1010
|
-
}
|
|
1011
|
-
catch (error) {
|
|
1012
|
-
lastError = error;
|
|
1013
|
-
resourceLogger.error('Failed to apply resource to cluster', lastError, { attempt });
|
|
1014
|
-
// Check for HTTP 415 Unsupported Media Type errors
|
|
1015
|
-
if (this.isUnsupportedMediaTypeError(error)) {
|
|
1016
|
-
const acceptedTypes = this.extractAcceptedMediaTypes(error);
|
|
1017
|
-
throw new UnsupportedMediaTypeError(resolvedResource.metadata?.name || 'unknown', resolvedResource.kind || 'Unknown', acceptedTypes, lastError);
|
|
1018
|
-
}
|
|
1019
|
-
// If this was the last attempt, throw the error
|
|
1020
|
-
if (attempt >= retryPolicy.maxRetries) {
|
|
1021
|
-
throw new ResourceDeploymentError(resolvedResource.metadata?.name || 'unknown', resolvedResource.kind || 'Unknown', lastError);
|
|
1022
|
-
}
|
|
1023
|
-
// Calculate delay for next attempt
|
|
1024
|
-
const delay = Math.min(retryPolicy.initialDelay * retryPolicy.backoffMultiplier ** attempt, retryPolicy.maxDelay);
|
|
1025
|
-
resourceLogger.debug('Retrying resource deployment', {
|
|
1026
|
-
attempt: attempt + 1,
|
|
1027
|
-
maxRetries: retryPolicy.maxRetries,
|
|
1028
|
-
delay,
|
|
1029
|
-
});
|
|
1030
|
-
// Wait before retrying
|
|
1031
|
-
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
1032
|
-
}
|
|
1033
|
-
}
|
|
1034
|
-
}
|
|
784
|
+
await this.resourceApplier.applyResourceToCluster(resolvedResource, options, resourceLogger);
|
|
1035
785
|
// 4. Create deployed resource record
|
|
1036
786
|
const deployedResource = {
|
|
1037
787
|
id: resourceId,
|
|
@@ -1045,7 +795,7 @@ export class DirectDeploymentEngine {
|
|
|
1045
795
|
// 5. Wait for resource to be ready if requested
|
|
1046
796
|
if (options.waitForReady !== false) {
|
|
1047
797
|
resourceLogger.debug('Waiting for resource to be ready');
|
|
1048
|
-
await this.waitForResourceReady(deployedResource, options);
|
|
798
|
+
await this.waitForResourceReady(deployedResource, options, abortSignal);
|
|
1049
799
|
deployedResource.status = 'ready';
|
|
1050
800
|
}
|
|
1051
801
|
resourceLogger.debug('Single resource deployment completed');
|
|
@@ -1053,145 +803,24 @@ export class DirectDeploymentEngine {
|
|
|
1053
803
|
}
|
|
1054
804
|
/**
|
|
1055
805
|
* Wait for a resource to be ready
|
|
806
|
+
* @param deployedResource - The deployed resource to wait for
|
|
807
|
+
* @param options - Deployment options
|
|
808
|
+
* @param abortSignal - Optional AbortSignal to cancel the wait
|
|
1056
809
|
*/
|
|
1057
|
-
async waitForResourceReady(deployedResource, options) {
|
|
1058
|
-
|
|
1059
|
-
// Check if already marked as ready
|
|
1060
|
-
if (deployedResource.status === 'ready' || this.readyResources.has(resourceKey)) {
|
|
1061
|
-
this.logger.debug('Resource already marked as ready', { resourceKey });
|
|
1062
|
-
return;
|
|
1063
|
-
}
|
|
1064
|
-
// Safety-first approach: check for readiness evaluator before starting the wait loop
|
|
1065
|
-
const readinessEvaluator = deployedResource.manifest.readinessEvaluator;
|
|
1066
|
-
// Debug logging removed
|
|
1067
|
-
if (!readinessEvaluator) {
|
|
1068
|
-
const errorMessage = `Resource ${deployedResource.kind}/${deployedResource.name} does not have a factory-provided readiness evaluator`;
|
|
1069
|
-
this.logger.error('Missing factory-provided readiness evaluator');
|
|
1070
|
-
throw new Error(errorMessage);
|
|
1071
|
-
}
|
|
1072
|
-
const startTime = Date.now();
|
|
1073
|
-
const timeout = options.timeout || 300000; // 5 minutes default
|
|
1074
|
-
let lastStatus = null;
|
|
1075
|
-
while (Date.now() - startTime < timeout) {
|
|
1076
|
-
try {
|
|
1077
|
-
// Use custom readiness evaluator
|
|
1078
|
-
const { body: liveResource } = await this.k8sApi.read({
|
|
1079
|
-
apiVersion: deployedResource.manifest.apiVersion || '',
|
|
1080
|
-
kind: deployedResource.kind,
|
|
1081
|
-
metadata: {
|
|
1082
|
-
name: deployedResource.name,
|
|
1083
|
-
namespace: deployedResource.namespace,
|
|
1084
|
-
},
|
|
1085
|
-
});
|
|
1086
|
-
const result = readinessEvaluator(liveResource);
|
|
1087
|
-
if (typeof result === 'boolean') {
|
|
1088
|
-
if (result) {
|
|
1089
|
-
this.readyResources.add(resourceKey);
|
|
1090
|
-
this.emitEvent(options, {
|
|
1091
|
-
type: 'resource-ready',
|
|
1092
|
-
resourceId: deployedResource.id,
|
|
1093
|
-
message: `${deployedResource.kind}/${deployedResource.name} ready (custom evaluator)`,
|
|
1094
|
-
timestamp: new Date(),
|
|
1095
|
-
});
|
|
1096
|
-
return;
|
|
1097
|
-
}
|
|
1098
|
-
}
|
|
1099
|
-
else if (result && typeof result === 'object' && 'ready' in result) {
|
|
1100
|
-
lastStatus = result;
|
|
1101
|
-
if (result.ready) {
|
|
1102
|
-
this.readyResources.add(resourceKey);
|
|
1103
|
-
this.emitEvent(options, {
|
|
1104
|
-
type: 'resource-ready',
|
|
1105
|
-
resourceId: deployedResource.id,
|
|
1106
|
-
message: result.message ||
|
|
1107
|
-
`${deployedResource.kind}/${deployedResource.name} ready (custom evaluator)`,
|
|
1108
|
-
timestamp: new Date(),
|
|
1109
|
-
});
|
|
1110
|
-
return;
|
|
1111
|
-
}
|
|
1112
|
-
}
|
|
1113
|
-
// Emit status update if we have status information
|
|
1114
|
-
if (lastStatus && typeof lastStatus === 'object' && 'message' in lastStatus) {
|
|
1115
|
-
this.emitEvent(options, {
|
|
1116
|
-
type: 'resource-status',
|
|
1117
|
-
resourceId: deployedResource.id,
|
|
1118
|
-
message: `${deployedResource.kind}/${deployedResource.name}: ${lastStatus.message}`,
|
|
1119
|
-
timestamp: new Date(),
|
|
1120
|
-
});
|
|
1121
|
-
}
|
|
1122
|
-
// Wait before next check
|
|
1123
|
-
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
1124
|
-
}
|
|
1125
|
-
catch (error) {
|
|
1126
|
-
// Emit error status event
|
|
1127
|
-
this.emitEvent(options, {
|
|
1128
|
-
type: 'resource-status',
|
|
1129
|
-
resourceId: deployedResource.id,
|
|
1130
|
-
message: `Unable to read resource status: ${error instanceof Error ? error.message : String(error)}`,
|
|
1131
|
-
timestamp: new Date(),
|
|
1132
|
-
});
|
|
1133
|
-
// If we can't read the resource, it's not ready yet
|
|
1134
|
-
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
1135
|
-
}
|
|
1136
|
-
}
|
|
1137
|
-
// Timeout reached
|
|
1138
|
-
const timeoutMessage = lastStatus
|
|
1139
|
-
? `Timeout waiting for ${deployedResource.kind}/${deployedResource.name}: ${lastStatus.message}`
|
|
1140
|
-
: `Timeout waiting for ${deployedResource.kind}/${deployedResource.name} to be ready`;
|
|
1141
|
-
throw new Error(timeoutMessage);
|
|
810
|
+
async waitForResourceReady(deployedResource, options, abortSignal) {
|
|
811
|
+
return this.readinessWaiter.waitForResourceReady(deployedResource, options, abortSignal);
|
|
1142
812
|
}
|
|
1143
813
|
/**
|
|
1144
814
|
* Rollback deployed resources
|
|
1145
815
|
*/
|
|
1146
816
|
async rollbackDeployedResources(deployedResources, options) {
|
|
1147
|
-
this.
|
|
1148
|
-
type: 'rollback',
|
|
1149
|
-
message: 'Starting rollback of deployed resources',
|
|
1150
|
-
timestamp: new Date(),
|
|
1151
|
-
});
|
|
1152
|
-
const rolledBackResources = [];
|
|
1153
|
-
const errors = [];
|
|
1154
|
-
// Rollback in reverse order
|
|
1155
|
-
const reversedResources = [...deployedResources].reverse();
|
|
1156
|
-
for (const resource of reversedResources) {
|
|
1157
|
-
// Only try to rollback resources that were actually deployed (not failed)
|
|
1158
|
-
if (resource.status === 'failed') {
|
|
1159
|
-
continue; // Skip resources that failed to deploy
|
|
1160
|
-
}
|
|
1161
|
-
try {
|
|
1162
|
-
await this.k8sApi.delete({
|
|
1163
|
-
apiVersion: resource.manifest.apiVersion || '',
|
|
1164
|
-
kind: resource.kind,
|
|
1165
|
-
metadata: {
|
|
1166
|
-
name: resource.name,
|
|
1167
|
-
namespace: resource.namespace,
|
|
1168
|
-
},
|
|
1169
|
-
});
|
|
1170
|
-
rolledBackResources.push(`${resource.kind}/${resource.name}`);
|
|
1171
|
-
}
|
|
1172
|
-
catch (error) {
|
|
1173
|
-
// Log and collect errors for individual resource deletion failures
|
|
1174
|
-
this.logger.warn('Failed to delete resource during rollback', {
|
|
1175
|
-
error: error,
|
|
1176
|
-
resourceId: resource.id,
|
|
1177
|
-
kind: resource.kind,
|
|
1178
|
-
name: resource.name,
|
|
1179
|
-
});
|
|
1180
|
-
errors.push({
|
|
1181
|
-
resourceId: resource.id,
|
|
1182
|
-
phase: 'rollback',
|
|
1183
|
-
error: error,
|
|
1184
|
-
timestamp: new Date(),
|
|
1185
|
-
});
|
|
1186
|
-
}
|
|
1187
|
-
}
|
|
1188
|
-
return { rolledBackResources, errors };
|
|
817
|
+
return this.rollbackManager.rollbackDeployedResources(deployedResources, options);
|
|
1189
818
|
}
|
|
1190
819
|
/**
|
|
1191
820
|
* Generate a unique deployment ID
|
|
1192
821
|
*/
|
|
1193
822
|
generateDeploymentId() {
|
|
1194
|
-
return `deployment-${Date.now()}-${Math.random().toString(36).
|
|
823
|
+
return `deployment-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;
|
|
1195
824
|
}
|
|
1196
825
|
/**
|
|
1197
826
|
* Emit deployment events
|
|
@@ -1209,65 +838,16 @@ export class DirectDeploymentEngine {
|
|
|
1209
838
|
deployedResources: [],
|
|
1210
839
|
kubeClient: this.kubeClient,
|
|
1211
840
|
...(options.namespace && { namespace: options.namespace }),
|
|
1212
|
-
timeout: options.timeout ||
|
|
841
|
+
timeout: options.timeout || DEFAULT_READINESS_TIMEOUT,
|
|
1213
842
|
};
|
|
1214
|
-
|
|
843
|
+
// Legacy method - no abort signal support
|
|
844
|
+
return this.deploySingleResource(resource, context, options, undefined);
|
|
1215
845
|
}
|
|
1216
846
|
/**
|
|
1217
847
|
* Delete a resource from the cluster
|
|
1218
848
|
*/
|
|
1219
849
|
async deleteResource(resource) {
|
|
1220
|
-
|
|
1221
|
-
resourceId: resource.id,
|
|
1222
|
-
kind: resource.kind,
|
|
1223
|
-
name: resource.name,
|
|
1224
|
-
});
|
|
1225
|
-
try {
|
|
1226
|
-
await this.k8sApi.delete({
|
|
1227
|
-
apiVersion: resource.manifest.apiVersion || '',
|
|
1228
|
-
kind: resource.kind,
|
|
1229
|
-
metadata: {
|
|
1230
|
-
name: resource.name,
|
|
1231
|
-
namespace: resource.namespace,
|
|
1232
|
-
},
|
|
1233
|
-
});
|
|
1234
|
-
// Wait for resource to be deleted
|
|
1235
|
-
const timeout = 30000; // 30 seconds
|
|
1236
|
-
const startTime = Date.now();
|
|
1237
|
-
while (Date.now() - startTime < timeout) {
|
|
1238
|
-
try {
|
|
1239
|
-
await this.k8sApi.read({
|
|
1240
|
-
apiVersion: resource.manifest.apiVersion || '',
|
|
1241
|
-
kind: resource.kind,
|
|
1242
|
-
metadata: {
|
|
1243
|
-
name: resource.name,
|
|
1244
|
-
namespace: resource.namespace,
|
|
1245
|
-
},
|
|
1246
|
-
});
|
|
1247
|
-
// Resource still exists, wait and try again
|
|
1248
|
-
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
1249
|
-
}
|
|
1250
|
-
catch (error) {
|
|
1251
|
-
// Resource not found, deletion successful
|
|
1252
|
-
if (this.isNotFoundError(error)) {
|
|
1253
|
-
deleteLogger.debug('Resource successfully deleted');
|
|
1254
|
-
return;
|
|
1255
|
-
}
|
|
1256
|
-
throw error;
|
|
1257
|
-
}
|
|
1258
|
-
}
|
|
1259
|
-
throw new Error(`Timeout waiting for resource ${resource.kind}/${resource.name} to be deleted`);
|
|
1260
|
-
}
|
|
1261
|
-
catch (error) {
|
|
1262
|
-
deleteLogger.error('Failed to delete resource', error);
|
|
1263
|
-
throw error;
|
|
1264
|
-
}
|
|
1265
|
-
}
|
|
1266
|
-
/**
|
|
1267
|
-
* Wait for resource readiness (legacy method for compatibility)
|
|
1268
|
-
*/
|
|
1269
|
-
async waitForResourceReadiness(resource, options) {
|
|
1270
|
-
return this.waitForResourceReady(resource, options);
|
|
850
|
+
return this.rollbackManager.deleteDeployedResource(resource);
|
|
1271
851
|
}
|
|
1272
852
|
/**
|
|
1273
853
|
* Rollback a deployment by ID
|
|
@@ -1276,7 +856,7 @@ export class DirectDeploymentEngine {
|
|
|
1276
856
|
const startTime = Date.now();
|
|
1277
857
|
const deploymentRecord = this.deploymentState.get(deploymentId);
|
|
1278
858
|
if (!deploymentRecord) {
|
|
1279
|
-
throw new
|
|
859
|
+
throw new ResourceGraphFactoryError(`Deployment ${deploymentId} not found. Cannot rollback.`, deploymentId, 'cleanup');
|
|
1280
860
|
}
|
|
1281
861
|
try {
|
|
1282
862
|
const { rolledBackResources, errors } = await this.rollbackDeployedResources(deploymentRecord.resources, deploymentRecord.options);
|
|
@@ -1300,7 +880,7 @@ export class DirectDeploymentEngine {
|
|
|
1300
880
|
{
|
|
1301
881
|
resourceId: deploymentId,
|
|
1302
882
|
phase: 'rollback',
|
|
1303
|
-
error: error,
|
|
883
|
+
error: ensureError(error),
|
|
1304
884
|
timestamp: new Date(),
|
|
1305
885
|
},
|
|
1306
886
|
],
|
|
@@ -1336,207 +916,11 @@ export class DirectDeploymentEngine {
|
|
|
1336
916
|
}
|
|
1337
917
|
return result;
|
|
1338
918
|
}
|
|
1339
|
-
/**
|
|
1340
|
-
* Patch a resource with the correct Content-Type header for merge patch operations
|
|
1341
|
-
* This fixes HTTP 415 "Unsupported Media Type" errors that occur when using the generic patch method
|
|
1342
|
-
*/
|
|
1343
|
-
async patchResourceWithCorrectContentType(resource) {
|
|
1344
|
-
// The k8sApi.patch method already includes the correct Content-Type header for merge patch operations
|
|
1345
|
-
// This was fixed in the deployment engine to use 'application/merge-patch+json'
|
|
1346
|
-
return await this.k8sApi.patch(resource, undefined, undefined, undefined, undefined, {
|
|
1347
|
-
headers: {
|
|
1348
|
-
'Content-Type': 'application/merge-patch+json'
|
|
1349
|
-
}
|
|
1350
|
-
});
|
|
1351
|
-
}
|
|
1352
|
-
/**
|
|
1353
|
-
* Check if an error is a "not found" error
|
|
1354
|
-
*/
|
|
1355
|
-
isNotFoundError(error) {
|
|
1356
|
-
if (error && typeof error === 'object') {
|
|
1357
|
-
const k8sError = error;
|
|
1358
|
-
return k8sError.statusCode === 404 || k8sError.body?.code === 404;
|
|
1359
|
-
}
|
|
1360
|
-
return false;
|
|
1361
|
-
}
|
|
1362
|
-
/**
|
|
1363
|
-
* Wait for CRD establishment if the resource is a custom resource
|
|
1364
|
-
*/
|
|
1365
|
-
async waitForCRDIfCustomResource(resource, options, logger) {
|
|
1366
|
-
// Skip if this is not a custom resource
|
|
1367
|
-
if (!this.isCustomResource(resource)) {
|
|
1368
|
-
return;
|
|
1369
|
-
}
|
|
1370
|
-
const crdName = await this.getCRDNameForResource(resource);
|
|
1371
|
-
if (!crdName) {
|
|
1372
|
-
logger.warn('Could not determine CRD name for custom resource', {
|
|
1373
|
-
kind: resource.kind,
|
|
1374
|
-
apiVersion: resource.apiVersion,
|
|
1375
|
-
});
|
|
1376
|
-
return;
|
|
1377
|
-
}
|
|
1378
|
-
logger.debug('Custom resource detected, waiting for CRD establishment', {
|
|
1379
|
-
resourceKind: resource.kind,
|
|
1380
|
-
crdName,
|
|
1381
|
-
});
|
|
1382
|
-
await this.waitForCRDEstablishment({ metadata: { name: crdName } }, options, logger);
|
|
1383
|
-
logger.debug('CRD established, proceeding with custom resource deployment', {
|
|
1384
|
-
resourceKind: resource.kind,
|
|
1385
|
-
crdName,
|
|
1386
|
-
});
|
|
1387
|
-
}
|
|
1388
|
-
/**
|
|
1389
|
-
* Check if a resource is a custom resource (not a built-in Kubernetes resource)
|
|
1390
|
-
*/
|
|
1391
|
-
isCustomResource(resource) {
|
|
1392
|
-
if (!resource.apiVersion || !resource.kind) {
|
|
1393
|
-
return false;
|
|
1394
|
-
}
|
|
1395
|
-
// Built-in Kubernetes API groups that are NOT custom resources
|
|
1396
|
-
const builtInApiGroups = [
|
|
1397
|
-
'v1', // Core API group
|
|
1398
|
-
'apps/v1',
|
|
1399
|
-
'extensions/v1beta1',
|
|
1400
|
-
'networking.k8s.io/v1',
|
|
1401
|
-
'policy/v1',
|
|
1402
|
-
'rbac.authorization.k8s.io/v1',
|
|
1403
|
-
'storage.k8s.io/v1',
|
|
1404
|
-
'apiextensions.k8s.io/v1', // CRDs themselves
|
|
1405
|
-
'admissionregistration.k8s.io/v1',
|
|
1406
|
-
'apiregistration.k8s.io/v1',
|
|
1407
|
-
'authentication.k8s.io/v1',
|
|
1408
|
-
'authorization.k8s.io/v1',
|
|
1409
|
-
'autoscaling/v1',
|
|
1410
|
-
'autoscaling/v2',
|
|
1411
|
-
'batch/v1',
|
|
1412
|
-
'certificates.k8s.io/v1',
|
|
1413
|
-
'coordination.k8s.io/v1',
|
|
1414
|
-
'discovery.k8s.io/v1',
|
|
1415
|
-
'events.k8s.io/v1',
|
|
1416
|
-
'flowcontrol.apiserver.k8s.io/v1beta3',
|
|
1417
|
-
'node.k8s.io/v1',
|
|
1418
|
-
'scheduling.k8s.io/v1',
|
|
1419
|
-
];
|
|
1420
|
-
return !builtInApiGroups.includes(resource.apiVersion);
|
|
1421
|
-
}
|
|
1422
|
-
/**
|
|
1423
|
-
* Get the CRD name for a custom resource
|
|
1424
|
-
*/
|
|
1425
|
-
async getCRDNameForResource(resource) {
|
|
1426
|
-
if (!resource.apiVersion || !resource.kind) {
|
|
1427
|
-
return null;
|
|
1428
|
-
}
|
|
1429
|
-
// Only return CRD name for custom resources
|
|
1430
|
-
if (!this.isCustomResource(resource)) {
|
|
1431
|
-
return null;
|
|
1432
|
-
}
|
|
1433
|
-
// Extract group from apiVersion (e.g., "example.com/v1" -> "example.com")
|
|
1434
|
-
const apiVersionParts = resource.apiVersion.split('/');
|
|
1435
|
-
const group = apiVersionParts.length > 1 ? apiVersionParts[0] : '';
|
|
1436
|
-
if (!group) {
|
|
1437
|
-
return null; // Core API resources don't have CRDs
|
|
1438
|
-
}
|
|
1439
|
-
try {
|
|
1440
|
-
// Try to find the CRD by querying the API
|
|
1441
|
-
const crds = await this.k8sApi.list('apiextensions.k8s.io/v1', 'CustomResourceDefinition');
|
|
1442
|
-
// Look for a CRD that matches our group and kind
|
|
1443
|
-
const matchingCrd = crds.body?.items?.find((crd) => {
|
|
1444
|
-
const crdSpec = crd.spec;
|
|
1445
|
-
return crdSpec?.group === group && crdSpec?.names?.kind === resource.kind;
|
|
1446
|
-
});
|
|
1447
|
-
if (matchingCrd) {
|
|
1448
|
-
return matchingCrd.metadata?.name;
|
|
1449
|
-
}
|
|
1450
|
-
}
|
|
1451
|
-
catch (error) {
|
|
1452
|
-
// If we can't query CRDs, fall back to heuristic
|
|
1453
|
-
console.warn('Failed to query CRDs, using heuristic for CRD name generation:', error);
|
|
1454
|
-
}
|
|
1455
|
-
// Fallback: Convert Kind to plural lowercase (simple heuristic)
|
|
1456
|
-
const kind = resource.kind.toLowerCase();
|
|
1457
|
-
const plural = kind.endsWith('s') ? kind : `${kind}s`;
|
|
1458
|
-
return `${plural}.${group}`;
|
|
1459
|
-
}
|
|
1460
919
|
/**
|
|
1461
920
|
* Public method to wait for CRD readiness by name
|
|
1462
921
|
*/
|
|
1463
|
-
async waitForCRDReady(crdName, timeout =
|
|
1464
|
-
|
|
1465
|
-
const options = {
|
|
1466
|
-
mode: this.deploymentMode,
|
|
1467
|
-
timeout,
|
|
1468
|
-
};
|
|
1469
|
-
await this.waitForCRDEstablishment({ metadata: { name: crdName } }, options, logger);
|
|
1470
|
-
}
|
|
1471
|
-
/**
|
|
1472
|
-
* Wait for a CRD to be established in the cluster
|
|
1473
|
-
*/
|
|
1474
|
-
async waitForCRDEstablishment(crd, options, logger) {
|
|
1475
|
-
const crdName = crd.metadata?.name;
|
|
1476
|
-
const timeout = options.timeout || 300000; // 5 minutes default
|
|
1477
|
-
const startTime = Date.now();
|
|
1478
|
-
const pollInterval = 2000; // 2 seconds
|
|
1479
|
-
logger.debug('Waiting for CRD to exist and be established', { crdName, timeout });
|
|
1480
|
-
while (Date.now() - startTime < timeout) {
|
|
1481
|
-
try {
|
|
1482
|
-
// Check if CRD is established by reading its status
|
|
1483
|
-
const crdStatus = await this.k8sApi.read({
|
|
1484
|
-
apiVersion: 'apiextensions.k8s.io/v1',
|
|
1485
|
-
kind: 'CustomResourceDefinition',
|
|
1486
|
-
metadata: { name: crdName }, // CRDs are cluster-scoped, no namespace needed
|
|
1487
|
-
});
|
|
1488
|
-
const conditions = crdStatus.body?.status?.conditions || [];
|
|
1489
|
-
const establishedCondition = conditions.find((c) => c.type === 'Established');
|
|
1490
|
-
if (establishedCondition?.status === 'True') {
|
|
1491
|
-
logger.debug('CRD exists and is established', { crdName });
|
|
1492
|
-
return;
|
|
1493
|
-
}
|
|
1494
|
-
logger.debug('CRD exists but not yet established, waiting...', {
|
|
1495
|
-
crdName,
|
|
1496
|
-
establishedStatus: establishedCondition?.status || 'unknown',
|
|
1497
|
-
});
|
|
1498
|
-
}
|
|
1499
|
-
catch (error) {
|
|
1500
|
-
// CRD might not exist yet (e.g., being installed by a closure)
|
|
1501
|
-
// This is expected in scenarios where closures install CRDs
|
|
1502
|
-
logger.debug('CRD not found yet, waiting for it to be created...', {
|
|
1503
|
-
crdName,
|
|
1504
|
-
error: error.message,
|
|
1505
|
-
});
|
|
1506
|
-
}
|
|
1507
|
-
// Wait before next poll
|
|
1508
|
-
await new Promise((resolve) => setTimeout(resolve, pollInterval));
|
|
1509
|
-
}
|
|
1510
|
-
// Timeout reached
|
|
1511
|
-
throw new Error(`Timeout waiting for CRD ${crdName} to be established after ${timeout}ms`);
|
|
1512
|
-
}
|
|
1513
|
-
/**
|
|
1514
|
-
* Check if an error is an HTTP 415 Unsupported Media Type error
|
|
1515
|
-
*/
|
|
1516
|
-
isUnsupportedMediaTypeError(error) {
|
|
1517
|
-
return (error &&
|
|
1518
|
-
typeof error === 'object' &&
|
|
1519
|
-
(error.statusCode === 415 ||
|
|
1520
|
-
(error.response && error.response.statusCode === 415) ||
|
|
1521
|
-
(error.body && error.body.code === 415)));
|
|
1522
|
-
}
|
|
1523
|
-
/**
|
|
1524
|
-
* Extract accepted media types from HTTP 415 error message
|
|
1525
|
-
*/
|
|
1526
|
-
extractAcceptedMediaTypes(error) {
|
|
1527
|
-
const defaultTypes = ['application/json-patch+json', 'application/merge-patch+json', 'application/apply-patch+yaml'];
|
|
1528
|
-
try {
|
|
1529
|
-
// Try to extract from error message
|
|
1530
|
-
const message = error.message || error.body?.message || '';
|
|
1531
|
-
const match = message.match(/accepted media types include: ([^"]+)/);
|
|
1532
|
-
if (match && match[1]) {
|
|
1533
|
-
return match[1].split(', ').map((type) => type.trim());
|
|
1534
|
-
}
|
|
1535
|
-
}
|
|
1536
|
-
catch (_e) {
|
|
1537
|
-
// Fallback to default types
|
|
1538
|
-
}
|
|
1539
|
-
return defaultTypes;
|
|
922
|
+
async waitForCRDReady(crdName, timeout = DEFAULT_CRD_READY_TIMEOUT, abortSignal) {
|
|
923
|
+
await this.crdManager.waitForCRDReady(crdName, this.deploymentMode, timeout, abortSignal);
|
|
1540
924
|
}
|
|
1541
925
|
}
|
|
1542
926
|
//# sourceMappingURL=engine.js.map
|