@backstage/plugin-kubernetes-react 0.3.4-next.1 → 0.3.5-next.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 (154) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/api/KubernetesBackendClient.esm.js +137 -0
  3. package/dist/api/KubernetesBackendClient.esm.js.map +1 -0
  4. package/dist/api/KubernetesClusterLinkFormatter.esm.js +38 -0
  5. package/dist/api/KubernetesClusterLinkFormatter.esm.js.map +1 -0
  6. package/dist/api/KubernetesProxyClient.esm.js +76 -0
  7. package/dist/api/KubernetesProxyClient.esm.js.map +1 -0
  8. package/dist/api/formatters/AksClusterLinksFormatter.esm.js +35 -0
  9. package/dist/api/formatters/AksClusterLinksFormatter.esm.js.map +1 -0
  10. package/dist/api/formatters/EksClusterLinksFormatter.esm.js +10 -0
  11. package/dist/api/formatters/EksClusterLinksFormatter.esm.js.map +1 -0
  12. package/dist/api/formatters/GkeClusterLinksFormatter.esm.js +62 -0
  13. package/dist/api/formatters/GkeClusterLinksFormatter.esm.js.map +1 -0
  14. package/dist/api/formatters/OpenshiftClusterLinksFormatter.esm.js +41 -0
  15. package/dist/api/formatters/OpenshiftClusterLinksFormatter.esm.js.map +1 -0
  16. package/dist/api/formatters/RancherClusterLinksFormatter.esm.js +33 -0
  17. package/dist/api/formatters/RancherClusterLinksFormatter.esm.js.map +1 -0
  18. package/dist/api/formatters/StandardClusterLinksFormatter.esm.js +37 -0
  19. package/dist/api/formatters/StandardClusterLinksFormatter.esm.js.map +1 -0
  20. package/dist/api/formatters/index.esm.js +21 -0
  21. package/dist/api/formatters/index.esm.js.map +1 -0
  22. package/dist/api/types.esm.js +14 -0
  23. package/dist/api/types.esm.js.map +1 -0
  24. package/dist/components/Cluster/Cluster.esm.js +88 -0
  25. package/dist/components/Cluster/Cluster.esm.js.map +1 -0
  26. package/dist/components/CronJobsAccordions/CronJobsAccordions.esm.js +80 -0
  27. package/dist/components/CronJobsAccordions/CronJobsAccordions.esm.js.map +1 -0
  28. package/dist/components/CronJobsAccordions/CronJobsDrawer.esm.js +51 -0
  29. package/dist/components/CronJobsAccordions/CronJobsDrawer.esm.js.map +1 -0
  30. package/dist/components/CustomResources/ArgoRollouts/Rollout.esm.js +222 -0
  31. package/dist/components/CustomResources/ArgoRollouts/Rollout.esm.js.map +1 -0
  32. package/dist/components/CustomResources/ArgoRollouts/RolloutDrawer.esm.js +40 -0
  33. package/dist/components/CustomResources/ArgoRollouts/RolloutDrawer.esm.js.map +1 -0
  34. package/dist/components/CustomResources/ArgoRollouts/StepsProgress.esm.js +32 -0
  35. package/dist/components/CustomResources/ArgoRollouts/StepsProgress.esm.js.map +1 -0
  36. package/dist/components/CustomResources/CustomResources.esm.js +44 -0
  37. package/dist/components/CustomResources/CustomResources.esm.js.map +1 -0
  38. package/dist/components/CustomResources/DefaultCustomResource.esm.js +79 -0
  39. package/dist/components/CustomResources/DefaultCustomResource.esm.js.map +1 -0
  40. package/dist/components/CustomResources/DefaultCustomResourceDrawer.esm.js +43 -0
  41. package/dist/components/CustomResources/DefaultCustomResourceDrawer.esm.js.map +1 -0
  42. package/dist/components/DaemonSetsAccordions/DaemonSetsAccordions.esm.js +126 -0
  43. package/dist/components/DaemonSetsAccordions/DaemonSetsAccordions.esm.js.map +1 -0
  44. package/dist/components/DaemonSetsAccordions/DaemonSetsDrawer.esm.js +55 -0
  45. package/dist/components/DaemonSetsAccordions/DaemonSetsDrawer.esm.js.map +1 -0
  46. package/dist/components/DeploymentsAccordions/DeploymentDrawer.esm.js +56 -0
  47. package/dist/components/DeploymentsAccordions/DeploymentDrawer.esm.js.map +1 -0
  48. package/dist/components/DeploymentsAccordions/DeploymentsAccordions.esm.js +160 -0
  49. package/dist/components/DeploymentsAccordions/DeploymentsAccordions.esm.js.map +1 -0
  50. package/dist/components/ErrorPanel/ErrorPanel.esm.js +27 -0
  51. package/dist/components/ErrorPanel/ErrorPanel.esm.js.map +1 -0
  52. package/dist/components/ErrorReporting/ErrorReporting.esm.js +63 -0
  53. package/dist/components/ErrorReporting/ErrorReporting.esm.js.map +1 -0
  54. package/dist/components/HorizontalPodAutoscalers/HorizontalPodAutoscalerDrawer.esm.js +34 -0
  55. package/dist/components/HorizontalPodAutoscalers/HorizontalPodAutoscalerDrawer.esm.js.map +1 -0
  56. package/dist/components/IngressesAccordions/IngressDrawer.esm.js +42 -0
  57. package/dist/components/IngressesAccordions/IngressDrawer.esm.js.map +1 -0
  58. package/dist/components/IngressesAccordions/IngressesAccordions.esm.js +62 -0
  59. package/dist/components/IngressesAccordions/IngressesAccordions.esm.js.map +1 -0
  60. package/dist/components/JobsAccordions/JobsAccordions.esm.js +101 -0
  61. package/dist/components/JobsAccordions/JobsAccordions.esm.js.map +1 -0
  62. package/dist/components/JobsAccordions/JobsDrawer.esm.js +48 -0
  63. package/dist/components/JobsAccordions/JobsDrawer.esm.js.map +1 -0
  64. package/dist/components/KubernetesDialog/KubernetesDialog.esm.js +72 -0
  65. package/dist/components/KubernetesDialog/KubernetesDialog.esm.js.map +1 -0
  66. package/dist/components/KubernetesDrawer/KubernetesDrawer.esm.js +117 -0
  67. package/dist/components/KubernetesDrawer/KubernetesDrawer.esm.js.map +1 -0
  68. package/dist/components/KubernetesDrawer/KubernetesStructuredMetadataTableDrawer.esm.js +199 -0
  69. package/dist/components/KubernetesDrawer/KubernetesStructuredMetadataTableDrawer.esm.js.map +1 -0
  70. package/dist/components/KubernetesDrawer/ManifestYaml.esm.js +44 -0
  71. package/dist/components/KubernetesDrawer/ManifestYaml.esm.js.map +1 -0
  72. package/dist/components/PodExecTerminal/PodExecTerminal.esm.js +88 -0
  73. package/dist/components/PodExecTerminal/PodExecTerminal.esm.js.map +1 -0
  74. package/dist/components/PodExecTerminal/PodExecTerminalAttachAddon.esm.js +40 -0
  75. package/dist/components/PodExecTerminal/PodExecTerminalAttachAddon.esm.js.map +1 -0
  76. package/dist/components/PodExecTerminal/PodExecTerminalDialog.esm.js +35 -0
  77. package/dist/components/PodExecTerminal/PodExecTerminalDialog.esm.js.map +1 -0
  78. package/dist/components/Pods/ErrorList/ErrorList.esm.js +52 -0
  79. package/dist/components/Pods/ErrorList/ErrorList.esm.js.map +1 -0
  80. package/dist/components/Pods/Events/Events.esm.js +74 -0
  81. package/dist/components/Pods/Events/Events.esm.js.map +1 -0
  82. package/dist/components/Pods/Events/useEvents.esm.js +21 -0
  83. package/dist/components/Pods/Events/useEvents.esm.js.map +1 -0
  84. package/dist/components/Pods/FixDialog/FixDialog.esm.js +107 -0
  85. package/dist/components/Pods/FixDialog/FixDialog.esm.js.map +1 -0
  86. package/dist/components/Pods/PodDrawer/ContainerCard.esm.js +166 -0
  87. package/dist/components/Pods/PodDrawer/ContainerCard.esm.js.map +1 -0
  88. package/dist/components/Pods/PodDrawer/PendingPodContent.esm.js +30 -0
  89. package/dist/components/Pods/PodDrawer/PendingPodContent.esm.js.map +1 -0
  90. package/dist/components/Pods/PodDrawer/PodDrawer.esm.js +114 -0
  91. package/dist/components/Pods/PodDrawer/PodDrawer.esm.js.map +1 -0
  92. package/dist/components/Pods/PodLogs/PodLogs.esm.js +44 -0
  93. package/dist/components/Pods/PodLogs/PodLogs.esm.js.map +1 -0
  94. package/dist/components/Pods/PodLogs/PodLogsDialog.esm.js +21 -0
  95. package/dist/components/Pods/PodLogs/PodLogsDialog.esm.js.map +1 -0
  96. package/dist/components/Pods/PodLogs/usePodLogs.esm.js +19 -0
  97. package/dist/components/Pods/PodLogs/usePodLogs.esm.js.map +1 -0
  98. package/dist/components/Pods/PodsTable.esm.js +153 -0
  99. package/dist/components/Pods/PodsTable.esm.js.map +1 -0
  100. package/dist/components/ResourceUtilization/ResourceUtilization.esm.js +50 -0
  101. package/dist/components/ResourceUtilization/ResourceUtilization.esm.js.map +1 -0
  102. package/dist/components/ServicesAccordions/ServiceDrawer.esm.js +42 -0
  103. package/dist/components/ServicesAccordions/ServiceDrawer.esm.js.map +1 -0
  104. package/dist/components/ServicesAccordions/ServicesAccordions.esm.js +79 -0
  105. package/dist/components/ServicesAccordions/ServicesAccordions.esm.js.map +1 -0
  106. package/dist/components/StatefulSetsAccordions/StatefulSetDrawer.esm.js +58 -0
  107. package/dist/components/StatefulSetsAccordions/StatefulSetDrawer.esm.js.map +1 -0
  108. package/dist/components/StatefulSetsAccordions/StatefulSetsAccordions.esm.js +156 -0
  109. package/dist/components/StatefulSetsAccordions/StatefulSetsAccordions.esm.js.map +1 -0
  110. package/dist/hooks/Cluster.esm.js +8 -0
  111. package/dist/hooks/Cluster.esm.js.map +1 -0
  112. package/dist/hooks/GroupedResponses.esm.js +19 -0
  113. package/dist/hooks/GroupedResponses.esm.js.map +1 -0
  114. package/dist/hooks/PodNamesWithErrors.esm.js +8 -0
  115. package/dist/hooks/PodNamesWithErrors.esm.js.map +1 -0
  116. package/dist/hooks/PodNamesWithMetrics.esm.js +6 -0
  117. package/dist/hooks/PodNamesWithMetrics.esm.js.map +1 -0
  118. package/dist/hooks/auth.esm.js +24 -0
  119. package/dist/hooks/auth.esm.js.map +1 -0
  120. package/dist/hooks/useCustomResources.esm.js +42 -0
  121. package/dist/hooks/useCustomResources.esm.js.map +1 -0
  122. package/dist/hooks/useIsPodExecTerminalEnabled.esm.js +9 -0
  123. package/dist/hooks/useIsPodExecTerminalEnabled.esm.js.map +1 -0
  124. package/dist/hooks/useIsPodExecTerminalSupported.esm.js +21 -0
  125. package/dist/hooks/useIsPodExecTerminalSupported.esm.js.map +1 -0
  126. package/dist/hooks/useKubernetesObjects.esm.js +36 -0
  127. package/dist/hooks/useKubernetesObjects.esm.js.map +1 -0
  128. package/dist/hooks/useMatchingErrors.esm.js +20 -0
  129. package/dist/hooks/useMatchingErrors.esm.js.map +1 -0
  130. package/dist/hooks/usePodMetrics.esm.js +20 -0
  131. package/dist/hooks/usePodMetrics.esm.js.map +1 -0
  132. package/dist/index.esm.js +53 -3441
  133. package/dist/index.esm.js.map +1 -1
  134. package/dist/kubernetes-auth-provider/AksKubernetesAuthProvider.esm.js +21 -0
  135. package/dist/kubernetes-auth-provider/AksKubernetesAuthProvider.esm.js.map +1 -0
  136. package/dist/kubernetes-auth-provider/GoogleKubernetesAuthProvider.esm.js +31 -0
  137. package/dist/kubernetes-auth-provider/GoogleKubernetesAuthProvider.esm.js.map +1 -0
  138. package/dist/kubernetes-auth-provider/KubernetesAuthProviders.esm.js +89 -0
  139. package/dist/kubernetes-auth-provider/KubernetesAuthProviders.esm.js.map +1 -0
  140. package/dist/kubernetes-auth-provider/OidcKubernetesAuthProvider.esm.js +33 -0
  141. package/dist/kubernetes-auth-provider/OidcKubernetesAuthProvider.esm.js.map +1 -0
  142. package/dist/kubernetes-auth-provider/ServerSideAuthProvider.esm.js +11 -0
  143. package/dist/kubernetes-auth-provider/ServerSideAuthProvider.esm.js.map +1 -0
  144. package/dist/kubernetes-auth-provider/types.esm.js +8 -0
  145. package/dist/kubernetes-auth-provider/types.esm.js.map +1 -0
  146. package/dist/utils/crons.esm.js +22 -0
  147. package/dist/utils/crons.esm.js.map +1 -0
  148. package/dist/utils/owner.esm.js +30 -0
  149. package/dist/utils/owner.esm.js.map +1 -0
  150. package/dist/utils/pod.esm.js +120 -0
  151. package/dist/utils/pod.esm.js.map +1 -0
  152. package/dist/utils/resources.esm.js +19 -0
  153. package/dist/utils/resources.esm.js.map +1 -0
  154. package/package.json +9 -9
