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,129 @@
|
|
|
1
|
+
import * as k8s from '@kubernetes/client-node';
|
|
2
|
+
import {
|
|
3
|
+
BaseResourceOperations,
|
|
4
|
+
ResourceOperationOptions,
|
|
5
|
+
WatchCallback,
|
|
6
|
+
WatchEventType,
|
|
7
|
+
} from '../BaseResourceOperations.js';
|
|
8
|
+
import { KubernetesClient } from '../KubernetesClient.js';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Namespace operations implementation - Read-only operations
|
|
12
|
+
*/
|
|
13
|
+
export class NamespaceOperations extends BaseResourceOperations<k8s.V1Namespace> {
|
|
14
|
+
constructor(client: KubernetesClient) {
|
|
15
|
+
super(client, 'Namespace');
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @throws {Error} This operation is not supported in read-only mode
|
|
20
|
+
*/
|
|
21
|
+
async create(
|
|
22
|
+
_namespace: k8s.V1Namespace,
|
|
23
|
+
_options?: ResourceOperationOptions,
|
|
24
|
+
): Promise<k8s.V1Namespace> {
|
|
25
|
+
throw new Error('Create operation is not supported in read-only mode');
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @throws {Error} This operation is not supported in read-only mode
|
|
30
|
+
*/
|
|
31
|
+
async update(
|
|
32
|
+
_namespace: k8s.V1Namespace,
|
|
33
|
+
_options?: ResourceOperationOptions,
|
|
34
|
+
): Promise<k8s.V1Namespace> {
|
|
35
|
+
throw new Error('Update operation is not supported in read-only mode');
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* @throws {Error} This operation is not supported in read-only mode
|
|
40
|
+
*/
|
|
41
|
+
async patch(
|
|
42
|
+
_name: string,
|
|
43
|
+
_patch: any,
|
|
44
|
+
_options?: ResourceOperationOptions,
|
|
45
|
+
): Promise<k8s.V1Namespace> {
|
|
46
|
+
throw new Error('Patch operation is not supported in read-only mode');
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* @throws {Error} This operation is not supported in read-only mode
|
|
51
|
+
*/
|
|
52
|
+
async delete(_name: string, _options?: ResourceOperationOptions): Promise<void> {
|
|
53
|
+
throw new Error('Delete operation is not supported in read-only mode');
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Get a Namespace by name
|
|
58
|
+
*/
|
|
59
|
+
async get(name: string, _options?: ResourceOperationOptions): Promise<k8s.V1Namespace> {
|
|
60
|
+
try {
|
|
61
|
+
const response = await this.client.core.readNamespace({ name });
|
|
62
|
+
return response;
|
|
63
|
+
} catch (error) {
|
|
64
|
+
this.handleApiError(error, 'Get', name);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* List Namespaces
|
|
70
|
+
*/
|
|
71
|
+
async list(_options?: ResourceOperationOptions): Promise<k8s.V1NamespaceList> {
|
|
72
|
+
try {
|
|
73
|
+
const response = await this.client.core.listNamespace();
|
|
74
|
+
return response;
|
|
75
|
+
} catch (error) {
|
|
76
|
+
this.handleApiError(error, 'List');
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Watch Namespaces for changes
|
|
82
|
+
*/
|
|
83
|
+
watch(callback: WatchCallback<k8s.V1Namespace>, options?: ResourceOperationOptions): () => void {
|
|
84
|
+
const watch = new k8s.Watch(this.client.kubeConfig);
|
|
85
|
+
let aborted = false;
|
|
86
|
+
|
|
87
|
+
const startWatch = async () => {
|
|
88
|
+
try {
|
|
89
|
+
const req = await watch.watch(
|
|
90
|
+
`/api/v1/namespaces`,
|
|
91
|
+
this.buildListOptions(options),
|
|
92
|
+
(type: string, obj: k8s.V1Namespace) => {
|
|
93
|
+
if (!aborted) {
|
|
94
|
+
callback({
|
|
95
|
+
type: type as WatchEventType,
|
|
96
|
+
object: obj,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
(err: any) => {
|
|
101
|
+
if (!aborted) {
|
|
102
|
+
this.logger?.error(`Watch error for Namespaces: ${err}`);
|
|
103
|
+
callback({
|
|
104
|
+
type: WatchEventType.ERROR,
|
|
105
|
+
object: err,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
);
|
|
110
|
+
return req;
|
|
111
|
+
} catch (error) {
|
|
112
|
+
this.logger?.error(`Failed to start watch for Namespaces: ${error}`);
|
|
113
|
+
throw error;
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
let request: any;
|
|
118
|
+
startWatch().then((req) => {
|
|
119
|
+
request = req;
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
return () => {
|
|
123
|
+
aborted = true;
|
|
124
|
+
if (request) {
|
|
125
|
+
request.abort();
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
}
|
|
@@ -0,0 +1,516 @@
|
|
|
1
|
+
import * as k8s from '@kubernetes/client-node';
|
|
2
|
+
import { V1PersistentVolumeClaim } from '@kubernetes/client-node';
|
|
3
|
+
import {
|
|
4
|
+
BaseResourceOperations,
|
|
5
|
+
ResourceOperationOptions,
|
|
6
|
+
WatchCallback,
|
|
7
|
+
WatchEventType,
|
|
8
|
+
} from '../BaseResourceOperations.js';
|
|
9
|
+
import { KubernetesClient } from '../KubernetesClient.js';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* PersistentVolumeClaim-specific operation options
|
|
13
|
+
*/
|
|
14
|
+
export interface PersistentVolumeClaimOperationOptions extends ResourceOperationOptions {
|
|
15
|
+
/**
|
|
16
|
+
* Filter by storage class
|
|
17
|
+
*/
|
|
18
|
+
storageClass?: string;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Filter by access mode
|
|
22
|
+
*/
|
|
23
|
+
accessMode?: string;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Filter by volume mode
|
|
27
|
+
*/
|
|
28
|
+
volumeMode?: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Represents a PVC with usage information
|
|
33
|
+
*/
|
|
34
|
+
export interface PVCWithUsage extends V1PersistentVolumeClaim {
|
|
35
|
+
usage?: {
|
|
36
|
+
capacity?: string;
|
|
37
|
+
used?: string;
|
|
38
|
+
available?: string;
|
|
39
|
+
percentUsed?: number;
|
|
40
|
+
};
|
|
41
|
+
boundPV?: string;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* PVC analysis result
|
|
46
|
+
*/
|
|
47
|
+
export interface PVCAnalysisResult {
|
|
48
|
+
total: number;
|
|
49
|
+
byStatus: Record<string, number>;
|
|
50
|
+
byStorageClass: Record<string, number>;
|
|
51
|
+
pending: V1PersistentVolumeClaim[];
|
|
52
|
+
issues: Array<{
|
|
53
|
+
pvc: V1PersistentVolumeClaim;
|
|
54
|
+
issue: string;
|
|
55
|
+
severity: 'info' | 'warning' | 'error';
|
|
56
|
+
recommendation?: string;
|
|
57
|
+
}>;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Operations for Kubernetes Persistent Volume Claims
|
|
62
|
+
*/
|
|
63
|
+
export class PersistentVolumeClaimOperations extends BaseResourceOperations<V1PersistentVolumeClaim> {
|
|
64
|
+
constructor(client: KubernetesClient) {
|
|
65
|
+
super(client, 'PersistentVolumeClaim');
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
protected getResourceNamespaced(): boolean {
|
|
69
|
+
return true; // PVCs are namespaced
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Create operation is not supported for this read-only tool
|
|
74
|
+
*/
|
|
75
|
+
async create(
|
|
76
|
+
_resource: V1PersistentVolumeClaim,
|
|
77
|
+
_options?: ResourceOperationOptions,
|
|
78
|
+
): Promise<V1PersistentVolumeClaim> {
|
|
79
|
+
throw new Error('Create operation is not supported for this read-only PVC analysis tool');
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Update operation is not supported for this read-only tool
|
|
84
|
+
*/
|
|
85
|
+
async update(
|
|
86
|
+
_resource: V1PersistentVolumeClaim,
|
|
87
|
+
_options?: ResourceOperationOptions,
|
|
88
|
+
): Promise<V1PersistentVolumeClaim> {
|
|
89
|
+
throw new Error('Update operation is not supported for this read-only PVC analysis tool');
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Patch operation is not supported for this read-only tool
|
|
94
|
+
*/
|
|
95
|
+
async patch(
|
|
96
|
+
_name: string,
|
|
97
|
+
_patch: any,
|
|
98
|
+
_options?: ResourceOperationOptions,
|
|
99
|
+
): Promise<V1PersistentVolumeClaim> {
|
|
100
|
+
throw new Error('Patch operation is not supported for this read-only PVC analysis tool');
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Delete operation is not supported for this read-only tool
|
|
105
|
+
*/
|
|
106
|
+
async delete(_name: string, _options?: ResourceOperationOptions): Promise<void> {
|
|
107
|
+
throw new Error('Delete operation is not supported for this read-only PVC analysis tool');
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* List Persistent Volume Claims
|
|
112
|
+
*/
|
|
113
|
+
async list(
|
|
114
|
+
options?: PersistentVolumeClaimOperationOptions,
|
|
115
|
+
): Promise<k8s.V1PersistentVolumeClaimList> {
|
|
116
|
+
try {
|
|
117
|
+
let response;
|
|
118
|
+
if (options?.namespace) {
|
|
119
|
+
response = await this.client.core.listNamespacedPersistentVolumeClaim({
|
|
120
|
+
namespace: options.namespace,
|
|
121
|
+
...this.buildListOptions(options),
|
|
122
|
+
});
|
|
123
|
+
} else {
|
|
124
|
+
response = await this.client.core.listPersistentVolumeClaimForAllNamespaces(
|
|
125
|
+
this.buildListOptions(options),
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Apply additional filtering if needed
|
|
130
|
+
if (options?.storageClass || options?.accessMode || options?.volumeMode) {
|
|
131
|
+
response.items = response.items.filter((pvc) => {
|
|
132
|
+
if (options.storageClass && pvc.spec?.storageClassName !== options.storageClass) {
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
if (options.accessMode && !pvc.spec?.accessModes?.includes(options.accessMode)) {
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
if (options.volumeMode && pvc.spec?.volumeMode !== options.volumeMode) {
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
return true;
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
return response;
|
|
146
|
+
} catch (error) {
|
|
147
|
+
this.handleApiError(error, 'List', `PVCs in ${options?.namespace || 'all namespaces'}`);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Get a specific Persistent Volume Claim by name
|
|
153
|
+
*/
|
|
154
|
+
async get(name: string, options?: ResourceOperationOptions): Promise<V1PersistentVolumeClaim> {
|
|
155
|
+
try {
|
|
156
|
+
const namespace = options?.namespace || 'default';
|
|
157
|
+
const response = await this.client.core.readNamespacedPersistentVolumeClaim({
|
|
158
|
+
name,
|
|
159
|
+
namespace,
|
|
160
|
+
});
|
|
161
|
+
return response;
|
|
162
|
+
} catch (error) {
|
|
163
|
+
this.handleApiError(error, 'Get', name);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Watch Persistent Volume Claims for changes
|
|
169
|
+
*/
|
|
170
|
+
watch(
|
|
171
|
+
callback: WatchCallback<V1PersistentVolumeClaim>,
|
|
172
|
+
options?: ResourceOperationOptions,
|
|
173
|
+
): () => void {
|
|
174
|
+
const namespace = options?.namespace;
|
|
175
|
+
const watch = new k8s.Watch(this.client.kubeConfig);
|
|
176
|
+
let aborted = false;
|
|
177
|
+
|
|
178
|
+
const startWatch = async () => {
|
|
179
|
+
try {
|
|
180
|
+
const path = namespace
|
|
181
|
+
? `/api/v1/namespaces/${namespace}/persistentvolumeclaims`
|
|
182
|
+
: '/api/v1/persistentvolumeclaims';
|
|
183
|
+
|
|
184
|
+
const req = await watch.watch(
|
|
185
|
+
path,
|
|
186
|
+
this.buildListOptions(options),
|
|
187
|
+
(type: string, obj: V1PersistentVolumeClaim) => {
|
|
188
|
+
if (!aborted) {
|
|
189
|
+
callback({
|
|
190
|
+
type: type as WatchEventType,
|
|
191
|
+
object: obj,
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
},
|
|
195
|
+
(err: any) => {
|
|
196
|
+
if (!aborted) {
|
|
197
|
+
this.logger?.error(`Watch error for PVCs: ${err}`);
|
|
198
|
+
callback({
|
|
199
|
+
type: WatchEventType.ERROR,
|
|
200
|
+
object: err,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
},
|
|
204
|
+
);
|
|
205
|
+
return req;
|
|
206
|
+
} catch (error) {
|
|
207
|
+
this.logger?.error(`Failed to start watch for PVCs: ${error}`);
|
|
208
|
+
throw error;
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
let request: any;
|
|
213
|
+
startWatch().then((req) => {
|
|
214
|
+
request = req;
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
return () => {
|
|
218
|
+
aborted = true;
|
|
219
|
+
if (request) {
|
|
220
|
+
request.abort();
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Analyze PVC status and issues
|
|
227
|
+
*/
|
|
228
|
+
async analyzePVCs(options?: PersistentVolumeClaimOperationOptions): Promise<PVCAnalysisResult> {
|
|
229
|
+
const pvcList = await this.list(options);
|
|
230
|
+
const analysis: PVCAnalysisResult = {
|
|
231
|
+
total: pvcList.items.length,
|
|
232
|
+
byStatus: {},
|
|
233
|
+
byStorageClass: {},
|
|
234
|
+
pending: [],
|
|
235
|
+
issues: [],
|
|
236
|
+
};
|
|
237
|
+
|
|
238
|
+
// Get all PVs to cross-reference
|
|
239
|
+
const pvList = await this.client.core.listPersistentVolume();
|
|
240
|
+
|
|
241
|
+
for (const pvc of pvcList.items) {
|
|
242
|
+
const status = pvc.status?.phase || 'Unknown';
|
|
243
|
+
const storageClass = pvc.spec?.storageClassName || 'default';
|
|
244
|
+
|
|
245
|
+
// Count by status
|
|
246
|
+
analysis.byStatus[status] = (analysis.byStatus[status] || 0) + 1;
|
|
247
|
+
|
|
248
|
+
// Count by storage class
|
|
249
|
+
analysis.byStorageClass[storageClass] = (analysis.byStorageClass[storageClass] || 0) + 1;
|
|
250
|
+
|
|
251
|
+
// Track pending PVCs
|
|
252
|
+
if (status === 'Pending') {
|
|
253
|
+
analysis.pending.push(pvc);
|
|
254
|
+
|
|
255
|
+
// Analyze why PVC is pending
|
|
256
|
+
const requestedSize = pvc.spec?.resources?.requests?.storage;
|
|
257
|
+
const requestedAccessModes = pvc.spec?.accessModes || [];
|
|
258
|
+
const requestedStorageClass = pvc.spec?.storageClassName;
|
|
259
|
+
|
|
260
|
+
// Check if there are available PVs that could satisfy this PVC
|
|
261
|
+
const availablePVs = pvList.items.filter((pv) => pv.status?.phase === 'Available');
|
|
262
|
+
|
|
263
|
+
if (availablePVs.length === 0) {
|
|
264
|
+
analysis.issues.push({
|
|
265
|
+
pvc,
|
|
266
|
+
issue: 'No available PersistentVolumes found in the cluster',
|
|
267
|
+
severity: 'error',
|
|
268
|
+
recommendation:
|
|
269
|
+
'Create a new PersistentVolume or enable dynamic provisioning for the storage class',
|
|
270
|
+
});
|
|
271
|
+
continue;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
const matchingPVs = availablePVs.filter((pv) => {
|
|
275
|
+
// Check storage class
|
|
276
|
+
if (requestedStorageClass && pv.spec?.storageClassName !== requestedStorageClass) {
|
|
277
|
+
return false;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
// Check access modes - PV must support at least one of the requested modes
|
|
281
|
+
const pvAccessModes = pv.spec?.accessModes || [];
|
|
282
|
+
const hasMatchingAccessMode = requestedAccessModes.some((mode) =>
|
|
283
|
+
pvAccessModes.includes(mode),
|
|
284
|
+
);
|
|
285
|
+
if (!hasMatchingAccessMode) {
|
|
286
|
+
return false;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// Enhanced capacity checking with proper size comparison
|
|
290
|
+
if (requestedSize && pv.spec?.capacity?.storage) {
|
|
291
|
+
const requestedBytes = this.parseStorageSize(requestedSize);
|
|
292
|
+
const pvCapacityBytes = this.parseStorageSize(pv.spec.capacity.storage);
|
|
293
|
+
|
|
294
|
+
if (requestedBytes > pvCapacityBytes) {
|
|
295
|
+
return false;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
return true;
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
if (matchingPVs.length === 0) {
|
|
303
|
+
// Determine specific reasons for no matches
|
|
304
|
+
const storageClassMatches = availablePVs.filter(
|
|
305
|
+
(pv) => !requestedStorageClass || pv.spec?.storageClassName === requestedStorageClass,
|
|
306
|
+
);
|
|
307
|
+
|
|
308
|
+
const accessModeMatches = availablePVs.filter((pv) => {
|
|
309
|
+
const pvAccessModes = pv.spec?.accessModes || [];
|
|
310
|
+
return requestedAccessModes.some((mode) => pvAccessModes.includes(mode));
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
const sizeMatches = availablePVs.filter((pv) => {
|
|
314
|
+
if (!requestedSize || !pv.spec?.capacity?.storage) return true;
|
|
315
|
+
const requestedBytes = this.parseStorageSize(requestedSize);
|
|
316
|
+
const pvCapacityBytes = this.parseStorageSize(pv.spec.capacity.storage);
|
|
317
|
+
return requestedBytes <= pvCapacityBytes;
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
let issueDetail = 'No available PersistentVolumes match the PVC requirements';
|
|
321
|
+
let recommendation = 'Check PVC requirements and available PVs';
|
|
322
|
+
|
|
323
|
+
if (storageClassMatches.length === 0) {
|
|
324
|
+
issueDetail = `No PersistentVolumes with storage class '${requestedStorageClass}' are available`;
|
|
325
|
+
recommendation = `Create a PV with storage class '${requestedStorageClass}' or check if the storage class supports dynamic provisioning`;
|
|
326
|
+
} else if (accessModeMatches.length === 0) {
|
|
327
|
+
issueDetail = `No PersistentVolumes support the requested access modes: ${requestedAccessModes.join(', ')}`;
|
|
328
|
+
recommendation =
|
|
329
|
+
'Create a PV with compatible access modes or modify the PVC access mode requirements';
|
|
330
|
+
} else if (sizeMatches.length === 0) {
|
|
331
|
+
issueDetail = `No PersistentVolumes have sufficient capacity (requested: ${requestedSize})`;
|
|
332
|
+
recommendation = 'Create a larger PV or reduce the PVC storage request';
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
analysis.issues.push({
|
|
336
|
+
pvc,
|
|
337
|
+
issue: issueDetail,
|
|
338
|
+
severity: 'warning',
|
|
339
|
+
recommendation,
|
|
340
|
+
});
|
|
341
|
+
} else {
|
|
342
|
+
// PVC is pending but there are matching PVs - possible binding delay
|
|
343
|
+
analysis.issues.push({
|
|
344
|
+
pvc,
|
|
345
|
+
issue: `PVC is pending despite ${matchingPVs.length} matching PV(s) being available`,
|
|
346
|
+
severity: 'warning',
|
|
347
|
+
recommendation: 'Check PVC events and storage controller logs for binding delays',
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
// Check for lost claims
|
|
353
|
+
if (status === 'Lost') {
|
|
354
|
+
analysis.issues.push({
|
|
355
|
+
pvc,
|
|
356
|
+
issue: 'PersistentVolumeClaim has lost its bound volume',
|
|
357
|
+
severity: 'error',
|
|
358
|
+
recommendation: 'Investigate why the bound PV was lost and restore from backup if needed',
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
// Check for bound PVCs without a corresponding PV
|
|
363
|
+
if (status === 'Bound' && pvc.spec?.volumeName) {
|
|
364
|
+
const boundPV = pvList.items.find((pv) => pv.metadata?.name === pvc.spec?.volumeName);
|
|
365
|
+
if (!boundPV) {
|
|
366
|
+
analysis.issues.push({
|
|
367
|
+
pvc,
|
|
368
|
+
issue: `PersistentVolumeClaim is bound to PV '${pvc.spec.volumeName}' which does not exist`,
|
|
369
|
+
severity: 'error',
|
|
370
|
+
recommendation:
|
|
371
|
+
'Investigate why the bound PV is missing and consider recreating the PVC',
|
|
372
|
+
});
|
|
373
|
+
} else if (boundPV.status?.phase !== 'Bound') {
|
|
374
|
+
analysis.issues.push({
|
|
375
|
+
pvc,
|
|
376
|
+
issue: `PVC is bound but the referenced PV is in '${boundPV.status?.phase}' state`,
|
|
377
|
+
severity: 'warning',
|
|
378
|
+
recommendation: 'Check the PV status and storage backend health',
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
// Check for resource quota issues
|
|
384
|
+
if (status === 'Pending' && pvc.spec?.resources?.requests?.storage) {
|
|
385
|
+
// This is a simplified check - in reality, we'd need to query resource quotas
|
|
386
|
+
const requestedSize = pvc.spec.resources.requests.storage;
|
|
387
|
+
if (this.parseStorageSize(requestedSize) === 0) {
|
|
388
|
+
analysis.issues.push({
|
|
389
|
+
pvc,
|
|
390
|
+
issue: 'PVC has zero storage request',
|
|
391
|
+
severity: 'error',
|
|
392
|
+
recommendation: 'Set a valid storage request size in the PVC spec',
|
|
393
|
+
});
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
return analysis;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
/**
|
|
402
|
+
* Parse storage size string to bytes for comparison
|
|
403
|
+
* Supports common Kubernetes storage units (Ki, Mi, Gi, Ti, K, M, G, T)
|
|
404
|
+
*/
|
|
405
|
+
private parseStorageSize(sizeStr: string): number {
|
|
406
|
+
if (!sizeStr) return 0;
|
|
407
|
+
|
|
408
|
+
const units: { [key: string]: number } = {
|
|
409
|
+
Ki: 1024,
|
|
410
|
+
Mi: 1024 * 1024,
|
|
411
|
+
Gi: 1024 * 1024 * 1024,
|
|
412
|
+
Ti: 1024 * 1024 * 1024 * 1024,
|
|
413
|
+
K: 1000,
|
|
414
|
+
M: 1000 * 1000,
|
|
415
|
+
G: 1000 * 1000 * 1000,
|
|
416
|
+
T: 1000 * 1000 * 1000 * 1000,
|
|
417
|
+
'': 1, // bytes
|
|
418
|
+
};
|
|
419
|
+
|
|
420
|
+
const match = sizeStr.match(/^(\d+(?:\.\d+)?)\s*([A-Za-z]*)$/);
|
|
421
|
+
if (!match) return 0;
|
|
422
|
+
|
|
423
|
+
const value = parseFloat(match[1]);
|
|
424
|
+
const unit = match[2] || '';
|
|
425
|
+
const multiplier = units[unit] || 1;
|
|
426
|
+
|
|
427
|
+
return Math.floor(value * multiplier);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
/**
|
|
431
|
+
* Get PVC usage information with node stats integration
|
|
432
|
+
*/
|
|
433
|
+
async getPVCUsage(name: string, namespace: string): Promise<PVCWithUsage | null> {
|
|
434
|
+
try {
|
|
435
|
+
const pvc = await this.get(name, { namespace });
|
|
436
|
+
const pvcWithUsage: PVCWithUsage = { ...pvc };
|
|
437
|
+
|
|
438
|
+
// Add bound PV information
|
|
439
|
+
if (pvc.spec?.volumeName) {
|
|
440
|
+
pvcWithUsage.boundPV = pvc.spec.volumeName;
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
// Try to get usage information from node stats
|
|
444
|
+
// This would typically require access to kubelet stats API
|
|
445
|
+
// For now, we'll return the PVC without usage info
|
|
446
|
+
pvcWithUsage.usage = {
|
|
447
|
+
capacity:
|
|
448
|
+
pvc.status?.capacity?.storage || pvc.spec?.resources?.requests?.storage || 'Unknown',
|
|
449
|
+
used: 'Unknown',
|
|
450
|
+
available: 'Unknown',
|
|
451
|
+
percentUsed: 0,
|
|
452
|
+
};
|
|
453
|
+
|
|
454
|
+
return pvcWithUsage;
|
|
455
|
+
} catch (error) {
|
|
456
|
+
this.logger?.error(`Failed to get PVC usage for ${name} in ${namespace}: ${error}`);
|
|
457
|
+
return null;
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
/**
|
|
462
|
+
* Check PVC to PV binding relationships
|
|
463
|
+
*/
|
|
464
|
+
async checkBindingStatus(): Promise<{
|
|
465
|
+
bound: number;
|
|
466
|
+
pending: number;
|
|
467
|
+
available: number;
|
|
468
|
+
bindingIssues: Array<{
|
|
469
|
+
pvc: V1PersistentVolumeClaim;
|
|
470
|
+
issue: string;
|
|
471
|
+
}>;
|
|
472
|
+
}> {
|
|
473
|
+
const pvcList = await this.list();
|
|
474
|
+
const pvList = await this.client.core.listPersistentVolume();
|
|
475
|
+
|
|
476
|
+
const result = {
|
|
477
|
+
bound: 0,
|
|
478
|
+
pending: 0,
|
|
479
|
+
available: 0,
|
|
480
|
+
bindingIssues: [] as Array<{ pvc: V1PersistentVolumeClaim; issue: string }>,
|
|
481
|
+
};
|
|
482
|
+
|
|
483
|
+
for (const pvc of pvcList.items) {
|
|
484
|
+
const status = pvc.status?.phase || 'Unknown';
|
|
485
|
+
|
|
486
|
+
switch (status) {
|
|
487
|
+
case 'Bound':
|
|
488
|
+
result.bound++;
|
|
489
|
+
break;
|
|
490
|
+
case 'Pending':
|
|
491
|
+
result.pending++;
|
|
492
|
+
break;
|
|
493
|
+
default:
|
|
494
|
+
result.available++;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
// Check for binding issues
|
|
498
|
+
if (status === 'Bound' && pvc.spec?.volumeName) {
|
|
499
|
+
const boundPV = pvList.items.find((pv) => pv.metadata?.name === pvc.spec?.volumeName);
|
|
500
|
+
if (!boundPV) {
|
|
501
|
+
result.bindingIssues.push({
|
|
502
|
+
pvc,
|
|
503
|
+
issue: `Bound to non-existent PV: ${pvc.spec.volumeName}`,
|
|
504
|
+
});
|
|
505
|
+
} else if (boundPV.status?.phase !== 'Bound') {
|
|
506
|
+
result.bindingIssues.push({
|
|
507
|
+
pvc,
|
|
508
|
+
issue: `Bound PV is not in Bound state: ${boundPV.status?.phase}`,
|
|
509
|
+
});
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
return result;
|
|
515
|
+
}
|
|
516
|
+
}
|