@backstage/plugin-kubernetes-react 0.5.5 → 0.5.6-next.1
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 +28 -0
- package/dist/components/Cluster/Cluster.esm.js +64 -39
- package/dist/components/Cluster/Cluster.esm.js.map +1 -1
- package/dist/components/CronJobsAccordions/CronJobsAccordions.esm.js +44 -32
- package/dist/components/CronJobsAccordions/CronJobsAccordions.esm.js.map +1 -1
- package/dist/components/CronJobsAccordions/CronJobsDrawer.esm.js +20 -17
- package/dist/components/CronJobsAccordions/CronJobsDrawer.esm.js.map +1 -1
- package/dist/components/CustomResources/ArgoRollouts/Rollout.esm.js +149 -100
- package/dist/components/CustomResources/ArgoRollouts/Rollout.esm.js.map +1 -1
- package/dist/components/CustomResources/ArgoRollouts/RolloutDrawer.esm.js +20 -17
- package/dist/components/CustomResources/ArgoRollouts/RolloutDrawer.esm.js.map +1 -1
- package/dist/components/CustomResources/ArgoRollouts/StepsProgress.esm.js +8 -5
- package/dist/components/CustomResources/ArgoRollouts/StepsProgress.esm.js.map +1 -1
- package/dist/components/CustomResources/CustomResources.esm.js +8 -7
- package/dist/components/CustomResources/CustomResources.esm.js.map +1 -1
- package/dist/components/CustomResources/DefaultCustomResource.esm.js +41 -39
- package/dist/components/CustomResources/DefaultCustomResource.esm.js.map +1 -1
- package/dist/components/CustomResources/DefaultCustomResourceDrawer.esm.js +19 -16
- package/dist/components/CustomResources/DefaultCustomResourceDrawer.esm.js.map +1 -1
- package/dist/components/DaemonSetsAccordions/DaemonSetsAccordions.esm.js +59 -43
- package/dist/components/DaemonSetsAccordions/DaemonSetsAccordions.esm.js.map +1 -1
- package/dist/components/DaemonSetsAccordions/DaemonSetsDrawer.esm.js +19 -16
- package/dist/components/DaemonSetsAccordions/DaemonSetsDrawer.esm.js.map +1 -1
- package/dist/components/DeploymentsAccordions/DeploymentDrawer.esm.js +19 -16
- package/dist/components/DeploymentsAccordions/DeploymentDrawer.esm.js.map +1 -1
- package/dist/components/DeploymentsAccordions/DeploymentsAccordions.esm.js +102 -70
- package/dist/components/DeploymentsAccordions/DeploymentsAccordions.esm.js.map +1 -1
- package/dist/components/ErrorPanel/ErrorPanel.esm.js +21 -9
- package/dist/components/ErrorPanel/ErrorPanel.esm.js.map +1 -1
- package/dist/components/ErrorReporting/ErrorReporting.esm.js +7 -4
- package/dist/components/ErrorReporting/ErrorReporting.esm.js.map +1 -1
- package/dist/components/HorizontalPodAutoscalers/HorizontalPodAutoscalerDrawer.esm.js +6 -5
- package/dist/components/HorizontalPodAutoscalers/HorizontalPodAutoscalerDrawer.esm.js.map +1 -1
- package/dist/components/IngressesAccordions/IngressDrawer.esm.js +19 -16
- package/dist/components/IngressesAccordions/IngressDrawer.esm.js.map +1 -1
- package/dist/components/IngressesAccordions/IngressesAccordions.esm.js +15 -11
- package/dist/components/IngressesAccordions/IngressesAccordions.esm.js.map +1 -1
- package/dist/components/JobsAccordions/JobsAccordions.esm.js +49 -31
- package/dist/components/JobsAccordions/JobsAccordions.esm.js.map +1 -1
- package/dist/components/JobsAccordions/JobsDrawer.esm.js +18 -15
- package/dist/components/JobsAccordions/JobsDrawer.esm.js.map +1 -1
- package/dist/components/KubernetesDialog/KubernetesDialog.esm.js +40 -31
- package/dist/components/KubernetesDialog/KubernetesDialog.esm.js.map +1 -1
- package/dist/components/KubernetesDrawer/KubernetesDrawer.esm.js +57 -42
- package/dist/components/KubernetesDrawer/KubernetesDrawer.esm.js.map +1 -1
- package/dist/components/KubernetesDrawer/KubernetesStructuredMetadataTableDrawer.esm.js +95 -75
- package/dist/components/KubernetesDrawer/KubernetesStructuredMetadataTableDrawer.esm.js.map +1 -1
- package/dist/components/KubernetesDrawer/ManifestYaml.esm.js +36 -32
- package/dist/components/KubernetesDrawer/ManifestYaml.esm.js.map +1 -1
- package/dist/components/PodExecTerminal/PodExecTerminal.esm.js +4 -3
- package/dist/components/PodExecTerminal/PodExecTerminal.esm.js.map +1 -1
- package/dist/components/PodExecTerminal/PodExecTerminalDialog.esm.js +7 -6
- package/dist/components/PodExecTerminal/PodExecTerminalDialog.esm.js.map +1 -1
- package/dist/components/Pods/ErrorList/ErrorList.esm.js +27 -21
- package/dist/components/Pods/ErrorList/ErrorList.esm.js.map +1 -1
- package/dist/components/Pods/Events/Events.esm.js +30 -23
- package/dist/components/Pods/Events/Events.esm.js.map +1 -1
- package/dist/components/Pods/FixDialog/FixDialog.esm.js +85 -51
- package/dist/components/Pods/FixDialog/FixDialog.esm.js.map +1 -1
- package/dist/components/Pods/PodDelete/PodDeleteButton.esm.js +25 -21
- package/dist/components/Pods/PodDelete/PodDeleteButton.esm.js.map +1 -1
- package/dist/components/Pods/PodDrawer/ContainerCard.esm.js +137 -95
- package/dist/components/Pods/PodDrawer/ContainerCard.esm.js.map +1 -1
- package/dist/components/Pods/PodDrawer/PendingPodContent.esm.js +36 -9
- package/dist/components/Pods/PodDrawer/PendingPodContent.esm.js.map +1 -1
- package/dist/components/Pods/PodDrawer/PodDrawer.esm.js +89 -64
- package/dist/components/Pods/PodDrawer/PodDrawer.esm.js.map +1 -1
- package/dist/components/Pods/PodLogs/PodLogs.esm.js +30 -25
- package/dist/components/Pods/PodLogs/PodLogs.esm.js.map +1 -1
- package/dist/components/Pods/PodLogs/PodLogsDialog.esm.js +6 -6
- package/dist/components/Pods/PodLogs/PodLogsDialog.esm.js.map +1 -1
- package/dist/components/Pods/PodsTable.esm.js +12 -11
- package/dist/components/Pods/PodsTable.esm.js.map +1 -1
- package/dist/components/ResourceUtilization/ResourceUtilization.esm.js +24 -15
- package/dist/components/ResourceUtilization/ResourceUtilization.esm.js.map +1 -1
- package/dist/components/ServicesAccordions/ServiceDrawer.esm.js +19 -16
- package/dist/components/ServicesAccordions/ServiceDrawer.esm.js.map +1 -1
- package/dist/components/ServicesAccordions/ServicesAccordions.esm.js +21 -12
- package/dist/components/ServicesAccordions/ServicesAccordions.esm.js.map +1 -1
- package/dist/components/StatefulSetsAccordions/StatefulSetDrawer.esm.js +19 -16
- package/dist/components/StatefulSetsAccordions/StatefulSetDrawer.esm.js.map +1 -1
- package/dist/components/StatefulSetsAccordions/StatefulSetsAccordions.esm.js +98 -66
- package/dist/components/StatefulSetsAccordions/StatefulSetsAccordions.esm.js.map +1 -1
- package/dist/hooks/Cluster.esm.js +2 -2
- package/dist/hooks/Cluster.esm.js.map +1 -1
- package/dist/hooks/GroupedResponses.esm.js +2 -2
- package/dist/hooks/GroupedResponses.esm.js.map +1 -1
- package/dist/hooks/PodNamesWithErrors.esm.js +2 -2
- package/dist/hooks/PodNamesWithErrors.esm.js.map +1 -1
- package/dist/hooks/PodNamesWithMetrics.esm.js +2 -2
- package/dist/hooks/PodNamesWithMetrics.esm.js.map +1 -1
- package/dist/hooks/useMatchingErrors.esm.js +2 -2
- package/dist/hooks/useMatchingErrors.esm.js.map +1 -1
- package/dist/hooks/usePodMetrics.esm.js +4 -2
- package/dist/hooks/usePodMetrics.esm.js.map +1 -1
- package/dist/index.d.ts +47 -46
- package/dist/utils/pod.esm.js +25 -15
- package/dist/utils/pod.esm.js.map +1 -1
- package/package.json +13 -13
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import { useState, useContext } from 'react';
|
|
2
3
|
import Button from '@material-ui/core/Button';
|
|
3
4
|
import Typography from '@material-ui/core/Typography';
|
|
4
5
|
import IconButton from '@material-ui/core/IconButton';
|
|
@@ -70,13 +71,16 @@ const PodDrawerButton = withStyles({
|
|
|
70
71
|
const LinkErrorPanel = ({
|
|
71
72
|
cluster,
|
|
72
73
|
errorMessage
|
|
73
|
-
}) => /* @__PURE__ */
|
|
74
|
+
}) => /* @__PURE__ */ jsx(
|
|
74
75
|
WarningPanel,
|
|
75
76
|
{
|
|
76
77
|
title: "There was a problem formatting the link to the Kubernetes dashboard",
|
|
77
|
-
message: `Could not format the link to the dashboard of your cluster named '${cluster.name}'. Its dashboardApp property has been set to '${cluster.dashboardApp || "standard"}.'
|
|
78
|
-
|
|
79
|
-
|
|
78
|
+
message: `Could not format the link to the dashboard of your cluster named '${cluster.name}'. Its dashboardApp property has been set to '${cluster.dashboardApp || "standard"}.'`,
|
|
79
|
+
children: errorMessage && /* @__PURE__ */ jsxs(Typography, { variant: "body2", children: [
|
|
80
|
+
"Errors: ",
|
|
81
|
+
errorMessage
|
|
82
|
+
] })
|
|
83
|
+
}
|
|
80
84
|
);
|
|
81
85
|
function replaceNullsWithUndefined(someObj) {
|
|
82
86
|
const replacer = (_, value) => String(value) === "null" || String(value) === "undefined" ? void 0 : value;
|
|
@@ -102,53 +106,66 @@ const KubernetesStructuredMetadataTableDrawerContent = ({
|
|
|
102
106
|
}),
|
|
103
107
|
[cluster, object, kind, formatter]
|
|
104
108
|
);
|
|
105
|
-
return /* @__PURE__ */
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
onClick: (e) => toggleDrawer(e, false),
|
|
111
|
-
color: "inherit"
|
|
112
|
-
},
|
|
113
|
-
/* @__PURE__ */ React__default.createElement(CloseIcon, { className: classes.icon })
|
|
114
|
-
)), /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 11 }, /* @__PURE__ */ React__default.createElement(Typography, { color: "textSecondary", variant: "body1" }, kind)), /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 11 }, /* @__PURE__ */ React__default.createElement(
|
|
115
|
-
FormControlLabel,
|
|
116
|
-
{
|
|
117
|
-
control: /* @__PURE__ */ React__default.createElement(
|
|
118
|
-
Switch,
|
|
109
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
110
|
+
/* @__PURE__ */ jsx("div", { className: classes.header, children: /* @__PURE__ */ jsxs(Grid, { container: true, justifyContent: "flex-start", alignItems: "flex-start", children: [
|
|
111
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 11, children: /* @__PURE__ */ jsx(Typography, { variant: "h5", children: object.metadata?.name ?? "unknown name" }) }),
|
|
112
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 1, children: /* @__PURE__ */ jsx(
|
|
113
|
+
IconButton,
|
|
119
114
|
{
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
}
|
|
124
|
-
|
|
115
|
+
title: "Close the drawer",
|
|
116
|
+
onClick: (e) => toggleDrawer(e, false),
|
|
117
|
+
color: "inherit",
|
|
118
|
+
children: /* @__PURE__ */ jsx(CloseIcon, { className: classes.icon })
|
|
119
|
+
},
|
|
120
|
+
"dismiss"
|
|
121
|
+
) }),
|
|
122
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 11, children: /* @__PURE__ */ jsx(Typography, { color: "textSecondary", variant: "body1", children: kind }) }),
|
|
123
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 11, children: /* @__PURE__ */ jsx(
|
|
124
|
+
FormControlLabel,
|
|
125
|
+
{
|
|
126
|
+
control: /* @__PURE__ */ jsx(
|
|
127
|
+
Switch,
|
|
128
|
+
{
|
|
129
|
+
checked: isYaml,
|
|
130
|
+
onChange: (event) => {
|
|
131
|
+
setIsYaml(event.target.checked);
|
|
132
|
+
},
|
|
133
|
+
name: "YAML"
|
|
134
|
+
}
|
|
135
|
+
),
|
|
136
|
+
label: "YAML"
|
|
125
137
|
}
|
|
126
|
-
)
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
138
|
+
) })
|
|
139
|
+
] }) }),
|
|
140
|
+
error && /* @__PURE__ */ jsx("div", { className: classes.errorMessage, children: /* @__PURE__ */ jsx(
|
|
141
|
+
LinkErrorPanel,
|
|
142
|
+
{
|
|
143
|
+
cluster,
|
|
144
|
+
errorMessage: error.message || error.toString()
|
|
145
|
+
}
|
|
146
|
+
) }),
|
|
147
|
+
/* @__PURE__ */ jsx("div", { className: classes.options, children: /* @__PURE__ */ jsx("div", { children: clusterLink && /* @__PURE__ */ jsx(
|
|
148
|
+
LinkButton,
|
|
149
|
+
{
|
|
150
|
+
variant: "outlined",
|
|
151
|
+
color: "primary",
|
|
152
|
+
size: "small",
|
|
153
|
+
to: clusterLink,
|
|
154
|
+
endIcon: /* @__PURE__ */ jsx(OpenInNewIcon, {}),
|
|
155
|
+
children: "Open Kubernetes Dashboard"
|
|
156
|
+
}
|
|
157
|
+
) }) }),
|
|
158
|
+
/* @__PURE__ */ jsxs("div", { className: classes.content, children: [
|
|
159
|
+
isYaml && /* @__PURE__ */ jsx(ManifestYaml, { object }),
|
|
160
|
+
!isYaml && /* @__PURE__ */ jsx(
|
|
161
|
+
StructuredMetadataTable,
|
|
162
|
+
{
|
|
163
|
+
metadata: renderObject(replaceNullsWithUndefined(object)),
|
|
164
|
+
options: { nestedValuesAsYaml: true }
|
|
165
|
+
}
|
|
166
|
+
)
|
|
167
|
+
] })
|
|
168
|
+
] });
|
|
152
169
|
};
|
|
153
170
|
const KubernetesStructuredMetadataTableDrawer = ({
|
|
154
171
|
object,
|
|
@@ -164,34 +181,37 @@ const KubernetesStructuredMetadataTableDrawer = ({
|
|
|
164
181
|
e.stopPropagation();
|
|
165
182
|
setIsOpen(newValue);
|
|
166
183
|
};
|
|
167
|
-
return /* @__PURE__ */
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
paper: classes.paper
|
|
179
|
-
},
|
|
180
|
-
anchor: "right",
|
|
181
|
-
open: isOpen,
|
|
182
|
-
onClose: (e) => toggleDrawer(e, false),
|
|
183
|
-
onClick: (event) => event.stopPropagation()
|
|
184
|
-
},
|
|
185
|
-
/* @__PURE__ */ React__default.createElement(
|
|
186
|
-
KubernetesStructuredMetadataTableDrawerContent,
|
|
184
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
185
|
+
/* @__PURE__ */ jsx(
|
|
186
|
+
PodDrawerButton,
|
|
187
|
+
{
|
|
188
|
+
onClick: (e) => toggleDrawer(e, true),
|
|
189
|
+
onFocus: (event) => event.stopPropagation(),
|
|
190
|
+
children: children === void 0 ? /* @__PURE__ */ jsx(Typography, { variant: buttonVariant, children: object.metadata?.name ?? "unknown object" }) : children
|
|
191
|
+
}
|
|
192
|
+
),
|
|
193
|
+
/* @__PURE__ */ jsx(
|
|
194
|
+
Drawer,
|
|
187
195
|
{
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
196
|
+
classes: {
|
|
197
|
+
paper: classes.paper
|
|
198
|
+
},
|
|
199
|
+
anchor: "right",
|
|
200
|
+
open: isOpen,
|
|
201
|
+
onClose: (e) => toggleDrawer(e, false),
|
|
202
|
+
onClick: (event) => event.stopPropagation(),
|
|
203
|
+
children: /* @__PURE__ */ jsx(
|
|
204
|
+
KubernetesStructuredMetadataTableDrawerContent,
|
|
205
|
+
{
|
|
206
|
+
kind,
|
|
207
|
+
toggleDrawer,
|
|
208
|
+
object,
|
|
209
|
+
renderObject
|
|
210
|
+
}
|
|
211
|
+
)
|
|
192
212
|
}
|
|
193
213
|
)
|
|
194
|
-
)
|
|
214
|
+
] });
|
|
195
215
|
};
|
|
196
216
|
|
|
197
217
|
export { KubernetesStructuredMetadataTableDrawer, LinkErrorPanel };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KubernetesStructuredMetadataTableDrawer.esm.js","sources":["../../../src/components/KubernetesDrawer/KubernetesStructuredMetadataTableDrawer.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, { ChangeEvent, useContext, useState } from 'react';\nimport Button from '@material-ui/core/Button';\nimport Typography from '@material-ui/core/Typography';\nimport IconButton from '@material-ui/core/IconButton';\nimport Drawer from '@material-ui/core/Drawer';\nimport Switch from '@material-ui/core/Switch';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport Grid from '@material-ui/core/Grid';\nimport { makeStyles, createStyles, Theme } from '@material-ui/core/styles';\nimport Close from '@material-ui/icons/Close';\nimport OpenInNewIcon from '@material-ui/icons/OpenInNew';\nimport { V1ObjectMeta } from '@kubernetes/client-node';\nimport { withStyles } from '@material-ui/core/styles';\nimport {\n LinkButton as BackstageButton,\n StructuredMetadataTable,\n WarningPanel,\n} from '@backstage/core-components';\nimport { ClusterContext } from '../../hooks';\nimport { ClusterAttributes } from '@backstage/plugin-kubernetes-common';\nimport { ManifestYaml } from './ManifestYaml';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { kubernetesClusterLinkFormatterApiRef } from '../../api';\nimport useAsync from 'react-use/esm/useAsync';\n\nconst useDrawerStyles = makeStyles((theme: Theme) =>\n createStyles({\n paper: {\n width: '50%',\n justifyContent: 'space-between',\n padding: theme.spacing(2.5),\n },\n }),\n);\n\nconst useDrawerContentStyles = makeStyles((_: Theme) =>\n createStyles({\n header: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n errorMessage: {\n marginTop: '1em',\n marginBottom: '1em',\n },\n options: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n icon: {\n fontSize: 20,\n },\n content: {\n height: '80%',\n },\n }),\n);\n\nconst PodDrawerButton = withStyles({\n root: {\n padding: '6px 5px',\n },\n label: {\n textTransform: 'none',\n },\n})(Button);\n\n/**\n *\n *\n * @public\n */\nexport type LinkErrorPanelProps = {\n cluster: ClusterAttributes;\n errorMessage?: string;\n children?: React.ReactNode;\n};\n\n/**\n *\n *\n * @public\n */\nexport const LinkErrorPanel = ({\n cluster,\n errorMessage,\n}: LinkErrorPanelProps) => (\n <WarningPanel\n title=\"There was a problem formatting the link to the Kubernetes dashboard\"\n message={`Could not format the link to the dashboard of your cluster named '${\n cluster.name\n }'. Its dashboardApp property has been set to '${\n cluster.dashboardApp || 'standard'\n }.'`}\n >\n {errorMessage && (\n <Typography variant=\"body2\">Errors: {errorMessage}</Typography>\n )}\n </WarningPanel>\n);\n\n/**\n *\n *\n * @public\n */\nexport interface KubernetesDrawerable {\n metadata?: V1ObjectMeta;\n}\n\ninterface KubernetesStructuredMetadataTableDrawerContentProps<\n T extends KubernetesDrawerable,\n> {\n toggleDrawer: (e: ChangeEvent<{}>, isOpen: boolean) => void;\n object: T;\n renderObject: (obj: T) => object;\n kind: string;\n}\n\nfunction replaceNullsWithUndefined(someObj: any) {\n const replacer = (_: any, value: any) =>\n String(value) === 'null' || String(value) === 'undefined'\n ? undefined\n : value;\n\n return JSON.parse(JSON.stringify(someObj, replacer));\n}\n\nconst KubernetesStructuredMetadataTableDrawerContent = <\n T extends KubernetesDrawerable,\n>({\n toggleDrawer,\n object,\n renderObject,\n kind,\n}: KubernetesStructuredMetadataTableDrawerContentProps<T>) => {\n const [isYaml, setIsYaml] = useState<boolean>(false);\n\n const formatter = useApi(kubernetesClusterLinkFormatterApiRef);\n const classes = useDrawerContentStyles();\n const cluster = useContext(ClusterContext);\n const { value: clusterLink, error } = useAsync(\n async () =>\n formatter.formatClusterLink({\n dashboardUrl: cluster.dashboardUrl,\n dashboardApp: cluster.dashboardApp,\n dashboardParameters: cluster.dashboardParameters,\n object,\n kind,\n }),\n [cluster, object, kind, formatter],\n );\n\n return (\n <>\n <div className={classes.header}>\n <Grid container justifyContent=\"flex-start\" alignItems=\"flex-start\">\n <Grid item xs={11}>\n <Typography variant=\"h5\">\n {object.metadata?.name ?? 'unknown name'}\n </Typography>\n </Grid>\n <Grid item xs={1}>\n <IconButton\n key=\"dismiss\"\n title=\"Close the drawer\"\n onClick={e => toggleDrawer(e, false)}\n color=\"inherit\"\n >\n <Close className={classes.icon} />\n </IconButton>\n </Grid>\n <Grid item xs={11}>\n <Typography color=\"textSecondary\" variant=\"body1\">\n {kind}\n </Typography>\n </Grid>\n <Grid item xs={11}>\n <FormControlLabel\n control={\n <Switch\n checked={isYaml}\n onChange={event => {\n setIsYaml(event.target.checked);\n }}\n name=\"YAML\"\n />\n }\n label=\"YAML\"\n />\n </Grid>\n </Grid>\n </div>\n {error && (\n <div className={classes.errorMessage}>\n <LinkErrorPanel\n cluster={cluster}\n errorMessage={error.message || error.toString()}\n />\n </div>\n )}\n <div className={classes.options}>\n <div>\n {clusterLink && (\n <BackstageButton\n variant=\"outlined\"\n color=\"primary\"\n size=\"small\"\n to={clusterLink}\n endIcon={<OpenInNewIcon />}\n >\n Open Kubernetes Dashboard\n </BackstageButton>\n )}\n </div>\n </div>\n <div className={classes.content}>\n {isYaml && <ManifestYaml object={object} />}\n {!isYaml && (\n <StructuredMetadataTable\n metadata={renderObject(replaceNullsWithUndefined(object))}\n options={{ nestedValuesAsYaml: true }}\n />\n )}\n </div>\n </>\n );\n};\n\n/**\n *\n * @public\n */\nexport interface KubernetesStructuredMetadataTableDrawerProps<\n T extends KubernetesDrawerable,\n> {\n object: T;\n renderObject: (obj: T) => object;\n buttonVariant?: 'h5' | 'subtitle2';\n kind: string;\n expanded?: boolean;\n children?: React.ReactNode;\n}\n\n/**\n *\n * @public\n */\nexport const KubernetesStructuredMetadataTableDrawer = <\n T extends KubernetesDrawerable,\n>({\n object,\n renderObject,\n kind,\n buttonVariant = 'subtitle2',\n expanded = false,\n children,\n}: KubernetesStructuredMetadataTableDrawerProps<T>) => {\n const [isOpen, setIsOpen] = useState(expanded);\n const classes = useDrawerStyles();\n\n const toggleDrawer = (e: ChangeEvent<{}>, newValue: boolean) => {\n e.stopPropagation();\n setIsOpen(newValue);\n };\n\n return (\n <>\n <PodDrawerButton\n onClick={e => toggleDrawer(e, true)}\n onFocus={event => event.stopPropagation()}\n >\n {children === undefined ? (\n <Typography variant={buttonVariant}>\n {object.metadata?.name ?? 'unknown object'}\n </Typography>\n ) : (\n children\n )}\n </PodDrawerButton>\n <Drawer\n classes={{\n paper: classes.paper,\n }}\n anchor=\"right\"\n open={isOpen}\n onClose={(e: any) => toggleDrawer(e, false)}\n onClick={event => event.stopPropagation()}\n >\n <KubernetesStructuredMetadataTableDrawerContent\n kind={kind}\n toggleDrawer={toggleDrawer}\n object={object}\n renderObject={renderObject}\n />\n </Drawer>\n </>\n );\n};\n"],"names":["React","Close","BackstageButton"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"KubernetesStructuredMetadataTableDrawer.esm.js","sources":["../../../src/components/KubernetesDrawer/KubernetesStructuredMetadataTableDrawer.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 { ReactNode, ChangeEvent, useContext, useState } from 'react';\nimport Button from '@material-ui/core/Button';\nimport Typography from '@material-ui/core/Typography';\nimport IconButton from '@material-ui/core/IconButton';\nimport Drawer from '@material-ui/core/Drawer';\nimport Switch from '@material-ui/core/Switch';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport Grid from '@material-ui/core/Grid';\nimport { makeStyles, createStyles, Theme } from '@material-ui/core/styles';\nimport Close from '@material-ui/icons/Close';\nimport OpenInNewIcon from '@material-ui/icons/OpenInNew';\nimport { V1ObjectMeta } from '@kubernetes/client-node';\nimport { withStyles } from '@material-ui/core/styles';\nimport {\n LinkButton as BackstageButton,\n StructuredMetadataTable,\n WarningPanel,\n} from '@backstage/core-components';\nimport { ClusterContext } from '../../hooks';\nimport { ClusterAttributes } from '@backstage/plugin-kubernetes-common';\nimport { ManifestYaml } from './ManifestYaml';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { kubernetesClusterLinkFormatterApiRef } from '../../api';\nimport useAsync from 'react-use/esm/useAsync';\n\nconst useDrawerStyles = makeStyles((theme: Theme) =>\n createStyles({\n paper: {\n width: '50%',\n justifyContent: 'space-between',\n padding: theme.spacing(2.5),\n },\n }),\n);\n\nconst useDrawerContentStyles = makeStyles((_: Theme) =>\n createStyles({\n header: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n errorMessage: {\n marginTop: '1em',\n marginBottom: '1em',\n },\n options: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n icon: {\n fontSize: 20,\n },\n content: {\n height: '80%',\n },\n }),\n);\n\nconst PodDrawerButton = withStyles({\n root: {\n padding: '6px 5px',\n },\n label: {\n textTransform: 'none',\n },\n})(Button);\n\n/**\n *\n *\n * @public\n */\nexport type LinkErrorPanelProps = {\n cluster: ClusterAttributes;\n errorMessage?: string;\n children?: ReactNode;\n};\n\n/**\n *\n *\n * @public\n */\nexport const LinkErrorPanel = ({\n cluster,\n errorMessage,\n}: LinkErrorPanelProps) => (\n <WarningPanel\n title=\"There was a problem formatting the link to the Kubernetes dashboard\"\n message={`Could not format the link to the dashboard of your cluster named '${\n cluster.name\n }'. Its dashboardApp property has been set to '${\n cluster.dashboardApp || 'standard'\n }.'`}\n >\n {errorMessage && (\n <Typography variant=\"body2\">Errors: {errorMessage}</Typography>\n )}\n </WarningPanel>\n);\n\n/**\n *\n *\n * @public\n */\nexport interface KubernetesDrawerable {\n metadata?: V1ObjectMeta;\n}\n\ninterface KubernetesStructuredMetadataTableDrawerContentProps<\n T extends KubernetesDrawerable,\n> {\n toggleDrawer: (e: ChangeEvent<{}>, isOpen: boolean) => void;\n object: T;\n renderObject: (obj: T) => object;\n kind: string;\n}\n\nfunction replaceNullsWithUndefined(someObj: any) {\n const replacer = (_: any, value: any) =>\n String(value) === 'null' || String(value) === 'undefined'\n ? undefined\n : value;\n\n return JSON.parse(JSON.stringify(someObj, replacer));\n}\n\nconst KubernetesStructuredMetadataTableDrawerContent = <\n T extends KubernetesDrawerable,\n>({\n toggleDrawer,\n object,\n renderObject,\n kind,\n}: KubernetesStructuredMetadataTableDrawerContentProps<T>) => {\n const [isYaml, setIsYaml] = useState<boolean>(false);\n\n const formatter = useApi(kubernetesClusterLinkFormatterApiRef);\n const classes = useDrawerContentStyles();\n const cluster = useContext(ClusterContext);\n const { value: clusterLink, error } = useAsync(\n async () =>\n formatter.formatClusterLink({\n dashboardUrl: cluster.dashboardUrl,\n dashboardApp: cluster.dashboardApp,\n dashboardParameters: cluster.dashboardParameters,\n object,\n kind,\n }),\n [cluster, object, kind, formatter],\n );\n\n return (\n <>\n <div className={classes.header}>\n <Grid container justifyContent=\"flex-start\" alignItems=\"flex-start\">\n <Grid item xs={11}>\n <Typography variant=\"h5\">\n {object.metadata?.name ?? 'unknown name'}\n </Typography>\n </Grid>\n <Grid item xs={1}>\n <IconButton\n key=\"dismiss\"\n title=\"Close the drawer\"\n onClick={e => toggleDrawer(e, false)}\n color=\"inherit\"\n >\n <Close className={classes.icon} />\n </IconButton>\n </Grid>\n <Grid item xs={11}>\n <Typography color=\"textSecondary\" variant=\"body1\">\n {kind}\n </Typography>\n </Grid>\n <Grid item xs={11}>\n <FormControlLabel\n control={\n <Switch\n checked={isYaml}\n onChange={event => {\n setIsYaml(event.target.checked);\n }}\n name=\"YAML\"\n />\n }\n label=\"YAML\"\n />\n </Grid>\n </Grid>\n </div>\n {error && (\n <div className={classes.errorMessage}>\n <LinkErrorPanel\n cluster={cluster}\n errorMessage={error.message || error.toString()}\n />\n </div>\n )}\n <div className={classes.options}>\n <div>\n {clusterLink && (\n <BackstageButton\n variant=\"outlined\"\n color=\"primary\"\n size=\"small\"\n to={clusterLink}\n endIcon={<OpenInNewIcon />}\n >\n Open Kubernetes Dashboard\n </BackstageButton>\n )}\n </div>\n </div>\n <div className={classes.content}>\n {isYaml && <ManifestYaml object={object} />}\n {!isYaml && (\n <StructuredMetadataTable\n metadata={renderObject(replaceNullsWithUndefined(object))}\n options={{ nestedValuesAsYaml: true }}\n />\n )}\n </div>\n </>\n );\n};\n\n/**\n *\n * @public\n */\nexport interface KubernetesStructuredMetadataTableDrawerProps<\n T extends KubernetesDrawerable,\n> {\n object: T;\n renderObject: (obj: T) => object;\n buttonVariant?: 'h5' | 'subtitle2';\n kind: string;\n expanded?: boolean;\n children?: ReactNode;\n}\n\n/**\n *\n * @public\n */\nexport const KubernetesStructuredMetadataTableDrawer = <\n T extends KubernetesDrawerable,\n>({\n object,\n renderObject,\n kind,\n buttonVariant = 'subtitle2',\n expanded = false,\n children,\n}: KubernetesStructuredMetadataTableDrawerProps<T>) => {\n const [isOpen, setIsOpen] = useState(expanded);\n const classes = useDrawerStyles();\n\n const toggleDrawer = (e: ChangeEvent<{}>, newValue: boolean) => {\n e.stopPropagation();\n setIsOpen(newValue);\n };\n\n return (\n <>\n <PodDrawerButton\n onClick={e => toggleDrawer(e, true)}\n onFocus={event => event.stopPropagation()}\n >\n {children === undefined ? (\n <Typography variant={buttonVariant}>\n {object.metadata?.name ?? 'unknown object'}\n </Typography>\n ) : (\n children\n )}\n </PodDrawerButton>\n <Drawer\n classes={{\n paper: classes.paper,\n }}\n anchor=\"right\"\n open={isOpen}\n onClose={(e: any) => toggleDrawer(e, false)}\n onClick={event => event.stopPropagation()}\n >\n <KubernetesStructuredMetadataTableDrawerContent\n kind={kind}\n toggleDrawer={toggleDrawer}\n object={object}\n renderObject={renderObject}\n />\n </Drawer>\n </>\n );\n};\n"],"names":["Close","BackstageButton"],"mappings":"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"}
|
|
@@ -1,43 +1,47 @@
|
|
|
1
|
+
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
1
2
|
import { CodeSnippet } from '@backstage/core-components';
|
|
2
3
|
import FormControlLabel from '@material-ui/core/FormControlLabel';
|
|
3
4
|
import Switch from '@material-ui/core/Switch';
|
|
4
5
|
import jsyaml from 'js-yaml';
|
|
5
|
-
import
|
|
6
|
+
import { useState } from 'react';
|
|
6
7
|
|
|
7
8
|
const ManifestYaml = ({ object }) => {
|
|
8
9
|
const [managedFields, setManagedFields] = useState(false);
|
|
9
|
-
return /* @__PURE__ */
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
),
|
|
22
|
-
label: "Managed Fields"
|
|
23
|
-
}
|
|
24
|
-
), /* @__PURE__ */ React__default.createElement(
|
|
25
|
-
CodeSnippet,
|
|
26
|
-
{
|
|
27
|
-
language: "yaml",
|
|
28
|
-
text: jsyaml.dump(object, {
|
|
29
|
-
// NOTE: this will remove any field called `managedFields`
|
|
30
|
-
// not just the metadata one
|
|
31
|
-
// TODO: @mclarke make this only remove the `metadata.managedFields`
|
|
32
|
-
replacer: (key, value) => {
|
|
33
|
-
if (!managedFields) {
|
|
34
|
-
return key === "managedFields" ? void 0 : value;
|
|
10
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
11
|
+
/* @__PURE__ */ jsx(
|
|
12
|
+
FormControlLabel,
|
|
13
|
+
{
|
|
14
|
+
control: /* @__PURE__ */ jsx(
|
|
15
|
+
Switch,
|
|
16
|
+
{
|
|
17
|
+
checked: managedFields,
|
|
18
|
+
onChange: (event) => {
|
|
19
|
+
setManagedFields(event.target.checked);
|
|
20
|
+
},
|
|
21
|
+
name: "Managed Fields"
|
|
35
22
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
|
|
23
|
+
),
|
|
24
|
+
label: "Managed Fields"
|
|
25
|
+
}
|
|
26
|
+
),
|
|
27
|
+
/* @__PURE__ */ jsx(
|
|
28
|
+
CodeSnippet,
|
|
29
|
+
{
|
|
30
|
+
language: "yaml",
|
|
31
|
+
text: jsyaml.dump(object, {
|
|
32
|
+
// NOTE: this will remove any field called `managedFields`
|
|
33
|
+
// not just the metadata one
|
|
34
|
+
// TODO: @mclarke make this only remove the `metadata.managedFields`
|
|
35
|
+
replacer: (key, value) => {
|
|
36
|
+
if (!managedFields) {
|
|
37
|
+
return key === "managedFields" ? void 0 : value;
|
|
38
|
+
}
|
|
39
|
+
return value;
|
|
40
|
+
}
|
|
41
|
+
})
|
|
42
|
+
}
|
|
43
|
+
)
|
|
44
|
+
] });
|
|
41
45
|
};
|
|
42
46
|
|
|
43
47
|
export { ManifestYaml };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ManifestYaml.esm.js","sources":["../../../src/components/KubernetesDrawer/ManifestYaml.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 { CodeSnippet } from '@backstage/core-components';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport Switch from '@material-ui/core/Switch';\nimport jsyaml from 'js-yaml';\nimport
|
|
1
|
+
{"version":3,"file":"ManifestYaml.esm.js","sources":["../../../src/components/KubernetesDrawer/ManifestYaml.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 { CodeSnippet } from '@backstage/core-components';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport Switch from '@material-ui/core/Switch';\nimport jsyaml from 'js-yaml';\nimport { useState } from 'react';\n\n/**\n * Props of ManifestYaml\n *\n * @public\n */\nexport interface ManifestYamlProps {\n object: object;\n}\n\n/**\n * Renders a Kubernetes object as a YAML code snippet\n *\n * @public\n */\nexport const ManifestYaml = ({ object }: ManifestYamlProps) => {\n // Toggle whether the Kubernetes resource managed fields should be shown in\n // the YAML display. This toggle is only available when the YAML is being\n // shown because managed fields are never visible in the structured display.\n const [managedFields, setManagedFields] = useState<boolean>(false);\n return (\n <>\n <FormControlLabel\n control={\n <Switch\n checked={managedFields}\n onChange={event => {\n setManagedFields(event.target.checked);\n }}\n name=\"Managed Fields\"\n />\n }\n label=\"Managed Fields\"\n />\n <CodeSnippet\n language=\"yaml\"\n text={jsyaml.dump(object, {\n // NOTE: this will remove any field called `managedFields`\n // not just the metadata one\n // TODO: @mclarke make this only remove the `metadata.managedFields`\n replacer: (key: string, value: string): any => {\n if (!managedFields) {\n return key === 'managedFields' ? undefined : value;\n }\n return value;\n },\n })}\n />\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;AAmCO,MAAM,YAAe,GAAA,CAAC,EAAE,MAAA,EAAgC,KAAA;AAI7D,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAAkB,KAAK,CAAA;AACjE,EAAA,uBAEI,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,gBAAA;AAAA,MAAA;AAAA,QACC,OACE,kBAAA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAS,EAAA,aAAA;AAAA,YACT,UAAU,CAAS,KAAA,KAAA;AACjB,cAAiB,gBAAA,CAAA,KAAA,CAAM,OAAO,OAAO,CAAA;AAAA,aACvC;AAAA,YACA,IAAK,EAAA;AAAA;AAAA,SACP;AAAA,QAEF,KAAM,EAAA;AAAA;AAAA,KACR;AAAA,oBACA,GAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,QAAS,EAAA,MAAA;AAAA,QACT,IAAA,EAAM,MAAO,CAAA,IAAA,CAAK,MAAQ,EAAA;AAAA;AAAA;AAAA;AAAA,UAIxB,QAAA,EAAU,CAAC,GAAA,EAAa,KAAuB,KAAA;AAC7C,YAAA,IAAI,CAAC,aAAe,EAAA;AAClB,cAAO,OAAA,GAAA,KAAQ,kBAAkB,KAAY,CAAA,GAAA,KAAA;AAAA;AAE/C,YAAO,OAAA,KAAA;AAAA;AACT,SACD;AAAA;AAAA;AACH,GACF,EAAA,CAAA;AAEJ;;;;"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
1
2
|
import 'xterm/css/xterm.css';
|
|
2
3
|
import { useApi, discoveryApiRef } from '@backstage/core-plugin-api';
|
|
3
4
|
import { makeStyles, createStyles } from '@material-ui/core/styles';
|
|
4
|
-
import
|
|
5
|
+
import { useState, useRef, useEffect, useMemo } from 'react';
|
|
5
6
|
import { Terminal } from 'xterm';
|
|
6
7
|
import { FitAddon } from 'xterm-addon-fit';
|
|
7
8
|
import { PodExecTerminalAttachAddon } from './PodExecTerminalAttachAddon.esm.js';
|
|
@@ -20,7 +21,7 @@ const PodExecTerminal = (props) => {
|
|
|
20
21
|
const classes = useStyles();
|
|
21
22
|
const { containerName, podNamespace, podName } = props;
|
|
22
23
|
const [baseUrl, setBaseUrl] = useState(window.location.host);
|
|
23
|
-
const terminalRef =
|
|
24
|
+
const terminalRef = useRef(null);
|
|
24
25
|
const discoveryApi = useApi(discoveryApiRef);
|
|
25
26
|
const namespace = podNamespace ?? "default";
|
|
26
27
|
useEffect(() => {
|
|
@@ -74,7 +75,7 @@ const PodExecTerminal = (props) => {
|
|
|
74
75
|
socket?.close();
|
|
75
76
|
};
|
|
76
77
|
}, [baseUrl, socketUrl]);
|
|
77
|
-
return /* @__PURE__ */
|
|
78
|
+
return /* @__PURE__ */ jsx(
|
|
78
79
|
"div",
|
|
79
80
|
{
|
|
80
81
|
"data-testid": "terminal",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PodExecTerminal.esm.js","sources":["../../../src/components/PodExecTerminal/PodExecTerminal.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 'xterm/css/xterm.css';\n\nimport { discoveryApiRef, useApi } from '@backstage/core-plugin-api';\nimport { ClusterAttributes } from '@backstage/plugin-kubernetes-common';\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\nimport
|
|
1
|
+
{"version":3,"file":"PodExecTerminal.esm.js","sources":["../../../src/components/PodExecTerminal/PodExecTerminal.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 'xterm/css/xterm.css';\n\nimport { discoveryApiRef, useApi } from '@backstage/core-plugin-api';\nimport { ClusterAttributes } from '@backstage/plugin-kubernetes-common';\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\nimport { useRef, useEffect, useMemo, useState } from 'react';\nimport { Terminal } from 'xterm';\nimport { FitAddon } from 'xterm-addon-fit';\n\nimport { PodExecTerminalAttachAddon } from './PodExecTerminalAttachAddon';\n\n/**\n * Props drilled down to the PodExecTerminal component\n *\n * @public\n */\nexport interface PodExecTerminalProps {\n cluster: ClusterAttributes;\n containerName: string;\n podName: string;\n podNamespace: string;\n}\n\nconst hasSocketProtocol = (url: string | URL) =>\n /wss?:\\/\\//.test(url.toString());\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n podExecTerminal: {\n width: '100%',\n height: '100%',\n '& .xterm-screen': { padding: theme.spacing(1) },\n },\n }),\n);\n\n/**\n * Executes a `/bin/sh` process in the given pod's container and opens a terminal connected to it\n *\n * @public\n */\nexport const PodExecTerminal = (props: PodExecTerminalProps) => {\n const classes = useStyles();\n const { containerName, podNamespace, podName } = props;\n\n const [baseUrl, setBaseUrl] = useState(window.location.host);\n\n const terminalRef = useRef(null);\n const discoveryApi = useApi(discoveryApiRef);\n const namespace = podNamespace ?? 'default';\n\n useEffect(() => {\n discoveryApi\n .getBaseUrl('kubernetes')\n .then(url => url ?? window.location.host)\n .then(url => url.replace(/^http(s?):\\/\\//, 'ws$1://'))\n .then(url => setBaseUrl(url));\n }, [discoveryApi]);\n\n const urlParams = useMemo(() => {\n const params = new URLSearchParams({\n container: containerName,\n stdin: 'true',\n stdout: 'true',\n stderr: 'true',\n tty: 'true',\n command: '/bin/sh',\n });\n return params;\n }, [containerName]);\n\n const socketUrl = useMemo(() => {\n if (!hasSocketProtocol(baseUrl)) {\n return '';\n }\n\n return new URL(\n `${baseUrl}/proxy/api/v1/namespaces/${namespace}/pods/${podName}/exec?${urlParams}`,\n );\n }, [baseUrl, namespace, podName, urlParams]);\n\n useEffect(() => {\n if (!hasSocketProtocol(socketUrl)) {\n return () => {};\n }\n\n const terminal = new Terminal();\n const fitAddon = new FitAddon();\n terminal.loadAddon(fitAddon);\n\n if (terminalRef.current) {\n terminal.open(terminalRef.current);\n fitAddon.fit();\n }\n\n terminal.writeln('Starting terminal, please wait...');\n\n const socket = new WebSocket(socketUrl, ['channel.k8s.io']);\n\n socket.onopen = () => {\n terminal.clear();\n const attachAddon = new PodExecTerminalAttachAddon(socket, {\n bidirectional: true,\n });\n\n terminal.loadAddon(attachAddon);\n };\n\n socket.onclose = () => {\n terminal.writeln('Socket connection closed');\n };\n\n return () => {\n terminal?.clear();\n socket?.close();\n };\n }, [baseUrl, socketUrl]);\n\n return (\n <div\n data-testid=\"terminal\"\n ref={terminalRef}\n className={classes.podExecTerminal}\n />\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
1
2
|
import OpenInBrowserIcon from '@material-ui/icons/OpenInBrowser';
|
|
2
|
-
import React__default from 'react';
|
|
3
3
|
import { KubernetesDialog } from '../KubernetesDialog/KubernetesDialog.esm.js';
|
|
4
4
|
import '@backstage/core-plugin-api';
|
|
5
5
|
import { useIsPodExecTerminalSupported } from '../../hooks/useIsPodExecTerminalSupported.esm.js';
|
|
6
|
+
import 'react';
|
|
6
7
|
import 'react-use/esm/useInterval';
|
|
7
8
|
import 'react-use/esm/useAsyncRetry';
|
|
8
9
|
import '../../kubernetes-auth-provider/types.esm.js';
|
|
@@ -18,16 +19,16 @@ import { PodExecTerminal } from './PodExecTerminal.esm.js';
|
|
|
18
19
|
const PodExecTerminalDialog = (props) => {
|
|
19
20
|
const { cluster, containerName, podName } = props;
|
|
20
21
|
const isPodExecTerminalSupported = useIsPodExecTerminalSupported();
|
|
21
|
-
return !isPodExecTerminalSupported.loading && isPodExecTerminalSupported.value && /* @__PURE__ */
|
|
22
|
+
return !isPodExecTerminalSupported.loading && isPodExecTerminalSupported.value && /* @__PURE__ */ jsx(
|
|
22
23
|
KubernetesDialog,
|
|
23
24
|
{
|
|
24
25
|
buttonAriaLabel: "open terminal",
|
|
25
|
-
buttonIcon: /* @__PURE__ */
|
|
26
|
+
buttonIcon: /* @__PURE__ */ jsx(OpenInBrowserIcon, {}),
|
|
26
27
|
buttonText: "Terminal",
|
|
27
28
|
disabled: isPodExecTerminalSupported.loading || !isPodExecTerminalSupported.value,
|
|
28
|
-
title: `${podName} - ${containerName} terminal shell on cluster ${cluster.title || cluster.name}
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
title: `${podName} - ${containerName} terminal shell on cluster ${cluster.title || cluster.name}`,
|
|
30
|
+
children: /* @__PURE__ */ jsx(PodExecTerminal, { ...props })
|
|
31
|
+
}
|
|
31
32
|
);
|
|
32
33
|
};
|
|
33
34
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PodExecTerminalDialog.esm.js","sources":["../../../src/components/PodExecTerminal/PodExecTerminalDialog.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 */\n\nimport OpenInBrowserIcon from '@material-ui/icons/OpenInBrowser';\
|
|
1
|
+
{"version":3,"file":"PodExecTerminalDialog.esm.js","sources":["../../../src/components/PodExecTerminal/PodExecTerminalDialog.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 */\n\nimport OpenInBrowserIcon from '@material-ui/icons/OpenInBrowser';\n\nimport { KubernetesDialog } from '../KubernetesDialog';\nimport { useIsPodExecTerminalSupported } from '../../hooks';\nimport { PodExecTerminal, PodExecTerminalProps } from './PodExecTerminal';\n\n/**\n * Opens a terminal connected to the given pod's container in a dialog\n *\n * @public\n */\nexport const PodExecTerminalDialog = (props: PodExecTerminalProps) => {\n const { cluster, containerName, podName } = props;\n\n const isPodExecTerminalSupported = useIsPodExecTerminalSupported();\n\n return (\n !isPodExecTerminalSupported.loading &&\n isPodExecTerminalSupported.value && (\n <KubernetesDialog\n buttonAriaLabel=\"open terminal\"\n buttonIcon={<OpenInBrowserIcon />}\n buttonText=\"Terminal\"\n disabled={\n isPodExecTerminalSupported.loading ||\n !isPodExecTerminalSupported.value\n }\n title={`${podName} - ${containerName} terminal shell on cluster ${\n cluster.title || cluster.name\n }`}\n >\n <PodExecTerminal {...props} />\n </KubernetesDialog>\n )\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AA2Ba,MAAA,qBAAA,GAAwB,CAAC,KAAgC,KAAA;AACpE,EAAA,MAAM,EAAE,OAAA,EAAS,aAAe,EAAA,OAAA,EAAY,GAAA,KAAA;AAE5C,EAAA,MAAM,6BAA6B,6BAA8B,EAAA;AAEjE,EAAA,OACE,CAAC,0BAAA,CAA2B,OAC5B,IAAA,0BAAA,CAA2B,KACzB,oBAAA,GAAA;AAAA,IAAC,gBAAA;AAAA,IAAA;AAAA,MACC,eAAgB,EAAA,eAAA;AAAA,MAChB,UAAA,sBAAa,iBAAkB,EAAA,EAAA,CAAA;AAAA,MAC/B,UAAW,EAAA,UAAA;AAAA,MACX,QACE,EAAA,0BAAA,CAA2B,OAC3B,IAAA,CAAC,0BAA2B,CAAA,KAAA;AAAA,MAE9B,KAAA,EAAO,GAAG,OAAO,CAAA,GAAA,EAAM,aAAa,CAClC,2BAAA,EAAA,OAAA,CAAQ,KAAS,IAAA,OAAA,CAAQ,IAC3B,CAAA,CAAA;AAAA,MAEA,QAAA,kBAAA,GAAA,CAAC,eAAiB,EAAA,EAAA,GAAG,KAAO,EAAA;AAAA;AAAA,GAC9B;AAGN;;;;"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { Fragment } from 'react';
|
|
2
3
|
import List from '@material-ui/core/List';
|
|
3
4
|
import ListItem from '@material-ui/core/ListItem';
|
|
4
5
|
import ListItemText from '@material-ui/core/ListItemText';
|
|
@@ -20,31 +21,36 @@ const useStyles = makeStyles(
|
|
|
20
21
|
);
|
|
21
22
|
const ErrorList = ({ podAndErrors }) => {
|
|
22
23
|
const classes = useStyles();
|
|
23
|
-
return /* @__PURE__ */
|
|
24
|
+
return /* @__PURE__ */ jsx(Paper, { className: classes.root, children: /* @__PURE__ */ jsx(List, { className: classes.list, children: podAndErrors.filter((pae) => pae.errors.length > 0).flatMap((onlyPodWithErrors) => {
|
|
24
25
|
return onlyPodWithErrors.errors.map((error, i) => {
|
|
25
|
-
return /* @__PURE__ */
|
|
26
|
-
|
|
26
|
+
return /* @__PURE__ */ jsxs(
|
|
27
|
+
Fragment,
|
|
27
28
|
{
|
|
28
|
-
|
|
29
|
+
children: [
|
|
30
|
+
i > 0 && /* @__PURE__ */ jsx(Divider, {}, `error-divider${i}`),
|
|
31
|
+
/* @__PURE__ */ jsx(ListItem, { children: /* @__PURE__ */ jsxs(Grid, { container: true, children: [
|
|
32
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 9, children: /* @__PURE__ */ jsx(
|
|
33
|
+
ListItemText,
|
|
34
|
+
{
|
|
35
|
+
primary: error.message,
|
|
36
|
+
secondary: onlyPodWithErrors.pod.metadata?.name
|
|
37
|
+
}
|
|
38
|
+
) }),
|
|
39
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 3, children: /* @__PURE__ */ jsx(
|
|
40
|
+
FixDialog,
|
|
41
|
+
{
|
|
42
|
+
pod: onlyPodWithErrors.pod,
|
|
43
|
+
error,
|
|
44
|
+
clusterName: onlyPodWithErrors.cluster.name
|
|
45
|
+
}
|
|
46
|
+
) })
|
|
47
|
+
] }) })
|
|
48
|
+
]
|
|
29
49
|
},
|
|
30
|
-
|
|
31
|
-
/* @__PURE__ */ React__default.createElement(ListItem, null, /* @__PURE__ */ React__default.createElement(Grid, { container: true }, /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 9 }, /* @__PURE__ */ React__default.createElement(
|
|
32
|
-
ListItemText,
|
|
33
|
-
{
|
|
34
|
-
primary: error.message,
|
|
35
|
-
secondary: onlyPodWithErrors.pod.metadata?.name
|
|
36
|
-
}
|
|
37
|
-
)), /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 3 }, /* @__PURE__ */ React__default.createElement(
|
|
38
|
-
FixDialog,
|
|
39
|
-
{
|
|
40
|
-
pod: onlyPodWithErrors.pod,
|
|
41
|
-
error,
|
|
42
|
-
clusterName: onlyPodWithErrors.cluster.name
|
|
43
|
-
}
|
|
44
|
-
))))
|
|
50
|
+
`${onlyPodWithErrors.pod.metadata?.name ?? "unknown"}-eli-${i}`
|
|
45
51
|
);
|
|
46
52
|
});
|
|
47
|
-
})));
|
|
53
|
+
}) }) });
|
|
48
54
|
};
|
|
49
55
|
|
|
50
56
|
export { ErrorList };
|
|
@@ -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
|
|
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 { Fragment } 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 <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 </Fragment>\n );\n });\n })}\n </List>\n </Paper>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;AA2BA,MAAM,SAAY,GAAA,UAAA;AAAA,EAAW,CAAC,WAC5B,YAAa,CAAA;AAAA,IACX,IAAM,EAAA;AAAA,MACJ,QAAU,EAAA;AAAA,KACZ;AAAA,IACA,IAAM,EAAA;AAAA,MACJ,KAAO,EAAA;AAAA;AACT,GACD;AACH,CAAA;AAgBO,MAAM,SAAY,GAAA,CAAC,EAAE,YAAA,EAAmC,KAAA;AAC7D,EAAA,MAAM,UAAU,SAAU,EAAA;AAC1B,EAAA,2BACG,KAAM,EAAA,EAAA,SAAA,EAAW,QAAQ,IACxB,EAAA,QAAA,kBAAA,GAAA,CAAC,QAAK,SAAW,EAAA,OAAA,CAAQ,MACtB,QACE,EAAA,YAAA,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,uBAAA,IAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAKE,QAAA,EAAA;AAAA,YAAA,CAAA,GAAI,CAAK,oBAAA,GAAA,CAAC,OAAa,EAAA,EAAA,EAAA,CAAA,aAAA,EAAgB,CAAC,CAAI,CAAA,CAAA;AAAA,4BAC5C,GAAA,CAAA,QAAA,EAAA,EACC,QAAC,kBAAA,IAAA,CAAA,IAAA,EAAA,EAAK,WAAS,IACb,EAAA,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,CACb,EAAA,QAAA,kBAAA,GAAA;AAAA,gBAAC,YAAA;AAAA,gBAAA;AAAA,kBACC,SAAS,KAAM,CAAA,OAAA;AAAA,kBACf,SAAA,EAAW,iBAAkB,CAAA,GAAA,CAAI,QAAU,EAAA;AAAA;AAAA,eAE/C,EAAA,CAAA;AAAA,8BACC,GAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,IAAI,CACb,EAAA,QAAA,kBAAA,GAAA;AAAA,gBAAC,SAAA;AAAA,gBAAA;AAAA,kBACC,KAAK,iBAAkB,CAAA,GAAA;AAAA,kBACvB,KAAA;AAAA,kBACA,WAAA,EAAa,kBAAkB,OAAQ,CAAA;AAAA;AAAA,eAE3C,EAAA;AAAA,aAAA,EACF,CACF,EAAA;AAAA;AAAA,SAAA;AAAA,QArBK,GACH,iBAAkB,CAAA,GAAA,CAAI,UAAU,IAAQ,IAAA,SAC1C,QAAQ,CAAC,CAAA;AAAA,OAoBX;AAAA,KAEH,CAAA;AAAA,GACF,GACL,CACF,EAAA,CAAA;AAEJ;;;;"}
|