package/dist/index.esm.js CHANGED
@@ -1,3442 +1,54 @@
1
- import { useApi, configApiRef, createApiRef, discoveryApiRef } from '@backstage/core-plugin-api';
2
- import useAsync from 'react-use/esm/useAsync';
3
- import * as React from 'react';
4
- import React__default, { useCallback, useContext, useState, useEffect, useMemo, Fragment } from 'react';
5
- import useInterval from 'react-use/esm/useInterval';
6
- import useAsyncRetry from 'react-use/esm/useAsyncRetry';
7
- import { stringifyEntityRef } from '@backstage/catalog-model';
8
- import { NotFoundError } from '@backstage/errors';
9
- import { makeStyles, createStyles, Dialog, DialogTitle, IconButton, DialogContent, Button, Grid, Typography, Paper, Card, CardHeader, CardContent, CardActions, FormControlLabel, Switch, Drawer, withStyles as withStyles$1, List, ListItem, Container, Tooltip, ListItemText, ListItemAvatar, Avatar, Divider, Chip, Accordion, AccordionSummary, AccordionDetails, Stepper, Step, StepLabel } from '@material-ui/core';
10
- import { groupResponses } from '@backstage/plugin-kubernetes-common';
11
- import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
12
- import { LinearGauge, DismissableBanner, EmptyState, LogViewer, StructuredMetadataTable, CodeSnippet, WarningPanel, LinkButton, StatusError, StatusOK, StatusWarning, ItemCardGrid, SubvalueCell, StatusAborted, Table, StatusPending } from '@backstage/core-components';
13
- import { DateTime } from 'luxon';
14
- import OpenInBrowserIcon from '@material-ui/icons/OpenInBrowser';
15
- import CloseIcon from '@material-ui/icons/Close';
16
- import 'xterm/css/xterm.css';
17
- import { Terminal } from 'xterm';
18
- import { FitAddon } from 'xterm-addon-fit';
19
- import { AttachAddon } from 'xterm-addon-attach';
20
- import { Skeleton } from '@material-ui/lab';
21
- import SubjectIcon from '@material-ui/icons/Subject';
22
- import OpenInNewIcon from '@material-ui/icons/OpenInNew';
23
- import { withStyles, makeStyles as makeStyles$1, createStyles as createStyles$1 } from '@material-ui/core/styles';
24
- import jsyaml from 'js-yaml';
25
- import Dialog$1 from '@material-ui/core/Dialog';
26
- import DialogActions from '@material-ui/core/DialogActions';
27
- import DialogContent$1 from '@material-ui/core/DialogContent';
28
- import DialogTitle$1 from '@material-ui/core/DialogTitle';
29
- import IconButton$1 from '@material-ui/core/IconButton';
30
- import Typography$1 from '@material-ui/core/Typography';
31
- import HelpIcon from '@material-ui/icons/Help';
32
- import InfoIcon from '@material-ui/icons/Info';
33
- import WarningIcon from '@material-ui/icons/Warning';
34
- import cronstrue from 'cronstrue';
35
- import lodash from 'lodash';
36
- import PauseIcon from '@material-ui/icons/Pause';
37
- import ErrorOutlineIcon from '@material-ui/icons/ErrorOutline';
38
-
39
- const useIsPodExecTerminalEnabled = () => {
40
- const configApi = useApi(configApiRef);
41
- return configApi.getOptionalBoolean("kubernetes.podExecTerminal.enabled");
42
- };
43
-
44
- const kubernetesApiRef = createApiRef({
45
- id: "plugin.kubernetes.service"
46
- });
47
- const kubernetesProxyApiRef = createApiRef({
48
- id: "plugin.kubernetes.proxy-service"
49
- });
50
- const kubernetesClusterLinkFormatterApiRef = createApiRef({
51
- id: "plugin.kubernetes.cluster-link-formatter-service"
52
- });
53
-
54
- const useIsPodExecTerminalSupported = () => {
55
- const kubernetesApi = useApi(kubernetesApiRef);
56
- return useAsync(async () => {
57
- const clusters = await kubernetesApi.getClusters();
58
- if (clusters.length !== 1) {
59
- return false;
60
- }
61
- const { authProvider } = clusters[0];
62
- const isClientAuthProvider = ["aks", "google", "oidc"].some(
63
- (authProviderName) => authProvider.includes(authProviderName)
64
- );
65
- return !isClientAuthProvider;
66
- });
67
- };
68
-
69
- const generateAuth = async (entity, kubernetesApi, kubernetesAuthProvidersApi) => {
70
- var _a;
71
- const clusters = await kubernetesApi.getClusters();
72
- const authProviders = [
73
- ...new Set(
74
- clusters.map(
75
- (c) => `${c.authProvider}${c.oidcTokenProvider ? `.${c.oidcTokenProvider}` : ""}`
76
- )
77
- )
78
- ];
79
- let requestBody = {
80
- entity
81
- };
82
- for (const authProviderStr of authProviders) {
83
- requestBody = await kubernetesAuthProvidersApi.decorateRequestBodyForAuth(
84
- authProviderStr,
85
- requestBody
86
- );
87
- }
88
- return (_a = requestBody.auth) != null ? _a : {};
89
- };
90
-
91
- const kubernetesAuthProvidersApiRef = createApiRef({
92
- id: "plugin.kubernetes-auth-providers.service"
93
- });
94
-
95
- var __defProp$5 = Object.defineProperty;
96
- var __defNormalProp$5 = (obj, key, value) => key in obj ? __defProp$5(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
97
- var __publicField$5 = (obj, key, value) => {
98
- __defNormalProp$5(obj, typeof key !== "symbol" ? key + "" : key, value);
99
- return value;
100
- };
101
- class GoogleKubernetesAuthProvider {
102
- constructor(authProvider) {
103
- __publicField$5(this, "authProvider");
104
- this.authProvider = authProvider;
105
- }
106
- async decorateRequestBodyForAuth(requestBody) {
107
- const googleAuthToken = (await this.getCredentials()).token;
108
- if ("auth" in requestBody) {
109
- requestBody.auth.google = googleAuthToken;
110
- } else {
111
- requestBody.auth = { google: googleAuthToken };
112
- }
113
- return requestBody;
114
- }
115
- async getCredentials() {
116
- return {
117
- token: await this.authProvider.getAccessToken(
118
- "https://www.googleapis.com/auth/cloud-platform.read-only"
119
- )
120
- };
121
- }
122
- }
123
-
124
- class ServerSideKubernetesAuthProvider {
125
- async decorateRequestBodyForAuth(requestBody) {
126
- return requestBody;
127
- }
128
- async getCredentials() {
129
- return {};
130
- }
131
- }
132
-
133
- var __defProp$4 = Object.defineProperty;
134
- var __defNormalProp$4 = (obj, key, value) => key in obj ? __defProp$4(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
135
- var __publicField$4 = (obj, key, value) => {
136
- __defNormalProp$4(obj, typeof key !== "symbol" ? key + "" : key, value);
137
- return value;
138
- };
139
- class OidcKubernetesAuthProvider {
140
- constructor(providerName, authProvider) {
141
- __publicField$4(this, "providerName");
142
- __publicField$4(this, "authProvider");
143
- this.providerName = providerName;
144
- this.authProvider = authProvider;
145
- }
146
- async decorateRequestBodyForAuth(requestBody) {
147
- const authToken = (await this.getCredentials()).token;
148
- const auth = { ...requestBody.auth };
149
- if (auth.oidc) {
150
- auth.oidc[this.providerName] = authToken;
151
- } else {
152
- auth.oidc = { [this.providerName]: authToken };
153
- }
154
- requestBody.auth = auth;
155
- return requestBody;
156
- }
157
- async getCredentials() {
158
- return {
159
- token: await this.authProvider.getIdToken()
160
- };
161
- }
162
- }
163
-
164
- class AksKubernetesAuthProvider {
165
- constructor(microsoftAuthApi) {
166
- this.microsoftAuthApi = microsoftAuthApi;
167
- }
168
- async decorateRequestBodyForAuth(requestBody) {
169
- return {
170
- ...requestBody,
171
- auth: { ...requestBody.auth, aks: (await this.getCredentials()).token }
172
- };
173
- }
174
- async getCredentials() {
175
- return {
176
- token: await this.microsoftAuthApi.getAccessToken(
177
- "6dae42f8-4368-4678-94ff-3960e28e3630/user.read"
178
- )
179
- };
180
- }
181
- }
182
-
183
- var __defProp$3 = Object.defineProperty;
184
- var __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
185
- var __publicField$3 = (obj, key, value) => {
186
- __defNormalProp$3(obj, typeof key !== "symbol" ? key + "" : key, value);
187
- return value;
188
- };
189
- class KubernetesAuthProviders {
190
- constructor(options) {
191
- __publicField$3(this, "kubernetesAuthProviderMap");
192
- this.kubernetesAuthProviderMap = /* @__PURE__ */ new Map();
193
- this.kubernetesAuthProviderMap.set(
194
- "google",
195
- new GoogleKubernetesAuthProvider(options.googleAuthApi)
196
- );
197
- this.kubernetesAuthProviderMap.set(
198
- "serviceAccount",
199
- new ServerSideKubernetesAuthProvider()
200
- );
201
- this.kubernetesAuthProviderMap.set(
202
- "googleServiceAccount",
203
- new ServerSideKubernetesAuthProvider()
204
- );
205
- this.kubernetesAuthProviderMap.set(
206
- "aws",
207
- new ServerSideKubernetesAuthProvider()
208
- );
209
- this.kubernetesAuthProviderMap.set(
210
- "azure",
211
- new ServerSideKubernetesAuthProvider()
212
- );
213
- this.kubernetesAuthProviderMap.set(
214
- "localKubectlProxy",
215
- new ServerSideKubernetesAuthProvider()
216
- );
217
- this.kubernetesAuthProviderMap.set(
218
- "aks",
219
- new AksKubernetesAuthProvider(options.microsoftAuthApi)
220
- );
221
- if (options.oidcProviders) {
222
- Object.keys(options.oidcProviders).forEach((provider) => {
223
- this.kubernetesAuthProviderMap.set(
224
- `oidc.${provider}`,
225
- new OidcKubernetesAuthProvider(
226
- provider,
227
- options.oidcProviders[provider]
228
- )
229
- );
230
- });
231
- }
232
- }
233
- async decorateRequestBodyForAuth(authProvider, requestBody) {
234
- const kubernetesAuthProvider = this.kubernetesAuthProviderMap.get(authProvider);
235
- if (kubernetesAuthProvider) {
236
- return await kubernetesAuthProvider.decorateRequestBodyForAuth(
237
- requestBody
238
- );
239
- }
240
- if (authProvider.startsWith("oidc.")) {
241
- throw new Error(
242
- `KubernetesAuthProviders has no oidcProvider configured for ${authProvider}`
243
- );
244
- }
245
- throw new Error(
246
- `authProvider "${authProvider}" has no KubernetesAuthProvider defined for it`
247
- );
248
- }
249
- async getCredentials(authProvider) {
250
- const kubernetesAuthProvider = this.kubernetesAuthProviderMap.get(authProvider);
251
- if (kubernetesAuthProvider) {
252
- return await kubernetesAuthProvider.getCredentials();
253
- }
254
- if (authProvider.startsWith("oidc.")) {
255
- throw new Error(
256
- `KubernetesAuthProviders has no oidcProvider configured for ${authProvider}`
257
- );
258
- }
259
- throw new Error(
260
- `authProvider "${authProvider}" has no KubernetesAuthProvider defined for it`
261
- );
262
- }
263
- }
264
-
265
- const useKubernetesObjects = (entity, intervalMs = 1e4) => {
266
- const kubernetesApi = useApi(kubernetesApiRef);
267
- const kubernetesAuthProvidersApi = useApi(kubernetesAuthProvidersApiRef);
268
- const getObjects = useCallback(async () => {
269
- const auth = await generateAuth(
270
- entity,
271
- kubernetesApi,
272
- kubernetesAuthProvidersApi
273
- );
274
- return await kubernetesApi.getObjectsByEntity({
275
- auth,
276
- entity
277
- });
278
- }, [kubernetesApi, entity, kubernetesAuthProvidersApi]);
279
- const { value, loading, error, retry } = useAsyncRetry(
280
- () => getObjects(),
281
- [getObjects]
282
- );
283
- useInterval(() => retry(), intervalMs);
284
- return {
285
- kubernetesObjects: value,
286
- loading,
287
- error: error == null ? void 0 : error.message
288
- };
289
- };
290
-
291
- const useCustomResources = (entity, customResourceMatchers, intervalMs = 1e4) => {
292
- const kubernetesApi = useApi(kubernetesApiRef);
293
- const kubernetesAuthProvidersApi = useApi(kubernetesAuthProvidersApiRef);
294
- const matchersString = JSON.stringify(customResourceMatchers);
295
- const getCustomObjects = useCallback(
296
- async () => {
297
- const auth = await generateAuth(
298
- entity,
299
- kubernetesApi,
300
- kubernetesAuthProvidersApi
301
- );
302
- return await kubernetesApi.getCustomObjectsByEntity({
303
- auth,
304
- customResources: customResourceMatchers,
305
- entity
306
- });
307
- },
308
- // eslint-disable-next-line react-hooks/exhaustive-deps
309
- [kubernetesApi, entity, kubernetesAuthProvidersApi, matchersString]
310
- );
311
- const { value, loading, error, retry } = useAsyncRetry(
312
- () => getCustomObjects(),
313
- [getCustomObjects]
314
- );
315
- useInterval(() => retry(), intervalMs);
316
- return {
317
- kubernetesObjects: value,
318
- loading,
319
- error: error == null ? void 0 : error.message
320
- };
321
- };
322
-
323
- const PodNamesWithErrorsContext = React__default.createContext(
324
- /* @__PURE__ */ new Set()
325
- );
326
-
327
- const PodNamesWithMetricsContext = React__default.createContext(/* @__PURE__ */ new Map());
328
-
329
- const GroupedResponsesContext = React__default.createContext({
330
- pods: [],
331
- replicaSets: [],
332
- deployments: [],
333
- daemonSets: [],
334
- services: [],
335
- configMaps: [],
336
- horizontalPodAutoscalers: [],
337
- ingresses: [],
338
- jobs: [],
339
- cronJobs: [],
340
- customResources: [],
341
- statefulsets: []
342
- });
343
-
344
- const ClusterContext = React__default.createContext({
345
- name: ""
346
- });
347
-
348
- const PodMetricsContext = React__default.createContext(/* @__PURE__ */ new Map());
349
- const usePodMetrics = (clusterName, matcher) => {
350
- var _a, _b, _c, _d;
351
- const targetRef = {
352
- name: (_b = (_a = matcher.metadata) == null ? void 0 : _a.name) != null ? _b : "",
353
- namespace: (_d = (_c = matcher.metadata) == null ? void 0 : _c.namespace) != null ? _d : ""
354
- };
355
- const metricsMap = useContext(PodMetricsContext);
356
- const metrics = metricsMap.get(clusterName);
357
- return metrics == null ? void 0 : metrics.find((m) => {
358
- var _a2, _b2, _c2, _d2;
359
- const pod = m.pod;
360
- return targetRef.name === ((_b2 = (_a2 = pod.metadata) == null ? void 0 : _a2.name) != null ? _b2 : "") && targetRef.namespace === ((_d2 = (_c2 = pod.metadata) == null ? void 0 : _c2.namespace) != null ? _d2 : "");
361
- });
362
- };
363
-
364
- const DetectedErrorsContext = React__default.createContext([]);
365
- const useMatchingErrors = (matcher) => {
366
- var _a, _b, _c, _d;
367
- const targetRef = {
368
- name: (_b = (_a = matcher.metadata) == null ? void 0 : _a.name) != null ? _b : "",
369
- namespace: (_d = (_c = matcher.metadata) == null ? void 0 : _c.namespace) != null ? _d : "",
370
- kind: matcher.kind,
371
- apiGroup: matcher.apiVersion
372
- };
373
- const errors = useContext(DetectedErrorsContext);
374
- return errors.filter((e) => {
375
- const r = e.sourceRef;
376
- return targetRef.apiGroup === r.apiGroup && targetRef.kind === r.kind && targetRef.name === r.name && targetRef.namespace === r.namespace;
377
- });
378
- };
379
-
380
- var __defProp$2 = Object.defineProperty;
381
- var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
382
- var __publicField$2 = (obj, key, value) => {
383
- __defNormalProp$2(obj, typeof key !== "symbol" ? key + "" : key, value);
384
- return value;
385
- };
386
- class KubernetesBackendClient {
387
- constructor(options) {
388
- __publicField$2(this, "discoveryApi");
389
- __publicField$2(this, "identityApi");
390
- __publicField$2(this, "kubernetesAuthProvidersApi");
391
- this.discoveryApi = options.discoveryApi;
392
- this.identityApi = options.identityApi;
393
- this.kubernetesAuthProvidersApi = options.kubernetesAuthProvidersApi;
394
- }
395
- async handleResponse(response) {
396
- if (!response.ok) {
397
- const payload = await response.text();
398
- let message;
399
- switch (response.status) {
400
- case 404:
401
- message = "Could not find the Kubernetes Backend (HTTP 404). Make sure the plugin has been fully installed.";
402
- break;
403
- default:
404
- message = `Request failed with ${response.status} ${response.statusText}, ${payload}`;
405
- }
406
- throw new Error(message);
407
- }
408
- return await response.json();
409
- }
410
- async postRequired(path, requestBody) {
411
- const url = `${await this.discoveryApi.getBaseUrl("kubernetes")}${path}`;
412
- const { token: idToken } = await this.identityApi.getCredentials();
413
- const response = await fetch(url, {
414
- method: "POST",
415
- headers: {
416
- "Content-Type": "application/json",
417
- ...idToken && { Authorization: `Bearer ${idToken}` }
418
- },
419
- body: JSON.stringify(requestBody)
420
- });
421
- return this.handleResponse(response);
422
- }
423
- async getCluster(clusterName) {
424
- const cluster = await this.getClusters().then(
425
- (clusters) => clusters.find((c) => c.name === clusterName)
426
- );
427
- if (!cluster) {
428
- throw new NotFoundError(`Cluster ${clusterName} not found`);
429
- }
430
- return cluster;
431
- }
432
- async getCredentials(authProvider, oidcTokenProvider) {
433
- return await this.kubernetesAuthProvidersApi.getCredentials(
434
- authProvider === "oidc" ? `${authProvider}.${oidcTokenProvider}` : authProvider
435
- );
436
- }
437
- async getObjectsByEntity(requestBody) {
438
- return await this.postRequired(
439
- `/services/${requestBody.entity.metadata.name}`,
440
- requestBody
441
- );
442
- }
443
- async getWorkloadsByEntity(request) {
444
- return await this.postRequired("/resources/workloads/query", {
445
- auth: request.auth,
446
- entityRef: stringifyEntityRef(request.entity)
447
- });
448
- }
449
- async getCustomObjectsByEntity(request) {
450
- return await this.postRequired(`/resources/custom/query`, {
451
- entityRef: stringifyEntityRef(request.entity),
452
- auth: request.auth,
453
- customResources: request.customResources
454
- });
455
- }
456
- async getClusters() {
457
- const { token: idToken } = await this.identityApi.getCredentials();
458
- const url = `${await this.discoveryApi.getBaseUrl("kubernetes")}/clusters`;
459
- const response = await fetch(url, {
460
- method: "GET",
461
- headers: {
462
- ...idToken && { Authorization: `Bearer ${idToken}` }
463
- }
464
- });
465
- return (await this.handleResponse(response)).items;
466
- }
467
- async proxy(options) {
468
- const { authProvider, oidcTokenProvider } = await this.getCluster(
469
- options.clusterName
470
- );
471
- const kubernetesCredentials = await this.getCredentials(
472
- authProvider,
473
- oidcTokenProvider
474
- );
475
- const url = `${await this.discoveryApi.getBaseUrl("kubernetes")}/proxy${options.path}`;
476
- const identityResponse = await this.identityApi.getCredentials();
477
- const headers = KubernetesBackendClient.getKubernetesHeaders(
478
- options,
479
- kubernetesCredentials == null ? void 0 : kubernetesCredentials.token,
480
- identityResponse,
481
- authProvider,
482
- oidcTokenProvider
483
- );
484
- return await fetch(url, { ...options.init, headers });
485
- }
486
- static getKubernetesHeaders(options, k8sToken, identityResponse, authProvider, oidcTokenProvider) {
487
- var _a;
488
- const kubernetesAuthHeader = KubernetesBackendClient.getKubernetesAuthHeaderByAuthProvider(
489
- authProvider,
490
- oidcTokenProvider
491
- );
492
- return {
493
- ...(_a = options.init) == null ? void 0 : _a.headers,
494
- [`Backstage-Kubernetes-Cluster`]: options.clusterName,
495
- ...k8sToken && {
496
- [kubernetesAuthHeader]: k8sToken
497
- },
498
- ...identityResponse.token && {
499
- Authorization: `Bearer ${identityResponse.token}`
500
- }
501
- };
502
- }
503
- static getKubernetesAuthHeaderByAuthProvider(authProvider, oidcTokenProvider) {
504
- let header = "Backstage-Kubernetes-Authorization";
505
- header = header.concat("-", authProvider);
506
- if (oidcTokenProvider)
507
- header = header.concat("-", oidcTokenProvider);
508
- return header;
509
- }
510
- }
511
-
512
- var __defProp$1 = Object.defineProperty;
513
- var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
514
- var __publicField$1 = (obj, key, value) => {
515
- __defNormalProp$1(obj, typeof key !== "symbol" ? key + "" : key, value);
516
- return value;
517
- };
518
- class KubernetesClusterLinkFormatter {
519
- constructor(options) {
520
- __publicField$1(this, "formatters");
521
- __publicField$1(this, "defaultFormatterName");
522
- this.formatters = options.formatters;
523
- this.defaultFormatterName = options.defaultFormatterName;
524
- }
525
- async formatClusterLink(options) {
526
- var _a;
527
- if (!options.dashboardUrl && !options.dashboardParameters) {
528
- return void 0;
529
- }
530
- if (options.dashboardUrl && !options.object) {
531
- return options.dashboardUrl;
532
- }
533
- const app = (_a = options.dashboardApp) != null ? _a : this.defaultFormatterName;
534
- const formatter = this.formatters[app];
535
- if (!formatter) {
536
- throw new Error(`Could not find Kubernetes dashboard app named '${app}'`);
537
- }
538
- const url = await formatter.formatClusterLink({
539
- dashboardUrl: options.dashboardUrl ? new URL(options.dashboardUrl) : void 0,
540
- dashboardParameters: options.dashboardParameters,
541
- object: options.object,
542
- kind: options.kind
543
- });
544
- return url.toString();
545
- }
546
- }
547
-
548
- var __defProp = Object.defineProperty;
549
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
550
- var __publicField = (obj, key, value) => {
551
- __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
552
- return value;
553
- };
554
- class KubernetesProxyClient {
555
- constructor(options) {
556
- __publicField(this, "kubernetesApi");
557
- this.kubernetesApi = options.kubernetesApi;
558
- }
559
- async handleText(response) {
560
- if (!response.ok) {
561
- const payload = await response.text();
562
- let message;
563
- switch (response.status) {
564
- default:
565
- message = `Proxy request failed with ${response.status} ${response.statusText}, ${payload}`;
566
- }
567
- throw new Error(message);
568
- }
569
- return await response.text();
570
- }
571
- async handleJson(response) {
572
- if (!response.ok) {
573
- const payload = await response.text();
574
- let message = `Request failed with ${response.status} ${response.statusText}, ${payload}`;
575
- switch (response.status) {
576
- case 404:
577
- message = `Proxy request failed with ${response.status} ${response.statusText}, ${payload}`;
578
- break;
579
- default:
580
- message = `Request failed with ${response.status} ${response.statusText}, ${payload}`;
581
- }
582
- throw new Error(message);
583
- }
584
- return await response.json();
585
- }
586
- async getEventsByInvolvedObjectName({
587
- clusterName,
588
- involvedObjectName,
589
- namespace
590
- }) {
591
- return await this.kubernetesApi.proxy({
592
- clusterName,
593
- path: `/api/v1/namespaces/${namespace}/events?fieldSelector=involvedObject.name=${involvedObjectName}`,
594
- init: {
595
- method: "GET"
596
- }
597
- }).then((response) => this.handleJson(response)).then((eventList) => eventList.items);
598
- }
599
- async getPodLogs({
600
- podName,
601
- namespace,
602
- clusterName,
603
- containerName,
604
- previous
605
- }) {
606
- const params = new URLSearchParams({
607
- container: containerName
608
- });
609
- if (previous) {
610
- params.append("previous", "");
611
- }
612
- return await this.kubernetesApi.proxy({
613
- clusterName,
614
- path: `/api/v1/namespaces/${namespace}/pods/${podName}/log?${params.toString()}`,
615
- init: {
616
- method: "GET"
617
- }
618
- }).then((response) => this.handleText(response)).then((text) => ({ text }));
619
- }
620
- }
621
-
622
- const basePath = "https://portal.azure.com/#blade/Microsoft_Azure_ContainerService/AksK8ResourceMenuBlade/overview-Deployment/aksClusterId";
623
- const requiredParams = ["subscriptionId", "resourceGroup", "clusterName"];
624
- class AksClusterLinksFormatter {
625
- async formatClusterLink(options) {
626
- if (!options.dashboardParameters) {
627
- throw new Error("AKS dashboard requires a dashboardParameters option");
628
- }
629
- const args = options.dashboardParameters;
630
- for (const param of requiredParams) {
631
- if (typeof args[param] !== "string") {
632
- throw new Error(
633
- `AKS dashboard requires a "${param}" of type string in the dashboardParameters option`
634
- );
635
- }
636
- }
637
- const path = `/subscriptions/${args.subscriptionId}/resourceGroups/${args.resourceGroup}/providers/Microsoft.ContainerService/managedClusters/${args.clusterName}`;
638
- const { name, namespace, uid } = options.object.metadata;
639
- const { selector } = options.object.spec;
640
- const params = {
641
- kind: options.kind,
642
- metadata: { name, namespace, uid },
643
- spec: {
644
- selector
645
- }
646
- };
647
- return new URL(
648
- `${basePath}/${encodeURIComponent(path)}/resource/${encodeURIComponent(
649
- JSON.stringify(params)
650
- )}`
651
- );
652
- }
653
- }
654
-
655
- class EksClusterLinksFormatter {
656
- async formatClusterLink(_options) {
657
- throw new Error(
658
- "EKS formatter is not yet implemented. Please, contribute!"
659
- );
660
- }
661
- }
662
-
663
- const kindMappings$3 = {
664
- deployment: "deployment",
665
- pod: "pod",
666
- ingress: "ingress",
667
- service: "service",
668
- horizontalpodautoscaler: "deployment"
669
- };
670
- class GkeClusterLinksFormatter {
671
- constructor(googleAuthApi) {
672
- this.googleAuthApi = googleAuthApi;
673
- }
674
- async formatClusterLink(options) {
675
- var _a, _b, _c, _d;
676
- if (!options.dashboardParameters) {
677
- throw new Error("GKE dashboard requires a dashboardParameters option");
678
- }
679
- const args = options.dashboardParameters;
680
- if (typeof args.projectId !== "string") {
681
- throw new Error(
682
- 'GKE dashboard requires a "projectId" of type string in the dashboardParameters option'
683
- );
684
- }
685
- if (typeof args.region !== "string") {
686
- throw new Error(
687
- 'GKE dashboard requires a "region" of type string in the dashboardParameters option'
688
- );
689
- }
690
- if (typeof args.clusterName !== "string") {
691
- throw new Error(
692
- 'GKE dashboard requires a "clusterName" of type string in the dashboardParameters option'
693
- );
694
- }
695
- const basePath = new URL("https://console.cloud.google.com/");
696
- const region = encodeURIComponent(args.region);
697
- const clusterName = encodeURIComponent(args.clusterName);
698
- const name = encodeURIComponent((_b = (_a = options.object.metadata) == null ? void 0 : _a.name) != null ? _b : "");
699
- const namespace = encodeURIComponent(
700
- (_d = (_c = options.object.metadata) == null ? void 0 : _c.namespace) != null ? _d : ""
701
- );
702
- const validKind = kindMappings$3[options.kind.toLocaleLowerCase("en-US")];
703
- let path;
704
- if (namespace && name && validKind) {
705
- const kindsWithDetails = ["ingress", "pod"];
706
- const landingPage = kindsWithDetails.includes(validKind) ? "details" : "overview";
707
- path = `kubernetes/${validKind}/${region}/${clusterName}/${namespace}/${name}/${landingPage}`;
708
- } else {
709
- path = `kubernetes/clusters/details/${region}/${clusterName}/details`;
710
- }
711
- const result = new URL(path, basePath);
712
- result.searchParams.set("project", args.projectId);
713
- if (this.googleAuthApi) {
714
- const profile = await this.googleAuthApi.getProfile({ optional: true });
715
- if (profile == null ? void 0 : profile.email) {
716
- result.searchParams.set("authuser", profile.email);
717
- }
718
- }
719
- return result;
720
- }
721
- }
722
-
723
- const kindMappings$2 = {
724
- deployment: "deployment",
725
- pod: "pod",
726
- ingress: "ingress",
727
- service: "service",
728
- horizontalpodautoscaler: "deployment",
729
- statefulset: "statefulset"
730
- };
731
- class StandardClusterLinksFormatter {
732
- async formatClusterLink(options) {
733
- var _a, _b, _c, _d;
734
- if (!options.dashboardUrl) {
735
- throw new Error("standard dashboard requires a dashboardUrl option");
736
- }
737
- const result = new URL(options.dashboardUrl.href);
738
- const name = encodeURIComponent((_b = (_a = options.object.metadata) == null ? void 0 : _a.name) != null ? _b : "");
739
- const namespace = encodeURIComponent(
740
- (_d = (_c = options.object.metadata) == null ? void 0 : _c.namespace) != null ? _d : ""
741
- );
742
- const validKind = kindMappings$2[options.kind.toLocaleLowerCase("en-US")];
743
- if (!result.pathname.endsWith("/")) {
744
- result.pathname += "/";
745
- }
746
- if (validKind && name && namespace) {
747
- result.hash = `/${validKind}/${namespace}/${name}`;
748
- } else if (namespace) {
749
- result.hash = "/workloads";
750
- }
751
- if (namespace) {
752
- result.hash += `?namespace=${namespace}`;
753
- }
754
- return result;
755
- }
756
- }
757
-
758
- const kindMappings$1 = {
759
- deployment: "deployments",
760
- ingress: "ingresses",
761
- service: "services",
762
- horizontalpodautoscaler: "horizontalpodautoscalers",
763
- persistentvolume: "persistentvolumes"
764
- };
765
- class OpenshiftClusterLinksFormatter {
766
- async formatClusterLink(options) {
767
- var _a, _b, _c, _d;
768
- if (!options.dashboardUrl) {
769
- throw new Error("OpenShift dashboard requires a dashboardUrl option");
770
- }
771
- const basePath = new URL(options.dashboardUrl.href);
772
- const name = encodeURIComponent((_b = (_a = options.object.metadata) == null ? void 0 : _a.name) != null ? _b : "");
773
- const namespace = encodeURIComponent(
774
- (_d = (_c = options.object.metadata) == null ? void 0 : _c.namespace) != null ? _d : ""
775
- );
776
- const validKind = kindMappings$1[options.kind.toLocaleLowerCase("en-US")];
777
- if (!basePath.pathname.endsWith("/")) {
778
- basePath.pathname += "/";
779
- }
780
- let path = "";
781
- if (namespace) {
782
- if (name && validKind) {
783
- path = `k8s/ns/${namespace}/${validKind}/${name}`;
784
- } else {
785
- path = `k8s/cluster/projects/${namespace}`;
786
- }
787
- } else if (validKind) {
788
- path = `k8s/cluster/${validKind}`;
789
- if (name) {
790
- path += `/${name}`;
791
- }
792
- }
793
- return new URL(path, basePath);
794
- }
795
- }
796
-
797
- const kindMappings = {
798
- deployment: "apps.deployment",
799
- ingress: "networking.k8s.io.ingress",
800
- service: "service",
801
- horizontalpodautoscaler: "autoscaling.horizontalpodautoscaler"
802
- };
803
- class RancherClusterLinksFormatter {
804
- async formatClusterLink(options) {
805
- var _a, _b, _c, _d;
806
- if (!options.dashboardUrl) {
807
- throw new Error("Rancher dashboard requires a dashboardUrl option");
808
- }
809
- const basePath = new URL(options.dashboardUrl.href);
810
- const name = encodeURIComponent((_b = (_a = options.object.metadata) == null ? void 0 : _a.name) != null ? _b : "");
811
- const namespace = encodeURIComponent(
812
- (_d = (_c = options.object.metadata) == null ? void 0 : _c.namespace) != null ? _d : ""
813
- );
814
- const validKind = kindMappings[options.kind.toLocaleLowerCase("en-US")];
815
- if (!basePath.pathname.endsWith("/")) {
816
- basePath.pathname += "/";
817
- }
818
- let path = "";
819
- if (validKind && name && namespace) {
820
- path = `explorer/${validKind}/${namespace}/${name}`;
821
- } else if (namespace) {
822
- path = "explorer/workload";
823
- }
824
- return new URL(path, basePath);
825
- }
826
- }
827
-
828
- const DEFAULT_FORMATTER_NAME = "standard";
829
- function getDefaultFormatters(deps) {
830
- return {
831
- standard: new StandardClusterLinksFormatter(),
832
- aks: new AksClusterLinksFormatter(),
833
- eks: new EksClusterLinksFormatter(),
834
- gke: new GkeClusterLinksFormatter(deps.googleAuthApi),
835
- openshift: new OpenshiftClusterLinksFormatter(),
836
- rancher: new RancherClusterLinksFormatter()
837
- };
838
- }
839
-
840
- const currentToDeclaredResourceToPerc$1 = (current, resource) => {
841
- if (Number(resource) === 0)
842
- return 0;
843
- if (typeof current === "number" && typeof resource === "number") {
844
- return Math.round(current / resource * 100);
845
- }
846
- const numerator = BigInt(current);
847
- const denominator = BigInt(resource);
848
- return Number(numerator * BigInt(100) / denominator);
849
- };
850
- const bytesToMiB = (value) => {
851
- return `${(parseFloat(value.toString()) / 1024 / 1024).toFixed(0)}MiB`;
852
- };
853
- const formatMillicores = (value) => {
854
- return `${(parseFloat(value.toString()) * 1e3).toFixed(0)}m`;
855
- };
856
-
857
- const useStyles$3 = makeStyles(
858
- (theme) => createStyles({
859
- dialogPaper: { minHeight: "calc(100% - 64px)" },
860
- dialogContent: { flexBasis: 0 },
861
- closeButton: {
862
- position: "absolute",
863
- right: theme.spacing(1),
864
- top: theme.spacing(1),
865
- color: theme.palette.grey[500]
866
- }
867
- })
868
- );
869
- const KubernetesDialog = ({
870
- buttonAriaLabel,
871
- buttonIcon,
872
- buttonText,
873
- children,
874
- disabled,
875
- title
876
- }) => {
877
- const classes = useStyles$3();
878
- const [open, setOpen] = useState(false);
879
- const openDialog = () => {
880
- setOpen(true);
881
- };
882
- const closeDialog = () => {
883
- setOpen(false);
884
- };
885
- return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement(
886
- Dialog,
887
- {
888
- maxWidth: "xl",
889
- fullWidth: true,
890
- open,
891
- onClose: closeDialog,
892
- PaperProps: { className: classes.dialogPaper }
893
- },
894
- /* @__PURE__ */ React__default.createElement(DialogTitle, { id: "dialog-title" }, title, /* @__PURE__ */ React__default.createElement(
895
- IconButton,
896
- {
897
- "aria-label": "close",
898
- className: classes.closeButton,
899
- onClick: closeDialog
900
- },
901
- /* @__PURE__ */ React__default.createElement(CloseIcon, null)
902
- )),
903
- /* @__PURE__ */ React__default.createElement(DialogContent, { className: classes.dialogContent }, children)
904
- ), /* @__PURE__ */ React__default.createElement(
905
- Button,
906
- {
907
- variant: "outlined",
908
- "aria-label": buttonAriaLabel,
909
- component: "label",
910
- disabled,
911
- onClick: openDialog,
912
- startIcon: buttonIcon
913
- },
914
- buttonText
915
- ));
916
- };
917
-
918
- var __accessCheck = (obj, member, msg) => {
919
- if (!member.has(obj))
920
- throw TypeError("Cannot " + msg);
921
- };
922
- var __privateGet = (obj, member, getter) => {
923
- __accessCheck(obj, member, "read from private field");
924
- return getter ? getter.call(obj) : member.get(obj);
925
- };
926
- var __privateAdd = (obj, member, value) => {
927
- if (member.has(obj))
928
- throw TypeError("Cannot add the same private member more than once");
929
- member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
930
- };
931
- var _textEncoder;
932
- class PodExecTerminalAttachAddon extends AttachAddon {
933
- constructor(socket, options) {
934
- super(socket, options);
935
- __privateAdd(this, _textEncoder, new TextEncoder());
936
- const thisAddon = this;
937
- thisAddon._sendBinary = (data) => {
938
- if (!thisAddon._checkOpenSocket()) {
939
- return;
940
- }
941
- const buffer = Uint8Array.from([0, ...__privateGet(this, _textEncoder).encode(data)]);
942
- thisAddon._socket.send(buffer);
943
- };
944
- thisAddon._sendData = (data) => {
945
- if (!thisAddon._checkOpenSocket()) {
946
- return;
947
- }
948
- thisAddon._sendBinary(data);
949
- };
950
- }
951
- }
952
- _textEncoder = new WeakMap();
953
-
954
- const hasSocketProtocol = (url) => /wss?:\/\//.test(url.toString());
955
- const useStyles$2 = makeStyles(
956
- (theme) => createStyles({
957
- podExecTerminal: {
958
- width: "100%",
959
- height: "100%",
960
- "& .xterm-screen": { padding: theme.spacing(1) }
961
- }
962
- })
963
- );
964
- const PodExecTerminal = (props) => {
965
- const classes = useStyles$2();
966
- const { containerName, podNamespace, podName } = props;
967
- const [baseUrl, setBaseUrl] = useState(window.location.host);
968
- const terminalRef = React__default.useRef(null);
969
- const discoveryApi = useApi(discoveryApiRef);
970
- const namespace = podNamespace != null ? podNamespace : "default";
971
- useEffect(() => {
972
- discoveryApi.getBaseUrl("kubernetes").then((url) => url != null ? url : window.location.host).then((url) => url.replace(/^http(s?):\/\//, "ws$1://")).then((url) => setBaseUrl(url));
973
- }, [discoveryApi]);
974
- const urlParams = useMemo(() => {
975
- const params = new URLSearchParams({
976
- container: containerName,
977
- stdin: "true",
978
- stdout: "true",
979
- stderr: "true",
980
- tty: "true",
981
- command: "/bin/sh"
982
- });
983
- return params;
984
- }, [containerName]);
985
- const socketUrl = useMemo(() => {
986
- if (!hasSocketProtocol(baseUrl)) {
987
- return "";
988
- }
989
- return new URL(
990
- `${baseUrl}/proxy/api/v1/namespaces/${namespace}/pods/${podName}/exec?${urlParams}`
991
- );
992
- }, [baseUrl, namespace, podName, urlParams]);
993
- useEffect(() => {
994
- if (!hasSocketProtocol(socketUrl)) {
995
- return () => {
996
- };
997
- }
998
- const terminal = new Terminal();
999
- const fitAddon = new FitAddon();
1000
- terminal.loadAddon(fitAddon);
1001
- if (terminalRef.current) {
1002
- terminal.open(terminalRef.current);
1003
- fitAddon.fit();
1004
- }
1005
- terminal.writeln("Starting terminal, please wait...");
1006
- const socket = new WebSocket(socketUrl, ["channel.k8s.io"]);
1007
- socket.onopen = () => {
1008
- terminal.clear();
1009
- const attachAddon = new PodExecTerminalAttachAddon(socket, {
1010
- bidirectional: true
1011
- });
1012
- terminal.loadAddon(attachAddon);
1013
- };
1014
- socket.onclose = () => {
1015
- terminal.writeln("Socket connection closed");
1016
- };
1017
- return () => {
1018
- terminal == null ? void 0 : terminal.clear();
1019
- socket == null ? void 0 : socket.close();
1020
- };
1021
- }, [baseUrl, socketUrl]);
1022
- return /* @__PURE__ */ React__default.createElement(
1023
- "div",
1024
- {
1025
- "data-testid": "terminal",
1026
- ref: terminalRef,
1027
- className: classes.podExecTerminal
1028
- }
1029
- );
1030
- };
1031
-
1032
- const PodExecTerminalDialog = (props) => {
1033
- const { cluster, containerName, podName } = props;
1034
- const isPodExecTerminalSupported = useIsPodExecTerminalSupported();
1035
- return !isPodExecTerminalSupported.loading && isPodExecTerminalSupported.value && /* @__PURE__ */ React__default.createElement(
1036
- KubernetesDialog,
1037
- {
1038
- buttonAriaLabel: "open terminal",
1039
- buttonIcon: /* @__PURE__ */ React__default.createElement(OpenInBrowserIcon, null),
1040
- buttonText: "Terminal",
1041
- disabled: isPodExecTerminalSupported.loading || !isPodExecTerminalSupported.value,
1042
- title: `${podName} - ${containerName} terminal shell on cluster ${cluster.title || cluster.name}`
1043
- },
1044
- /* @__PURE__ */ React__default.createElement(PodExecTerminal, { ...props })
1045
- );
1046
- };
1047
-
1048
- const getProgressColor = ({
1049
- palette,
1050
- value,
1051
- inverse,
1052
- max
1053
- }) => {
1054
- if (isNaN(value)) {
1055
- return palette.status.pending;
1056
- }
1057
- const actualMax = max ? max : 100;
1058
- const actualValue = inverse ? actualMax - value : value;
1059
- if (actualValue >= actualMax) {
1060
- return palette.status.error;
1061
- } else if (actualValue > 90 || actualValue < 40) {
1062
- return palette.status.warning;
1063
- }
1064
- return palette.status.ok;
1065
- };
1066
- const ResourceUtilization = ({
1067
- compressed = false,
1068
- title,
1069
- usage,
1070
- total,
1071
- totalFormatted
1072
- }) => {
1073
- const utilization = currentToDeclaredResourceToPerc$1(usage, total);
1074
- return /* @__PURE__ */ React__default.createElement(Grid, { container: true, spacing: 0 }, /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(
1075
- Typography,
1076
- {
1077
- variant: compressed ? "caption" : "subtitle2"
1078
- },
1079
- `${title}: ${totalFormatted}`
1080
- )), /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(
1081
- LinearGauge,
1082
- {
1083
- getColor: getProgressColor,
1084
- width: compressed ? "thin" : "thick",
1085
- value: utilization / 100
1086
- }
1087
- ), !compressed && /* @__PURE__ */ React__default.createElement(Typography, { variant: "caption" }, "usage: ", `${utilization}%`)));
1088
- };
1089
-
1090
- const usePodLogs = ({ containerScope, previous }) => {
1091
- const kubernetesProxyApi = useApi(kubernetesProxyApiRef);
1092
- return useAsync(async () => {
1093
- return await kubernetesProxyApi.getPodLogs({
1094
- podName: containerScope.podName,
1095
- namespace: containerScope.podNamespace,
1096
- containerName: containerScope.containerName,
1097
- clusterName: containerScope.cluster.name,
1098
- previous
1099
- });
1100
- }, [JSON.stringify(containerScope)]);
1101
- };
1102
-
1103
- const PodLogs = ({
1104
- containerScope,
1105
- previous
1106
- }) => {
1107
- const { value, error, loading } = usePodLogs({
1108
- containerScope,
1109
- previous
1110
- });
1111
- return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, error && /* @__PURE__ */ React__default.createElement(
1112
- DismissableBanner,
1113
- {
1114
- ...{
1115
- message: error.message,
1116
- variant: "error",
1117
- fixed: false
1118
- },
1119
- id: "pod-logs"
1120
- }
1121
- ), /* @__PURE__ */ React__default.createElement(
1122
- Paper,
1123
- {
1124
- elevation: 1,
1125
- style: { height: "100%", width: "100%", minHeight: "55rem" }
1126
- },
1127
- loading && /* @__PURE__ */ React__default.createElement(Skeleton, { variant: "rect", width: "100%", height: "100%" }),
1128
- !loading && value !== void 0 && (value.text === "" ? /* @__PURE__ */ React__default.createElement(
1129
- EmptyState,
1130
- {
1131
- missing: "data",
1132
- title: "No logs emitted",
1133
- description: "No logs were emitted by the container"
1134
- }
1135
- ) : /* @__PURE__ */ React__default.createElement(LogViewer, { text: value.text }))
1136
- ));
1137
- };
1138
-
1139
- const PodLogsDialog = ({ containerScope }) => {
1140
- return /* @__PURE__ */ React__default.createElement(
1141
- KubernetesDialog,
1142
- {
1143
- buttonAriaLabel: "get logs",
1144
- buttonIcon: /* @__PURE__ */ React__default.createElement(SubjectIcon, null),
1145
- buttonText: "Logs",
1146
- disabled: false,
1147
- title: `${containerScope.podName} - ${containerScope.containerName} logs on cluster ${containerScope.cluster.title || containerScope.cluster.name}`
1148
- },
1149
- /* @__PURE__ */ React__default.createElement(PodLogs, { containerScope })
1150
- );
1151
- };
1152
-
1153
- const getContainerHealthChecks = (containerSpec, containerStatus) => {
1154
- var _a, _b, _c, _d;
1155
- if (((_b = (_a = containerStatus.state) == null ? void 0 : _a.terminated) == null ? void 0 : _b.reason) === "Completed") {
1156
- return {
1157
- "not waiting to start": ((_c = containerStatus.state) == null ? void 0 : _c.waiting) === void 0,
1158
- "no restarts": containerStatus.restartCount === 0
1159
- };
1160
- }
1161
- return {
1162
- "not waiting to start": ((_d = containerStatus.state) == null ? void 0 : _d.waiting) === void 0,
1163
- started: !!containerStatus.started,
1164
- ready: containerStatus.ready,
1165
- "no restarts": containerStatus.restartCount === 0,
1166
- "readiness probe set": containerSpec && (containerSpec == null ? void 0 : containerSpec.readinessProbe) !== void 0
1167
- };
1168
- };
1169
- const getCurrentState = (containerStatus) => {
1170
- var _a, _b, _c, _d, _e;
1171
- return ((_b = (_a = containerStatus.state) == null ? void 0 : _a.waiting) == null ? void 0 : _b.reason) || ((_d = (_c = containerStatus.state) == null ? void 0 : _c.terminated) == null ? void 0 : _d.reason) || (((_e = containerStatus.state) == null ? void 0 : _e.running) !== void 0 ? "Running" : "Unknown");
1172
- };
1173
- const getStartedAtTime = (containerStatus) => {
1174
- var _a, _b, _c, _d;
1175
- return ((_b = (_a = containerStatus.state) == null ? void 0 : _a.running) == null ? void 0 : _b.startedAt) || ((_d = (_c = containerStatus.state) == null ? void 0 : _c.terminated) == null ? void 0 : _d.startedAt);
1176
- };
1177
- const ContainerDatetime = ({ prefix, dateTime }) => {
1178
- return /* @__PURE__ */ React__default.createElement(Typography, { variant: "subtitle2" }, prefix, ":", " ", DateTime.fromISO(dateTime).toRelative({
1179
- locale: "en"
1180
- }));
1181
- };
1182
- const ContainerCard = ({
1183
- podScope,
1184
- containerSpec,
1185
- containerStatus,
1186
- containerMetrics
1187
- }) => {
1188
- var _a, _b;
1189
- const isPodExecTerminalEnabled = useIsPodExecTerminalEnabled();
1190
- if (containerSpec === void 0) {
1191
- return /* @__PURE__ */ React__default.createElement(Typography, null, "error reading pod from cluster");
1192
- }
1193
- const containerStartedTime = getStartedAtTime(containerStatus);
1194
- const containerFinishedTime = (_b = (_a = containerStatus.state) == null ? void 0 : _a.terminated) == null ? void 0 : _b.finishedAt;
1195
- return /* @__PURE__ */ React__default.createElement(Card, null, /* @__PURE__ */ React__default.createElement(
1196
- CardHeader,
1197
- {
1198
- title: containerStatus.name,
1199
- subheader: containerStatus.image
1200
- }
1201
- ), /* @__PURE__ */ React__default.createElement(CardContent, null, /* @__PURE__ */ React__default.createElement(Grid, { container: true }, /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, containerStartedTime && /* @__PURE__ */ React__default.createElement(
1202
- ContainerDatetime,
1203
- {
1204
- prefix: "Started",
1205
- dateTime: containerStartedTime
1206
- }
1207
- ), containerFinishedTime && /* @__PURE__ */ React__default.createElement(
1208
- ContainerDatetime,
1209
- {
1210
- prefix: "Completed",
1211
- dateTime: containerFinishedTime
1212
- }
1213
- ), containerStartedTime && containerFinishedTime && /* @__PURE__ */ React__default.createElement(Typography, { variant: "subtitle2" }, "Execution time:", " ", DateTime.fromISO(containerFinishedTime).diff(DateTime.fromISO(containerStartedTime), [
1214
- "hours",
1215
- "minutes",
1216
- "seconds"
1217
- ]).toHuman())), /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "subtitle2" }, "Status: ", getCurrentState(containerStatus))), containerStatus.restartCount > 0 && /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "subtitle2" }, "Restarts: ", containerStatus.restartCount)), /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "subtitle2" }, "Container health")), /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(
1218
- StructuredMetadataTable,
1219
- {
1220
- metadata: getContainerHealthChecks(
1221
- containerSpec,
1222
- containerStatus
1223
- )
1224
- }
1225
- )), containerMetrics && /* @__PURE__ */ React__default.createElement(Grid, { container: true, item: true, xs: 12, spacing: 0 }, /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "subtitle1" }, "Resource utilization")), /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12, style: { minHeight: "5rem" } }, /* @__PURE__ */ React__default.createElement(
1226
- ResourceUtilization,
1227
- {
1228
- compressed: true,
1229
- title: "CPU requests",
1230
- usage: containerMetrics.cpuUsage.currentUsage,
1231
- total: containerMetrics.cpuUsage.requestTotal,
1232
- totalFormatted: formatMillicores(
1233
- containerMetrics.cpuUsage.requestTotal
1234
- )
1235
- }
1236
- ), /* @__PURE__ */ React__default.createElement(
1237
- ResourceUtilization,
1238
- {
1239
- compressed: true,
1240
- title: "CPU limits",
1241
- usage: containerMetrics.cpuUsage.currentUsage,
1242
- total: containerMetrics.cpuUsage.limitTotal,
1243
- totalFormatted: formatMillicores(
1244
- containerMetrics.cpuUsage.limitTotal
1245
- )
1246
- }
1247
- ), /* @__PURE__ */ React__default.createElement(
1248
- ResourceUtilization,
1249
- {
1250
- compressed: true,
1251
- title: "Memory requests",
1252
- usage: containerMetrics.memoryUsage.currentUsage,
1253
- total: containerMetrics.memoryUsage.requestTotal,
1254
- totalFormatted: bytesToMiB(
1255
- containerMetrics.memoryUsage.requestTotal
1256
- )
1257
- }
1258
- ), /* @__PURE__ */ React__default.createElement(
1259
- ResourceUtilization,
1260
- {
1261
- compressed: true,
1262
- title: "Memory limits",
1263
- usage: containerMetrics.memoryUsage.currentUsage,
1264
- total: containerMetrics.memoryUsage.limitTotal,
1265
- totalFormatted: bytesToMiB(
1266
- containerMetrics.memoryUsage.limitTotal
1267
- )
1268
- }
1269
- ))))), /* @__PURE__ */ React__default.createElement(CardActions, null, /* @__PURE__ */ React__default.createElement(
1270
- PodLogsDialog,
1271
- {
1272
- containerScope: {
1273
- containerName: containerStatus.name,
1274
- ...podScope
1275
- }
1276
- }
1277
- ), isPodExecTerminalEnabled && /* @__PURE__ */ React__default.createElement(
1278
- PodExecTerminalDialog,
1279
- {
1280
- cluster: podScope.cluster,
1281
- containerName: containerStatus.name,
1282
- podName: podScope.podName,
1283
- podNamespace: podScope.podNamespace
1284
- }
1285
- )));
1286
- };
1287
-
1288
- const ManifestYaml = ({ object }) => {
1289
- const [managedFields, setManagedFields] = useState(false);
1290
- return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement(
1291
- FormControlLabel,
1292
- {
1293
- control: /* @__PURE__ */ React__default.createElement(
1294
- Switch,
1295
- {
1296
- checked: managedFields,
1297
- onChange: (event) => {
1298
- setManagedFields(event.target.checked);
1299
- },
1300
- name: "Managed Fields"
1301
- }
1302
- ),
1303
- label: "Managed Fields"
1304
- }
1305
- ), /* @__PURE__ */ React__default.createElement(
1306
- CodeSnippet,
1307
- {
1308
- language: "yaml",
1309
- text: jsyaml.dump(object, {
1310
- // NOTE: this will remove any field called `managedFields`
1311
- // not just the metadata one
1312
- // TODO: @mclarke make this only remove the `metadata.managedFields`
1313
- replacer: (key, value) => {
1314
- if (!managedFields) {
1315
- return key === "managedFields" ? void 0 : value;
1316
- }
1317
- return value;
1318
- }
1319
- })
1320
- }
1321
- ));
1322
- };
1323
-
1324
- const useDrawerStyles$1 = makeStyles(
1325
- (theme) => createStyles({
1326
- paper: {
1327
- width: "50%",
1328
- justifyContent: "space-between",
1329
- padding: theme.spacing(2.5)
1330
- }
1331
- })
1332
- );
1333
- const useDrawerContentStyles$2 = makeStyles(
1334
- (_) => createStyles({
1335
- header: {
1336
- display: "flex",
1337
- flexDirection: "row",
1338
- justifyContent: "space-between"
1339
- },
1340
- errorMessage: {
1341
- marginTop: "1em",
1342
- marginBottom: "1em"
1343
- },
1344
- options: {
1345
- display: "flex",
1346
- flexDirection: "row",
1347
- justifyContent: "space-between"
1348
- },
1349
- icon: {
1350
- fontSize: 20
1351
- },
1352
- content: {
1353
- height: "80%"
1354
- }
1355
- })
1356
- );
1357
- const PodDrawerButton = withStyles({
1358
- root: {
1359
- padding: "6px 5px"
1360
- },
1361
- label: {
1362
- textTransform: "none"
1363
- }
1364
- })(Button);
1365
- const LinkErrorPanel = ({
1366
- cluster,
1367
- errorMessage
1368
- }) => /* @__PURE__ */ React__default.createElement(
1369
- WarningPanel,
1370
- {
1371
- title: "There was a problem formatting the link to the Kubernetes dashboard",
1372
- message: `Could not format the link to the dashboard of your cluster named '${cluster.name}'. Its dashboardApp property has been set to '${cluster.dashboardApp || "standard"}.'`
1373
- },
1374
- errorMessage && /* @__PURE__ */ React__default.createElement(Typography, { variant: "body2" }, "Errors: ", errorMessage)
1375
- );
1376
- function replaceNullsWithUndefined(someObj) {
1377
- const replacer = (_, value) => String(value) === "null" || String(value) === "undefined" ? void 0 : value;
1378
- return JSON.parse(JSON.stringify(someObj, replacer));
1379
- }
1380
- const KubernetesStructuredMetadataTableDrawerContent = ({
1381
- toggleDrawer,
1382
- object,
1383
- renderObject,
1384
- kind
1385
- }) => {
1386
- var _a, _b;
1387
- const [isYaml, setIsYaml] = useState(false);
1388
- const formatter = useApi(kubernetesClusterLinkFormatterApiRef);
1389
- const classes = useDrawerContentStyles$2();
1390
- const cluster = useContext(ClusterContext);
1391
- const { value: clusterLink, error } = useAsync(
1392
- async () => formatter.formatClusterLink({
1393
- dashboardUrl: cluster.dashboardUrl,
1394
- dashboardApp: cluster.dashboardApp,
1395
- dashboardParameters: cluster.dashboardParameters,
1396
- object,
1397
- kind
1398
- }),
1399
- [cluster, object, kind, formatter]
1400
- );
1401
- return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement("div", { className: classes.header }, /* @__PURE__ */ React__default.createElement(Grid, { container: true, justifyContent: "flex-start", alignItems: "flex-start" }, /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 11 }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "h5" }, (_b = (_a = object.metadata) == null ? void 0 : _a.name) != null ? _b : "unknown name")), /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 1 }, /* @__PURE__ */ React__default.createElement(
1402
- IconButton,
1403
- {
1404
- key: "dismiss",
1405
- title: "Close the drawer",
1406
- onClick: (e) => toggleDrawer(e, false),
1407
- color: "inherit"
1408
- },
1409
- /* @__PURE__ */ React__default.createElement(CloseIcon, { className: classes.icon })
1410
- )), /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 11 }, /* @__PURE__ */ React__default.createElement(Typography, { color: "textSecondary", variant: "body1" }, kind)), /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 11 }, /* @__PURE__ */ React__default.createElement(
1411
- FormControlLabel,
1412
- {
1413
- control: /* @__PURE__ */ React__default.createElement(
1414
- Switch,
1415
- {
1416
- checked: isYaml,
1417
- onChange: (event) => {
1418
- setIsYaml(event.target.checked);
1419
- },
1420
- name: "YAML"
1421
- }
1422
- ),
1423
- label: "YAML"
1424
- }
1425
- )))), error && /* @__PURE__ */ React__default.createElement("div", { className: classes.errorMessage }, /* @__PURE__ */ React__default.createElement(
1426
- LinkErrorPanel,
1427
- {
1428
- cluster,
1429
- errorMessage: error.message || error.toString()
1430
- }
1431
- )), /* @__PURE__ */ React__default.createElement("div", { className: classes.options }, /* @__PURE__ */ React__default.createElement("div", null, clusterLink && /* @__PURE__ */ React__default.createElement(
1432
- LinkButton,
1433
- {
1434
- variant: "outlined",
1435
- color: "primary",
1436
- size: "small",
1437
- to: clusterLink,
1438
- endIcon: /* @__PURE__ */ React__default.createElement(OpenInNewIcon, null)
1439
- },
1440
- "Open Kubernetes Dashboard"
1441
- ))), /* @__PURE__ */ React__default.createElement("div", { className: classes.content }, isYaml && /* @__PURE__ */ React__default.createElement(ManifestYaml, { object }), !isYaml && /* @__PURE__ */ React__default.createElement(
1442
- StructuredMetadataTable,
1443
- {
1444
- metadata: renderObject(replaceNullsWithUndefined(object))
1445
- }
1446
- )));
1447
- };
1448
- const KubernetesStructuredMetadataTableDrawer = ({
1449
- object,
1450
- renderObject,
1451
- kind,
1452
- buttonVariant = "subtitle2",
1453
- expanded = false,
1454
- children
1455
- }) => {
1456
- var _a, _b;
1457
- const [isOpen, setIsOpen] = useState(expanded);
1458
- const classes = useDrawerStyles$1();
1459
- const toggleDrawer = (e, newValue) => {
1460
- e.stopPropagation();
1461
- setIsOpen(newValue);
1462
- };
1463
- return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement(
1464
- PodDrawerButton,
1465
- {
1466
- onClick: (e) => toggleDrawer(e, true),
1467
- onFocus: (event) => event.stopPropagation()
1468
- },
1469
- children === void 0 ? /* @__PURE__ */ React__default.createElement(Typography, { variant: buttonVariant }, (_b = (_a = object.metadata) == null ? void 0 : _a.name) != null ? _b : "unknown object") : children
1470
- ), /* @__PURE__ */ React__default.createElement(
1471
- Drawer,
1472
- {
1473
- classes: {
1474
- paper: classes.paper
1475
- },
1476
- anchor: "right",
1477
- open: isOpen,
1478
- onClose: (e) => toggleDrawer(e, false),
1479
- onClick: (event) => event.stopPropagation()
1480
- },
1481
- /* @__PURE__ */ React__default.createElement(
1482
- KubernetesStructuredMetadataTableDrawerContent,
1483
- {
1484
- kind,
1485
- toggleDrawer,
1486
- object,
1487
- renderObject
1488
- }
1489
- )
1490
- ));
1491
- };
1492
-
1493
- const useDrawerContentStyles$1 = makeStyles(
1494
- (_theme) => createStyles({
1495
- header: {
1496
- display: "flex",
1497
- flexDirection: "row",
1498
- justifyContent: "space-between"
1499
- },
1500
- content: {
1501
- height: "80%"
1502
- },
1503
- icon: {
1504
- fontSize: 20
1505
- }
1506
- })
1507
- );
1508
- const KubernetesDrawerContent = ({
1509
- children,
1510
- header,
1511
- kubernetesObject,
1512
- close
1513
- }) => {
1514
- var _a;
1515
- const classes = useDrawerContentStyles$1();
1516
- const [isYaml, setIsYaml] = useState(false);
1517
- return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement("div", { className: classes.header }, /* @__PURE__ */ React__default.createElement(Grid, { container: true, justifyContent: "flex-start", alignItems: "flex-start" }, /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 11 }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "h5" }, (_a = kubernetesObject.metadata) == null ? void 0 : _a.name)), /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 1 }, /* @__PURE__ */ React__default.createElement(
1518
- IconButton,
1519
- {
1520
- key: "dismiss",
1521
- title: "Close the drawer",
1522
- onClick: () => close(),
1523
- color: "inherit"
1524
- },
1525
- /* @__PURE__ */ React__default.createElement(CloseIcon, { className: classes.icon })
1526
- )), /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, header), /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(
1527
- FormControlLabel,
1528
- {
1529
- control: /* @__PURE__ */ React__default.createElement(
1530
- Switch,
1531
- {
1532
- checked: isYaml,
1533
- onChange: (event) => {
1534
- setIsYaml(event.target.checked);
1535
- },
1536
- name: "YAML"
1537
- }
1538
- ),
1539
- label: "YAML"
1540
- }
1541
- )))), /* @__PURE__ */ React__default.createElement("div", { className: classes.content }, isYaml && /* @__PURE__ */ React__default.createElement(ManifestYaml, { object: kubernetesObject }), !isYaml && children));
1542
- };
1543
- const useDrawerStyles = makeStyles(
1544
- (theme) => createStyles({
1545
- paper: {
1546
- width: "50%",
1547
- justifyContent: "space-between",
1548
- padding: theme.spacing(2.5)
1549
- }
1550
- })
1551
- );
1552
- const DrawerButton = withStyles$1({
1553
- root: {
1554
- padding: "6px 5px"
1555
- },
1556
- label: {
1557
- textTransform: "none"
1558
- }
1559
- })(Button);
1560
- const KubernetesDrawer = ({
1561
- open,
1562
- label,
1563
- drawerContentsHeader,
1564
- kubernetesObject,
1565
- children
1566
- }) => {
1567
- const classes = useDrawerStyles();
1568
- const [isOpen, setIsOpen] = useState(open != null ? open : false);
1569
- const toggleDrawer = (e, newValue) => {
1570
- e.stopPropagation();
1571
- setIsOpen(newValue);
1572
- };
1573
- return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement(DrawerButton, { onClick: () => setIsOpen(true) }, label), /* @__PURE__ */ React__default.createElement(
1574
- Drawer,
1575
- {
1576
- classes: {
1577
- paper: classes.paper
1578
- },
1579
- anchor: "right",
1580
- open: isOpen,
1581
- onClose: (e) => toggleDrawer(e, false),
1582
- onClick: (event) => event.stopPropagation()
1583
- },
1584
- isOpen && /* @__PURE__ */ React__default.createElement(
1585
- KubernetesDrawerContent,
1586
- {
1587
- header: drawerContentsHeader,
1588
- kubernetesObject,
1589
- children,
1590
- close: () => setIsOpen(false)
1591
- }
1592
- )
1593
- ));
1594
- };
1595
-
1596
- const PodCondition = ({ condition }) => {
1597
- return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, condition.status === "False" && /* @__PURE__ */ React__default.createElement(StatusError, null, condition.type, " - (", condition.reason, " ", condition.lastTransitionTime && DateTime.fromISO(condition.lastTransitionTime).toRelative({
1598
- locale: "en"
1599
- }), ") - ", condition.message, " "), condition.status === "True" && /* @__PURE__ */ React__default.createElement(StatusOK, null, condition.type, " - (", condition.lastTransitionTime && DateTime.fromISO(condition.lastTransitionTime).toRelative({
1600
- locale: "en"
1601
- }), ")"), condition.status === "Unknown" && /* @__PURE__ */ React__default.createElement(StatusWarning, null, condition.type, " - (", condition.lastTransitionTime && DateTime.fromISO(condition.lastTransitionTime).toRelative({
1602
- locale: "en"
1603
- }), ") ", condition.message));
1604
- };
1605
- const PendingPodContent = ({ pod }) => {
1606
- var _a, _b, _c, _d, _e, _f, _g, _h;
1607
- const startupConditions = [
1608
- (_b = (_a = pod.status) == null ? void 0 : _a.conditions) == null ? void 0 : _b.find((c) => c.type === "PodScheduled"),
1609
- (_d = (_c = pod.status) == null ? void 0 : _c.conditions) == null ? void 0 : _d.find((c) => c.type === "Initialized"),
1610
- (_f = (_e = pod.status) == null ? void 0 : _e.conditions) == null ? void 0 : _f.find((c) => c.type === "ContainersReady"),
1611
- (_h = (_g = pod.status) == null ? void 0 : _g.conditions) == null ? void 0 : _h.find((c) => c.type === "Ready")
1612
- ].filter((c) => !!c);
1613
- return /* @__PURE__ */ React__default.createElement(Grid, { container: true, spacing: 2 }, /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "h5" }, "Pod is Pending. Conditions:"), /* @__PURE__ */ React__default.createElement(List, null, startupConditions.map((c) => /* @__PURE__ */ React__default.createElement(ListItem, { key: c.type }, /* @__PURE__ */ React__default.createElement(PodCondition, { condition: c }))))));
1614
- };
1615
-
1616
- const useEvents = ({
1617
- involvedObjectName,
1618
- namespace,
1619
- clusterName
1620
- }) => {
1621
- const kubernetesProxyApi = useApi(kubernetesProxyApiRef);
1622
- return useAsync(async () => {
1623
- return await kubernetesProxyApi.getEventsByInvolvedObjectName({
1624
- involvedObjectName,
1625
- namespace,
1626
- clusterName
1627
- });
1628
- }, [involvedObjectName, namespace, clusterName]);
1629
- };
1630
-
1631
- const getAvatarByType = (type) => {
1632
- return /* @__PURE__ */ React__default.createElement(ListItemAvatar, null, /* @__PURE__ */ React__default.createElement(Avatar, null, type === "Warning" ? /* @__PURE__ */ React__default.createElement(WarningIcon, null) : /* @__PURE__ */ React__default.createElement(InfoIcon, null)));
1633
- };
1634
- const EventsContent = ({
1635
- events,
1636
- warningEventsOnly
1637
- }) => {
1638
- if (events.length === 0) {
1639
- return /* @__PURE__ */ React__default.createElement(Typography, null, "No events found");
1640
- }
1641
- return /* @__PURE__ */ React__default.createElement(Container, null, /* @__PURE__ */ React__default.createElement(Grid, null, /* @__PURE__ */ React__default.createElement(List, null, events.filter((event) => {
1642
- if (warningEventsOnly) {
1643
- return event.type === "Warning";
1644
- }
1645
- return true;
1646
- }).map((event) => {
1647
- var _a;
1648
- const timeAgo = event.metadata.creationTimestamp ? DateTime.fromISO(event.metadata.creationTimestamp).toRelative(
1649
- {
1650
- locale: "en"
1651
- }
1652
- ) : "unknown";
1653
- return /* @__PURE__ */ React__default.createElement(ListItem, { key: event.metadata.name }, /* @__PURE__ */ React__default.createElement(Tooltip, { title: `${(_a = event.type) != null ? _a : ""} event` }, getAvatarByType(event.type)), /* @__PURE__ */ React__default.createElement(
1654
- ListItemText,
1655
- {
1656
- primary: `First event ${timeAgo} (count: ${event.count})`,
1657
- secondary: `${event.reason}: ${event.message}`
1658
- }
1659
- ));
1660
- }))));
1661
- };
1662
- const Events = ({
1663
- involvedObjectName,
1664
- namespace,
1665
- clusterName,
1666
- warningEventsOnly
1667
- }) => {
1668
- const { value, error, loading } = useEvents({
1669
- involvedObjectName,
1670
- namespace,
1671
- clusterName
1672
- });
1673
- return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, error && /* @__PURE__ */ React__default.createElement(
1674
- DismissableBanner,
1675
- {
1676
- ...{
1677
- message: error.message,
1678
- variant: "error",
1679
- fixed: false
1680
- },
1681
- id: "events"
1682
- }
1683
- ), loading && /* @__PURE__ */ React__default.createElement(Skeleton, { variant: "rect", width: "100%", height: "100%" }), !loading && value !== void 0 && /* @__PURE__ */ React__default.createElement(EventsContent, { warningEventsOnly, events: value }));
1684
- };
1685
-
1686
- const useStyles$1 = makeStyles$1(
1687
- (theme) => createStyles$1({
1688
- closeButton: {
1689
- position: "absolute",
1690
- right: theme.spacing(1),
1691
- top: theme.spacing(1),
1692
- color: theme.palette.grey[500]
1693
- }
1694
- })
1695
- );
1696
- const FixDialog = ({
1697
- open,
1698
- pod,
1699
- error,
1700
- clusterName
1701
- }) => {
1702
- var _a;
1703
- const [isOpen, setOpen] = useState(!!open);
1704
- const classes = useStyles$1();
1705
- const openDialog = () => {
1706
- setOpen(true);
1707
- };
1708
- const closeDialog = () => {
1709
- setOpen(false);
1710
- };
1711
- const pf = error.proposedFix;
1712
- const dialogContent = () => {
1713
- var _a2, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l;
1714
- return /* @__PURE__ */ React__default.createElement(Grid, { container: true }, /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(Typography$1, { variant: "h6" }, "Detected error:"), /* @__PURE__ */ React__default.createElement(Typography$1, null, error.message)), /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(Typography$1, { variant: "h6" }, "Cause explanation:"), /* @__PURE__ */ React__default.createElement(Typography$1, null, (_b = (_a2 = error.proposedFix) == null ? void 0 : _a2.rootCauseExplanation) != null ? _b : "unknown")), /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(Typography$1, { variant: "h6" }, "Fix:"), /* @__PURE__ */ React__default.createElement(Typography$1, null, /* @__PURE__ */ React__default.createElement("ul", null, ((_d = (_c = error.proposedFix) == null ? void 0 : _c.actions) != null ? _d : []).map((fix, i) => {
1715
- var _a3, _b2;
1716
- return /* @__PURE__ */ React__default.createElement("li", { key: `${(_b2 = (_a3 = pod.metadata) == null ? void 0 : _a3.name) != null ? _b2 : "unknown"}-pf-${i}` }, fix);
1717
- })))), pf && pf.type === "logs" && /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(Typography$1, { variant: "h6" }, "Crash logs:")), /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 9 }, /* @__PURE__ */ React__default.createElement(
1718
- PodLogs,
1719
- {
1720
- previous: true,
1721
- containerScope: {
1722
- podName: (_f = (_e = pod.metadata) == null ? void 0 : _e.name) != null ? _f : "unknown",
1723
- podNamespace: (_h = (_g = pod.metadata) == null ? void 0 : _g.namespace) != null ? _h : "unknown",
1724
- cluster: { name: clusterName },
1725
- containerName: pf.container
1726
- }
1727
- }
1728
- ))), pf && pf.type === "events" && /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(Typography$1, { variant: "h6" }, "Events:")), /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 9 }, /* @__PURE__ */ React__default.createElement(
1729
- Events,
1730
- {
1731
- warningEventsOnly: true,
1732
- involvedObjectName: (_j = (_i = pod.metadata) == null ? void 0 : _i.name) != null ? _j : "",
1733
- namespace: (_l = (_k = pod.metadata) == null ? void 0 : _k.namespace) != null ? _l : "",
1734
- clusterName
1735
- }
1736
- ))));
1737
- };
1738
- return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement(
1739
- Button,
1740
- {
1741
- variant: "outlined",
1742
- "aria-label": "fix issue",
1743
- component: "label",
1744
- onClick: openDialog,
1745
- startIcon: /* @__PURE__ */ React__default.createElement(HelpIcon, null)
1746
- },
1747
- "Help"
1748
- ), /* @__PURE__ */ React__default.createElement(Dialog$1, { maxWidth: "xl", fullWidth: true, open: isOpen, onClose: closeDialog }, /* @__PURE__ */ React__default.createElement(DialogTitle$1, { id: "dialog-title" }, (_a = pod.metadata) == null ? void 0 : _a.name, " - ", error.type, /* @__PURE__ */ React__default.createElement(
1749
- IconButton$1,
1750
- {
1751
- "aria-label": "close",
1752
- className: classes.closeButton,
1753
- onClick: closeDialog
1754
- },
1755
- /* @__PURE__ */ React__default.createElement(CloseIcon, null)
1756
- )), /* @__PURE__ */ React__default.createElement(DialogContent$1, null, dialogContent()), /* @__PURE__ */ React__default.createElement(DialogActions, null, pf && pf.type === "docs" && /* @__PURE__ */ React__default.createElement(
1757
- LinkButton,
1758
- {
1759
- to: pf.docsLink,
1760
- variant: "outlined",
1761
- startIcon: /* @__PURE__ */ React__default.createElement(OpenInNewIcon, null),
1762
- target: "_blank",
1763
- rel: "noopener"
1764
- },
1765
- "Open docs"
1766
- ))));
1767
- };
1768
-
1769
- const useStyles = makeStyles(
1770
- (_theme) => createStyles({
1771
- root: {
1772
- overflow: "auto"
1773
- },
1774
- list: {
1775
- width: "100%"
1776
- }
1777
- })
1778
- );
1779
- const ErrorList = ({ podAndErrors }) => {
1780
- const classes = useStyles();
1781
- return /* @__PURE__ */ React__default.createElement(Paper, { className: classes.root }, /* @__PURE__ */ React__default.createElement(List, { className: classes.list }, podAndErrors.filter((pae) => pae.errors.length > 0).flatMap((onlyPodWithErrors) => {
1782
- return onlyPodWithErrors.errors.map((error, i) => {
1783
- var _a, _b, _c;
1784
- return /* @__PURE__ */ React__default.createElement(
1785
- React__default.Fragment,
1786
- {
1787
- key: `${(_b = (_a = onlyPodWithErrors.pod.metadata) == null ? void 0 : _a.name) != null ? _b : "unknown"}-eli-${i}`
1788
- },
1789
- i > 0 && /* @__PURE__ */ React__default.createElement(Divider, { key: `error-divider${i}` }),
1790
- /* @__PURE__ */ React__default.createElement(ListItem, null, /* @__PURE__ */ React__default.createElement(Grid, { container: true }, /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 9 }, /* @__PURE__ */ React__default.createElement(
1791
- ListItemText,
1792
- {
1793
- primary: error.message,
1794
- secondary: (_c = onlyPodWithErrors.pod.metadata) == null ? void 0 : _c.name
1795
- }
1796
- )), /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 3 }, /* @__PURE__ */ React__default.createElement(
1797
- FixDialog,
1798
- {
1799
- pod: onlyPodWithErrors.pod,
1800
- error,
1801
- clusterName: onlyPodWithErrors.cluster.name
1802
- }
1803
- ))))
1804
- );
1805
- });
1806
- })));
1807
- };
1808
-
1809
- const useDrawerContentStyles = makeStyles(
1810
- (_theme) => createStyles({
1811
- header: {
1812
- display: "flex",
1813
- flexDirection: "row",
1814
- justifyContent: "space-between"
1815
- },
1816
- content: {
1817
- height: "80%"
1818
- },
1819
- icon: {
1820
- fontSize: 20
1821
- },
1822
- podoklist: {
1823
- width: "100%",
1824
- maxWidth: 360,
1825
- maxHeight: 360
1826
- }
1827
- })
1828
- );
1829
- function getContainerSpecByName(pod, containerName) {
1830
- var _a;
1831
- return (_a = pod.spec) == null ? void 0 : _a.containers.find((c) => c.name === containerName);
1832
- }
1833
- const PodDrawer = ({ podAndErrors, open }) => {
1834
- var _a, _b, _c, _d, _e, _f, _g, _h, _i;
1835
- const classes = useDrawerContentStyles();
1836
- const podMetrics = usePodMetrics(podAndErrors.cluster.name, podAndErrors.pod);
1837
- return /* @__PURE__ */ React__default.createElement(
1838
- KubernetesDrawer,
1839
- {
1840
- open,
1841
- drawerContentsHeader: /* @__PURE__ */ React__default.createElement(Typography, { variant: "subtitle1" }, "Pod", " ", ((_a = podAndErrors.pod.status) == null ? void 0 : _a.podIP) && `(${(_b = podAndErrors.pod.status) == null ? void 0 : _b.podIP})`),
1842
- kubernetesObject: podAndErrors.pod,
1843
- label: /* @__PURE__ */ React__default.createElement(Typography, { variant: "subtitle1" }, (_d = (_c = podAndErrors.pod.metadata) == null ? void 0 : _c.name) != null ? _d : "unknown")
1844
- },
1845
- /* @__PURE__ */ React__default.createElement("div", { className: classes.content }, podMetrics && /* @__PURE__ */ React__default.createElement(Grid, { container: true, item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "h5" }, "Resource utilization")), /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 6 }, /* @__PURE__ */ React__default.createElement(
1846
- ResourceUtilization,
1847
- {
1848
- title: "CPU requests",
1849
- usage: podMetrics.cpu.currentUsage,
1850
- total: podMetrics.cpu.requestTotal,
1851
- totalFormatted: formatMillicores(podMetrics.cpu.requestTotal)
1852
- }
1853
- ), /* @__PURE__ */ React__default.createElement(
1854
- ResourceUtilization,
1855
- {
1856
- title: "CPU limits",
1857
- usage: podMetrics.cpu.currentUsage,
1858
- total: podMetrics.cpu.limitTotal,
1859
- totalFormatted: formatMillicores(podMetrics.cpu.limitTotal)
1860
- }
1861
- )), /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 6 }, /* @__PURE__ */ React__default.createElement(
1862
- ResourceUtilization,
1863
- {
1864
- title: "Memory requests",
1865
- usage: podMetrics.memory.currentUsage,
1866
- total: podMetrics.memory.requestTotal,
1867
- totalFormatted: bytesToMiB(podMetrics.memory.requestTotal)
1868
- }
1869
- ), /* @__PURE__ */ React__default.createElement(
1870
- ResourceUtilization,
1871
- {
1872
- title: "Memory limits",
1873
- usage: podMetrics.memory.currentUsage,
1874
- total: podMetrics.memory.limitTotal,
1875
- totalFormatted: bytesToMiB(podMetrics.memory.limitTotal)
1876
- }
1877
- ))), ((_e = podAndErrors.pod.status) == null ? void 0 : _e.phase) === "Pending" && /* @__PURE__ */ React__default.createElement(PendingPodContent, { pod: podAndErrors.pod }), ((_g = (_f = podAndErrors.pod.status) == null ? void 0 : _f.containerStatuses) == null ? void 0 : _g.length) && /* @__PURE__ */ React__default.createElement(Grid, { container: true, spacing: 2 }, /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "h5" }, "Containers")), /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(ItemCardGrid, null, (_i = (_h = podAndErrors.pod.status) == null ? void 0 : _h.containerStatuses) == null ? void 0 : _i.map(
1878
- (containerStatus, i) => {
1879
- var _a2, _b2, _c2, _d2, _e2, _f2;
1880
- const containerSpec = getContainerSpecByName(
1881
- podAndErrors.pod,
1882
- containerStatus.name
1883
- );
1884
- const containerMetrics = ((_a2 = podMetrics == null ? void 0 : podMetrics.containers) != null ? _a2 : []).find((c) => c.container === containerStatus.name);
1885
- return /* @__PURE__ */ React__default.createElement(
1886
- ContainerCard,
1887
- {
1888
- key: `container-card-${(_b2 = podAndErrors.pod.metadata) == null ? void 0 : _b2.name}-${i}`,
1889
- containerMetrics,
1890
- podScope: {
1891
- podName: (_d2 = (_c2 = podAndErrors.pod.metadata) == null ? void 0 : _c2.name) != null ? _d2 : "unknown",
1892
- podNamespace: (_f2 = (_e2 = podAndErrors.pod.metadata) == null ? void 0 : _e2.namespace) != null ? _f2 : "unknown",
1893
- cluster: podAndErrors.cluster
1894
- },
1895
- containerSpec,
1896
- containerStatus
1897
- }
1898
- );
1899
- }
1900
- ))), podAndErrors.errors.length > 0 && /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "h5" }, "Errors")), podAndErrors.errors.length > 0 && /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(ErrorList, { podAndErrors: [podAndErrors] }))))
1901
- );
1902
- };
1903
-
1904
- const containersReady = (pod) => {
1905
- var _a, _b;
1906
- const containerStatuses2 = (_b = (_a = pod.status) == null ? void 0 : _a.containerStatuses) != null ? _b : [];
1907
- const containersReadyItem = containerStatuses2.filter((cs) => cs.ready).length;
1908
- return `${containersReadyItem}/${containerStatuses2.length}`;
1909
- };
1910
- const totalRestarts = (pod) => {
1911
- var _a, _b;
1912
- const containerStatuses2 = (_b = (_a = pod.status) == null ? void 0 : _a.containerStatuses) != null ? _b : [];
1913
- return containerStatuses2 == null ? void 0 : containerStatuses2.reduce((a, b) => a + b.restartCount, 0);
1914
- };
1915
- const containerStatuses = (pod) => {
1916
- var _a, _b;
1917
- const containerStatusesItem = (_b = (_a = pod.status) == null ? void 0 : _a.containerStatuses) != null ? _b : [];
1918
- const errors = containerStatusesItem.reduce((accum, next) => {
1919
- if (next.state === void 0) {
1920
- return accum;
1921
- }
1922
- const waiting = next.state.waiting;
1923
- const terminated = next.state.terminated;
1924
- const renderCell = (reason) => {
1925
- var _a2;
1926
- return /* @__PURE__ */ React__default.createElement(Fragment, { key: `${(_a2 = pod.metadata) == null ? void 0 : _a2.name}-${next.name}` }, /* @__PURE__ */ React__default.createElement(
1927
- SubvalueCell,
1928
- {
1929
- value: reason === "Completed" ? /* @__PURE__ */ React__default.createElement(StatusOK, null, "Container: ", next.name) : /* @__PURE__ */ React__default.createElement(StatusError, null, "Container: ", next.name),
1930
- subvalue: reason
1931
- }
1932
- ), /* @__PURE__ */ React__default.createElement("br", null));
1933
- };
1934
- if (waiting) {
1935
- accum.push(renderCell(waiting.reason));
1936
- }
1937
- if (terminated) {
1938
- accum.push(renderCell(terminated.reason));
1939
- }
1940
- return accum;
1941
- }, []);
1942
- if (errors.length === 0) {
1943
- return /* @__PURE__ */ React__default.createElement(StatusOK, null, "OK");
1944
- }
1945
- return errors;
1946
- };
1947
- const renderCondition = (condition) => {
1948
- var _a;
1949
- const status = condition.status;
1950
- if (status === "True") {
1951
- return [condition.type, /* @__PURE__ */ React__default.createElement(StatusOK, null, "True")];
1952
- } else if (status === "False") {
1953
- return [
1954
- condition.type,
1955
- /* @__PURE__ */ React__default.createElement(
1956
- SubvalueCell,
1957
- {
1958
- value: /* @__PURE__ */ React__default.createElement(StatusError, null, "False"),
1959
- subvalue: (_a = condition.message) != null ? _a : ""
1960
- }
1961
- )
1962
- ];
1963
- }
1964
- return [condition.type, /* @__PURE__ */ React__default.createElement(StatusAborted, null)];
1965
- };
1966
- const currentToDeclaredResourceToPerc = (current, resource) => {
1967
- if (Number(resource) === 0)
1968
- return `0%`;
1969
- if (typeof current === "number" && typeof resource === "number") {
1970
- return `${Math.round(current / resource * 100)}%`;
1971
- }
1972
- const numerator = BigInt(
1973
- typeof current === "number" ? Math.round(current) : current
1974
- );
1975
- const denominator = BigInt(
1976
- typeof resource === "number" ? Math.round(resource) : resource
1977
- );
1978
- return `${numerator * BigInt(100) / denominator}%`;
1979
- };
1980
- const podStatusToCpuUtil = (podStatus) => {
1981
- const cpuUtil = podStatus.cpu;
1982
- let currentUsage = cpuUtil.currentUsage;
1983
- if (typeof cpuUtil.currentUsage === "number") {
1984
- currentUsage = cpuUtil.currentUsage / 10;
1985
- }
1986
- return /* @__PURE__ */ React__default.createElement(
1987
- SubvalueCell,
1988
- {
1989
- value: `requests: ${currentToDeclaredResourceToPerc(
1990
- currentUsage,
1991
- cpuUtil.requestTotal
1992
- )} of ${formatMillicores(cpuUtil.requestTotal)}`,
1993
- subvalue: `limits: ${currentToDeclaredResourceToPerc(
1994
- currentUsage,
1995
- cpuUtil.limitTotal
1996
- )} of ${formatMillicores(cpuUtil.limitTotal)}`
1997
- }
1998
- );
1999
- };
2000
- const podStatusToMemoryUtil = (podStatus) => {
2001
- const memUtil = podStatus.memory;
2002
- return /* @__PURE__ */ React__default.createElement(
2003
- SubvalueCell,
2004
- {
2005
- value: `requests: ${currentToDeclaredResourceToPerc(
2006
- memUtil.currentUsage,
2007
- memUtil.requestTotal
2008
- )} of ${bytesToMiB(memUtil.requestTotal)}`,
2009
- subvalue: `limits: ${currentToDeclaredResourceToPerc(
2010
- memUtil.currentUsage,
2011
- memUtil.limitTotal
2012
- )} of ${bytesToMiB(memUtil.limitTotal)}`
2013
- }
2014
- );
2015
- };
2016
-
2017
- const READY_COLUMNS = "READY";
2018
- const RESOURCE_COLUMNS = "RESOURCE";
2019
- const READY = [
2020
- {
2021
- title: "containers ready",
2022
- align: "center",
2023
- render: containersReady,
2024
- width: "auto"
2025
- },
2026
- {
2027
- title: "total restarts",
2028
- align: "center",
2029
- render: totalRestarts,
2030
- type: "numeric",
2031
- width: "auto"
2032
- }
2033
- ];
2034
- const PodDrawerTrigger = ({ pod }) => {
2035
- const errors = useMatchingErrors({
2036
- kind: "Pod",
2037
- apiVersion: "v1",
2038
- metadata: pod.metadata
2039
- });
2040
- return /* @__PURE__ */ React__default.createElement(
2041
- PodDrawer,
2042
- {
2043
- podAndErrors: {
2044
- pod,
2045
- cluster: useContext(ClusterContext),
2046
- errors
2047
- }
2048
- }
2049
- );
2050
- };
2051
- const Cpu = ({ clusterName, pod }) => {
2052
- const metrics = usePodMetrics(clusterName, pod);
2053
- if (!metrics) {
2054
- return /* @__PURE__ */ React__default.createElement(Typography, null, "unknown");
2055
- }
2056
- return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, podStatusToCpuUtil(metrics));
2057
- };
2058
- const Memory = ({ clusterName, pod }) => {
2059
- const metrics = usePodMetrics(clusterName, pod);
2060
- if (!metrics) {
2061
- return /* @__PURE__ */ React__default.createElement(Typography, null, "unknown");
2062
- }
2063
- return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, podStatusToMemoryUtil(metrics));
2064
- };
2065
- const PodsTable = ({ pods, extraColumns = [] }) => {
2066
- const cluster = useContext(ClusterContext);
2067
- const defaultColumns = [
2068
- {
2069
- title: "ID",
2070
- field: "metadata.uid",
2071
- hidden: true
2072
- },
2073
- {
2074
- title: "name",
2075
- highlight: true,
2076
- render: (pod) => {
2077
- return /* @__PURE__ */ React__default.createElement(PodDrawerTrigger, { pod });
2078
- }
2079
- },
2080
- {
2081
- title: "phase",
2082
- render: (pod) => {
2083
- var _a, _b;
2084
- return (_b = (_a = pod.status) == null ? void 0 : _a.phase) != null ? _b : "unknown";
2085
- },
2086
- width: "auto"
2087
- },
2088
- {
2089
- title: "status",
2090
- render: containerStatuses
2091
- }
2092
- ];
2093
- const columns = [...defaultColumns];
2094
- if (extraColumns.includes(READY_COLUMNS)) {
2095
- columns.push(...READY);
2096
- }
2097
- if (extraColumns.includes(RESOURCE_COLUMNS)) {
2098
- const resourceColumns = [
2099
- {
2100
- title: "CPU usage %",
2101
- render: (pod) => {
2102
- return /* @__PURE__ */ React__default.createElement(Cpu, { clusterName: cluster.name, pod });
2103
- },
2104
- width: "auto"
2105
- },
2106
- {
2107
- title: "Memory usage %",
2108
- render: (pod) => {
2109
- return /* @__PURE__ */ React__default.createElement(Memory, { clusterName: cluster.name, pod });
2110
- },
2111
- width: "auto"
2112
- }
2113
- ];
2114
- columns.push(...resourceColumns);
2115
- }
2116
- const tableStyle = {
2117
- minWidth: "0",
2118
- width: "100%"
2119
- };
2120
- return /* @__PURE__ */ React__default.createElement("div", { style: tableStyle }, /* @__PURE__ */ React__default.createElement(
2121
- Table,
2122
- {
2123
- options: { paging: true, search: false, emptyRowsWhenPaging: false },
2124
- data: pods.map((pod) => {
2125
- var _a;
2126
- return {
2127
- ...pod,
2128
- id: (_a = pod == null ? void 0 : pod.metadata) == null ? void 0 : _a.uid
2129
- };
2130
- }),
2131
- columns
2132
- }
2133
- ));
2134
- };
2135
-
2136
- const DeploymentDrawer = ({
2137
- deployment,
2138
- expanded
2139
- }) => {
2140
- var _a, _b, _c;
2141
- const namespace = (_a = deployment.metadata) == null ? void 0 : _a.namespace;
2142
- return /* @__PURE__ */ React__default.createElement(
2143
- KubernetesStructuredMetadataTableDrawer,
2144
- {
2145
- object: deployment,
2146
- expanded,
2147
- kind: "Deployment",
2148
- renderObject: (deploymentObj) => {
2149
- var _a2, _b2, _c2, _d, _e, _f, _g, _h;
2150
- const conditions = ((_b2 = (_a2 = deploymentObj.status) == null ? void 0 : _a2.conditions) != null ? _b2 : []).map(renderCondition).reduce((accum, next) => {
2151
- accum[next[0]] = next[1];
2152
- return accum;
2153
- }, {});
2154
- return {
2155
- strategy: (_d = (_c2 = deploymentObj.spec) == null ? void 0 : _c2.strategy) != null ? _d : "???",
2156
- minReadySeconds: (_f = (_e = deploymentObj.spec) == null ? void 0 : _e.minReadySeconds) != null ? _f : "???",
2157
- progressDeadlineSeconds: (_h = (_g = deploymentObj.spec) == null ? void 0 : _g.progressDeadlineSeconds) != null ? _h : "???",
2158
- ...conditions
2159
- };
2160
- }
2161
- },
2162
- /* @__PURE__ */ React__default.createElement(
2163
- Grid,
2164
- {
2165
- container: true,
2166
- direction: "column",
2167
- justifyContent: "flex-start",
2168
- alignItems: "flex-start",
2169
- spacing: 0
2170
- },
2171
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "body1" }, (_c = (_b = deployment.metadata) == null ? void 0 : _b.name) != null ? _c : "unknown object")),
2172
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(Typography, { color: "textSecondary", variant: "subtitle1" }, "Deployment")),
2173
- namespace && /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(Chip, { size: "small", label: `namespace: ${namespace}` }))
2174
- )
2175
- );
2176
- };
2177
-
2178
- const HorizontalPodAutoscalerDrawer = (props) => {
2179
- const { hpa, expanded, children } = props;
2180
- return /* @__PURE__ */ React__default.createElement(
2181
- KubernetesStructuredMetadataTableDrawer,
2182
- {
2183
- kind: "HorizontalPodAutoscaler",
2184
- object: hpa,
2185
- expanded,
2186
- renderObject: (hpaObject) => {
2187
- var _a, _b, _c, _d, _e, _f;
2188
- return {
2189
- targetCPUUtilizationPercentage: (_a = hpaObject.spec) == null ? void 0 : _a.targetCPUUtilizationPercentage,
2190
- currentCPUUtilizationPercentage: (_b = hpaObject.status) == null ? void 0 : _b.currentCPUUtilizationPercentage,
2191
- minReplicas: (_c = hpaObject.spec) == null ? void 0 : _c.minReplicas,
2192
- maxReplicas: (_d = hpaObject.spec) == null ? void 0 : _d.maxReplicas,
2193
- currentReplicas: (_e = hpaObject.status) == null ? void 0 : _e.currentReplicas,
2194
- desiredReplicas: (_f = hpaObject.status) == null ? void 0 : _f.desiredReplicas
2195
- };
2196
- }
2197
- },
2198
- children
2199
- );
2200
- };
2201
-
2202
- function getOwnedResources(potentialOwner, possiblyOwned) {
2203
- return possiblyOwned.filter(
2204
- (p) => {
2205
- var _a, _b, _c;
2206
- return (_c = (_b = (_a = p.metadata) == null ? void 0 : _a.ownerReferences) == null ? void 0 : _b.some(
2207
- (o) => {
2208
- var _a2;
2209
- return o.uid === ((_a2 = potentialOwner.metadata) == null ? void 0 : _a2.uid);
2210
- }
2211
- )) != null ? _c : false;
2212
- }
2213
- );
2214
- }
2215
- const getOwnedPodsThroughReplicaSets = (potentialOwner, replicaSets, pods) => {
2216
- return getOwnedResources(
2217
- potentialOwner,
2218
- replicaSets.filter((rs) => rs.status && rs.status.replicas > 0)
2219
- ).reduce((accum, rs) => {
2220
- return accum.concat(getOwnedResources(rs, pods));
2221
- }, []);
2222
- };
2223
- const getMatchingHpa = (owner, hpas) => {
2224
- return hpas.find((hpa) => {
2225
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
2226
- return ((_c = (_b = (_a = hpa.spec) == null ? void 0 : _a.scaleTargetRef) == null ? void 0 : _b.kind) != null ? _c : "").toLocaleLowerCase("en-US") === owner.kind.toLocaleLowerCase("en-US") && ((_e = (_d = hpa.metadata) == null ? void 0 : _d.namespace) != null ? _e : "") === ((_f = owner.namespace) != null ? _f : "unknown-namespace") && ((_i = (_h = (_g = hpa.spec) == null ? void 0 : _g.scaleTargetRef) == null ? void 0 : _h.name) != null ? _i : "") === ((_j = owner.name) != null ? _j : "unknown-deployment");
2227
- });
2228
- };
2229
-
2230
- const DeploymentSummary = ({
2231
- deployment,
2232
- numberOfCurrentPods,
2233
- numberOfPodsWithErrors,
2234
- hpa
2235
- }) => {
2236
- var _a, _b, _c, _d, _e, _f, _g, _h;
2237
- return /* @__PURE__ */ React__default.createElement(
2238
- Grid,
2239
- {
2240
- container: true,
2241
- direction: "row",
2242
- justifyContent: "space-between",
2243
- alignItems: "center",
2244
- spacing: 0
2245
- },
2246
- /* @__PURE__ */ React__default.createElement(Grid, { xs: 4, item: true }, /* @__PURE__ */ React__default.createElement(DeploymentDrawer, { deployment })),
2247
- hpa && /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 4 }, /* @__PURE__ */ React__default.createElement(HorizontalPodAutoscalerDrawer, { hpa }, /* @__PURE__ */ React__default.createElement(
2248
- Grid,
2249
- {
2250
- item: true,
2251
- container: true,
2252
- direction: "column",
2253
- justifyContent: "flex-start",
2254
- alignItems: "flex-start",
2255
- spacing: 0
2256
- },
2257
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "subtitle2" }, "min replicas ", (_b = (_a = hpa.spec) == null ? void 0 : _a.minReplicas) != null ? _b : "?", " / max replicas", " ", (_d = (_c = hpa.spec) == null ? void 0 : _c.maxReplicas) != null ? _d : "?")),
2258
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "subtitle2" }, "current CPU usage:", " ", (_f = (_e = hpa.status) == null ? void 0 : _e.currentCPUUtilizationPercentage) != null ? _f : "?", "%")),
2259
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "subtitle2" }, "target CPU usage:", " ", (_h = (_g = hpa.spec) == null ? void 0 : _g.targetCPUUtilizationPercentage) != null ? _h : "?", "%"))
2260
- ))),
2261
- /* @__PURE__ */ React__default.createElement(
2262
- Grid,
2263
- {
2264
- item: true,
2265
- container: true,
2266
- xs: 4,
2267
- direction: "column",
2268
- justifyContent: "flex-start",
2269
- alignItems: "flex-end",
2270
- spacing: 0
2271
- },
2272
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(StatusOK, null, numberOfCurrentPods, " pods")),
2273
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, numberOfPodsWithErrors > 0 ? /* @__PURE__ */ React__default.createElement(StatusError, null, numberOfPodsWithErrors, " pod", numberOfPodsWithErrors > 1 ? "s" : "", " with errors") : /* @__PURE__ */ React__default.createElement(StatusOK, null, "No pods with errors"))
2274
- )
2275
- );
2276
- };
2277
- const DeploymentAccordion = ({
2278
- deployment,
2279
- ownedPods,
2280
- matchingHpa
2281
- }) => {
2282
- const podNamesWithErrors = useContext(PodNamesWithErrorsContext);
2283
- const podsWithErrors = ownedPods.filter(
2284
- (p) => {
2285
- var _a, _b;
2286
- return podNamesWithErrors.has((_b = (_a = p.metadata) == null ? void 0 : _a.name) != null ? _b : "");
2287
- }
2288
- );
2289
- return /* @__PURE__ */ React__default.createElement(Accordion, { TransitionProps: { unmountOnExit: true }, variant: "outlined" }, /* @__PURE__ */ React__default.createElement(AccordionSummary, { expandIcon: /* @__PURE__ */ React__default.createElement(ExpandMoreIcon, null) }, /* @__PURE__ */ React__default.createElement(
2290
- DeploymentSummary,
2291
- {
2292
- deployment,
2293
- numberOfCurrentPods: ownedPods.length,
2294
- numberOfPodsWithErrors: podsWithErrors.length,
2295
- hpa: matchingHpa
2296
- }
2297
- )), /* @__PURE__ */ React__default.createElement(AccordionDetails, null, /* @__PURE__ */ React__default.createElement(
2298
- PodsTable,
2299
- {
2300
- pods: ownedPods,
2301
- extraColumns: [READY_COLUMNS, RESOURCE_COLUMNS]
2302
- }
2303
- )));
2304
- };
2305
- const DeploymentsAccordions = ({}) => {
2306
- const groupedResponses = useContext(GroupedResponsesContext);
2307
- return /* @__PURE__ */ React__default.createElement(
2308
- Grid,
2309
- {
2310
- container: true,
2311
- direction: "column",
2312
- justifyContent: "flex-start",
2313
- alignItems: "flex-start"
2314
- },
2315
- groupedResponses.deployments.map((deployment, i) => {
2316
- var _a, _b;
2317
- return /* @__PURE__ */ React__default.createElement(Grid, { container: true, item: true, key: i, xs: true }, /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: true }, /* @__PURE__ */ React__default.createElement(
2318
- DeploymentAccordion,
2319
- {
2320
- matchingHpa: getMatchingHpa(
2321
- {
2322
- name: (_a = deployment.metadata) == null ? void 0 : _a.name,
2323
- namespace: (_b = deployment.metadata) == null ? void 0 : _b.namespace,
2324
- kind: "deployment"
2325
- },
2326
- groupedResponses.horizontalPodAutoscalers
2327
- ),
2328
- ownedPods: getOwnedPodsThroughReplicaSets(
2329
- deployment,
2330
- groupedResponses.replicaSets,
2331
- groupedResponses.pods
2332
- ),
2333
- deployment
2334
- }
2335
- )));
2336
- })
2337
- );
2338
- };
2339
-
2340
- const StatefulSetDrawer = ({
2341
- statefulset,
2342
- expanded
2343
- }) => {
2344
- var _a, _b, _c;
2345
- const namespace = (_a = statefulset.metadata) == null ? void 0 : _a.namespace;
2346
- return /* @__PURE__ */ React__default.createElement(
2347
- KubernetesStructuredMetadataTableDrawer,
2348
- {
2349
- object: statefulset,
2350
- expanded,
2351
- kind: "StatefulSet",
2352
- renderObject: (statefulsetObj) => {
2353
- var _a2, _b2, _c2, _d, _e, _f, _g, _h, _i, _j, _k, _l;
2354
- const conditions = ((_b2 = (_a2 = statefulsetObj.status) == null ? void 0 : _a2.conditions) != null ? _b2 : []).map(renderCondition).reduce((accum, next) => {
2355
- accum[next[0]] = next[1];
2356
- return accum;
2357
- }, {});
2358
- return {
2359
- updateStrategy: (_d = (_c2 = statefulset.spec) == null ? void 0 : _c2.updateStrategy) != null ? _d : "???",
2360
- podManagementPolicy: (_f = (_e = statefulset.spec) == null ? void 0 : _e.podManagementPolicy) != null ? _f : "???",
2361
- serviceName: (_h = (_g = statefulset.spec) == null ? void 0 : _g.serviceName) != null ? _h : "???",
2362
- selector: (_j = (_i = statefulset.spec) == null ? void 0 : _i.selector) != null ? _j : "???",
2363
- revisionHistoryLimit: (_l = (_k = statefulset.spec) == null ? void 0 : _k.revisionHistoryLimit) != null ? _l : "???",
2364
- ...conditions
2365
- };
2366
- }
2367
- },
2368
- /* @__PURE__ */ React__default.createElement(
2369
- Grid,
2370
- {
2371
- container: true,
2372
- direction: "column",
2373
- justifyContent: "flex-start",
2374
- alignItems: "flex-start",
2375
- spacing: 0
2376
- },
2377
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "body1" }, (_c = (_b = statefulset.metadata) == null ? void 0 : _b.name) != null ? _c : "unknown object")),
2378
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(Typography, { color: "textSecondary", variant: "subtitle1" }, "Stateful Set")),
2379
- namespace && /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(Chip, { size: "small", label: `namespace: ${namespace}` }))
2380
- )
2381
- );
2382
- };
2383
-
2384
- const StatefulSetSummary = ({
2385
- statefulset,
2386
- numberOfCurrentPods,
2387
- numberOfPodsWithErrors,
2388
- hpa
2389
- }) => {
2390
- var _a, _b, _c, _d, _e, _f, _g, _h;
2391
- return /* @__PURE__ */ React__default.createElement(
2392
- Grid,
2393
- {
2394
- container: true,
2395
- direction: "row",
2396
- justifyContent: "space-between",
2397
- alignItems: "center",
2398
- spacing: 0
2399
- },
2400
- /* @__PURE__ */ React__default.createElement(Grid, { xs: 6, item: true }, /* @__PURE__ */ React__default.createElement(StatefulSetDrawer, { statefulset })),
2401
- hpa && /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 3 }, /* @__PURE__ */ React__default.createElement(HorizontalPodAutoscalerDrawer, { hpa }, /* @__PURE__ */ React__default.createElement(
2402
- Grid,
2403
- {
2404
- item: true,
2405
- container: true,
2406
- direction: "column",
2407
- justifyContent: "flex-start",
2408
- alignItems: "flex-start",
2409
- spacing: 0
2410
- },
2411
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "subtitle2" }, "min replicas ", (_b = (_a = hpa.spec) == null ? void 0 : _a.minReplicas) != null ? _b : "?", " / max replicas", " ", (_d = (_c = hpa.spec) == null ? void 0 : _c.maxReplicas) != null ? _d : "?")),
2412
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "subtitle2" }, "current CPU usage:", " ", (_f = (_e = hpa.status) == null ? void 0 : _e.currentCPUUtilizationPercentage) != null ? _f : "?", "%")),
2413
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "subtitle2" }, "target CPU usage:", " ", (_h = (_g = hpa.spec) == null ? void 0 : _g.targetCPUUtilizationPercentage) != null ? _h : "?", "%"))
2414
- ))),
2415
- /* @__PURE__ */ React__default.createElement(
2416
- Grid,
2417
- {
2418
- item: true,
2419
- container: true,
2420
- xs: 3,
2421
- direction: "column",
2422
- justifyContent: "flex-start",
2423
- alignItems: "flex-start",
2424
- spacing: 0
2425
- },
2426
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(StatusOK, null, numberOfCurrentPods, " pods")),
2427
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, numberOfPodsWithErrors > 0 ? /* @__PURE__ */ React__default.createElement(StatusError, null, numberOfPodsWithErrors, " pod", numberOfPodsWithErrors > 1 ? "s" : "", " with errors") : /* @__PURE__ */ React__default.createElement(StatusOK, null, "No pods with errors"))
2428
- )
2429
- );
2430
- };
2431
- const StatefulSetAccordion = ({
2432
- statefulset,
2433
- ownedPods,
2434
- matchingHpa
2435
- }) => {
2436
- const podNamesWithErrors = useContext(PodNamesWithErrorsContext);
2437
- const podsWithErrors = ownedPods.filter(
2438
- (p) => {
2439
- var _a, _b;
2440
- return podNamesWithErrors.has((_b = (_a = p.metadata) == null ? void 0 : _a.name) != null ? _b : "");
2441
- }
2442
- );
2443
- return /* @__PURE__ */ React__default.createElement(Accordion, { TransitionProps: { unmountOnExit: true }, variant: "outlined" }, /* @__PURE__ */ React__default.createElement(AccordionSummary, { expandIcon: /* @__PURE__ */ React__default.createElement(ExpandMoreIcon, null) }, /* @__PURE__ */ React__default.createElement(
2444
- StatefulSetSummary,
2445
- {
2446
- statefulset,
2447
- numberOfCurrentPods: ownedPods.length,
2448
- numberOfPodsWithErrors: podsWithErrors.length,
2449
- hpa: matchingHpa
2450
- }
2451
- )), /* @__PURE__ */ React__default.createElement(AccordionDetails, null, /* @__PURE__ */ React__default.createElement(
2452
- PodsTable,
2453
- {
2454
- pods: ownedPods,
2455
- extraColumns: [READY_COLUMNS, RESOURCE_COLUMNS]
2456
- }
2457
- )));
2458
- };
2459
- const StatefulSetsAccordions = ({}) => {
2460
- const groupedResponses = useContext(GroupedResponsesContext);
2461
- return /* @__PURE__ */ React__default.createElement(
2462
- Grid,
2463
- {
2464
- container: true,
2465
- direction: "column",
2466
- justifyContent: "flex-start",
2467
- alignItems: "flex-start"
2468
- },
2469
- groupedResponses.statefulsets.map((statefulset, i) => {
2470
- var _a, _b;
2471
- return /* @__PURE__ */ React__default.createElement(Grid, { container: true, item: true, key: i, xs: true }, /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: true }, /* @__PURE__ */ React__default.createElement(
2472
- StatefulSetAccordion,
2473
- {
2474
- matchingHpa: getMatchingHpa(
2475
- {
2476
- name: (_a = statefulset.metadata) == null ? void 0 : _a.name,
2477
- namespace: (_b = statefulset.metadata) == null ? void 0 : _b.namespace,
2478
- kind: "statefulset"
2479
- },
2480
- groupedResponses.horizontalPodAutoscalers
2481
- ),
2482
- ownedPods: getOwnedResources(statefulset, groupedResponses.pods),
2483
- statefulset
2484
- }
2485
- )));
2486
- })
2487
- );
2488
- };
2489
-
2490
- const IngressDrawer = ({
2491
- ingress,
2492
- expanded
2493
- }) => {
2494
- var _a, _b;
2495
- return /* @__PURE__ */ React__default.createElement(
2496
- KubernetesStructuredMetadataTableDrawer,
2497
- {
2498
- object: ingress,
2499
- expanded,
2500
- kind: "Ingress",
2501
- renderObject: (ingressObject) => {
2502
- return ingressObject.spec || {};
2503
- }
2504
- },
2505
- /* @__PURE__ */ React__default.createElement(
2506
- Grid,
2507
- {
2508
- container: true,
2509
- direction: "column",
2510
- justifyContent: "flex-start",
2511
- alignItems: "flex-start",
2512
- spacing: 0
2513
- },
2514
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "body1" }, (_b = (_a = ingress.metadata) == null ? void 0 : _a.name) != null ? _b : "unknown object")),
2515
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(Typography, { color: "textSecondary", variant: "subtitle1" }, "Ingress"))
2516
- )
2517
- );
2518
- };
2519
-
2520
- const IngressSummary = ({ ingress }) => {
2521
- return /* @__PURE__ */ React__default.createElement(
2522
- Grid,
2523
- {
2524
- container: true,
2525
- direction: "row",
2526
- justifyContent: "flex-start",
2527
- alignItems: "center"
2528
- },
2529
- /* @__PURE__ */ React__default.createElement(Grid, { xs: 12, item: true }, /* @__PURE__ */ React__default.createElement(IngressDrawer, { ingress }))
2530
- );
2531
- };
2532
- const IngressCard = ({ ingress }) => {
2533
- return /* @__PURE__ */ React__default.createElement(
2534
- StructuredMetadataTable,
2535
- {
2536
- metadata: {
2537
- ...ingress.spec
2538
- }
2539
- }
2540
- );
2541
- };
2542
- const IngressAccordion = ({ ingress }) => {
2543
- return /* @__PURE__ */ React__default.createElement(Accordion, { TransitionProps: { unmountOnExit: true } }, /* @__PURE__ */ React__default.createElement(AccordionSummary, { expandIcon: /* @__PURE__ */ React__default.createElement(ExpandMoreIcon, null) }, /* @__PURE__ */ React__default.createElement(IngressSummary, { ingress })), /* @__PURE__ */ React__default.createElement(AccordionDetails, null, /* @__PURE__ */ React__default.createElement(IngressCard, { ingress })));
2544
- };
2545
- const IngressesAccordions = ({}) => {
2546
- const groupedResponses = useContext(GroupedResponsesContext);
2547
- return /* @__PURE__ */ React__default.createElement(
2548
- Grid,
2549
- {
2550
- container: true,
2551
- direction: "row",
2552
- justifyContent: "flex-start",
2553
- alignItems: "flex-start"
2554
- },
2555
- groupedResponses.ingresses.map((ingress, i) => /* @__PURE__ */ React__default.createElement(Grid, { item: true, key: i, xs: true }, /* @__PURE__ */ React__default.createElement(IngressAccordion, { ingress })))
2556
- );
2557
- };
2558
-
2559
- const ServiceDrawer = ({
2560
- service,
2561
- expanded
2562
- }) => {
2563
- var _a, _b;
2564
- return /* @__PURE__ */ React__default.createElement(
2565
- KubernetesStructuredMetadataTableDrawer,
2566
- {
2567
- object: service,
2568
- expanded,
2569
- kind: "Service",
2570
- renderObject: (serviceObject) => {
2571
- return serviceObject.spec || {};
2572
- }
2573
- },
2574
- /* @__PURE__ */ React__default.createElement(
2575
- Grid,
2576
- {
2577
- container: true,
2578
- direction: "column",
2579
- justifyContent: "flex-start",
2580
- alignItems: "flex-start",
2581
- spacing: 0
2582
- },
2583
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "body1" }, (_b = (_a = service.metadata) == null ? void 0 : _a.name) != null ? _b : "unknown object")),
2584
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(Typography, { color: "textSecondary", variant: "subtitle1" }, "Service"))
2585
- )
2586
- );
2587
- };
2588
-
2589
- const ServiceSummary = ({ service }) => {
2590
- var _a, _b;
2591
- return /* @__PURE__ */ React__default.createElement(
2592
- Grid,
2593
- {
2594
- container: true,
2595
- direction: "row",
2596
- justifyContent: "space-between",
2597
- alignItems: "center",
2598
- spacing: 0
2599
- },
2600
- /* @__PURE__ */ React__default.createElement(Grid, { xs: 8, item: true }, /* @__PURE__ */ React__default.createElement(ServiceDrawer, { service })),
2601
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "subtitle2" }, "Type: ", (_b = (_a = service.spec) == null ? void 0 : _a.type) != null ? _b : "?"))
2602
- );
2603
- };
2604
- const ServiceCard = ({ service }) => {
2605
- var _a, _b, _c, _d, _e, _f, _g, _h, _i;
2606
- const metadata = {};
2607
- if ((_d = (_c = (_b = (_a = service.status) == null ? void 0 : _a.loadBalancer) == null ? void 0 : _b.ingress) == null ? void 0 : _c.length) != null ? _d : -1 > 0) {
2608
- metadata.loadbalancer = (_e = service.status) == null ? void 0 : _e.loadBalancer;
2609
- }
2610
- if (((_f = service.spec) == null ? void 0 : _f.type) === "ClusterIP") {
2611
- metadata.clusterIP = service.spec.clusterIP;
2612
- }
2613
- if (((_g = service.spec) == null ? void 0 : _g.type) === "ExternalName") {
2614
- metadata.externalName = service.spec.externalName;
2615
- }
2616
- return /* @__PURE__ */ React__default.createElement(
2617
- StructuredMetadataTable,
2618
- {
2619
- metadata: {
2620
- type: (_h = service.spec) == null ? void 0 : _h.type,
2621
- ports: (_i = service.spec) == null ? void 0 : _i.ports,
2622
- ...metadata
2623
- }
2624
- }
2625
- );
2626
- };
2627
- const ServiceAccordion = ({ service }) => {
2628
- return /* @__PURE__ */ React__default.createElement(Accordion, { TransitionProps: { unmountOnExit: true }, variant: "outlined" }, /* @__PURE__ */ React__default.createElement(AccordionSummary, { expandIcon: /* @__PURE__ */ React__default.createElement(ExpandMoreIcon, null) }, /* @__PURE__ */ React__default.createElement(ServiceSummary, { service })), /* @__PURE__ */ React__default.createElement(AccordionDetails, null, /* @__PURE__ */ React__default.createElement(ServiceCard, { service })));
2629
- };
2630
- const ServicesAccordions = ({}) => {
2631
- const groupedResponses = useContext(GroupedResponsesContext);
2632
- return /* @__PURE__ */ React__default.createElement(
2633
- Grid,
2634
- {
2635
- container: true,
2636
- direction: "row",
2637
- justifyContent: "flex-start",
2638
- alignItems: "flex-start"
2639
- },
2640
- groupedResponses.services.map((service, i) => /* @__PURE__ */ React__default.createElement(Grid, { item: true, key: i, xs: true }, /* @__PURE__ */ React__default.createElement(ServiceAccordion, { service })))
2641
- );
2642
- };
2643
-
2644
- const JobDrawer = ({
2645
- job,
2646
- expanded
2647
- }) => {
2648
- var _a, _b;
2649
- return /* @__PURE__ */ React__default.createElement(
2650
- KubernetesStructuredMetadataTableDrawer,
2651
- {
2652
- object: job,
2653
- expanded,
2654
- kind: "Job",
2655
- renderObject: (jobObj) => {
2656
- var _a2, _b2, _c, _d, _e, _f, _g, _h;
2657
- return {
2658
- parallelism: (_b2 = (_a2 = jobObj.spec) == null ? void 0 : _a2.parallelism) != null ? _b2 : "???",
2659
- completions: (_d = (_c = jobObj.spec) == null ? void 0 : _c.completions) != null ? _d : "???",
2660
- backoffLimit: (_f = (_e = jobObj.spec) == null ? void 0 : _e.backoffLimit) != null ? _f : "???",
2661
- startTime: (_h = (_g = jobObj.status) == null ? void 0 : _g.startTime) != null ? _h : "???"
2662
- };
2663
- }
2664
- },
2665
- /* @__PURE__ */ React__default.createElement(
2666
- Grid,
2667
- {
2668
- container: true,
2669
- direction: "column",
2670
- justifyContent: "flex-start",
2671
- alignItems: "flex-start",
2672
- spacing: 0
2673
- },
2674
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "body1" }, (_b = (_a = job.metadata) == null ? void 0 : _a.name) != null ? _b : "unknown object")),
2675
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(Typography, { color: "textSecondary", variant: "subtitle1" }, "Job"))
2676
- )
2677
- );
2678
- };
2679
-
2680
- const JobSummary = ({ job }) => {
2681
- var _a, _b, _c, _d, _e, _f;
2682
- return /* @__PURE__ */ React__default.createElement(
2683
- Grid,
2684
- {
2685
- container: true,
2686
- direction: "row",
2687
- justifyContent: "space-between",
2688
- alignItems: "center",
2689
- spacing: 0
2690
- },
2691
- /* @__PURE__ */ React__default.createElement(Grid, { xs: 6, item: true }, /* @__PURE__ */ React__default.createElement(JobDrawer, { job })),
2692
- /* @__PURE__ */ React__default.createElement(
2693
- Grid,
2694
- {
2695
- item: true,
2696
- container: true,
2697
- xs: 6,
2698
- direction: "column",
2699
- justifyContent: "flex-start",
2700
- alignItems: "flex-end",
2701
- spacing: 0
2702
- },
2703
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, ((_a = job.status) == null ? void 0 : _a.succeeded) && /* @__PURE__ */ React__default.createElement(StatusOK, null, "Succeeded"), ((_b = job.status) == null ? void 0 : _b.active) && /* @__PURE__ */ React__default.createElement(StatusPending, null, "Running"), ((_c = job.status) == null ? void 0 : _c.failed) && /* @__PURE__ */ React__default.createElement(StatusError, null, "Failed")),
2704
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, "Start time: ", (_e = (_d = job.status) == null ? void 0 : _d.startTime) == null ? void 0 : _e.toString()),
2705
- ((_f = job.status) == null ? void 0 : _f.completionTime) && /* @__PURE__ */ React__default.createElement(Grid, { item: true }, "Completion time: ", job.status.completionTime.toString())
2706
- )
2707
- );
2708
- };
2709
- const JobAccordion = ({ job, ownedPods }) => {
2710
- return /* @__PURE__ */ React__default.createElement(Accordion, { TransitionProps: { unmountOnExit: true }, variant: "outlined" }, /* @__PURE__ */ React__default.createElement(AccordionSummary, { expandIcon: /* @__PURE__ */ React__default.createElement(ExpandMoreIcon, null) }, /* @__PURE__ */ React__default.createElement(JobSummary, { job })), /* @__PURE__ */ React__default.createElement(AccordionDetails, null, /* @__PURE__ */ React__default.createElement(PodsTable, { pods: ownedPods })));
2711
- };
2712
- const JobsAccordions = ({ jobs }) => {
2713
- const groupedResponses = useContext(GroupedResponsesContext);
2714
- return /* @__PURE__ */ React__default.createElement(
2715
- Grid,
2716
- {
2717
- container: true,
2718
- direction: "column",
2719
- justifyContent: "flex-start",
2720
- alignItems: "flex-start"
2721
- },
2722
- jobs.map((job, i) => /* @__PURE__ */ React__default.createElement(Grid, { container: true, item: true, key: i, xs: true }, /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: true }, /* @__PURE__ */ React__default.createElement(
2723
- JobAccordion,
2724
- {
2725
- ownedPods: getOwnedResources(job, groupedResponses.pods),
2726
- job
2727
- }
2728
- ))))
2729
- );
2730
- };
2731
-
2732
- const CronJobDrawer = ({
2733
- cronJob,
2734
- expanded
2735
- }) => {
2736
- var _a, _b, _c;
2737
- const namespace = (_a = cronJob.metadata) == null ? void 0 : _a.namespace;
2738
- return /* @__PURE__ */ React__default.createElement(
2739
- KubernetesStructuredMetadataTableDrawer,
2740
- {
2741
- object: cronJob,
2742
- expanded,
2743
- kind: "CronJob",
2744
- renderObject: (cronJobObj) => {
2745
- var _a2, _b2, _c2, _d, _e, _f, _g, _h;
2746
- return {
2747
- schedule: (_b2 = (_a2 = cronJobObj.spec) == null ? void 0 : _a2.schedule) != null ? _b2 : "???",
2748
- startingDeadlineSeconds: (_d = (_c2 = cronJobObj.spec) == null ? void 0 : _c2.startingDeadlineSeconds) != null ? _d : "???",
2749
- concurrencyPolicy: (_f = (_e = cronJobObj.spec) == null ? void 0 : _e.concurrencyPolicy) != null ? _f : "???",
2750
- lastScheduleTime: (_h = (_g = cronJobObj.status) == null ? void 0 : _g.lastScheduleTime) != null ? _h : "???"
2751
- };
2752
- }
2753
- },
2754
- /* @__PURE__ */ React__default.createElement(
2755
- Grid,
2756
- {
2757
- container: true,
2758
- direction: "column",
2759
- justifyContent: "flex-start",
2760
- alignItems: "flex-start",
2761
- spacing: 0
2762
- },
2763
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "body1" }, (_c = (_b = cronJob.metadata) == null ? void 0 : _b.name) != null ? _c : "unknown object")),
2764
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(Typography, { color: "textSecondary", variant: "subtitle1" }, "CronJob")),
2765
- namespace && /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(Chip, { size: "small", label: `namespace: ${namespace}` }))
2766
- )
2767
- );
2768
- };
2769
-
2770
- const k8sCronAliases = /* @__PURE__ */ new Map([
2771
- ["@yearly", "0 0 1 1 *"],
2772
- ["@annually", "0 0 1 1 *"],
2773
- ["@monthly", "0 0 1 * *"],
2774
- ["@weekly", "0 0 * * 0"],
2775
- ["@daily", "0 0 * * *"],
2776
- ["@midnight", "0 0 * * *"],
2777
- ["@hourly", "0 * * * *"]
2778
- ]);
2779
- const humanizeCron = (schedule) => {
2780
- const deAliasedSchedule = k8sCronAliases.get(schedule) || schedule;
2781
- try {
2782
- return cronstrue.toString(deAliasedSchedule);
2783
- } catch (e) {
2784
- return deAliasedSchedule;
2785
- }
2786
- };
2787
-
2788
- const CronJobSummary = ({ cronJob }) => {
2789
- var _a, _b;
2790
- return /* @__PURE__ */ React__default.createElement(
2791
- Grid,
2792
- {
2793
- container: true,
2794
- direction: "row",
2795
- justifyContent: "space-between",
2796
- alignItems: "center",
2797
- spacing: 0
2798
- },
2799
- /* @__PURE__ */ React__default.createElement(Grid, { xs: 6, item: true }, /* @__PURE__ */ React__default.createElement(CronJobDrawer, { cronJob })),
2800
- /* @__PURE__ */ React__default.createElement(
2801
- Grid,
2802
- {
2803
- item: true,
2804
- container: true,
2805
- xs: 6,
2806
- direction: "column",
2807
- justifyContent: "flex-start",
2808
- alignItems: "flex-end",
2809
- spacing: 0
2810
- },
2811
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, ((_a = cronJob.spec) == null ? void 0 : _a.suspend) ? /* @__PURE__ */ React__default.createElement(StatusError, null, "Suspended") : /* @__PURE__ */ React__default.createElement(StatusOK, null, "Active")),
2812
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "body1" }, "Schedule:", " ", ((_b = cronJob.spec) == null ? void 0 : _b.schedule) ? `${cronJob.spec.schedule} (${humanizeCron(
2813
- cronJob.spec.schedule
2814
- )})` : "N/A"))
2815
- )
2816
- );
2817
- };
2818
- const CronJobAccordion = ({ cronJob, ownedJobs }) => {
2819
- return /* @__PURE__ */ React__default.createElement(Accordion, { TransitionProps: { unmountOnExit: true }, variant: "outlined" }, /* @__PURE__ */ React__default.createElement(AccordionSummary, { expandIcon: /* @__PURE__ */ React__default.createElement(ExpandMoreIcon, null) }, /* @__PURE__ */ React__default.createElement(CronJobSummary, { cronJob })), /* @__PURE__ */ React__default.createElement(AccordionDetails, null, /* @__PURE__ */ React__default.createElement(JobsAccordions, { jobs: ownedJobs.reverse() })));
2820
- };
2821
- const CronJobsAccordions = ({}) => {
2822
- const groupedResponses = useContext(GroupedResponsesContext);
2823
- return /* @__PURE__ */ React__default.createElement(
2824
- Grid,
2825
- {
2826
- container: true,
2827
- direction: "column",
2828
- justifyContent: "flex-start",
2829
- alignItems: "flex-start"
2830
- },
2831
- groupedResponses.cronJobs.map((cronJob, i) => /* @__PURE__ */ React__default.createElement(Grid, { container: true, item: true, key: i, xs: true }, /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: true }, /* @__PURE__ */ React__default.createElement(
2832
- CronJobAccordion,
2833
- {
2834
- ownedJobs: getOwnedResources(cronJob, groupedResponses.jobs),
2835
- cronJob
2836
- }
2837
- ))))
2838
- );
2839
- };
2840
-
2841
- const RolloutDrawer = ({
2842
- rollout,
2843
- expanded
2844
- }) => {
2845
- var _a, _b;
2846
- return /* @__PURE__ */ React__default.createElement(
2847
- KubernetesStructuredMetadataTableDrawer,
2848
- {
2849
- object: rollout,
2850
- expanded,
2851
- kind: "Rollout",
2852
- renderObject: () => ({})
2853
- },
2854
- /* @__PURE__ */ React__default.createElement(
2855
- Grid,
2856
- {
2857
- container: true,
2858
- direction: "column",
2859
- justifyContent: "flex-start",
2860
- alignItems: "flex-start",
2861
- spacing: 0
2862
- },
2863
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "body1" }, (_b = (_a = rollout.metadata) == null ? void 0 : _a.name) != null ? _b : "unknown object")),
2864
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(Typography, { color: "textSecondary", variant: "subtitle1" }, "Rollout"))
2865
- )
2866
- );
2867
- };
2868
-
2869
- const isSetWeightStep = (step) => step.hasOwnProperty("setWeight");
2870
- const isPauseStep = (step) => step.hasOwnProperty("pause");
2871
- const isAnalysisStep = (step) => step.hasOwnProperty("analysis");
2872
- const createLabelForStep = (step) => {
2873
- if (isSetWeightStep(step)) {
2874
- return `setWeight ${step.setWeight}%`;
2875
- } else if (isPauseStep(step)) {
2876
- return step.pause.duration === void 0 ? "infinite pause" : `pause for ${step.pause.duration}`;
2877
- } else if (isAnalysisStep(step)) {
2878
- return /* @__PURE__ */ React__default.createElement("div", null, /* @__PURE__ */ React__default.createElement(Typography$1, { paragraph: true }, "analysis templates:"), step.analysis.templates.map((t, i) => /* @__PURE__ */ React__default.createElement(Typography$1, { paragraph: true, key: i }, `${t.templateName}${t.clusterScope ? " (cluster scoped)" : ""}`)));
2879
- }
2880
- return "unknown step";
2881
- };
2882
- const StepsProgress = ({
2883
- currentStepIndex,
2884
- aborted,
2885
- steps
2886
- }) => {
2887
- const activeStepIndex = currentStepIndex >= steps.length ? currentStepIndex + 1 : currentStepIndex;
2888
- return /* @__PURE__ */ React__default.createElement(Stepper, { activeStep: aborted ? -1 : activeStepIndex, alternativeLabel: true }, steps.map((step, i) => /* @__PURE__ */ React__default.createElement(Step, { key: i }, /* @__PURE__ */ React__default.createElement(StepLabel, { "data-testid": `step-${i}` }, createLabelForStep(step)))).concat(
2889
- /* @__PURE__ */ React__default.createElement(Step, { key: "-1" }, /* @__PURE__ */ React__default.createElement(StepLabel, { "data-testid": "step--1" }, "Canary promoted"))
2890
- ));
2891
- };
2892
-
2893
- const AbortedTitle = /* @__PURE__ */ React__default.createElement(
2894
- "div",
2895
- {
2896
- style: {
2897
- display: "flex",
2898
- alignItems: "center",
2899
- flexWrap: "wrap"
2900
- }
2901
- },
2902
- /* @__PURE__ */ React__default.createElement(ErrorOutlineIcon, null),
2903
- /* @__PURE__ */ React__default.createElement(Typography, { variant: "subtitle1" }, "Aborted")
2904
- );
2905
- const findAbortedMessage = (rollout) => {
2906
- var _a, _b, _c;
2907
- return (_c = (_b = (_a = rollout.status) == null ? void 0 : _a.conditions) == null ? void 0 : _b.find(
2908
- (c) => c.type === "Progressing" && c.status === "False" && c.reason === "RolloutAborted"
2909
- )) == null ? void 0 : _c.message;
2910
- };
2911
- const RolloutSummary = ({
2912
- rollout,
2913
- numberOfCurrentPods,
2914
- numberOfPodsWithErrors,
2915
- hpa
2916
- }) => {
2917
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
2918
- const pauseTime = (_c = (_b = (_a = rollout.status) == null ? void 0 : _a.pauseConditions) == null ? void 0 : _b.find(
2919
- (p) => p.reason === "CanaryPauseStep"
2920
- )) == null ? void 0 : _c.startTime;
2921
- const abortedMessage = findAbortedMessage(rollout);
2922
- return /* @__PURE__ */ React__default.createElement(
2923
- Grid,
2924
- {
2925
- container: true,
2926
- direction: "row",
2927
- justifyContent: "space-between",
2928
- alignItems: "center",
2929
- spacing: 0
2930
- },
2931
- /* @__PURE__ */ React__default.createElement(Grid, { xs: 6, item: true }, /* @__PURE__ */ React__default.createElement(RolloutDrawer, { rollout })),
2932
- hpa && /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 3 }, /* @__PURE__ */ React__default.createElement(HorizontalPodAutoscalerDrawer, { hpa }, /* @__PURE__ */ React__default.createElement(
2933
- Grid,
2934
- {
2935
- item: true,
2936
- container: true,
2937
- direction: "column",
2938
- justifyContent: "flex-start",
2939
- alignItems: "flex-start",
2940
- spacing: 0
2941
- },
2942
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "subtitle2" }, "min replicas ", (_e = (_d = hpa.spec) == null ? void 0 : _d.minReplicas) != null ? _e : "?", " / max replicas", " ", (_g = (_f = hpa.spec) == null ? void 0 : _f.maxReplicas) != null ? _g : "?")),
2943
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "subtitle2" }, "current CPU usage:", " ", (_i = (_h = hpa.status) == null ? void 0 : _h.currentCPUUtilizationPercentage) != null ? _i : "?", "%")),
2944
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "subtitle2" }, "target CPU usage:", " ", (_k = (_j = hpa.spec) == null ? void 0 : _j.targetCPUUtilizationPercentage) != null ? _k : "?", "%"))
2945
- ))),
2946
- /* @__PURE__ */ React__default.createElement(
2947
- Grid,
2948
- {
2949
- item: true,
2950
- container: true,
2951
- xs: 3,
2952
- direction: "column",
2953
- justifyContent: "flex-start",
2954
- alignItems: "flex-end",
2955
- spacing: 0
2956
- },
2957
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(StatusOK, null, numberOfCurrentPods, " pods")),
2958
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, numberOfPodsWithErrors > 0 ? /* @__PURE__ */ React__default.createElement(StatusError, null, numberOfPodsWithErrors, " pod", numberOfPodsWithErrors > 1 ? "s" : "", " with errors") : /* @__PURE__ */ React__default.createElement(StatusOK, null, "No pods with errors"))
2959
- ),
2960
- pauseTime && /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 3 }, /* @__PURE__ */ React__default.createElement(
2961
- "div",
2962
- {
2963
- style: {
2964
- display: "flex",
2965
- alignItems: "center",
2966
- flexWrap: "wrap"
2967
- }
2968
- },
2969
- /* @__PURE__ */ React__default.createElement(PauseIcon, null),
2970
- /* @__PURE__ */ React__default.createElement(Typography, { variant: "subtitle1" }, "Paused (", DateTime.fromISO(pauseTime).toRelative({ locale: "en" }), ")")
2971
- )),
2972
- abortedMessage && /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 3 }, AbortedTitle)
2973
- );
2974
- };
2975
- const RolloutAccordion = ({
2976
- rollout,
2977
- ownedPods,
2978
- matchingHpa,
2979
- defaultExpanded
2980
- }) => {
2981
- var _a, _b, _c, _d, _e, _f;
2982
- const podNamesWithErrors = useContext(PodNamesWithErrorsContext);
2983
- const podsWithErrors = ownedPods.filter(
2984
- (p) => {
2985
- var _a2, _b2;
2986
- return podNamesWithErrors.has((_b2 = (_a2 = p.metadata) == null ? void 0 : _a2.name) != null ? _b2 : "");
2987
- }
2988
- );
2989
- const currentStepIndex = (_b = (_a = rollout.status) == null ? void 0 : _a.currentStepIndex) != null ? _b : 0;
2990
- const abortedMessage = findAbortedMessage(rollout);
2991
- return /* @__PURE__ */ React__default.createElement(
2992
- Accordion,
2993
- {
2994
- defaultExpanded,
2995
- TransitionProps: { unmountOnExit: true },
2996
- variant: "outlined"
2997
- },
2998
- /* @__PURE__ */ React__default.createElement(AccordionSummary, { expandIcon: /* @__PURE__ */ React__default.createElement(ExpandMoreIcon, null) }, /* @__PURE__ */ React__default.createElement(
2999
- RolloutSummary,
3000
- {
3001
- rollout,
3002
- numberOfCurrentPods: ownedPods.length,
3003
- numberOfPodsWithErrors: podsWithErrors.length,
3004
- hpa: matchingHpa
3005
- }
3006
- )),
3007
- /* @__PURE__ */ React__default.createElement(AccordionDetails, null, /* @__PURE__ */ React__default.createElement("div", { style: { width: "100%" } }, /* @__PURE__ */ React__default.createElement("div", null, /* @__PURE__ */ React__default.createElement(Typography, { variant: "h6" }, "Rollout status")), /* @__PURE__ */ React__default.createElement("div", { style: { margin: "1rem" } }, abortedMessage && /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, AbortedTitle, /* @__PURE__ */ React__default.createElement(Typography, { variant: "subtitle2" }, abortedMessage)), /* @__PURE__ */ React__default.createElement(
3008
- StepsProgress,
3009
- {
3010
- aborted: abortedMessage !== void 0,
3011
- steps: (_f = (_e = (_d = (_c = rollout.spec) == null ? void 0 : _c.strategy) == null ? void 0 : _d.canary) == null ? void 0 : _e.steps) != null ? _f : [],
3012
- currentStepIndex
3013
- }
3014
- )), /* @__PURE__ */ React__default.createElement("div", null, /* @__PURE__ */ React__default.createElement(
3015
- PodsTable,
3016
- {
3017
- pods: ownedPods,
3018
- extraColumns: [READY_COLUMNS, RESOURCE_COLUMNS]
3019
- }
3020
- ))))
3021
- );
3022
- };
3023
- const RolloutAccordions = ({
3024
- rollouts,
3025
- defaultExpanded = false
3026
- }) => {
3027
- const groupedResponses = useContext(GroupedResponsesContext);
3028
- return /* @__PURE__ */ React__default.createElement(
3029
- Grid,
3030
- {
3031
- container: true,
3032
- direction: "column",
3033
- justifyContent: "flex-start",
3034
- alignItems: "flex-start"
3035
- },
3036
- rollouts.map((rollout, i) => {
3037
- var _a, _b;
3038
- return /* @__PURE__ */ React__default.createElement(Grid, { container: true, item: true, key: i, xs: true }, /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: true }, /* @__PURE__ */ React__default.createElement(
3039
- RolloutAccordion,
3040
- {
3041
- defaultExpanded,
3042
- matchingHpa: getMatchingHpa(
3043
- {
3044
- name: (_a = rollout.metadata) == null ? void 0 : _a.name,
3045
- namespace: (_b = rollout.metadata) == null ? void 0 : _b.namespace,
3046
- kind: "rollout"
3047
- },
3048
- groupedResponses.horizontalPodAutoscalers
3049
- ),
3050
- ownedPods: getOwnedPodsThroughReplicaSets(
3051
- rollout,
3052
- groupedResponses.replicaSets,
3053
- groupedResponses.pods
3054
- ),
3055
- rollout
3056
- }
3057
- )));
3058
- })
3059
- );
3060
- };
3061
-
3062
- const capitalize = (str) => str.charAt(0).toLocaleUpperCase("en-US") + str.slice(1);
3063
- const DefaultCustomResourceDrawer = ({
3064
- customResource,
3065
- customResourceName,
3066
- expanded
3067
- }) => {
3068
- var _a, _b;
3069
- const capitalizedName = capitalize(customResourceName);
3070
- return /* @__PURE__ */ React__default.createElement(
3071
- KubernetesStructuredMetadataTableDrawer,
3072
- {
3073
- object: customResource,
3074
- expanded,
3075
- kind: capitalizedName,
3076
- renderObject: (cr) => cr
3077
- },
3078
- /* @__PURE__ */ React__default.createElement(
3079
- Grid,
3080
- {
3081
- container: true,
3082
- direction: "column",
3083
- justifyContent: "flex-start",
3084
- alignItems: "flex-start",
3085
- spacing: 0
3086
- },
3087
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "body1" }, (_b = (_a = customResource.metadata) == null ? void 0 : _a.name) != null ? _b : "unknown object")),
3088
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(Typography, { color: "textSecondary", variant: "subtitle1" }, capitalizedName))
3089
- )
3090
- );
3091
- };
3092
-
3093
- const DefaultCustomResourceSummary = ({
3094
- customResource,
3095
- customResourceName
3096
- }) => {
3097
- return /* @__PURE__ */ React__default.createElement(
3098
- Grid,
3099
- {
3100
- container: true,
3101
- direction: "row",
3102
- justifyContent: "space-between",
3103
- alignItems: "center",
3104
- spacing: 0
3105
- },
3106
- /* @__PURE__ */ React__default.createElement(Grid, { xs: 12, item: true }, /* @__PURE__ */ React__default.createElement(
3107
- DefaultCustomResourceDrawer,
3108
- {
3109
- customResource,
3110
- customResourceName
3111
- }
3112
- ))
3113
- );
3114
- };
3115
- const DefaultCustomResourceAccordion = ({
3116
- customResource,
3117
- customResourceName,
3118
- defaultExpanded
3119
- }) => {
3120
- return /* @__PURE__ */ React__default.createElement(
3121
- Accordion,
3122
- {
3123
- defaultExpanded,
3124
- TransitionProps: { unmountOnExit: true },
3125
- variant: "outlined"
3126
- },
3127
- /* @__PURE__ */ React__default.createElement(AccordionSummary, { expandIcon: /* @__PURE__ */ React__default.createElement(ExpandMoreIcon, null) }, /* @__PURE__ */ React__default.createElement(
3128
- DefaultCustomResourceSummary,
3129
- {
3130
- customResource,
3131
- customResourceName
3132
- }
3133
- )),
3134
- /* @__PURE__ */ React__default.createElement(AccordionDetails, null, Object.prototype.hasOwnProperty.call(customResource, "status") && /* @__PURE__ */ React__default.createElement(StructuredMetadataTable, { metadata: customResource.status }))
3135
- );
3136
- };
3137
- const DefaultCustomResourceAccordions = ({
3138
- customResources,
3139
- customResourceName,
3140
- defaultExpanded = false
3141
- }) => {
3142
- return /* @__PURE__ */ React__default.createElement(
3143
- Grid,
3144
- {
3145
- container: true,
3146
- direction: "column",
3147
- justifyContent: "flex-start",
3148
- alignItems: "flex-start"
3149
- },
3150
- customResources.map((cr, i) => /* @__PURE__ */ React__default.createElement(Grid, { container: true, item: true, key: i, xs: true }, /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: true }, /* @__PURE__ */ React__default.createElement(
3151
- DefaultCustomResourceAccordion,
3152
- {
3153
- defaultExpanded,
3154
- customResource: cr,
3155
- customResourceName
3156
- }
3157
- ))))
3158
- );
3159
- };
3160
-
3161
- const kindToResource = (customResources) => {
3162
- return lodash.groupBy(customResources, (value) => {
3163
- return value.kind;
3164
- });
3165
- };
3166
- const CustomResources = ({}) => {
3167
- const groupedResponses = useContext(GroupedResponsesContext);
3168
- const kindToResourceMap = kindToResource(groupedResponses.customResources);
3169
- return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, Object.entries(kindToResourceMap).map(([kind, resources], i) => {
3170
- switch (kind) {
3171
- case "Rollout":
3172
- return /* @__PURE__ */ React__default.createElement(RolloutAccordions, { key: i, rollouts: resources });
3173
- default:
3174
- return /* @__PURE__ */ React__default.createElement(
3175
- DefaultCustomResourceAccordions,
3176
- {
3177
- key: i,
3178
- customResources: resources,
3179
- customResourceName: kind
3180
- }
3181
- );
3182
- }
3183
- }));
3184
- };
3185
-
3186
- const DaemonSetDrawer = ({
3187
- daemonset,
3188
- expanded
3189
- }) => {
3190
- var _a, _b, _c;
3191
- const namespace = (_a = daemonset.metadata) == null ? void 0 : _a.namespace;
3192
- return /* @__PURE__ */ React__default.createElement(
3193
- KubernetesStructuredMetadataTableDrawer,
3194
- {
3195
- object: daemonset,
3196
- expanded,
3197
- kind: "DaemonSet",
3198
- renderObject: (daemonsetObj) => {
3199
- var _a2, _b2, _c2, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q;
3200
- return {
3201
- updateStrategyType: (_c2 = (_b2 = (_a2 = daemonsetObj.spec) == null ? void 0 : _a2.updateStrategy) == null ? void 0 : _b2.type) != null ? _c2 : "???",
3202
- minReadySeconds: (_e = (_d = daemonsetObj.spec) == null ? void 0 : _d.minReadySeconds) != null ? _e : "???",
3203
- revisionHistoryLimit: (_g = (_f = daemonsetObj.spec) == null ? void 0 : _f.revisionHistoryLimit) != null ? _g : "???",
3204
- currentNumberScheduled: (_i = (_h = daemonsetObj.status) == null ? void 0 : _h.currentNumberScheduled) != null ? _i : "???",
3205
- desiredNumberScheduled: (_k = (_j = daemonsetObj.status) == null ? void 0 : _j.desiredNumberScheduled) != null ? _k : "???",
3206
- numberAvailable: (_m = (_l = daemonsetObj.status) == null ? void 0 : _l.numberAvailable) != null ? _m : "???",
3207
- numberMisscheduled: (_o = (_n = daemonsetObj.status) == null ? void 0 : _n.numberMisscheduled) != null ? _o : "???",
3208
- numberReady: (_q = (_p = daemonsetObj.status) == null ? void 0 : _p.numberReady) != null ? _q : "???"
3209
- };
3210
- }
3211
- },
3212
- /* @__PURE__ */ React__default.createElement(
3213
- Grid,
3214
- {
3215
- container: true,
3216
- direction: "column",
3217
- justifyContent: "flex-start",
3218
- alignItems: "flex-start",
3219
- spacing: 0
3220
- },
3221
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "body1" }, (_c = (_b = daemonset.metadata) == null ? void 0 : _b.name) != null ? _c : "unknown object")),
3222
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(Typography, { color: "textSecondary", variant: "subtitle1" }, "DaemonSet")),
3223
- namespace && /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(Chip, { size: "small", label: `namespace: ${namespace}` }))
3224
- )
3225
- );
3226
- };
3227
-
3228
- const DaemonSetSummary = ({
3229
- daemonset,
3230
- numberOfCurrentPods,
3231
- numberOfPodsWithErrors
3232
- }) => {
3233
- return /* @__PURE__ */ React__default.createElement(
3234
- Grid,
3235
- {
3236
- container: true,
3237
- direction: "row",
3238
- justifyContent: "space-between",
3239
- alignItems: "center",
3240
- spacing: 0
3241
- },
3242
- /* @__PURE__ */ React__default.createElement(Grid, { xs: 4, item: true }, /* @__PURE__ */ React__default.createElement(DaemonSetDrawer, { daemonset })),
3243
- /* @__PURE__ */ React__default.createElement(
3244
- Grid,
3245
- {
3246
- item: true,
3247
- container: true,
3248
- xs: 4,
3249
- direction: "column",
3250
- justifyContent: "flex-start",
3251
- alignItems: "flex-end",
3252
- spacing: 0
3253
- },
3254
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(StatusOK, null, numberOfCurrentPods, " pods")),
3255
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, numberOfPodsWithErrors > 0 ? /* @__PURE__ */ React__default.createElement(StatusError, null, numberOfPodsWithErrors, " pod", numberOfPodsWithErrors > 1 ? "s" : "", " with errors") : /* @__PURE__ */ React__default.createElement(StatusOK, null, "No pods with errors"))
3256
- )
3257
- );
3258
- };
3259
- const DaemonSetAccordion = ({
3260
- daemonset,
3261
- ownedPods
3262
- }) => {
3263
- const podNamesWithErrors = useContext(PodNamesWithErrorsContext);
3264
- const podsWithErrors = ownedPods.filter(
3265
- (p) => {
3266
- var _a, _b;
3267
- return podNamesWithErrors.has((_b = (_a = p.metadata) == null ? void 0 : _a.name) != null ? _b : "");
3268
- }
3269
- );
3270
- return /* @__PURE__ */ React__default.createElement(Accordion, { TransitionProps: { unmountOnExit: true }, variant: "outlined" }, /* @__PURE__ */ React__default.createElement(AccordionSummary, { expandIcon: /* @__PURE__ */ React__default.createElement(ExpandMoreIcon, null) }, /* @__PURE__ */ React__default.createElement(
3271
- DaemonSetSummary,
3272
- {
3273
- daemonset,
3274
- numberOfCurrentPods: ownedPods.length,
3275
- numberOfPodsWithErrors: podsWithErrors.length
3276
- }
3277
- )), /* @__PURE__ */ React__default.createElement(AccordionDetails, null, /* @__PURE__ */ React__default.createElement(
3278
- PodsTable,
3279
- {
3280
- pods: ownedPods,
3281
- extraColumns: [READY_COLUMNS, RESOURCE_COLUMNS]
3282
- }
3283
- )));
3284
- };
3285
- const DaemonSetsAccordions = ({}) => {
3286
- const groupedResponses = useContext(GroupedResponsesContext);
3287
- return /* @__PURE__ */ React__default.createElement(
3288
- Grid,
3289
- {
3290
- container: true,
3291
- direction: "column",
3292
- justifyContent: "flex-start",
3293
- alignItems: "flex-start"
3294
- },
3295
- groupedResponses.daemonSets.map((daemonset, i) => /* @__PURE__ */ React__default.createElement(Grid, { container: true, item: true, key: i, xs: true }, /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: true }, /* @__PURE__ */ React__default.createElement(
3296
- DaemonSetAccordion,
3297
- {
3298
- ownedPods: getOwnedResources(daemonset, groupedResponses.pods),
3299
- daemonset
3300
- }
3301
- ))))
3302
- );
3303
- };
3304
-
3305
- const ClusterSummary = ({
3306
- clusterName,
3307
- totalNumberOfPods,
3308
- numberOfPodsWithErrors
3309
- }) => {
3310
- return /* @__PURE__ */ React__default.createElement(
3311
- Grid,
3312
- {
3313
- container: true,
3314
- direction: "row",
3315
- justifyContent: "space-between",
3316
- alignItems: "flex-start",
3317
- spacing: 0
3318
- },
3319
- /* @__PURE__ */ React__default.createElement(
3320
- Grid,
3321
- {
3322
- xs: 6,
3323
- item: true,
3324
- container: true,
3325
- direction: "column",
3326
- justifyContent: "flex-start",
3327
- alignItems: "flex-start",
3328
- spacing: 0
3329
- },
3330
- /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: true }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "body1" }, clusterName), /* @__PURE__ */ React__default.createElement(Typography, { color: "textSecondary", variant: "subtitle1" }, "Cluster"))
3331
- ),
3332
- /* @__PURE__ */ React__default.createElement(
3333
- Grid,
3334
- {
3335
- item: true,
3336
- container: true,
3337
- xs: 3,
3338
- direction: "column",
3339
- justifyContent: "flex-start",
3340
- alignItems: "flex-end",
3341
- spacing: 0
3342
- },
3343
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(StatusOK, null, totalNumberOfPods, " pods")),
3344
- /* @__PURE__ */ React__default.createElement(Grid, { item: true }, numberOfPodsWithErrors > 0 ? /* @__PURE__ */ React__default.createElement(StatusError, null, numberOfPodsWithErrors, " pods with errors") : /* @__PURE__ */ React__default.createElement(StatusOK, null, "No pods with errors"))
3345
- )
3346
- );
3347
- };
3348
- const Cluster = ({ clusterObjects, podsWithErrors }) => {
3349
- const groupedResponses = groupResponses(clusterObjects.resources);
3350
- const podMetricsMap = /* @__PURE__ */ new Map();
3351
- podMetricsMap.set(clusterObjects.cluster.name, clusterObjects.podMetrics);
3352
- return /* @__PURE__ */ React__default.createElement(ClusterContext.Provider, { value: clusterObjects.cluster }, /* @__PURE__ */ React__default.createElement(GroupedResponsesContext.Provider, { value: groupedResponses }, /* @__PURE__ */ React__default.createElement(PodMetricsContext.Provider, { value: podMetricsMap }, /* @__PURE__ */ React__default.createElement(PodNamesWithErrorsContext.Provider, { value: podsWithErrors }, /* @__PURE__ */ React__default.createElement(Accordion, { TransitionProps: { unmountOnExit: true } }, /* @__PURE__ */ React__default.createElement(AccordionSummary, { expandIcon: /* @__PURE__ */ React__default.createElement(ExpandMoreIcon, null) }, /* @__PURE__ */ React__default.createElement(
3353
- ClusterSummary,
3354
- {
3355
- clusterName: clusterObjects.cluster.title || clusterObjects.cluster.name,
3356
- totalNumberOfPods: groupedResponses.pods.length,
3357
- numberOfPodsWithErrors: podsWithErrors.size
3358
- }
3359
- )), /* @__PURE__ */ React__default.createElement(AccordionDetails, null, /* @__PURE__ */ React__default.createElement(Grid, { container: true, direction: "column" }, groupedResponses.customResources.length > 0 ? /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(CustomResources, null)) : void 0, groupedResponses.deployments.length > 0 ? /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(DeploymentsAccordions, null)) : void 0, groupedResponses.daemonSets.length > 0 ? /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(DaemonSetsAccordions, null)) : void 0, groupedResponses.statefulsets.length > 0 ? /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(StatefulSetsAccordions, null)) : void 0, groupedResponses.ingresses.length > 0 ? /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(IngressesAccordions, null)) : void 0, groupedResponses.services.length > 0 ? /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(ServicesAccordions, null)) : void 0, groupedResponses.cronJobs.length > 0 ? /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(CronJobsAccordions, null)) : void 0)))))));
3360
- };
3361
-
3362
- const clustersWithErrorsToErrorMessage = (clustersWithErrors) => {
3363
- return clustersWithErrors.map((c, i) => {
3364
- return /* @__PURE__ */ React__default.createElement("div", { key: i }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "body2" }, `Cluster: ${c.cluster.title || c.cluster.name}`), c.errors.map((e, j) => {
3365
- return /* @__PURE__ */ React__default.createElement(Typography, { variant: "body2", key: j }, e.errorType === "FETCH_ERROR" ? `Error communicating with Kubernetes: ${e.errorType}, message: ${e.message}` : `Error fetching Kubernetes resource: '${e.resourcePath}', error: ${e.errorType}, status code: ${e.statusCode}`);
3366
- }), /* @__PURE__ */ React__default.createElement("br", null));
3367
- });
3368
- };
3369
- const ErrorPanel = ({
3370
- entityName,
3371
- errorMessage,
3372
- clustersWithErrors
3373
- }) => /* @__PURE__ */ React__default.createElement(
3374
- WarningPanel,
3375
- {
3376
- title: "There was a problem retrieving Kubernetes objects",
3377
- message: `There was a problem retrieving some Kubernetes resources for the entity: ${entityName}. This could mean that the Error Reporting card is not completely accurate.`
3378
- },
3379
- clustersWithErrors && /* @__PURE__ */ React__default.createElement("div", null, "Errors: ", clustersWithErrorsToErrorMessage(clustersWithErrors)),
3380
- errorMessage && /* @__PURE__ */ React__default.createElement(Typography, { variant: "body2" }, "Errors: ", errorMessage)
3381
- );
3382
-
3383
- const columns = [
3384
- {
3385
- title: "cluster",
3386
- width: "10%",
3387
- render: (row) => row.cluster.title || row.cluster.name
3388
- },
3389
- {
3390
- title: "namespace",
3391
- width: "10%",
3392
- render: (row) => row.error.sourceRef.namespace
3393
- },
3394
- {
3395
- title: "kind",
3396
- width: "10%",
3397
- render: (row) => row.error.sourceRef.kind
3398
- },
3399
- {
3400
- title: "name",
3401
- width: "30%",
3402
- render: (row) => {
3403
- return /* @__PURE__ */ React.createElement(React.Fragment, null, row.error.sourceRef.name, " ");
3404
- }
3405
- },
3406
- {
3407
- title: "messages",
3408
- width: "40%",
3409
- render: (row) => row.error.message
3410
- }
3411
- ];
3412
- const sortBySeverity = (a, b) => {
3413
- if (a.error.severity < b.error.severity) {
3414
- return 1;
3415
- } else if (b.error.severity < a.error.severity) {
3416
- return -1;
3417
- }
3418
- return 0;
3419
- };
3420
- const ErrorReporting = ({
3421
- detectedErrors,
3422
- clusters
3423
- }) => {
3424
- const errors = Array.from(detectedErrors.entries()).flatMap(([clusterName, resourceErrors]) => {
3425
- return resourceErrors.map((e) => ({
3426
- cluster: clusters.find((c) => c.name === clusterName),
3427
- error: e
3428
- }));
3429
- }).sort(sortBySeverity);
3430
- return /* @__PURE__ */ React.createElement(React.Fragment, null, errors.length !== 0 && /* @__PURE__ */ React.createElement(
3431
- Table,
3432
- {
3433
- title: "Error Reporting",
3434
- data: errors,
3435
- columns,
3436
- options: { paging: true, search: false, emptyRowsWhenPaging: false }
3437
- }
3438
- ));
3439
- };
3440
-
3441
- export { AksClusterLinksFormatter, AksKubernetesAuthProvider, Cluster, ClusterContext, ContainerCard, CronJobsAccordions, CustomResources, DEFAULT_FORMATTER_NAME, DetectedErrorsContext, EksClusterLinksFormatter, ErrorList, ErrorPanel, ErrorReporting, Events, EventsContent, FixDialog, GkeClusterLinksFormatter, GoogleKubernetesAuthProvider, GroupedResponsesContext, HorizontalPodAutoscalerDrawer, IngressesAccordions, JobsAccordions, KubernetesAuthProviders, KubernetesBackendClient, KubernetesClusterLinkFormatter, KubernetesDrawer, KubernetesProxyClient, KubernetesStructuredMetadataTableDrawer, LinkErrorPanel, ManifestYaml, OidcKubernetesAuthProvider, OpenshiftClusterLinksFormatter, PendingPodContent, PodDrawer, PodExecTerminal, PodExecTerminalDialog, PodLogs, PodLogsDialog, PodMetricsContext, PodNamesWithErrorsContext, PodNamesWithMetricsContext, PodsTable, READY_COLUMNS, RESOURCE_COLUMNS, RancherClusterLinksFormatter, ResourceUtilization, ServerSideKubernetesAuthProvider, ServicesAccordions, StandardClusterLinksFormatter, getDefaultFormatters, kubernetesApiRef, kubernetesAuthProvidersApiRef, kubernetesClusterLinkFormatterApiRef, kubernetesProxyApiRef, useCustomResources, useEvents, useIsPodExecTerminalEnabled, useIsPodExecTerminalSupported, useKubernetesObjects, useMatchingErrors, usePodLogs, usePodMetrics };
1
+ export { useIsPodExecTerminalEnabled } from './hooks/useIsPodExecTerminalEnabled.esm.js';
2
+ export { useIsPodExecTerminalSupported } from './hooks/useIsPodExecTerminalSupported.esm.js';
3
+ export { useKubernetesObjects } from './hooks/useKubernetesObjects.esm.js';
4
+ export { useCustomResources } from './hooks/useCustomResources.esm.js';
5
+ export { PodNamesWithErrorsContext } from './hooks/PodNamesWithErrors.esm.js';
6
+ export { PodNamesWithMetricsContext } from './hooks/PodNamesWithMetrics.esm.js';
7
+ export { GroupedResponsesContext } from './hooks/GroupedResponses.esm.js';
8
+ export { ClusterContext } from './hooks/Cluster.esm.js';
9
+ export { PodMetricsContext, usePodMetrics } from './hooks/usePodMetrics.esm.js';
10
+ export { DetectedErrorsContext, useMatchingErrors } from './hooks/useMatchingErrors.esm.js';
11
+ export { kubernetesApiRef, kubernetesClusterLinkFormatterApiRef, kubernetesProxyApiRef } from './api/types.esm.js';
12
+ export { KubernetesBackendClient } from './api/KubernetesBackendClient.esm.js';
13
+ export { KubernetesClusterLinkFormatter } from './api/KubernetesClusterLinkFormatter.esm.js';
14
+ export { KubernetesProxyClient } from './api/KubernetesProxyClient.esm.js';
15
+ export { DEFAULT_FORMATTER_NAME, getDefaultFormatters } from './api/formatters/index.esm.js';
16
+ export { kubernetesAuthProvidersApiRef } from './kubernetes-auth-provider/types.esm.js';
17
+ export { KubernetesAuthProviders } from './kubernetes-auth-provider/KubernetesAuthProviders.esm.js';
18
+ export { GoogleKubernetesAuthProvider } from './kubernetes-auth-provider/GoogleKubernetesAuthProvider.esm.js';
19
+ export { ServerSideKubernetesAuthProvider } from './kubernetes-auth-provider/ServerSideAuthProvider.esm.js';
20
+ export { OidcKubernetesAuthProvider } from './kubernetes-auth-provider/OidcKubernetesAuthProvider.esm.js';
21
+ export { AksKubernetesAuthProvider } from './kubernetes-auth-provider/AksKubernetesAuthProvider.esm.js';
22
+ export { Cluster } from './components/Cluster/Cluster.esm.js';
23
+ export { CronJobsAccordions } from './components/CronJobsAccordions/CronJobsAccordions.esm.js';
24
+ export { CustomResources } from './components/CustomResources/CustomResources.esm.js';
25
+ export { ErrorPanel } from './components/ErrorPanel/ErrorPanel.esm.js';
26
+ export { ErrorReporting } from './components/ErrorReporting/ErrorReporting.esm.js';
27
+ export { HorizontalPodAutoscalerDrawer } from './components/HorizontalPodAutoscalers/HorizontalPodAutoscalerDrawer.esm.js';
28
+ export { IngressesAccordions } from './components/IngressesAccordions/IngressesAccordions.esm.js';
29
+ export { JobsAccordions } from './components/JobsAccordions/JobsAccordions.esm.js';
30
+ export { KubernetesStructuredMetadataTableDrawer, LinkErrorPanel } from './components/KubernetesDrawer/KubernetesStructuredMetadataTableDrawer.esm.js';
31
+ export { KubernetesDrawer } from './components/KubernetesDrawer/KubernetesDrawer.esm.js';
32
+ export { ManifestYaml } from './components/KubernetesDrawer/ManifestYaml.esm.js';
33
+ export { PodDrawer } from './components/Pods/PodDrawer/PodDrawer.esm.js';
34
+ export { ContainerCard } from './components/Pods/PodDrawer/ContainerCard.esm.js';
35
+ export { PendingPodContent } from './components/Pods/PodDrawer/PendingPodContent.esm.js';
36
+ export { PodLogs } from './components/Pods/PodLogs/PodLogs.esm.js';
37
+ export { PodLogsDialog } from './components/Pods/PodLogs/PodLogsDialog.esm.js';
38
+ export { usePodLogs } from './components/Pods/PodLogs/usePodLogs.esm.js';
39
+ export { FixDialog } from './components/Pods/FixDialog/FixDialog.esm.js';
40
+ export { Events, EventsContent } from './components/Pods/Events/Events.esm.js';
41
+ export { useEvents } from './components/Pods/Events/useEvents.esm.js';
42
+ export { ErrorList } from './components/Pods/ErrorList/ErrorList.esm.js';
43
+ export { PodsTable, READY_COLUMNS, RESOURCE_COLUMNS } from './components/Pods/PodsTable.esm.js';
44
+ export { ServicesAccordions } from './components/ServicesAccordions/ServicesAccordions.esm.js';
45
+ export { ResourceUtilization } from './components/ResourceUtilization/ResourceUtilization.esm.js';
46
+ export { PodExecTerminal } from './components/PodExecTerminal/PodExecTerminal.esm.js';
47
+ export { PodExecTerminalDialog } from './components/PodExecTerminal/PodExecTerminalDialog.esm.js';
48
+ export { StandardClusterLinksFormatter } from './api/formatters/StandardClusterLinksFormatter.esm.js';
49
+ export { AksClusterLinksFormatter } from './api/formatters/AksClusterLinksFormatter.esm.js';
50
+ export { EksClusterLinksFormatter } from './api/formatters/EksClusterLinksFormatter.esm.js';
51
+ export { GkeClusterLinksFormatter } from './api/formatters/GkeClusterLinksFormatter.esm.js';
52
+ export { OpenshiftClusterLinksFormatter } from './api/formatters/OpenshiftClusterLinksFormatter.esm.js';
53
+ export { RancherClusterLinksFormatter } from './api/formatters/RancherClusterLinksFormatter.esm.js';
3442
54
  //# sourceMappingURL=index.esm.js.map