typekro 0.4.0 → 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/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.map +1 -1
- package/dist/alchemy/deployers.js +12 -28
- 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 -2
- 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 +36 -10
- package/dist/core/composition/imperative.d.ts.map +1 -1
- package/dist/core/composition/imperative.js +127 -115
- 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 -57
- package/dist/core/constants/brands.d.ts.map +1 -1
- package/dist/core/constants/brands.js +4 -60
- 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 +23 -8
- package/dist/core/deployment/direct-factory.d.ts.map +1 -1
- package/dist/core/deployment/direct-factory.js +256 -164
- package/dist/core/deployment/direct-factory.js.map +1 -1
- package/dist/core/deployment/engine.d.ts +85 -65
- package/dist/core/deployment/engine.d.ts.map +1 -1
- package/dist/core/deployment/engine.js +505 -1703
- 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 +16 -12
- package/dist/core/deployment/event-filter.js.map +1 -1
- package/dist/core/deployment/event-monitor.d.ts +3 -3
- package/dist/core/deployment/event-monitor.d.ts.map +1 -1
- package/dist/core/deployment/event-monitor.js +127 -49
- 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 +28 -22
- package/dist/core/deployment/kro-factory.d.ts.map +1 -1
- package/dist/core/deployment/kro-factory.js +247 -366
- 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 +12 -28
- 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 +19 -2
- package/dist/core/deployment/rollback-manager.d.ts.map +1 -1
- package/dist/core/deployment/rollback-manager.js +127 -11
- 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.map +1 -1
- package/dist/core/deployment/status-hydrator.js +13 -10
- 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 +325 -244
- package/dist/core/deployment/strategies/base-strategy.js.map +1 -1
- package/dist/core/deployment/strategies/direct-strategy.d.ts +4 -4
- package/dist/core/deployment/strategies/direct-strategy.d.ts.map +1 -1
- package/dist/core/deployment/strategies/direct-strategy.js +12 -3
- package/dist/core/deployment/strategies/direct-strategy.js.map +1 -1
- package/dist/core/deployment/strategies/kro-strategy.d.ts +13 -8
- package/dist/core/deployment/strategies/kro-strategy.d.ts.map +1 -1
- package/dist/core/deployment/strategies/kro-strategy.js +51 -148
- 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/{parser.d.ts → analysis/parser.d.ts} +2 -38
- package/dist/core/expressions/analysis/parser.d.ts.map +1 -0
- package/dist/core/expressions/{parser.js → analysis/parser.js} +20 -80
- 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} +15 -7
- 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} +10 -9
- 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 -51
- package/dist/core/expressions/index.d.ts.map +1 -1
- package/dist/core/expressions/index.js +46 -47
- 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 -196
- 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 +21 -12
- package/dist/core/kubernetes/api.js.map +1 -1
- package/dist/core/kubernetes/bun-api-client.d.ts +36 -14
- package/dist/core/kubernetes/bun-api-client.d.ts.map +1 -1
- package/dist/core/kubernetes/bun-api-client.js +47 -24
- package/dist/core/kubernetes/bun-api-client.js.map +1 -1
- package/dist/core/kubernetes/bun-http-library.d.ts +69 -3
- package/dist/core/kubernetes/bun-http-library.d.ts.map +1 -1
- package/dist/core/kubernetes/bun-http-library.js +118 -11
- package/dist/core/kubernetes/bun-http-library.js.map +1 -1
- package/dist/core/kubernetes/client-provider.d.ts +121 -35
- package/dist/core/kubernetes/client-provider.d.ts.map +1 -1
- package/dist/core/kubernetes/client-provider.js +181 -65
- package/dist/core/kubernetes/client-provider.js.map +1 -1
- package/dist/core/kubernetes/errors.d.ts +5 -5
- package/dist/core/kubernetes/errors.js +5 -5
- package/dist/core/kubernetes/index.d.ts +8 -7
- package/dist/core/kubernetes/index.d.ts.map +1 -1
- package/dist/core/kubernetes/index.js +8 -8
- package/dist/core/kubernetes/index.js.map +1 -1
- package/dist/core/kubernetes/type-guards.d.ts +1 -1
- package/dist/core/kubernetes/type-guards.js +1 -1
- 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 +18 -18
- 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 +65 -27
- 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 +3 -7
- package/dist/core/references/resolver.d.ts.map +1 -1
- package/dist/core/references/resolver.js +53 -92
- 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 +92 -10
- 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/{utils → runtime-patches}/crd-patcher.d.ts +1 -1
- 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/{utils → runtime-patches}/crd-schema-fix.d.ts +39 -2
- package/dist/core/runtime-patches/crd-schema-fix.d.ts.map +1 -0
- package/dist/core/{utils → runtime-patches}/crd-schema-fix.js +130 -26
- 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 +169 -4
- package/dist/core/serialization/core.d.ts.map +1 -1
- package/dist/core/serialization/core.js +387 -710
- 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 +43 -8
- package/dist/core/types/common.d.ts.map +1 -1
- package/dist/core/types/deployment.d.ts +235 -94
- package/dist/core/types/deployment.d.ts.map +1 -1
- package/dist/core/types/deployment.js +1 -40
- 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 +226 -16
- 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 +27 -1
- 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 +104 -45
- 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 +35 -11
- 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 +19 -15
- package/dist/factories/apisix/compositions/apisix-bootstrap.d.ts.map +1 -1
- package/dist/factories/apisix/compositions/apisix-bootstrap.js +99 -112
- package/dist/factories/apisix/compositions/apisix-bootstrap.js.map +1 -1
- package/dist/factories/apisix/resources/helm.d.ts +8 -8
- package/dist/factories/apisix/resources/helm.d.ts.map +1 -1
- package/dist/factories/apisix/resources/helm.js +20 -47
- package/dist/factories/apisix/resources/helm.js.map +1 -1
- package/dist/factories/apisix/types.d.ts +35 -2
- package/dist/factories/apisix/types.d.ts.map +1 -1
- package/dist/factories/apisix/types.js.map +1 -1
- 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.map +1 -1
- package/dist/factories/apisix/utils/helm-values-mapper.js +33 -35
- package/dist/factories/apisix/utils/helm-values-mapper.js.map +1 -1
- package/dist/factories/apisix/utils/index.d.ts +1 -0
- package/dist/factories/apisix/utils/index.d.ts.map +1 -1
- package/dist/factories/apisix/utils/index.js +1 -0
- package/dist/factories/apisix/utils/index.js.map +1 -1
- package/dist/factories/cert-manager/compositions/cert-manager-bootstrap.d.ts +2 -2
- package/dist/factories/cert-manager/compositions/cert-manager-bootstrap.d.ts.map +1 -1
- package/dist/factories/cert-manager/compositions/cert-manager-bootstrap.js +49 -63
- package/dist/factories/cert-manager/compositions/cert-manager-bootstrap.js.map +1 -1
- package/dist/factories/cert-manager/resources/certificates.d.ts.map +1 -1
- package/dist/factories/cert-manager/resources/certificates.js +12 -47
- package/dist/factories/cert-manager/resources/certificates.js.map +1 -1
- package/dist/factories/cert-manager/resources/helm.d.ts +2 -22
- package/dist/factories/cert-manager/resources/helm.d.ts.map +1 -1
- package/dist/factories/cert-manager/resources/helm.js +30 -167
- package/dist/factories/cert-manager/resources/helm.js.map +1 -1
- package/dist/factories/cert-manager/resources/issuers.d.ts.map +1 -1
- package/dist/factories/cert-manager/resources/issuers.js +9 -104
- package/dist/factories/cert-manager/resources/issuers.js.map +1 -1
- package/dist/factories/cert-manager/types.d.ts +5 -78
- package/dist/factories/cert-manager/types.d.ts.map +1 -1
- package/dist/factories/cert-manager/types.js +2 -22
- package/dist/factories/cert-manager/types.js.map +1 -1
- package/dist/factories/cert-manager/utils/helm-values-mapper.d.ts +8 -4
- package/dist/factories/cert-manager/utils/helm-values-mapper.d.ts.map +1 -1
- package/dist/factories/cert-manager/utils/helm-values-mapper.js +55 -56
- package/dist/factories/cert-manager/utils/helm-values-mapper.js.map +1 -1
- package/dist/factories/cert-manager/utils/index.d.ts +1 -1
- package/dist/factories/cert-manager/utils/index.d.ts.map +1 -1
- package/dist/factories/cert-manager/utils/index.js +1 -1
- package/dist/factories/cert-manager/utils/index.js.map +1 -1
- package/dist/factories/cilium/compositions/cilium-bootstrap.d.ts +3 -3
- package/dist/factories/cilium/compositions/cilium-bootstrap.d.ts.map +1 -1
- package/dist/factories/cilium/compositions/cilium-bootstrap.js +62 -34
- package/dist/factories/cilium/compositions/cilium-bootstrap.js.map +1 -1
- 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 +1 -0
- package/dist/factories/cilium/index.d.ts.map +1 -1
- package/dist/factories/cilium/index.js +4 -0
- package/dist/factories/cilium/index.js.map +1 -1
- package/dist/factories/cilium/resources/gateway.d.ts.map +1 -1
- package/dist/factories/cilium/resources/gateway.js +3 -5
- package/dist/factories/cilium/resources/gateway.js.map +1 -1
- package/dist/factories/cilium/resources/helm.d.ts +2 -2
- package/dist/factories/cilium/resources/helm.d.ts.map +1 -1
- package/dist/factories/cilium/resources/helm.js +8 -16
- package/dist/factories/cilium/resources/helm.js.map +1 -1
- package/dist/factories/cilium/resources/index.d.ts +1 -5
- package/dist/factories/cilium/resources/index.d.ts.map +1 -1
- package/dist/factories/cilium/resources/index.js +4 -20
- package/dist/factories/cilium/resources/index.js.map +1 -1
- package/dist/factories/cilium/resources/networking.d.ts +9 -13
- package/dist/factories/cilium/resources/networking.d.ts.map +1 -1
- package/dist/factories/cilium/resources/networking.js +152 -251
- package/dist/factories/cilium/resources/networking.js.map +1 -1
- package/dist/factories/cilium/types.d.ts +3 -47
- package/dist/factories/cilium/types.d.ts.map +1 -1
- package/dist/factories/cilium/types.js +2 -71
- package/dist/factories/cilium/types.js.map +1 -1
- package/dist/factories/external-dns/compositions/external-dns-bootstrap.d.ts +1 -1
- package/dist/factories/external-dns/compositions/external-dns-bootstrap.d.ts.map +1 -1
- package/dist/factories/external-dns/compositions/external-dns-bootstrap.js +5 -11
- package/dist/factories/external-dns/compositions/external-dns-bootstrap.js.map +1 -1
- package/dist/factories/external-dns/resources/helm.d.ts +2 -2
- package/dist/factories/external-dns/resources/helm.d.ts.map +1 -1
- package/dist/factories/external-dns/resources/helm.js +66 -61
- package/dist/factories/external-dns/resources/helm.js.map +1 -1
- package/dist/factories/external-dns/types.d.ts +2 -2
- package/dist/factories/external-dns/types.d.ts.map +1 -1
- package/dist/factories/external-dns/types.js.map +1 -1
- package/dist/factories/flux/git-repository.d.ts +12 -2
- 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 +13 -0
- package/dist/factories/helm/types.d.ts.map +1 -1
- package/dist/factories/index.d.ts +7 -8
- package/dist/factories/index.d.ts.map +1 -1
- package/dist/factories/index.js +24 -20
- 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 +14 -1
- package/dist/factories/kubernetes/config/config-map.d.ts.map +1 -1
- package/dist/factories/kubernetes/config/config-map.js +21 -7
- package/dist/factories/kubernetes/config/config-map.js.map +1 -1
- package/dist/factories/kubernetes/config/secret.d.ts +17 -0
- package/dist/factories/kubernetes/config/secret.d.ts.map +1 -1
- package/dist/factories/kubernetes/config/secret.js +27 -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 +22 -2
- 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 +27 -2
- 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 +42 -13
- package/dist/factories/kubernetes/yaml/yaml-file.d.ts.map +1 -1
- package/dist/factories/kubernetes/yaml/yaml-file.js +206 -99
- package/dist/factories/kubernetes/yaml/yaml-file.js.map +1 -1
- package/dist/factories/pebble/compositions/pebble-bootstrap.d.ts +1 -1
- package/dist/factories/pebble/compositions/pebble-bootstrap.d.ts.map +1 -1
- package/dist/factories/pebble/compositions/pebble-bootstrap.js +15 -17
- package/dist/factories/pebble/compositions/pebble-bootstrap.js.map +1 -1
- package/dist/factories/pebble/resources/helm.d.ts +2 -2
- package/dist/factories/pebble/resources/helm.d.ts.map +1 -1
- package/dist/factories/pebble/resources/helm.js +9 -28
- package/dist/factories/pebble/resources/helm.js.map +1 -1
- package/dist/factories/shared.d.ts +12 -71
- package/dist/factories/shared.d.ts.map +1 -1
- package/dist/factories/shared.js +10 -531
- 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 +11 -0
- package/dist/factories/simple/config/config-map.d.ts.map +1 -1
- package/dist/factories/simple/config/config-map.js +11 -0
- package/dist/factories/simple/config/config-map.js.map +1 -1
- package/dist/factories/simple/config/secret.d.ts +11 -0
- package/dist/factories/simple/config/secret.d.ts.map +1 -1
- package/dist/factories/simple/config/secret.js +17 -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 +10 -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 +16 -0
- 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 +46 -494
- 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 -11
- package/dist/utils/type-guards.d.ts.map +1 -1
- package/dist/utils/type-guards.js +78 -26
- package/dist/utils/type-guards.js.map +1 -1
- package/package.json +19 -13
- 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 -165
- package/dist/core/composition/typekro-runtime/typekro-runtime.js.map +0 -1
- package/dist/core/composition/typekro-runtime/types.d.ts +0 -19
- 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 -2921
- 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 -944
- 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 -191
- package/dist/core/expressions/field-hydration-processor.d.ts.map +0 -1
- package/dist/core/expressions/field-hydration-processor.js +0 -561
- 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/parser.d.ts.map +0 -1
- package/dist/core/expressions/parser.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 -368
- package/dist/core/readiness/cluster-state.js.map +0 -1
- package/dist/core/scope/resolver.d.ts +0 -16
- package/dist/core/scope/resolver.d.ts.map +0 -1
- package/dist/core/scope/resolver.js +0 -45
- package/dist/core/scope/resolver.js.map +0 -1
- package/dist/core/types/factory-scope.d.ts +0 -42
- package/dist/core/types/factory-scope.d.ts.map +0 -1
- package/dist/core/types/factory-scope.js +0 -14
- package/dist/core/types/factory-scope.js.map +0 -1
- package/dist/core/utils/crd-patcher.d.ts.map +0 -1
- package/dist/core/utils/crd-patcher.js +0 -198
- package/dist/core/utils/crd-patcher.js.map +0 -1
- package/dist/core/utils/crd-schema-fix.d.ts.map +0 -1
- package/dist/core/utils/crd-schema-fix.js.map +0 -1
- package/dist/core/utils/index.d.ts +0 -12
- package/dist/core/utils/index.d.ts.map +0 -1
- package/dist/core/utils/index.js +0 -12
- package/dist/core/utils/index.js.map +0 -1
- package/dist/core/utils/minimal-connection-reset-suppression.d.ts +0 -16
- package/dist/core/utils/minimal-connection-reset-suppression.d.ts.map +0 -1
- package/dist/core/utils/minimal-connection-reset-suppression.js +0 -72
- package/dist/core/utils/minimal-connection-reset-suppression.js.map +0 -1
- package/dist/core/utils/output-filter.d.ts +0 -16
- package/dist/core/utils/output-filter.d.ts.map +0 -1
- package/dist/core/utils/output-filter.js +0 -90
- package/dist/core/utils/output-filter.js.map +0 -1
- package/dist/core/utils/scoped-error-suppression.d.ts +0 -25
- package/dist/core/utils/scoped-error-suppression.d.ts.map +0 -1
- package/dist/core/utils/scoped-error-suppression.js +0 -226
- package/dist/core/utils/scoped-error-suppression.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/factories/cilium/resources/bgp.d.ts +0 -10
- package/dist/factories/cilium/resources/bgp.d.ts.map +0 -1
- package/dist/factories/cilium/resources/bgp.js +0 -14
- package/dist/factories/cilium/resources/bgp.js.map +0 -1
- package/dist/factories/cilium/resources/load-balancer.d.ts +0 -9
- package/dist/factories/cilium/resources/load-balancer.d.ts.map +0 -1
- package/dist/factories/cilium/resources/load-balancer.js +0 -12
- package/dist/factories/cilium/resources/load-balancer.js.map +0 -1
- package/dist/factories/cilium/resources/observability.d.ts +0 -9
- package/dist/factories/cilium/resources/observability.d.ts.map +0 -1
- package/dist/factories/cilium/resources/observability.js +0 -11
- package/dist/factories/cilium/resources/observability.js.map +0 -1
- package/dist/factories/cilium/resources/security.d.ts +0 -10
- package/dist/factories/cilium/resources/security.d.ts.map +0 -1
- package/dist/factories/cilium/resources/security.js +0 -14
- package/dist/factories/cilium/resources/security.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 {
|
|
7
|
+
import { DEFAULT_CRD_READY_TIMEOUT, DEFAULT_DEPLOYMENT_TIMEOUT, DEFAULT_READINESS_TIMEOUT, } from '../config/defaults.js';
|
|
8
8
|
import { DependencyResolver } from '../dependencies/index.js';
|
|
9
|
-
import { CircularDependencyError } from '../errors.js';
|
|
9
|
+
import { CircularDependencyError, ensureError, ResourceGraphFactoryError } from '../errors.js';
|
|
10
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,14 +28,17 @@ 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
|
|
30
39
|
activeAbortControllers = new Set(); // Track active abort controllers for cleanup
|
|
31
40
|
logger = getComponentLogger('deployment-engine');
|
|
32
|
-
constructor(kubeClient, k8sApi, referenceResolver, deploymentMode = DeploymentMode.DIRECT) {
|
|
41
|
+
constructor(kubeClient, k8sApi, referenceResolver, deploymentMode = DeploymentMode.DIRECT, httpTimeouts) {
|
|
33
42
|
this.kubeClient = kubeClient;
|
|
34
43
|
this.deploymentMode = deploymentMode;
|
|
35
44
|
this.dependencyResolver = new DependencyResolver();
|
|
@@ -37,10 +46,17 @@ export class DirectDeploymentEngine {
|
|
|
37
46
|
referenceResolver || new ReferenceResolver(kubeClient, this.deploymentMode, k8sApi);
|
|
38
47
|
// Use createBunCompatibleKubernetesObjectApi which handles both Bun and Node.js
|
|
39
48
|
// This works around Bun's fetch TLS issues (https://github.com/oven-sh/bun/issues/10642)
|
|
40
|
-
|
|
49
|
+
// Pass HTTP timeout configuration if provided
|
|
50
|
+
this.k8sApi = k8sApi || createBunCompatibleKubernetesObjectApi(kubeClient, httpTimeouts);
|
|
41
51
|
this.readinessChecker = new ResourceReadinessChecker(this.k8sApi);
|
|
42
|
-
this.
|
|
43
|
-
|
|
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));
|
|
44
60
|
// Set up callback to track ready resources
|
|
45
61
|
this.readinessChecker.setOnResourceReady((resource) => {
|
|
46
62
|
const resourceKey = `${resource.kind}/${resource.name}/${resource.namespace}`;
|
|
@@ -146,112 +162,11 @@ export class DirectDeploymentEngine {
|
|
|
146
162
|
getKubernetesApi() {
|
|
147
163
|
return this.k8sApi;
|
|
148
164
|
}
|
|
149
|
-
/**
|
|
150
|
-
* Enhance a resource for evaluation by applying kind-specific logic
|
|
151
|
-
* This allows generic evaluators to work correctly without needing special cases
|
|
152
|
-
*/
|
|
153
|
-
enhanceResourceForEvaluation(resource, kind) {
|
|
154
|
-
// For HelmRepository resources, handle OCI special case
|
|
155
|
-
if (kind === 'HelmRepository') {
|
|
156
|
-
const spec = resource.spec;
|
|
157
|
-
const isOciRepository = spec?.type === 'oci';
|
|
158
|
-
const hasBeenProcessed = resource.metadata?.generation && resource.metadata?.resourceVersion;
|
|
159
|
-
// If it's an OCI repo without Ready condition, synthesize one
|
|
160
|
-
// OCI repositories don't get status conditions from Flux, but they are functional
|
|
161
|
-
// once they've been processed (have generation and resourceVersion)
|
|
162
|
-
if (isOciRepository &&
|
|
163
|
-
hasBeenProcessed &&
|
|
164
|
-
!resource.status?.conditions?.some((c) => c.type === 'Ready')) {
|
|
165
|
-
return {
|
|
166
|
-
...resource,
|
|
167
|
-
status: {
|
|
168
|
-
...resource.status,
|
|
169
|
-
conditions: [
|
|
170
|
-
...(resource.status?.conditions || []),
|
|
171
|
-
{
|
|
172
|
-
type: 'Ready',
|
|
173
|
-
status: 'True',
|
|
174
|
-
message: 'OCI repository is functional',
|
|
175
|
-
reason: 'OciRepositoryProcessed',
|
|
176
|
-
},
|
|
177
|
-
],
|
|
178
|
-
},
|
|
179
|
-
};
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
return resource;
|
|
183
|
-
}
|
|
184
165
|
/**
|
|
185
166
|
* Check if a deployed resource is ready using the factory-provided readiness evaluator
|
|
186
167
|
*/
|
|
187
168
|
async isDeployedResourceReady(deployedResource) {
|
|
188
|
-
|
|
189
|
-
// Check if the deployed resource has a factory-provided readiness evaluator
|
|
190
|
-
const readinessEvaluator = deployedResource.manifest
|
|
191
|
-
.readinessEvaluator;
|
|
192
|
-
if (readinessEvaluator) {
|
|
193
|
-
// Use the factory-provided readiness evaluator
|
|
194
|
-
// Create a resource reference for the API call
|
|
195
|
-
const resourceRef = {
|
|
196
|
-
apiVersion: deployedResource.manifest.apiVersion || '',
|
|
197
|
-
kind: deployedResource.kind,
|
|
198
|
-
metadata: {
|
|
199
|
-
name: deployedResource.name,
|
|
200
|
-
namespace: deployedResource.namespace,
|
|
201
|
-
},
|
|
202
|
-
};
|
|
203
|
-
// Get the live resource from the cluster
|
|
204
|
-
// In the new API, methods return objects directly (no .body wrapper)
|
|
205
|
-
const liveResource = await this.k8sApi.read(resourceRef);
|
|
206
|
-
// Apply kind-specific enhancements before calling custom evaluator
|
|
207
|
-
const enhancedResource = this.enhanceResourceForEvaluation(liveResource, deployedResource.kind);
|
|
208
|
-
// Use the factory-provided readiness evaluator
|
|
209
|
-
const result = readinessEvaluator(enhancedResource);
|
|
210
|
-
let readinessResult;
|
|
211
|
-
if (typeof result === 'boolean') {
|
|
212
|
-
readinessResult = { ready: result };
|
|
213
|
-
}
|
|
214
|
-
else if (result && typeof result === 'object' && 'ready' in result) {
|
|
215
|
-
readinessResult = result;
|
|
216
|
-
}
|
|
217
|
-
else {
|
|
218
|
-
this.logger.warn('Readiness evaluator returned unexpected result', {
|
|
219
|
-
resourceId: deployedResource.id,
|
|
220
|
-
result,
|
|
221
|
-
});
|
|
222
|
-
readinessResult = { ready: false, reason: 'Invalid evaluator result' };
|
|
223
|
-
}
|
|
224
|
-
// Debug logging for readiness evaluation
|
|
225
|
-
if (this.debugLogger) {
|
|
226
|
-
this.debugLogger.logReadinessEvaluation(deployedResource, readinessEvaluator, readinessResult);
|
|
227
|
-
}
|
|
228
|
-
return readinessResult.ready;
|
|
229
|
-
}
|
|
230
|
-
else {
|
|
231
|
-
// Fallback to generic readiness checker
|
|
232
|
-
const resourceRef = {
|
|
233
|
-
apiVersion: deployedResource.manifest.apiVersion || '',
|
|
234
|
-
kind: deployedResource.kind,
|
|
235
|
-
metadata: {
|
|
236
|
-
name: deployedResource.name,
|
|
237
|
-
namespace: deployedResource.namespace,
|
|
238
|
-
},
|
|
239
|
-
};
|
|
240
|
-
// In the new API, methods return objects directly (no .body wrapper)
|
|
241
|
-
const liveResource = await this.k8sApi.read(resourceRef);
|
|
242
|
-
return this.readinessChecker.isResourceReady(liveResource);
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
catch (error) {
|
|
246
|
-
this.logger.debug('Failed to check resource readiness', {
|
|
247
|
-
error: error,
|
|
248
|
-
resourceId: deployedResource.id,
|
|
249
|
-
kind: deployedResource.kind,
|
|
250
|
-
name: deployedResource.name,
|
|
251
|
-
namespace: deployedResource.namespace,
|
|
252
|
-
});
|
|
253
|
-
return false;
|
|
254
|
-
}
|
|
169
|
+
return this.readinessWaiter.isDeployedResourceReady(deployedResource);
|
|
255
170
|
}
|
|
256
171
|
/**
|
|
257
172
|
* Get all deployment states for health checking
|
|
@@ -263,318 +178,54 @@ export class DirectDeploymentEngine {
|
|
|
263
178
|
* Deploy a resource graph to the Kubernetes cluster
|
|
264
179
|
*/
|
|
265
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) {
|
|
266
189
|
const deploymentId = this.generateDeploymentId();
|
|
267
190
|
const startTime = Date.now();
|
|
268
191
|
const deployedResources = [];
|
|
269
|
-
// Create an AbortController for this deployment to enable proper cancellation
|
|
270
|
-
const deploymentAbortController = this.createTrackedAbortController();
|
|
271
|
-
const abortSignal = deploymentAbortController.signal;
|
|
272
|
-
// Set up timeout-based abort if timeout is specified
|
|
273
|
-
const timeout = options.timeout || 300000; // 5 minutes default
|
|
274
|
-
const timeoutId = setTimeout(() => {
|
|
275
|
-
this.logger.debug('Deployment timeout reached, aborting operations', {
|
|
276
|
-
deploymentId,
|
|
277
|
-
timeout,
|
|
278
|
-
});
|
|
279
|
-
deploymentAbortController.abort();
|
|
280
|
-
}, timeout);
|
|
281
192
|
const errors = [];
|
|
282
193
|
const deploymentLogger = this.logger.child({
|
|
283
194
|
deploymentId,
|
|
284
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),
|
|
285
205
|
});
|
|
286
|
-
deploymentLogger.info('Starting deployment', { options });
|
|
287
206
|
try {
|
|
288
207
|
this.emitEvent(options, {
|
|
289
208
|
type: 'started',
|
|
290
|
-
message: `Starting deployment of ${graph.resources.length} resources`,
|
|
209
|
+
message: `Starting deployment of ${graph.resources.length} resources and ${Object.keys(closures).length} closures`,
|
|
291
210
|
timestamp: new Date(),
|
|
292
211
|
});
|
|
293
|
-
//
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
// 2. Analyze deployment order and identify parallel stages
|
|
299
|
-
deploymentLogger.debug('Analyzing deployment order for parallel execution');
|
|
300
|
-
const deploymentPlan = this.dependencyResolver.analyzeDeploymentOrder(graph.dependencyGraph);
|
|
301
|
-
deploymentLogger.debug('Deployment plan determined', {
|
|
302
|
-
levels: deploymentPlan.levels.length,
|
|
303
|
-
totalResources: deploymentPlan.totalResources,
|
|
304
|
-
maxParallelism: deploymentPlan.maxParallelism,
|
|
305
|
-
});
|
|
306
|
-
// 3. Initialize and start event monitoring if enabled
|
|
307
|
-
if (options.eventMonitoring?.enabled) {
|
|
308
|
-
try {
|
|
309
|
-
this.eventMonitor = createEventMonitor(this.kubeClient, {
|
|
310
|
-
namespace: options.namespace || 'default',
|
|
311
|
-
eventTypes: options.eventMonitoring.eventTypes || ['Warning', 'Error'],
|
|
312
|
-
includeChildResources: options.eventMonitoring.includeChildResources ?? true,
|
|
313
|
-
startTime: new Date(startTime),
|
|
314
|
-
...(options.progressCallback && { progressCallback: options.progressCallback }),
|
|
315
|
-
});
|
|
316
|
-
// Start monitoring immediately to capture all deployment events
|
|
317
|
-
await this.eventMonitor.startMonitoring([]);
|
|
318
|
-
deploymentLogger.debug('Event monitoring started for deployment');
|
|
319
|
-
}
|
|
320
|
-
catch (error) {
|
|
321
|
-
deploymentLogger.warn('Failed to initialize event monitoring, continuing without it', error);
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
// 3.1. Initialize debug logging if enabled
|
|
325
|
-
if (options.debugLogging?.enabled) {
|
|
326
|
-
this.debugLogger = createDebugLoggerFromDeploymentOptions(options);
|
|
327
|
-
this.readinessChecker.setDebugLogger(this.debugLogger);
|
|
328
|
-
deploymentLogger.debug('Debug logging initialized');
|
|
329
|
-
}
|
|
330
|
-
// 4. Create resolution context with resourceKeyMapping for cross-resource references
|
|
331
|
-
// The resourceKeyMapping maps original resource IDs (like 'webappDeployment') to their manifests
|
|
332
|
-
// This allows the reference resolver to find resources by their original IDs during deployment
|
|
333
|
-
const resourceKeyMapping = new Map();
|
|
334
|
-
for (const resource of graph.resources) {
|
|
335
|
-
const manifest = resource.manifest;
|
|
336
|
-
const originalResourceId = manifest.__resourceId;
|
|
337
|
-
if (originalResourceId) {
|
|
338
|
-
// Convert the Enhanced proxy to a plain object for reliable field extraction
|
|
339
|
-
// The proxy's toJSON method returns a clean object without proxy behavior
|
|
340
|
-
const plainManifest = typeof manifest.toJSON === 'function'
|
|
341
|
-
? manifest.toJSON()
|
|
342
|
-
: JSON.parse(JSON.stringify(manifest));
|
|
343
|
-
resourceKeyMapping.set(originalResourceId, plainManifest);
|
|
344
|
-
deploymentLogger.debug('Added resource to resourceKeyMapping', {
|
|
345
|
-
originalResourceId,
|
|
346
|
-
kind: manifest.kind,
|
|
347
|
-
name: manifest.metadata?.name,
|
|
348
|
-
});
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
const context = {
|
|
352
|
-
deployedResources,
|
|
353
|
-
kubeClient: this.kubeClient,
|
|
354
|
-
resourceKeyMapping,
|
|
355
|
-
...(options.namespace && { namespace: options.namespace }),
|
|
356
|
-
timeout: options.timeout || 30000,
|
|
357
|
-
};
|
|
358
|
-
// 5. Deploy resources in parallel stages
|
|
359
|
-
for (let levelIndex = 0; levelIndex < deploymentPlan.levels.length; levelIndex++) {
|
|
360
|
-
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];
|
|
361
217
|
if (!currentLevel) {
|
|
362
218
|
continue;
|
|
363
219
|
}
|
|
364
|
-
const
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
// Track performance metrics for this level
|
|
370
|
-
const levelStartTime = Date.now();
|
|
371
|
-
// Deploy all resources in this level in parallel
|
|
372
|
-
const levelPromises = currentLevel.map(async (resourceId) => {
|
|
373
|
-
const resourceLogger = deploymentLogger.child({ resourceId });
|
|
374
|
-
resourceLogger.debug('Starting resource deployment');
|
|
375
|
-
const resource = graph.resources.find((r) => r.id === resourceId);
|
|
376
|
-
if (!resource) {
|
|
377
|
-
resourceLogger.error('Resource not found in graph');
|
|
378
|
-
const error = new Error(`Resource with id '${resourceId}' not found in graph`);
|
|
379
|
-
return {
|
|
380
|
-
success: false,
|
|
381
|
-
resourceId,
|
|
382
|
-
error: {
|
|
383
|
-
resourceId,
|
|
384
|
-
phase: 'validation',
|
|
385
|
-
error,
|
|
386
|
-
timestamp: new Date(),
|
|
387
|
-
},
|
|
388
|
-
};
|
|
389
|
-
}
|
|
390
|
-
resourceLogger.debug('Found resource in graph', {
|
|
391
|
-
resourceId: resource.id,
|
|
392
|
-
kind: resource.manifest?.kind,
|
|
393
|
-
name: resource.manifest?.metadata?.name,
|
|
394
|
-
});
|
|
395
|
-
try {
|
|
396
|
-
resourceLogger.debug('Calling deploySingleResource');
|
|
397
|
-
// Wait for CRD establishment if this is a custom resource
|
|
398
|
-
await this.waitForCRDIfCustomResource(resource.manifest, options, resourceLogger, abortSignal);
|
|
399
|
-
// FIX: Unconditionally ensure the readiness evaluator is attached just before deployment.
|
|
400
|
-
const resourceWithEvaluator = ensureReadinessEvaluator(resource.manifest);
|
|
401
|
-
// Add resource to event monitoring before deployment to capture creation events
|
|
402
|
-
if (this.eventMonitor) {
|
|
403
|
-
const preDeployedResource = {
|
|
404
|
-
id: resourceId,
|
|
405
|
-
kind: resourceWithEvaluator.kind,
|
|
406
|
-
name: resourceWithEvaluator.metadata?.name || 'unknown',
|
|
407
|
-
namespace: resourceWithEvaluator.metadata?.namespace || options.namespace || 'default',
|
|
408
|
-
manifest: resourceWithEvaluator,
|
|
409
|
-
status: 'deployed',
|
|
410
|
-
deployedAt: new Date(),
|
|
411
|
-
};
|
|
412
|
-
try {
|
|
413
|
-
await this.eventMonitor.addResources([preDeployedResource]);
|
|
414
|
-
resourceLogger.debug('Added resource to event monitoring before deployment');
|
|
415
|
-
}
|
|
416
|
-
catch (error) {
|
|
417
|
-
resourceLogger.warn('Failed to add resource to event monitoring, continuing deployment', error);
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
const deployedResource = await this.deploySingleResource(resourceWithEvaluator, context, options, abortSignal);
|
|
421
|
-
resourceLogger.debug('Resource deployed successfully');
|
|
422
|
-
return {
|
|
423
|
-
success: true,
|
|
424
|
-
resourceId,
|
|
425
|
-
deployedResource,
|
|
426
|
-
};
|
|
427
|
-
}
|
|
428
|
-
catch (error) {
|
|
429
|
-
resourceLogger.error('Resource deployment failed', error);
|
|
430
|
-
const failedResource = {
|
|
431
|
-
id: resourceId,
|
|
432
|
-
kind: resource.manifest.kind,
|
|
433
|
-
name: resource.manifest.metadata?.name || 'unknown',
|
|
434
|
-
namespace: resource.manifest.metadata?.namespace || 'default',
|
|
435
|
-
manifest: resource.manifest,
|
|
436
|
-
status: 'failed',
|
|
437
|
-
deployedAt: new Date(),
|
|
438
|
-
error: error,
|
|
439
|
-
};
|
|
440
|
-
return {
|
|
441
|
-
success: false,
|
|
442
|
-
resourceId,
|
|
443
|
-
deployedResource: failedResource,
|
|
444
|
-
error: {
|
|
445
|
-
resourceId,
|
|
446
|
-
phase: 'deployment',
|
|
447
|
-
error: error,
|
|
448
|
-
timestamp: new Date(),
|
|
449
|
-
},
|
|
450
|
-
};
|
|
451
|
-
}
|
|
452
|
-
});
|
|
453
|
-
// Wait for all resources in this level to complete
|
|
454
|
-
const levelResults = await Promise.allSettled(levelPromises);
|
|
455
|
-
// Process results and handle errors
|
|
456
|
-
let levelHasFailures = false;
|
|
457
|
-
for (const result of levelResults) {
|
|
458
|
-
if (result.status === 'fulfilled') {
|
|
459
|
-
const deploymentResult = result.value;
|
|
460
|
-
if (deploymentResult.success && deploymentResult.deployedResource) {
|
|
461
|
-
deployedResources.push(deploymentResult.deployedResource);
|
|
462
|
-
// Update resourceKeyMapping with the live resource from the cluster (including status)
|
|
463
|
-
// This is critical for CEL expression evaluation which needs access to resource status
|
|
464
|
-
const deployedRes = deploymentResult.deployedResource;
|
|
465
|
-
const manifestWithId = deployedRes.manifest;
|
|
466
|
-
const originalResourceId = manifestWithId.__resourceId;
|
|
467
|
-
if (originalResourceId && resourceKeyMapping.has(originalResourceId)) {
|
|
468
|
-
try {
|
|
469
|
-
// Query the live resource from the cluster to get its current status
|
|
470
|
-
const liveResource = await this.k8sApi.read({
|
|
471
|
-
apiVersion: deployedRes.manifest.apiVersion || '',
|
|
472
|
-
kind: deployedRes.kind,
|
|
473
|
-
metadata: {
|
|
474
|
-
name: deployedRes.name,
|
|
475
|
-
namespace: deployedRes.namespace,
|
|
476
|
-
},
|
|
477
|
-
});
|
|
478
|
-
resourceKeyMapping.set(originalResourceId, liveResource);
|
|
479
|
-
deploymentLogger.debug('Updated resourceKeyMapping with live resource status', {
|
|
480
|
-
originalResourceId,
|
|
481
|
-
kind: deployedRes.kind,
|
|
482
|
-
name: deployedRes.name,
|
|
483
|
-
hasStatus: !!liveResource.status,
|
|
484
|
-
});
|
|
485
|
-
}
|
|
486
|
-
catch (error) {
|
|
487
|
-
deploymentLogger.warn('Failed to update resourceKeyMapping with live resource', {
|
|
488
|
-
originalResourceId,
|
|
489
|
-
error: error instanceof Error ? error.message : String(error),
|
|
490
|
-
});
|
|
491
|
-
}
|
|
492
|
-
}
|
|
493
|
-
}
|
|
494
|
-
else {
|
|
495
|
-
levelHasFailures = true;
|
|
496
|
-
if (deploymentResult.error) {
|
|
497
|
-
errors.push(deploymentResult.error);
|
|
498
|
-
}
|
|
499
|
-
if (deploymentResult.deployedResource) {
|
|
500
|
-
deployedResources.push(deploymentResult.deployedResource);
|
|
501
|
-
}
|
|
502
|
-
}
|
|
503
|
-
}
|
|
504
|
-
else {
|
|
505
|
-
// Promise was rejected
|
|
506
|
-
levelHasFailures = true;
|
|
507
|
-
levelLogger.error('Unexpected promise rejection in parallel deployment', result.reason);
|
|
508
|
-
}
|
|
509
|
-
}
|
|
510
|
-
// Resources are now added to event monitoring before deployment (see individual resource deployment above)
|
|
511
|
-
// Handle rollback if there are failures and rollback is enabled
|
|
512
|
-
if (levelHasFailures && options.rollbackOnFailure) {
|
|
513
|
-
levelLogger.warn('Level deployment failed, initiating rollback');
|
|
514
|
-
await this.rollbackDeployedResources(deployedResources, options);
|
|
515
|
-
const duration = Date.now() - startTime;
|
|
516
|
-
this.emitEvent(options, {
|
|
517
|
-
type: 'rollback',
|
|
518
|
-
message: `Deployment failed and rolled back in ${duration}ms`,
|
|
519
|
-
timestamp: new Date(),
|
|
520
|
-
});
|
|
521
|
-
return {
|
|
522
|
-
deploymentId,
|
|
523
|
-
resources: deployedResources,
|
|
524
|
-
dependencyGraph: graph.dependencyGraph,
|
|
525
|
-
duration,
|
|
526
|
-
status: 'failed',
|
|
527
|
-
errors,
|
|
528
|
-
};
|
|
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;
|
|
529
225
|
}
|
|
530
|
-
// Calculate level performance metrics
|
|
531
|
-
const levelDuration = Date.now() - levelStartTime;
|
|
532
|
-
const successfulCount = levelResults.filter((r) => r.status === 'fulfilled' && r.value.success).length;
|
|
533
|
-
const failedCount = levelResults.filter((r) => r.status === 'rejected' || (r.status === 'fulfilled' && !r.value.success)).length;
|
|
534
|
-
levelLogger.info(`Level ${levelIndex + 1} deployment completed`, {
|
|
535
|
-
successful: successfulCount,
|
|
536
|
-
failed: failedCount,
|
|
537
|
-
duration: levelDuration,
|
|
538
|
-
parallelism: currentLevel.length,
|
|
539
|
-
averageTimePerResource: Math.round(levelDuration / currentLevel.length),
|
|
540
|
-
});
|
|
541
226
|
}
|
|
542
|
-
const
|
|
543
|
-
|
|
544
|
-
const status = errors.length === 0 ? 'success' : successfulResources.length > 0 ? 'partial' : 'failed';
|
|
545
|
-
// Log comprehensive performance metrics
|
|
546
|
-
deploymentLogger.info('Parallel deployment performance metrics', {
|
|
547
|
-
totalDuration: duration,
|
|
548
|
-
totalResources: deploymentPlan.totalResources,
|
|
549
|
-
parallelLevels: deploymentPlan.levels.length,
|
|
550
|
-
maxParallelism: deploymentPlan.maxParallelism,
|
|
551
|
-
averageTimePerResource: Math.round(duration / deploymentPlan.totalResources),
|
|
552
|
-
successfulResources: successfulResources.length,
|
|
553
|
-
failedResources: errors.length,
|
|
554
|
-
parallelismEfficiency: Math.round((deploymentPlan.totalResources /
|
|
555
|
-
deploymentPlan.levels.length /
|
|
556
|
-
deploymentPlan.maxParallelism) *
|
|
557
|
-
100),
|
|
558
|
-
status,
|
|
559
|
-
});
|
|
560
|
-
this.emitEvent(options, {
|
|
561
|
-
type: status === 'success' ? 'completed' : 'failed',
|
|
562
|
-
message: `Deployment ${status} in ${duration}ms (${deploymentPlan.levels.length} parallel levels, max ${deploymentPlan.maxParallelism} concurrent)`,
|
|
563
|
-
timestamp: new Date(),
|
|
564
|
-
});
|
|
565
|
-
// Stop event monitoring
|
|
566
|
-
if (this.eventMonitor) {
|
|
567
|
-
try {
|
|
568
|
-
await this.eventMonitor.stopMonitoring();
|
|
569
|
-
deploymentLogger.debug('Event monitoring stopped');
|
|
570
|
-
}
|
|
571
|
-
catch (error) {
|
|
572
|
-
deploymentLogger.warn('Failed to stop event monitoring cleanly', error);
|
|
573
|
-
}
|
|
574
|
-
}
|
|
575
|
-
// Clean up abort controller and timeout
|
|
576
|
-
clearTimeout(timeoutId);
|
|
577
|
-
this.removeTrackedAbortController(deploymentAbortController);
|
|
227
|
+
const result = this.buildDeploymentResult(deploymentId, graph, enhancedPlan, deployedResources, errors, startTime, options, deploymentLogger);
|
|
228
|
+
await this.cleanupDeployment(deploymentAbortController, timeoutId, deploymentLogger);
|
|
578
229
|
// Store deployment state for rollback
|
|
579
230
|
this.deploymentState.set(deploymentId, {
|
|
580
231
|
deploymentId,
|
|
@@ -582,45 +233,31 @@ export class DirectDeploymentEngine {
|
|
|
582
233
|
dependencyGraph: graph.dependencyGraph,
|
|
583
234
|
startTime: new Date(startTime),
|
|
584
235
|
endTime: new Date(),
|
|
585
|
-
status: status === 'success'
|
|
236
|
+
status: result.status === 'success'
|
|
237
|
+
? 'completed'
|
|
238
|
+
: result.status === 'partial'
|
|
239
|
+
? 'completed'
|
|
240
|
+
: 'failed',
|
|
586
241
|
options,
|
|
587
242
|
});
|
|
588
|
-
return
|
|
589
|
-
deploymentId,
|
|
590
|
-
resources: deployedResources,
|
|
591
|
-
dependencyGraph: graph.dependencyGraph,
|
|
592
|
-
duration,
|
|
593
|
-
status,
|
|
594
|
-
errors,
|
|
595
|
-
};
|
|
243
|
+
return result;
|
|
596
244
|
}
|
|
597
245
|
catch (error) {
|
|
598
246
|
// Re-throw circular dependency errors immediately - these are configuration errors
|
|
599
247
|
if (error instanceof CircularDependencyError) {
|
|
600
248
|
// Clean up abort controller and timeout before re-throwing
|
|
601
|
-
|
|
602
|
-
this.removeTrackedAbortController(deploymentAbortController);
|
|
249
|
+
await this.cleanupDeployment(deploymentAbortController, timeoutId, deploymentLogger);
|
|
603
250
|
throw error;
|
|
604
251
|
}
|
|
605
252
|
// Clean up abort controller and timeout
|
|
606
|
-
|
|
607
|
-
this.removeTrackedAbortController(deploymentAbortController);
|
|
253
|
+
await this.cleanupDeployment(deploymentAbortController, timeoutId, deploymentLogger);
|
|
608
254
|
const duration = Date.now() - startTime;
|
|
609
255
|
this.emitEvent(options, {
|
|
610
256
|
type: 'failed',
|
|
611
|
-
message: `Deployment failed: ${error}`,
|
|
257
|
+
message: `Deployment with closures failed: ${ensureError(error).message}`,
|
|
612
258
|
timestamp: new Date(),
|
|
613
|
-
error: error,
|
|
259
|
+
error: ensureError(error),
|
|
614
260
|
});
|
|
615
|
-
// Stop event monitoring on error
|
|
616
|
-
if (this.eventMonitor) {
|
|
617
|
-
try {
|
|
618
|
-
await this.eventMonitor.stopMonitoring();
|
|
619
|
-
}
|
|
620
|
-
catch (_cleanupError) {
|
|
621
|
-
// Ignore cleanup errors in error path
|
|
622
|
-
}
|
|
623
|
-
}
|
|
624
261
|
// Store deployment state even for failed deployments (for rollback)
|
|
625
262
|
this.deploymentState.set(deploymentId, {
|
|
626
263
|
deploymentId,
|
|
@@ -641,7 +278,7 @@ export class DirectDeploymentEngine {
|
|
|
641
278
|
{
|
|
642
279
|
resourceId: 'deployment',
|
|
643
280
|
phase: 'deployment',
|
|
644
|
-
error: error,
|
|
281
|
+
error: ensureError(error),
|
|
645
282
|
timestamp: new Date(),
|
|
646
283
|
},
|
|
647
284
|
],
|
|
@@ -649,509 +286,474 @@ export class DirectDeploymentEngine {
|
|
|
649
286
|
}
|
|
650
287
|
}
|
|
651
288
|
/**
|
|
652
|
-
*
|
|
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
|
|
653
295
|
*/
|
|
654
|
-
|
|
655
|
-
const
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
// Determine execution level based on dependencies
|
|
662
|
-
// For now, assign all closures to level -1 to ensure they run before all resources
|
|
663
|
-
// This is especially important for closures that install CRDs (like fluxSystem)
|
|
664
|
-
let level = -1;
|
|
665
|
-
if (dependencies.length > 0) {
|
|
666
|
-
// Find the maximum level of any dependency + 1
|
|
667
|
-
for (const depId of dependencies) {
|
|
668
|
-
const depLevel = this.getResourceLevel(depId, dependencyGraph);
|
|
669
|
-
level = Math.max(level, depLevel + 1);
|
|
670
|
-
}
|
|
671
|
-
}
|
|
672
|
-
closureDependencies.push({
|
|
673
|
-
name,
|
|
674
|
-
closure,
|
|
675
|
-
dependencies,
|
|
676
|
-
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,
|
|
677
303
|
});
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
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 };
|
|
689
316
|
}
|
|
690
317
|
/**
|
|
691
|
-
*
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
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
|
|
329
|
+
*/
|
|
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
|
+
});
|
|
700
379
|
}
|
|
701
380
|
}
|
|
702
|
-
|
|
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 };
|
|
703
389
|
}
|
|
704
390
|
/**
|
|
705
|
-
*
|
|
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
|
|
706
396
|
*/
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
for (let i = 0; i < deploymentPlan.levels.length; i++) {
|
|
721
|
-
enhancedLevels.push({
|
|
722
|
-
resources: deploymentPlan.levels[i] || [],
|
|
723
|
-
closures: [],
|
|
724
|
-
});
|
|
725
|
-
}
|
|
726
|
-
// Add closures to their appropriate levels (excluding level -1 which we already handled)
|
|
727
|
-
for (const closureInfo of closureDependencies) {
|
|
728
|
-
if (closureInfo.level === -1) {
|
|
729
|
-
continue; // Already handled above
|
|
730
|
-
}
|
|
731
|
-
// Adjust level index if we added a pre-resource level
|
|
732
|
-
const adjustedLevel = preResourceClosures.length > 0 ? closureInfo.level + 1 : closureInfo.level;
|
|
733
|
-
// Ensure we have enough levels
|
|
734
|
-
while (enhancedLevels.length <= adjustedLevel) {
|
|
735
|
-
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');
|
|
736
410
|
}
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
411
|
+
catch (error) {
|
|
412
|
+
deploymentLogger.warn('Failed to initialize event monitoring, continuing without it', {
|
|
413
|
+
error: ensureError(error).message,
|
|
414
|
+
});
|
|
740
415
|
}
|
|
741
416
|
}
|
|
742
|
-
return {
|
|
743
|
-
levels: enhancedLevels,
|
|
744
|
-
totalResources: deploymentPlan.totalResources,
|
|
745
|
-
totalClosures: closureDependencies.length,
|
|
746
|
-
maxParallelism: Math.max(deploymentPlan.maxParallelism, Math.max(...enhancedLevels.map((level) => level.closures.length))),
|
|
747
|
-
};
|
|
748
417
|
}
|
|
749
418
|
/**
|
|
750
|
-
* Deploy a
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
}, timeout);
|
|
774
|
-
deploymentLogger.info('Starting deployment with closures', {
|
|
775
|
-
options,
|
|
776
|
-
closures: Object.keys(closures),
|
|
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
|
|
436
|
+
*/
|
|
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,
|
|
777
442
|
});
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
this.
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
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,
|
|
805
487
|
});
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
const
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
:
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
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 });
|
|
823
509
|
});
|
|
824
510
|
}
|
|
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
|
+
};
|
|
825
518
|
}
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
const deployedResourcesMap = new Map();
|
|
848
|
-
// Populate with resources from previous levels
|
|
849
|
-
for (const resource of deployedResources) {
|
|
850
|
-
deployedResourcesMap.set(resource.id, resource);
|
|
851
|
-
}
|
|
852
|
-
const deploymentContext = {
|
|
853
|
-
kubernetesApi: this.k8sApi,
|
|
854
|
-
...(alchemyScope && { alchemyScope }),
|
|
855
|
-
...(options.namespace && { namespace: options.namespace }),
|
|
856
|
-
deployedResources: deployedResourcesMap,
|
|
857
|
-
resolveReference: async (ref) => {
|
|
858
|
-
// Enhanced reference resolution - will be improved in future tasks
|
|
859
|
-
return ref;
|
|
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(),
|
|
860
540
|
},
|
|
861
541
|
};
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
return {
|
|
873
|
-
success: false,
|
|
874
|
-
resourceId,
|
|
875
|
-
error: {
|
|
876
|
-
resourceId,
|
|
877
|
-
phase: 'validation',
|
|
878
|
-
error,
|
|
879
|
-
timestamp: new Date(),
|
|
880
|
-
},
|
|
881
|
-
};
|
|
882
|
-
}
|
|
883
|
-
resourceLogger.debug('Found resource in graph', {
|
|
884
|
-
resourceId: resource.id,
|
|
885
|
-
kind: resource.manifest?.kind,
|
|
886
|
-
name: resource.manifest?.metadata?.name,
|
|
887
|
-
});
|
|
888
|
-
try {
|
|
889
|
-
resourceLogger.debug('Calling deploySingleResource');
|
|
890
|
-
// Wait for CRD establishment if this is a custom resource
|
|
891
|
-
await this.waitForCRDIfCustomResource(resource.manifest, options, resourceLogger, abortSignal);
|
|
892
|
-
const resourceWithEvaluator = ensureReadinessEvaluator(resource.manifest);
|
|
893
|
-
const deployedResource = await this.deploySingleResource(resourceWithEvaluator, context, options, abortSignal);
|
|
894
|
-
resourceLogger.debug('Resource deployed successfully');
|
|
895
|
-
return {
|
|
896
|
-
success: true,
|
|
897
|
-
resourceId,
|
|
898
|
-
deployedResource,
|
|
899
|
-
};
|
|
900
|
-
}
|
|
901
|
-
catch (error) {
|
|
902
|
-
resourceLogger.error('Resource deployment failed', error);
|
|
903
|
-
const failedResource = {
|
|
904
|
-
id: resourceId,
|
|
905
|
-
kind: resource.manifest.kind,
|
|
906
|
-
name: resource.manifest.metadata?.name || 'unknown',
|
|
907
|
-
namespace: resource.manifest.metadata?.namespace || 'default',
|
|
908
|
-
manifest: resource.manifest,
|
|
909
|
-
status: 'failed',
|
|
910
|
-
deployedAt: new Date(),
|
|
911
|
-
error: error,
|
|
912
|
-
};
|
|
913
|
-
return {
|
|
914
|
-
success: false,
|
|
915
|
-
resourceId,
|
|
916
|
-
deployedResource: failedResource,
|
|
917
|
-
error: {
|
|
918
|
-
resourceId,
|
|
919
|
-
phase: 'deployment',
|
|
920
|
-
error: error,
|
|
921
|
-
timestamp: new Date(),
|
|
922
|
-
},
|
|
923
|
-
};
|
|
924
|
-
}
|
|
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,
|
|
925
552
|
});
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
}
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
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++;
|
|
955
592
|
}
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
// Process results and handle errors
|
|
962
|
-
let levelHasFailures = false;
|
|
963
|
-
let successfulResources = 0;
|
|
964
|
-
let successfulClosures = 0;
|
|
965
|
-
let failedResources = 0;
|
|
966
|
-
let failedClosures = 0;
|
|
967
|
-
for (const result of levelResults) {
|
|
968
|
-
if (result.status === 'fulfilled') {
|
|
969
|
-
const deploymentResult = result.value;
|
|
970
|
-
if (deploymentResult.type === 'closure') {
|
|
971
|
-
// Handle closure result
|
|
972
|
-
if (deploymentResult.success) {
|
|
973
|
-
successfulClosures++;
|
|
974
|
-
}
|
|
975
|
-
else {
|
|
976
|
-
levelHasFailures = true;
|
|
977
|
-
failedClosures++;
|
|
978
|
-
if (deploymentResult.error) {
|
|
979
|
-
errors.push(deploymentResult.error);
|
|
980
|
-
}
|
|
981
|
-
}
|
|
982
|
-
}
|
|
983
|
-
else {
|
|
984
|
-
// Handle resource result
|
|
985
|
-
if (deploymentResult.success && deploymentResult.deployedResource) {
|
|
986
|
-
deployedResources.push(deploymentResult.deployedResource);
|
|
987
|
-
successfulResources++;
|
|
988
|
-
// Update resourceKeyMapping with the live resource from the cluster (including status)
|
|
989
|
-
// This is critical for CEL expression evaluation which needs access to resource status
|
|
990
|
-
const deployedRes = deploymentResult.deployedResource;
|
|
991
|
-
const manifestWithId = deployedRes.manifest;
|
|
992
|
-
const originalResourceId = manifestWithId.__resourceId;
|
|
993
|
-
if (originalResourceId && resourceKeyMapping.has(originalResourceId)) {
|
|
994
|
-
try {
|
|
995
|
-
// Query the live resource from the cluster to get its current status
|
|
996
|
-
const liveResource = await this.k8sApi.read({
|
|
997
|
-
apiVersion: deployedRes.manifest.apiVersion || '',
|
|
998
|
-
kind: deployedRes.kind,
|
|
999
|
-
metadata: {
|
|
1000
|
-
name: deployedRes.name,
|
|
1001
|
-
namespace: deployedRes.namespace,
|
|
1002
|
-
},
|
|
1003
|
-
});
|
|
1004
|
-
resourceKeyMapping.set(originalResourceId, liveResource);
|
|
1005
|
-
deploymentLogger.debug('Updated resourceKeyMapping with live resource status', {
|
|
1006
|
-
originalResourceId,
|
|
1007
|
-
kind: deployedRes.kind,
|
|
1008
|
-
name: deployedRes.name,
|
|
1009
|
-
hasStatus: !!liveResource.status,
|
|
1010
|
-
});
|
|
1011
|
-
}
|
|
1012
|
-
catch (error) {
|
|
1013
|
-
deploymentLogger.warn('Failed to update resourceKeyMapping with live resource', {
|
|
1014
|
-
originalResourceId,
|
|
1015
|
-
error: error instanceof Error ? error.message : String(error),
|
|
1016
|
-
});
|
|
1017
|
-
}
|
|
1018
|
-
}
|
|
1019
|
-
}
|
|
1020
|
-
else {
|
|
1021
|
-
levelHasFailures = true;
|
|
1022
|
-
failedResources++;
|
|
1023
|
-
if (deploymentResult.error) {
|
|
1024
|
-
errors.push(deploymentResult.error);
|
|
1025
|
-
}
|
|
1026
|
-
if (deploymentResult.deployedResource) {
|
|
1027
|
-
deployedResources.push(deploymentResult.deployedResource);
|
|
1028
|
-
}
|
|
1029
|
-
}
|
|
593
|
+
else {
|
|
594
|
+
levelHasFailures = true;
|
|
595
|
+
failedClosures++;
|
|
596
|
+
if (deploymentResult.error) {
|
|
597
|
+
errors.push(deploymentResult.error);
|
|
1030
598
|
}
|
|
1031
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
|
+
}
|
|
1032
608
|
else {
|
|
1033
609
|
levelHasFailures = true;
|
|
1034
|
-
|
|
610
|
+
failedResources++;
|
|
611
|
+
if (deploymentResult.error) {
|
|
612
|
+
errors.push(deploymentResult.error);
|
|
613
|
+
}
|
|
614
|
+
if (deploymentResult.deployedResource) {
|
|
615
|
+
deployedResources.push(deploymentResult.deployedResource);
|
|
616
|
+
}
|
|
1035
617
|
}
|
|
1036
618
|
}
|
|
1037
|
-
// Handle rollback if there are failures and rollback is enabled
|
|
1038
|
-
if (levelHasFailures && options.rollbackOnFailure) {
|
|
1039
|
-
levelLogger.warn('Level deployment failed, initiating rollback');
|
|
1040
|
-
await this.rollbackDeployedResources(deployedResources, options);
|
|
1041
|
-
const duration = Date.now() - startTime;
|
|
1042
|
-
this.emitEvent(options, {
|
|
1043
|
-
type: 'rollback',
|
|
1044
|
-
message: `Deployment failed and rolled back in ${duration}ms`,
|
|
1045
|
-
timestamp: new Date(),
|
|
1046
|
-
});
|
|
1047
|
-
return {
|
|
1048
|
-
deploymentId,
|
|
1049
|
-
resources: deployedResources,
|
|
1050
|
-
dependencyGraph: graph.dependencyGraph,
|
|
1051
|
-
duration,
|
|
1052
|
-
status: 'failed',
|
|
1053
|
-
errors,
|
|
1054
|
-
};
|
|
1055
|
-
}
|
|
1056
|
-
// Calculate level performance metrics
|
|
1057
|
-
const levelDuration = Date.now() - levelStartTime;
|
|
1058
|
-
const totalOperations = currentLevel.resources.length + currentLevel.closures.length;
|
|
1059
|
-
levelLogger.info(`Level ${levelIndex + 1} deployment completed`, {
|
|
1060
|
-
resources: { successful: successfulResources, failed: failedResources },
|
|
1061
|
-
closures: { successful: successfulClosures, failed: failedClosures },
|
|
1062
|
-
duration: levelDuration,
|
|
1063
|
-
parallelism: totalOperations,
|
|
1064
|
-
averageTimePerOperation: totalOperations > 0 ? Math.round(levelDuration / totalOperations) : 0,
|
|
1065
|
-
});
|
|
1066
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);
|
|
1067
629
|
const duration = Date.now() - startTime;
|
|
1068
|
-
const successfulResources = deployedResources.filter((r) => r.status !== 'failed');
|
|
1069
|
-
const status = errors.length === 0 ? 'success' : successfulResources.length > 0 ? 'partial' : 'failed';
|
|
1070
|
-
// Log comprehensive performance metrics
|
|
1071
|
-
deploymentLogger.info('Parallel deployment with closures performance metrics', {
|
|
1072
|
-
totalDuration: duration,
|
|
1073
|
-
totalResources: enhancedPlan.totalResources,
|
|
1074
|
-
totalClosures: enhancedPlan.totalClosures,
|
|
1075
|
-
parallelLevels: enhancedPlan.levels.length,
|
|
1076
|
-
maxParallelism: enhancedPlan.maxParallelism,
|
|
1077
|
-
averageTimePerResource: enhancedPlan.totalResources > 0 ? Math.round(duration / enhancedPlan.totalResources) : 0,
|
|
1078
|
-
successfulResources: successfulResources.length,
|
|
1079
|
-
failedResources: errors.length,
|
|
1080
|
-
status,
|
|
1081
|
-
});
|
|
1082
630
|
this.emitEvent(options, {
|
|
1083
|
-
type:
|
|
1084
|
-
message: `Deployment
|
|
631
|
+
type: 'rollback',
|
|
632
|
+
message: `Deployment failed and rolled back in ${duration}ms`,
|
|
1085
633
|
timestamp: new Date(),
|
|
1086
634
|
});
|
|
1087
|
-
// Clean up abort controller and timeout
|
|
1088
|
-
clearTimeout(timeoutId);
|
|
1089
|
-
this.removeTrackedAbortController(deploymentAbortController);
|
|
1090
|
-
// Store deployment state for rollback
|
|
1091
|
-
this.deploymentState.set(deploymentId, {
|
|
1092
|
-
deploymentId,
|
|
1093
|
-
resources: deployedResources,
|
|
1094
|
-
dependencyGraph: graph.dependencyGraph,
|
|
1095
|
-
startTime: new Date(startTime),
|
|
1096
|
-
endTime: new Date(),
|
|
1097
|
-
status: status === 'success' ? 'completed' : status === 'partial' ? 'completed' : 'failed',
|
|
1098
|
-
options,
|
|
1099
|
-
});
|
|
1100
635
|
return {
|
|
1101
636
|
deploymentId,
|
|
1102
637
|
resources: deployedResources,
|
|
1103
638
|
dependencyGraph: graph.dependencyGraph,
|
|
1104
639
|
duration,
|
|
1105
|
-
status,
|
|
640
|
+
status: 'failed',
|
|
1106
641
|
errors,
|
|
1107
642
|
};
|
|
1108
643
|
}
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
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');
|
|
1116
712
|
}
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
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
|
+
},
|
|
1126
740
|
});
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
endTime: new Date(),
|
|
1134
|
-
status: 'failed',
|
|
1135
|
-
options,
|
|
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,
|
|
1136
747
|
});
|
|
1137
|
-
return {
|
|
1138
|
-
deploymentId,
|
|
1139
|
-
resources: deployedResources,
|
|
1140
|
-
dependencyGraph: graph.dependencyGraph,
|
|
1141
|
-
duration,
|
|
1142
|
-
status: 'failed',
|
|
1143
|
-
errors: [
|
|
1144
|
-
{
|
|
1145
|
-
resourceId: 'deployment',
|
|
1146
|
-
phase: 'deployment',
|
|
1147
|
-
error: error,
|
|
1148
|
-
timestamp: new Date(),
|
|
1149
|
-
},
|
|
1150
|
-
],
|
|
1151
|
-
};
|
|
1152
748
|
}
|
|
1153
|
-
|
|
1154
|
-
|
|
749
|
+
catch (error) {
|
|
750
|
+
logger.warn('Failed to update resourceKeyMapping with live resource', {
|
|
751
|
+
originalResourceId,
|
|
752
|
+
error: ensureError(error).message,
|
|
753
|
+
});
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
/**
|
|
1155
757
|
* Deploy a single resource
|
|
1156
758
|
*/
|
|
1157
759
|
async deploySingleResource(resource, context, options, abortSignal) {
|
|
@@ -1159,9 +761,9 @@ export class DirectDeploymentEngine {
|
|
|
1159
761
|
if (abortSignal?.aborted) {
|
|
1160
762
|
throw new DOMException('Operation aborted', 'AbortError');
|
|
1161
763
|
}
|
|
1162
|
-
//
|
|
1163
|
-
const
|
|
1164
|
-
const resourceId =
|
|
764
|
+
// Resource ID from WeakMap metadata or deterministic ID generation
|
|
765
|
+
const internalId = getResourceMetadataId(resource);
|
|
766
|
+
const resourceId = internalId || getResourceId(resource);
|
|
1165
767
|
const resourceLogger = this.logger.child({
|
|
1166
768
|
resourceId,
|
|
1167
769
|
kind: resource.kind,
|
|
@@ -1175,362 +777,11 @@ export class DirectDeploymentEngine {
|
|
|
1175
777
|
timestamp: new Date(),
|
|
1176
778
|
});
|
|
1177
779
|
// 1. Resolve all references in the resource
|
|
1178
|
-
|
|
1179
|
-
try {
|
|
1180
|
-
resourceLogger.debug('Resolving resource references', {
|
|
1181
|
-
originalMetadata: resource.metadata,
|
|
1182
|
-
});
|
|
1183
|
-
const resolveTimeout = options.timeout || 30000;
|
|
1184
|
-
resolvedResource = (await Promise.race([
|
|
1185
|
-
this.referenceResolver.resolveReferences(resource, context),
|
|
1186
|
-
new Promise((_, reject) => setTimeout(() => reject(new Error('Reference resolution timeout')), resolveTimeout)),
|
|
1187
|
-
]));
|
|
1188
|
-
// Check for readinessEvaluator which may be on Enhanced resources
|
|
1189
|
-
const enhancedResource = resolvedResource;
|
|
1190
|
-
resourceLogger.debug('References resolved successfully', {
|
|
1191
|
-
resolvedMetadata: resolvedResource.metadata,
|
|
1192
|
-
hasReadinessEvaluator: !!enhancedResource.readinessEvaluator,
|
|
1193
|
-
});
|
|
1194
|
-
}
|
|
1195
|
-
catch (error) {
|
|
1196
|
-
// In Alchemy deployments, resourceKeyMapping is often empty because resources are deployed
|
|
1197
|
-
// one at a time. This is expected behavior, so we log at debug level instead of warn.
|
|
1198
|
-
const hasResourceKeyMapping = context.resourceKeyMapping && context.resourceKeyMapping.size > 0;
|
|
1199
|
-
if (hasResourceKeyMapping) {
|
|
1200
|
-
resourceLogger.warn('Reference resolution failed, using original resource', error);
|
|
1201
|
-
}
|
|
1202
|
-
else {
|
|
1203
|
-
resourceLogger.debug('Reference resolution skipped (no resourceKeyMapping), using original resource', {
|
|
1204
|
-
error: error.message,
|
|
1205
|
-
});
|
|
1206
|
-
}
|
|
1207
|
-
resolvedResource = resource;
|
|
1208
|
-
}
|
|
780
|
+
const resolvedRef = await this.resourceApplier.resolveResourceReferences(resource, context, options, resourceLogger);
|
|
1209
781
|
// 2. Apply namespace if specified, but only if resource doesn't already have one
|
|
1210
|
-
|
|
1211
|
-
resolvedResource.metadata &&
|
|
1212
|
-
typeof resolvedResource.metadata.namespace !== 'string') {
|
|
1213
|
-
resourceLogger.debug('Applying namespace from deployment options', {
|
|
1214
|
-
targetNamespace: options.namespace,
|
|
1215
|
-
currentNamespace: resolvedResource.metadata.namespace,
|
|
1216
|
-
currentNamespaceType: typeof resolvedResource.metadata.namespace,
|
|
1217
|
-
});
|
|
1218
|
-
// Create a completely new metadata object to avoid proxy issues
|
|
1219
|
-
const newMetadata = {
|
|
1220
|
-
...resolvedResource.metadata,
|
|
1221
|
-
namespace: options.namespace,
|
|
1222
|
-
};
|
|
1223
|
-
// Preserve the readiness evaluator when creating the new resource
|
|
1224
|
-
const newResolvedResource = {
|
|
1225
|
-
...resolvedResource,
|
|
1226
|
-
metadata: newMetadata,
|
|
1227
|
-
};
|
|
1228
|
-
// Copy the non-enumerable readiness evaluator if it exists
|
|
1229
|
-
const resourceWithEvaluator = resolvedResource;
|
|
1230
|
-
const readinessEvaluator = resourceWithEvaluator.readinessEvaluator;
|
|
1231
|
-
if (readinessEvaluator) {
|
|
1232
|
-
Object.defineProperty(newResolvedResource, 'readinessEvaluator', {
|
|
1233
|
-
value: readinessEvaluator,
|
|
1234
|
-
enumerable: false,
|
|
1235
|
-
configurable: true,
|
|
1236
|
-
writable: false,
|
|
1237
|
-
});
|
|
1238
|
-
}
|
|
1239
|
-
// Copy the non-enumerable __resourceId if it exists (used for cross-resource references)
|
|
1240
|
-
const originalResourceId = resourceWithEvaluator.__resourceId;
|
|
1241
|
-
if (originalResourceId) {
|
|
1242
|
-
Object.defineProperty(newResolvedResource, '__resourceId', {
|
|
1243
|
-
value: originalResourceId,
|
|
1244
|
-
enumerable: false,
|
|
1245
|
-
configurable: true,
|
|
1246
|
-
writable: false,
|
|
1247
|
-
});
|
|
1248
|
-
}
|
|
1249
|
-
resolvedResource = newResolvedResource;
|
|
1250
|
-
}
|
|
782
|
+
const resolvedResource = this.resourceApplier.applyNamespaceToResource(resolvedRef, options.namespace, resourceLogger);
|
|
1251
783
|
// 3. Apply the resource to the cluster (or simulate for dry run)
|
|
1252
|
-
|
|
1253
|
-
if (options.dryRun) {
|
|
1254
|
-
// In dry run mode, don't actually create the resource
|
|
1255
|
-
resourceLogger.debug('Dry run mode: simulating resource creation');
|
|
1256
|
-
appliedResource = {
|
|
1257
|
-
...resolvedResource,
|
|
1258
|
-
metadata: {
|
|
1259
|
-
...resolvedResource.metadata,
|
|
1260
|
-
uid: 'dry-run-uid',
|
|
1261
|
-
},
|
|
1262
|
-
};
|
|
1263
|
-
}
|
|
1264
|
-
else {
|
|
1265
|
-
// Apply resource with retry logic
|
|
1266
|
-
const retryPolicy = options.retryPolicy || {
|
|
1267
|
-
maxRetries: 3,
|
|
1268
|
-
backoffMultiplier: 2,
|
|
1269
|
-
initialDelay: 1000,
|
|
1270
|
-
maxDelay: 30000,
|
|
1271
|
-
};
|
|
1272
|
-
let lastError;
|
|
1273
|
-
for (let attempt = 0; attempt <= retryPolicy.maxRetries; attempt++) {
|
|
1274
|
-
try {
|
|
1275
|
-
resourceLogger.debug('Applying resource to cluster', { attempt });
|
|
1276
|
-
// Check if resource already exists
|
|
1277
|
-
let existing;
|
|
1278
|
-
try {
|
|
1279
|
-
// In the new API, methods return objects directly (no .body wrapper)
|
|
1280
|
-
existing = await this.k8sApi.read({
|
|
1281
|
-
apiVersion: resolvedResource.apiVersion,
|
|
1282
|
-
kind: resolvedResource.kind,
|
|
1283
|
-
metadata: {
|
|
1284
|
-
name: resolvedResource.metadata?.name || '',
|
|
1285
|
-
namespace: resolvedResource.metadata?.namespace || 'default',
|
|
1286
|
-
},
|
|
1287
|
-
});
|
|
1288
|
-
}
|
|
1289
|
-
catch (error) {
|
|
1290
|
-
// If it's a 404, the resource doesn't exist, which is expected for creation
|
|
1291
|
-
const apiError = error;
|
|
1292
|
-
// Check for 404 in various error formats:
|
|
1293
|
-
// - apiError.statusCode (direct property)
|
|
1294
|
-
// - apiError.response?.statusCode (nested response)
|
|
1295
|
-
// - apiError.body?.code (body code)
|
|
1296
|
-
// - error message containing "HTTP-Code: 404"
|
|
1297
|
-
const is404 = apiError.statusCode === 404 ||
|
|
1298
|
-
apiError.response?.statusCode === 404 ||
|
|
1299
|
-
apiError.body?.code === 404 ||
|
|
1300
|
-
(typeof apiError.message === 'string' && apiError.message.includes('HTTP-Code: 404'));
|
|
1301
|
-
if (!is404) {
|
|
1302
|
-
// Also check for "Unrecognized API version and kind" errors - these indicate
|
|
1303
|
-
// the CRD is not installed yet, which should trigger CRD waiting logic
|
|
1304
|
-
const isUnrecognizedApiError = typeof apiError.message === 'string' &&
|
|
1305
|
-
apiError.message.includes('Unrecognized API version and kind');
|
|
1306
|
-
if (isUnrecognizedApiError) {
|
|
1307
|
-
resourceLogger.debug('CRD not yet registered, will retry after CRD establishment', error);
|
|
1308
|
-
}
|
|
1309
|
-
else {
|
|
1310
|
-
resourceLogger.error('Error checking resource existence', error);
|
|
1311
|
-
}
|
|
1312
|
-
throw error;
|
|
1313
|
-
}
|
|
1314
|
-
// 404 means resource doesn't exist - this is expected, we'll create it below
|
|
1315
|
-
}
|
|
1316
|
-
if (existing) {
|
|
1317
|
-
// Resource exists, use patch for safer updates
|
|
1318
|
-
// Log the full resource being patched, including non-standard fields like 'data' for Secrets
|
|
1319
|
-
const patchPayload = {
|
|
1320
|
-
apiVersion: resolvedResource.apiVersion,
|
|
1321
|
-
kind: resolvedResource.kind,
|
|
1322
|
-
metadata: resolvedResource.metadata,
|
|
1323
|
-
};
|
|
1324
|
-
// Include spec if present (most resources)
|
|
1325
|
-
if (resolvedResource.spec !== undefined) {
|
|
1326
|
-
patchPayload.spec = resolvedResource.spec;
|
|
1327
|
-
}
|
|
1328
|
-
// Include data if present (Secrets)
|
|
1329
|
-
if (resolvedResource.data !== undefined) {
|
|
1330
|
-
patchPayload.data = resolvedResource.data;
|
|
1331
|
-
}
|
|
1332
|
-
// Include stringData if present (Secrets)
|
|
1333
|
-
if (resolvedResource.stringData !== undefined) {
|
|
1334
|
-
patchPayload.stringData = resolvedResource.stringData;
|
|
1335
|
-
}
|
|
1336
|
-
// Include rules if present (RBAC resources)
|
|
1337
|
-
if (resolvedResource.rules !== undefined) {
|
|
1338
|
-
// Ensure arrays are preserved (not converted to objects with numeric keys)
|
|
1339
|
-
const rules = resolvedResource.rules;
|
|
1340
|
-
patchPayload.rules = Array.isArray(rules) ? [...rules] : rules;
|
|
1341
|
-
}
|
|
1342
|
-
// Include subjects if present (ClusterRoleBinding, RoleBinding)
|
|
1343
|
-
if (resolvedResource.subjects !== undefined) {
|
|
1344
|
-
// Ensure arrays are preserved (not converted to objects with numeric keys)
|
|
1345
|
-
const subjects = resolvedResource.subjects;
|
|
1346
|
-
patchPayload.subjects = Array.isArray(subjects) ? [...subjects] : subjects;
|
|
1347
|
-
}
|
|
1348
|
-
// Include roleRef if present (ClusterRoleBinding, RoleBinding)
|
|
1349
|
-
if (resolvedResource.roleRef !== undefined) {
|
|
1350
|
-
patchPayload.roleRef = resolvedResource.roleRef;
|
|
1351
|
-
}
|
|
1352
|
-
// Explicitly call toJSON to ensure arrays are preserved via our custom toJSON implementation
|
|
1353
|
-
// Then use JSON.parse(JSON.stringify()) to ensure we have a plain object without proxies
|
|
1354
|
-
const jsonPayload = typeof resolvedResource.toJSON === 'function'
|
|
1355
|
-
? resolvedResource.toJSON()
|
|
1356
|
-
: patchPayload;
|
|
1357
|
-
// Deep clone to remove any proxy wrappers that might cause serialization issues
|
|
1358
|
-
const cleanPayload = JSON.parse(JSON.stringify(jsonPayload));
|
|
1359
|
-
// Strip internal TypeKro fields that should not be sent to Kubernetes
|
|
1360
|
-
// The 'id' field is used internally for resource mapping but is not a valid K8s field
|
|
1361
|
-
delete cleanPayload.id;
|
|
1362
|
-
resourceLogger.debug('Resource exists, patching', { patchPayload: cleanPayload });
|
|
1363
|
-
// In the new API, methods return objects directly (no .body wrapper)
|
|
1364
|
-
appliedResource = await this.patchResourceWithCorrectContentType(cleanPayload);
|
|
1365
|
-
}
|
|
1366
|
-
else {
|
|
1367
|
-
// Resource does not exist, create it
|
|
1368
|
-
resourceLogger.debug('Resource does not exist, creating');
|
|
1369
|
-
// DEBUG: Log the resource being created for Secrets
|
|
1370
|
-
if (resolvedResource.kind === 'Secret') {
|
|
1371
|
-
resourceLogger.debug('Creating Secret resource', {
|
|
1372
|
-
name: resolvedResource.metadata?.name,
|
|
1373
|
-
hasData: 'data' in resolvedResource,
|
|
1374
|
-
hasSpec: 'spec' in resolvedResource,
|
|
1375
|
-
dataKeys: resolvedResource.data ? Object.keys(resolvedResource.data) : [],
|
|
1376
|
-
specValue: resolvedResource.spec,
|
|
1377
|
-
});
|
|
1378
|
-
}
|
|
1379
|
-
// Explicitly call toJSON to ensure arrays are preserved via our custom toJSON implementation
|
|
1380
|
-
// Then use JSON.parse(JSON.stringify()) to ensure we have a plain object without proxies
|
|
1381
|
-
const jsonResource = typeof resolvedResource.toJSON === 'function'
|
|
1382
|
-
? resolvedResource.toJSON()
|
|
1383
|
-
: resolvedResource;
|
|
1384
|
-
// Deep clone to remove any proxy wrappers that might cause serialization issues
|
|
1385
|
-
const cleanResource = JSON.parse(JSON.stringify(jsonResource));
|
|
1386
|
-
// Strip internal TypeKro fields that should not be sent to Kubernetes
|
|
1387
|
-
// The 'id' field is used internally for resource mapping but is not a valid K8s field
|
|
1388
|
-
delete cleanResource.id;
|
|
1389
|
-
// In the new API, methods return objects directly (no .body wrapper)
|
|
1390
|
-
appliedResource = await this.k8sApi.create(cleanResource);
|
|
1391
|
-
}
|
|
1392
|
-
resourceLogger.debug('Resource applied successfully', {
|
|
1393
|
-
appliedName: appliedResource.metadata?.name,
|
|
1394
|
-
appliedNamespace: appliedResource.metadata?.namespace,
|
|
1395
|
-
operation: existing ? 'patched' : 'created',
|
|
1396
|
-
attempt,
|
|
1397
|
-
});
|
|
1398
|
-
// Success - break out of retry loop
|
|
1399
|
-
break;
|
|
1400
|
-
}
|
|
1401
|
-
catch (error) {
|
|
1402
|
-
lastError = error;
|
|
1403
|
-
// Check for 409 Conflict errors - resource already exists
|
|
1404
|
-
const apiError = error;
|
|
1405
|
-
const is409 = apiError.statusCode === 409 ||
|
|
1406
|
-
apiError.response?.statusCode === 409 ||
|
|
1407
|
-
apiError.body?.code === 409 ||
|
|
1408
|
-
(typeof apiError.message === 'string' && apiError.message.includes('HTTP-Code: 409'));
|
|
1409
|
-
if (is409) {
|
|
1410
|
-
const conflictStrategy = options.conflictStrategy || 'warn';
|
|
1411
|
-
const resourceName = resolvedResource.metadata?.name || 'unknown';
|
|
1412
|
-
const resourceKind = resolvedResource.kind || 'Unknown';
|
|
1413
|
-
const resourceNamespace = resolvedResource.metadata?.namespace;
|
|
1414
|
-
let conflictHandled = false;
|
|
1415
|
-
resourceLogger.debug('Resource already exists (409)', {
|
|
1416
|
-
name: resourceName,
|
|
1417
|
-
kind: resourceKind,
|
|
1418
|
-
conflictStrategy,
|
|
1419
|
-
});
|
|
1420
|
-
// Handle based on conflict strategy
|
|
1421
|
-
switch (conflictStrategy) {
|
|
1422
|
-
case 'fail':
|
|
1423
|
-
// Throw error immediately - don't retry
|
|
1424
|
-
throw new ResourceConflictError(resourceName, resourceKind, resourceNamespace);
|
|
1425
|
-
case 'warn':
|
|
1426
|
-
// Log warning and treat as success - fetch existing resource
|
|
1427
|
-
resourceLogger.warn('Resource already exists, treating as success', {
|
|
1428
|
-
name: resourceName,
|
|
1429
|
-
kind: resourceKind,
|
|
1430
|
-
namespace: resourceNamespace,
|
|
1431
|
-
});
|
|
1432
|
-
try {
|
|
1433
|
-
// Fetch the existing resource to return it
|
|
1434
|
-
appliedResource = await this.k8sApi.read({
|
|
1435
|
-
apiVersion: resolvedResource.apiVersion,
|
|
1436
|
-
kind: resolvedResource.kind,
|
|
1437
|
-
metadata: {
|
|
1438
|
-
name: resourceName,
|
|
1439
|
-
namespace: resourceNamespace || 'default',
|
|
1440
|
-
},
|
|
1441
|
-
});
|
|
1442
|
-
conflictHandled = true;
|
|
1443
|
-
}
|
|
1444
|
-
catch (readError) {
|
|
1445
|
-
resourceLogger.warn('Failed to read existing resource after 409, falling back to patch', readError);
|
|
1446
|
-
// Fall back to patch strategy
|
|
1447
|
-
try {
|
|
1448
|
-
const jsonResource = typeof resolvedResource.toJSON === 'function'
|
|
1449
|
-
? resolvedResource.toJSON()
|
|
1450
|
-
: resolvedResource;
|
|
1451
|
-
const cleanResource = JSON.parse(JSON.stringify(jsonResource));
|
|
1452
|
-
delete cleanResource.id;
|
|
1453
|
-
appliedResource = await this.patchResourceWithCorrectContentType(cleanResource);
|
|
1454
|
-
resourceLogger.debug('Resource patched successfully after 409 conflict (warn fallback)');
|
|
1455
|
-
conflictHandled = true;
|
|
1456
|
-
}
|
|
1457
|
-
catch (patchError) {
|
|
1458
|
-
resourceLogger.warn('Failed to patch resource after 409 conflict', patchError);
|
|
1459
|
-
}
|
|
1460
|
-
}
|
|
1461
|
-
break;
|
|
1462
|
-
case 'patch':
|
|
1463
|
-
// Attempt to patch the existing resource
|
|
1464
|
-
try {
|
|
1465
|
-
const jsonResource = typeof resolvedResource.toJSON === 'function'
|
|
1466
|
-
? resolvedResource.toJSON()
|
|
1467
|
-
: resolvedResource;
|
|
1468
|
-
const cleanResource = JSON.parse(JSON.stringify(jsonResource));
|
|
1469
|
-
delete cleanResource.id;
|
|
1470
|
-
appliedResource = await this.patchResourceWithCorrectContentType(cleanResource);
|
|
1471
|
-
resourceLogger.debug('Resource patched successfully after 409 conflict');
|
|
1472
|
-
conflictHandled = true;
|
|
1473
|
-
}
|
|
1474
|
-
catch (patchError) {
|
|
1475
|
-
resourceLogger.warn('Failed to patch resource after 409 conflict', patchError);
|
|
1476
|
-
}
|
|
1477
|
-
break;
|
|
1478
|
-
case 'replace':
|
|
1479
|
-
// Delete and recreate the resource
|
|
1480
|
-
try {
|
|
1481
|
-
resourceLogger.debug('Deleting existing resource for replace strategy');
|
|
1482
|
-
await this.k8sApi.delete({
|
|
1483
|
-
apiVersion: resolvedResource.apiVersion,
|
|
1484
|
-
kind: resolvedResource.kind,
|
|
1485
|
-
metadata: {
|
|
1486
|
-
name: resourceName,
|
|
1487
|
-
namespace: resourceNamespace || 'default',
|
|
1488
|
-
},
|
|
1489
|
-
});
|
|
1490
|
-
// Wait a moment for deletion to propagate
|
|
1491
|
-
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
1492
|
-
// Create the new resource
|
|
1493
|
-
const jsonResource = typeof resolvedResource.toJSON === 'function'
|
|
1494
|
-
? resolvedResource.toJSON()
|
|
1495
|
-
: resolvedResource;
|
|
1496
|
-
const cleanResource = JSON.parse(JSON.stringify(jsonResource));
|
|
1497
|
-
delete cleanResource.id;
|
|
1498
|
-
appliedResource = await this.k8sApi.create(cleanResource);
|
|
1499
|
-
resourceLogger.debug('Resource replaced successfully after 409 conflict');
|
|
1500
|
-
conflictHandled = true;
|
|
1501
|
-
}
|
|
1502
|
-
catch (replaceError) {
|
|
1503
|
-
resourceLogger.warn('Failed to replace resource after 409 conflict', replaceError);
|
|
1504
|
-
}
|
|
1505
|
-
break;
|
|
1506
|
-
}
|
|
1507
|
-
// If we successfully handled the conflict, break out of retry loop
|
|
1508
|
-
if (conflictHandled) {
|
|
1509
|
-
break;
|
|
1510
|
-
}
|
|
1511
|
-
}
|
|
1512
|
-
resourceLogger.error('Failed to apply resource to cluster', lastError, { attempt });
|
|
1513
|
-
// Check for HTTP 415 Unsupported Media Type errors
|
|
1514
|
-
if (this.isUnsupportedMediaTypeError(error)) {
|
|
1515
|
-
const acceptedTypes = this.extractAcceptedMediaTypes(error);
|
|
1516
|
-
throw new UnsupportedMediaTypeError(resolvedResource.metadata?.name || 'unknown', resolvedResource.kind || 'Unknown', acceptedTypes, lastError);
|
|
1517
|
-
}
|
|
1518
|
-
// If this was the last attempt, throw the error
|
|
1519
|
-
if (attempt >= retryPolicy.maxRetries) {
|
|
1520
|
-
throw new ResourceDeploymentError(resolvedResource.metadata?.name || 'unknown', resolvedResource.kind || 'Unknown', lastError);
|
|
1521
|
-
}
|
|
1522
|
-
// Calculate delay for next attempt
|
|
1523
|
-
const delay = Math.min(retryPolicy.initialDelay * retryPolicy.backoffMultiplier ** attempt, retryPolicy.maxDelay);
|
|
1524
|
-
resourceLogger.debug('Retrying resource deployment', {
|
|
1525
|
-
attempt: attempt + 1,
|
|
1526
|
-
maxRetries: retryPolicy.maxRetries,
|
|
1527
|
-
delay,
|
|
1528
|
-
});
|
|
1529
|
-
// Wait before retrying
|
|
1530
|
-
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
1531
|
-
}
|
|
1532
|
-
}
|
|
1533
|
-
}
|
|
784
|
+
await this.resourceApplier.applyResourceToCluster(resolvedResource, options, resourceLogger);
|
|
1534
785
|
// 4. Create deployed resource record
|
|
1535
786
|
const deployedResource = {
|
|
1536
787
|
id: resourceId,
|
|
@@ -1557,175 +808,19 @@ export class DirectDeploymentEngine {
|
|
|
1557
808
|
* @param abortSignal - Optional AbortSignal to cancel the wait
|
|
1558
809
|
*/
|
|
1559
810
|
async waitForResourceReady(deployedResource, options, abortSignal) {
|
|
1560
|
-
|
|
1561
|
-
// Check if already marked as ready
|
|
1562
|
-
if (deployedResource.status === 'ready' || this.readyResources.has(resourceKey)) {
|
|
1563
|
-
this.logger.debug('Resource already marked as ready', { resourceKey });
|
|
1564
|
-
return;
|
|
1565
|
-
}
|
|
1566
|
-
// Check if already aborted
|
|
1567
|
-
if (abortSignal?.aborted) {
|
|
1568
|
-
throw new DOMException('Operation aborted', 'AbortError');
|
|
1569
|
-
}
|
|
1570
|
-
const enhancedManifest = deployedResource.manifest;
|
|
1571
|
-
const readinessEvaluator = enhancedManifest.readinessEvaluator;
|
|
1572
|
-
// Debug logging removed
|
|
1573
|
-
if (!readinessEvaluator) {
|
|
1574
|
-
const errorMessage = `Resource ${deployedResource.kind}/${deployedResource.name} does not have a factory-provided readiness evaluator`;
|
|
1575
|
-
this.logger.error('Missing factory-provided readiness evaluator');
|
|
1576
|
-
throw new Error(errorMessage);
|
|
1577
|
-
}
|
|
1578
|
-
const startTime = Date.now();
|
|
1579
|
-
const timeout = options.timeout || 300000; // 5 minutes default
|
|
1580
|
-
let lastStatus = null;
|
|
1581
|
-
while (Date.now() - startTime < timeout) {
|
|
1582
|
-
// Check if aborted before each iteration
|
|
1583
|
-
if (abortSignal?.aborted) {
|
|
1584
|
-
throw new DOMException('Operation aborted', 'AbortError');
|
|
1585
|
-
}
|
|
1586
|
-
try {
|
|
1587
|
-
// Use custom readiness evaluator
|
|
1588
|
-
// In the new API, methods return objects directly (no .body wrapper)
|
|
1589
|
-
// Wrap with abort signal handling to stop waiting if aborted
|
|
1590
|
-
const liveResource = await this.withAbortSignal(this.k8sApi.read({
|
|
1591
|
-
apiVersion: deployedResource.manifest.apiVersion || '',
|
|
1592
|
-
kind: deployedResource.kind,
|
|
1593
|
-
metadata: {
|
|
1594
|
-
name: deployedResource.name,
|
|
1595
|
-
namespace: deployedResource.namespace,
|
|
1596
|
-
},
|
|
1597
|
-
}), abortSignal);
|
|
1598
|
-
// Apply kind-specific enhancements before calling custom evaluator
|
|
1599
|
-
const enhancedResource = this.enhanceResourceForEvaluation(liveResource, deployedResource.kind);
|
|
1600
|
-
const result = readinessEvaluator(enhancedResource);
|
|
1601
|
-
if (typeof result === 'boolean') {
|
|
1602
|
-
if (result) {
|
|
1603
|
-
this.readyResources.add(resourceKey);
|
|
1604
|
-
this.emitEvent(options, {
|
|
1605
|
-
type: 'resource-ready',
|
|
1606
|
-
resourceId: deployedResource.id,
|
|
1607
|
-
message: `${deployedResource.kind}/${deployedResource.name} ready (custom evaluator)`,
|
|
1608
|
-
timestamp: new Date(),
|
|
1609
|
-
});
|
|
1610
|
-
return;
|
|
1611
|
-
}
|
|
1612
|
-
}
|
|
1613
|
-
else if (result && typeof result === 'object' && 'ready' in result) {
|
|
1614
|
-
lastStatus = result;
|
|
1615
|
-
if (result.ready) {
|
|
1616
|
-
this.readyResources.add(resourceKey);
|
|
1617
|
-
this.emitEvent(options, {
|
|
1618
|
-
type: 'resource-ready',
|
|
1619
|
-
resourceId: deployedResource.id,
|
|
1620
|
-
message: result.message ||
|
|
1621
|
-
`${deployedResource.kind}/${deployedResource.name} ready (custom evaluator)`,
|
|
1622
|
-
timestamp: new Date(),
|
|
1623
|
-
});
|
|
1624
|
-
return;
|
|
1625
|
-
}
|
|
1626
|
-
}
|
|
1627
|
-
// Emit status update if we have status information
|
|
1628
|
-
if (lastStatus && typeof lastStatus === 'object' && 'message' in lastStatus) {
|
|
1629
|
-
this.emitEvent(options, {
|
|
1630
|
-
type: 'resource-status',
|
|
1631
|
-
resourceId: deployedResource.id,
|
|
1632
|
-
message: `${deployedResource.kind}/${deployedResource.name}: ${lastStatus.message}`,
|
|
1633
|
-
timestamp: new Date(),
|
|
1634
|
-
});
|
|
1635
|
-
}
|
|
1636
|
-
// Wait before next check - use abortable delay
|
|
1637
|
-
try {
|
|
1638
|
-
await this.abortableDelay(2000, abortSignal);
|
|
1639
|
-
}
|
|
1640
|
-
catch (error) {
|
|
1641
|
-
if (error instanceof DOMException && (error.name === 'AbortError' || error.name === 'TimeoutError')) {
|
|
1642
|
-
throw error; // Re-throw abort/timeout errors
|
|
1643
|
-
}
|
|
1644
|
-
// Ignore other errors from delay
|
|
1645
|
-
}
|
|
1646
|
-
}
|
|
1647
|
-
catch (error) {
|
|
1648
|
-
// Re-throw abort/timeout errors immediately
|
|
1649
|
-
if (error instanceof DOMException && (error.name === 'AbortError' || error.name === 'TimeoutError')) {
|
|
1650
|
-
throw error;
|
|
1651
|
-
}
|
|
1652
|
-
// Emit error status event
|
|
1653
|
-
this.emitEvent(options, {
|
|
1654
|
-
type: 'resource-status',
|
|
1655
|
-
resourceId: deployedResource.id,
|
|
1656
|
-
message: `Unable to read resource status: ${error instanceof Error ? error.message : String(error)}`,
|
|
1657
|
-
timestamp: new Date(),
|
|
1658
|
-
});
|
|
1659
|
-
// If we can't read the resource, it's not ready yet - use abortable delay
|
|
1660
|
-
try {
|
|
1661
|
-
await this.abortableDelay(2000, abortSignal);
|
|
1662
|
-
}
|
|
1663
|
-
catch (delayError) {
|
|
1664
|
-
if (delayError instanceof DOMException && (delayError.name === 'AbortError' || delayError.name === 'TimeoutError')) {
|
|
1665
|
-
throw delayError; // Re-throw abort/timeout errors
|
|
1666
|
-
}
|
|
1667
|
-
// Ignore other errors from delay
|
|
1668
|
-
}
|
|
1669
|
-
}
|
|
1670
|
-
}
|
|
1671
|
-
// Timeout reached
|
|
1672
|
-
const timeoutMessage = lastStatus
|
|
1673
|
-
? `Timeout waiting for ${deployedResource.kind}/${deployedResource.name}: ${lastStatus.message}`
|
|
1674
|
-
: `Timeout waiting for ${deployedResource.kind}/${deployedResource.name} to be ready`;
|
|
1675
|
-
throw new Error(timeoutMessage);
|
|
811
|
+
return this.readinessWaiter.waitForResourceReady(deployedResource, options, abortSignal);
|
|
1676
812
|
}
|
|
1677
813
|
/**
|
|
1678
814
|
* Rollback deployed resources
|
|
1679
815
|
*/
|
|
1680
816
|
async rollbackDeployedResources(deployedResources, options) {
|
|
1681
|
-
this.
|
|
1682
|
-
type: 'rollback',
|
|
1683
|
-
message: 'Starting rollback of deployed resources',
|
|
1684
|
-
timestamp: new Date(),
|
|
1685
|
-
});
|
|
1686
|
-
const rolledBackResources = [];
|
|
1687
|
-
const errors = [];
|
|
1688
|
-
// Rollback in reverse order
|
|
1689
|
-
const reversedResources = [...deployedResources].reverse();
|
|
1690
|
-
for (const resource of reversedResources) {
|
|
1691
|
-
// Only try to rollback resources that were actually deployed (not failed)
|
|
1692
|
-
if (resource.status === 'failed') {
|
|
1693
|
-
continue; // Skip resources that failed to deploy
|
|
1694
|
-
}
|
|
1695
|
-
try {
|
|
1696
|
-
await this.k8sApi.delete({
|
|
1697
|
-
apiVersion: resource.manifest.apiVersion || '',
|
|
1698
|
-
kind: resource.kind,
|
|
1699
|
-
metadata: {
|
|
1700
|
-
name: resource.name,
|
|
1701
|
-
namespace: resource.namespace,
|
|
1702
|
-
},
|
|
1703
|
-
});
|
|
1704
|
-
rolledBackResources.push(`${resource.kind}/${resource.name}`);
|
|
1705
|
-
}
|
|
1706
|
-
catch (error) {
|
|
1707
|
-
// Log and collect errors for individual resource deletion failures
|
|
1708
|
-
this.logger.warn('Failed to delete resource during rollback', {
|
|
1709
|
-
error: error,
|
|
1710
|
-
resourceId: resource.id,
|
|
1711
|
-
kind: resource.kind,
|
|
1712
|
-
name: resource.name,
|
|
1713
|
-
});
|
|
1714
|
-
errors.push({
|
|
1715
|
-
resourceId: resource.id,
|
|
1716
|
-
phase: 'rollback',
|
|
1717
|
-
error: error,
|
|
1718
|
-
timestamp: new Date(),
|
|
1719
|
-
});
|
|
1720
|
-
}
|
|
1721
|
-
}
|
|
1722
|
-
return { rolledBackResources, errors };
|
|
817
|
+
return this.rollbackManager.rollbackDeployedResources(deployedResources, options);
|
|
1723
818
|
}
|
|
1724
819
|
/**
|
|
1725
820
|
* Generate a unique deployment ID
|
|
1726
821
|
*/
|
|
1727
822
|
generateDeploymentId() {
|
|
1728
|
-
return `deployment-${Date.now()}-${Math.random().toString(36).
|
|
823
|
+
return `deployment-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;
|
|
1729
824
|
}
|
|
1730
825
|
/**
|
|
1731
826
|
* Emit deployment events
|
|
@@ -1743,7 +838,7 @@ export class DirectDeploymentEngine {
|
|
|
1743
838
|
deployedResources: [],
|
|
1744
839
|
kubeClient: this.kubeClient,
|
|
1745
840
|
...(options.namespace && { namespace: options.namespace }),
|
|
1746
|
-
timeout: options.timeout ||
|
|
841
|
+
timeout: options.timeout || DEFAULT_READINESS_TIMEOUT,
|
|
1747
842
|
};
|
|
1748
843
|
// Legacy method - no abort signal support
|
|
1749
844
|
return this.deploySingleResource(resource, context, options, undefined);
|
|
@@ -1752,58 +847,7 @@ export class DirectDeploymentEngine {
|
|
|
1752
847
|
* Delete a resource from the cluster
|
|
1753
848
|
*/
|
|
1754
849
|
async deleteResource(resource) {
|
|
1755
|
-
|
|
1756
|
-
resourceId: resource.id,
|
|
1757
|
-
kind: resource.kind,
|
|
1758
|
-
name: resource.name,
|
|
1759
|
-
});
|
|
1760
|
-
try {
|
|
1761
|
-
await this.k8sApi.delete({
|
|
1762
|
-
apiVersion: resource.manifest.apiVersion || '',
|
|
1763
|
-
kind: resource.kind,
|
|
1764
|
-
metadata: {
|
|
1765
|
-
name: resource.name,
|
|
1766
|
-
namespace: resource.namespace,
|
|
1767
|
-
},
|
|
1768
|
-
});
|
|
1769
|
-
// Wait for resource to be deleted
|
|
1770
|
-
const timeout = 30000; // 30 seconds
|
|
1771
|
-
const startTime = Date.now();
|
|
1772
|
-
while (Date.now() - startTime < timeout) {
|
|
1773
|
-
try {
|
|
1774
|
-
await this.k8sApi.read({
|
|
1775
|
-
apiVersion: resource.manifest.apiVersion || '',
|
|
1776
|
-
kind: resource.kind,
|
|
1777
|
-
metadata: {
|
|
1778
|
-
name: resource.name,
|
|
1779
|
-
namespace: resource.namespace,
|
|
1780
|
-
},
|
|
1781
|
-
});
|
|
1782
|
-
// Resource still exists, wait and try again
|
|
1783
|
-
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
1784
|
-
}
|
|
1785
|
-
catch (error) {
|
|
1786
|
-
// Resource not found, deletion successful
|
|
1787
|
-
if (this.isNotFoundError(error)) {
|
|
1788
|
-
deleteLogger.debug('Resource successfully deleted');
|
|
1789
|
-
return;
|
|
1790
|
-
}
|
|
1791
|
-
throw error;
|
|
1792
|
-
}
|
|
1793
|
-
}
|
|
1794
|
-
throw new Error(`Timeout waiting for resource ${resource.kind}/${resource.name} to be deleted`);
|
|
1795
|
-
}
|
|
1796
|
-
catch (error) {
|
|
1797
|
-
deleteLogger.error('Failed to delete resource', error);
|
|
1798
|
-
throw error;
|
|
1799
|
-
}
|
|
1800
|
-
}
|
|
1801
|
-
/**
|
|
1802
|
-
* Wait for resource readiness (legacy method for compatibility)
|
|
1803
|
-
*/
|
|
1804
|
-
async waitForResourceReadiness(resource, options) {
|
|
1805
|
-
// Legacy method - no abort signal support
|
|
1806
|
-
return this.waitForResourceReady(resource, options, undefined);
|
|
850
|
+
return this.rollbackManager.deleteDeployedResource(resource);
|
|
1807
851
|
}
|
|
1808
852
|
/**
|
|
1809
853
|
* Rollback a deployment by ID
|
|
@@ -1812,7 +856,7 @@ export class DirectDeploymentEngine {
|
|
|
1812
856
|
const startTime = Date.now();
|
|
1813
857
|
const deploymentRecord = this.deploymentState.get(deploymentId);
|
|
1814
858
|
if (!deploymentRecord) {
|
|
1815
|
-
throw new
|
|
859
|
+
throw new ResourceGraphFactoryError(`Deployment ${deploymentId} not found. Cannot rollback.`, deploymentId, 'cleanup');
|
|
1816
860
|
}
|
|
1817
861
|
try {
|
|
1818
862
|
const { rolledBackResources, errors } = await this.rollbackDeployedResources(deploymentRecord.resources, deploymentRecord.options);
|
|
@@ -1836,7 +880,7 @@ export class DirectDeploymentEngine {
|
|
|
1836
880
|
{
|
|
1837
881
|
resourceId: deploymentId,
|
|
1838
882
|
phase: 'rollback',
|
|
1839
|
-
error: error,
|
|
883
|
+
error: ensureError(error),
|
|
1840
884
|
timestamp: new Date(),
|
|
1841
885
|
},
|
|
1842
886
|
],
|
|
@@ -1872,253 +916,11 @@ export class DirectDeploymentEngine {
|
|
|
1872
916
|
}
|
|
1873
917
|
return result;
|
|
1874
918
|
}
|
|
1875
|
-
/**
|
|
1876
|
-
* Patch a resource with the correct Content-Type header for merge patch operations
|
|
1877
|
-
* This fixes HTTP 415 "Unsupported Media Type" errors that occur when using the generic patch method
|
|
1878
|
-
* In the new API, methods return objects directly (no .body wrapper)
|
|
1879
|
-
*/
|
|
1880
|
-
async patchResourceWithCorrectContentType(resource) {
|
|
1881
|
-
// DEBUG: Log the resource being sent to K8s API for Secrets
|
|
1882
|
-
if (resource.kind === 'Secret') {
|
|
1883
|
-
const secretResource = resource;
|
|
1884
|
-
this.logger.debug('Patching Secret resource', {
|
|
1885
|
-
name: resource.metadata?.name,
|
|
1886
|
-
hasData: 'data' in resource,
|
|
1887
|
-
hasSpec: 'spec' in resource,
|
|
1888
|
-
dataKeys: secretResource.data ? Object.keys(secretResource.data) : [],
|
|
1889
|
-
specValue: secretResource.spec,
|
|
1890
|
-
});
|
|
1891
|
-
}
|
|
1892
|
-
// The k8sApi.patch method requires the full content-type string for the patchStrategy parameter
|
|
1893
|
-
// Use 'application/merge-patch+json' for merge patch operations
|
|
1894
|
-
// See: https://kubernetes.io/docs/tasks/manage-kubernetes-objects/update-api-object-kubectl-patch/
|
|
1895
|
-
return await this.k8sApi.patch(resource, undefined, // pretty
|
|
1896
|
-
undefined, // dryRun
|
|
1897
|
-
undefined, // fieldManager
|
|
1898
|
-
undefined, // force
|
|
1899
|
-
'application/merge-patch+json' // patchStrategy - must be the full content-type string
|
|
1900
|
-
);
|
|
1901
|
-
}
|
|
1902
|
-
/**
|
|
1903
|
-
* Check if an error is a "not found" error
|
|
1904
|
-
*/
|
|
1905
|
-
isNotFoundError(error) {
|
|
1906
|
-
if (error && typeof error === 'object') {
|
|
1907
|
-
const k8sError = error;
|
|
1908
|
-
return k8sError.statusCode === 404 || k8sError.body?.code === 404;
|
|
1909
|
-
}
|
|
1910
|
-
return false;
|
|
1911
|
-
}
|
|
1912
|
-
/**
|
|
1913
|
-
* Wait for CRD establishment if the resource is a custom resource
|
|
1914
|
-
*/
|
|
1915
|
-
async waitForCRDIfCustomResource(resource, options, logger, abortSignal) {
|
|
1916
|
-
// Check if already aborted
|
|
1917
|
-
if (abortSignal?.aborted) {
|
|
1918
|
-
throw new DOMException('Operation aborted', 'AbortError');
|
|
1919
|
-
}
|
|
1920
|
-
// Skip if this is not a custom resource
|
|
1921
|
-
if (!this.isCustomResource(resource)) {
|
|
1922
|
-
return;
|
|
1923
|
-
}
|
|
1924
|
-
const crdName = await this.getCRDNameForResource(resource);
|
|
1925
|
-
if (!crdName) {
|
|
1926
|
-
logger.warn('Could not determine CRD name for custom resource', {
|
|
1927
|
-
kind: resource.kind,
|
|
1928
|
-
apiVersion: resource.apiVersion,
|
|
1929
|
-
});
|
|
1930
|
-
return;
|
|
1931
|
-
}
|
|
1932
|
-
logger.debug('Custom resource detected, waiting for CRD establishment', {
|
|
1933
|
-
resourceKind: resource.kind,
|
|
1934
|
-
crdName,
|
|
1935
|
-
});
|
|
1936
|
-
await this.waitForCRDEstablishment({ metadata: { name: crdName } }, options, logger, abortSignal);
|
|
1937
|
-
logger.debug('CRD established, proceeding with custom resource deployment', {
|
|
1938
|
-
resourceKind: resource.kind,
|
|
1939
|
-
crdName,
|
|
1940
|
-
});
|
|
1941
|
-
}
|
|
1942
|
-
/**
|
|
1943
|
-
* Check if a resource is a custom resource (not a built-in Kubernetes resource)
|
|
1944
|
-
*/
|
|
1945
|
-
isCustomResource(resource) {
|
|
1946
|
-
if (!resource.apiVersion || !resource.kind) {
|
|
1947
|
-
return false;
|
|
1948
|
-
}
|
|
1949
|
-
// Built-in Kubernetes API groups that are NOT custom resources
|
|
1950
|
-
const builtInApiGroups = [
|
|
1951
|
-
'v1', // Core API group
|
|
1952
|
-
'apps/v1',
|
|
1953
|
-
'extensions/v1beta1',
|
|
1954
|
-
'networking.k8s.io/v1',
|
|
1955
|
-
'policy/v1',
|
|
1956
|
-
'rbac.authorization.k8s.io/v1',
|
|
1957
|
-
'storage.k8s.io/v1',
|
|
1958
|
-
'apiextensions.k8s.io/v1', // CRDs themselves
|
|
1959
|
-
'admissionregistration.k8s.io/v1',
|
|
1960
|
-
'apiregistration.k8s.io/v1',
|
|
1961
|
-
'authentication.k8s.io/v1',
|
|
1962
|
-
'authorization.k8s.io/v1',
|
|
1963
|
-
'autoscaling/v1',
|
|
1964
|
-
'autoscaling/v2',
|
|
1965
|
-
'batch/v1',
|
|
1966
|
-
'certificates.k8s.io/v1',
|
|
1967
|
-
'coordination.k8s.io/v1',
|
|
1968
|
-
'discovery.k8s.io/v1',
|
|
1969
|
-
'events.k8s.io/v1',
|
|
1970
|
-
'flowcontrol.apiserver.k8s.io/v1beta3',
|
|
1971
|
-
'node.k8s.io/v1',
|
|
1972
|
-
'scheduling.k8s.io/v1',
|
|
1973
|
-
];
|
|
1974
|
-
return !builtInApiGroups.includes(resource.apiVersion);
|
|
1975
|
-
}
|
|
1976
|
-
/**
|
|
1977
|
-
* Get the CRD name for a custom resource
|
|
1978
|
-
*/
|
|
1979
|
-
async getCRDNameForResource(resource) {
|
|
1980
|
-
if (!resource.apiVersion || !resource.kind) {
|
|
1981
|
-
return null;
|
|
1982
|
-
}
|
|
1983
|
-
// Only return CRD name for custom resources
|
|
1984
|
-
if (!this.isCustomResource(resource)) {
|
|
1985
|
-
return null;
|
|
1986
|
-
}
|
|
1987
|
-
// Extract group from apiVersion (e.g., "example.com/v1" -> "example.com")
|
|
1988
|
-
const apiVersionParts = resource.apiVersion.split('/');
|
|
1989
|
-
const group = apiVersionParts.length > 1 ? apiVersionParts[0] : '';
|
|
1990
|
-
if (!group) {
|
|
1991
|
-
return null; // Core API resources don't have CRDs
|
|
1992
|
-
}
|
|
1993
|
-
try {
|
|
1994
|
-
// Try to find the CRD by querying the API
|
|
1995
|
-
const crds = await this.k8sApi.list('apiextensions.k8s.io/v1', 'CustomResourceDefinition');
|
|
1996
|
-
// Look for a CRD that matches our group and kind
|
|
1997
|
-
// In the new API, methods return objects directly (no .body wrapper)
|
|
1998
|
-
const crdList = crds;
|
|
1999
|
-
const matchingCrd = crdList?.items?.find((crd) => {
|
|
2000
|
-
const crdSpec = crd.spec;
|
|
2001
|
-
return crdSpec?.group === group && crdSpec?.names?.kind === resource.kind;
|
|
2002
|
-
});
|
|
2003
|
-
if (matchingCrd) {
|
|
2004
|
-
return matchingCrd.metadata?.name ?? null;
|
|
2005
|
-
}
|
|
2006
|
-
}
|
|
2007
|
-
catch (error) {
|
|
2008
|
-
// If we can't query CRDs, fall back to heuristic
|
|
2009
|
-
console.warn('Failed to query CRDs, using heuristic for CRD name generation:', error);
|
|
2010
|
-
}
|
|
2011
|
-
// Fallback: Convert Kind to plural lowercase (simple heuristic)
|
|
2012
|
-
const kind = resource.kind.toLowerCase();
|
|
2013
|
-
const plural = kind.endsWith('s') ? kind : `${kind}s`;
|
|
2014
|
-
return `${plural}.${group}`;
|
|
2015
|
-
}
|
|
2016
919
|
/**
|
|
2017
920
|
* Public method to wait for CRD readiness by name
|
|
2018
921
|
*/
|
|
2019
|
-
async waitForCRDReady(crdName, timeout =
|
|
2020
|
-
|
|
2021
|
-
const options = {
|
|
2022
|
-
mode: this.deploymentMode,
|
|
2023
|
-
timeout,
|
|
2024
|
-
};
|
|
2025
|
-
await this.waitForCRDEstablishment({ metadata: { name: crdName } }, options, logger, abortSignal);
|
|
2026
|
-
}
|
|
2027
|
-
/**
|
|
2028
|
-
* Wait for a CRD to be established in the cluster
|
|
2029
|
-
*/
|
|
2030
|
-
async waitForCRDEstablishment(crd, options, logger, abortSignal) {
|
|
2031
|
-
const crdName = crd.metadata?.name;
|
|
2032
|
-
const timeout = options.timeout || 300000; // 5 minutes default
|
|
2033
|
-
const startTime = Date.now();
|
|
2034
|
-
const pollInterval = 2000; // 2 seconds
|
|
2035
|
-
logger.debug('Waiting for CRD to exist and be established', { crdName, timeout });
|
|
2036
|
-
while (Date.now() - startTime < timeout) {
|
|
2037
|
-
// Check if aborted before each iteration
|
|
2038
|
-
if (abortSignal?.aborted) {
|
|
2039
|
-
throw new DOMException('Operation aborted', 'AbortError');
|
|
2040
|
-
}
|
|
2041
|
-
try {
|
|
2042
|
-
// Check if CRD is established by reading its status
|
|
2043
|
-
// Wrap with abort signal handling
|
|
2044
|
-
const crdStatus = await this.withAbortSignal(this.k8sApi.read({
|
|
2045
|
-
apiVersion: 'apiextensions.k8s.io/v1',
|
|
2046
|
-
kind: 'CustomResourceDefinition',
|
|
2047
|
-
metadata: { name: crdName }, // CRDs are cluster-scoped, no namespace needed
|
|
2048
|
-
}), abortSignal);
|
|
2049
|
-
// In the new API, methods return objects directly (no .body wrapper)
|
|
2050
|
-
const crdItem = crdStatus;
|
|
2051
|
-
const conditions = crdItem?.status?.conditions || [];
|
|
2052
|
-
const establishedCondition = conditions.find((c) => c.type === 'Established');
|
|
2053
|
-
if (establishedCondition?.status === 'True') {
|
|
2054
|
-
logger.debug('CRD exists and is established', { crdName });
|
|
2055
|
-
return;
|
|
2056
|
-
}
|
|
2057
|
-
logger.debug('CRD exists but not yet established, waiting...', {
|
|
2058
|
-
crdName,
|
|
2059
|
-
establishedStatus: establishedCondition?.status || 'unknown',
|
|
2060
|
-
});
|
|
2061
|
-
}
|
|
2062
|
-
catch (error) {
|
|
2063
|
-
// Re-throw abort/timeout errors immediately
|
|
2064
|
-
if (error instanceof DOMException && (error.name === 'AbortError' || error.name === 'TimeoutError')) {
|
|
2065
|
-
throw error;
|
|
2066
|
-
}
|
|
2067
|
-
// CRD might not exist yet (e.g., being installed by a closure)
|
|
2068
|
-
// This is expected in scenarios where closures install CRDs
|
|
2069
|
-
logger.debug('CRD not found yet, waiting for it to be created...', {
|
|
2070
|
-
crdName,
|
|
2071
|
-
error: error.message,
|
|
2072
|
-
});
|
|
2073
|
-
}
|
|
2074
|
-
// Wait before next poll - use abortable delay
|
|
2075
|
-
try {
|
|
2076
|
-
await this.abortableDelay(pollInterval, abortSignal);
|
|
2077
|
-
}
|
|
2078
|
-
catch (error) {
|
|
2079
|
-
if (error instanceof DOMException && (error.name === 'AbortError' || error.name === 'TimeoutError')) {
|
|
2080
|
-
throw error; // Re-throw abort/timeout errors
|
|
2081
|
-
}
|
|
2082
|
-
// Ignore other errors from delay
|
|
2083
|
-
}
|
|
2084
|
-
}
|
|
2085
|
-
// Timeout reached
|
|
2086
|
-
throw new Error(`Timeout waiting for CRD ${crdName} to be established after ${timeout}ms`);
|
|
2087
|
-
}
|
|
2088
|
-
/**
|
|
2089
|
-
* Check if an error is an HTTP 415 Unsupported Media Type error
|
|
2090
|
-
*/
|
|
2091
|
-
isUnsupportedMediaTypeError(error) {
|
|
2092
|
-
if (!error || typeof error !== 'object') {
|
|
2093
|
-
return false;
|
|
2094
|
-
}
|
|
2095
|
-
const apiError = error;
|
|
2096
|
-
return (apiError.statusCode === 415 ||
|
|
2097
|
-
apiError.response?.statusCode === 415 ||
|
|
2098
|
-
apiError.body?.code === 415);
|
|
2099
|
-
}
|
|
2100
|
-
/**
|
|
2101
|
-
* Extract accepted media types from HTTP 415 error message
|
|
2102
|
-
*/
|
|
2103
|
-
extractAcceptedMediaTypes(error) {
|
|
2104
|
-
const defaultTypes = [
|
|
2105
|
-
'application/json-patch+json',
|
|
2106
|
-
'application/merge-patch+json',
|
|
2107
|
-
'application/apply-patch+yaml',
|
|
2108
|
-
];
|
|
2109
|
-
try {
|
|
2110
|
-
// Try to extract from error message
|
|
2111
|
-
const apiError = error;
|
|
2112
|
-
const message = apiError.message || apiError.body?.message || '';
|
|
2113
|
-
const match = message.match(/accepted media types include: ([^"]+)/);
|
|
2114
|
-
if (match && match[1]) {
|
|
2115
|
-
return match[1].split(', ').map((type) => type.trim());
|
|
2116
|
-
}
|
|
2117
|
-
}
|
|
2118
|
-
catch (_e) {
|
|
2119
|
-
// Fallback to default types
|
|
2120
|
-
}
|
|
2121
|
-
return defaultTypes;
|
|
922
|
+
async waitForCRDReady(crdName, timeout = DEFAULT_CRD_READY_TIMEOUT, abortSignal) {
|
|
923
|
+
await this.crdManager.waitForCRDReady(crdName, this.deploymentMode, timeout, abortSignal);
|
|
2122
924
|
}
|
|
2123
925
|
}
|
|
2124
926
|
//# sourceMappingURL=engine.js.map
|