kubeview-mcp 1.0.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/.prettierrc.json +11 -0
- package/CHANGELOG.md +55 -0
- package/LICENSE +21 -0
- package/README.md +251 -0
- package/RELEASE.md +154 -0
- package/TODO.md +0 -0
- package/bin/kubeview-mcp.js +274 -0
- package/bin/setup.js +368 -0
- package/dist/src/cli/cli.d.ts +3 -0
- package/dist/src/cli/cli.d.ts.map +1 -0
- package/dist/src/cli/cli.js +23 -0
- package/dist/src/cli/cli.js.map +1 -0
- package/dist/src/index.d.ts +8 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +45 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/kubernetes/BaseResourceOperations.d.ts +155 -0
- package/dist/src/kubernetes/BaseResourceOperations.d.ts.map +1 -0
- package/dist/src/kubernetes/BaseResourceOperations.js +136 -0
- package/dist/src/kubernetes/BaseResourceOperations.js.map +1 -0
- package/dist/src/kubernetes/CircuitBreaker.d.ts +182 -0
- package/dist/src/kubernetes/CircuitBreaker.d.ts.map +1 -0
- package/dist/src/kubernetes/CircuitBreaker.js +369 -0
- package/dist/src/kubernetes/CircuitBreaker.js.map +1 -0
- package/dist/src/kubernetes/ConnectionManager.d.ts +60 -0
- package/dist/src/kubernetes/ConnectionManager.d.ts.map +1 -0
- package/dist/src/kubernetes/ConnectionManager.js +77 -0
- package/dist/src/kubernetes/ConnectionManager.js.map +1 -0
- package/dist/src/kubernetes/ConnectionPool.d.ts +183 -0
- package/dist/src/kubernetes/ConnectionPool.d.ts.map +1 -0
- package/dist/src/kubernetes/ConnectionPool.js +437 -0
- package/dist/src/kubernetes/ConnectionPool.js.map +1 -0
- package/dist/src/kubernetes/ErrorHandler.d.ts +172 -0
- package/dist/src/kubernetes/ErrorHandler.d.ts.map +1 -0
- package/dist/src/kubernetes/ErrorHandler.js +328 -0
- package/dist/src/kubernetes/ErrorHandler.js.map +1 -0
- package/dist/src/kubernetes/ErrorHandling.d.ts +148 -0
- package/dist/src/kubernetes/ErrorHandling.d.ts.map +1 -0
- package/dist/src/kubernetes/ErrorHandling.js +304 -0
- package/dist/src/kubernetes/ErrorHandling.js.map +1 -0
- package/dist/src/kubernetes/KubernetesClient.d.ts +162 -0
- package/dist/src/kubernetes/KubernetesClient.d.ts.map +1 -0
- package/dist/src/kubernetes/KubernetesClient.js +382 -0
- package/dist/src/kubernetes/KubernetesClient.js.map +1 -0
- package/dist/src/kubernetes/ResourceOperations.d.ts +69 -0
- package/dist/src/kubernetes/ResourceOperations.d.ts.map +1 -0
- package/dist/src/kubernetes/ResourceOperations.js +99 -0
- package/dist/src/kubernetes/ResourceOperations.js.map +1 -0
- package/dist/src/kubernetes/RetryStrategy.d.ts +137 -0
- package/dist/src/kubernetes/RetryStrategy.d.ts.map +1 -0
- package/dist/src/kubernetes/RetryStrategy.js +277 -0
- package/dist/src/kubernetes/RetryStrategy.js.map +1 -0
- package/dist/src/kubernetes/RetryableOperation.d.ts +118 -0
- package/dist/src/kubernetes/RetryableOperation.d.ts.map +1 -0
- package/dist/src/kubernetes/RetryableOperation.js +233 -0
- package/dist/src/kubernetes/RetryableOperation.js.map +1 -0
- package/dist/src/kubernetes/index.d.ts +18 -0
- package/dist/src/kubernetes/index.d.ts.map +1 -0
- package/dist/src/kubernetes/index.js +28 -0
- package/dist/src/kubernetes/index.js.map +1 -0
- package/dist/src/kubernetes/resources/ConfigMapOperations.d.ts +60 -0
- package/dist/src/kubernetes/resources/ConfigMapOperations.d.ts.map +1 -0
- package/dist/src/kubernetes/resources/ConfigMapOperations.js +306 -0
- package/dist/src/kubernetes/resources/ConfigMapOperations.js.map +1 -0
- package/dist/src/kubernetes/resources/CustomResourceOperations.d.ts +55 -0
- package/dist/src/kubernetes/resources/CustomResourceOperations.d.ts.map +1 -0
- package/dist/src/kubernetes/resources/CustomResourceOperations.js +363 -0
- package/dist/src/kubernetes/resources/CustomResourceOperations.js.map +1 -0
- package/dist/src/kubernetes/resources/DeploymentOperations.d.ts +66 -0
- package/dist/src/kubernetes/resources/DeploymentOperations.d.ts.map +1 -0
- package/dist/src/kubernetes/resources/DeploymentOperations.js +234 -0
- package/dist/src/kubernetes/resources/DeploymentOperations.js.map +1 -0
- package/dist/src/kubernetes/resources/IngressOperations.d.ts +60 -0
- package/dist/src/kubernetes/resources/IngressOperations.d.ts.map +1 -0
- package/dist/src/kubernetes/resources/IngressOperations.js +224 -0
- package/dist/src/kubernetes/resources/IngressOperations.js.map +1 -0
- package/dist/src/kubernetes/resources/MetricOperations.d.ts +218 -0
- package/dist/src/kubernetes/resources/MetricOperations.d.ts.map +1 -0
- package/dist/src/kubernetes/resources/MetricOperations.js +893 -0
- package/dist/src/kubernetes/resources/MetricOperations.js.map +1 -0
- package/dist/src/kubernetes/resources/NamespaceOperations.d.ts +38 -0
- package/dist/src/kubernetes/resources/NamespaceOperations.d.ts.map +1 -0
- package/dist/src/kubernetes/resources/NamespaceOperations.js +101 -0
- package/dist/src/kubernetes/resources/NamespaceOperations.js.map +1 -0
- package/dist/src/kubernetes/resources/PersistentVolumeClaimOperations.d.ts +109 -0
- package/dist/src/kubernetes/resources/PersistentVolumeClaimOperations.d.ts.map +1 -0
- package/dist/src/kubernetes/resources/PersistentVolumeClaimOperations.js +383 -0
- package/dist/src/kubernetes/resources/PersistentVolumeClaimOperations.js.map +1 -0
- package/dist/src/kubernetes/resources/PersistentVolumeOperations.d.ts +97 -0
- package/dist/src/kubernetes/resources/PersistentVolumeOperations.d.ts.map +1 -0
- package/dist/src/kubernetes/resources/PersistentVolumeOperations.js +321 -0
- package/dist/src/kubernetes/resources/PersistentVolumeOperations.js.map +1 -0
- package/dist/src/kubernetes/resources/PodOperations.d.ts +99 -0
- package/dist/src/kubernetes/resources/PodOperations.d.ts.map +1 -0
- package/dist/src/kubernetes/resources/PodOperations.js +333 -0
- package/dist/src/kubernetes/resources/PodOperations.js.map +1 -0
- package/dist/src/kubernetes/resources/SecretOperations.d.ts +71 -0
- package/dist/src/kubernetes/resources/SecretOperations.d.ts.map +1 -0
- package/dist/src/kubernetes/resources/SecretOperations.js +254 -0
- package/dist/src/kubernetes/resources/SecretOperations.js.map +1 -0
- package/dist/src/kubernetes/resources/ServiceOperations.d.ts +64 -0
- package/dist/src/kubernetes/resources/ServiceOperations.d.ts.map +1 -0
- package/dist/src/kubernetes/resources/ServiceOperations.js +232 -0
- package/dist/src/kubernetes/resources/ServiceOperations.js.map +1 -0
- package/dist/src/kubernetes/utils/ResourceUtils.d.ts +238 -0
- package/dist/src/kubernetes/utils/ResourceUtils.d.ts.map +1 -0
- package/dist/src/kubernetes/utils/ResourceUtils.js +439 -0
- package/dist/src/kubernetes/utils/ResourceUtils.js.map +1 -0
- package/dist/src/plugins/ArgoCDToolsPlugin.d.ts +45 -0
- package/dist/src/plugins/ArgoCDToolsPlugin.d.ts.map +1 -0
- package/dist/src/plugins/ArgoCDToolsPlugin.js +155 -0
- package/dist/src/plugins/ArgoCDToolsPlugin.js.map +1 -0
- package/dist/src/plugins/ArgoToolsPlugin.d.ts +45 -0
- package/dist/src/plugins/ArgoToolsPlugin.d.ts.map +1 -0
- package/dist/src/plugins/ArgoToolsPlugin.js +149 -0
- package/dist/src/plugins/ArgoToolsPlugin.js.map +1 -0
- package/dist/src/plugins/HelmToolsPlugin.d.ts +41 -0
- package/dist/src/plugins/HelmToolsPlugin.d.ts.map +1 -0
- package/dist/src/plugins/HelmToolsPlugin.js +146 -0
- package/dist/src/plugins/HelmToolsPlugin.js.map +1 -0
- package/dist/src/plugins/KubernetesToolsPlugin.d.ts +44 -0
- package/dist/src/plugins/KubernetesToolsPlugin.d.ts.map +1 -0
- package/dist/src/plugins/KubernetesToolsPlugin.js +159 -0
- package/dist/src/plugins/KubernetesToolsPlugin.js.map +1 -0
- package/dist/src/plugins/SamplePlugin.d.ts +12 -0
- package/dist/src/plugins/SamplePlugin.d.ts.map +1 -0
- package/dist/src/plugins/SamplePlugin.js +51 -0
- package/dist/src/plugins/SamplePlugin.js.map +1 -0
- package/dist/src/plugins/index.d.ts +5 -0
- package/dist/src/plugins/index.d.ts.map +1 -0
- package/dist/src/plugins/index.js +5 -0
- package/dist/src/plugins/index.js.map +1 -0
- package/dist/src/server/MCPServer.d.ts +93 -0
- package/dist/src/server/MCPServer.d.ts.map +1 -0
- package/dist/src/server/MCPServer.js +398 -0
- package/dist/src/server/MCPServer.js.map +1 -0
- package/dist/src/tools/argo/ArgoCronListTool.d.ts +10 -0
- package/dist/src/tools/argo/ArgoCronListTool.d.ts.map +1 -0
- package/dist/src/tools/argo/ArgoCronListTool.js +70 -0
- package/dist/src/tools/argo/ArgoCronListTool.js.map +1 -0
- package/dist/src/tools/argo/ArgoGetTool.d.ts +10 -0
- package/dist/src/tools/argo/ArgoGetTool.d.ts.map +1 -0
- package/dist/src/tools/argo/ArgoGetTool.js +80 -0
- package/dist/src/tools/argo/ArgoGetTool.js.map +1 -0
- package/dist/src/tools/argo/ArgoListTool.d.ts +10 -0
- package/dist/src/tools/argo/ArgoListTool.d.ts.map +1 -0
- package/dist/src/tools/argo/ArgoListTool.js +133 -0
- package/dist/src/tools/argo/ArgoListTool.js.map +1 -0
- package/dist/src/tools/argo/ArgoLogsTool.d.ts +10 -0
- package/dist/src/tools/argo/ArgoLogsTool.d.ts.map +1 -0
- package/dist/src/tools/argo/ArgoLogsTool.js +117 -0
- package/dist/src/tools/argo/ArgoLogsTool.js.map +1 -0
- package/dist/src/tools/argo/BaseTool.d.ts +60 -0
- package/dist/src/tools/argo/BaseTool.d.ts.map +1 -0
- package/dist/src/tools/argo/BaseTool.js +51 -0
- package/dist/src/tools/argo/BaseTool.js.map +1 -0
- package/dist/src/tools/argo/index.d.ts +7 -0
- package/dist/src/tools/argo/index.d.ts.map +1 -0
- package/dist/src/tools/argo/index.js +6 -0
- package/dist/src/tools/argo/index.js.map +1 -0
- package/dist/src/tools/argocd/ArgoCDAppGetTool.d.ts +10 -0
- package/dist/src/tools/argocd/ArgoCDAppGetTool.d.ts.map +1 -0
- package/dist/src/tools/argocd/ArgoCDAppGetTool.js +97 -0
- package/dist/src/tools/argocd/ArgoCDAppGetTool.js.map +1 -0
- package/dist/src/tools/argocd/ArgoCDAppHistoryTool.d.ts +10 -0
- package/dist/src/tools/argocd/ArgoCDAppHistoryTool.d.ts.map +1 -0
- package/dist/src/tools/argocd/ArgoCDAppHistoryTool.js +80 -0
- package/dist/src/tools/argocd/ArgoCDAppHistoryTool.js.map +1 -0
- package/dist/src/tools/argocd/ArgoCDAppListTool.d.ts +10 -0
- package/dist/src/tools/argocd/ArgoCDAppListTool.d.ts.map +1 -0
- package/dist/src/tools/argocd/ArgoCDAppListTool.js +128 -0
- package/dist/src/tools/argocd/ArgoCDAppListTool.js.map +1 -0
- package/dist/src/tools/argocd/ArgoCDAppLogsTool.d.ts +10 -0
- package/dist/src/tools/argocd/ArgoCDAppLogsTool.d.ts.map +1 -0
- package/dist/src/tools/argocd/ArgoCDAppLogsTool.js +143 -0
- package/dist/src/tools/argocd/ArgoCDAppLogsTool.js.map +1 -0
- package/dist/src/tools/argocd/ArgoCDAppResourcesTool.d.ts +10 -0
- package/dist/src/tools/argocd/ArgoCDAppResourcesTool.d.ts.map +1 -0
- package/dist/src/tools/argocd/ArgoCDAppResourcesTool.js +123 -0
- package/dist/src/tools/argocd/ArgoCDAppResourcesTool.js.map +1 -0
- package/dist/src/tools/argocd/BaseTool.d.ts +71 -0
- package/dist/src/tools/argocd/BaseTool.d.ts.map +1 -0
- package/dist/src/tools/argocd/BaseTool.js +62 -0
- package/dist/src/tools/argocd/BaseTool.js.map +1 -0
- package/dist/src/tools/argocd/index.d.ts +8 -0
- package/dist/src/tools/argocd/index.d.ts.map +1 -0
- package/dist/src/tools/argocd/index.js +7 -0
- package/dist/src/tools/argocd/index.js.map +1 -0
- package/dist/src/tools/helm/BaseTool.d.ts +51 -0
- package/dist/src/tools/helm/BaseTool.d.ts.map +1 -0
- package/dist/src/tools/helm/BaseTool.js +42 -0
- package/dist/src/tools/helm/BaseTool.js.map +1 -0
- package/dist/src/tools/helm/HelmGetHooksTool.d.ts +10 -0
- package/dist/src/tools/helm/HelmGetHooksTool.d.ts.map +1 -0
- package/dist/src/tools/helm/HelmGetHooksTool.js +38 -0
- package/dist/src/tools/helm/HelmGetHooksTool.js.map +1 -0
- package/dist/src/tools/helm/HelmGetManifestTool.d.ts +10 -0
- package/dist/src/tools/helm/HelmGetManifestTool.d.ts.map +1 -0
- package/dist/src/tools/helm/HelmGetManifestTool.js +38 -0
- package/dist/src/tools/helm/HelmGetManifestTool.js.map +1 -0
- package/dist/src/tools/helm/HelmGetNotesTool.d.ts +10 -0
- package/dist/src/tools/helm/HelmGetNotesTool.d.ts.map +1 -0
- package/dist/src/tools/helm/HelmGetNotesTool.js +38 -0
- package/dist/src/tools/helm/HelmGetNotesTool.js.map +1 -0
- package/dist/src/tools/helm/HelmGetResourcesTool.d.ts +13 -0
- package/dist/src/tools/helm/HelmGetResourcesTool.d.ts.map +1 -0
- package/dist/src/tools/helm/HelmGetResourcesTool.js +124 -0
- package/dist/src/tools/helm/HelmGetResourcesTool.js.map +1 -0
- package/dist/src/tools/helm/HelmGetValuesTool.d.ts +10 -0
- package/dist/src/tools/helm/HelmGetValuesTool.d.ts.map +1 -0
- package/dist/src/tools/helm/HelmGetValuesTool.js +54 -0
- package/dist/src/tools/helm/HelmGetValuesTool.js.map +1 -0
- package/dist/src/tools/helm/HelmHistoryTool.d.ts +10 -0
- package/dist/src/tools/helm/HelmHistoryTool.d.ts.map +1 -0
- package/dist/src/tools/helm/HelmHistoryTool.js +49 -0
- package/dist/src/tools/helm/HelmHistoryTool.js.map +1 -0
- package/dist/src/tools/helm/HelmListTool.d.ts +10 -0
- package/dist/src/tools/helm/HelmListTool.d.ts.map +1 -0
- package/dist/src/tools/helm/HelmListTool.js +107 -0
- package/dist/src/tools/helm/HelmListTool.js.map +1 -0
- package/dist/src/tools/helm/HelmListWithResourcesTool.d.ts +14 -0
- package/dist/src/tools/helm/HelmListWithResourcesTool.d.ts.map +1 -0
- package/dist/src/tools/helm/HelmListWithResourcesTool.js +175 -0
- package/dist/src/tools/helm/HelmListWithResourcesTool.js.map +1 -0
- package/dist/src/tools/helm/HelmStatusTool.d.ts +10 -0
- package/dist/src/tools/helm/HelmStatusTool.d.ts.map +1 -0
- package/dist/src/tools/helm/HelmStatusTool.js +54 -0
- package/dist/src/tools/helm/HelmStatusTool.js.map +1 -0
- package/dist/src/tools/helm/index.d.ts +12 -0
- package/dist/src/tools/helm/index.d.ts.map +1 -0
- package/dist/src/tools/helm/index.js +11 -0
- package/dist/src/tools/helm/index.js.map +1 -0
- package/dist/src/tools/kubernetes/BaseTool.d.ts +48 -0
- package/dist/src/tools/kubernetes/BaseTool.d.ts.map +1 -0
- package/dist/src/tools/kubernetes/BaseTool.js +55 -0
- package/dist/src/tools/kubernetes/BaseTool.js.map +1 -0
- package/dist/src/tools/kubernetes/GetConfigMapTool.d.ts +11 -0
- package/dist/src/tools/kubernetes/GetConfigMapTool.d.ts.map +1 -0
- package/dist/src/tools/kubernetes/GetConfigMapTool.js +28 -0
- package/dist/src/tools/kubernetes/GetConfigMapTool.js.map +1 -0
- package/dist/src/tools/kubernetes/GetContainerLogsTool.d.ts +15 -0
- package/dist/src/tools/kubernetes/GetContainerLogsTool.d.ts.map +1 -0
- package/dist/src/tools/kubernetes/GetContainerLogsTool.js +119 -0
- package/dist/src/tools/kubernetes/GetContainerLogsTool.js.map +1 -0
- package/dist/src/tools/kubernetes/GetDeploymentsTool.d.ts +11 -0
- package/dist/src/tools/kubernetes/GetDeploymentsTool.d.ts.map +1 -0
- package/dist/src/tools/kubernetes/GetDeploymentsTool.js +30 -0
- package/dist/src/tools/kubernetes/GetDeploymentsTool.js.map +1 -0
- package/dist/src/tools/kubernetes/GetEventsTool.d.ts +11 -0
- package/dist/src/tools/kubernetes/GetEventsTool.d.ts.map +1 -0
- package/dist/src/tools/kubernetes/GetEventsTool.js +123 -0
- package/dist/src/tools/kubernetes/GetEventsTool.js.map +1 -0
- package/dist/src/tools/kubernetes/GetIngressTool.d.ts +11 -0
- package/dist/src/tools/kubernetes/GetIngressTool.d.ts.map +1 -0
- package/dist/src/tools/kubernetes/GetIngressTool.js +35 -0
- package/dist/src/tools/kubernetes/GetIngressTool.js.map +1 -0
- package/dist/src/tools/kubernetes/GetMetricsTool.d.ts +11 -0
- package/dist/src/tools/kubernetes/GetMetricsTool.d.ts.map +1 -0
- package/dist/src/tools/kubernetes/GetMetricsTool.js +40 -0
- package/dist/src/tools/kubernetes/GetMetricsTool.js.map +1 -0
- package/dist/src/tools/kubernetes/GetNamespacesTool.d.ts +11 -0
- package/dist/src/tools/kubernetes/GetNamespacesTool.d.ts.map +1 -0
- package/dist/src/tools/kubernetes/GetNamespacesTool.js +33 -0
- package/dist/src/tools/kubernetes/GetNamespacesTool.js.map +1 -0
- package/dist/src/tools/kubernetes/GetPersistentVolumeClaimsTool.d.ts +11 -0
- package/dist/src/tools/kubernetes/GetPersistentVolumeClaimsTool.d.ts.map +1 -0
- package/dist/src/tools/kubernetes/GetPersistentVolumeClaimsTool.js +92 -0
- package/dist/src/tools/kubernetes/GetPersistentVolumeClaimsTool.js.map +1 -0
- package/dist/src/tools/kubernetes/GetPersistentVolumesTool.d.ts +11 -0
- package/dist/src/tools/kubernetes/GetPersistentVolumesTool.d.ts.map +1 -0
- package/dist/src/tools/kubernetes/GetPersistentVolumesTool.js +88 -0
- package/dist/src/tools/kubernetes/GetPersistentVolumesTool.js.map +1 -0
- package/dist/src/tools/kubernetes/GetPodMetricsTool.d.ts +11 -0
- package/dist/src/tools/kubernetes/GetPodMetricsTool.d.ts.map +1 -0
- package/dist/src/tools/kubernetes/GetPodMetricsTool.js +100 -0
- package/dist/src/tools/kubernetes/GetPodMetricsTool.js.map +1 -0
- package/dist/src/tools/kubernetes/GetPodsTool.d.ts +11 -0
- package/dist/src/tools/kubernetes/GetPodsTool.d.ts.map +1 -0
- package/dist/src/tools/kubernetes/GetPodsTool.js +35 -0
- package/dist/src/tools/kubernetes/GetPodsTool.js.map +1 -0
- package/dist/src/tools/kubernetes/GetResourceTool.d.ts +12 -0
- package/dist/src/tools/kubernetes/GetResourceTool.d.ts.map +1 -0
- package/dist/src/tools/kubernetes/GetResourceTool.js +79 -0
- package/dist/src/tools/kubernetes/GetResourceTool.js.map +1 -0
- package/dist/src/tools/kubernetes/GetSecretsTool.d.ts +11 -0
- package/dist/src/tools/kubernetes/GetSecretsTool.d.ts.map +1 -0
- package/dist/src/tools/kubernetes/GetSecretsTool.js +49 -0
- package/dist/src/tools/kubernetes/GetSecretsTool.js.map +1 -0
- package/dist/src/tools/kubernetes/GetServicesTool.d.ts +11 -0
- package/dist/src/tools/kubernetes/GetServicesTool.d.ts.map +1 -0
- package/dist/src/tools/kubernetes/GetServicesTool.js +35 -0
- package/dist/src/tools/kubernetes/GetServicesTool.js.map +1 -0
- package/dist/src/tools/kubernetes/index.d.ts +17 -0
- package/dist/src/tools/kubernetes/index.d.ts.map +1 -0
- package/dist/src/tools/kubernetes/index.js +16 -0
- package/dist/src/tools/kubernetes/index.js.map +1 -0
- package/dist/src/utils/CliUtils.d.ts +24 -0
- package/dist/src/utils/CliUtils.d.ts.map +1 -0
- package/dist/src/utils/CliUtils.js +159 -0
- package/dist/src/utils/CliUtils.js.map +1 -0
- package/dist/tests/__mocks__/@kubernetes/client-node.d.ts +34 -0
- package/dist/tests/__mocks__/@kubernetes/client-node.d.ts.map +1 -0
- package/dist/tests/__mocks__/@kubernetes/client-node.js +20 -0
- package/dist/tests/__mocks__/@kubernetes/client-node.js.map +1 -0
- package/dist/tests/argo/ArgoGetTool.test.d.ts +2 -0
- package/dist/tests/argo/ArgoGetTool.test.d.ts.map +1 -0
- package/dist/tests/argo/ArgoGetTool.test.js +141 -0
- package/dist/tests/argo/ArgoGetTool.test.js.map +1 -0
- package/dist/tests/helm/BaseTool.test.d.ts +2 -0
- package/dist/tests/helm/BaseTool.test.d.ts.map +1 -0
- package/dist/tests/helm/BaseTool.test.js +241 -0
- package/dist/tests/helm/BaseTool.test.js.map +1 -0
- package/dist/tests/index.test.d.ts +2 -0
- package/dist/tests/index.test.d.ts.map +1 -0
- package/dist/tests/index.test.js +7 -0
- package/dist/tests/index.test.js.map +1 -0
- package/dist/tests/kubernetes/ConfigMapOperations.test.d.ts +2 -0
- package/dist/tests/kubernetes/ConfigMapOperations.test.d.ts.map +1 -0
- package/dist/tests/kubernetes/ConfigMapOperations.test.js +460 -0
- package/dist/tests/kubernetes/ConfigMapOperations.test.js.map +1 -0
- package/dist/tests/kubernetes/ConnectionManager.test.d.ts +2 -0
- package/dist/tests/kubernetes/ConnectionManager.test.d.ts.map +1 -0
- package/dist/tests/kubernetes/ConnectionManager.test.js +97 -0
- package/dist/tests/kubernetes/ConnectionManager.test.js.map +1 -0
- package/dist/tests/kubernetes/ConnectionPool.test.d.ts +2 -0
- package/dist/tests/kubernetes/ConnectionPool.test.d.ts.map +1 -0
- package/dist/tests/kubernetes/ConnectionPool.test.js +328 -0
- package/dist/tests/kubernetes/ConnectionPool.test.js.map +1 -0
- package/dist/tests/kubernetes/DeploymentOperations.test.d.ts +2 -0
- package/dist/tests/kubernetes/DeploymentOperations.test.d.ts.map +1 -0
- package/dist/tests/kubernetes/DeploymentOperations.test.js +196 -0
- package/dist/tests/kubernetes/DeploymentOperations.test.js.map +1 -0
- package/dist/tests/kubernetes/ErrorHandling.test.d.ts +2 -0
- package/dist/tests/kubernetes/ErrorHandling.test.d.ts.map +1 -0
- package/dist/tests/kubernetes/ErrorHandling.test.js +329 -0
- package/dist/tests/kubernetes/ErrorHandling.test.js.map +1 -0
- package/dist/tests/kubernetes/GetPodMetricsTool.test.d.ts +2 -0
- package/dist/tests/kubernetes/GetPodMetricsTool.test.d.ts.map +1 -0
- package/dist/tests/kubernetes/GetPodMetricsTool.test.js +150 -0
- package/dist/tests/kubernetes/GetPodMetricsTool.test.js.map +1 -0
- package/dist/tests/kubernetes/KubernetesClient.test.d.ts +2 -0
- package/dist/tests/kubernetes/KubernetesClient.test.d.ts.map +1 -0
- package/dist/tests/kubernetes/KubernetesClient.test.js +371 -0
- package/dist/tests/kubernetes/KubernetesClient.test.js.map +1 -0
- package/dist/tests/kubernetes/MetricOperations.parsing.test.d.ts +2 -0
- package/dist/tests/kubernetes/MetricOperations.parsing.test.d.ts.map +1 -0
- package/dist/tests/kubernetes/MetricOperations.parsing.test.js +49 -0
- package/dist/tests/kubernetes/MetricOperations.parsing.test.js.map +1 -0
- package/dist/tests/kubernetes/NamespaceOperations.test.d.ts +2 -0
- package/dist/tests/kubernetes/NamespaceOperations.test.d.ts.map +1 -0
- package/dist/tests/kubernetes/NamespaceOperations.test.js +115 -0
- package/dist/tests/kubernetes/NamespaceOperations.test.js.map +1 -0
- package/dist/tests/kubernetes/PodOperations.test.d.ts +2 -0
- package/dist/tests/kubernetes/PodOperations.test.d.ts.map +1 -0
- package/dist/tests/kubernetes/PodOperations.test.js +209 -0
- package/dist/tests/kubernetes/PodOperations.test.js.map +1 -0
- package/dist/tests/kubernetes/RetryStrategy.test.d.ts +2 -0
- package/dist/tests/kubernetes/RetryStrategy.test.d.ts.map +1 -0
- package/dist/tests/kubernetes/RetryStrategy.test.js +419 -0
- package/dist/tests/kubernetes/RetryStrategy.test.js.map +1 -0
- package/dist/tests/kubernetes/ServiceOperations.test.d.ts +2 -0
- package/dist/tests/kubernetes/ServiceOperations.test.d.ts.map +1 -0
- package/dist/tests/kubernetes/ServiceOperations.test.js +159 -0
- package/dist/tests/kubernetes/ServiceOperations.test.js.map +1 -0
- package/dist/tests/plugins/KubernetesToolsPlugin.test.d.ts +2 -0
- package/dist/tests/plugins/KubernetesToolsPlugin.test.d.ts.map +1 -0
- package/dist/tests/plugins/KubernetesToolsPlugin.test.js +153 -0
- package/dist/tests/plugins/KubernetesToolsPlugin.test.js.map +1 -0
- package/dist/tests/server/MCPServer.integration.test.d.ts +2 -0
- package/dist/tests/server/MCPServer.integration.test.d.ts.map +1 -0
- package/dist/tests/server/MCPServer.integration.test.js +244 -0
- package/dist/tests/server/MCPServer.integration.test.js.map +1 -0
- package/dist/tests/server/MCPServer.test.d.ts +2 -0
- package/dist/tests/server/MCPServer.test.d.ts.map +1 -0
- package/dist/tests/server/MCPServer.test.js +257 -0
- package/dist/tests/server/MCPServer.test.js.map +1 -0
- package/package.json +85 -0
- package/src/cli/cli.ts +25 -0
- package/src/cli/run-command.js +391 -0
- package/src/index.ts +46 -0
- package/src/kubernetes/BaseResourceOperations.ts +286 -0
- package/src/kubernetes/CircuitBreaker.ts +485 -0
- package/src/kubernetes/ConnectionManager.ts +114 -0
- package/src/kubernetes/ConnectionPool.ts +551 -0
- package/src/kubernetes/ErrorHandler.ts +436 -0
- package/src/kubernetes/ErrorHandling.ts +401 -0
- package/src/kubernetes/KubernetesClient.ts +500 -0
- package/src/kubernetes/README.md +349 -0
- package/src/kubernetes/ResourceOperations.ts +116 -0
- package/src/kubernetes/RetryStrategy.ts +365 -0
- package/src/kubernetes/RetryableOperation.ts +313 -0
- package/src/kubernetes/docs/ResourceOperations.md +606 -0
- package/src/kubernetes/index.ts +116 -0
- package/src/kubernetes/resources/ConfigMapOperations.ts +367 -0
- package/src/kubernetes/resources/CustomResourceOperations.ts +392 -0
- package/src/kubernetes/resources/DeploymentOperations.ts +294 -0
- package/src/kubernetes/resources/IngressOperations.ts +277 -0
- package/src/kubernetes/resources/MetricOperations.ts +1159 -0
- package/src/kubernetes/resources/NamespaceOperations.ts +129 -0
- package/src/kubernetes/resources/PersistentVolumeClaimOperations.ts +516 -0
- package/src/kubernetes/resources/PersistentVolumeOperations.ts +438 -0
- package/src/kubernetes/resources/PodOperations.ts +417 -0
- package/src/kubernetes/resources/SecretOperations.ts +304 -0
- package/src/kubernetes/resources/ServiceOperations.ts +283 -0
- package/src/kubernetes/utils/ResourceUtils.ts +553 -0
- package/src/plugins/ArgoCDToolsPlugin.ts +189 -0
- package/src/plugins/ArgoToolsPlugin.ts +180 -0
- package/src/plugins/HelmToolsPlugin.ts +180 -0
- package/src/plugins/KubernetesToolsPlugin.ts +198 -0
- package/src/plugins/SamplePlugin.ts +60 -0
- package/src/plugins/index.ts +4 -0
- package/src/server/MCPServer.ts +500 -0
- package/src/tools/argo/ArgoCronListTool.ts +78 -0
- package/src/tools/argo/ArgoGetTool.ts +91 -0
- package/src/tools/argo/ArgoListTool.ts +143 -0
- package/src/tools/argo/ArgoLogsTool.ts +131 -0
- package/src/tools/argo/BaseTool.ts +69 -0
- package/src/tools/argo/index.ts +6 -0
- package/src/tools/argocd/ArgoCDAppGetTool.ts +109 -0
- package/src/tools/argocd/ArgoCDAppHistoryTool.ts +91 -0
- package/src/tools/argocd/ArgoCDAppListTool.ts +144 -0
- package/src/tools/argocd/ArgoCDAppLogsTool.ts +162 -0
- package/src/tools/argocd/ArgoCDAppResourcesTool.ts +139 -0
- package/src/tools/argocd/BaseTool.ts +83 -0
- package/src/tools/argocd/index.ts +7 -0
- package/src/tools/helm/BaseTool.ts +60 -0
- package/src/tools/helm/HelmGetHooksTool.ts +44 -0
- package/src/tools/helm/HelmGetManifestTool.ts +44 -0
- package/src/tools/helm/HelmGetNotesTool.ts +44 -0
- package/src/tools/helm/HelmGetResourcesTool.ts +140 -0
- package/src/tools/helm/HelmGetValuesTool.ts +62 -0
- package/src/tools/helm/HelmHistoryTool.ts +56 -0
- package/src/tools/helm/HelmListTool.ts +107 -0
- package/src/tools/helm/HelmListWithResourcesTool.ts +194 -0
- package/src/tools/helm/HelmStatusTool.ts +62 -0
- package/src/tools/helm/index.ts +11 -0
- package/src/tools/kubernetes/BaseTool.ts +76 -0
- package/src/tools/kubernetes/GetConfigMapTool.ts +33 -0
- package/src/tools/kubernetes/GetContainerLogsTool.ts +140 -0
- package/src/tools/kubernetes/GetDeploymentsTool.ts +33 -0
- package/src/tools/kubernetes/GetEventsTool.ts +133 -0
- package/src/tools/kubernetes/GetIngressTool.ts +39 -0
- package/src/tools/kubernetes/GetMetricsTool.ts +53 -0
- package/src/tools/kubernetes/GetNamespacesTool.ts +36 -0
- package/src/tools/kubernetes/GetPersistentVolumeClaimsTool.ts +113 -0
- package/src/tools/kubernetes/GetPersistentVolumesTool.ts +107 -0
- package/src/tools/kubernetes/GetPodMetricsTool.ts +113 -0
- package/src/tools/kubernetes/GetPodsTool.ts +39 -0
- package/src/tools/kubernetes/GetResourceTool.ts +90 -0
- package/src/tools/kubernetes/GetSecretsTool.ts +55 -0
- package/src/tools/kubernetes/GetServicesTool.ts +39 -0
- package/src/tools/kubernetes/index.ts +16 -0
- package/src/utils/CliUtils.ts +207 -0
- package/tsconfig.json +36 -0
|
@@ -0,0 +1,485 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Circuit Breaker Module
|
|
3
|
+
*
|
|
4
|
+
* Implements the circuit breaker pattern for fault tolerance in distributed systems.
|
|
5
|
+
* Prevents cascading failures by temporarily blocking requests to failing services.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { Logger } from 'winston';
|
|
9
|
+
import { EventEmitter } from 'events';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Circuit breaker states
|
|
13
|
+
*/
|
|
14
|
+
export enum CircuitState {
|
|
15
|
+
CLOSED = 'CLOSED', // Normal operation, requests pass through
|
|
16
|
+
OPEN = 'OPEN', // Circuit broken, requests blocked
|
|
17
|
+
HALF_OPEN = 'HALF_OPEN', // Testing if service recovered
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Circuit breaker configuration
|
|
22
|
+
*/
|
|
23
|
+
export interface CircuitBreakerConfig {
|
|
24
|
+
/** Name of the circuit for identification */
|
|
25
|
+
name: string;
|
|
26
|
+
/** Number of failures before opening circuit */
|
|
27
|
+
failureThreshold: number;
|
|
28
|
+
/** Success threshold to close circuit from half-open */
|
|
29
|
+
successThreshold: number;
|
|
30
|
+
/** Time window for counting failures (ms) */
|
|
31
|
+
failureCountWindow: number;
|
|
32
|
+
/** Time to wait before attempting recovery (ms) */
|
|
33
|
+
resetTimeout: number;
|
|
34
|
+
/** Percentage of requests to fail before opening (0-100) */
|
|
35
|
+
failureRateThreshold?: number;
|
|
36
|
+
/** Minimum number of requests before applying rate threshold */
|
|
37
|
+
volumeThreshold?: number;
|
|
38
|
+
/** Optional timeout for operations (ms) */
|
|
39
|
+
operationTimeout?: number;
|
|
40
|
+
/** Function to determine if an error counts as failure */
|
|
41
|
+
isFailure?: (error: any) => boolean;
|
|
42
|
+
/** Fallback function when circuit is open */
|
|
43
|
+
fallback?: <T>() => T | Promise<T>;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Default circuit breaker configuration
|
|
48
|
+
*/
|
|
49
|
+
export const DEFAULT_CIRCUIT_CONFIG: Omit<CircuitBreakerConfig, 'name'> = {
|
|
50
|
+
failureThreshold: 5,
|
|
51
|
+
successThreshold: 2,
|
|
52
|
+
failureCountWindow: 60000, // 1 minute
|
|
53
|
+
resetTimeout: 30000, // 30 seconds
|
|
54
|
+
failureRateThreshold: 50, // 50%
|
|
55
|
+
volumeThreshold: 10,
|
|
56
|
+
operationTimeout: 10000, // 10 seconds
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Circuit breaker statistics
|
|
61
|
+
*/
|
|
62
|
+
export interface CircuitStats {
|
|
63
|
+
state: CircuitState;
|
|
64
|
+
failures: number;
|
|
65
|
+
successes: number;
|
|
66
|
+
totalCalls: number;
|
|
67
|
+
lastFailureTime?: Date;
|
|
68
|
+
lastSuccessTime?: Date;
|
|
69
|
+
lastStateChange: Date;
|
|
70
|
+
consecutiveSuccesses: number;
|
|
71
|
+
consecutiveFailures: number;
|
|
72
|
+
failureRate: number;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Request tracking for sliding window
|
|
77
|
+
*/
|
|
78
|
+
interface RequestRecord {
|
|
79
|
+
timestamp: number;
|
|
80
|
+
success: boolean;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Circuit breaker implementation
|
|
85
|
+
*/
|
|
86
|
+
export class CircuitBreaker extends EventEmitter {
|
|
87
|
+
private state: CircuitState = CircuitState.CLOSED;
|
|
88
|
+
private readonly config: CircuitBreakerConfig;
|
|
89
|
+
private readonly logger?: Logger;
|
|
90
|
+
|
|
91
|
+
private stats: CircuitStats;
|
|
92
|
+
private resetTimer?: NodeJS.Timeout;
|
|
93
|
+
private readonly requestHistory: RequestRecord[] = [];
|
|
94
|
+
private lastStateChangeTime: Date = new Date();
|
|
95
|
+
|
|
96
|
+
constructor(config: CircuitBreakerConfig, logger?: Logger) {
|
|
97
|
+
super();
|
|
98
|
+
this.config = { ...DEFAULT_CIRCUIT_CONFIG, ...config };
|
|
99
|
+
this.logger = logger;
|
|
100
|
+
|
|
101
|
+
this.stats = this.initializeStats();
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Execute an operation through the circuit breaker
|
|
106
|
+
*/
|
|
107
|
+
async execute<T>(operation: () => Promise<T>): Promise<T> {
|
|
108
|
+
// Check if circuit is open
|
|
109
|
+
if (this.state === CircuitState.OPEN) {
|
|
110
|
+
this.logger?.warn(`Circuit breaker '${this.config.name}' is OPEN, rejecting request`);
|
|
111
|
+
this.emit('fallback');
|
|
112
|
+
|
|
113
|
+
if (this.config.fallback) {
|
|
114
|
+
return this.config.fallback<T>();
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
throw new Error(`Circuit breaker '${this.config.name}' is OPEN`);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Record attempt
|
|
121
|
+
this.stats.totalCalls++;
|
|
122
|
+
|
|
123
|
+
try {
|
|
124
|
+
// Execute with timeout if configured
|
|
125
|
+
const result = await this.executeWithTimeout(operation);
|
|
126
|
+
|
|
127
|
+
// Record success
|
|
128
|
+
this.recordSuccess();
|
|
129
|
+
this.emit('success', result);
|
|
130
|
+
|
|
131
|
+
return result;
|
|
132
|
+
} catch (error) {
|
|
133
|
+
// Check if error should be counted as failure
|
|
134
|
+
if (this.shouldCountAsFailure(error)) {
|
|
135
|
+
this.recordFailure();
|
|
136
|
+
this.emit('failure', error);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
throw error;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Get current circuit statistics
|
|
145
|
+
*/
|
|
146
|
+
getStats(): CircuitStats {
|
|
147
|
+
return {
|
|
148
|
+
...this.stats,
|
|
149
|
+
state: this.state,
|
|
150
|
+
failureRate: this.calculateFailureRate(),
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Get current state
|
|
156
|
+
*/
|
|
157
|
+
getState(): CircuitState {
|
|
158
|
+
return this.state;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Manually reset the circuit breaker
|
|
163
|
+
*/
|
|
164
|
+
reset(): void {
|
|
165
|
+
this.logger?.info(`Manually resetting circuit breaker '${this.config.name}'`);
|
|
166
|
+
this.transition(CircuitState.CLOSED);
|
|
167
|
+
this.stats = this.initializeStats();
|
|
168
|
+
this.requestHistory.length = 0;
|
|
169
|
+
this.clearResetTimer();
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Force open the circuit
|
|
174
|
+
*/
|
|
175
|
+
open(): void {
|
|
176
|
+
this.logger?.warn(`Manually opening circuit breaker '${this.config.name}'`);
|
|
177
|
+
this.transition(CircuitState.OPEN);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Initialize statistics
|
|
182
|
+
*/
|
|
183
|
+
private initializeStats(): CircuitStats {
|
|
184
|
+
return {
|
|
185
|
+
state: this.state,
|
|
186
|
+
failures: 0,
|
|
187
|
+
successes: 0,
|
|
188
|
+
totalCalls: 0,
|
|
189
|
+
lastStateChange: new Date(),
|
|
190
|
+
consecutiveSuccesses: 0,
|
|
191
|
+
consecutiveFailures: 0,
|
|
192
|
+
failureRate: 0,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Execute operation with timeout
|
|
198
|
+
*/
|
|
199
|
+
private async executeWithTimeout<T>(operation: () => Promise<T>): Promise<T> {
|
|
200
|
+
if (!this.config.operationTimeout) {
|
|
201
|
+
return operation();
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
return Promise.race([
|
|
205
|
+
operation(),
|
|
206
|
+
new Promise<T>((_, reject) => {
|
|
207
|
+
setTimeout(() => {
|
|
208
|
+
this.emit('timeout');
|
|
209
|
+
reject(new Error(`Operation timed out after ${this.config.operationTimeout}ms`));
|
|
210
|
+
}, this.config.operationTimeout);
|
|
211
|
+
}),
|
|
212
|
+
]);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Record successful operation
|
|
217
|
+
*/
|
|
218
|
+
private recordSuccess(): void {
|
|
219
|
+
this.stats.successes++;
|
|
220
|
+
this.stats.consecutiveSuccesses++;
|
|
221
|
+
this.stats.consecutiveFailures = 0;
|
|
222
|
+
this.stats.lastSuccessTime = new Date();
|
|
223
|
+
|
|
224
|
+
// Add to history
|
|
225
|
+
this.addToHistory(true);
|
|
226
|
+
|
|
227
|
+
// Handle state transitions
|
|
228
|
+
if (this.state === CircuitState.HALF_OPEN) {
|
|
229
|
+
if (this.stats.consecutiveSuccesses >= this.config.successThreshold) {
|
|
230
|
+
this.logger?.info(
|
|
231
|
+
`Circuit breaker '${this.config.name}' closing after ${this.stats.consecutiveSuccesses} successful attempts`,
|
|
232
|
+
);
|
|
233
|
+
this.transition(CircuitState.CLOSED);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Record failed operation
|
|
240
|
+
*/
|
|
241
|
+
private recordFailure(): void {
|
|
242
|
+
this.stats.failures++;
|
|
243
|
+
this.stats.consecutiveFailures++;
|
|
244
|
+
this.stats.consecutiveSuccesses = 0;
|
|
245
|
+
this.stats.lastFailureTime = new Date();
|
|
246
|
+
|
|
247
|
+
// Add to history
|
|
248
|
+
this.addToHistory(false);
|
|
249
|
+
|
|
250
|
+
// Check if we should open the circuit
|
|
251
|
+
if (this.state === CircuitState.CLOSED || this.state === CircuitState.HALF_OPEN) {
|
|
252
|
+
if (this.shouldOpenCircuit()) {
|
|
253
|
+
this.logger?.warn(
|
|
254
|
+
`Circuit breaker '${this.config.name}' opening after ${this.stats.consecutiveFailures} failures`,
|
|
255
|
+
);
|
|
256
|
+
this.transition(CircuitState.OPEN);
|
|
257
|
+
this.scheduleReset();
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Check if circuit should open based on failure conditions
|
|
264
|
+
*/
|
|
265
|
+
private shouldOpenCircuit(): boolean {
|
|
266
|
+
// Check consecutive failure threshold
|
|
267
|
+
if (this.stats.consecutiveFailures >= this.config.failureThreshold) {
|
|
268
|
+
return true;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// Check failure rate if configured
|
|
272
|
+
if (this.config.failureRateThreshold && this.config.volumeThreshold) {
|
|
273
|
+
const recentRequests = this.getRecentRequests();
|
|
274
|
+
|
|
275
|
+
if (recentRequests.length >= this.config.volumeThreshold) {
|
|
276
|
+
const failureRate = this.calculateFailureRate();
|
|
277
|
+
if (failureRate >= this.config.failureRateThreshold) {
|
|
278
|
+
this.logger?.warn(
|
|
279
|
+
`Circuit breaker '${this.config.name}' failure rate ${failureRate.toFixed(1)}% exceeds threshold`,
|
|
280
|
+
);
|
|
281
|
+
return true;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
return false;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* Add request to history
|
|
291
|
+
*/
|
|
292
|
+
private addToHistory(success: boolean): void {
|
|
293
|
+
const now = Date.now();
|
|
294
|
+
this.requestHistory.push({ timestamp: now, success });
|
|
295
|
+
|
|
296
|
+
// Clean old entries
|
|
297
|
+
const cutoff = now - this.config.failureCountWindow;
|
|
298
|
+
while (this.requestHistory.length > 0 && this.requestHistory[0].timestamp < cutoff) {
|
|
299
|
+
this.requestHistory.shift();
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* Get recent requests within the time window
|
|
305
|
+
*/
|
|
306
|
+
private getRecentRequests(): RequestRecord[] {
|
|
307
|
+
const cutoff = Date.now() - this.config.failureCountWindow;
|
|
308
|
+
return this.requestHistory.filter((r) => r.timestamp >= cutoff);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Calculate current failure rate
|
|
313
|
+
*/
|
|
314
|
+
private calculateFailureRate(): number {
|
|
315
|
+
const recent = this.getRecentRequests();
|
|
316
|
+
if (recent.length === 0) return 0;
|
|
317
|
+
|
|
318
|
+
const failures = recent.filter((r) => !r.success).length;
|
|
319
|
+
return (failures / recent.length) * 100;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Determine if error should count as failure
|
|
324
|
+
*/
|
|
325
|
+
private shouldCountAsFailure(error: any): boolean {
|
|
326
|
+
if (this.config.isFailure) {
|
|
327
|
+
return this.config.isFailure(error);
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
// Default: all errors count as failures
|
|
331
|
+
return true;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* Transition to new state
|
|
336
|
+
*/
|
|
337
|
+
private transition(newState: CircuitState): void {
|
|
338
|
+
const oldState = this.state;
|
|
339
|
+
|
|
340
|
+
if (oldState === newState) return;
|
|
341
|
+
|
|
342
|
+
this.state = newState;
|
|
343
|
+
this.lastStateChangeTime = new Date();
|
|
344
|
+
this.stats.lastStateChange = this.lastStateChangeTime;
|
|
345
|
+
|
|
346
|
+
// Reset consecutive counters on state change
|
|
347
|
+
if (newState === CircuitState.CLOSED) {
|
|
348
|
+
this.stats.consecutiveFailures = 0;
|
|
349
|
+
this.emit('circuit-close', this.getStats());
|
|
350
|
+
} else if (newState === CircuitState.OPEN) {
|
|
351
|
+
this.stats.consecutiveSuccesses = 0;
|
|
352
|
+
this.emit('circuit-open', this.getStats());
|
|
353
|
+
} else if (newState === CircuitState.HALF_OPEN) {
|
|
354
|
+
this.stats.consecutiveSuccesses = 0;
|
|
355
|
+
this.stats.consecutiveFailures = 0;
|
|
356
|
+
this.emit('circuit-half-open');
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
this.emit('state-change', oldState, newState);
|
|
360
|
+
|
|
361
|
+
this.logger?.info(
|
|
362
|
+
`Circuit breaker '${this.config.name}' state changed: ${oldState} -> ${newState}`,
|
|
363
|
+
);
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
/**
|
|
367
|
+
* Schedule circuit reset attempt
|
|
368
|
+
*/
|
|
369
|
+
private scheduleReset(): void {
|
|
370
|
+
this.clearResetTimer();
|
|
371
|
+
|
|
372
|
+
this.resetTimer = setTimeout(() => {
|
|
373
|
+
this.logger?.info(`Circuit breaker '${this.config.name}' attempting reset to HALF_OPEN`);
|
|
374
|
+
this.transition(CircuitState.HALF_OPEN);
|
|
375
|
+
}, this.config.resetTimeout);
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
/**
|
|
379
|
+
* Clear reset timer
|
|
380
|
+
*/
|
|
381
|
+
private clearResetTimer(): void {
|
|
382
|
+
if (this.resetTimer) {
|
|
383
|
+
clearTimeout(this.resetTimer);
|
|
384
|
+
this.resetTimer = undefined;
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
/**
|
|
389
|
+
* Cleanup resources
|
|
390
|
+
*/
|
|
391
|
+
dispose(): void {
|
|
392
|
+
this.clearResetTimer();
|
|
393
|
+
this.removeAllListeners();
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
/**
|
|
398
|
+
* Circuit breaker factory for managing multiple circuits
|
|
399
|
+
*/
|
|
400
|
+
export class CircuitBreakerFactory {
|
|
401
|
+
private readonly circuits = new Map<string, CircuitBreaker>();
|
|
402
|
+
private readonly logger?: Logger;
|
|
403
|
+
|
|
404
|
+
constructor(logger?: Logger) {
|
|
405
|
+
this.logger = logger;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
/**
|
|
409
|
+
* Get or create a circuit breaker
|
|
410
|
+
*/
|
|
411
|
+
getOrCreate(config: CircuitBreakerConfig): CircuitBreaker {
|
|
412
|
+
let circuit = this.circuits.get(config.name);
|
|
413
|
+
|
|
414
|
+
if (!circuit) {
|
|
415
|
+
circuit = new CircuitBreaker(config, this.logger);
|
|
416
|
+
this.circuits.set(config.name, circuit);
|
|
417
|
+
this.logger?.debug(`Created new circuit breaker: ${config.name}`);
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
return circuit;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
/**
|
|
424
|
+
* Get existing circuit breaker
|
|
425
|
+
*/
|
|
426
|
+
get(name: string): CircuitBreaker | undefined {
|
|
427
|
+
return this.circuits.get(name);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
/**
|
|
431
|
+
* Get all circuit breakers
|
|
432
|
+
*/
|
|
433
|
+
getAll(): Map<string, CircuitBreaker> {
|
|
434
|
+
return new Map(this.circuits);
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
/**
|
|
438
|
+
* Get statistics for all circuits
|
|
439
|
+
*/
|
|
440
|
+
getAllStats(): Record<string, CircuitStats> {
|
|
441
|
+
const stats: Record<string, CircuitStats> = {};
|
|
442
|
+
|
|
443
|
+
for (const [name, circuit] of this.circuits) {
|
|
444
|
+
stats[name] = circuit.getStats();
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
return stats;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
/**
|
|
451
|
+
* Reset all circuits
|
|
452
|
+
*/
|
|
453
|
+
resetAll(): void {
|
|
454
|
+
for (const circuit of this.circuits.values()) {
|
|
455
|
+
circuit.reset();
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
/**
|
|
460
|
+
* Dispose all circuits
|
|
461
|
+
*/
|
|
462
|
+
dispose(): void {
|
|
463
|
+
for (const circuit of this.circuits.values()) {
|
|
464
|
+
circuit.dispose();
|
|
465
|
+
}
|
|
466
|
+
this.circuits.clear();
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
/**
|
|
471
|
+
* Decorator for adding circuit breaker to methods
|
|
472
|
+
*/
|
|
473
|
+
export function WithCircuitBreaker(config: Omit<CircuitBreakerConfig, 'name'>) {
|
|
474
|
+
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
|
|
475
|
+
const originalMethod = descriptor.value;
|
|
476
|
+
const circuitName = `${target.constructor.name}.${propertyKey}`;
|
|
477
|
+
const circuit = new CircuitBreaker({ ...config, name: circuitName });
|
|
478
|
+
|
|
479
|
+
descriptor.value = async function (...args: any[]) {
|
|
480
|
+
return circuit.execute(() => originalMethod.apply(this, args));
|
|
481
|
+
};
|
|
482
|
+
|
|
483
|
+
return descriptor;
|
|
484
|
+
};
|
|
485
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import * as k8s from '@kubernetes/client-node';
|
|
2
|
+
import { Logger } from 'winston';
|
|
3
|
+
import { EventEmitter } from 'events';
|
|
4
|
+
import { ConnectionPool, ConnectionPoolConfig, ConnectionEntry } from './ConnectionPool.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Configuration for SingleClusterConnectionManager
|
|
8
|
+
*/
|
|
9
|
+
export interface ConnectionManagerConfig {
|
|
10
|
+
/**
|
|
11
|
+
* Connection pool configuration
|
|
12
|
+
*/
|
|
13
|
+
poolConfig?: ConnectionPoolConfig;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Logger instance
|
|
17
|
+
*/
|
|
18
|
+
logger?: Logger;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Statistics for the managed cluster
|
|
23
|
+
*/
|
|
24
|
+
export interface ClusterStats {
|
|
25
|
+
healthy: boolean;
|
|
26
|
+
poolStats: {
|
|
27
|
+
total: number;
|
|
28
|
+
idle: number;
|
|
29
|
+
inUse: number;
|
|
30
|
+
unhealthy: number;
|
|
31
|
+
waitQueueLength: number;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Connection manager for handling a single Kubernetes cluster
|
|
37
|
+
*/
|
|
38
|
+
export class ConnectionManager extends EventEmitter {
|
|
39
|
+
private readonly pool: ConnectionPool;
|
|
40
|
+
private readonly logger?: Logger;
|
|
41
|
+
private disposed = false;
|
|
42
|
+
|
|
43
|
+
constructor(kubeConfigFactory: () => k8s.KubeConfig, config: ConnectionManagerConfig = {}) {
|
|
44
|
+
super();
|
|
45
|
+
this.logger = config.logger;
|
|
46
|
+
this.pool = new ConnectionPool('default', kubeConfigFactory, {
|
|
47
|
+
...config.poolConfig,
|
|
48
|
+
logger: this.logger,
|
|
49
|
+
});
|
|
50
|
+
// Forward pool events
|
|
51
|
+
this.pool.on('connectionCreated', (conn) => {
|
|
52
|
+
this.emit('connectionCreated', { connection: conn });
|
|
53
|
+
});
|
|
54
|
+
this.pool.on('connectionRemoved', (conn) => {
|
|
55
|
+
this.emit('connectionRemoved', { connection: conn });
|
|
56
|
+
});
|
|
57
|
+
this.pool.on('connectionAcquired', (conn) => {
|
|
58
|
+
this.emit('connectionAcquired', { connection: conn });
|
|
59
|
+
});
|
|
60
|
+
this.pool.on('connectionReleased', (conn) => {
|
|
61
|
+
this.emit('connectionReleased', { connection: conn });
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Acquire a connection from the pool
|
|
67
|
+
*/
|
|
68
|
+
async acquire(): Promise<ConnectionEntry> {
|
|
69
|
+
if (this.disposed) {
|
|
70
|
+
throw new Error('Connection manager has been disposed');
|
|
71
|
+
}
|
|
72
|
+
return this.pool.acquire();
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Release a connection back to the pool
|
|
77
|
+
*/
|
|
78
|
+
release(connection: ConnectionEntry): void {
|
|
79
|
+
this.pool.release(connection);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Get statistics for the cluster
|
|
84
|
+
*/
|
|
85
|
+
getStats(): ClusterStats {
|
|
86
|
+
return {
|
|
87
|
+
healthy: this.isClusterHealthy(),
|
|
88
|
+
poolStats: this.pool.stats,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Check if the cluster is healthy
|
|
94
|
+
*/
|
|
95
|
+
private isClusterHealthy(): boolean {
|
|
96
|
+
const stats = this.pool.stats;
|
|
97
|
+
// Consider healthy if at least one available connection
|
|
98
|
+
return stats.total > 0 && (stats.idle > 0 || stats.inUse > 0);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Dispose of the connection manager
|
|
103
|
+
*/
|
|
104
|
+
async dispose(): Promise<void> {
|
|
105
|
+
if (this.disposed) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
this.disposed = true;
|
|
109
|
+
this.logger?.info('Disposing connection manager');
|
|
110
|
+
await this.pool.dispose();
|
|
111
|
+
this.emit('disposed');
|
|
112
|
+
this.removeAllListeners();
|
|
113
|
+
}
|
|
114
|
+
}
|