typekro 0.1.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/LICENSE +185 -0
- package/README.md +1137 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/alchemy/deployers.d.ts +39 -0
- package/dist/alchemy/deployers.d.ts.map +1 -0
- package/dist/alchemy/deployers.js +194 -0
- package/dist/alchemy/deployers.js.map +1 -0
- package/dist/alchemy/deployment.d.ts +12 -0
- package/dist/alchemy/deployment.d.ts.map +1 -0
- package/dist/alchemy/deployment.js +12 -0
- package/dist/alchemy/deployment.js.map +1 -0
- package/dist/alchemy/index.d.ts +17 -0
- package/dist/alchemy/index.d.ts.map +1 -0
- package/dist/alchemy/index.js +20 -0
- package/dist/alchemy/index.js.map +1 -0
- package/dist/alchemy/resolver.d.ts +127 -0
- package/dist/alchemy/resolver.d.ts.map +1 -0
- package/dist/alchemy/resolver.js +341 -0
- package/dist/alchemy/resolver.js.map +1 -0
- package/dist/alchemy/resource-registration.d.ts +22 -0
- package/dist/alchemy/resource-registration.d.ts.map +1 -0
- package/dist/alchemy/resource-registration.js +218 -0
- package/dist/alchemy/resource-registration.js.map +1 -0
- package/dist/alchemy/type-inference.d.ts +13 -0
- package/dist/alchemy/type-inference.d.ts.map +1 -0
- package/dist/alchemy/type-inference.js +67 -0
- package/dist/alchemy/type-inference.js.map +1 -0
- package/dist/alchemy/types.d.ts +92 -0
- package/dist/alchemy/types.d.ts.map +1 -0
- package/dist/alchemy/types.js +8 -0
- package/dist/alchemy/types.js.map +1 -0
- package/dist/alchemy/utilities.d.ts +12 -0
- package/dist/alchemy/utilities.d.ts.map +1 -0
- package/dist/alchemy/utilities.js +16 -0
- package/dist/alchemy/utilities.js.map +1 -0
- package/dist/alchemy/wrapper.d.ts +16 -0
- package/dist/alchemy/wrapper.d.ts.map +1 -0
- package/dist/alchemy/wrapper.js +23 -0
- package/dist/alchemy/wrapper.js.map +1 -0
- package/dist/core/composition/composition.d.ts +94 -0
- package/dist/core/composition/composition.d.ts.map +1 -0
- package/dist/core/composition/composition.js +230 -0
- package/dist/core/composition/composition.js.map +1 -0
- package/dist/core/composition/index.d.ts +12 -0
- package/dist/core/composition/index.d.ts.map +1 -0
- package/dist/core/composition/index.js +12 -0
- package/dist/core/composition/index.js.map +1 -0
- package/dist/core/composition/typekro-runtime/index.d.ts +3 -0
- package/dist/core/composition/typekro-runtime/index.d.ts.map +1 -0
- package/dist/core/composition/typekro-runtime/index.js +2 -0
- package/dist/core/composition/typekro-runtime/index.js.map +1 -0
- package/dist/core/composition/typekro-runtime/typekro-runtime.d.ts +39 -0
- package/dist/core/composition/typekro-runtime/typekro-runtime.d.ts.map +1 -0
- package/dist/core/composition/typekro-runtime/typekro-runtime.js +100 -0
- package/dist/core/composition/typekro-runtime/typekro-runtime.js.map +1 -0
- package/dist/core/composition/typekro-runtime/types.d.ts +16 -0
- package/dist/core/composition/typekro-runtime/types.d.ts.map +1 -0
- package/dist/core/composition/typekro-runtime/types.js +12 -0
- package/dist/core/composition/typekro-runtime/types.js.map +1 -0
- package/dist/core/composition/types.d.ts +264 -0
- package/dist/core/composition/types.d.ts.map +1 -0
- package/dist/core/composition/types.js +2 -0
- package/dist/core/composition/types.js.map +1 -0
- package/dist/core/constants/brands.d.ts +42 -0
- package/dist/core/constants/brands.d.ts.map +1 -0
- package/dist/core/constants/brands.js +51 -0
- package/dist/core/constants/brands.js.map +1 -0
- package/dist/core/dependencies/graph.d.ts +67 -0
- package/dist/core/dependencies/graph.d.ts.map +1 -0
- package/dist/core/dependencies/graph.js +220 -0
- package/dist/core/dependencies/graph.js.map +1 -0
- package/dist/core/dependencies/index.d.ts +7 -0
- package/dist/core/dependencies/index.d.ts.map +1 -0
- package/dist/core/dependencies/index.js +8 -0
- package/dist/core/dependencies/index.js.map +1 -0
- package/dist/core/dependencies/resolver.d.ts +53 -0
- package/dist/core/dependencies/resolver.d.ts.map +1 -0
- package/dist/core/dependencies/resolver.js +167 -0
- package/dist/core/dependencies/resolver.js.map +1 -0
- package/dist/core/dependencies/type-guards.d.ts +17 -0
- package/dist/core/dependencies/type-guards.d.ts.map +1 -0
- package/dist/core/dependencies/type-guards.js +35 -0
- package/dist/core/dependencies/type-guards.js.map +1 -0
- package/dist/core/deployment/deployment-strategies.d.ts +12 -0
- package/dist/core/deployment/deployment-strategies.d.ts.map +1 -0
- package/dist/core/deployment/deployment-strategies.js +11 -0
- package/dist/core/deployment/deployment-strategies.js.map +1 -0
- package/dist/core/deployment/direct-factory.d.ts +111 -0
- package/dist/core/deployment/direct-factory.d.ts.map +1 -0
- package/dist/core/deployment/direct-factory.js +627 -0
- package/dist/core/deployment/direct-factory.js.map +1 -0
- package/dist/core/deployment/engine.d.ts +128 -0
- package/dist/core/deployment/engine.d.ts.map +1 -0
- package/dist/core/deployment/engine.js +1408 -0
- package/dist/core/deployment/engine.js.map +1 -0
- package/dist/core/deployment/index.d.ts +14 -0
- package/dist/core/deployment/index.d.ts.map +1 -0
- package/dist/core/deployment/index.js +14 -0
- package/dist/core/deployment/index.js.map +1 -0
- package/dist/core/deployment/kro-factory.d.ts +143 -0
- package/dist/core/deployment/kro-factory.d.ts.map +1 -0
- package/dist/core/deployment/kro-factory.js +837 -0
- package/dist/core/deployment/kro-factory.js.map +1 -0
- package/dist/core/deployment/readiness.d.ts +54 -0
- package/dist/core/deployment/readiness.d.ts.map +1 -0
- package/dist/core/deployment/readiness.js +175 -0
- package/dist/core/deployment/readiness.js.map +1 -0
- package/dist/core/deployment/rollback-manager.d.ts +63 -0
- package/dist/core/deployment/rollback-manager.d.ts.map +1 -0
- package/dist/core/deployment/rollback-manager.js +225 -0
- package/dist/core/deployment/rollback-manager.js.map +1 -0
- package/dist/core/deployment/shared-utilities.d.ts +41 -0
- package/dist/core/deployment/shared-utilities.d.ts.map +1 -0
- package/dist/core/deployment/shared-utilities.js +100 -0
- package/dist/core/deployment/shared-utilities.js.map +1 -0
- package/dist/core/deployment/status-hydrator.d.ts +86 -0
- package/dist/core/deployment/status-hydrator.d.ts.map +1 -0
- package/dist/core/deployment/status-hydrator.js +262 -0
- package/dist/core/deployment/status-hydrator.js.map +1 -0
- package/dist/core/deployment/strategies/alchemy-strategy.d.ts +107 -0
- package/dist/core/deployment/strategies/alchemy-strategy.d.ts.map +1 -0
- package/dist/core/deployment/strategies/alchemy-strategy.js +446 -0
- package/dist/core/deployment/strategies/alchemy-strategy.js.map +1 -0
- package/dist/core/deployment/strategies/base-strategy.d.ts +50 -0
- package/dist/core/deployment/strategies/base-strategy.d.ts.map +1 -0
- package/dist/core/deployment/strategies/base-strategy.js +82 -0
- package/dist/core/deployment/strategies/base-strategy.js.map +1 -0
- package/dist/core/deployment/strategies/direct-strategy.d.ts +29 -0
- package/dist/core/deployment/strategies/direct-strategy.d.ts.map +1 -0
- package/dist/core/deployment/strategies/direct-strategy.js +80 -0
- package/dist/core/deployment/strategies/direct-strategy.js.map +1 -0
- package/dist/core/deployment/strategies/index.d.ts +12 -0
- package/dist/core/deployment/strategies/index.d.ts.map +1 -0
- package/dist/core/deployment/strategies/index.js +12 -0
- package/dist/core/deployment/strategies/index.js.map +1 -0
- package/dist/core/deployment/strategies/kro-strategy.d.ts +41 -0
- package/dist/core/deployment/strategies/kro-strategy.d.ts.map +1 -0
- package/dist/core/deployment/strategies/kro-strategy.js +270 -0
- package/dist/core/deployment/strategies/kro-strategy.js.map +1 -0
- package/dist/core/direct-deployment.d.ts +8 -0
- package/dist/core/direct-deployment.d.ts.map +1 -0
- package/dist/core/direct-deployment.js +9 -0
- package/dist/core/direct-deployment.js.map +1 -0
- package/dist/core/errors.d.ts +73 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +250 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/evaluation/cel-optimizer.d.ts +48 -0
- package/dist/core/evaluation/cel-optimizer.d.ts.map +1 -0
- package/dist/core/evaluation/cel-optimizer.js +176 -0
- package/dist/core/evaluation/cel-optimizer.js.map +1 -0
- package/dist/core/factory.d.ts +12 -0
- package/dist/core/factory.d.ts.map +1 -0
- package/dist/core/factory.js +13 -0
- package/dist/core/factory.js.map +1 -0
- package/dist/core/kubernetes/api.d.ts +43 -0
- package/dist/core/kubernetes/api.d.ts.map +1 -0
- package/dist/core/kubernetes/api.js +209 -0
- package/dist/core/kubernetes/api.js.map +1 -0
- package/dist/core/kubernetes/client-provider.d.ts +204 -0
- package/dist/core/kubernetes/client-provider.d.ts.map +1 -0
- package/dist/core/kubernetes/client-provider.js +421 -0
- package/dist/core/kubernetes/client-provider.js.map +1 -0
- package/dist/core/logging/config.d.ts +14 -0
- package/dist/core/logging/config.d.ts.map +1 -0
- package/dist/core/logging/config.js +57 -0
- package/dist/core/logging/config.js.map +1 -0
- package/dist/core/logging/index.d.ts +4 -0
- package/dist/core/logging/index.d.ts.map +1 -0
- package/dist/core/logging/index.js +4 -0
- package/dist/core/logging/index.js.map +1 -0
- package/dist/core/logging/logger.d.ts +26 -0
- package/dist/core/logging/logger.d.ts.map +1 -0
- package/dist/core/logging/logger.js +114 -0
- package/dist/core/logging/logger.js.map +1 -0
- package/dist/core/logging/types.d.ts +93 -0
- package/dist/core/logging/types.d.ts.map +1 -0
- package/dist/core/logging/types.js +2 -0
- package/dist/core/logging/types.js.map +1 -0
- package/dist/core/readiness/cluster-state.d.ts +229 -0
- package/dist/core/readiness/cluster-state.d.ts.map +1 -0
- package/dist/core/readiness/cluster-state.js +360 -0
- package/dist/core/readiness/cluster-state.js.map +1 -0
- package/dist/core/readiness/index.d.ts +5 -0
- package/dist/core/readiness/index.d.ts.map +1 -0
- package/dist/core/readiness/index.js +5 -0
- package/dist/core/readiness/index.js.map +1 -0
- package/dist/core/readiness/registry.d.ts +45 -0
- package/dist/core/readiness/registry.d.ts.map +1 -0
- package/dist/core/readiness/registry.js +62 -0
- package/dist/core/readiness/registry.js.map +1 -0
- package/dist/core/references/cel-evaluator.d.ts +102 -0
- package/dist/core/references/cel-evaluator.d.ts.map +1 -0
- package/dist/core/references/cel-evaluator.js +288 -0
- package/dist/core/references/cel-evaluator.js.map +1 -0
- package/dist/core/references/cel.d.ts +75 -0
- package/dist/core/references/cel.d.ts.map +1 -0
- package/dist/core/references/cel.js +213 -0
- package/dist/core/references/cel.js.map +1 -0
- package/dist/core/references/external-refs.d.ts +37 -0
- package/dist/core/references/external-refs.d.ts.map +1 -0
- package/dist/core/references/external-refs.js +53 -0
- package/dist/core/references/external-refs.js.map +1 -0
- package/dist/core/references/index.d.ts +15 -0
- package/dist/core/references/index.d.ts.map +1 -0
- package/dist/core/references/index.js +19 -0
- package/dist/core/references/index.js.map +1 -0
- package/dist/core/references/resolver.d.ts +117 -0
- package/dist/core/references/resolver.d.ts.map +1 -0
- package/dist/core/references/resolver.js +554 -0
- package/dist/core/references/resolver.js.map +1 -0
- package/dist/core/references/schema-proxy.d.ts +38 -0
- package/dist/core/references/schema-proxy.d.ts.map +1 -0
- package/dist/core/references/schema-proxy.js +163 -0
- package/dist/core/references/schema-proxy.js.map +1 -0
- package/dist/core/serialization/core.d.ts +15 -0
- package/dist/core/serialization/core.d.ts.map +1 -0
- package/dist/core/serialization/core.js +169 -0
- package/dist/core/serialization/core.js.map +1 -0
- package/dist/core/serialization/index.d.ts +9 -0
- package/dist/core/serialization/index.d.ts.map +1 -0
- package/dist/core/serialization/index.js +12 -0
- package/dist/core/serialization/index.js.map +1 -0
- package/dist/core/serialization/schema.d.ts +14 -0
- package/dist/core/serialization/schema.d.ts.map +1 -0
- package/dist/core/serialization/schema.js +33 -0
- package/dist/core/serialization/schema.js.map +1 -0
- package/dist/core/serialization/validation.d.ts +18 -0
- package/dist/core/serialization/validation.d.ts.map +1 -0
- package/dist/core/serialization/validation.js +165 -0
- package/dist/core/serialization/validation.js.map +1 -0
- package/dist/core/serialization/yaml.d.ts +10 -0
- package/dist/core/serialization/yaml.d.ts.map +1 -0
- package/dist/core/serialization/yaml.js +63 -0
- package/dist/core/serialization/yaml.js.map +1 -0
- package/dist/core/types/common.d.ts +41 -0
- package/dist/core/types/common.d.ts.map +1 -0
- package/dist/core/types/common.js +9 -0
- package/dist/core/types/common.js.map +1 -0
- package/dist/core/types/dependencies.d.ts +14 -0
- package/dist/core/types/dependencies.d.ts.map +1 -0
- package/dist/core/types/dependencies.js +5 -0
- package/dist/core/types/dependencies.js.map +1 -0
- package/dist/core/types/deployment.d.ts +265 -0
- package/dist/core/types/deployment.d.ts.map +1 -0
- package/dist/core/types/deployment.js +20 -0
- package/dist/core/types/deployment.js.map +1 -0
- package/dist/core/types/index.d.ts +19 -0
- package/dist/core/types/index.d.ts.map +1 -0
- package/dist/core/types/index.js +15 -0
- package/dist/core/types/index.js.map +1 -0
- package/dist/core/types/kubernetes.d.ts +352 -0
- package/dist/core/types/kubernetes.d.ts.map +1 -0
- package/dist/core/types/kubernetes.js +5 -0
- package/dist/core/types/kubernetes.js.map +1 -0
- package/dist/core/types/references.d.ts +54 -0
- package/dist/core/types/references.d.ts.map +1 -0
- package/dist/core/types/references.js +14 -0
- package/dist/core/types/references.js.map +1 -0
- package/dist/core/types/resource-graph.d.ts +93 -0
- package/dist/core/types/resource-graph.d.ts.map +1 -0
- package/dist/core/types/resource-graph.js +8 -0
- package/dist/core/types/resource-graph.js.map +1 -0
- package/dist/core/types/serialization.d.ts +210 -0
- package/dist/core/types/serialization.d.ts.map +1 -0
- package/dist/core/types/serialization.js +5 -0
- package/dist/core/types/serialization.js.map +1 -0
- package/dist/core/types/yaml.d.ts +92 -0
- package/dist/core/types/yaml.d.ts.map +1 -0
- package/dist/core/types/yaml.js +2 -0
- package/dist/core/types/yaml.js.map +1 -0
- package/dist/core/types.d.ts +8 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +9 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/validation/cel-validator.d.ts +47 -0
- package/dist/core/validation/cel-validator.d.ts.map +1 -0
- package/dist/core/validation/cel-validator.js +200 -0
- package/dist/core/validation/cel-validator.js.map +1 -0
- package/dist/core/yaml/index.d.ts +5 -0
- package/dist/core/yaml/index.d.ts.map +1 -0
- package/dist/core/yaml/index.js +5 -0
- package/dist/core/yaml/index.js.map +1 -0
- package/dist/core/yaml/path-resolver.d.ts +122 -0
- package/dist/core/yaml/path-resolver.d.ts.map +1 -0
- package/dist/core/yaml/path-resolver.js +556 -0
- package/dist/core/yaml/path-resolver.js.map +1 -0
- package/dist/core.d.ts +30 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +59 -0
- package/dist/core.js.map +1 -0
- package/dist/factories/flux/git-repository.d.ts +62 -0
- package/dist/factories/flux/git-repository.d.ts.map +1 -0
- package/dist/factories/flux/git-repository.js +34 -0
- package/dist/factories/flux/git-repository.js.map +1 -0
- package/dist/factories/flux/index.d.ts +10 -0
- package/dist/factories/flux/index.d.ts.map +1 -0
- package/dist/factories/flux/index.js +11 -0
- package/dist/factories/flux/index.js.map +1 -0
- package/dist/factories/flux/kustomize/index.d.ts +4 -0
- package/dist/factories/flux/kustomize/index.d.ts.map +1 -0
- package/dist/factories/flux/kustomize/index.js +3 -0
- package/dist/factories/flux/kustomize/index.js.map +1 -0
- package/dist/factories/flux/kustomize/kustomization.d.ts +178 -0
- package/dist/factories/flux/kustomize/kustomization.d.ts.map +1 -0
- package/dist/factories/flux/kustomize/kustomization.js +108 -0
- package/dist/factories/flux/kustomize/kustomization.js.map +1 -0
- package/dist/factories/flux/kustomize/readiness-evaluators.d.ts +9 -0
- package/dist/factories/flux/kustomize/readiness-evaluators.d.ts.map +1 -0
- package/dist/factories/flux/kustomize/readiness-evaluators.js +71 -0
- package/dist/factories/flux/kustomize/readiness-evaluators.js.map +1 -0
- package/dist/factories/flux/kustomize/types.d.ts +2 -0
- package/dist/factories/flux/kustomize/types.d.ts.map +1 -0
- package/dist/factories/flux/kustomize/types.js +2 -0
- package/dist/factories/flux/kustomize/types.js.map +1 -0
- package/dist/factories/helm/helm-release.d.ts +139 -0
- package/dist/factories/helm/helm-release.d.ts.map +1 -0
- package/dist/factories/helm/helm-release.js +180 -0
- package/dist/factories/helm/helm-release.js.map +1 -0
- package/dist/factories/helm/helm-repository.d.ts +24 -0
- package/dist/factories/helm/helm-repository.d.ts.map +1 -0
- package/dist/factories/helm/helm-repository.js +57 -0
- package/dist/factories/helm/helm-repository.js.map +1 -0
- package/dist/factories/helm/index.d.ts +8 -0
- package/dist/factories/helm/index.d.ts.map +1 -0
- package/dist/factories/helm/index.js +8 -0
- package/dist/factories/helm/index.js.map +1 -0
- package/dist/factories/helm/readiness-evaluators.d.ts +55 -0
- package/dist/factories/helm/readiness-evaluators.d.ts.map +1 -0
- package/dist/factories/helm/readiness-evaluators.js +295 -0
- package/dist/factories/helm/readiness-evaluators.js.map +1 -0
- package/dist/factories/helm/types.d.ts +21 -0
- package/dist/factories/helm/types.d.ts.map +1 -0
- package/dist/factories/helm/types.js +2 -0
- package/dist/factories/helm/types.js.map +1 -0
- package/dist/factories/index.d.ts +12 -0
- package/dist/factories/index.d.ts.map +1 -0
- package/dist/factories/index.js +31 -0
- package/dist/factories/index.js.map +1 -0
- package/dist/factories/kro/index.d.ts +11 -0
- package/dist/factories/kro/index.d.ts.map +1 -0
- package/dist/factories/kro/index.js +10 -0
- package/dist/factories/kro/index.js.map +1 -0
- package/dist/factories/kro/kro-crd.d.ts +14 -0
- package/dist/factories/kro/kro-crd.d.ts.map +1 -0
- package/dist/factories/kro/kro-crd.js +51 -0
- package/dist/factories/kro/kro-crd.js.map +1 -0
- package/dist/factories/kro/kro-custom-resource.d.ts +23 -0
- package/dist/factories/kro/kro-custom-resource.d.ts.map +1 -0
- package/dist/factories/kro/kro-custom-resource.js +153 -0
- package/dist/factories/kro/kro-custom-resource.js.map +1 -0
- package/dist/factories/kro/resource-graph-definition.d.ts +12 -0
- package/dist/factories/kro/resource-graph-definition.d.ts.map +1 -0
- package/dist/factories/kro/resource-graph-definition.js +94 -0
- package/dist/factories/kro/resource-graph-definition.js.map +1 -0
- package/dist/factories/kubernetes/admission/index.d.ts +9 -0
- package/dist/factories/kubernetes/admission/index.d.ts.map +1 -0
- package/dist/factories/kubernetes/admission/index.js +9 -0
- package/dist/factories/kubernetes/admission/index.js.map +1 -0
- package/dist/factories/kubernetes/admission/mutating-webhook-configuration.d.ts +5 -0
- package/dist/factories/kubernetes/admission/mutating-webhook-configuration.d.ts.map +1 -0
- package/dist/factories/kubernetes/admission/mutating-webhook-configuration.js +10 -0
- package/dist/factories/kubernetes/admission/mutating-webhook-configuration.js.map +1 -0
- package/dist/factories/kubernetes/admission/validating-webhook-configuration.d.ts +5 -0
- package/dist/factories/kubernetes/admission/validating-webhook-configuration.d.ts.map +1 -0
- package/dist/factories/kubernetes/admission/validating-webhook-configuration.js +10 -0
- package/dist/factories/kubernetes/admission/validating-webhook-configuration.js.map +1 -0
- package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler-v1.d.ts +6 -0
- package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler-v1.d.ts.map +1 -0
- package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler-v1.js +35 -0
- package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler-v1.js.map +1 -0
- package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler.d.ts +6 -0
- package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler.d.ts.map +1 -0
- package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler.js +31 -0
- package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler.js.map +1 -0
- package/dist/factories/kubernetes/autoscaling/index.d.ts +9 -0
- package/dist/factories/kubernetes/autoscaling/index.d.ts.map +1 -0
- package/dist/factories/kubernetes/autoscaling/index.js +9 -0
- package/dist/factories/kubernetes/autoscaling/index.js.map +1 -0
- package/dist/factories/kubernetes/certificates/certificate-signing-request.d.ts +6 -0
- package/dist/factories/kubernetes/certificates/certificate-signing-request.d.ts.map +1 -0
- package/dist/factories/kubernetes/certificates/certificate-signing-request.js +48 -0
- package/dist/factories/kubernetes/certificates/certificate-signing-request.js.map +1 -0
- package/dist/factories/kubernetes/certificates/index.d.ts +8 -0
- package/dist/factories/kubernetes/certificates/index.d.ts.map +1 -0
- package/dist/factories/kubernetes/certificates/index.js +8 -0
- package/dist/factories/kubernetes/certificates/index.js.map +1 -0
- package/dist/factories/kubernetes/config/config-map.d.ts +5 -0
- package/dist/factories/kubernetes/config/config-map.d.ts.map +1 -0
- package/dist/factories/kubernetes/config/config-map.js +16 -0
- package/dist/factories/kubernetes/config/config-map.js.map +1 -0
- package/dist/factories/kubernetes/config/index.d.ts +9 -0
- package/dist/factories/kubernetes/config/index.d.ts.map +1 -0
- package/dist/factories/kubernetes/config/index.js +9 -0
- package/dist/factories/kubernetes/config/index.js.map +1 -0
- package/dist/factories/kubernetes/config/secret.d.ts +5 -0
- package/dist/factories/kubernetes/config/secret.d.ts.map +1 -0
- package/dist/factories/kubernetes/config/secret.js +16 -0
- package/dist/factories/kubernetes/config/secret.js.map +1 -0
- package/dist/factories/kubernetes/coordination/index.d.ts +8 -0
- package/dist/factories/kubernetes/coordination/index.d.ts.map +1 -0
- package/dist/factories/kubernetes/coordination/index.js +8 -0
- package/dist/factories/kubernetes/coordination/index.js.map +1 -0
- package/dist/factories/kubernetes/coordination/lease.d.ts +5 -0
- package/dist/factories/kubernetes/coordination/lease.d.ts.map +1 -0
- package/dist/factories/kubernetes/coordination/lease.js +10 -0
- package/dist/factories/kubernetes/coordination/lease.js.map +1 -0
- package/dist/factories/kubernetes/core/component-status.d.ts +4 -0
- package/dist/factories/kubernetes/core/component-status.d.ts.map +1 -0
- package/dist/factories/kubernetes/core/component-status.js +25 -0
- package/dist/factories/kubernetes/core/component-status.js.map +1 -0
- package/dist/factories/kubernetes/core/index.d.ts +11 -0
- package/dist/factories/kubernetes/core/index.d.ts.map +1 -0
- package/dist/factories/kubernetes/core/index.js +11 -0
- package/dist/factories/kubernetes/core/index.js.map +1 -0
- package/dist/factories/kubernetes/core/namespace.d.ts +9 -0
- package/dist/factories/kubernetes/core/namespace.d.ts.map +1 -0
- package/dist/factories/kubernetes/core/namespace.js +48 -0
- package/dist/factories/kubernetes/core/namespace.js.map +1 -0
- package/dist/factories/kubernetes/core/node.d.ts +6 -0
- package/dist/factories/kubernetes/core/node.d.ts.map +1 -0
- package/dist/factories/kubernetes/core/node.js +34 -0
- package/dist/factories/kubernetes/core/node.js.map +1 -0
- package/dist/factories/kubernetes/core/pod.d.ts +6 -0
- package/dist/factories/kubernetes/core/pod.d.ts.map +1 -0
- package/dist/factories/kubernetes/core/pod.js +44 -0
- package/dist/factories/kubernetes/core/pod.js.map +1 -0
- package/dist/factories/kubernetes/extensions/custom-resource-definition.d.ts +6 -0
- package/dist/factories/kubernetes/extensions/custom-resource-definition.d.ts.map +1 -0
- package/dist/factories/kubernetes/extensions/custom-resource-definition.js +45 -0
- package/dist/factories/kubernetes/extensions/custom-resource-definition.js.map +1 -0
- package/dist/factories/kubernetes/extensions/custom-resource.d.ts +12 -0
- package/dist/factories/kubernetes/extensions/custom-resource.d.ts.map +1 -0
- package/dist/factories/kubernetes/extensions/custom-resource.js +17 -0
- package/dist/factories/kubernetes/extensions/custom-resource.js.map +1 -0
- package/dist/factories/kubernetes/extensions/index.d.ts +9 -0
- package/dist/factories/kubernetes/extensions/index.d.ts.map +1 -0
- package/dist/factories/kubernetes/extensions/index.js +9 -0
- package/dist/factories/kubernetes/extensions/index.js.map +1 -0
- package/dist/factories/kubernetes/index.d.ts +24 -0
- package/dist/factories/kubernetes/index.d.ts.map +1 -0
- package/dist/factories/kubernetes/index.js +75 -0
- package/dist/factories/kubernetes/index.js.map +1 -0
- package/dist/factories/kubernetes/networking/endpoint-slice.d.ts +4 -0
- package/dist/factories/kubernetes/networking/endpoint-slice.d.ts.map +1 -0
- package/dist/factories/kubernetes/networking/endpoint-slice.js +10 -0
- package/dist/factories/kubernetes/networking/endpoint-slice.js.map +1 -0
- package/dist/factories/kubernetes/networking/endpoints.d.ts +4 -0
- package/dist/factories/kubernetes/networking/endpoints.d.ts.map +1 -0
- package/dist/factories/kubernetes/networking/endpoints.js +39 -0
- package/dist/factories/kubernetes/networking/endpoints.js.map +1 -0
- package/dist/factories/kubernetes/networking/index.d.ts +13 -0
- package/dist/factories/kubernetes/networking/index.d.ts.map +1 -0
- package/dist/factories/kubernetes/networking/index.js +13 -0
- package/dist/factories/kubernetes/networking/index.js.map +1 -0
- package/dist/factories/kubernetes/networking/ingress-class.d.ts +5 -0
- package/dist/factories/kubernetes/networking/ingress-class.d.ts.map +1 -0
- package/dist/factories/kubernetes/networking/ingress-class.js +16 -0
- package/dist/factories/kubernetes/networking/ingress-class.js.map +1 -0
- package/dist/factories/kubernetes/networking/ingress.d.ts +5 -0
- package/dist/factories/kubernetes/networking/ingress.d.ts.map +1 -0
- package/dist/factories/kubernetes/networking/ingress.js +33 -0
- package/dist/factories/kubernetes/networking/ingress.js.map +1 -0
- package/dist/factories/kubernetes/networking/network-policy.d.ts +5 -0
- package/dist/factories/kubernetes/networking/network-policy.d.ts.map +1 -0
- package/dist/factories/kubernetes/networking/network-policy.js +17 -0
- package/dist/factories/kubernetes/networking/network-policy.js.map +1 -0
- package/dist/factories/kubernetes/networking/service.d.ts +5 -0
- package/dist/factories/kubernetes/networking/service.d.ts.map +1 -0
- package/dist/factories/kubernetes/networking/service.js +64 -0
- package/dist/factories/kubernetes/networking/service.js.map +1 -0
- package/dist/factories/kubernetes/policy/index.d.ts +10 -0
- package/dist/factories/kubernetes/policy/index.d.ts.map +1 -0
- package/dist/factories/kubernetes/policy/index.js +10 -0
- package/dist/factories/kubernetes/policy/index.js.map +1 -0
- package/dist/factories/kubernetes/policy/limit-range.d.ts +5 -0
- package/dist/factories/kubernetes/policy/limit-range.d.ts.map +1 -0
- package/dist/factories/kubernetes/policy/limit-range.js +17 -0
- package/dist/factories/kubernetes/policy/limit-range.js.map +1 -0
- package/dist/factories/kubernetes/policy/pod-disruption-budget.d.ts +6 -0
- package/dist/factories/kubernetes/policy/pod-disruption-budget.d.ts.map +1 -0
- package/dist/factories/kubernetes/policy/pod-disruption-budget.js +55 -0
- package/dist/factories/kubernetes/policy/pod-disruption-budget.js.map +1 -0
- package/dist/factories/kubernetes/policy/resource-quota.d.ts +6 -0
- package/dist/factories/kubernetes/policy/resource-quota.d.ts.map +1 -0
- package/dist/factories/kubernetes/policy/resource-quota.js +43 -0
- package/dist/factories/kubernetes/policy/resource-quota.js.map +1 -0
- package/dist/factories/kubernetes/rbac/cluster-role-binding.d.ts +4 -0
- package/dist/factories/kubernetes/rbac/cluster-role-binding.d.ts.map +1 -0
- package/dist/factories/kubernetes/rbac/cluster-role-binding.js +17 -0
- package/dist/factories/kubernetes/rbac/cluster-role-binding.js.map +1 -0
- package/dist/factories/kubernetes/rbac/cluster-role.d.ts +4 -0
- package/dist/factories/kubernetes/rbac/cluster-role.d.ts.map +1 -0
- package/dist/factories/kubernetes/rbac/cluster-role.js +17 -0
- package/dist/factories/kubernetes/rbac/cluster-role.js.map +1 -0
- package/dist/factories/kubernetes/rbac/index.d.ts +12 -0
- package/dist/factories/kubernetes/rbac/index.d.ts.map +1 -0
- package/dist/factories/kubernetes/rbac/index.js +12 -0
- package/dist/factories/kubernetes/rbac/index.js.map +1 -0
- package/dist/factories/kubernetes/rbac/role-binding.d.ts +4 -0
- package/dist/factories/kubernetes/rbac/role-binding.d.ts.map +1 -0
- package/dist/factories/kubernetes/rbac/role-binding.js +17 -0
- package/dist/factories/kubernetes/rbac/role-binding.js.map +1 -0
- package/dist/factories/kubernetes/rbac/role.d.ts +4 -0
- package/dist/factories/kubernetes/rbac/role.d.ts.map +1 -0
- package/dist/factories/kubernetes/rbac/role.js +17 -0
- package/dist/factories/kubernetes/rbac/role.js.map +1 -0
- package/dist/factories/kubernetes/rbac/service-account.d.ts +4 -0
- package/dist/factories/kubernetes/rbac/service-account.d.ts.map +1 -0
- package/dist/factories/kubernetes/rbac/service-account.js +17 -0
- package/dist/factories/kubernetes/rbac/service-account.js.map +1 -0
- package/dist/factories/kubernetes/scheduling/index.d.ts +9 -0
- package/dist/factories/kubernetes/scheduling/index.d.ts.map +1 -0
- package/dist/factories/kubernetes/scheduling/index.js +9 -0
- package/dist/factories/kubernetes/scheduling/index.js.map +1 -0
- package/dist/factories/kubernetes/scheduling/priority-class.d.ts +4 -0
- package/dist/factories/kubernetes/scheduling/priority-class.d.ts.map +1 -0
- package/dist/factories/kubernetes/scheduling/priority-class.js +16 -0
- package/dist/factories/kubernetes/scheduling/priority-class.js.map +1 -0
- package/dist/factories/kubernetes/scheduling/runtime-class.d.ts +5 -0
- package/dist/factories/kubernetes/scheduling/runtime-class.d.ts.map +1 -0
- package/dist/factories/kubernetes/scheduling/runtime-class.js +10 -0
- package/dist/factories/kubernetes/scheduling/runtime-class.js.map +1 -0
- package/dist/factories/kubernetes/storage/csi-driver.d.ts +5 -0
- package/dist/factories/kubernetes/storage/csi-driver.d.ts.map +1 -0
- package/dist/factories/kubernetes/storage/csi-driver.js +16 -0
- package/dist/factories/kubernetes/storage/csi-driver.js.map +1 -0
- package/dist/factories/kubernetes/storage/csi-node.d.ts +5 -0
- package/dist/factories/kubernetes/storage/csi-node.d.ts.map +1 -0
- package/dist/factories/kubernetes/storage/csi-node.js +10 -0
- package/dist/factories/kubernetes/storage/csi-node.js.map +1 -0
- package/dist/factories/kubernetes/storage/index.d.ts +13 -0
- package/dist/factories/kubernetes/storage/index.d.ts.map +1 -0
- package/dist/factories/kubernetes/storage/index.js +13 -0
- package/dist/factories/kubernetes/storage/index.js.map +1 -0
- package/dist/factories/kubernetes/storage/persistent-volume-claim.d.ts +6 -0
- package/dist/factories/kubernetes/storage/persistent-volume-claim.d.ts.map +1 -0
- package/dist/factories/kubernetes/storage/persistent-volume-claim.js +30 -0
- package/dist/factories/kubernetes/storage/persistent-volume-claim.js.map +1 -0
- package/dist/factories/kubernetes/storage/persistent-volume.d.ts +6 -0
- package/dist/factories/kubernetes/storage/persistent-volume.d.ts.map +1 -0
- package/dist/factories/kubernetes/storage/persistent-volume.js +47 -0
- package/dist/factories/kubernetes/storage/persistent-volume.js.map +1 -0
- package/dist/factories/kubernetes/storage/storage-class.d.ts +4 -0
- package/dist/factories/kubernetes/storage/storage-class.d.ts.map +1 -0
- package/dist/factories/kubernetes/storage/storage-class.js +17 -0
- package/dist/factories/kubernetes/storage/storage-class.js.map +1 -0
- package/dist/factories/kubernetes/storage/volume-attachment.d.ts +6 -0
- package/dist/factories/kubernetes/storage/volume-attachment.d.ts.map +1 -0
- package/dist/factories/kubernetes/storage/volume-attachment.js +10 -0
- package/dist/factories/kubernetes/storage/volume-attachment.js.map +1 -0
- package/dist/factories/kubernetes/types.d.ts +8 -0
- package/dist/factories/kubernetes/types.d.ts.map +1 -0
- package/dist/factories/kubernetes/types.js +8 -0
- package/dist/factories/kubernetes/types.js.map +1 -0
- package/dist/factories/kubernetes/workloads/cron-job.d.ts +6 -0
- package/dist/factories/kubernetes/workloads/cron-job.d.ts.map +1 -0
- package/dist/factories/kubernetes/workloads/cron-job.js +53 -0
- package/dist/factories/kubernetes/workloads/cron-job.js.map +1 -0
- package/dist/factories/kubernetes/workloads/daemon-set.d.ts +6 -0
- package/dist/factories/kubernetes/workloads/daemon-set.d.ts.map +1 -0
- package/dist/factories/kubernetes/workloads/daemon-set.js +32 -0
- package/dist/factories/kubernetes/workloads/daemon-set.js.map +1 -0
- package/dist/factories/kubernetes/workloads/deployment.d.ts +5 -0
- package/dist/factories/kubernetes/workloads/deployment.d.ts.map +1 -0
- package/dist/factories/kubernetes/workloads/deployment.js +59 -0
- package/dist/factories/kubernetes/workloads/deployment.js.map +1 -0
- package/dist/factories/kubernetes/workloads/index.d.ts +14 -0
- package/dist/factories/kubernetes/workloads/index.d.ts.map +1 -0
- package/dist/factories/kubernetes/workloads/index.js +14 -0
- package/dist/factories/kubernetes/workloads/index.js.map +1 -0
- package/dist/factories/kubernetes/workloads/job.d.ts +6 -0
- package/dist/factories/kubernetes/workloads/job.d.ts.map +1 -0
- package/dist/factories/kubernetes/workloads/job.js +105 -0
- package/dist/factories/kubernetes/workloads/job.js.map +1 -0
- package/dist/factories/kubernetes/workloads/replica-set.d.ts +6 -0
- package/dist/factories/kubernetes/workloads/replica-set.d.ts.map +1 -0
- package/dist/factories/kubernetes/workloads/replica-set.js +33 -0
- package/dist/factories/kubernetes/workloads/replica-set.js.map +1 -0
- package/dist/factories/kubernetes/workloads/replication-controller.d.ts +6 -0
- package/dist/factories/kubernetes/workloads/replication-controller.d.ts.map +1 -0
- package/dist/factories/kubernetes/workloads/replication-controller.js +56 -0
- package/dist/factories/kubernetes/workloads/replication-controller.js.map +1 -0
- package/dist/factories/kubernetes/workloads/stateful-set.d.ts +6 -0
- package/dist/factories/kubernetes/workloads/stateful-set.d.ts.map +1 -0
- package/dist/factories/kubernetes/workloads/stateful-set.js +81 -0
- package/dist/factories/kubernetes/workloads/stateful-set.js.map +1 -0
- package/dist/factories/kubernetes/yaml/index.d.ts +6 -0
- package/dist/factories/kubernetes/yaml/index.d.ts.map +1 -0
- package/dist/factories/kubernetes/yaml/index.js +6 -0
- package/dist/factories/kubernetes/yaml/index.js.map +1 -0
- package/dist/factories/kubernetes/yaml/yaml-directory.d.ts +54 -0
- package/dist/factories/kubernetes/yaml/yaml-directory.d.ts.map +1 -0
- package/dist/factories/kubernetes/yaml/yaml-directory.js +178 -0
- package/dist/factories/kubernetes/yaml/yaml-directory.js.map +1 -0
- package/dist/factories/kubernetes/yaml/yaml-file.d.ts +54 -0
- package/dist/factories/kubernetes/yaml/yaml-file.d.ts.map +1 -0
- package/dist/factories/kubernetes/yaml/yaml-file.js +181 -0
- package/dist/factories/kubernetes/yaml/yaml-file.js.map +1 -0
- package/dist/factories/shared.d.ts +11 -0
- package/dist/factories/shared.d.ts.map +1 -0
- package/dist/factories/shared.js +364 -0
- package/dist/factories/shared.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/helpers.d.ts +69 -0
- package/dist/utils/helpers.d.ts.map +1 -0
- package/dist/utils/helpers.js +405 -0
- package/dist/utils/helpers.js.map +1 -0
- package/dist/utils/index.d.ts +9 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +11 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/type-guards.d.ts +34 -0
- package/dist/utils/type-guards.d.ts.map +1 -0
- package/dist/utils/type-guards.js +66 -0
- package/dist/utils/type-guards.js.map +1 -0
- package/package.json +109 -0
|
@@ -0,0 +1,837 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KroResourceFactory implementation for Kro deployment mode
|
|
3
|
+
*
|
|
4
|
+
* This factory handles deployment via Kro ResourceGraphDefinitions,
|
|
5
|
+
* using the Kro controller for dependency resolution and resource management.
|
|
6
|
+
*/
|
|
7
|
+
import * as k8s from '@kubernetes/client-node';
|
|
8
|
+
import { getComponentLogger } from '../logging/index.js';
|
|
9
|
+
import { createKubernetesClientProvider, createKubernetesClientProviderWithKubeConfig } from '../kubernetes/client-provider.js';
|
|
10
|
+
import { createSchemaProxy } from '../references/index.js';
|
|
11
|
+
import { generateKroSchemaFromArktype } from '../serialization/schema.js';
|
|
12
|
+
import { serializeResourceGraphToYaml } from '../serialization/yaml.js';
|
|
13
|
+
import { DirectDeploymentEngine } from './engine.js';
|
|
14
|
+
import { DeploymentMode } from '../references/index.js';
|
|
15
|
+
import { resourceGraphDefinition } from '../../factories/kro/resource-graph-definition.js';
|
|
16
|
+
import { kroCustomResourceDefinition } from '../../factories/kro/kro-crd.js';
|
|
17
|
+
import { kroCustomResource } from '../../factories/kro/kro-custom-resource.js';
|
|
18
|
+
import { ensureResourceTypeRegistered, KroTypeKroDeployer, createAlchemyResourceId } from '../../alchemy/deployment.js';
|
|
19
|
+
import { isKubernetesRef } from '../dependencies/type-guards.js';
|
|
20
|
+
/**
|
|
21
|
+
* KroResourceFactory implementation
|
|
22
|
+
*
|
|
23
|
+
* Handles deployment via Kro ResourceGraphDefinitions. The RGD is deployed once,
|
|
24
|
+
* and then instances are created as custom resources that the Kro controller processes.
|
|
25
|
+
*/
|
|
26
|
+
export class KroResourceFactoryImpl {
|
|
27
|
+
mode = 'kro';
|
|
28
|
+
name;
|
|
29
|
+
namespace;
|
|
30
|
+
isAlchemyManaged;
|
|
31
|
+
rgdName;
|
|
32
|
+
schema;
|
|
33
|
+
resources;
|
|
34
|
+
closures;
|
|
35
|
+
schemaDefinition;
|
|
36
|
+
statusMappings;
|
|
37
|
+
alchemyScope;
|
|
38
|
+
factoryOptions;
|
|
39
|
+
logger = getComponentLogger('kro-factory');
|
|
40
|
+
clientProvider;
|
|
41
|
+
constructor(name, resources, schemaDefinition, statusMappings, options = {}) {
|
|
42
|
+
this.name = name;
|
|
43
|
+
this.namespace = options.namespace || 'default';
|
|
44
|
+
this.alchemyScope = options.alchemyScope;
|
|
45
|
+
this.isAlchemyManaged = !!options.alchemyScope;
|
|
46
|
+
this.rgdName = this.convertToKubernetesName(name); // Convert to valid Kubernetes resource name
|
|
47
|
+
this.resources = resources;
|
|
48
|
+
this.closures = options.closures || {};
|
|
49
|
+
this.schemaDefinition = schemaDefinition;
|
|
50
|
+
this.statusMappings = statusMappings;
|
|
51
|
+
this.factoryOptions = options;
|
|
52
|
+
this.schema = createSchemaProxy();
|
|
53
|
+
// Validate closures for Kro mode - detect KubernetesRef inputs and raise clear errors
|
|
54
|
+
this.validateClosuresForKroMode();
|
|
55
|
+
// Don't initialize client provider in constructor - do it lazily when needed
|
|
56
|
+
// This allows tests to create factories without requiring a kubeconfig
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Validate closures for Kro mode compatibility
|
|
60
|
+
* Kro mode only supports static values - no dynamic references (KubernetesRef)
|
|
61
|
+
*/
|
|
62
|
+
validateClosuresForKroMode() {
|
|
63
|
+
if (Object.keys(this.closures).length === 0) {
|
|
64
|
+
return; // No closures to validate
|
|
65
|
+
}
|
|
66
|
+
// For Kro mode, we need to validate that closures don't contain dynamic references
|
|
67
|
+
// This is a static analysis - we can't execute the closures to check their arguments
|
|
68
|
+
// Instead, we'll validate when closures are executed during deployment
|
|
69
|
+
this.logger.debug('Kro factory initialized with closures', {
|
|
70
|
+
closureCount: Object.keys(this.closures).length,
|
|
71
|
+
closureNames: Object.keys(this.closures)
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Validate closure arguments for Kro mode compatibility
|
|
76
|
+
* This is called during deployment when we have access to the actual arguments
|
|
77
|
+
*/
|
|
78
|
+
validateClosureArgumentsForKroMode(closureName, config) {
|
|
79
|
+
const errors = [];
|
|
80
|
+
// Recursively check for KubernetesRef objects in the closure configuration
|
|
81
|
+
const checkForKubernetesRefs = (obj, path = '') => {
|
|
82
|
+
if (isKubernetesRef(obj)) {
|
|
83
|
+
errors.push(`Found KubernetesRef at ${path || 'root'}`);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (obj && typeof obj === 'object' && !Array.isArray(obj)) {
|
|
87
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
88
|
+
const newPath = path ? `${path}.${key}` : key;
|
|
89
|
+
checkForKubernetesRefs(value, newPath);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
else if (Array.isArray(obj)) {
|
|
93
|
+
obj.forEach((item, index) => {
|
|
94
|
+
const newPath = path ? `${path}[${index}]` : `[${index}]`;
|
|
95
|
+
checkForKubernetesRefs(item, newPath);
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
checkForKubernetesRefs(config);
|
|
100
|
+
if (errors.length > 0) {
|
|
101
|
+
const errorMessage = [
|
|
102
|
+
`Kro mode does not support dynamic references in YAML closures.`,
|
|
103
|
+
`Found KubernetesRef in closure '${closureName}':`,
|
|
104
|
+
...errors.map(error => ` - ${error}`),
|
|
105
|
+
``,
|
|
106
|
+
`Kro mode limitations:`,
|
|
107
|
+
` - YAML closures must use static values only`,
|
|
108
|
+
` - Dynamic references (schema.spec.*, resource.status.*) are not supported`,
|
|
109
|
+
` - Use static strings, numbers, and objects instead`,
|
|
110
|
+
``,
|
|
111
|
+
`Solutions:`,
|
|
112
|
+
` 1. Use static values: namespace: 'my-namespace' instead of namespace: schema.spec.namespace`,
|
|
113
|
+
` 2. Switch to Direct mode: await graph.factory('direct', options)`,
|
|
114
|
+
` 3. Move dynamic logic to Enhanced<> resources instead of closures`,
|
|
115
|
+
``,
|
|
116
|
+
`Example of Kro-compatible closure:`,
|
|
117
|
+
` yamlFile({`,
|
|
118
|
+
` name: 'static-config',`,
|
|
119
|
+
` path: 'git:github.com/org/repo/config.yaml@main',`,
|
|
120
|
+
` namespace: 'kro-system' // Static string - OK`,
|
|
121
|
+
` })`,
|
|
122
|
+
].join('\n');
|
|
123
|
+
throw new Error(errorMessage);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Convert camelCase resource graph name to valid Kubernetes resource name (kebab-case)
|
|
128
|
+
*/
|
|
129
|
+
convertToKubernetesName(name) {
|
|
130
|
+
// Validate input name
|
|
131
|
+
if (!name || typeof name !== 'string') {
|
|
132
|
+
throw new Error(`Invalid resource graph name: ${JSON.stringify(name)}. Resource graph name must be a non-empty string.`);
|
|
133
|
+
}
|
|
134
|
+
const trimmedName = name.trim();
|
|
135
|
+
if (trimmedName.length === 0) {
|
|
136
|
+
throw new Error(`Invalid resource graph name: Resource graph name cannot be empty or whitespace-only.`);
|
|
137
|
+
}
|
|
138
|
+
// Convert to kebab-case and validate result
|
|
139
|
+
const kubernetesName = trimmedName
|
|
140
|
+
.replace(/([a-z])([A-Z])/g, '$1-$2') // Insert dash before capital letters
|
|
141
|
+
.toLowerCase(); // Convert to lowercase
|
|
142
|
+
// Validate Kubernetes naming conventions
|
|
143
|
+
if (!/^[a-z0-9]([-a-z0-9]*[a-z0-9])?$/.test(kubernetesName)) {
|
|
144
|
+
throw new Error(`Invalid resource graph name: "${name}" converts to "${kubernetesName}" which is not a valid Kubernetes resource name. Names must consist of lowercase alphanumeric characters or '-', and must start and end with an alphanumeric character.`);
|
|
145
|
+
}
|
|
146
|
+
if (kubernetesName.length > 253) {
|
|
147
|
+
throw new Error(`Invalid resource graph name: "${name}" converts to "${kubernetesName}" which exceeds the 253 character limit for Kubernetes resource names.`);
|
|
148
|
+
}
|
|
149
|
+
return kubernetesName;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Get or create the Kubernetes client provider (lazy initialization)
|
|
153
|
+
*/
|
|
154
|
+
getClientProvider() {
|
|
155
|
+
if (!this.clientProvider) {
|
|
156
|
+
this.clientProvider = this.createClientProvider(this.factoryOptions);
|
|
157
|
+
}
|
|
158
|
+
return this.clientProvider;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Create and configure the Kubernetes client provider
|
|
162
|
+
*/
|
|
163
|
+
createClientProvider(options) {
|
|
164
|
+
// If a pre-configured kubeConfig is provided, use it directly
|
|
165
|
+
if (options.kubeConfig) {
|
|
166
|
+
this.logger.debug('Using pre-configured KubeConfig from factory options');
|
|
167
|
+
return createKubernetesClientProviderWithKubeConfig(options.kubeConfig);
|
|
168
|
+
}
|
|
169
|
+
// Create client provider with configuration from factory options
|
|
170
|
+
const clientConfig = {
|
|
171
|
+
...(options.skipTLSVerify !== undefined && { skipTLSVerify: options.skipTLSVerify }),
|
|
172
|
+
// Add other configuration options as needed
|
|
173
|
+
};
|
|
174
|
+
this.logger.debug('Creating new KubernetesClientProvider with configuration', {
|
|
175
|
+
skipTLSVerify: clientConfig.skipTLSVerify,
|
|
176
|
+
});
|
|
177
|
+
return createKubernetesClientProvider(clientConfig);
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Get the Kubernetes config from the centralized provider
|
|
181
|
+
*/
|
|
182
|
+
getKubeConfig() {
|
|
183
|
+
const clientProvider = this.getClientProvider();
|
|
184
|
+
return clientProvider.getKubeConfig();
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Deploy a new instance by creating a custom resource
|
|
188
|
+
*/
|
|
189
|
+
async deploy(spec) {
|
|
190
|
+
// Validate spec against ArkType schema
|
|
191
|
+
const validationResult = this.schemaDefinition.spec(spec);
|
|
192
|
+
if (validationResult instanceof Error) {
|
|
193
|
+
throw new Error(`Invalid spec: ${validationResult.message}`);
|
|
194
|
+
}
|
|
195
|
+
// Execute closures before RGD creation (Kro mode requirement)
|
|
196
|
+
await this.executeClosuresBeforeRGD(spec);
|
|
197
|
+
if (this.isAlchemyManaged) {
|
|
198
|
+
return this.deployWithAlchemy(spec);
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
return this.deployDirect(spec);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Execute closures before RGD creation (Kro mode requirement)
|
|
206
|
+
* Closures must execute before ResourceGraphDefinition is created
|
|
207
|
+
*/
|
|
208
|
+
async executeClosuresBeforeRGD(spec) {
|
|
209
|
+
if (Object.keys(this.closures).length === 0) {
|
|
210
|
+
return []; // No closures to execute
|
|
211
|
+
}
|
|
212
|
+
this.logger.info('Executing closures before RGD creation', {
|
|
213
|
+
closureCount: Object.keys(this.closures).length
|
|
214
|
+
});
|
|
215
|
+
// First, validate all closures before creating any API clients
|
|
216
|
+
// The closures returned by the resource builder are deployment closures that expect a DeploymentContext
|
|
217
|
+
// We need to execute them with a mock context to trigger validation
|
|
218
|
+
const mockDeploymentContext = {
|
|
219
|
+
kubernetesApi: null, // Not needed for validation
|
|
220
|
+
namespace: this.namespace,
|
|
221
|
+
deployedResources: new Map(),
|
|
222
|
+
resolveReference: async (ref) => {
|
|
223
|
+
throw new Error(`Kro mode does not support dynamic reference resolution. Found reference: ${ref.resourceId}.${ref.fieldPath}`);
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
for (const [closureName, closure] of Object.entries(this.closures)) {
|
|
227
|
+
try {
|
|
228
|
+
// Execute the deployment closure with mock context to trigger validation
|
|
229
|
+
await closure(mockDeploymentContext);
|
|
230
|
+
}
|
|
231
|
+
catch (error) {
|
|
232
|
+
// If validation fails, throw the validation error immediately
|
|
233
|
+
if (error instanceof Error && error.message.includes('Kro mode does not support dynamic reference resolution')) {
|
|
234
|
+
throw error;
|
|
235
|
+
}
|
|
236
|
+
// For other errors, wrap them with context
|
|
237
|
+
throw new Error(`Failed to validate closure '${closureName}': ${error}`);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
const allResults = [];
|
|
241
|
+
// Only create deployment context after validation passes
|
|
242
|
+
const deploymentContext = {
|
|
243
|
+
kubernetesApi: this.getKubeConfig().makeApiClient(k8s.KubernetesObjectApi),
|
|
244
|
+
...(this.alchemyScope && { alchemyScope: this.alchemyScope }),
|
|
245
|
+
namespace: this.namespace,
|
|
246
|
+
deployedResources: new Map(), // Empty for pre-RGD execution
|
|
247
|
+
resolveReference: async (ref) => {
|
|
248
|
+
throw new Error(`Kro mode does not support dynamic reference resolution. Found reference: ${ref.resourceId}.${ref.fieldPath}`);
|
|
249
|
+
}
|
|
250
|
+
};
|
|
251
|
+
// Execute closures sequentially to maintain order
|
|
252
|
+
for (const [closureName, closure] of Object.entries(this.closures)) {
|
|
253
|
+
try {
|
|
254
|
+
this.logger.debug('Executing closure', { name: closureName });
|
|
255
|
+
// Note: We can't validate closure arguments here because we don't have access to them
|
|
256
|
+
// The validation happens inside the closure when it processes its config
|
|
257
|
+
// This is a limitation of the closure pattern, but the error messages will be clear
|
|
258
|
+
const results = await closure(deploymentContext);
|
|
259
|
+
allResults.push(...results);
|
|
260
|
+
this.logger.info('Closure executed successfully', {
|
|
261
|
+
name: closureName,
|
|
262
|
+
resourceCount: results.length
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
catch (error) {
|
|
266
|
+
// Check if this is a KubernetesRef validation error and enhance it
|
|
267
|
+
if (error instanceof Error && error.message.includes('KubernetesRef')) {
|
|
268
|
+
this.logger.error('Closure validation failed - dynamic references not supported in Kro mode', {
|
|
269
|
+
name: closureName,
|
|
270
|
+
message: error.message
|
|
271
|
+
});
|
|
272
|
+
throw error; // Re-throw with original detailed message
|
|
273
|
+
}
|
|
274
|
+
this.logger.error('Closure execution failed', { name: closureName, message: error instanceof Error ? error.message : String(error) });
|
|
275
|
+
throw new Error(`Failed to execute closure '${closureName}': ${error instanceof Error ? error.message : String(error)}`);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
this.logger.info('All closures executed successfully', {
|
|
279
|
+
totalResources: allResults.length
|
|
280
|
+
});
|
|
281
|
+
return allResults;
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Deploy directly to Kubernetes using DirectDeploymentEngine
|
|
285
|
+
*/
|
|
286
|
+
async deployDirect(spec) {
|
|
287
|
+
// Ensure RGD is deployed first
|
|
288
|
+
await this.ensureRGDDeployed();
|
|
289
|
+
// Create DirectDeploymentEngine with KRO mode for CEL string conversion
|
|
290
|
+
const deploymentEngine = new DirectDeploymentEngine(this.getKubeConfig(), undefined, undefined, DeploymentMode.KRO);
|
|
291
|
+
// Create custom resource instance
|
|
292
|
+
const instanceName = this.generateInstanceName(spec);
|
|
293
|
+
const customResourceData = this.createCustomResourceInstance(instanceName, spec);
|
|
294
|
+
// Wrap with kroCustomResource factory to get Enhanced object with readiness evaluation
|
|
295
|
+
const enhancedCustomResource = kroCustomResource({
|
|
296
|
+
apiVersion: customResourceData.apiVersion,
|
|
297
|
+
kind: customResourceData.kind,
|
|
298
|
+
metadata: {
|
|
299
|
+
name: customResourceData.metadata.name,
|
|
300
|
+
namespace: customResourceData.metadata.namespace,
|
|
301
|
+
},
|
|
302
|
+
spec: customResourceData.spec,
|
|
303
|
+
});
|
|
304
|
+
// Deploy using DirectDeploymentEngine with built-in waitForReady logic
|
|
305
|
+
const deployableResource = {
|
|
306
|
+
...enhancedCustomResource,
|
|
307
|
+
id: instanceName,
|
|
308
|
+
metadata: {
|
|
309
|
+
...enhancedCustomResource.metadata,
|
|
310
|
+
name: instanceName,
|
|
311
|
+
namespace: this.namespace,
|
|
312
|
+
},
|
|
313
|
+
spec: customResourceData.spec, // Use spec directly from customResourceData to ensure it's preserved
|
|
314
|
+
};
|
|
315
|
+
// Preserve the readiness evaluator (non-enumerable property)
|
|
316
|
+
const readinessEvaluator = enhancedCustomResource.readinessEvaluator;
|
|
317
|
+
if (readinessEvaluator) {
|
|
318
|
+
Object.defineProperty(deployableResource, 'readinessEvaluator', {
|
|
319
|
+
value: readinessEvaluator,
|
|
320
|
+
enumerable: false,
|
|
321
|
+
configurable: false,
|
|
322
|
+
writable: false
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
// Deploy without waiting for readiness - we'll handle that ourselves
|
|
326
|
+
const _deployedResource = await deploymentEngine.deployResource(deployableResource, {
|
|
327
|
+
mode: 'kro',
|
|
328
|
+
namespace: this.namespace,
|
|
329
|
+
waitForReady: false, // We'll handle Kro-specific readiness ourselves
|
|
330
|
+
timeout: this.factoryOptions.timeout || 300000,
|
|
331
|
+
});
|
|
332
|
+
// Handle Kro-specific readiness checking if requested
|
|
333
|
+
if (this.factoryOptions.waitForReady ?? true) {
|
|
334
|
+
await this.waitForKroInstanceReady(instanceName, this.factoryOptions.timeout || 600000); // 10 minutes
|
|
335
|
+
}
|
|
336
|
+
// Create Enhanced proxy for the deployed instance
|
|
337
|
+
return await this.createEnhancedProxy(spec, instanceName);
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Deploy using type-safe alchemy resource wrapping
|
|
341
|
+
*
|
|
342
|
+
* In alchemy mode, the RGD gets one typed alchemy Resource and each instance gets another
|
|
343
|
+
*/
|
|
344
|
+
async deployWithAlchemy(spec) {
|
|
345
|
+
if (!this.alchemyScope) {
|
|
346
|
+
throw new Error('Alchemy scope is required for alchemy deployment');
|
|
347
|
+
}
|
|
348
|
+
// Use static registration functions
|
|
349
|
+
// Create deployer instance using DirectDeploymentEngine with KRO mode
|
|
350
|
+
const kroEngine = new DirectDeploymentEngine(this.getKubeConfig(), undefined, undefined, DeploymentMode.KRO);
|
|
351
|
+
const deployer = new KroTypeKroDeployer(kroEngine);
|
|
352
|
+
// 1. Ensure RGD is deployed via alchemy (once per factory)
|
|
353
|
+
const kroSchema = generateKroSchemaFromArktype(this.name, this.schemaDefinition, this.resources, this.statusMappings);
|
|
354
|
+
const rgdManifest = {
|
|
355
|
+
apiVersion: 'kro.run/v1alpha1',
|
|
356
|
+
kind: 'ResourceGraphDefinition',
|
|
357
|
+
metadata: {
|
|
358
|
+
name: this.rgdName,
|
|
359
|
+
namespace: this.namespace,
|
|
360
|
+
},
|
|
361
|
+
spec: {
|
|
362
|
+
schema: kroSchema,
|
|
363
|
+
resources: Object.values(this.resources).map(resource => ({
|
|
364
|
+
id: resource.id || resource.metadata?.name || 'unknown',
|
|
365
|
+
template: resource,
|
|
366
|
+
})),
|
|
367
|
+
},
|
|
368
|
+
};
|
|
369
|
+
// Register RGD type dynamically
|
|
370
|
+
const rgdEnhanced = resourceGraphDefinition(rgdManifest);
|
|
371
|
+
const RGDProvider = ensureResourceTypeRegistered(rgdEnhanced);
|
|
372
|
+
const rgdId = createAlchemyResourceId(rgdEnhanced, this.namespace);
|
|
373
|
+
await RGDProvider(rgdId, {
|
|
374
|
+
resource: rgdEnhanced,
|
|
375
|
+
namespace: this.namespace,
|
|
376
|
+
deployer: deployer,
|
|
377
|
+
options: {
|
|
378
|
+
waitForReady: true,
|
|
379
|
+
timeout: 60000, // RGD should be ready quickly
|
|
380
|
+
},
|
|
381
|
+
});
|
|
382
|
+
// 2. Create instance via alchemy (once per deploy call)
|
|
383
|
+
const instanceName = this.generateInstanceName(spec);
|
|
384
|
+
const crdInstanceManifest = this.createCustomResourceInstance(instanceName, spec);
|
|
385
|
+
// Register CRD instance type dynamically
|
|
386
|
+
const CRDInstanceProvider = ensureResourceTypeRegistered(crdInstanceManifest);
|
|
387
|
+
const instanceId = createAlchemyResourceId(crdInstanceManifest, this.namespace);
|
|
388
|
+
await CRDInstanceProvider(instanceId, {
|
|
389
|
+
resource: crdInstanceManifest,
|
|
390
|
+
namespace: this.namespace,
|
|
391
|
+
deployer: deployer,
|
|
392
|
+
options: {
|
|
393
|
+
waitForReady: this.factoryOptions.waitForReady ?? true,
|
|
394
|
+
timeout: this.factoryOptions.timeout ?? 300000,
|
|
395
|
+
},
|
|
396
|
+
});
|
|
397
|
+
// Create Enhanced proxy for the deployed instance
|
|
398
|
+
return await this.createEnhancedProxy(spec, instanceName);
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Get all deployed instances
|
|
402
|
+
*/
|
|
403
|
+
async getInstances() {
|
|
404
|
+
const kubeConfig = this.getKubeConfig();
|
|
405
|
+
const customApi = kubeConfig.makeApiClient(k8s.CustomObjectsApi);
|
|
406
|
+
try {
|
|
407
|
+
// The schema definition should contain just the version part (e.g., 'v1alpha1')
|
|
408
|
+
// If it somehow contains the full API version, extract just the version part
|
|
409
|
+
const version = this.schemaDefinition.apiVersion.includes('/')
|
|
410
|
+
? this.schemaDefinition.apiVersion.split('/')[1] || this.schemaDefinition.apiVersion
|
|
411
|
+
: this.schemaDefinition.apiVersion;
|
|
412
|
+
const listResponse = await customApi.listNamespacedCustomObject('kro.run', version, this.namespace, `${this.schemaDefinition.kind.toLowerCase()}s` // Pluralize the kind
|
|
413
|
+
);
|
|
414
|
+
const instances = listResponse.body.items || [];
|
|
415
|
+
return await Promise.all(instances.map(async (instance) => {
|
|
416
|
+
return await this.createEnhancedProxy(instance.spec, instance.metadata.name);
|
|
417
|
+
}));
|
|
418
|
+
}
|
|
419
|
+
catch (error) {
|
|
420
|
+
const k8sError = error;
|
|
421
|
+
// If the CRD doesn't exist yet or there are no instances, return empty array
|
|
422
|
+
if (k8sError.message?.includes('not found') ||
|
|
423
|
+
k8sError.message?.includes('404') ||
|
|
424
|
+
k8sError.body?.includes('not found') ||
|
|
425
|
+
k8sError.body?.includes('404') ||
|
|
426
|
+
k8sError.statusCode === 404 ||
|
|
427
|
+
String(error).includes('404') ||
|
|
428
|
+
String(error).includes('not found')) {
|
|
429
|
+
return [];
|
|
430
|
+
}
|
|
431
|
+
throw new Error(`Failed to list instances: ${k8sError.message || String(error)}`);
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
/**
|
|
435
|
+
* Delete a specific instance by name
|
|
436
|
+
*/
|
|
437
|
+
async deleteInstance(name) {
|
|
438
|
+
const k8sApi = this.getKubeConfig().makeApiClient(k8s.KubernetesObjectApi);
|
|
439
|
+
const apiVersion = this.schemaDefinition.apiVersion.includes('/')
|
|
440
|
+
? this.schemaDefinition.apiVersion
|
|
441
|
+
: `kro.run/${this.schemaDefinition.apiVersion}`;
|
|
442
|
+
try {
|
|
443
|
+
await k8sApi.delete({
|
|
444
|
+
apiVersion,
|
|
445
|
+
kind: this.schemaDefinition.kind,
|
|
446
|
+
metadata: {
|
|
447
|
+
name,
|
|
448
|
+
namespace: this.namespace,
|
|
449
|
+
},
|
|
450
|
+
});
|
|
451
|
+
}
|
|
452
|
+
catch (error) {
|
|
453
|
+
const k8sError = error;
|
|
454
|
+
if (k8sError.statusCode !== 404) {
|
|
455
|
+
throw new Error(`Failed to delete instance ${name}: ${k8sError.message || String(error)}`);
|
|
456
|
+
}
|
|
457
|
+
// Instance already deleted, ignore 404
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
/**
|
|
461
|
+
* Get factory status
|
|
462
|
+
*/
|
|
463
|
+
async getStatus() {
|
|
464
|
+
const instances = await this.getInstances();
|
|
465
|
+
const rgdStatus = await this.getRGDStatus();
|
|
466
|
+
return {
|
|
467
|
+
name: this.name,
|
|
468
|
+
mode: this.mode,
|
|
469
|
+
isAlchemyManaged: this.isAlchemyManaged,
|
|
470
|
+
namespace: this.namespace,
|
|
471
|
+
instanceCount: instances.length,
|
|
472
|
+
health: rgdStatus.phase === 'ready' ? 'healthy' : 'degraded',
|
|
473
|
+
};
|
|
474
|
+
}
|
|
475
|
+
/**
|
|
476
|
+
* Get ResourceGraphDefinition status
|
|
477
|
+
*/
|
|
478
|
+
async getRGDStatus() {
|
|
479
|
+
const k8sApi = this.getKubeConfig().makeApiClient(k8s.KubernetesObjectApi);
|
|
480
|
+
try {
|
|
481
|
+
const response = await k8sApi.read({
|
|
482
|
+
apiVersion: 'kro.run/v1alpha1',
|
|
483
|
+
kind: 'ResourceGraphDefinition',
|
|
484
|
+
metadata: {
|
|
485
|
+
name: this.rgdName,
|
|
486
|
+
namespace: this.namespace,
|
|
487
|
+
},
|
|
488
|
+
});
|
|
489
|
+
const rgd = response.body;
|
|
490
|
+
// Map Kro's state to our phase enum
|
|
491
|
+
let phase = 'pending';
|
|
492
|
+
if (rgd.status?.state === 'Active') {
|
|
493
|
+
phase = 'ready';
|
|
494
|
+
}
|
|
495
|
+
else if (rgd.status?.state === 'Inactive') {
|
|
496
|
+
// Check if it's failed or just pending
|
|
497
|
+
const hasFailedCondition = rgd.status?.conditions?.some(c => c.status === 'False');
|
|
498
|
+
phase = hasFailedCondition ? 'failed' : 'pending';
|
|
499
|
+
}
|
|
500
|
+
return {
|
|
501
|
+
name: this.rgdName,
|
|
502
|
+
phase,
|
|
503
|
+
conditions: rgd.status?.conditions || [],
|
|
504
|
+
observedGeneration: rgd.status?.observedGeneration || 0,
|
|
505
|
+
};
|
|
506
|
+
}
|
|
507
|
+
catch (error) {
|
|
508
|
+
const k8sError = error;
|
|
509
|
+
if (k8sError.statusCode === 404) {
|
|
510
|
+
return {
|
|
511
|
+
name: this.rgdName,
|
|
512
|
+
phase: 'pending',
|
|
513
|
+
conditions: [],
|
|
514
|
+
};
|
|
515
|
+
}
|
|
516
|
+
throw new Error(`Failed to get RGD status: ${k8sError.message || String(error)}`);
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
/**
|
|
520
|
+
* Implementation of overloaded toYaml method
|
|
521
|
+
*/
|
|
522
|
+
toYaml(spec) {
|
|
523
|
+
if (spec) {
|
|
524
|
+
// Generate CRD instance YAML
|
|
525
|
+
const instanceName = this.generateInstanceName(spec);
|
|
526
|
+
const customResource = this.createCustomResourceInstance(instanceName, spec);
|
|
527
|
+
return `apiVersion: ${customResource.apiVersion}
|
|
528
|
+
kind: ${customResource.kind}
|
|
529
|
+
metadata:
|
|
530
|
+
name: ${customResource.metadata.name}
|
|
531
|
+
namespace: ${customResource.metadata.namespace}
|
|
532
|
+
spec:
|
|
533
|
+
${Object.entries(spec).map(([key, value]) => ` ${key}: ${typeof value === 'string' ? `"${value}"` : value}`).join('\n')}`;
|
|
534
|
+
}
|
|
535
|
+
else {
|
|
536
|
+
// Generate RGD YAML
|
|
537
|
+
const kroSchema = generateKroSchemaFromArktype(this.name, this.schemaDefinition, this.resources, this.statusMappings);
|
|
538
|
+
return serializeResourceGraphToYaml(this.rgdName, this.resources, { namespace: this.namespace }, kroSchema);
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
/**
|
|
542
|
+
* Ensure the ResourceGraphDefinition is deployed using DirectDeploymentEngine
|
|
543
|
+
*/
|
|
544
|
+
async ensureRGDDeployed() {
|
|
545
|
+
// Create DirectDeploymentEngine instance with KRO mode for CEL string generation
|
|
546
|
+
const deploymentEngine = new DirectDeploymentEngine(this.getKubeConfig(), undefined, undefined, DeploymentMode.KRO);
|
|
547
|
+
// Create the RGD using the same serialization logic as toYaml()
|
|
548
|
+
const kroSchema = generateKroSchemaFromArktype(this.name, this.schemaDefinition, this.resources, this.statusMappings);
|
|
549
|
+
const rgdYaml = serializeResourceGraphToYaml(this.rgdName, this.resources, { namespace: this.namespace }, kroSchema);
|
|
550
|
+
// Parse the YAML to get the RGD object
|
|
551
|
+
const rgdManifests = k8s.loadAllYaml(rgdYaml);
|
|
552
|
+
const rgdManifest = rgdManifests[0];
|
|
553
|
+
// Ensure the RGD has the required properties for deployment
|
|
554
|
+
const rgdWithMetadata = {
|
|
555
|
+
...rgdManifest,
|
|
556
|
+
metadata: {
|
|
557
|
+
...rgdManifest.metadata,
|
|
558
|
+
name: this.rgdName,
|
|
559
|
+
namespace: this.namespace,
|
|
560
|
+
}
|
|
561
|
+
};
|
|
562
|
+
// Create Enhanced RGD with readiness evaluator
|
|
563
|
+
const enhancedRGD = resourceGraphDefinition(rgdWithMetadata);
|
|
564
|
+
try {
|
|
565
|
+
// Deploy RGD using DirectDeploymentEngine with readiness checking
|
|
566
|
+
await deploymentEngine.deployResource(enhancedRGD, {
|
|
567
|
+
mode: 'direct',
|
|
568
|
+
namespace: this.namespace,
|
|
569
|
+
waitForReady: true,
|
|
570
|
+
timeout: this.factoryOptions.timeout || 60000,
|
|
571
|
+
});
|
|
572
|
+
// Wait for the CRD to be created by Kro using DirectDeploymentEngine
|
|
573
|
+
await this.waitForCRDReadyWithEngine(deploymentEngine);
|
|
574
|
+
}
|
|
575
|
+
catch (error) {
|
|
576
|
+
throw new Error(`Failed to deploy RGD using DirectDeploymentEngine: ${error instanceof Error ? error.message : String(error)}`);
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
/**
|
|
580
|
+
* Wait for the CRD to be created by Kro using DirectDeploymentEngine
|
|
581
|
+
*/
|
|
582
|
+
async waitForCRDReadyWithEngine(deploymentEngine) {
|
|
583
|
+
const crdName = `${this.schemaDefinition.kind.toLowerCase()}s.kro.run`;
|
|
584
|
+
// Create Enhanced CRD for readiness checking
|
|
585
|
+
const crdManifest = {
|
|
586
|
+
apiVersion: 'apiextensions.k8s.io/v1',
|
|
587
|
+
kind: 'CustomResourceDefinition',
|
|
588
|
+
metadata: {
|
|
589
|
+
name: crdName,
|
|
590
|
+
// CRDs are cluster-scoped, so no namespace
|
|
591
|
+
},
|
|
592
|
+
};
|
|
593
|
+
const enhancedCRD = kroCustomResourceDefinition(crdManifest);
|
|
594
|
+
// Use DirectDeploymentEngine to wait for CRD readiness
|
|
595
|
+
const deployedCRD = {
|
|
596
|
+
id: crdName,
|
|
597
|
+
kind: 'CustomResourceDefinition',
|
|
598
|
+
name: crdName,
|
|
599
|
+
namespace: '', // CRDs are cluster-scoped
|
|
600
|
+
manifest: enhancedCRD,
|
|
601
|
+
status: 'deployed',
|
|
602
|
+
deployedAt: new Date(),
|
|
603
|
+
};
|
|
604
|
+
// This will use the custom readiness evaluator from kroCustomResourceDefinition()
|
|
605
|
+
await deploymentEngine.waitForResourceReadiness(deployedCRD, {
|
|
606
|
+
mode: 'direct',
|
|
607
|
+
namespace: '', // CRDs are cluster-scoped
|
|
608
|
+
timeout: this.factoryOptions.timeout || 60000,
|
|
609
|
+
});
|
|
610
|
+
}
|
|
611
|
+
/**
|
|
612
|
+
* Separate static and dynamic status fields
|
|
613
|
+
*/
|
|
614
|
+
async separateStatusFields() {
|
|
615
|
+
if (!this.statusMappings) {
|
|
616
|
+
return { staticFields: {}, dynamicFields: {} };
|
|
617
|
+
}
|
|
618
|
+
// Use dynamic import to avoid circular dependencies
|
|
619
|
+
const { separateStatusFields } = await import('../validation/cel-validator.js');
|
|
620
|
+
return separateStatusFields(this.statusMappings);
|
|
621
|
+
}
|
|
622
|
+
/**
|
|
623
|
+
* Generate instance name from spec
|
|
624
|
+
*/
|
|
625
|
+
generateInstanceName(spec) {
|
|
626
|
+
// Try to extract name from spec - check common name fields
|
|
627
|
+
if (typeof spec === 'object' && spec !== null) {
|
|
628
|
+
const specObj = spec;
|
|
629
|
+
// Check for common name fields in order of preference
|
|
630
|
+
for (const nameField of ['name', 'appName', 'serviceName', 'resourceName']) {
|
|
631
|
+
if (nameField in specObj && specObj[nameField]) {
|
|
632
|
+
return String(specObj[nameField]);
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
// Generate a unique name
|
|
637
|
+
return `${this.name}-${Date.now()}`;
|
|
638
|
+
}
|
|
639
|
+
/**
|
|
640
|
+
* Create custom resource instance
|
|
641
|
+
*/
|
|
642
|
+
createCustomResourceInstance(instanceName, spec) {
|
|
643
|
+
// The schema definition contains just the version part (e.g., 'v1alpha1')
|
|
644
|
+
// We need to construct the full API version for the instance (e.g., 'kro.run/v1alpha1')
|
|
645
|
+
const apiVersion = this.schemaDefinition.apiVersion.includes('/')
|
|
646
|
+
? this.schemaDefinition.apiVersion // Already has group prefix
|
|
647
|
+
: `kro.run/${this.schemaDefinition.apiVersion}`; // Add kro.run group
|
|
648
|
+
return {
|
|
649
|
+
apiVersion,
|
|
650
|
+
kind: this.schemaDefinition.kind,
|
|
651
|
+
metadata: {
|
|
652
|
+
name: instanceName,
|
|
653
|
+
namespace: this.namespace,
|
|
654
|
+
},
|
|
655
|
+
spec,
|
|
656
|
+
};
|
|
657
|
+
}
|
|
658
|
+
/**
|
|
659
|
+
* Create an Enhanced proxy for the instance with mixed static/dynamic hydration
|
|
660
|
+
*/
|
|
661
|
+
async createEnhancedProxyWithMixedHydration(spec, instanceName) {
|
|
662
|
+
const hydrationLogger = this.logger.child({ instanceName });
|
|
663
|
+
// Separate static and dynamic status fields
|
|
664
|
+
const { staticFields, dynamicFields } = await this.separateStatusFields();
|
|
665
|
+
// Start with static fields as the base status
|
|
666
|
+
const status = { ...staticFields };
|
|
667
|
+
// Create the initial Enhanced proxy
|
|
668
|
+
// The Enhanced proxy should represent the actual instance, which uses the full API version
|
|
669
|
+
const instanceApiVersion = this.schemaDefinition.apiVersion.includes('/')
|
|
670
|
+
? this.schemaDefinition.apiVersion
|
|
671
|
+
: `kro.run/${this.schemaDefinition.apiVersion}`;
|
|
672
|
+
const enhancedProxy = {
|
|
673
|
+
apiVersion: instanceApiVersion,
|
|
674
|
+
kind: this.schemaDefinition.kind,
|
|
675
|
+
spec,
|
|
676
|
+
status,
|
|
677
|
+
metadata: {
|
|
678
|
+
name: instanceName,
|
|
679
|
+
namespace: this.namespace,
|
|
680
|
+
labels: {
|
|
681
|
+
'typekro.io/factory': this.name,
|
|
682
|
+
'typekro.io/mode': this.mode,
|
|
683
|
+
'typekro.io/rgd': this.rgdName,
|
|
684
|
+
},
|
|
685
|
+
annotations: {
|
|
686
|
+
'typekro.io/deployed-at': new Date().toISOString(),
|
|
687
|
+
'typekro.io/api-version': instanceApiVersion,
|
|
688
|
+
'typekro.io/kind': this.schemaDefinition.kind,
|
|
689
|
+
},
|
|
690
|
+
},
|
|
691
|
+
};
|
|
692
|
+
// Hydrate dynamic status fields if enabled and there are dynamic fields
|
|
693
|
+
if (this.factoryOptions.hydrateStatus !== false && Object.keys(dynamicFields).length > 0) {
|
|
694
|
+
try {
|
|
695
|
+
const hydratedDynamicFields = await this.hydrateDynamicStatusFields(instanceName, dynamicFields);
|
|
696
|
+
// Merge dynamic fields with static fields
|
|
697
|
+
// Dynamic fields from Kro take precedence over static fields with same names
|
|
698
|
+
const mergedStatus = {
|
|
699
|
+
...staticFields, // Static fields first
|
|
700
|
+
...hydratedDynamicFields, // Dynamic fields from Kro override
|
|
701
|
+
};
|
|
702
|
+
// Update the status using object assignment to avoid type issues
|
|
703
|
+
Object.assign(enhancedProxy.status, mergedStatus);
|
|
704
|
+
}
|
|
705
|
+
catch (error) {
|
|
706
|
+
hydrationLogger.warn('Dynamic status hydration failed', error);
|
|
707
|
+
// Continue with static fields only if dynamic hydration fails
|
|
708
|
+
}
|
|
709
|
+
}
|
|
710
|
+
return enhancedProxy;
|
|
711
|
+
}
|
|
712
|
+
/**
|
|
713
|
+
* Create an Enhanced proxy for the instance (backward compatibility method)
|
|
714
|
+
*/
|
|
715
|
+
async createEnhancedProxy(spec, instanceName) {
|
|
716
|
+
return this.createEnhancedProxyWithMixedHydration(spec, instanceName);
|
|
717
|
+
}
|
|
718
|
+
/**
|
|
719
|
+
* Wait for Kro instance to be ready with Kro-specific logic
|
|
720
|
+
*/
|
|
721
|
+
async waitForKroInstanceReady(instanceName, timeout) {
|
|
722
|
+
const startTime = Date.now();
|
|
723
|
+
const readinessLogger = this.logger.child({ instanceName, rgdName: this.name });
|
|
724
|
+
while (Date.now() - startTime < timeout) {
|
|
725
|
+
try {
|
|
726
|
+
const apiVersion = this.schemaDefinition.apiVersion.includes('/')
|
|
727
|
+
? this.schemaDefinition.apiVersion
|
|
728
|
+
: `kro.run/${this.schemaDefinition.apiVersion}`;
|
|
729
|
+
const k8sApi = this.getKubeConfig().makeApiClient(k8s.KubernetesObjectApi);
|
|
730
|
+
const response = await k8sApi.read({
|
|
731
|
+
apiVersion,
|
|
732
|
+
kind: this.schemaDefinition.kind,
|
|
733
|
+
metadata: {
|
|
734
|
+
name: instanceName,
|
|
735
|
+
namespace: this.namespace,
|
|
736
|
+
},
|
|
737
|
+
});
|
|
738
|
+
const instance = response.body;
|
|
739
|
+
// Kro-specific readiness logic
|
|
740
|
+
const status = instance.status;
|
|
741
|
+
if (!status) {
|
|
742
|
+
readinessLogger.debug('No status found yet, continuing to wait', { instanceName });
|
|
743
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
744
|
+
continue;
|
|
745
|
+
}
|
|
746
|
+
const state = status.state;
|
|
747
|
+
const conditions = status.conditions || [];
|
|
748
|
+
const syncedCondition = conditions.find(c => c.type === 'InstanceSynced');
|
|
749
|
+
// Check if status has fields beyond the basic Kro fields (conditions, state)
|
|
750
|
+
const statusKeys = Object.keys(status);
|
|
751
|
+
const basicKroFields = ['conditions', 'state'];
|
|
752
|
+
const hasCustomStatusFields = statusKeys.some(key => !basicKroFields.includes(key));
|
|
753
|
+
const isActive = state === 'ACTIVE';
|
|
754
|
+
const isSynced = syncedCondition?.status === 'True';
|
|
755
|
+
readinessLogger.debug('Kro instance status check', {
|
|
756
|
+
instanceName,
|
|
757
|
+
state,
|
|
758
|
+
isActive,
|
|
759
|
+
isSynced,
|
|
760
|
+
hasCustomStatusFields,
|
|
761
|
+
statusKeys
|
|
762
|
+
});
|
|
763
|
+
// Resource is ready when it's active, synced, and has custom status fields populated
|
|
764
|
+
if (isActive && isSynced && hasCustomStatusFields) {
|
|
765
|
+
readinessLogger.info('Kro instance is ready', { instanceName });
|
|
766
|
+
return;
|
|
767
|
+
}
|
|
768
|
+
// Check for failure states
|
|
769
|
+
if (state === 'FAILED') {
|
|
770
|
+
const failedCondition = conditions.find(c => c.status === 'False');
|
|
771
|
+
const errorMessage = failedCondition?.message || 'Unknown error';
|
|
772
|
+
throw new Error(`Kro instance deployment failed: ${errorMessage}`);
|
|
773
|
+
}
|
|
774
|
+
readinessLogger.debug('Kro instance not ready yet, continuing to wait', {
|
|
775
|
+
instanceName,
|
|
776
|
+
state,
|
|
777
|
+
isSynced,
|
|
778
|
+
hasCustomStatusFields
|
|
779
|
+
});
|
|
780
|
+
}
|
|
781
|
+
catch (error) {
|
|
782
|
+
const k8sError = error;
|
|
783
|
+
if (k8sError.statusCode !== 404) {
|
|
784
|
+
throw error;
|
|
785
|
+
}
|
|
786
|
+
// Instance not found yet, continue waiting
|
|
787
|
+
readinessLogger.debug('Instance not found yet, continuing to wait', { instanceName });
|
|
788
|
+
}
|
|
789
|
+
// Wait before checking again - use shorter intervals for faster response
|
|
790
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
791
|
+
}
|
|
792
|
+
const elapsed = Date.now() - startTime;
|
|
793
|
+
throw new Error(`Timeout waiting for Kro instance ${instanceName} to be ready after ${elapsed}ms (timeout: ${timeout}ms). This usually means the Kro controller is not running or the RGD deployment failed. Check Kro controller logs: kubectl logs -n kro-system deployment/kro`);
|
|
794
|
+
}
|
|
795
|
+
/**
|
|
796
|
+
* Hydrate dynamic status fields by evaluating CEL expressions against live Kro resource data
|
|
797
|
+
*/
|
|
798
|
+
async hydrateDynamicStatusFields(instanceName, dynamicFields) {
|
|
799
|
+
const dynamicLogger = this.logger.child({ instanceName });
|
|
800
|
+
// Get the live custom resource to extract dynamic status fields
|
|
801
|
+
const apiVersion = this.schemaDefinition.apiVersion.includes('/')
|
|
802
|
+
? this.schemaDefinition.apiVersion
|
|
803
|
+
: `kro.run/${this.schemaDefinition.apiVersion}`;
|
|
804
|
+
const k8sApi = this.getKubeConfig().makeApiClient(k8s.KubernetesObjectApi);
|
|
805
|
+
const response = await k8sApi.read({
|
|
806
|
+
apiVersion,
|
|
807
|
+
kind: this.schemaDefinition.kind,
|
|
808
|
+
metadata: {
|
|
809
|
+
name: instanceName,
|
|
810
|
+
namespace: this.namespace,
|
|
811
|
+
},
|
|
812
|
+
});
|
|
813
|
+
const liveInstance = response.body;
|
|
814
|
+
if (!liveInstance.status) {
|
|
815
|
+
dynamicLogger.warn('No status found in live instance, returning empty dynamic fields');
|
|
816
|
+
return {};
|
|
817
|
+
}
|
|
818
|
+
// For now, return the live instance status directly
|
|
819
|
+
// In a full implementation, this would evaluate CEL expressions in dynamicFields
|
|
820
|
+
// against the live Kro resource data and return the evaluated results
|
|
821
|
+
// Extract only the fields that were marked as dynamic
|
|
822
|
+
const hydratedFields = {};
|
|
823
|
+
for (const [fieldName, _fieldValue] of Object.entries(dynamicFields)) {
|
|
824
|
+
if (liveInstance.status[fieldName] !== undefined) {
|
|
825
|
+
hydratedFields[fieldName] = liveInstance.status[fieldName];
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
return hydratedFields;
|
|
829
|
+
}
|
|
830
|
+
}
|
|
831
|
+
/**
|
|
832
|
+
* Create a KroResourceFactory instance
|
|
833
|
+
*/
|
|
834
|
+
export function createKroResourceFactory(name, resources, schemaDefinition, statusMappings, options = {}) {
|
|
835
|
+
return new KroResourceFactoryImpl(name, resources, schemaDefinition, statusMappings, options);
|
|
836
|
+
}
|
|
837
|
+
//# sourceMappingURL=kro-factory.js.map
|