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.
Files changed (454) hide show
  1. package/.prettierrc.json +11 -0
  2. package/CHANGELOG.md +55 -0
  3. package/LICENSE +21 -0
  4. package/README.md +251 -0
  5. package/RELEASE.md +154 -0
  6. package/TODO.md +0 -0
  7. package/bin/kubeview-mcp.js +274 -0
  8. package/bin/setup.js +368 -0
  9. package/dist/src/cli/cli.d.ts +3 -0
  10. package/dist/src/cli/cli.d.ts.map +1 -0
  11. package/dist/src/cli/cli.js +23 -0
  12. package/dist/src/cli/cli.js.map +1 -0
  13. package/dist/src/index.d.ts +8 -0
  14. package/dist/src/index.d.ts.map +1 -0
  15. package/dist/src/index.js +45 -0
  16. package/dist/src/index.js.map +1 -0
  17. package/dist/src/kubernetes/BaseResourceOperations.d.ts +155 -0
  18. package/dist/src/kubernetes/BaseResourceOperations.d.ts.map +1 -0
  19. package/dist/src/kubernetes/BaseResourceOperations.js +136 -0
  20. package/dist/src/kubernetes/BaseResourceOperations.js.map +1 -0
  21. package/dist/src/kubernetes/CircuitBreaker.d.ts +182 -0
  22. package/dist/src/kubernetes/CircuitBreaker.d.ts.map +1 -0
  23. package/dist/src/kubernetes/CircuitBreaker.js +369 -0
  24. package/dist/src/kubernetes/CircuitBreaker.js.map +1 -0
  25. package/dist/src/kubernetes/ConnectionManager.d.ts +60 -0
  26. package/dist/src/kubernetes/ConnectionManager.d.ts.map +1 -0
  27. package/dist/src/kubernetes/ConnectionManager.js +77 -0
  28. package/dist/src/kubernetes/ConnectionManager.js.map +1 -0
  29. package/dist/src/kubernetes/ConnectionPool.d.ts +183 -0
  30. package/dist/src/kubernetes/ConnectionPool.d.ts.map +1 -0
  31. package/dist/src/kubernetes/ConnectionPool.js +437 -0
  32. package/dist/src/kubernetes/ConnectionPool.js.map +1 -0
  33. package/dist/src/kubernetes/ErrorHandler.d.ts +172 -0
  34. package/dist/src/kubernetes/ErrorHandler.d.ts.map +1 -0
  35. package/dist/src/kubernetes/ErrorHandler.js +328 -0
  36. package/dist/src/kubernetes/ErrorHandler.js.map +1 -0
  37. package/dist/src/kubernetes/ErrorHandling.d.ts +148 -0
  38. package/dist/src/kubernetes/ErrorHandling.d.ts.map +1 -0
  39. package/dist/src/kubernetes/ErrorHandling.js +304 -0
  40. package/dist/src/kubernetes/ErrorHandling.js.map +1 -0
  41. package/dist/src/kubernetes/KubernetesClient.d.ts +162 -0
  42. package/dist/src/kubernetes/KubernetesClient.d.ts.map +1 -0
  43. package/dist/src/kubernetes/KubernetesClient.js +382 -0
  44. package/dist/src/kubernetes/KubernetesClient.js.map +1 -0
  45. package/dist/src/kubernetes/ResourceOperations.d.ts +69 -0
  46. package/dist/src/kubernetes/ResourceOperations.d.ts.map +1 -0
  47. package/dist/src/kubernetes/ResourceOperations.js +99 -0
  48. package/dist/src/kubernetes/ResourceOperations.js.map +1 -0
  49. package/dist/src/kubernetes/RetryStrategy.d.ts +137 -0
  50. package/dist/src/kubernetes/RetryStrategy.d.ts.map +1 -0
  51. package/dist/src/kubernetes/RetryStrategy.js +277 -0
  52. package/dist/src/kubernetes/RetryStrategy.js.map +1 -0
  53. package/dist/src/kubernetes/RetryableOperation.d.ts +118 -0
  54. package/dist/src/kubernetes/RetryableOperation.d.ts.map +1 -0
  55. package/dist/src/kubernetes/RetryableOperation.js +233 -0
  56. package/dist/src/kubernetes/RetryableOperation.js.map +1 -0
  57. package/dist/src/kubernetes/index.d.ts +18 -0
  58. package/dist/src/kubernetes/index.d.ts.map +1 -0
  59. package/dist/src/kubernetes/index.js +28 -0
  60. package/dist/src/kubernetes/index.js.map +1 -0
  61. package/dist/src/kubernetes/resources/ConfigMapOperations.d.ts +60 -0
  62. package/dist/src/kubernetes/resources/ConfigMapOperations.d.ts.map +1 -0
  63. package/dist/src/kubernetes/resources/ConfigMapOperations.js +306 -0
  64. package/dist/src/kubernetes/resources/ConfigMapOperations.js.map +1 -0
  65. package/dist/src/kubernetes/resources/CustomResourceOperations.d.ts +55 -0
  66. package/dist/src/kubernetes/resources/CustomResourceOperations.d.ts.map +1 -0
  67. package/dist/src/kubernetes/resources/CustomResourceOperations.js +363 -0
  68. package/dist/src/kubernetes/resources/CustomResourceOperations.js.map +1 -0
  69. package/dist/src/kubernetes/resources/DeploymentOperations.d.ts +66 -0
  70. package/dist/src/kubernetes/resources/DeploymentOperations.d.ts.map +1 -0
  71. package/dist/src/kubernetes/resources/DeploymentOperations.js +234 -0
  72. package/dist/src/kubernetes/resources/DeploymentOperations.js.map +1 -0
  73. package/dist/src/kubernetes/resources/IngressOperations.d.ts +60 -0
  74. package/dist/src/kubernetes/resources/IngressOperations.d.ts.map +1 -0
  75. package/dist/src/kubernetes/resources/IngressOperations.js +224 -0
  76. package/dist/src/kubernetes/resources/IngressOperations.js.map +1 -0
  77. package/dist/src/kubernetes/resources/MetricOperations.d.ts +218 -0
  78. package/dist/src/kubernetes/resources/MetricOperations.d.ts.map +1 -0
  79. package/dist/src/kubernetes/resources/MetricOperations.js +893 -0
  80. package/dist/src/kubernetes/resources/MetricOperations.js.map +1 -0
  81. package/dist/src/kubernetes/resources/NamespaceOperations.d.ts +38 -0
  82. package/dist/src/kubernetes/resources/NamespaceOperations.d.ts.map +1 -0
  83. package/dist/src/kubernetes/resources/NamespaceOperations.js +101 -0
  84. package/dist/src/kubernetes/resources/NamespaceOperations.js.map +1 -0
  85. package/dist/src/kubernetes/resources/PersistentVolumeClaimOperations.d.ts +109 -0
  86. package/dist/src/kubernetes/resources/PersistentVolumeClaimOperations.d.ts.map +1 -0
  87. package/dist/src/kubernetes/resources/PersistentVolumeClaimOperations.js +383 -0
  88. package/dist/src/kubernetes/resources/PersistentVolumeClaimOperations.js.map +1 -0
  89. package/dist/src/kubernetes/resources/PersistentVolumeOperations.d.ts +97 -0
  90. package/dist/src/kubernetes/resources/PersistentVolumeOperations.d.ts.map +1 -0
  91. package/dist/src/kubernetes/resources/PersistentVolumeOperations.js +321 -0
  92. package/dist/src/kubernetes/resources/PersistentVolumeOperations.js.map +1 -0
  93. package/dist/src/kubernetes/resources/PodOperations.d.ts +99 -0
  94. package/dist/src/kubernetes/resources/PodOperations.d.ts.map +1 -0
  95. package/dist/src/kubernetes/resources/PodOperations.js +333 -0
  96. package/dist/src/kubernetes/resources/PodOperations.js.map +1 -0
  97. package/dist/src/kubernetes/resources/SecretOperations.d.ts +71 -0
  98. package/dist/src/kubernetes/resources/SecretOperations.d.ts.map +1 -0
  99. package/dist/src/kubernetes/resources/SecretOperations.js +254 -0
  100. package/dist/src/kubernetes/resources/SecretOperations.js.map +1 -0
  101. package/dist/src/kubernetes/resources/ServiceOperations.d.ts +64 -0
  102. package/dist/src/kubernetes/resources/ServiceOperations.d.ts.map +1 -0
  103. package/dist/src/kubernetes/resources/ServiceOperations.js +232 -0
  104. package/dist/src/kubernetes/resources/ServiceOperations.js.map +1 -0
  105. package/dist/src/kubernetes/utils/ResourceUtils.d.ts +238 -0
  106. package/dist/src/kubernetes/utils/ResourceUtils.d.ts.map +1 -0
  107. package/dist/src/kubernetes/utils/ResourceUtils.js +439 -0
  108. package/dist/src/kubernetes/utils/ResourceUtils.js.map +1 -0
  109. package/dist/src/plugins/ArgoCDToolsPlugin.d.ts +45 -0
  110. package/dist/src/plugins/ArgoCDToolsPlugin.d.ts.map +1 -0
  111. package/dist/src/plugins/ArgoCDToolsPlugin.js +155 -0
  112. package/dist/src/plugins/ArgoCDToolsPlugin.js.map +1 -0
  113. package/dist/src/plugins/ArgoToolsPlugin.d.ts +45 -0
  114. package/dist/src/plugins/ArgoToolsPlugin.d.ts.map +1 -0
  115. package/dist/src/plugins/ArgoToolsPlugin.js +149 -0
  116. package/dist/src/plugins/ArgoToolsPlugin.js.map +1 -0
  117. package/dist/src/plugins/HelmToolsPlugin.d.ts +41 -0
  118. package/dist/src/plugins/HelmToolsPlugin.d.ts.map +1 -0
  119. package/dist/src/plugins/HelmToolsPlugin.js +146 -0
  120. package/dist/src/plugins/HelmToolsPlugin.js.map +1 -0
  121. package/dist/src/plugins/KubernetesToolsPlugin.d.ts +44 -0
  122. package/dist/src/plugins/KubernetesToolsPlugin.d.ts.map +1 -0
  123. package/dist/src/plugins/KubernetesToolsPlugin.js +159 -0
  124. package/dist/src/plugins/KubernetesToolsPlugin.js.map +1 -0
  125. package/dist/src/plugins/SamplePlugin.d.ts +12 -0
  126. package/dist/src/plugins/SamplePlugin.d.ts.map +1 -0
  127. package/dist/src/plugins/SamplePlugin.js +51 -0
  128. package/dist/src/plugins/SamplePlugin.js.map +1 -0
  129. package/dist/src/plugins/index.d.ts +5 -0
  130. package/dist/src/plugins/index.d.ts.map +1 -0
  131. package/dist/src/plugins/index.js +5 -0
  132. package/dist/src/plugins/index.js.map +1 -0
  133. package/dist/src/server/MCPServer.d.ts +93 -0
  134. package/dist/src/server/MCPServer.d.ts.map +1 -0
  135. package/dist/src/server/MCPServer.js +398 -0
  136. package/dist/src/server/MCPServer.js.map +1 -0
  137. package/dist/src/tools/argo/ArgoCronListTool.d.ts +10 -0
  138. package/dist/src/tools/argo/ArgoCronListTool.d.ts.map +1 -0
  139. package/dist/src/tools/argo/ArgoCronListTool.js +70 -0
  140. package/dist/src/tools/argo/ArgoCronListTool.js.map +1 -0
  141. package/dist/src/tools/argo/ArgoGetTool.d.ts +10 -0
  142. package/dist/src/tools/argo/ArgoGetTool.d.ts.map +1 -0
  143. package/dist/src/tools/argo/ArgoGetTool.js +80 -0
  144. package/dist/src/tools/argo/ArgoGetTool.js.map +1 -0
  145. package/dist/src/tools/argo/ArgoListTool.d.ts +10 -0
  146. package/dist/src/tools/argo/ArgoListTool.d.ts.map +1 -0
  147. package/dist/src/tools/argo/ArgoListTool.js +133 -0
  148. package/dist/src/tools/argo/ArgoListTool.js.map +1 -0
  149. package/dist/src/tools/argo/ArgoLogsTool.d.ts +10 -0
  150. package/dist/src/tools/argo/ArgoLogsTool.d.ts.map +1 -0
  151. package/dist/src/tools/argo/ArgoLogsTool.js +117 -0
  152. package/dist/src/tools/argo/ArgoLogsTool.js.map +1 -0
  153. package/dist/src/tools/argo/BaseTool.d.ts +60 -0
  154. package/dist/src/tools/argo/BaseTool.d.ts.map +1 -0
  155. package/dist/src/tools/argo/BaseTool.js +51 -0
  156. package/dist/src/tools/argo/BaseTool.js.map +1 -0
  157. package/dist/src/tools/argo/index.d.ts +7 -0
  158. package/dist/src/tools/argo/index.d.ts.map +1 -0
  159. package/dist/src/tools/argo/index.js +6 -0
  160. package/dist/src/tools/argo/index.js.map +1 -0
  161. package/dist/src/tools/argocd/ArgoCDAppGetTool.d.ts +10 -0
  162. package/dist/src/tools/argocd/ArgoCDAppGetTool.d.ts.map +1 -0
  163. package/dist/src/tools/argocd/ArgoCDAppGetTool.js +97 -0
  164. package/dist/src/tools/argocd/ArgoCDAppGetTool.js.map +1 -0
  165. package/dist/src/tools/argocd/ArgoCDAppHistoryTool.d.ts +10 -0
  166. package/dist/src/tools/argocd/ArgoCDAppHistoryTool.d.ts.map +1 -0
  167. package/dist/src/tools/argocd/ArgoCDAppHistoryTool.js +80 -0
  168. package/dist/src/tools/argocd/ArgoCDAppHistoryTool.js.map +1 -0
  169. package/dist/src/tools/argocd/ArgoCDAppListTool.d.ts +10 -0
  170. package/dist/src/tools/argocd/ArgoCDAppListTool.d.ts.map +1 -0
  171. package/dist/src/tools/argocd/ArgoCDAppListTool.js +128 -0
  172. package/dist/src/tools/argocd/ArgoCDAppListTool.js.map +1 -0
  173. package/dist/src/tools/argocd/ArgoCDAppLogsTool.d.ts +10 -0
  174. package/dist/src/tools/argocd/ArgoCDAppLogsTool.d.ts.map +1 -0
  175. package/dist/src/tools/argocd/ArgoCDAppLogsTool.js +143 -0
  176. package/dist/src/tools/argocd/ArgoCDAppLogsTool.js.map +1 -0
  177. package/dist/src/tools/argocd/ArgoCDAppResourcesTool.d.ts +10 -0
  178. package/dist/src/tools/argocd/ArgoCDAppResourcesTool.d.ts.map +1 -0
  179. package/dist/src/tools/argocd/ArgoCDAppResourcesTool.js +123 -0
  180. package/dist/src/tools/argocd/ArgoCDAppResourcesTool.js.map +1 -0
  181. package/dist/src/tools/argocd/BaseTool.d.ts +71 -0
  182. package/dist/src/tools/argocd/BaseTool.d.ts.map +1 -0
  183. package/dist/src/tools/argocd/BaseTool.js +62 -0
  184. package/dist/src/tools/argocd/BaseTool.js.map +1 -0
  185. package/dist/src/tools/argocd/index.d.ts +8 -0
  186. package/dist/src/tools/argocd/index.d.ts.map +1 -0
  187. package/dist/src/tools/argocd/index.js +7 -0
  188. package/dist/src/tools/argocd/index.js.map +1 -0
  189. package/dist/src/tools/helm/BaseTool.d.ts +51 -0
  190. package/dist/src/tools/helm/BaseTool.d.ts.map +1 -0
  191. package/dist/src/tools/helm/BaseTool.js +42 -0
  192. package/dist/src/tools/helm/BaseTool.js.map +1 -0
  193. package/dist/src/tools/helm/HelmGetHooksTool.d.ts +10 -0
  194. package/dist/src/tools/helm/HelmGetHooksTool.d.ts.map +1 -0
  195. package/dist/src/tools/helm/HelmGetHooksTool.js +38 -0
  196. package/dist/src/tools/helm/HelmGetHooksTool.js.map +1 -0
  197. package/dist/src/tools/helm/HelmGetManifestTool.d.ts +10 -0
  198. package/dist/src/tools/helm/HelmGetManifestTool.d.ts.map +1 -0
  199. package/dist/src/tools/helm/HelmGetManifestTool.js +38 -0
  200. package/dist/src/tools/helm/HelmGetManifestTool.js.map +1 -0
  201. package/dist/src/tools/helm/HelmGetNotesTool.d.ts +10 -0
  202. package/dist/src/tools/helm/HelmGetNotesTool.d.ts.map +1 -0
  203. package/dist/src/tools/helm/HelmGetNotesTool.js +38 -0
  204. package/dist/src/tools/helm/HelmGetNotesTool.js.map +1 -0
  205. package/dist/src/tools/helm/HelmGetResourcesTool.d.ts +13 -0
  206. package/dist/src/tools/helm/HelmGetResourcesTool.d.ts.map +1 -0
  207. package/dist/src/tools/helm/HelmGetResourcesTool.js +124 -0
  208. package/dist/src/tools/helm/HelmGetResourcesTool.js.map +1 -0
  209. package/dist/src/tools/helm/HelmGetValuesTool.d.ts +10 -0
  210. package/dist/src/tools/helm/HelmGetValuesTool.d.ts.map +1 -0
  211. package/dist/src/tools/helm/HelmGetValuesTool.js +54 -0
  212. package/dist/src/tools/helm/HelmGetValuesTool.js.map +1 -0
  213. package/dist/src/tools/helm/HelmHistoryTool.d.ts +10 -0
  214. package/dist/src/tools/helm/HelmHistoryTool.d.ts.map +1 -0
  215. package/dist/src/tools/helm/HelmHistoryTool.js +49 -0
  216. package/dist/src/tools/helm/HelmHistoryTool.js.map +1 -0
  217. package/dist/src/tools/helm/HelmListTool.d.ts +10 -0
  218. package/dist/src/tools/helm/HelmListTool.d.ts.map +1 -0
  219. package/dist/src/tools/helm/HelmListTool.js +107 -0
  220. package/dist/src/tools/helm/HelmListTool.js.map +1 -0
  221. package/dist/src/tools/helm/HelmListWithResourcesTool.d.ts +14 -0
  222. package/dist/src/tools/helm/HelmListWithResourcesTool.d.ts.map +1 -0
  223. package/dist/src/tools/helm/HelmListWithResourcesTool.js +175 -0
  224. package/dist/src/tools/helm/HelmListWithResourcesTool.js.map +1 -0
  225. package/dist/src/tools/helm/HelmStatusTool.d.ts +10 -0
  226. package/dist/src/tools/helm/HelmStatusTool.d.ts.map +1 -0
  227. package/dist/src/tools/helm/HelmStatusTool.js +54 -0
  228. package/dist/src/tools/helm/HelmStatusTool.js.map +1 -0
  229. package/dist/src/tools/helm/index.d.ts +12 -0
  230. package/dist/src/tools/helm/index.d.ts.map +1 -0
  231. package/dist/src/tools/helm/index.js +11 -0
  232. package/dist/src/tools/helm/index.js.map +1 -0
  233. package/dist/src/tools/kubernetes/BaseTool.d.ts +48 -0
  234. package/dist/src/tools/kubernetes/BaseTool.d.ts.map +1 -0
  235. package/dist/src/tools/kubernetes/BaseTool.js +55 -0
  236. package/dist/src/tools/kubernetes/BaseTool.js.map +1 -0
  237. package/dist/src/tools/kubernetes/GetConfigMapTool.d.ts +11 -0
  238. package/dist/src/tools/kubernetes/GetConfigMapTool.d.ts.map +1 -0
  239. package/dist/src/tools/kubernetes/GetConfigMapTool.js +28 -0
  240. package/dist/src/tools/kubernetes/GetConfigMapTool.js.map +1 -0
  241. package/dist/src/tools/kubernetes/GetContainerLogsTool.d.ts +15 -0
  242. package/dist/src/tools/kubernetes/GetContainerLogsTool.d.ts.map +1 -0
  243. package/dist/src/tools/kubernetes/GetContainerLogsTool.js +119 -0
  244. package/dist/src/tools/kubernetes/GetContainerLogsTool.js.map +1 -0
  245. package/dist/src/tools/kubernetes/GetDeploymentsTool.d.ts +11 -0
  246. package/dist/src/tools/kubernetes/GetDeploymentsTool.d.ts.map +1 -0
  247. package/dist/src/tools/kubernetes/GetDeploymentsTool.js +30 -0
  248. package/dist/src/tools/kubernetes/GetDeploymentsTool.js.map +1 -0
  249. package/dist/src/tools/kubernetes/GetEventsTool.d.ts +11 -0
  250. package/dist/src/tools/kubernetes/GetEventsTool.d.ts.map +1 -0
  251. package/dist/src/tools/kubernetes/GetEventsTool.js +123 -0
  252. package/dist/src/tools/kubernetes/GetEventsTool.js.map +1 -0
  253. package/dist/src/tools/kubernetes/GetIngressTool.d.ts +11 -0
  254. package/dist/src/tools/kubernetes/GetIngressTool.d.ts.map +1 -0
  255. package/dist/src/tools/kubernetes/GetIngressTool.js +35 -0
  256. package/dist/src/tools/kubernetes/GetIngressTool.js.map +1 -0
  257. package/dist/src/tools/kubernetes/GetMetricsTool.d.ts +11 -0
  258. package/dist/src/tools/kubernetes/GetMetricsTool.d.ts.map +1 -0
  259. package/dist/src/tools/kubernetes/GetMetricsTool.js +40 -0
  260. package/dist/src/tools/kubernetes/GetMetricsTool.js.map +1 -0
  261. package/dist/src/tools/kubernetes/GetNamespacesTool.d.ts +11 -0
  262. package/dist/src/tools/kubernetes/GetNamespacesTool.d.ts.map +1 -0
  263. package/dist/src/tools/kubernetes/GetNamespacesTool.js +33 -0
  264. package/dist/src/tools/kubernetes/GetNamespacesTool.js.map +1 -0
  265. package/dist/src/tools/kubernetes/GetPersistentVolumeClaimsTool.d.ts +11 -0
  266. package/dist/src/tools/kubernetes/GetPersistentVolumeClaimsTool.d.ts.map +1 -0
  267. package/dist/src/tools/kubernetes/GetPersistentVolumeClaimsTool.js +92 -0
  268. package/dist/src/tools/kubernetes/GetPersistentVolumeClaimsTool.js.map +1 -0
  269. package/dist/src/tools/kubernetes/GetPersistentVolumesTool.d.ts +11 -0
  270. package/dist/src/tools/kubernetes/GetPersistentVolumesTool.d.ts.map +1 -0
  271. package/dist/src/tools/kubernetes/GetPersistentVolumesTool.js +88 -0
  272. package/dist/src/tools/kubernetes/GetPersistentVolumesTool.js.map +1 -0
  273. package/dist/src/tools/kubernetes/GetPodMetricsTool.d.ts +11 -0
  274. package/dist/src/tools/kubernetes/GetPodMetricsTool.d.ts.map +1 -0
  275. package/dist/src/tools/kubernetes/GetPodMetricsTool.js +100 -0
  276. package/dist/src/tools/kubernetes/GetPodMetricsTool.js.map +1 -0
  277. package/dist/src/tools/kubernetes/GetPodsTool.d.ts +11 -0
  278. package/dist/src/tools/kubernetes/GetPodsTool.d.ts.map +1 -0
  279. package/dist/src/tools/kubernetes/GetPodsTool.js +35 -0
  280. package/dist/src/tools/kubernetes/GetPodsTool.js.map +1 -0
  281. package/dist/src/tools/kubernetes/GetResourceTool.d.ts +12 -0
  282. package/dist/src/tools/kubernetes/GetResourceTool.d.ts.map +1 -0
  283. package/dist/src/tools/kubernetes/GetResourceTool.js +79 -0
  284. package/dist/src/tools/kubernetes/GetResourceTool.js.map +1 -0
  285. package/dist/src/tools/kubernetes/GetSecretsTool.d.ts +11 -0
  286. package/dist/src/tools/kubernetes/GetSecretsTool.d.ts.map +1 -0
  287. package/dist/src/tools/kubernetes/GetSecretsTool.js +49 -0
  288. package/dist/src/tools/kubernetes/GetSecretsTool.js.map +1 -0
  289. package/dist/src/tools/kubernetes/GetServicesTool.d.ts +11 -0
  290. package/dist/src/tools/kubernetes/GetServicesTool.d.ts.map +1 -0
  291. package/dist/src/tools/kubernetes/GetServicesTool.js +35 -0
  292. package/dist/src/tools/kubernetes/GetServicesTool.js.map +1 -0
  293. package/dist/src/tools/kubernetes/index.d.ts +17 -0
  294. package/dist/src/tools/kubernetes/index.d.ts.map +1 -0
  295. package/dist/src/tools/kubernetes/index.js +16 -0
  296. package/dist/src/tools/kubernetes/index.js.map +1 -0
  297. package/dist/src/utils/CliUtils.d.ts +24 -0
  298. package/dist/src/utils/CliUtils.d.ts.map +1 -0
  299. package/dist/src/utils/CliUtils.js +159 -0
  300. package/dist/src/utils/CliUtils.js.map +1 -0
  301. package/dist/tests/__mocks__/@kubernetes/client-node.d.ts +34 -0
  302. package/dist/tests/__mocks__/@kubernetes/client-node.d.ts.map +1 -0
  303. package/dist/tests/__mocks__/@kubernetes/client-node.js +20 -0
  304. package/dist/tests/__mocks__/@kubernetes/client-node.js.map +1 -0
  305. package/dist/tests/argo/ArgoGetTool.test.d.ts +2 -0
  306. package/dist/tests/argo/ArgoGetTool.test.d.ts.map +1 -0
  307. package/dist/tests/argo/ArgoGetTool.test.js +141 -0
  308. package/dist/tests/argo/ArgoGetTool.test.js.map +1 -0
  309. package/dist/tests/helm/BaseTool.test.d.ts +2 -0
  310. package/dist/tests/helm/BaseTool.test.d.ts.map +1 -0
  311. package/dist/tests/helm/BaseTool.test.js +241 -0
  312. package/dist/tests/helm/BaseTool.test.js.map +1 -0
  313. package/dist/tests/index.test.d.ts +2 -0
  314. package/dist/tests/index.test.d.ts.map +1 -0
  315. package/dist/tests/index.test.js +7 -0
  316. package/dist/tests/index.test.js.map +1 -0
  317. package/dist/tests/kubernetes/ConfigMapOperations.test.d.ts +2 -0
  318. package/dist/tests/kubernetes/ConfigMapOperations.test.d.ts.map +1 -0
  319. package/dist/tests/kubernetes/ConfigMapOperations.test.js +460 -0
  320. package/dist/tests/kubernetes/ConfigMapOperations.test.js.map +1 -0
  321. package/dist/tests/kubernetes/ConnectionManager.test.d.ts +2 -0
  322. package/dist/tests/kubernetes/ConnectionManager.test.d.ts.map +1 -0
  323. package/dist/tests/kubernetes/ConnectionManager.test.js +97 -0
  324. package/dist/tests/kubernetes/ConnectionManager.test.js.map +1 -0
  325. package/dist/tests/kubernetes/ConnectionPool.test.d.ts +2 -0
  326. package/dist/tests/kubernetes/ConnectionPool.test.d.ts.map +1 -0
  327. package/dist/tests/kubernetes/ConnectionPool.test.js +328 -0
  328. package/dist/tests/kubernetes/ConnectionPool.test.js.map +1 -0
  329. package/dist/tests/kubernetes/DeploymentOperations.test.d.ts +2 -0
  330. package/dist/tests/kubernetes/DeploymentOperations.test.d.ts.map +1 -0
  331. package/dist/tests/kubernetes/DeploymentOperations.test.js +196 -0
  332. package/dist/tests/kubernetes/DeploymentOperations.test.js.map +1 -0
  333. package/dist/tests/kubernetes/ErrorHandling.test.d.ts +2 -0
  334. package/dist/tests/kubernetes/ErrorHandling.test.d.ts.map +1 -0
  335. package/dist/tests/kubernetes/ErrorHandling.test.js +329 -0
  336. package/dist/tests/kubernetes/ErrorHandling.test.js.map +1 -0
  337. package/dist/tests/kubernetes/GetPodMetricsTool.test.d.ts +2 -0
  338. package/dist/tests/kubernetes/GetPodMetricsTool.test.d.ts.map +1 -0
  339. package/dist/tests/kubernetes/GetPodMetricsTool.test.js +150 -0
  340. package/dist/tests/kubernetes/GetPodMetricsTool.test.js.map +1 -0
  341. package/dist/tests/kubernetes/KubernetesClient.test.d.ts +2 -0
  342. package/dist/tests/kubernetes/KubernetesClient.test.d.ts.map +1 -0
  343. package/dist/tests/kubernetes/KubernetesClient.test.js +371 -0
  344. package/dist/tests/kubernetes/KubernetesClient.test.js.map +1 -0
  345. package/dist/tests/kubernetes/MetricOperations.parsing.test.d.ts +2 -0
  346. package/dist/tests/kubernetes/MetricOperations.parsing.test.d.ts.map +1 -0
  347. package/dist/tests/kubernetes/MetricOperations.parsing.test.js +49 -0
  348. package/dist/tests/kubernetes/MetricOperations.parsing.test.js.map +1 -0
  349. package/dist/tests/kubernetes/NamespaceOperations.test.d.ts +2 -0
  350. package/dist/tests/kubernetes/NamespaceOperations.test.d.ts.map +1 -0
  351. package/dist/tests/kubernetes/NamespaceOperations.test.js +115 -0
  352. package/dist/tests/kubernetes/NamespaceOperations.test.js.map +1 -0
  353. package/dist/tests/kubernetes/PodOperations.test.d.ts +2 -0
  354. package/dist/tests/kubernetes/PodOperations.test.d.ts.map +1 -0
  355. package/dist/tests/kubernetes/PodOperations.test.js +209 -0
  356. package/dist/tests/kubernetes/PodOperations.test.js.map +1 -0
  357. package/dist/tests/kubernetes/RetryStrategy.test.d.ts +2 -0
  358. package/dist/tests/kubernetes/RetryStrategy.test.d.ts.map +1 -0
  359. package/dist/tests/kubernetes/RetryStrategy.test.js +419 -0
  360. package/dist/tests/kubernetes/RetryStrategy.test.js.map +1 -0
  361. package/dist/tests/kubernetes/ServiceOperations.test.d.ts +2 -0
  362. package/dist/tests/kubernetes/ServiceOperations.test.d.ts.map +1 -0
  363. package/dist/tests/kubernetes/ServiceOperations.test.js +159 -0
  364. package/dist/tests/kubernetes/ServiceOperations.test.js.map +1 -0
  365. package/dist/tests/plugins/KubernetesToolsPlugin.test.d.ts +2 -0
  366. package/dist/tests/plugins/KubernetesToolsPlugin.test.d.ts.map +1 -0
  367. package/dist/tests/plugins/KubernetesToolsPlugin.test.js +153 -0
  368. package/dist/tests/plugins/KubernetesToolsPlugin.test.js.map +1 -0
  369. package/dist/tests/server/MCPServer.integration.test.d.ts +2 -0
  370. package/dist/tests/server/MCPServer.integration.test.d.ts.map +1 -0
  371. package/dist/tests/server/MCPServer.integration.test.js +244 -0
  372. package/dist/tests/server/MCPServer.integration.test.js.map +1 -0
  373. package/dist/tests/server/MCPServer.test.d.ts +2 -0
  374. package/dist/tests/server/MCPServer.test.d.ts.map +1 -0
  375. package/dist/tests/server/MCPServer.test.js +257 -0
  376. package/dist/tests/server/MCPServer.test.js.map +1 -0
  377. package/package.json +85 -0
  378. package/src/cli/cli.ts +25 -0
  379. package/src/cli/run-command.js +391 -0
  380. package/src/index.ts +46 -0
  381. package/src/kubernetes/BaseResourceOperations.ts +286 -0
  382. package/src/kubernetes/CircuitBreaker.ts +485 -0
  383. package/src/kubernetes/ConnectionManager.ts +114 -0
  384. package/src/kubernetes/ConnectionPool.ts +551 -0
  385. package/src/kubernetes/ErrorHandler.ts +436 -0
  386. package/src/kubernetes/ErrorHandling.ts +401 -0
  387. package/src/kubernetes/KubernetesClient.ts +500 -0
  388. package/src/kubernetes/README.md +349 -0
  389. package/src/kubernetes/ResourceOperations.ts +116 -0
  390. package/src/kubernetes/RetryStrategy.ts +365 -0
  391. package/src/kubernetes/RetryableOperation.ts +313 -0
  392. package/src/kubernetes/docs/ResourceOperations.md +606 -0
  393. package/src/kubernetes/index.ts +116 -0
  394. package/src/kubernetes/resources/ConfigMapOperations.ts +367 -0
  395. package/src/kubernetes/resources/CustomResourceOperations.ts +392 -0
  396. package/src/kubernetes/resources/DeploymentOperations.ts +294 -0
  397. package/src/kubernetes/resources/IngressOperations.ts +277 -0
  398. package/src/kubernetes/resources/MetricOperations.ts +1159 -0
  399. package/src/kubernetes/resources/NamespaceOperations.ts +129 -0
  400. package/src/kubernetes/resources/PersistentVolumeClaimOperations.ts +516 -0
  401. package/src/kubernetes/resources/PersistentVolumeOperations.ts +438 -0
  402. package/src/kubernetes/resources/PodOperations.ts +417 -0
  403. package/src/kubernetes/resources/SecretOperations.ts +304 -0
  404. package/src/kubernetes/resources/ServiceOperations.ts +283 -0
  405. package/src/kubernetes/utils/ResourceUtils.ts +553 -0
  406. package/src/plugins/ArgoCDToolsPlugin.ts +189 -0
  407. package/src/plugins/ArgoToolsPlugin.ts +180 -0
  408. package/src/plugins/HelmToolsPlugin.ts +180 -0
  409. package/src/plugins/KubernetesToolsPlugin.ts +198 -0
  410. package/src/plugins/SamplePlugin.ts +60 -0
  411. package/src/plugins/index.ts +4 -0
  412. package/src/server/MCPServer.ts +500 -0
  413. package/src/tools/argo/ArgoCronListTool.ts +78 -0
  414. package/src/tools/argo/ArgoGetTool.ts +91 -0
  415. package/src/tools/argo/ArgoListTool.ts +143 -0
  416. package/src/tools/argo/ArgoLogsTool.ts +131 -0
  417. package/src/tools/argo/BaseTool.ts +69 -0
  418. package/src/tools/argo/index.ts +6 -0
  419. package/src/tools/argocd/ArgoCDAppGetTool.ts +109 -0
  420. package/src/tools/argocd/ArgoCDAppHistoryTool.ts +91 -0
  421. package/src/tools/argocd/ArgoCDAppListTool.ts +144 -0
  422. package/src/tools/argocd/ArgoCDAppLogsTool.ts +162 -0
  423. package/src/tools/argocd/ArgoCDAppResourcesTool.ts +139 -0
  424. package/src/tools/argocd/BaseTool.ts +83 -0
  425. package/src/tools/argocd/index.ts +7 -0
  426. package/src/tools/helm/BaseTool.ts +60 -0
  427. package/src/tools/helm/HelmGetHooksTool.ts +44 -0
  428. package/src/tools/helm/HelmGetManifestTool.ts +44 -0
  429. package/src/tools/helm/HelmGetNotesTool.ts +44 -0
  430. package/src/tools/helm/HelmGetResourcesTool.ts +140 -0
  431. package/src/tools/helm/HelmGetValuesTool.ts +62 -0
  432. package/src/tools/helm/HelmHistoryTool.ts +56 -0
  433. package/src/tools/helm/HelmListTool.ts +107 -0
  434. package/src/tools/helm/HelmListWithResourcesTool.ts +194 -0
  435. package/src/tools/helm/HelmStatusTool.ts +62 -0
  436. package/src/tools/helm/index.ts +11 -0
  437. package/src/tools/kubernetes/BaseTool.ts +76 -0
  438. package/src/tools/kubernetes/GetConfigMapTool.ts +33 -0
  439. package/src/tools/kubernetes/GetContainerLogsTool.ts +140 -0
  440. package/src/tools/kubernetes/GetDeploymentsTool.ts +33 -0
  441. package/src/tools/kubernetes/GetEventsTool.ts +133 -0
  442. package/src/tools/kubernetes/GetIngressTool.ts +39 -0
  443. package/src/tools/kubernetes/GetMetricsTool.ts +53 -0
  444. package/src/tools/kubernetes/GetNamespacesTool.ts +36 -0
  445. package/src/tools/kubernetes/GetPersistentVolumeClaimsTool.ts +113 -0
  446. package/src/tools/kubernetes/GetPersistentVolumesTool.ts +107 -0
  447. package/src/tools/kubernetes/GetPodMetricsTool.ts +113 -0
  448. package/src/tools/kubernetes/GetPodsTool.ts +39 -0
  449. package/src/tools/kubernetes/GetResourceTool.ts +90 -0
  450. package/src/tools/kubernetes/GetSecretsTool.ts +55 -0
  451. package/src/tools/kubernetes/GetServicesTool.ts +39 -0
  452. package/src/tools/kubernetes/index.ts +16 -0
  453. package/src/utils/CliUtils.ts +207 -0
  454. 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
+ }