@backstage/plugin-kubernetes-react 0.3.5-next.1 → 0.3.6-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.
- package/CHANGELOG.md +22 -0
- package/dist/api/KubernetesBackendClient.esm.js +5 -12
- package/dist/api/KubernetesBackendClient.esm.js.map +1 -1
- package/dist/api/KubernetesClusterLinkFormatter.esm.js +3 -10
- package/dist/api/KubernetesClusterLinkFormatter.esm.js.map +1 -1
- package/dist/api/KubernetesProxyClient.esm.js +1 -7
- package/dist/api/KubernetesProxyClient.esm.js.map +1 -1
- package/dist/api/formatters/GkeClusterLinksFormatter.esm.js +3 -4
- package/dist/api/formatters/GkeClusterLinksFormatter.esm.js.map +1 -1
- package/dist/api/formatters/OpenshiftClusterLinksFormatter.esm.js +2 -3
- package/dist/api/formatters/OpenshiftClusterLinksFormatter.esm.js.map +1 -1
- package/dist/api/formatters/RancherClusterLinksFormatter.esm.js +2 -3
- package/dist/api/formatters/RancherClusterLinksFormatter.esm.js.map +1 -1
- package/dist/api/formatters/StandardClusterLinksFormatter.esm.js +2 -3
- package/dist/api/formatters/StandardClusterLinksFormatter.esm.js.map +1 -1
- package/dist/components/CronJobsAccordions/CronJobsAccordions.esm.js +2 -3
- package/dist/components/CronJobsAccordions/CronJobsAccordions.esm.js.map +1 -1
- package/dist/components/CronJobsAccordions/CronJobsDrawer.esm.js +8 -12
- package/dist/components/CronJobsAccordions/CronJobsDrawer.esm.js.map +1 -1
- package/dist/components/CustomResources/ArgoRollouts/Rollout.esm.js +31 -42
- package/dist/components/CustomResources/ArgoRollouts/Rollout.esm.js.map +1 -1
- package/dist/components/CustomResources/ArgoRollouts/RolloutDrawer.esm.js +1 -2
- package/dist/components/CustomResources/ArgoRollouts/RolloutDrawer.esm.js.map +1 -1
- package/dist/components/CustomResources/DefaultCustomResourceDrawer.esm.js +1 -2
- package/dist/components/CustomResources/DefaultCustomResourceDrawer.esm.js.map +1 -1
- package/dist/components/DaemonSetsAccordions/DaemonSetsAccordions.esm.js +1 -4
- package/dist/components/DaemonSetsAccordions/DaemonSetsAccordions.esm.js.map +1 -1
- package/dist/components/DaemonSetsAccordions/DaemonSetsDrawer.esm.js +10 -12
- package/dist/components/DaemonSetsAccordions/DaemonSetsDrawer.esm.js.map +1 -1
- package/dist/components/DeploymentsAccordions/DeploymentDrawer.esm.js +6 -8
- package/dist/components/DeploymentsAccordions/DeploymentDrawer.esm.js.map +1 -1
- package/dist/components/DeploymentsAccordions/DeploymentsAccordions.esm.js +23 -30
- package/dist/components/DeploymentsAccordions/DeploymentsAccordions.esm.js.map +1 -1
- package/dist/components/HorizontalPodAutoscalers/HorizontalPodAutoscalerDrawer.esm.js +6 -7
- package/dist/components/HorizontalPodAutoscalers/HorizontalPodAutoscalerDrawer.esm.js.map +1 -1
- package/dist/components/IngressesAccordions/IngressDrawer.esm.js +2 -3
- package/dist/components/IngressesAccordions/IngressDrawer.esm.js.map +1 -1
- package/dist/components/JobsAccordions/JobsAccordions.esm.js +3 -4
- package/dist/components/JobsAccordions/JobsAccordions.esm.js.map +1 -1
- package/dist/components/JobsAccordions/JobsDrawer.esm.js +5 -7
- package/dist/components/JobsAccordions/JobsDrawer.esm.js.map +1 -1
- package/dist/components/KubernetesDrawer/KubernetesDrawer.esm.js +2 -3
- package/dist/components/KubernetesDrawer/KubernetesDrawer.esm.js.map +1 -1
- package/dist/components/KubernetesDrawer/KubernetesStructuredMetadataTableDrawer.esm.js +2 -4
- package/dist/components/KubernetesDrawer/KubernetesStructuredMetadataTableDrawer.esm.js.map +1 -1
- package/dist/components/PodExecTerminal/PodExecTerminal.esm.js +4 -4
- package/dist/components/PodExecTerminal/PodExecTerminal.esm.js.map +1 -1
- package/dist/components/PodExecTerminal/PodExecTerminalAttachAddon.esm.js +2 -17
- package/dist/components/PodExecTerminal/PodExecTerminalAttachAddon.esm.js.map +1 -1
- package/dist/components/Pods/ErrorList/ErrorList.esm.js +2 -3
- package/dist/components/Pods/ErrorList/ErrorList.esm.js.map +1 -1
- package/dist/components/Pods/Events/Events.esm.js +1 -2
- package/dist/components/Pods/Events/Events.esm.js.map +1 -1
- package/dist/components/Pods/FixDialog/FixDialog.esm.js +7 -10
- package/dist/components/Pods/FixDialog/FixDialog.esm.js.map +1 -1
- package/dist/components/Pods/PodDrawer/ContainerCard.esm.js +7 -11
- package/dist/components/Pods/PodDrawer/ContainerCard.esm.js.map +1 -1
- package/dist/components/Pods/PodDrawer/PendingPodContent.esm.js +4 -5
- package/dist/components/Pods/PodDrawer/PendingPodContent.esm.js.map +1 -1
- package/dist/components/Pods/PodDrawer/PodDrawer.esm.js +8 -11
- package/dist/components/Pods/PodDrawer/PodDrawer.esm.js.map +1 -1
- package/dist/components/Pods/PodsTable.esm.js +5 -11
- package/dist/components/Pods/PodsTable.esm.js.map +1 -1
- package/dist/components/ServicesAccordions/ServiceDrawer.esm.js +2 -3
- package/dist/components/ServicesAccordions/ServiceDrawer.esm.js.map +1 -1
- package/dist/components/ServicesAccordions/ServicesAccordions.esm.js +7 -9
- package/dist/components/ServicesAccordions/ServicesAccordions.esm.js.map +1 -1
- package/dist/components/StatefulSetsAccordions/StatefulSetDrawer.esm.js +8 -10
- package/dist/components/StatefulSetsAccordions/StatefulSetDrawer.esm.js.map +1 -1
- package/dist/components/StatefulSetsAccordions/StatefulSetsAccordions.esm.js +19 -26
- package/dist/components/StatefulSetsAccordions/StatefulSetsAccordions.esm.js.map +1 -1
- package/dist/hooks/auth.esm.js +1 -2
- package/dist/hooks/auth.esm.js.map +1 -1
- package/dist/hooks/useCustomResources.esm.js +1 -1
- package/dist/hooks/useCustomResources.esm.js.map +1 -1
- package/dist/hooks/useKubernetesObjects.esm.js +1 -1
- package/dist/hooks/useKubernetesObjects.esm.js.map +1 -1
- package/dist/hooks/useMatchingErrors.esm.js +2 -3
- package/dist/hooks/useMatchingErrors.esm.js.map +1 -1
- package/dist/hooks/usePodMetrics.esm.js +4 -6
- package/dist/hooks/usePodMetrics.esm.js.map +1 -1
- package/dist/kubernetes-auth-provider/GoogleKubernetesAuthProvider.esm.js +1 -7
- package/dist/kubernetes-auth-provider/GoogleKubernetesAuthProvider.esm.js.map +1 -1
- package/dist/kubernetes-auth-provider/KubernetesAuthProviders.esm.js +1 -7
- package/dist/kubernetes-auth-provider/KubernetesAuthProviders.esm.js.map +1 -1
- package/dist/kubernetes-auth-provider/OidcKubernetesAuthProvider.esm.js +2 -8
- package/dist/kubernetes-auth-provider/OidcKubernetesAuthProvider.esm.js.map +1 -1
- package/dist/utils/owner.esm.js +4 -11
- package/dist/utils/owner.esm.js.map +1 -1
- package/dist/utils/pod.esm.js +12 -19
- package/dist/utils/pod.esm.js.map +1 -1
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ErrorList.esm.js","sources":["../../../../src/components/Pods/ErrorList/ErrorList.tsx"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport List from '@material-ui/core/List';\nimport ListItem from '@material-ui/core/ListItem';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport Divider from '@material-ui/core/Divider';\nimport Paper from '@material-ui/core/Paper';\nimport Grid from '@material-ui/core/Grid';\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\nimport { PodAndErrors } from '../types';\nimport { FixDialog } from '../FixDialog/FixDialog';\n\nconst useStyles = makeStyles((_theme: Theme) =>\n createStyles({\n root: {\n overflow: 'auto',\n },\n list: {\n width: '100%',\n },\n }),\n);\n\n/**\n * Props for ErrorList\n *\n * @public\n */\nexport interface ErrorListProps {\n podAndErrors: PodAndErrors[];\n}\n\n/**\n * Shows a list of errors found on a Pod\n *\n * @public\n */\nexport const ErrorList = ({ podAndErrors }: ErrorListProps) => {\n const classes = useStyles();\n return (\n <Paper className={classes.root}>\n <List className={classes.list}>\n {podAndErrors\n .filter(pae => pae.errors.length > 0)\n .flatMap(onlyPodWithErrors => {\n return onlyPodWithErrors.errors.map((error, i) => {\n return (\n <React.Fragment\n key={`${\n onlyPodWithErrors.pod.metadata?.name ?? 'unknown'\n }-eli-${i}`}\n >\n {i > 0 && <Divider key={`error-divider${i}`} />}\n <ListItem>\n <Grid container>\n <Grid item xs={9}>\n <ListItemText\n primary={error.message}\n secondary={onlyPodWithErrors.pod.metadata?.name}\n />\n </Grid>\n <Grid item xs={3}>\n <FixDialog\n pod={onlyPodWithErrors.pod}\n error={error}\n clusterName={onlyPodWithErrors.cluster.name}\n />\n </Grid>\n </Grid>\n </ListItem>\n </React.Fragment>\n );\n });\n })}\n </List>\n </Paper>\n );\n};\n"],"names":["React"],"mappings":";;;;;;;;;;AA2BA,MAAM,SAAY,GAAA,UAAA;AAAA,EAAW,CAAC,WAC5B,YAAa,CAAA;AAAA,IACX,IAAM,EAAA;AAAA,MACJ,QAAU,EAAA,MAAA;AAAA,KACZ;AAAA,IACA,IAAM,EAAA;AAAA,MACJ,KAAO,EAAA,MAAA;AAAA,KACT;AAAA,GACD,CAAA;AACH,CAAA,CAAA;AAgBO,MAAM,SAAY,GAAA,CAAC,EAAE,YAAA,EAAmC,KAAA;AAC7D,EAAA,MAAM,UAAU,SAAU,EAAA,CAAA;AAC1B,EAAA,oDACG,KAAM,EAAA,EAAA,SAAA,EAAW,QAAQ,IACxB,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,QAAK,SAAW,EAAA,OAAA,CAAQ,QACtB,YACE,CAAA,MAAA,CAAO,SAAO,GAAI,CAAA,MAAA,CAAO,SAAS,CAAC,CAAA,CACnC,QAAQ,CAAqB,iBAAA,KAAA;AAC5B,IAAA,OAAO,iBAAkB,CAAA,MAAA,CAAO,GAAI,CAAA,CAAC,OAAO,CAAM,KAAA;
|
|
1
|
+
{"version":3,"file":"ErrorList.esm.js","sources":["../../../../src/components/Pods/ErrorList/ErrorList.tsx"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport List from '@material-ui/core/List';\nimport ListItem from '@material-ui/core/ListItem';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport Divider from '@material-ui/core/Divider';\nimport Paper from '@material-ui/core/Paper';\nimport Grid from '@material-ui/core/Grid';\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\nimport { PodAndErrors } from '../types';\nimport { FixDialog } from '../FixDialog/FixDialog';\n\nconst useStyles = makeStyles((_theme: Theme) =>\n createStyles({\n root: {\n overflow: 'auto',\n },\n list: {\n width: '100%',\n },\n }),\n);\n\n/**\n * Props for ErrorList\n *\n * @public\n */\nexport interface ErrorListProps {\n podAndErrors: PodAndErrors[];\n}\n\n/**\n * Shows a list of errors found on a Pod\n *\n * @public\n */\nexport const ErrorList = ({ podAndErrors }: ErrorListProps) => {\n const classes = useStyles();\n return (\n <Paper className={classes.root}>\n <List className={classes.list}>\n {podAndErrors\n .filter(pae => pae.errors.length > 0)\n .flatMap(onlyPodWithErrors => {\n return onlyPodWithErrors.errors.map((error, i) => {\n return (\n <React.Fragment\n key={`${\n onlyPodWithErrors.pod.metadata?.name ?? 'unknown'\n }-eli-${i}`}\n >\n {i > 0 && <Divider key={`error-divider${i}`} />}\n <ListItem>\n <Grid container>\n <Grid item xs={9}>\n <ListItemText\n primary={error.message}\n secondary={onlyPodWithErrors.pod.metadata?.name}\n />\n </Grid>\n <Grid item xs={3}>\n <FixDialog\n pod={onlyPodWithErrors.pod}\n error={error}\n clusterName={onlyPodWithErrors.cluster.name}\n />\n </Grid>\n </Grid>\n </ListItem>\n </React.Fragment>\n );\n });\n })}\n </List>\n </Paper>\n );\n};\n"],"names":["React"],"mappings":";;;;;;;;;;AA2BA,MAAM,SAAY,GAAA,UAAA;AAAA,EAAW,CAAC,WAC5B,YAAa,CAAA;AAAA,IACX,IAAM,EAAA;AAAA,MACJ,QAAU,EAAA,MAAA;AAAA,KACZ;AAAA,IACA,IAAM,EAAA;AAAA,MACJ,KAAO,EAAA,MAAA;AAAA,KACT;AAAA,GACD,CAAA;AACH,CAAA,CAAA;AAgBO,MAAM,SAAY,GAAA,CAAC,EAAE,YAAA,EAAmC,KAAA;AAC7D,EAAA,MAAM,UAAU,SAAU,EAAA,CAAA;AAC1B,EAAA,oDACG,KAAM,EAAA,EAAA,SAAA,EAAW,QAAQ,IACxB,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,QAAK,SAAW,EAAA,OAAA,CAAQ,QACtB,YACE,CAAA,MAAA,CAAO,SAAO,GAAI,CAAA,MAAA,CAAO,SAAS,CAAC,CAAA,CACnC,QAAQ,CAAqB,iBAAA,KAAA;AAC5B,IAAA,OAAO,iBAAkB,CAAA,MAAA,CAAO,GAAI,CAAA,CAAC,OAAO,CAAM,KAAA;AAChD,MACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,QAACA,cAAM,CAAA,QAAA;AAAA,QAAN;AAAA,UACC,GAAA,EAAK,GACH,iBAAkB,CAAA,GAAA,CAAI,UAAU,IAAQ,IAAA,SAC1C,QAAQ,CAAC,CAAA,CAAA;AAAA,SAAA;AAAA,QAER,IAAI,CAAK,oBAAAA,cAAA,CAAA,aAAA,CAAC,WAAQ,GAAK,EAAA,CAAA,aAAA,EAAgB,CAAC,CAAI,CAAA,EAAA,CAAA;AAAA,wBAC7CA,cAAA,CAAA,aAAA,CAAC,QACC,EAAA,IAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,SAAA,EAAS,IACb,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,CACb,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,UAAC,YAAA;AAAA,UAAA;AAAA,YACC,SAAS,KAAM,CAAA,OAAA;AAAA,YACf,SAAA,EAAW,iBAAkB,CAAA,GAAA,CAAI,QAAU,EAAA,IAAA;AAAA,WAAA;AAAA,SAE/C,CACA,kBAAAA,cAAA,CAAA,aAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAC,IAAI,CACb,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,KAAK,iBAAkB,CAAA,GAAA;AAAA,YACvB,KAAA;AAAA,YACA,WAAA,EAAa,kBAAkB,OAAQ,CAAA,IAAA;AAAA,WAAA;AAAA,SAE3C,CACF,CACF,CAAA;AAAA,OACF,CAAA;AAAA,KAEH,CAAA,CAAA;AAAA,GACF,CACL,CACF,CAAA,CAAA;AAEJ;;;;"}
|
|
@@ -31,13 +31,12 @@ const EventsContent = ({
|
|
|
31
31
|
}
|
|
32
32
|
return true;
|
|
33
33
|
}).map((event) => {
|
|
34
|
-
var _a;
|
|
35
34
|
const timeAgo = event.metadata.creationTimestamp ? DateTime.fromISO(event.metadata.creationTimestamp).toRelative(
|
|
36
35
|
{
|
|
37
36
|
locale: "en"
|
|
38
37
|
}
|
|
39
38
|
) : "unknown";
|
|
40
|
-
return /* @__PURE__ */ React__default.createElement(ListItem, { key: event.metadata.name }, /* @__PURE__ */ React__default.createElement(Tooltip, { title: `${
|
|
39
|
+
return /* @__PURE__ */ React__default.createElement(ListItem, { key: event.metadata.name }, /* @__PURE__ */ React__default.createElement(Tooltip, { title: `${event.type ?? ""} event` }, getAvatarByType(event.type)), /* @__PURE__ */ React__default.createElement(
|
|
41
40
|
ListItemText,
|
|
42
41
|
{
|
|
43
42
|
primary: `First event ${timeAgo} (count: ${event.count})`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Events.esm.js","sources":["../../../../src/components/Pods/Events/Events.tsx"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport Avatar from '@material-ui/core/Avatar';\nimport Container from '@material-ui/core/Container';\nimport Grid from '@material-ui/core/Grid';\nimport List from '@material-ui/core/List';\nimport ListItem from '@material-ui/core/ListItem';\nimport ListItemAvatar from '@material-ui/core/ListItemAvatar';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport Typography from '@material-ui/core/Typography';\n\nimport InfoIcon from '@material-ui/icons/Info';\nimport WarningIcon from '@material-ui/icons/Warning';\nimport { DateTime } from 'luxon';\n\nimport { useEvents } from './useEvents';\nimport Skeleton from '@material-ui/lab/Skeleton';\nimport { DismissableBanner } from '@backstage/core-components';\nimport { Event } from 'kubernetes-models/v1';\n\n/**\n * Props for Events\n *\n * @public\n */\nexport interface EventsContentProps {\n warningEventsOnly?: boolean;\n events: Event[];\n}\n\nconst getAvatarByType = (type?: string) => {\n return (\n <ListItemAvatar>\n <Avatar>{type === 'Warning' ? <WarningIcon /> : <InfoIcon />}</Avatar>\n </ListItemAvatar>\n );\n};\n\n/**\n * Shows given Kubernetes events\n *\n * @public\n */\nexport const EventsContent = ({\n events,\n warningEventsOnly,\n}: EventsContentProps) => {\n if (events.length === 0) {\n return <Typography>No events found</Typography>;\n }\n\n return (\n <Container>\n <Grid>\n <List>\n {events\n .filter(event => {\n if (warningEventsOnly) {\n return event.type === 'Warning';\n }\n return true;\n })\n .map(event => {\n const timeAgo = event.metadata.creationTimestamp\n ? DateTime.fromISO(event.metadata.creationTimestamp).toRelative(\n {\n locale: 'en',\n },\n )\n : 'unknown';\n return (\n <ListItem key={event.metadata.name}>\n <Tooltip title={`${event.type ?? ''} event`}>\n {getAvatarByType(event.type)}\n </Tooltip>\n <ListItemText\n primary={`First event ${timeAgo} (count: ${event.count})`}\n secondary={`${event.reason}: ${event.message}`}\n />\n </ListItem>\n );\n })}\n </List>\n </Grid>\n </Container>\n );\n};\n\n/**\n * Props for Events\n *\n * @public\n */\nexport interface EventsProps {\n involvedObjectName: string;\n namespace: string;\n clusterName: string;\n warningEventsOnly?: boolean;\n}\n\n/**\n * Retrieves and shows Kubernetes events for the given object\n *\n * @public\n */\nexport const Events = ({\n involvedObjectName,\n namespace,\n clusterName,\n warningEventsOnly,\n}: EventsProps) => {\n const { value, error, loading } = useEvents({\n involvedObjectName,\n namespace,\n clusterName,\n });\n\n return (\n <>\n {error && (\n <DismissableBanner\n {...{\n message: error.message,\n variant: 'error',\n fixed: false,\n }}\n id=\"events\"\n />\n )}\n {loading && <Skeleton variant=\"rect\" width=\"100%\" height=\"100%\" />}\n {!loading && value !== undefined && (\n <EventsContent warningEventsOnly={warningEventsOnly} events={value} />\n )}\n </>\n );\n};\n"],"names":["React"],"mappings":";;;;;;;;;;;;;;;;;AA8CA,MAAM,eAAA,GAAkB,CAAC,IAAkB,KAAA;AACzC,EAAA,uBACGA,cAAA,CAAA,aAAA,CAAA,cAAA,EAAA,IAAA,kBACEA,cAAA,CAAA,aAAA,CAAA,MAAA,EAAA,IAAA,EAAQ,IAAS,KAAA,SAAA,mBAAaA,cAAA,CAAA,aAAA,CAAA,WAAA,EAAA,IAAY,CAAK,mBAAAA,cAAA,CAAA,aAAA,CAAC,QAAS,EAAA,IAAA,CAAG,CAC/D,CAAA,CAAA;AAEJ,CAAA,CAAA;AAOO,MAAM,gBAAgB,CAAC;AAAA,EAC5B,MAAA;AAAA,EACA,iBAAA;AACF,CAA0B,KAAA;AACxB,EAAI,IAAA,MAAA,CAAO,WAAW,CAAG,EAAA;AACvB,IAAO,uBAAAA,cAAA,CAAA,aAAA,CAAC,kBAAW,iBAAe,CAAA,CAAA;AAAA,GACpC;AAEA,EACE,uBAAAA,cAAA,CAAA,aAAA,CAAC,iCACEA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,+CACE,IACE,EAAA,IAAA,EAAA,MAAA,CACE,OAAO,CAAS,KAAA,KAAA;AACf,IAAA,IAAI,iBAAmB,EAAA;AACrB,MAAA,OAAO,MAAM,IAAS,KAAA,SAAA,CAAA;AAAA,KACxB;AACA,IAAO,OAAA,IAAA,CAAA;AAAA,GACR,CACA,CAAA,GAAA,CAAI,CAAS,KAAA,KAAA;
|
|
1
|
+
{"version":3,"file":"Events.esm.js","sources":["../../../../src/components/Pods/Events/Events.tsx"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport Avatar from '@material-ui/core/Avatar';\nimport Container from '@material-ui/core/Container';\nimport Grid from '@material-ui/core/Grid';\nimport List from '@material-ui/core/List';\nimport ListItem from '@material-ui/core/ListItem';\nimport ListItemAvatar from '@material-ui/core/ListItemAvatar';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport Typography from '@material-ui/core/Typography';\n\nimport InfoIcon from '@material-ui/icons/Info';\nimport WarningIcon from '@material-ui/icons/Warning';\nimport { DateTime } from 'luxon';\n\nimport { useEvents } from './useEvents';\nimport Skeleton from '@material-ui/lab/Skeleton';\nimport { DismissableBanner } from '@backstage/core-components';\nimport { Event } from 'kubernetes-models/v1';\n\n/**\n * Props for Events\n *\n * @public\n */\nexport interface EventsContentProps {\n warningEventsOnly?: boolean;\n events: Event[];\n}\n\nconst getAvatarByType = (type?: string) => {\n return (\n <ListItemAvatar>\n <Avatar>{type === 'Warning' ? <WarningIcon /> : <InfoIcon />}</Avatar>\n </ListItemAvatar>\n );\n};\n\n/**\n * Shows given Kubernetes events\n *\n * @public\n */\nexport const EventsContent = ({\n events,\n warningEventsOnly,\n}: EventsContentProps) => {\n if (events.length === 0) {\n return <Typography>No events found</Typography>;\n }\n\n return (\n <Container>\n <Grid>\n <List>\n {events\n .filter(event => {\n if (warningEventsOnly) {\n return event.type === 'Warning';\n }\n return true;\n })\n .map(event => {\n const timeAgo = event.metadata.creationTimestamp\n ? DateTime.fromISO(event.metadata.creationTimestamp).toRelative(\n {\n locale: 'en',\n },\n )\n : 'unknown';\n return (\n <ListItem key={event.metadata.name}>\n <Tooltip title={`${event.type ?? ''} event`}>\n {getAvatarByType(event.type)}\n </Tooltip>\n <ListItemText\n primary={`First event ${timeAgo} (count: ${event.count})`}\n secondary={`${event.reason}: ${event.message}`}\n />\n </ListItem>\n );\n })}\n </List>\n </Grid>\n </Container>\n );\n};\n\n/**\n * Props for Events\n *\n * @public\n */\nexport interface EventsProps {\n involvedObjectName: string;\n namespace: string;\n clusterName: string;\n warningEventsOnly?: boolean;\n}\n\n/**\n * Retrieves and shows Kubernetes events for the given object\n *\n * @public\n */\nexport const Events = ({\n involvedObjectName,\n namespace,\n clusterName,\n warningEventsOnly,\n}: EventsProps) => {\n const { value, error, loading } = useEvents({\n involvedObjectName,\n namespace,\n clusterName,\n });\n\n return (\n <>\n {error && (\n <DismissableBanner\n {...{\n message: error.message,\n variant: 'error',\n fixed: false,\n }}\n id=\"events\"\n />\n )}\n {loading && <Skeleton variant=\"rect\" width=\"100%\" height=\"100%\" />}\n {!loading && value !== undefined && (\n <EventsContent warningEventsOnly={warningEventsOnly} events={value} />\n )}\n </>\n );\n};\n"],"names":["React"],"mappings":"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"}
|
|
@@ -36,7 +36,6 @@ const FixDialog = ({
|
|
|
36
36
|
error,
|
|
37
37
|
clusterName
|
|
38
38
|
}) => {
|
|
39
|
-
var _a;
|
|
40
39
|
const [isOpen, setOpen] = useState(!!open);
|
|
41
40
|
const classes = useStyles();
|
|
42
41
|
const openDialog = () => {
|
|
@@ -47,17 +46,15 @@ const FixDialog = ({
|
|
|
47
46
|
};
|
|
48
47
|
const pf = error.proposedFix;
|
|
49
48
|
const dialogContent = () => {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
var _a3, _b2;
|
|
53
|
-
return /* @__PURE__ */ React__default.createElement("li", { key: `${(_b2 = (_a3 = pod.metadata) == null ? void 0 : _a3.name) != null ? _b2 : "unknown"}-pf-${i}` }, fix);
|
|
49
|
+
return /* @__PURE__ */ React__default.createElement(Grid, { container: true }, /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "h6" }, "Detected error:"), /* @__PURE__ */ React__default.createElement(Typography, null, error.message)), /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "h6" }, "Cause explanation:"), /* @__PURE__ */ React__default.createElement(Typography, null, error.proposedFix?.rootCauseExplanation ?? "unknown")), /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "h6" }, "Fix:"), /* @__PURE__ */ React__default.createElement(Typography, null, /* @__PURE__ */ React__default.createElement("ul", null, (error.proposedFix?.actions ?? []).map((fix, i) => {
|
|
50
|
+
return /* @__PURE__ */ React__default.createElement("li", { key: `${pod.metadata?.name ?? "unknown"}-pf-${i}` }, fix);
|
|
54
51
|
})))), 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, { variant: "h6" }, "Crash logs:")), /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 9 }, /* @__PURE__ */ React__default.createElement(
|
|
55
52
|
PodLogs,
|
|
56
53
|
{
|
|
57
54
|
previous: true,
|
|
58
55
|
containerScope: {
|
|
59
|
-
podName:
|
|
60
|
-
podNamespace:
|
|
56
|
+
podName: pod.metadata?.name ?? "unknown",
|
|
57
|
+
podNamespace: pod.metadata?.namespace ?? "unknown",
|
|
61
58
|
cluster: { name: clusterName },
|
|
62
59
|
containerName: pf.container
|
|
63
60
|
}
|
|
@@ -66,8 +63,8 @@ const FixDialog = ({
|
|
|
66
63
|
Events,
|
|
67
64
|
{
|
|
68
65
|
warningEventsOnly: true,
|
|
69
|
-
involvedObjectName:
|
|
70
|
-
namespace:
|
|
66
|
+
involvedObjectName: pod.metadata?.name ?? "",
|
|
67
|
+
namespace: pod.metadata?.namespace ?? "",
|
|
71
68
|
clusterName
|
|
72
69
|
}
|
|
73
70
|
))));
|
|
@@ -82,7 +79,7 @@ const FixDialog = ({
|
|
|
82
79
|
startIcon: /* @__PURE__ */ React__default.createElement(HelpIcon, null)
|
|
83
80
|
},
|
|
84
81
|
"Help"
|
|
85
|
-
), /* @__PURE__ */ React__default.createElement(Dialog, { maxWidth: "xl", fullWidth: true, open: isOpen, onClose: closeDialog }, /* @__PURE__ */ React__default.createElement(DialogTitle, { id: "dialog-title" },
|
|
82
|
+
), /* @__PURE__ */ React__default.createElement(Dialog, { maxWidth: "xl", fullWidth: true, open: isOpen, onClose: closeDialog }, /* @__PURE__ */ React__default.createElement(DialogTitle, { id: "dialog-title" }, pod.metadata?.name, " - ", error.type, /* @__PURE__ */ React__default.createElement(
|
|
86
83
|
IconButton,
|
|
87
84
|
{
|
|
88
85
|
"aria-label": "close",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FixDialog.esm.js","sources":["../../../../src/components/Pods/FixDialog/FixDialog.tsx"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React, { useState } from 'react';\n\nimport Button from '@material-ui/core/Button';\nimport Grid from '@material-ui/core/Grid';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport IconButton from '@material-ui/core/IconButton';\nimport { makeStyles, createStyles, Theme } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport CloseIcon from '@material-ui/icons/Close';\nimport HelpIcon from '@material-ui/icons/Help';\nimport OpenInNewIcon from '@material-ui/icons/OpenInNew';\n\nimport { Pod } from 'kubernetes-models/v1/Pod';\nimport { DetectedError } from '@backstage/plugin-kubernetes-common';\nimport { PodLogs } from '../PodLogs';\nimport { Events } from '../Events';\nimport { LinkButton } from '@backstage/core-components';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n closeButton: {\n position: 'absolute',\n right: theme.spacing(1),\n top: theme.spacing(1),\n color: theme.palette.grey[500],\n },\n }),\n);\n\n/**\n * Props for FixDialog\n *\n * @public\n */\nexport interface FixDialogProps {\n open?: boolean;\n clusterName: string;\n pod: Pod;\n error: DetectedError;\n}\n\n/**\n * A dialog for fixing detected Kubernetes errors\n *\n * @public\n */\nexport const FixDialog: React.FC<FixDialogProps> = ({\n open,\n pod,\n error,\n clusterName,\n}: FixDialogProps) => {\n const [isOpen, setOpen] = useState(!!open);\n const classes = useStyles();\n\n const openDialog = () => {\n setOpen(true);\n };\n\n const closeDialog = () => {\n setOpen(false);\n };\n\n const pf = error.proposedFix;\n\n const dialogContent = () => {\n return (\n <Grid container>\n <Grid item xs={12}>\n <Typography variant=\"h6\">Detected error:</Typography>\n <Typography>{error.message}</Typography>\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"h6\">Cause explanation:</Typography>\n <Typography>\n {error.proposedFix?.rootCauseExplanation ?? 'unknown'}\n </Typography>\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"h6\">Fix:</Typography>\n <Typography>\n <ul>\n {(error.proposedFix?.actions ?? []).map((fix, i) => {\n return (\n <li key={`${pod.metadata?.name ?? 'unknown'}-pf-${i}`}>\n {fix}\n </li>\n );\n })}\n </ul>\n </Typography>\n </Grid>\n\n {pf && pf.type === 'logs' && (\n <>\n <Grid item xs={12}>\n <Typography variant=\"h6\">Crash logs:</Typography>\n </Grid>\n <Grid item xs={9}>\n <PodLogs\n previous\n containerScope={{\n podName: pod.metadata?.name ?? 'unknown',\n podNamespace: pod.metadata?.namespace ?? 'unknown',\n cluster: { name: clusterName },\n containerName: pf.container,\n }}\n />\n </Grid>\n </>\n )}\n {pf && pf.type === 'events' && (\n <>\n <Grid item xs={12}>\n <Typography variant=\"h6\">Events:</Typography>\n </Grid>\n <Grid item xs={9}>\n <Events\n warningEventsOnly\n involvedObjectName={pod.metadata?.name ?? ''}\n namespace={pod.metadata?.namespace ?? ''}\n clusterName={clusterName}\n />\n </Grid>\n </>\n )}\n </Grid>\n );\n };\n\n return (\n <>\n <Button\n variant=\"outlined\"\n aria-label=\"fix issue\"\n component=\"label\"\n onClick={openDialog}\n startIcon={<HelpIcon />}\n >\n Help\n </Button>\n <Dialog maxWidth=\"xl\" fullWidth open={isOpen} onClose={closeDialog}>\n <DialogTitle id=\"dialog-title\">\n {pod.metadata?.name} - {error.type}\n <IconButton\n aria-label=\"close\"\n className={classes.closeButton}\n onClick={closeDialog}\n >\n <CloseIcon />\n </IconButton>\n </DialogTitle>\n <DialogContent>{dialogContent()}</DialogContent>\n <DialogActions>\n {pf && pf.type === 'docs' && (\n <LinkButton\n to={pf.docsLink}\n variant=\"outlined\"\n startIcon={<OpenInNewIcon />}\n target=\"_blank\"\n rel=\"noopener\"\n >\n Open docs\n </LinkButton>\n )}\n </DialogActions>\n </Dialog>\n </>\n );\n};\n"],"names":["_a","React","_b"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FixDialog.esm.js","sources":["../../../../src/components/Pods/FixDialog/FixDialog.tsx"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React, { useState } from 'react';\n\nimport Button from '@material-ui/core/Button';\nimport Grid from '@material-ui/core/Grid';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport IconButton from '@material-ui/core/IconButton';\nimport { makeStyles, createStyles, Theme } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport CloseIcon from '@material-ui/icons/Close';\nimport HelpIcon from '@material-ui/icons/Help';\nimport OpenInNewIcon from '@material-ui/icons/OpenInNew';\n\nimport { Pod } from 'kubernetes-models/v1/Pod';\nimport { DetectedError } from '@backstage/plugin-kubernetes-common';\nimport { PodLogs } from '../PodLogs';\nimport { Events } from '../Events';\nimport { LinkButton } from '@backstage/core-components';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n closeButton: {\n position: 'absolute',\n right: theme.spacing(1),\n top: theme.spacing(1),\n color: theme.palette.grey[500],\n },\n }),\n);\n\n/**\n * Props for FixDialog\n *\n * @public\n */\nexport interface FixDialogProps {\n open?: boolean;\n clusterName: string;\n pod: Pod;\n error: DetectedError;\n}\n\n/**\n * A dialog for fixing detected Kubernetes errors\n *\n * @public\n */\nexport const FixDialog: React.FC<FixDialogProps> = ({\n open,\n pod,\n error,\n clusterName,\n}: FixDialogProps) => {\n const [isOpen, setOpen] = useState(!!open);\n const classes = useStyles();\n\n const openDialog = () => {\n setOpen(true);\n };\n\n const closeDialog = () => {\n setOpen(false);\n };\n\n const pf = error.proposedFix;\n\n const dialogContent = () => {\n return (\n <Grid container>\n <Grid item xs={12}>\n <Typography variant=\"h6\">Detected error:</Typography>\n <Typography>{error.message}</Typography>\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"h6\">Cause explanation:</Typography>\n <Typography>\n {error.proposedFix?.rootCauseExplanation ?? 'unknown'}\n </Typography>\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"h6\">Fix:</Typography>\n <Typography>\n <ul>\n {(error.proposedFix?.actions ?? []).map((fix, i) => {\n return (\n <li key={`${pod.metadata?.name ?? 'unknown'}-pf-${i}`}>\n {fix}\n </li>\n );\n })}\n </ul>\n </Typography>\n </Grid>\n\n {pf && pf.type === 'logs' && (\n <>\n <Grid item xs={12}>\n <Typography variant=\"h6\">Crash logs:</Typography>\n </Grid>\n <Grid item xs={9}>\n <PodLogs\n previous\n containerScope={{\n podName: pod.metadata?.name ?? 'unknown',\n podNamespace: pod.metadata?.namespace ?? 'unknown',\n cluster: { name: clusterName },\n containerName: pf.container,\n }}\n />\n </Grid>\n </>\n )}\n {pf && pf.type === 'events' && (\n <>\n <Grid item xs={12}>\n <Typography variant=\"h6\">Events:</Typography>\n </Grid>\n <Grid item xs={9}>\n <Events\n warningEventsOnly\n involvedObjectName={pod.metadata?.name ?? ''}\n namespace={pod.metadata?.namespace ?? ''}\n clusterName={clusterName}\n />\n </Grid>\n </>\n )}\n </Grid>\n );\n };\n\n return (\n <>\n <Button\n variant=\"outlined\"\n aria-label=\"fix issue\"\n component=\"label\"\n onClick={openDialog}\n startIcon={<HelpIcon />}\n >\n Help\n </Button>\n <Dialog maxWidth=\"xl\" fullWidth open={isOpen} onClose={closeDialog}>\n <DialogTitle id=\"dialog-title\">\n {pod.metadata?.name} - {error.type}\n <IconButton\n aria-label=\"close\"\n className={classes.closeButton}\n onClick={closeDialog}\n >\n <CloseIcon />\n </IconButton>\n </DialogTitle>\n <DialogContent>{dialogContent()}</DialogContent>\n <DialogActions>\n {pf && pf.type === 'docs' && (\n <LinkButton\n to={pf.docsLink}\n variant=\"outlined\"\n startIcon={<OpenInNewIcon />}\n target=\"_blank\"\n rel=\"noopener\"\n >\n Open docs\n </LinkButton>\n )}\n </DialogActions>\n </Dialog>\n </>\n );\n};\n"],"names":["React"],"mappings":"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"}
|
|
@@ -28,28 +28,25 @@ import '@material-ui/lab/Skeleton';
|
|
|
28
28
|
import { PodLogsDialog } from '../PodLogs/PodLogsDialog.esm.js';
|
|
29
29
|
|
|
30
30
|
const getContainerHealthChecks = (containerSpec, containerStatus) => {
|
|
31
|
-
|
|
32
|
-
if (((_b = (_a = containerStatus.state) == null ? void 0 : _a.terminated) == null ? void 0 : _b.reason) === "Completed") {
|
|
31
|
+
if (containerStatus.state?.terminated?.reason === "Completed") {
|
|
33
32
|
return {
|
|
34
|
-
"not waiting to start":
|
|
33
|
+
"not waiting to start": containerStatus.state?.waiting === void 0,
|
|
35
34
|
"no restarts": containerStatus.restartCount === 0
|
|
36
35
|
};
|
|
37
36
|
}
|
|
38
37
|
return {
|
|
39
|
-
"not waiting to start":
|
|
38
|
+
"not waiting to start": containerStatus.state?.waiting === void 0,
|
|
40
39
|
started: !!containerStatus.started,
|
|
41
40
|
ready: containerStatus.ready,
|
|
42
41
|
"no restarts": containerStatus.restartCount === 0,
|
|
43
|
-
"readiness probe set": containerSpec &&
|
|
42
|
+
"readiness probe set": containerSpec && containerSpec?.readinessProbe !== void 0
|
|
44
43
|
};
|
|
45
44
|
};
|
|
46
45
|
const getCurrentState = (containerStatus) => {
|
|
47
|
-
|
|
48
|
-
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");
|
|
46
|
+
return containerStatus.state?.waiting?.reason || containerStatus.state?.terminated?.reason || (containerStatus.state?.running !== void 0 ? "Running" : "Unknown");
|
|
49
47
|
};
|
|
50
48
|
const getStartedAtTime = (containerStatus) => {
|
|
51
|
-
|
|
52
|
-
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);
|
|
49
|
+
return containerStatus.state?.running?.startedAt || containerStatus.state?.terminated?.startedAt;
|
|
53
50
|
};
|
|
54
51
|
const ContainerDatetime = ({ prefix, dateTime }) => {
|
|
55
52
|
return /* @__PURE__ */ React__default.createElement(Typography, { variant: "subtitle2" }, prefix, ":", " ", DateTime.fromISO(dateTime).toRelative({
|
|
@@ -62,13 +59,12 @@ const ContainerCard = ({
|
|
|
62
59
|
containerStatus,
|
|
63
60
|
containerMetrics
|
|
64
61
|
}) => {
|
|
65
|
-
var _a, _b;
|
|
66
62
|
const isPodExecTerminalEnabled = useIsPodExecTerminalEnabled();
|
|
67
63
|
if (containerSpec === void 0) {
|
|
68
64
|
return /* @__PURE__ */ React__default.createElement(Typography, null, "error reading pod from cluster");
|
|
69
65
|
}
|
|
70
66
|
const containerStartedTime = getStartedAtTime(containerStatus);
|
|
71
|
-
const containerFinishedTime =
|
|
67
|
+
const containerFinishedTime = containerStatus.state?.terminated?.finishedAt;
|
|
72
68
|
return /* @__PURE__ */ React__default.createElement(Card, null, /* @__PURE__ */ React__default.createElement(
|
|
73
69
|
CardHeader,
|
|
74
70
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContainerCard.esm.js","sources":["../../../../src/components/Pods/PodDrawer/ContainerCard.tsx"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { StructuredMetadataTable } from '@backstage/core-components';\nimport { ClientContainerStatus } from '@backstage/plugin-kubernetes-common';\nimport Card from '@material-ui/core/Card';\nimport CardActions from '@material-ui/core/CardActions';\nimport CardContent from '@material-ui/core/CardContent';\nimport CardHeader from '@material-ui/core/CardHeader';\nimport Grid from '@material-ui/core/Grid';\nimport Typography from '@material-ui/core/Typography';\nimport { IContainer, IContainerStatus } from 'kubernetes-models/v1';\nimport { DateTime } from 'luxon';\nimport React from 'react';\n\nimport { useIsPodExecTerminalEnabled } from '../../../hooks';\nimport { bytesToMiB, formatMillicores } from '../../../utils/resources';\nimport { PodExecTerminalDialog } from '../../PodExecTerminal/PodExecTerminalDialog';\nimport { ResourceUtilization } from '../../ResourceUtilization';\nimport { PodLogsDialog, PodScope } from '../PodLogs';\n\nconst getContainerHealthChecks = (\n containerSpec: IContainer,\n containerStatus: IContainerStatus,\n): { [key: string]: boolean } => {\n if (containerStatus.state?.terminated?.reason === 'Completed') {\n return {\n 'not waiting to start': containerStatus.state?.waiting === undefined,\n 'no restarts': containerStatus.restartCount === 0,\n };\n }\n return {\n 'not waiting to start': containerStatus.state?.waiting === undefined,\n started: !!containerStatus.started,\n ready: containerStatus.ready,\n 'no restarts': containerStatus.restartCount === 0,\n 'readiness probe set':\n containerSpec && containerSpec?.readinessProbe !== undefined,\n };\n};\n\nconst getCurrentState = (containerStatus: IContainerStatus): string => {\n return (\n containerStatus.state?.waiting?.reason ||\n containerStatus.state?.terminated?.reason ||\n (containerStatus.state?.running !== undefined ? 'Running' : 'Unknown')\n );\n};\n\nconst getStartedAtTime = (\n containerStatus: IContainerStatus,\n): string | undefined => {\n return (\n containerStatus.state?.running?.startedAt ||\n containerStatus.state?.terminated?.startedAt\n );\n};\n\ninterface ContainerDatetimeProps {\n prefix: string;\n dateTime: string;\n}\n\nconst ContainerDatetime = ({ prefix, dateTime }: ContainerDatetimeProps) => {\n return (\n <Typography variant=\"subtitle2\">\n {prefix}:{' '}\n {DateTime.fromISO(dateTime).toRelative({\n locale: 'en',\n })}\n </Typography>\n );\n};\n\n/**\n * Props for ContainerCard\n *\n * @public\n */\nexport interface ContainerCardProps {\n podScope: PodScope;\n containerSpec?: IContainer;\n containerStatus: IContainerStatus;\n containerMetrics?: ClientContainerStatus;\n}\n\n/**\n * Shows details about a container within a pod\n *\n * @public\n */\nexport const ContainerCard: React.FC<ContainerCardProps> = ({\n podScope,\n containerSpec,\n containerStatus,\n containerMetrics,\n}: ContainerCardProps) => {\n const isPodExecTerminalEnabled = useIsPodExecTerminalEnabled();\n\n // This should never be undefined\n if (containerSpec === undefined) {\n return <Typography>error reading pod from cluster</Typography>;\n }\n const containerStartedTime = getStartedAtTime(containerStatus);\n const containerFinishedTime = containerStatus.state?.terminated?.finishedAt;\n\n return (\n <Card>\n <CardHeader\n title={containerStatus.name}\n subheader={containerStatus.image}\n />\n <CardContent>\n <Grid container>\n <Grid item xs={12}>\n {containerStartedTime && (\n <ContainerDatetime\n prefix=\"Started\"\n dateTime={containerStartedTime}\n />\n )}\n {containerFinishedTime && (\n <ContainerDatetime\n prefix=\"Completed\"\n dateTime={containerFinishedTime}\n />\n )}\n {containerStartedTime && containerFinishedTime && (\n <Typography variant=\"subtitle2\">\n Execution time:{' '}\n {DateTime.fromISO(containerFinishedTime)\n .diff(DateTime.fromISO(containerStartedTime), [\n 'hours',\n 'minutes',\n 'seconds',\n ])\n .toHuman()}\n </Typography>\n )}\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"subtitle2\">\n Status: {getCurrentState(containerStatus)}\n </Typography>\n </Grid>\n {containerStatus.restartCount > 0 && (\n <Grid item xs={12}>\n <Typography variant=\"subtitle2\">\n Restarts: {containerStatus.restartCount}\n </Typography>\n </Grid>\n )}\n <Grid item xs={12}>\n <Typography variant=\"subtitle2\">Container health</Typography>\n </Grid>\n <Grid item xs={12}>\n <StructuredMetadataTable\n metadata={getContainerHealthChecks(\n containerSpec,\n containerStatus,\n )}\n />\n </Grid>\n {containerMetrics && (\n <Grid container item xs={12} spacing={0}>\n <Grid item xs={12}>\n <Typography variant=\"subtitle1\">\n Resource utilization\n </Typography>\n </Grid>\n <Grid item xs={12} style={{ minHeight: '5rem' }}>\n <ResourceUtilization\n compressed\n title=\"CPU requests\"\n usage={containerMetrics.cpuUsage.currentUsage}\n total={containerMetrics.cpuUsage.requestTotal}\n totalFormatted={formatMillicores(\n containerMetrics.cpuUsage.requestTotal,\n )}\n />\n <ResourceUtilization\n compressed\n title=\"CPU limits\"\n usage={containerMetrics.cpuUsage.currentUsage}\n total={containerMetrics.cpuUsage.limitTotal}\n totalFormatted={formatMillicores(\n containerMetrics.cpuUsage.limitTotal,\n )}\n />\n <ResourceUtilization\n compressed\n title=\"Memory requests\"\n usage={containerMetrics.memoryUsage.currentUsage}\n total={containerMetrics.memoryUsage.requestTotal}\n totalFormatted={bytesToMiB(\n containerMetrics.memoryUsage.requestTotal,\n )}\n />\n <ResourceUtilization\n compressed\n title=\"Memory limits\"\n usage={containerMetrics.memoryUsage.currentUsage}\n total={containerMetrics.memoryUsage.limitTotal}\n totalFormatted={bytesToMiB(\n containerMetrics.memoryUsage.limitTotal,\n )}\n />\n </Grid>\n </Grid>\n )}\n </Grid>\n </CardContent>\n <CardActions>\n <PodLogsDialog\n containerScope={{\n containerName: containerStatus.name,\n ...podScope,\n }}\n />\n {isPodExecTerminalEnabled && (\n <PodExecTerminalDialog\n cluster={podScope.cluster}\n containerName={containerStatus.name}\n podName={podScope.podName}\n podNamespace={podScope.podNamespace}\n />\n )}\n </CardActions>\n </Card>\n );\n};\n"],"names":["React"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ContainerCard.esm.js","sources":["../../../../src/components/Pods/PodDrawer/ContainerCard.tsx"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { StructuredMetadataTable } from '@backstage/core-components';\nimport { ClientContainerStatus } from '@backstage/plugin-kubernetes-common';\nimport Card from '@material-ui/core/Card';\nimport CardActions from '@material-ui/core/CardActions';\nimport CardContent from '@material-ui/core/CardContent';\nimport CardHeader from '@material-ui/core/CardHeader';\nimport Grid from '@material-ui/core/Grid';\nimport Typography from '@material-ui/core/Typography';\nimport { IContainer, IContainerStatus } from 'kubernetes-models/v1';\nimport { DateTime } from 'luxon';\nimport React from 'react';\n\nimport { useIsPodExecTerminalEnabled } from '../../../hooks';\nimport { bytesToMiB, formatMillicores } from '../../../utils/resources';\nimport { PodExecTerminalDialog } from '../../PodExecTerminal/PodExecTerminalDialog';\nimport { ResourceUtilization } from '../../ResourceUtilization';\nimport { PodLogsDialog, PodScope } from '../PodLogs';\n\nconst getContainerHealthChecks = (\n containerSpec: IContainer,\n containerStatus: IContainerStatus,\n): { [key: string]: boolean } => {\n if (containerStatus.state?.terminated?.reason === 'Completed') {\n return {\n 'not waiting to start': containerStatus.state?.waiting === undefined,\n 'no restarts': containerStatus.restartCount === 0,\n };\n }\n return {\n 'not waiting to start': containerStatus.state?.waiting === undefined,\n started: !!containerStatus.started,\n ready: containerStatus.ready,\n 'no restarts': containerStatus.restartCount === 0,\n 'readiness probe set':\n containerSpec && containerSpec?.readinessProbe !== undefined,\n };\n};\n\nconst getCurrentState = (containerStatus: IContainerStatus): string => {\n return (\n containerStatus.state?.waiting?.reason ||\n containerStatus.state?.terminated?.reason ||\n (containerStatus.state?.running !== undefined ? 'Running' : 'Unknown')\n );\n};\n\nconst getStartedAtTime = (\n containerStatus: IContainerStatus,\n): string | undefined => {\n return (\n containerStatus.state?.running?.startedAt ||\n containerStatus.state?.terminated?.startedAt\n );\n};\n\ninterface ContainerDatetimeProps {\n prefix: string;\n dateTime: string;\n}\n\nconst ContainerDatetime = ({ prefix, dateTime }: ContainerDatetimeProps) => {\n return (\n <Typography variant=\"subtitle2\">\n {prefix}:{' '}\n {DateTime.fromISO(dateTime).toRelative({\n locale: 'en',\n })}\n </Typography>\n );\n};\n\n/**\n * Props for ContainerCard\n *\n * @public\n */\nexport interface ContainerCardProps {\n podScope: PodScope;\n containerSpec?: IContainer;\n containerStatus: IContainerStatus;\n containerMetrics?: ClientContainerStatus;\n}\n\n/**\n * Shows details about a container within a pod\n *\n * @public\n */\nexport const ContainerCard: React.FC<ContainerCardProps> = ({\n podScope,\n containerSpec,\n containerStatus,\n containerMetrics,\n}: ContainerCardProps) => {\n const isPodExecTerminalEnabled = useIsPodExecTerminalEnabled();\n\n // This should never be undefined\n if (containerSpec === undefined) {\n return <Typography>error reading pod from cluster</Typography>;\n }\n const containerStartedTime = getStartedAtTime(containerStatus);\n const containerFinishedTime = containerStatus.state?.terminated?.finishedAt;\n\n return (\n <Card>\n <CardHeader\n title={containerStatus.name}\n subheader={containerStatus.image}\n />\n <CardContent>\n <Grid container>\n <Grid item xs={12}>\n {containerStartedTime && (\n <ContainerDatetime\n prefix=\"Started\"\n dateTime={containerStartedTime}\n />\n )}\n {containerFinishedTime && (\n <ContainerDatetime\n prefix=\"Completed\"\n dateTime={containerFinishedTime}\n />\n )}\n {containerStartedTime && containerFinishedTime && (\n <Typography variant=\"subtitle2\">\n Execution time:{' '}\n {DateTime.fromISO(containerFinishedTime)\n .diff(DateTime.fromISO(containerStartedTime), [\n 'hours',\n 'minutes',\n 'seconds',\n ])\n .toHuman()}\n </Typography>\n )}\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"subtitle2\">\n Status: {getCurrentState(containerStatus)}\n </Typography>\n </Grid>\n {containerStatus.restartCount > 0 && (\n <Grid item xs={12}>\n <Typography variant=\"subtitle2\">\n Restarts: {containerStatus.restartCount}\n </Typography>\n </Grid>\n )}\n <Grid item xs={12}>\n <Typography variant=\"subtitle2\">Container health</Typography>\n </Grid>\n <Grid item xs={12}>\n <StructuredMetadataTable\n metadata={getContainerHealthChecks(\n containerSpec,\n containerStatus,\n )}\n />\n </Grid>\n {containerMetrics && (\n <Grid container item xs={12} spacing={0}>\n <Grid item xs={12}>\n <Typography variant=\"subtitle1\">\n Resource utilization\n </Typography>\n </Grid>\n <Grid item xs={12} style={{ minHeight: '5rem' }}>\n <ResourceUtilization\n compressed\n title=\"CPU requests\"\n usage={containerMetrics.cpuUsage.currentUsage}\n total={containerMetrics.cpuUsage.requestTotal}\n totalFormatted={formatMillicores(\n containerMetrics.cpuUsage.requestTotal,\n )}\n />\n <ResourceUtilization\n compressed\n title=\"CPU limits\"\n usage={containerMetrics.cpuUsage.currentUsage}\n total={containerMetrics.cpuUsage.limitTotal}\n totalFormatted={formatMillicores(\n containerMetrics.cpuUsage.limitTotal,\n )}\n />\n <ResourceUtilization\n compressed\n title=\"Memory requests\"\n usage={containerMetrics.memoryUsage.currentUsage}\n total={containerMetrics.memoryUsage.requestTotal}\n totalFormatted={bytesToMiB(\n containerMetrics.memoryUsage.requestTotal,\n )}\n />\n <ResourceUtilization\n compressed\n title=\"Memory limits\"\n usage={containerMetrics.memoryUsage.currentUsage}\n total={containerMetrics.memoryUsage.limitTotal}\n totalFormatted={bytesToMiB(\n containerMetrics.memoryUsage.limitTotal,\n )}\n />\n </Grid>\n </Grid>\n )}\n </Grid>\n </CardContent>\n <CardActions>\n <PodLogsDialog\n containerScope={{\n containerName: containerStatus.name,\n ...podScope,\n }}\n />\n {isPodExecTerminalEnabled && (\n <PodExecTerminalDialog\n cluster={podScope.cluster}\n containerName={containerStatus.name}\n podName={podScope.podName}\n podNamespace={podScope.podNamespace}\n />\n )}\n </CardActions>\n </Card>\n );\n};\n"],"names":["React"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCA,MAAM,wBAAA,GAA2B,CAC/B,aAAA,EACA,eAC+B,KAAA;AAC/B,EAAA,IAAI,eAAgB,CAAA,KAAA,EAAO,UAAY,EAAA,MAAA,KAAW,WAAa,EAAA;AAC7D,IAAO,OAAA;AAAA,MACL,sBAAA,EAAwB,eAAgB,CAAA,KAAA,EAAO,OAAY,KAAA,KAAA,CAAA;AAAA,MAC3D,aAAA,EAAe,gBAAgB,YAAiB,KAAA,CAAA;AAAA,KAClD,CAAA;AAAA,GACF;AACA,EAAO,OAAA;AAAA,IACL,sBAAA,EAAwB,eAAgB,CAAA,KAAA,EAAO,OAAY,KAAA,KAAA,CAAA;AAAA,IAC3D,OAAA,EAAS,CAAC,CAAC,eAAgB,CAAA,OAAA;AAAA,IAC3B,OAAO,eAAgB,CAAA,KAAA;AAAA,IACvB,aAAA,EAAe,gBAAgB,YAAiB,KAAA,CAAA;AAAA,IAChD,qBAAA,EACE,aAAiB,IAAA,aAAA,EAAe,cAAmB,KAAA,KAAA,CAAA;AAAA,GACvD,CAAA;AACF,CAAA,CAAA;AAEA,MAAM,eAAA,GAAkB,CAAC,eAA8C,KAAA;AACrE,EAAA,OACE,eAAgB,CAAA,KAAA,EAAO,OAAS,EAAA,MAAA,IAChC,eAAgB,CAAA,KAAA,EAAO,UAAY,EAAA,MAAA,KAClC,eAAgB,CAAA,KAAA,EAAO,OAAY,KAAA,KAAA,CAAA,GAAY,SAAY,GAAA,SAAA,CAAA,CAAA;AAEhE,CAAA,CAAA;AAEA,MAAM,gBAAA,GAAmB,CACvB,eACuB,KAAA;AACvB,EAAA,OACE,gBAAgB,KAAO,EAAA,OAAA,EAAS,SAChC,IAAA,eAAA,CAAgB,OAAO,UAAY,EAAA,SAAA,CAAA;AAEvC,CAAA,CAAA;AAOA,MAAM,iBAAoB,GAAA,CAAC,EAAE,MAAA,EAAQ,UAAuC,KAAA;AAC1E,EACE,uBAAAA,cAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,OAAA,EAAQ,WACjB,EAAA,EAAA,MAAA,EAAO,GAAE,EAAA,GAAA,EACT,QAAS,CAAA,OAAA,CAAQ,QAAQ,CAAA,CAAE,UAAW,CAAA;AAAA,IACrC,MAAQ,EAAA,IAAA;AAAA,GACT,CACH,CAAA,CAAA;AAEJ,CAAA,CAAA;AAmBO,MAAM,gBAA8C,CAAC;AAAA,EAC1D,QAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EACA,gBAAA;AACF,CAA0B,KAAA;AACxB,EAAA,MAAM,2BAA2B,2BAA4B,EAAA,CAAA;AAG7D,EAAA,IAAI,kBAAkB,KAAW,CAAA,EAAA;AAC/B,IAAO,uBAAAA,cAAA,CAAA,aAAA,CAAC,kBAAW,gCAA8B,CAAA,CAAA;AAAA,GACnD;AACA,EAAM,MAAA,oBAAA,GAAuB,iBAAiB,eAAe,CAAA,CAAA;AAC7D,EAAM,MAAA,qBAAA,GAAwB,eAAgB,CAAA,KAAA,EAAO,UAAY,EAAA,UAAA,CAAA;AAEjE,EAAA,oDACG,IACC,EAAA,IAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,OAAO,eAAgB,CAAA,IAAA;AAAA,MACvB,WAAW,eAAgB,CAAA,KAAA;AAAA,KAAA;AAAA,GAE7B,kBAAAA,cAAA,CAAA,aAAA,CAAC,WACC,EAAA,IAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,SAAA,EAAS,IACb,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,MACZ,oBACC,oBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MACC,MAAO,EAAA,SAAA;AAAA,MACP,QAAU,EAAA,oBAAA;AAAA,KAAA;AAAA,KAGb,qBACC,oBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MACC,MAAO,EAAA,WAAA;AAAA,MACP,QAAU,EAAA,qBAAA;AAAA,KAAA;AAAA,KAGb,oBAAwB,IAAA,qBAAA,oBACtBA,cAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,SAAQ,WAAY,EAAA,EAAA,iBAAA,EACd,GACf,EAAA,QAAA,CAAS,QAAQ,qBAAqB,CAAA,CACpC,KAAK,QAAS,CAAA,OAAA,CAAQ,oBAAoB,CAAG,EAAA;AAAA,IAC5C,OAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,GACD,CACA,CAAA,OAAA,EACL,CAEJ,CACA,kBAAAA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,EACb,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,OAAA,EAAQ,WAAY,EAAA,EAAA,UAAA,EACrB,eAAgB,CAAA,eAAe,CAC1C,CACF,CACC,EAAA,eAAA,CAAgB,YAAe,GAAA,CAAA,oBAC7BA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,IAAI,EACb,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,OAAA,EAAQ,WAAY,EAAA,EAAA,YAAA,EACnB,eAAgB,CAAA,YAC7B,CACF,CAAA,kBAEDA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,EAAI,EAAA,EAAA,EAAA,kBACZA,cAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,WAAA,EAAA,EAAY,kBAAgB,CAClD,CACA,kBAAAA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,EACb,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,uBAAA;AAAA,IAAA;AAAA,MACC,QAAU,EAAA,wBAAA;AAAA,QACR,aAAA;AAAA,QACA,eAAA;AAAA,OACF;AAAA,KAAA;AAAA,GAEJ,CACC,EAAA,gBAAA,oBACEA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,WAAS,IAAC,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,IAAI,OAAS,EAAA,CAAA,EAAA,kBACnCA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,MAAI,IAAC,EAAA,EAAA,EAAI,EACb,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,cAAW,OAAQ,EAAA,WAAA,EAAA,EAAY,sBAEhC,CACF,mBACCA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,IAAI,EAAI,EAAA,KAAA,EAAO,EAAE,SAAA,EAAW,QACrC,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,mBAAA;AAAA,IAAA;AAAA,MACC,UAAU,EAAA,IAAA;AAAA,MACV,KAAM,EAAA,cAAA;AAAA,MACN,KAAA,EAAO,iBAAiB,QAAS,CAAA,YAAA;AAAA,MACjC,KAAA,EAAO,iBAAiB,QAAS,CAAA,YAAA;AAAA,MACjC,cAAgB,EAAA,gBAAA;AAAA,QACd,iBAAiB,QAAS,CAAA,YAAA;AAAA,OAC5B;AAAA,KAAA;AAAA,GAEF,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,mBAAA;AAAA,IAAA;AAAA,MACC,UAAU,EAAA,IAAA;AAAA,MACV,KAAM,EAAA,YAAA;AAAA,MACN,KAAA,EAAO,iBAAiB,QAAS,CAAA,YAAA;AAAA,MACjC,KAAA,EAAO,iBAAiB,QAAS,CAAA,UAAA;AAAA,MACjC,cAAgB,EAAA,gBAAA;AAAA,QACd,iBAAiB,QAAS,CAAA,UAAA;AAAA,OAC5B;AAAA,KAAA;AAAA,GAEF,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,mBAAA;AAAA,IAAA;AAAA,MACC,UAAU,EAAA,IAAA;AAAA,MACV,KAAM,EAAA,iBAAA;AAAA,MACN,KAAA,EAAO,iBAAiB,WAAY,CAAA,YAAA;AAAA,MACpC,KAAA,EAAO,iBAAiB,WAAY,CAAA,YAAA;AAAA,MACpC,cAAgB,EAAA,UAAA;AAAA,QACd,iBAAiB,WAAY,CAAA,YAAA;AAAA,OAC/B;AAAA,KAAA;AAAA,GAEF,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,mBAAA;AAAA,IAAA;AAAA,MACC,UAAU,EAAA,IAAA;AAAA,MACV,KAAM,EAAA,eAAA;AAAA,MACN,KAAA,EAAO,iBAAiB,WAAY,CAAA,YAAA;AAAA,MACpC,KAAA,EAAO,iBAAiB,WAAY,CAAA,UAAA;AAAA,MACpC,cAAgB,EAAA,UAAA;AAAA,QACd,iBAAiB,WAAY,CAAA,UAAA;AAAA,OAC/B;AAAA,KAAA;AAAA,GAEJ,CACF,CAEJ,CACF,CAAA,+CACC,WACC,EAAA,IAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,cAAgB,EAAA;AAAA,QACd,eAAe,eAAgB,CAAA,IAAA;AAAA,QAC/B,GAAG,QAAA;AAAA,OACL;AAAA,KAAA;AAAA,KAED,wBACC,oBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,qBAAA;AAAA,IAAA;AAAA,MACC,SAAS,QAAS,CAAA,OAAA;AAAA,MAClB,eAAe,eAAgB,CAAA,IAAA;AAAA,MAC/B,SAAS,QAAS,CAAA,OAAA;AAAA,MAClB,cAAc,QAAS,CAAA,YAAA;AAAA,KAAA;AAAA,GAG7B,CACF,CAAA,CAAA;AAEJ;;;;"}
|
|
@@ -16,12 +16,11 @@ const PodCondition = ({ condition }) => {
|
|
|
16
16
|
}), ") ", condition.message));
|
|
17
17
|
};
|
|
18
18
|
const PendingPodContent = ({ pod }) => {
|
|
19
|
-
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
20
19
|
const startupConditions = [
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
pod.status?.conditions?.find((c) => c.type === "PodScheduled"),
|
|
21
|
+
pod.status?.conditions?.find((c) => c.type === "Initialized"),
|
|
22
|
+
pod.status?.conditions?.find((c) => c.type === "ContainersReady"),
|
|
23
|
+
pod.status?.conditions?.find((c) => c.type === "Ready")
|
|
25
24
|
].filter((c) => !!c);
|
|
26
25
|
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 }))))));
|
|
27
26
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PendingPodContent.esm.js","sources":["../../../../src/components/Pods/PodDrawer/PendingPodContent.tsx"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport Grid from '@material-ui/core/Grid';\nimport List from '@material-ui/core/List';\nimport ListItem from '@material-ui/core/ListItem';\nimport Typography from '@material-ui/core/Typography';\nimport { IPodCondition, Pod } from 'kubernetes-models/v1';\nimport {\n StatusError,\n StatusOK,\n StatusWarning,\n} from '@backstage/core-components';\nimport { DateTime } from 'luxon';\n\ninterface PodConditionProps {\n condition: IPodCondition;\n}\n\nconst PodCondition = ({ condition }: PodConditionProps) => {\n return (\n <>\n {condition.status === 'False' && (\n <StatusError>\n {condition.type} - ({condition.reason}{' '}\n {condition.lastTransitionTime &&\n DateTime.fromISO(condition.lastTransitionTime).toRelative({\n locale: 'en',\n })}\n ) - {condition.message}{' '}\n </StatusError>\n )}\n {condition.status === 'True' && (\n <StatusOK>\n {condition.type} - (\n {condition.lastTransitionTime &&\n DateTime.fromISO(condition.lastTransitionTime).toRelative({\n locale: 'en',\n })}\n )\n </StatusOK>\n )}\n {condition.status === 'Unknown' && (\n <StatusWarning>\n {condition.type} - (\n {condition.lastTransitionTime &&\n DateTime.fromISO(condition.lastTransitionTime).toRelative({\n locale: 'en',\n })}\n ) {condition.message}\n </StatusWarning>\n )}\n </>\n );\n};\n\n/**\n * Props for PendingPodContent\n *\n * @public\n */\nexport interface PendingPodContentProps {\n pod: Pod;\n}\n\n/**\n * Shows details about pod's conditions as it starts\n *\n * @public\n */\nexport const PendingPodContent = ({ pod }: PendingPodContentProps) => {\n // TODO add PodHasNetwork when it's out of alpha\n // https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-conditions\n const startupConditions = [\n pod.status?.conditions?.find(c => c.type === 'PodScheduled'),\n pod.status?.conditions?.find(c => c.type === 'Initialized'),\n pod.status?.conditions?.find(c => c.type === 'ContainersReady'),\n pod.status?.conditions?.find(c => c.type === 'Ready'),\n ].filter((c): c is IPodCondition => !!c); // filter out undefined\n return (\n <Grid container spacing={2}>\n <Grid item xs={12}>\n <Typography variant=\"h5\">Pod is Pending. Conditions:</Typography>\n <List>\n {startupConditions.map(c => (\n <ListItem key={c.type}>\n <PodCondition condition={c} />\n </ListItem>\n ))}\n </List>\n </Grid>\n </Grid>\n );\n};\n"],"names":["React"],"mappings":";;;;;;;;AAgCA,MAAM,YAAe,GAAA,CAAC,EAAE,SAAA,EAAmC,KAAA;AACzD,EAAA,mFAEK,SAAU,CAAA,MAAA,KAAW,2BACnBA,cAAA,CAAA,aAAA,CAAA,WAAA,EAAA,IAAA,EACE,UAAU,IAAK,EAAA,MAAA,EAAK,UAAU,MAAQ,EAAA,GAAA,EACtC,UAAU,kBACT,IAAA,QAAA,CAAS,QAAQ,SAAU,CAAA,kBAAkB,EAAE,UAAW,CAAA;AAAA,IACxD,MAAQ,EAAA,IAAA;AAAA,GACT,GAAE,MACA,EAAA,SAAA,CAAU,SAAS,GAC1B,CAAA,EAED,SAAU,CAAA,MAAA,KAAW,MACpB,oBAAAA,cAAA,CAAA,aAAA,CAAC,gBACE,SAAU,CAAA,IAAA,EAAK,QACf,SAAU,CAAA,kBAAA,IACT,SAAS,OAAQ,CAAA,SAAA,CAAU,kBAAkB,CAAA,CAAE,UAAW,CAAA;AAAA,IACxD,MAAQ,EAAA,IAAA;AAAA,GACT,CAAE,EAAA,GAEP,GAED,SAAU,CAAA,MAAA,KAAW,6BACnBA,cAAA,CAAA,aAAA,CAAA,aAAA,EAAA,IAAA,EACE,UAAU,IAAK,EAAA,MAAA,EACf,UAAU,kBACT,IAAA,QAAA,CAAS,QAAQ,SAAU,CAAA,kBAAkB,EAAE,UAAW,CAAA;AAAA,IACxD,MAAQ,EAAA,IAAA;AAAA,GACT,CAAA,EAAE,IACF,EAAA,SAAA,CAAU,OACf,CAEJ,CAAA,CAAA;AAEJ,CAAA,CAAA;AAgBO,MAAM,iBAAoB,GAAA,CAAC,EAAE,GAAA,EAAkC,KAAA;
|
|
1
|
+
{"version":3,"file":"PendingPodContent.esm.js","sources":["../../../../src/components/Pods/PodDrawer/PendingPodContent.tsx"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport Grid from '@material-ui/core/Grid';\nimport List from '@material-ui/core/List';\nimport ListItem from '@material-ui/core/ListItem';\nimport Typography from '@material-ui/core/Typography';\nimport { IPodCondition, Pod } from 'kubernetes-models/v1';\nimport {\n StatusError,\n StatusOK,\n StatusWarning,\n} from '@backstage/core-components';\nimport { DateTime } from 'luxon';\n\ninterface PodConditionProps {\n condition: IPodCondition;\n}\n\nconst PodCondition = ({ condition }: PodConditionProps) => {\n return (\n <>\n {condition.status === 'False' && (\n <StatusError>\n {condition.type} - ({condition.reason}{' '}\n {condition.lastTransitionTime &&\n DateTime.fromISO(condition.lastTransitionTime).toRelative({\n locale: 'en',\n })}\n ) - {condition.message}{' '}\n </StatusError>\n )}\n {condition.status === 'True' && (\n <StatusOK>\n {condition.type} - (\n {condition.lastTransitionTime &&\n DateTime.fromISO(condition.lastTransitionTime).toRelative({\n locale: 'en',\n })}\n )\n </StatusOK>\n )}\n {condition.status === 'Unknown' && (\n <StatusWarning>\n {condition.type} - (\n {condition.lastTransitionTime &&\n DateTime.fromISO(condition.lastTransitionTime).toRelative({\n locale: 'en',\n })}\n ) {condition.message}\n </StatusWarning>\n )}\n </>\n );\n};\n\n/**\n * Props for PendingPodContent\n *\n * @public\n */\nexport interface PendingPodContentProps {\n pod: Pod;\n}\n\n/**\n * Shows details about pod's conditions as it starts\n *\n * @public\n */\nexport const PendingPodContent = ({ pod }: PendingPodContentProps) => {\n // TODO add PodHasNetwork when it's out of alpha\n // https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-conditions\n const startupConditions = [\n pod.status?.conditions?.find(c => c.type === 'PodScheduled'),\n pod.status?.conditions?.find(c => c.type === 'Initialized'),\n pod.status?.conditions?.find(c => c.type === 'ContainersReady'),\n pod.status?.conditions?.find(c => c.type === 'Ready'),\n ].filter((c): c is IPodCondition => !!c); // filter out undefined\n return (\n <Grid container spacing={2}>\n <Grid item xs={12}>\n <Typography variant=\"h5\">Pod is Pending. Conditions:</Typography>\n <List>\n {startupConditions.map(c => (\n <ListItem key={c.type}>\n <PodCondition condition={c} />\n </ListItem>\n ))}\n </List>\n </Grid>\n </Grid>\n );\n};\n"],"names":["React"],"mappings":";;;;;;;;AAgCA,MAAM,YAAe,GAAA,CAAC,EAAE,SAAA,EAAmC,KAAA;AACzD,EAAA,mFAEK,SAAU,CAAA,MAAA,KAAW,2BACnBA,cAAA,CAAA,aAAA,CAAA,WAAA,EAAA,IAAA,EACE,UAAU,IAAK,EAAA,MAAA,EAAK,UAAU,MAAQ,EAAA,GAAA,EACtC,UAAU,kBACT,IAAA,QAAA,CAAS,QAAQ,SAAU,CAAA,kBAAkB,EAAE,UAAW,CAAA;AAAA,IACxD,MAAQ,EAAA,IAAA;AAAA,GACT,GAAE,MACA,EAAA,SAAA,CAAU,SAAS,GAC1B,CAAA,EAED,SAAU,CAAA,MAAA,KAAW,MACpB,oBAAAA,cAAA,CAAA,aAAA,CAAC,gBACE,SAAU,CAAA,IAAA,EAAK,QACf,SAAU,CAAA,kBAAA,IACT,SAAS,OAAQ,CAAA,SAAA,CAAU,kBAAkB,CAAA,CAAE,UAAW,CAAA;AAAA,IACxD,MAAQ,EAAA,IAAA;AAAA,GACT,CAAE,EAAA,GAEP,GAED,SAAU,CAAA,MAAA,KAAW,6BACnBA,cAAA,CAAA,aAAA,CAAA,aAAA,EAAA,IAAA,EACE,UAAU,IAAK,EAAA,MAAA,EACf,UAAU,kBACT,IAAA,QAAA,CAAS,QAAQ,SAAU,CAAA,kBAAkB,EAAE,UAAW,CAAA;AAAA,IACxD,MAAQ,EAAA,IAAA;AAAA,GACT,CAAA,EAAE,IACF,EAAA,SAAA,CAAU,OACf,CAEJ,CAAA,CAAA;AAEJ,CAAA,CAAA;AAgBO,MAAM,iBAAoB,GAAA,CAAC,EAAE,GAAA,EAAkC,KAAA;AAGpE,EAAA,MAAM,iBAAoB,GAAA;AAAA,IACxB,IAAI,MAAQ,EAAA,UAAA,EAAY,KAAK,CAAK,CAAA,KAAA,CAAA,CAAE,SAAS,cAAc,CAAA;AAAA,IAC3D,IAAI,MAAQ,EAAA,UAAA,EAAY,KAAK,CAAK,CAAA,KAAA,CAAA,CAAE,SAAS,aAAa,CAAA;AAAA,IAC1D,IAAI,MAAQ,EAAA,UAAA,EAAY,KAAK,CAAK,CAAA,KAAA,CAAA,CAAE,SAAS,iBAAiB,CAAA;AAAA,IAC9D,IAAI,MAAQ,EAAA,UAAA,EAAY,KAAK,CAAK,CAAA,KAAA,CAAA,CAAE,SAAS,OAAO,CAAA;AAAA,IACpD,MAAO,CAAA,CAAC,CAA0B,KAAA,CAAC,CAAC,CAAC,CAAA,CAAA;AACvC,EAAA,oDACG,IAAK,EAAA,EAAA,SAAA,EAAS,IAAC,EAAA,OAAA,EAAS,qBACtBA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,IAAI,EACb,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,OAAA,EAAQ,QAAK,6BAA2B,CAAA,kBACnDA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,EACE,kBAAkB,GAAI,CAAA,CAAA,CAAA,qBACpBA,cAAA,CAAA,aAAA,CAAA,QAAA,EAAA,EAAS,KAAK,CAAE,CAAA,IAAA,EAAA,kBACdA,cAAA,CAAA,aAAA,CAAA,YAAA,EAAA,EAAa,WAAW,CAAG,EAAA,CAC9B,CACD,CACH,CACF,CACF,CAAA,CAAA;AAEJ;;;;"}
|
|
@@ -36,20 +36,18 @@ const useDrawerContentStyles = makeStyles(
|
|
|
36
36
|
})
|
|
37
37
|
);
|
|
38
38
|
function getContainerSpecByName(pod, containerName) {
|
|
39
|
-
|
|
40
|
-
return (_a = pod.spec) == null ? void 0 : _a.containers.find((c) => c.name === containerName);
|
|
39
|
+
return pod.spec?.containers.find((c) => c.name === containerName);
|
|
41
40
|
}
|
|
42
41
|
const PodDrawer = ({ podAndErrors, open }) => {
|
|
43
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _i;
|
|
44
42
|
const classes = useDrawerContentStyles();
|
|
45
43
|
const podMetrics = usePodMetrics(podAndErrors.cluster.name, podAndErrors.pod);
|
|
46
44
|
return /* @__PURE__ */ React__default.createElement(
|
|
47
45
|
KubernetesDrawer,
|
|
48
46
|
{
|
|
49
47
|
open,
|
|
50
|
-
drawerContentsHeader: /* @__PURE__ */ React__default.createElement(Typography, { variant: "subtitle1" }, "Pod", " ",
|
|
48
|
+
drawerContentsHeader: /* @__PURE__ */ React__default.createElement(Typography, { variant: "subtitle1" }, "Pod", " ", podAndErrors.pod.status?.podIP && `(${podAndErrors.pod.status?.podIP})`),
|
|
51
49
|
kubernetesObject: podAndErrors.pod,
|
|
52
|
-
label: /* @__PURE__ */ React__default.createElement(Typography, { variant: "subtitle1" },
|
|
50
|
+
label: /* @__PURE__ */ React__default.createElement(Typography, { variant: "subtitle1" }, podAndErrors.pod.metadata?.name ?? "unknown")
|
|
53
51
|
},
|
|
54
52
|
/* @__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(
|
|
55
53
|
ResourceUtilization,
|
|
@@ -83,22 +81,21 @@ const PodDrawer = ({ podAndErrors, open }) => {
|
|
|
83
81
|
total: podMetrics.memory.limitTotal,
|
|
84
82
|
totalFormatted: bytesToMiB(podMetrics.memory.limitTotal)
|
|
85
83
|
}
|
|
86
|
-
))),
|
|
84
|
+
))), podAndErrors.pod.status?.phase === "Pending" && /* @__PURE__ */ React__default.createElement(PendingPodContent, { pod: podAndErrors.pod }), podAndErrors.pod.status?.containerStatuses?.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, podAndErrors.pod.status?.containerStatuses?.map(
|
|
87
85
|
(containerStatus, i) => {
|
|
88
|
-
var _a2, _b2, _c2, _d2, _e2, _f2;
|
|
89
86
|
const containerSpec = getContainerSpecByName(
|
|
90
87
|
podAndErrors.pod,
|
|
91
88
|
containerStatus.name
|
|
92
89
|
);
|
|
93
|
-
const containerMetrics = (
|
|
90
|
+
const containerMetrics = (podMetrics?.containers ?? []).find((c) => c.container === containerStatus.name);
|
|
94
91
|
return /* @__PURE__ */ React__default.createElement(
|
|
95
92
|
ContainerCard,
|
|
96
93
|
{
|
|
97
|
-
key: `container-card-${
|
|
94
|
+
key: `container-card-${podAndErrors.pod.metadata?.name}-${i}`,
|
|
98
95
|
containerMetrics,
|
|
99
96
|
podScope: {
|
|
100
|
-
podName:
|
|
101
|
-
podNamespace:
|
|
97
|
+
podName: podAndErrors.pod.metadata?.name ?? "unknown",
|
|
98
|
+
podNamespace: podAndErrors.pod.metadata?.namespace ?? "unknown",
|
|
102
99
|
cluster: podAndErrors.cluster
|
|
103
100
|
},
|
|
104
101
|
containerSpec,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PodDrawer.esm.js","sources":["../../../../src/components/Pods/PodDrawer/PodDrawer.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\n\nimport { ItemCardGrid } from '@backstage/core-components';\nimport Grid from '@material-ui/core/Grid';\nimport Typography from '@material-ui/core/Typography';\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\n\nimport { Pod } from 'kubernetes-models/v1';\n\nimport { ContainerCard } from './ContainerCard';\n\nimport { PodAndErrors } from '../types';\nimport { KubernetesDrawer } from '../../KubernetesDrawer';\nimport { PendingPodContent } from './PendingPodContent';\nimport { ErrorList } from '../ErrorList';\nimport { usePodMetrics } from '../../../hooks/usePodMetrics';\nimport { ResourceUtilization } from '../../ResourceUtilization';\nimport { bytesToMiB, formatMillicores } from '../../../utils/resources';\n\nconst useDrawerContentStyles = makeStyles((_theme: Theme) =>\n createStyles({\n header: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n content: {\n height: '80%',\n },\n icon: {\n fontSize: 20,\n },\n podoklist: {\n width: '100%',\n maxWidth: 360,\n maxHeight: 360,\n },\n }),\n);\n\nfunction getContainerSpecByName(pod: Pod, containerName: string) {\n return pod.spec?.containers.find(c => c.name === containerName);\n}\n\n/**\n * Props for PodDrawer\n *\n * @public\n */\nexport interface PodDrawerProps {\n open?: boolean;\n podAndErrors: PodAndErrors;\n}\n\n/**\n * A Drawer for Kubernetes Pods\n *\n * @public\n */\nexport const PodDrawer = ({ podAndErrors, open }: PodDrawerProps) => {\n const classes = useDrawerContentStyles();\n const podMetrics = usePodMetrics(podAndErrors.cluster.name, podAndErrors.pod);\n\n return (\n <KubernetesDrawer\n open={open}\n drawerContentsHeader={\n <Typography variant=\"subtitle1\">\n Pod{' '}\n {podAndErrors.pod.status?.podIP &&\n `(${podAndErrors.pod.status?.podIP})`}\n </Typography>\n }\n kubernetesObject={podAndErrors.pod}\n label={\n <Typography variant=\"subtitle1\">\n {podAndErrors.pod.metadata?.name ?? 'unknown'}\n </Typography>\n }\n >\n <div className={classes.content}>\n {podMetrics && (\n <Grid container item xs={12}>\n <Grid item xs={12}>\n <Typography variant=\"h5\">Resource utilization</Typography>\n </Grid>\n <Grid item xs={6}>\n <ResourceUtilization\n title=\"CPU requests\"\n usage={podMetrics.cpu.currentUsage}\n total={podMetrics.cpu.requestTotal}\n totalFormatted={formatMillicores(podMetrics.cpu.requestTotal)}\n />\n <ResourceUtilization\n title=\"CPU limits\"\n usage={podMetrics.cpu.currentUsage}\n total={podMetrics.cpu.limitTotal}\n totalFormatted={formatMillicores(podMetrics.cpu.limitTotal)}\n />\n </Grid>\n <Grid item xs={6}>\n <ResourceUtilization\n title=\"Memory requests\"\n usage={podMetrics.memory.currentUsage}\n total={podMetrics.memory.requestTotal}\n totalFormatted={bytesToMiB(podMetrics.memory.requestTotal)}\n />\n <ResourceUtilization\n title=\"Memory limits\"\n usage={podMetrics.memory.currentUsage}\n total={podMetrics.memory.limitTotal}\n totalFormatted={bytesToMiB(podMetrics.memory.limitTotal)}\n />\n </Grid>\n </Grid>\n )}\n {podAndErrors.pod.status?.phase === 'Pending' && (\n <PendingPodContent pod={podAndErrors.pod} />\n )}\n {podAndErrors.pod.status?.containerStatuses?.length && (\n <Grid container spacing={2}>\n <Grid item xs={12}>\n <Typography variant=\"h5\">Containers</Typography>\n </Grid>\n <Grid item xs={12}>\n <ItemCardGrid>\n {podAndErrors.pod.status?.containerStatuses?.map(\n (containerStatus, i) => {\n const containerSpec = getContainerSpecByName(\n podAndErrors.pod,\n containerStatus.name,\n );\n const containerMetrics = (\n podMetrics?.containers ?? []\n ).find(c => c.container === containerStatus.name);\n return (\n <ContainerCard\n key={`container-card-${podAndErrors.pod.metadata?.name}-${i}`}\n containerMetrics={containerMetrics}\n podScope={{\n podName: podAndErrors.pod.metadata?.name ?? 'unknown',\n podNamespace:\n podAndErrors.pod.metadata?.namespace ?? 'unknown',\n cluster: podAndErrors.cluster,\n }}\n containerSpec={containerSpec}\n containerStatus={containerStatus}\n />\n );\n },\n )}\n </ItemCardGrid>\n </Grid>\n {podAndErrors.errors.length > 0 && (\n <Grid item xs={12}>\n <Typography variant=\"h5\">Errors</Typography>\n </Grid>\n )}\n {podAndErrors.errors.length > 0 && (\n <Grid item xs={12}>\n <ErrorList podAndErrors={[podAndErrors]} />\n </Grid>\n )}\n </Grid>\n )}\n </div>\n </KubernetesDrawer>\n );\n};\n"],"names":["React","_a","_b","_c","_d","_e","_f"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PodDrawer.esm.js","sources":["../../../../src/components/Pods/PodDrawer/PodDrawer.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\n\nimport { ItemCardGrid } from '@backstage/core-components';\nimport Grid from '@material-ui/core/Grid';\nimport Typography from '@material-ui/core/Typography';\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\n\nimport { Pod } from 'kubernetes-models/v1';\n\nimport { ContainerCard } from './ContainerCard';\n\nimport { PodAndErrors } from '../types';\nimport { KubernetesDrawer } from '../../KubernetesDrawer';\nimport { PendingPodContent } from './PendingPodContent';\nimport { ErrorList } from '../ErrorList';\nimport { usePodMetrics } from '../../../hooks/usePodMetrics';\nimport { ResourceUtilization } from '../../ResourceUtilization';\nimport { bytesToMiB, formatMillicores } from '../../../utils/resources';\n\nconst useDrawerContentStyles = makeStyles((_theme: Theme) =>\n createStyles({\n header: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n content: {\n height: '80%',\n },\n icon: {\n fontSize: 20,\n },\n podoklist: {\n width: '100%',\n maxWidth: 360,\n maxHeight: 360,\n },\n }),\n);\n\nfunction getContainerSpecByName(pod: Pod, containerName: string) {\n return pod.spec?.containers.find(c => c.name === containerName);\n}\n\n/**\n * Props for PodDrawer\n *\n * @public\n */\nexport interface PodDrawerProps {\n open?: boolean;\n podAndErrors: PodAndErrors;\n}\n\n/**\n * A Drawer for Kubernetes Pods\n *\n * @public\n */\nexport const PodDrawer = ({ podAndErrors, open }: PodDrawerProps) => {\n const classes = useDrawerContentStyles();\n const podMetrics = usePodMetrics(podAndErrors.cluster.name, podAndErrors.pod);\n\n return (\n <KubernetesDrawer\n open={open}\n drawerContentsHeader={\n <Typography variant=\"subtitle1\">\n Pod{' '}\n {podAndErrors.pod.status?.podIP &&\n `(${podAndErrors.pod.status?.podIP})`}\n </Typography>\n }\n kubernetesObject={podAndErrors.pod}\n label={\n <Typography variant=\"subtitle1\">\n {podAndErrors.pod.metadata?.name ?? 'unknown'}\n </Typography>\n }\n >\n <div className={classes.content}>\n {podMetrics && (\n <Grid container item xs={12}>\n <Grid item xs={12}>\n <Typography variant=\"h5\">Resource utilization</Typography>\n </Grid>\n <Grid item xs={6}>\n <ResourceUtilization\n title=\"CPU requests\"\n usage={podMetrics.cpu.currentUsage}\n total={podMetrics.cpu.requestTotal}\n totalFormatted={formatMillicores(podMetrics.cpu.requestTotal)}\n />\n <ResourceUtilization\n title=\"CPU limits\"\n usage={podMetrics.cpu.currentUsage}\n total={podMetrics.cpu.limitTotal}\n totalFormatted={formatMillicores(podMetrics.cpu.limitTotal)}\n />\n </Grid>\n <Grid item xs={6}>\n <ResourceUtilization\n title=\"Memory requests\"\n usage={podMetrics.memory.currentUsage}\n total={podMetrics.memory.requestTotal}\n totalFormatted={bytesToMiB(podMetrics.memory.requestTotal)}\n />\n <ResourceUtilization\n title=\"Memory limits\"\n usage={podMetrics.memory.currentUsage}\n total={podMetrics.memory.limitTotal}\n totalFormatted={bytesToMiB(podMetrics.memory.limitTotal)}\n />\n </Grid>\n </Grid>\n )}\n {podAndErrors.pod.status?.phase === 'Pending' && (\n <PendingPodContent pod={podAndErrors.pod} />\n )}\n {podAndErrors.pod.status?.containerStatuses?.length && (\n <Grid container spacing={2}>\n <Grid item xs={12}>\n <Typography variant=\"h5\">Containers</Typography>\n </Grid>\n <Grid item xs={12}>\n <ItemCardGrid>\n {podAndErrors.pod.status?.containerStatuses?.map(\n (containerStatus, i) => {\n const containerSpec = getContainerSpecByName(\n podAndErrors.pod,\n containerStatus.name,\n );\n const containerMetrics = (\n podMetrics?.containers ?? []\n ).find(c => c.container === containerStatus.name);\n return (\n <ContainerCard\n key={`container-card-${podAndErrors.pod.metadata?.name}-${i}`}\n containerMetrics={containerMetrics}\n podScope={{\n podName: podAndErrors.pod.metadata?.name ?? 'unknown',\n podNamespace:\n podAndErrors.pod.metadata?.namespace ?? 'unknown',\n cluster: podAndErrors.cluster,\n }}\n containerSpec={containerSpec}\n containerStatus={containerStatus}\n />\n );\n },\n )}\n </ItemCardGrid>\n </Grid>\n {podAndErrors.errors.length > 0 && (\n <Grid item xs={12}>\n <Typography variant=\"h5\">Errors</Typography>\n </Grid>\n )}\n {podAndErrors.errors.length > 0 && (\n <Grid item xs={12}>\n <ErrorList podAndErrors={[podAndErrors]} />\n </Grid>\n )}\n </Grid>\n )}\n </div>\n </KubernetesDrawer>\n );\n};\n"],"names":["React"],"mappings":"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"}
|
|
@@ -95,10 +95,7 @@ const PodsTable = ({ pods, extraColumns = [] }) => {
|
|
|
95
95
|
},
|
|
96
96
|
{
|
|
97
97
|
title: "phase",
|
|
98
|
-
render: (pod) =>
|
|
99
|
-
var _a, _b;
|
|
100
|
-
return (_b = (_a = pod.status) == null ? void 0 : _a.phase) != null ? _b : "unknown";
|
|
101
|
-
},
|
|
98
|
+
render: (pod) => pod.status?.phase ?? "unknown",
|
|
102
99
|
width: "auto"
|
|
103
100
|
},
|
|
104
101
|
{
|
|
@@ -137,13 +134,10 @@ const PodsTable = ({ pods, extraColumns = [] }) => {
|
|
|
137
134
|
Table,
|
|
138
135
|
{
|
|
139
136
|
options: { paging: true, search: false, emptyRowsWhenPaging: false },
|
|
140
|
-
data: pods.map((pod) => {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
id: (_a = pod == null ? void 0 : pod.metadata) == null ? void 0 : _a.uid
|
|
145
|
-
};
|
|
146
|
-
}),
|
|
137
|
+
data: pods.map((pod) => ({
|
|
138
|
+
...pod,
|
|
139
|
+
id: pod?.metadata?.uid
|
|
140
|
+
})),
|
|
147
141
|
columns
|
|
148
142
|
}
|
|
149
143
|
));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PodsTable.esm.js","sources":["../../../src/components/Pods/PodsTable.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useContext } from 'react';\nimport { PodDrawer } from './PodDrawer';\nimport {\n containersReady,\n containerStatuses,\n podStatusToCpuUtil,\n podStatusToMemoryUtil,\n totalRestarts,\n} from '../../utils/pod';\nimport { Table, TableColumn } from '@backstage/core-components';\nimport { ClusterContext } from '../../hooks/Cluster';\nimport { useMatchingErrors } from '../../hooks/useMatchingErrors';\nimport { Pod } from 'kubernetes-models/v1/Pod';\nimport { V1Pod } from '@kubernetes/client-node';\nimport { usePodMetrics } from '../../hooks/usePodMetrics';\nimport Typography from '@material-ui/core/Typography';\n\n/**\n *\n *\n * @public\n */\nexport const READY_COLUMNS: PodColumns = 'READY';\n\n/**\n *\n *\n * @public\n */\nexport const RESOURCE_COLUMNS: PodColumns = 'RESOURCE';\n\n/**\n *\n *\n * @public\n */\nexport type PodColumns = 'READY' | 'RESOURCE';\n\n/**\n *\n *\n * @public\n */\nexport type PodsTablesProps = {\n pods: Pod | V1Pod[];\n extraColumns?: PodColumns[];\n children?: React.ReactNode;\n};\n\nconst READY: TableColumn<Pod>[] = [\n {\n title: 'containers ready',\n align: 'center',\n render: containersReady,\n width: 'auto',\n },\n {\n title: 'total restarts',\n align: 'center',\n render: totalRestarts,\n type: 'numeric',\n width: 'auto',\n },\n];\n\nconst PodDrawerTrigger = ({ pod }: { pod: Pod }) => {\n const errors = useMatchingErrors({\n kind: 'Pod',\n apiVersion: 'v1',\n metadata: pod.metadata,\n });\n return (\n <PodDrawer\n podAndErrors={{\n pod: pod as any,\n cluster: useContext(ClusterContext),\n errors: errors,\n }}\n />\n );\n};\n\nconst Cpu = ({ clusterName, pod }: { clusterName: string; pod: Pod }) => {\n const metrics = usePodMetrics(clusterName, pod);\n\n if (!metrics) {\n return <Typography>unknown</Typography>;\n }\n\n return <>{podStatusToCpuUtil(metrics)}</>;\n};\n\nconst Memory = ({ clusterName, pod }: { clusterName: string; pod: Pod }) => {\n const metrics = usePodMetrics(clusterName, pod);\n\n if (!metrics) {\n return <Typography>unknown</Typography>;\n }\n\n return <>{podStatusToMemoryUtil(metrics)}</>;\n};\n\n/**\n *\n *\n * @public\n */\nexport const PodsTable = ({ pods, extraColumns = [] }: PodsTablesProps) => {\n const cluster = useContext(ClusterContext);\n const defaultColumns: TableColumn<Pod>[] = [\n {\n title: 'ID',\n field: 'metadata.uid',\n hidden: true,\n },\n {\n title: 'name',\n highlight: true,\n render: (pod: Pod) => {\n return <PodDrawerTrigger pod={pod} />;\n },\n },\n {\n title: 'phase',\n render: (pod: Pod) => pod.status?.phase ?? 'unknown',\n width: 'auto',\n },\n {\n title: 'status',\n render: containerStatuses,\n },\n ];\n const columns: TableColumn<Pod>[] = [...defaultColumns];\n\n if (extraColumns.includes(READY_COLUMNS)) {\n columns.push(...READY);\n }\n if (extraColumns.includes(RESOURCE_COLUMNS)) {\n const resourceColumns: TableColumn<Pod>[] = [\n {\n title: 'CPU usage %',\n render: (pod: Pod) => {\n return <Cpu clusterName={cluster.name} pod={pod} />;\n },\n width: 'auto',\n },\n {\n title: 'Memory usage %',\n render: (pod: Pod) => {\n return <Memory clusterName={cluster.name} pod={pod} />;\n },\n width: 'auto',\n },\n ];\n columns.push(...resourceColumns);\n }\n\n const tableStyle = {\n minWidth: '0',\n width: '100%',\n };\n\n return (\n <div style={tableStyle}>\n <Table\n options={{ paging: true, search: false, emptyRowsWhenPaging: false }}\n // It was observed that in some instances the pod drawer closes when new data (like CPU usage) is available and the table reloads.\n // Mapping the metadata UID to the tables ID fixes this problem.\n data={\n (pods as Pod[]).map((pod: Pod) => ({\n ...pod,\n id: pod?.metadata?.uid,\n })) as any as Pod[]\n }\n columns={columns}\n />\n </div>\n );\n};\n"],"names":["React"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCO,MAAM,aAA4B,GAAA,QAAA;AAOlC,MAAM,gBAA+B,GAAA,WAAA;AAoB5C,MAAM,KAA4B,GAAA;AAAA,EAChC;AAAA,IACE,KAAO,EAAA,kBAAA;AAAA,IACP,KAAO,EAAA,QAAA;AAAA,IACP,MAAQ,EAAA,eAAA;AAAA,IACR,KAAO,EAAA,MAAA;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAO,EAAA,gBAAA;AAAA,IACP,KAAO,EAAA,QAAA;AAAA,IACP,MAAQ,EAAA,aAAA;AAAA,IACR,IAAM,EAAA,SAAA;AAAA,IACN,KAAO,EAAA,MAAA;AAAA,GACT;AACF,CAAA,CAAA;AAEA,MAAM,gBAAmB,GAAA,CAAC,EAAE,GAAA,EAAwB,KAAA;AAClD,EAAA,MAAM,SAAS,iBAAkB,CAAA;AAAA,IAC/B,IAAM,EAAA,KAAA;AAAA,IACN,UAAY,EAAA,IAAA;AAAA,IACZ,UAAU,GAAI,CAAA,QAAA;AAAA,GACf,CAAA,CAAA;AACD,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,YAAc,EAAA;AAAA,QACZ,GAAA;AAAA,QACA,OAAA,EAAS,WAAW,cAAc,CAAA;AAAA,QAClC,MAAA;AAAA,OACF;AAAA,KAAA;AAAA,GACF,CAAA;AAEJ,CAAA,CAAA;AAEA,MAAM,GAAM,GAAA,CAAC,EAAE,WAAA,EAAa,KAA6C,KAAA;AACvE,EAAM,MAAA,OAAA,GAAU,aAAc,CAAA,WAAA,EAAa,GAAG,CAAA,CAAA;AAE9C,EAAA,IAAI,CAAC,OAAS,EAAA;AACZ,IAAO,uBAAAA,cAAA,CAAA,aAAA,CAAC,kBAAW,SAAO,CAAA,CAAA;AAAA,GAC5B;AAEA,EAAO,uBAAAA,cAAA,CAAA,aAAA,CAAAA,cAAA,CAAA,QAAA,EAAA,IAAA,EAAG,kBAAmB,CAAA,OAAO,CAAE,CAAA,CAAA;AACxC,CAAA,CAAA;AAEA,MAAM,MAAS,GAAA,CAAC,EAAE,WAAA,EAAa,KAA6C,KAAA;AAC1E,EAAM,MAAA,OAAA,GAAU,aAAc,CAAA,WAAA,EAAa,GAAG,CAAA,CAAA;AAE9C,EAAA,IAAI,CAAC,OAAS,EAAA;AACZ,IAAO,uBAAAA,cAAA,CAAA,aAAA,CAAC,kBAAW,SAAO,CAAA,CAAA;AAAA,GAC5B;AAEA,EAAO,uBAAAA,cAAA,CAAA,aAAA,CAAAA,cAAA,CAAA,QAAA,EAAA,IAAA,EAAG,qBAAsB,CAAA,OAAO,CAAE,CAAA,CAAA;AAC3C,CAAA,CAAA;AAOO,MAAM,YAAY,CAAC,EAAE,MAAM,YAAe,GAAA,IAA0B,KAAA;AACzE,EAAM,MAAA,OAAA,GAAU,WAAW,cAAc,CAAA,CAAA;AACzC,EAAA,MAAM,cAAqC,GAAA;AAAA,IACzC;AAAA,MACE,KAAO,EAAA,IAAA;AAAA,MACP,KAAO,EAAA,cAAA;AAAA,MACP,MAAQ,EAAA,IAAA;AAAA,KACV;AAAA,IACA;AAAA,MACE,KAAO,EAAA,MAAA;AAAA,MACP,SAAW,EAAA,IAAA;AAAA,MACX,MAAA,EAAQ,CAAC,GAAa,KAAA;AACpB,QAAO,uBAAAA,cAAA,CAAA,aAAA,CAAC,oBAAiB,GAAU,EAAA,CAAA,CAAA;AAAA,OACrC;AAAA,KACF;AAAA,IACA;AAAA,MACE,KAAO,EAAA,OAAA;AAAA,MACP,
|
|
1
|
+
{"version":3,"file":"PodsTable.esm.js","sources":["../../../src/components/Pods/PodsTable.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useContext } from 'react';\nimport { PodDrawer } from './PodDrawer';\nimport {\n containersReady,\n containerStatuses,\n podStatusToCpuUtil,\n podStatusToMemoryUtil,\n totalRestarts,\n} from '../../utils/pod';\nimport { Table, TableColumn } from '@backstage/core-components';\nimport { ClusterContext } from '../../hooks/Cluster';\nimport { useMatchingErrors } from '../../hooks/useMatchingErrors';\nimport { Pod } from 'kubernetes-models/v1/Pod';\nimport { V1Pod } from '@kubernetes/client-node';\nimport { usePodMetrics } from '../../hooks/usePodMetrics';\nimport Typography from '@material-ui/core/Typography';\n\n/**\n *\n *\n * @public\n */\nexport const READY_COLUMNS: PodColumns = 'READY';\n\n/**\n *\n *\n * @public\n */\nexport const RESOURCE_COLUMNS: PodColumns = 'RESOURCE';\n\n/**\n *\n *\n * @public\n */\nexport type PodColumns = 'READY' | 'RESOURCE';\n\n/**\n *\n *\n * @public\n */\nexport type PodsTablesProps = {\n pods: Pod | V1Pod[];\n extraColumns?: PodColumns[];\n children?: React.ReactNode;\n};\n\nconst READY: TableColumn<Pod>[] = [\n {\n title: 'containers ready',\n align: 'center',\n render: containersReady,\n width: 'auto',\n },\n {\n title: 'total restarts',\n align: 'center',\n render: totalRestarts,\n type: 'numeric',\n width: 'auto',\n },\n];\n\nconst PodDrawerTrigger = ({ pod }: { pod: Pod }) => {\n const errors = useMatchingErrors({\n kind: 'Pod',\n apiVersion: 'v1',\n metadata: pod.metadata,\n });\n return (\n <PodDrawer\n podAndErrors={{\n pod: pod as any,\n cluster: useContext(ClusterContext),\n errors: errors,\n }}\n />\n );\n};\n\nconst Cpu = ({ clusterName, pod }: { clusterName: string; pod: Pod }) => {\n const metrics = usePodMetrics(clusterName, pod);\n\n if (!metrics) {\n return <Typography>unknown</Typography>;\n }\n\n return <>{podStatusToCpuUtil(metrics)}</>;\n};\n\nconst Memory = ({ clusterName, pod }: { clusterName: string; pod: Pod }) => {\n const metrics = usePodMetrics(clusterName, pod);\n\n if (!metrics) {\n return <Typography>unknown</Typography>;\n }\n\n return <>{podStatusToMemoryUtil(metrics)}</>;\n};\n\n/**\n *\n *\n * @public\n */\nexport const PodsTable = ({ pods, extraColumns = [] }: PodsTablesProps) => {\n const cluster = useContext(ClusterContext);\n const defaultColumns: TableColumn<Pod>[] = [\n {\n title: 'ID',\n field: 'metadata.uid',\n hidden: true,\n },\n {\n title: 'name',\n highlight: true,\n render: (pod: Pod) => {\n return <PodDrawerTrigger pod={pod} />;\n },\n },\n {\n title: 'phase',\n render: (pod: Pod) => pod.status?.phase ?? 'unknown',\n width: 'auto',\n },\n {\n title: 'status',\n render: containerStatuses,\n },\n ];\n const columns: TableColumn<Pod>[] = [...defaultColumns];\n\n if (extraColumns.includes(READY_COLUMNS)) {\n columns.push(...READY);\n }\n if (extraColumns.includes(RESOURCE_COLUMNS)) {\n const resourceColumns: TableColumn<Pod>[] = [\n {\n title: 'CPU usage %',\n render: (pod: Pod) => {\n return <Cpu clusterName={cluster.name} pod={pod} />;\n },\n width: 'auto',\n },\n {\n title: 'Memory usage %',\n render: (pod: Pod) => {\n return <Memory clusterName={cluster.name} pod={pod} />;\n },\n width: 'auto',\n },\n ];\n columns.push(...resourceColumns);\n }\n\n const tableStyle = {\n minWidth: '0',\n width: '100%',\n };\n\n return (\n <div style={tableStyle}>\n <Table\n options={{ paging: true, search: false, emptyRowsWhenPaging: false }}\n // It was observed that in some instances the pod drawer closes when new data (like CPU usage) is available and the table reloads.\n // Mapping the metadata UID to the tables ID fixes this problem.\n data={\n (pods as Pod[]).map((pod: Pod) => ({\n ...pod,\n id: pod?.metadata?.uid,\n })) as any as Pod[]\n }\n columns={columns}\n />\n </div>\n );\n};\n"],"names":["React"],"mappings":"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"}
|
|
@@ -13,8 +13,7 @@ const ServiceDrawer = ({
|
|
|
13
13
|
service,
|
|
14
14
|
expanded
|
|
15
15
|
}) => {
|
|
16
|
-
|
|
17
|
-
const namespace = (_a = service.metadata) == null ? void 0 : _a.namespace;
|
|
16
|
+
const namespace = service.metadata?.namespace;
|
|
18
17
|
return /* @__PURE__ */ React__default.createElement(
|
|
19
18
|
KubernetesStructuredMetadataTableDrawer,
|
|
20
19
|
{
|
|
@@ -34,7 +33,7 @@ const ServiceDrawer = ({
|
|
|
34
33
|
alignItems: "flex-start",
|
|
35
34
|
spacing: 0
|
|
36
35
|
},
|
|
37
|
-
/* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "body1" },
|
|
36
|
+
/* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "body1" }, service.metadata?.name ?? "unknown object")),
|
|
38
37
|
/* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(Typography, { color: "textSecondary", variant: "subtitle1" }, "Service")),
|
|
39
38
|
namespace && /* @__PURE__ */ React__default.createElement(Grid, { item: true }, /* @__PURE__ */ React__default.createElement(Chip, { size: "small", label: `namespace: ${namespace}` }))
|
|
40
39
|
)
|