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,438 @@
|
|
|
1
|
+
import * as k8s from '@kubernetes/client-node';
|
|
2
|
+
import { V1PersistentVolume } 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
|
+
* PersistentVolume-specific operation options
|
|
13
|
+
*/
|
|
14
|
+
export interface PersistentVolumeOperationOptions extends ResourceOperationOptions {
|
|
15
|
+
/**
|
|
16
|
+
* Filter by storage class
|
|
17
|
+
*/
|
|
18
|
+
storageClass?: string;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Filter by reclaim policy
|
|
22
|
+
*/
|
|
23
|
+
reclaimPolicy?: string;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Filter by access mode
|
|
27
|
+
*/
|
|
28
|
+
accessMode?: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Represents a PV with usage information
|
|
33
|
+
*/
|
|
34
|
+
export interface PVWithUsage extends V1PersistentVolume {
|
|
35
|
+
usage?: {
|
|
36
|
+
capacity?: string;
|
|
37
|
+
used?: string;
|
|
38
|
+
available?: string;
|
|
39
|
+
percentUsed?: number;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* PV analysis result
|
|
45
|
+
*/
|
|
46
|
+
export interface PVAnalysisResult {
|
|
47
|
+
total: number;
|
|
48
|
+
byStatus: Record<string, number>;
|
|
49
|
+
byStorageClass: Record<string, number>;
|
|
50
|
+
byReclaimPolicy: Record<string, number>;
|
|
51
|
+
unbound: V1PersistentVolume[];
|
|
52
|
+
issues: Array<{
|
|
53
|
+
pv: V1PersistentVolume;
|
|
54
|
+
issue: string;
|
|
55
|
+
severity: 'info' | 'warning' | 'error';
|
|
56
|
+
recommendation?: string;
|
|
57
|
+
}>;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Operations for Kubernetes Persistent Volumes
|
|
62
|
+
*/
|
|
63
|
+
export class PersistentVolumeOperations extends BaseResourceOperations<V1PersistentVolume> {
|
|
64
|
+
constructor(client: KubernetesClient) {
|
|
65
|
+
super(client, 'PersistentVolume');
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
protected getResourceNamespaced(): boolean {
|
|
69
|
+
return false; // PVs are cluster-scoped
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Create operation is not supported for this read-only tool
|
|
74
|
+
*/
|
|
75
|
+
async create(
|
|
76
|
+
_resource: V1PersistentVolume,
|
|
77
|
+
_options?: ResourceOperationOptions,
|
|
78
|
+
): Promise<V1PersistentVolume> {
|
|
79
|
+
throw new Error('Create operation is not supported for this read-only tool');
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Update operation is not supported for this read-only tool
|
|
84
|
+
*/
|
|
85
|
+
async update(
|
|
86
|
+
_resource: V1PersistentVolume,
|
|
87
|
+
_options?: ResourceOperationOptions,
|
|
88
|
+
): Promise<V1PersistentVolume> {
|
|
89
|
+
throw new Error('Update operation is not supported for this read-only 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<V1PersistentVolume> {
|
|
100
|
+
throw new Error('Patch operation is not supported for this read-only 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 tool');
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* List all Persistent Volumes
|
|
112
|
+
*/
|
|
113
|
+
async list(options?: PersistentVolumeOperationOptions): Promise<k8s.V1PersistentVolumeList> {
|
|
114
|
+
try {
|
|
115
|
+
const response = await this.client.core.listPersistentVolume(this.buildListOptions(options));
|
|
116
|
+
|
|
117
|
+
// Apply additional filtering if needed
|
|
118
|
+
if (options?.storageClass || options?.reclaimPolicy || options?.accessMode) {
|
|
119
|
+
response.items = response.items.filter((pv) => {
|
|
120
|
+
if (options.storageClass && pv.spec?.storageClassName !== options.storageClass) {
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
if (
|
|
124
|
+
options.reclaimPolicy &&
|
|
125
|
+
pv.spec?.persistentVolumeReclaimPolicy !== options.reclaimPolicy
|
|
126
|
+
) {
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
if (options.accessMode && !pv.spec?.accessModes?.includes(options.accessMode)) {
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
return true;
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return response;
|
|
137
|
+
} catch (error) {
|
|
138
|
+
this.handleApiError(error, 'List', 'all PVs');
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Get a specific Persistent Volume by name
|
|
144
|
+
*/
|
|
145
|
+
async get(name: string, _options?: ResourceOperationOptions): Promise<V1PersistentVolume> {
|
|
146
|
+
try {
|
|
147
|
+
const response = await this.client.core.readPersistentVolume({ name });
|
|
148
|
+
return response;
|
|
149
|
+
} catch (error) {
|
|
150
|
+
this.handleApiError(error, 'Get', name);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Watch Persistent Volumes for changes
|
|
156
|
+
*/
|
|
157
|
+
watch(
|
|
158
|
+
callback: WatchCallback<V1PersistentVolume>,
|
|
159
|
+
options?: ResourceOperationOptions,
|
|
160
|
+
): () => void {
|
|
161
|
+
const watch = new k8s.Watch(this.client.kubeConfig);
|
|
162
|
+
let aborted = false;
|
|
163
|
+
|
|
164
|
+
const startWatch = async () => {
|
|
165
|
+
try {
|
|
166
|
+
const req = await watch.watch(
|
|
167
|
+
'/api/v1/persistentvolumes',
|
|
168
|
+
this.buildListOptions(options),
|
|
169
|
+
(type: string, obj: V1PersistentVolume) => {
|
|
170
|
+
if (!aborted) {
|
|
171
|
+
callback({
|
|
172
|
+
type: type as WatchEventType,
|
|
173
|
+
object: obj,
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
(err: any) => {
|
|
178
|
+
if (!aborted) {
|
|
179
|
+
this.logger?.error(`Watch error for PVs: ${err}`);
|
|
180
|
+
callback({
|
|
181
|
+
type: WatchEventType.ERROR,
|
|
182
|
+
object: err,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
},
|
|
186
|
+
);
|
|
187
|
+
return req;
|
|
188
|
+
} catch (error) {
|
|
189
|
+
this.logger?.error(`Failed to start watch for PVs: ${error}`);
|
|
190
|
+
throw error;
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
let request: any;
|
|
195
|
+
startWatch().then((req) => {
|
|
196
|
+
request = req;
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
return () => {
|
|
200
|
+
aborted = true;
|
|
201
|
+
if (request) {
|
|
202
|
+
request.abort();
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Analyze PV status and issues
|
|
209
|
+
*/
|
|
210
|
+
async analyzePVs(options?: PersistentVolumeOperationOptions): Promise<PVAnalysisResult> {
|
|
211
|
+
const pvList = await this.list(options);
|
|
212
|
+
const analysis: PVAnalysisResult = {
|
|
213
|
+
total: pvList.items.length,
|
|
214
|
+
byStatus: {},
|
|
215
|
+
byStorageClass: {},
|
|
216
|
+
byReclaimPolicy: {},
|
|
217
|
+
unbound: [],
|
|
218
|
+
issues: [],
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
// Get all PVCs to cross-reference
|
|
222
|
+
const pvcList = await this.client.core.listPersistentVolumeClaimForAllNamespaces();
|
|
223
|
+
|
|
224
|
+
for (const pv of pvList.items) {
|
|
225
|
+
const status = pv.status?.phase || 'Unknown';
|
|
226
|
+
const storageClass = pv.spec?.storageClassName || 'default';
|
|
227
|
+
const reclaimPolicy = pv.spec?.persistentVolumeReclaimPolicy || 'Unknown';
|
|
228
|
+
|
|
229
|
+
// Count by status
|
|
230
|
+
analysis.byStatus[status] = (analysis.byStatus[status] || 0) + 1;
|
|
231
|
+
|
|
232
|
+
// Count by storage class
|
|
233
|
+
analysis.byStorageClass[storageClass] = (analysis.byStorageClass[storageClass] || 0) + 1;
|
|
234
|
+
|
|
235
|
+
// Count by reclaim policy
|
|
236
|
+
analysis.byReclaimPolicy[reclaimPolicy] = (analysis.byReclaimPolicy[reclaimPolicy] || 0) + 1;
|
|
237
|
+
|
|
238
|
+
// Track unbound PVs
|
|
239
|
+
if (status === 'Available') {
|
|
240
|
+
analysis.unbound.push(pv);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// Check for issues
|
|
244
|
+
// Failed PVs
|
|
245
|
+
if (status === 'Failed') {
|
|
246
|
+
analysis.issues.push({
|
|
247
|
+
pv,
|
|
248
|
+
issue: 'PersistentVolume is in Failed state',
|
|
249
|
+
severity: 'error',
|
|
250
|
+
recommendation:
|
|
251
|
+
'Check storage backend health and PV configuration. Consider recreating the PV if storage is accessible.',
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// Released PVs that should be reclaimed
|
|
256
|
+
if (status === 'Released') {
|
|
257
|
+
if (reclaimPolicy === 'Delete') {
|
|
258
|
+
analysis.issues.push({
|
|
259
|
+
pv,
|
|
260
|
+
issue:
|
|
261
|
+
'PersistentVolume is Released but has Delete reclaim policy - should have been automatically deleted',
|
|
262
|
+
severity: 'warning',
|
|
263
|
+
recommendation:
|
|
264
|
+
'Check storage controller logs for deletion issues or manually delete the PV if safe',
|
|
265
|
+
});
|
|
266
|
+
} else if (reclaimPolicy === 'Recycle') {
|
|
267
|
+
analysis.issues.push({
|
|
268
|
+
pv,
|
|
269
|
+
issue: 'PersistentVolume is Released and waiting for recycling (deprecated feature)',
|
|
270
|
+
severity: 'warning',
|
|
271
|
+
recommendation:
|
|
272
|
+
'Recycle policy is deprecated. Consider changing to Retain or Delete policy and handle cleanup manually',
|
|
273
|
+
});
|
|
274
|
+
} else {
|
|
275
|
+
// Retain policy - this might be expected but worth noting
|
|
276
|
+
analysis.issues.push({
|
|
277
|
+
pv,
|
|
278
|
+
issue: 'PersistentVolume is Released with Retain policy and needs manual cleanup',
|
|
279
|
+
severity: 'info',
|
|
280
|
+
recommendation:
|
|
281
|
+
'Remove claimRef from the PV spec to make it Available again, or delete if no longer needed',
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// Zero capacity PVs
|
|
287
|
+
if (pv.spec?.capacity?.storage) {
|
|
288
|
+
const capacityBytes = this.parseStorageSize(pv.spec.capacity.storage);
|
|
289
|
+
if (capacityBytes === 0) {
|
|
290
|
+
analysis.issues.push({
|
|
291
|
+
pv,
|
|
292
|
+
issue: 'PersistentVolume has zero storage capacity',
|
|
293
|
+
severity: 'error',
|
|
294
|
+
recommendation: 'Set a valid storage capacity in the PV spec',
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
} else {
|
|
298
|
+
analysis.issues.push({
|
|
299
|
+
pv,
|
|
300
|
+
issue: 'PersistentVolume is missing storage capacity specification',
|
|
301
|
+
severity: 'error',
|
|
302
|
+
recommendation: 'Add storage capacity to the PV spec',
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
// Bound PVs without corresponding PVCs
|
|
307
|
+
if (status === 'Bound' && pv.spec?.claimRef) {
|
|
308
|
+
const claimRef = pv.spec.claimRef;
|
|
309
|
+
const boundPVC = pvcList.items.find(
|
|
310
|
+
(pvc) =>
|
|
311
|
+
pvc.metadata?.name === claimRef.name && pvc.metadata?.namespace === claimRef.namespace,
|
|
312
|
+
);
|
|
313
|
+
|
|
314
|
+
if (!boundPVC) {
|
|
315
|
+
analysis.issues.push({
|
|
316
|
+
pv,
|
|
317
|
+
issue: `PersistentVolume is bound to PVC '${claimRef.namespace}/${claimRef.name}' which does not exist`,
|
|
318
|
+
severity: 'warning',
|
|
319
|
+
recommendation:
|
|
320
|
+
'Clear the claimRef to make the PV available or investigate why the PVC is missing',
|
|
321
|
+
});
|
|
322
|
+
} else if (boundPVC.status?.phase !== 'Bound') {
|
|
323
|
+
analysis.issues.push({
|
|
324
|
+
pv,
|
|
325
|
+
issue: `PV is bound but the referenced PVC is in '${boundPVC.status?.phase}' state`,
|
|
326
|
+
severity: 'warning',
|
|
327
|
+
recommendation: 'Check the PVC status and binding process',
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
// Available PVs with no storage class but default exists
|
|
333
|
+
if (status === 'Available' && !pv.spec?.storageClassName) {
|
|
334
|
+
analysis.issues.push({
|
|
335
|
+
pv,
|
|
336
|
+
issue: 'PersistentVolume is Available but has no storage class',
|
|
337
|
+
severity: 'info',
|
|
338
|
+
recommendation:
|
|
339
|
+
'Consider setting a storage class for better organization and matching with PVCs',
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
// Check for PVs with deprecated volume types or configurations
|
|
344
|
+
if (pv.spec?.hostPath) {
|
|
345
|
+
analysis.issues.push({
|
|
346
|
+
pv,
|
|
347
|
+
issue: 'PersistentVolume uses hostPath which is not recommended for production',
|
|
348
|
+
severity: 'warning',
|
|
349
|
+
recommendation: 'Consider using a more robust storage solution for production workloads',
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
// Check for missing access modes
|
|
354
|
+
if (!pv.spec?.accessModes || pv.spec.accessModes.length === 0) {
|
|
355
|
+
analysis.issues.push({
|
|
356
|
+
pv,
|
|
357
|
+
issue: 'PersistentVolume has no access modes defined',
|
|
358
|
+
severity: 'error',
|
|
359
|
+
recommendation:
|
|
360
|
+
'Define appropriate access modes (ReadWriteOnce, ReadOnlyMany, or ReadWriteMany)',
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
// Check for node affinity issues (if nodeAffinity is set)
|
|
365
|
+
if (pv.spec?.nodeAffinity?.required?.nodeSelectorTerms) {
|
|
366
|
+
// This is a simplified check - we'd need to verify against actual nodes
|
|
367
|
+
const terms = pv.spec.nodeAffinity.required.nodeSelectorTerms;
|
|
368
|
+
if (
|
|
369
|
+
terms.length === 0 ||
|
|
370
|
+
terms.some((term) => !term.matchExpressions || term.matchExpressions.length === 0)
|
|
371
|
+
) {
|
|
372
|
+
analysis.issues.push({
|
|
373
|
+
pv,
|
|
374
|
+
issue: 'PersistentVolume has nodeAffinity set but no valid selector terms',
|
|
375
|
+
severity: 'warning',
|
|
376
|
+
recommendation: 'Review nodeAffinity configuration to ensure proper node selection',
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
return analysis;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
/**
|
|
386
|
+
* Parse storage size string to bytes for comparison
|
|
387
|
+
* Supports common Kubernetes storage units (Ki, Mi, Gi, Ti, K, M, G, T)
|
|
388
|
+
*/
|
|
389
|
+
private parseStorageSize(sizeStr: string): number {
|
|
390
|
+
if (!sizeStr) return 0;
|
|
391
|
+
|
|
392
|
+
const units: { [key: string]: number } = {
|
|
393
|
+
Ki: 1024,
|
|
394
|
+
Mi: 1024 * 1024,
|
|
395
|
+
Gi: 1024 * 1024 * 1024,
|
|
396
|
+
Ti: 1024 * 1024 * 1024 * 1024,
|
|
397
|
+
K: 1000,
|
|
398
|
+
M: 1000 * 1000,
|
|
399
|
+
G: 1000 * 1000 * 1000,
|
|
400
|
+
T: 1000 * 1000 * 1000 * 1000,
|
|
401
|
+
'': 1, // bytes
|
|
402
|
+
};
|
|
403
|
+
|
|
404
|
+
const match = sizeStr.match(/^(\d+(?:\.\d+)?)\s*([A-Za-z]*)$/);
|
|
405
|
+
if (!match) return 0;
|
|
406
|
+
|
|
407
|
+
const value = parseFloat(match[1]);
|
|
408
|
+
const unit = match[2] || '';
|
|
409
|
+
const multiplier = units[unit] || 1;
|
|
410
|
+
|
|
411
|
+
return Math.floor(value * multiplier);
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
/**
|
|
415
|
+
* Get PV usage information (requires metrics or node stats)
|
|
416
|
+
*/
|
|
417
|
+
async getPVUsage(pvName: string): Promise<PVWithUsage | null> {
|
|
418
|
+
try {
|
|
419
|
+
const pv = await this.get(pvName);
|
|
420
|
+
const pvWithUsage: PVWithUsage = { ...pv };
|
|
421
|
+
|
|
422
|
+
// Try to get usage information from node stats
|
|
423
|
+
// This would typically require access to kubelet stats API
|
|
424
|
+
// For now, we'll return the PV without usage info
|
|
425
|
+
pvWithUsage.usage = {
|
|
426
|
+
capacity: pv.spec?.capacity?.storage || 'Unknown',
|
|
427
|
+
used: 'Unknown',
|
|
428
|
+
available: 'Unknown',
|
|
429
|
+
percentUsed: 0,
|
|
430
|
+
};
|
|
431
|
+
|
|
432
|
+
return pvWithUsage;
|
|
433
|
+
} catch (error) {
|
|
434
|
+
this.logger?.error(`Failed to get PV usage for ${pvName}: ${error}`);
|
|
435
|
+
return null;
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
}
|