@jfvilas/plugin-kwirth-log 0.13.5 → 0.14.2
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/dist/components/EntityKwirthLogContent.esm.js +40 -40
- package/dist/components/EntityKwirthLogContent.esm.js.map +1 -1
- package/dist/components/Options.esm.js +1 -1
- package/dist/components/Options.esm.js.map +1 -1
- package/dist/index.d.ts +5 -4
- package/dist/version.esm.js +1 -1
- package/dist/version.esm.js.map +1 -1
- package/package.json +16 -9
|
@@ -5,7 +5,7 @@ import { useApi, alertApiRef } from '@backstage/core-plugin-api';
|
|
|
5
5
|
import { isKwirthAvailable, ANNOTATION_BACKSTAGE_KUBERNETES_LABELID, ANNOTATION_BACKSTAGE_KUBERNETES_LABELSELECTOR, getPodList, getContainerList } from '@jfvilas/plugin-kwirth-common';
|
|
6
6
|
import { useEntity, MissingAnnotationEmptyState } from '@backstage/plugin-catalog-react';
|
|
7
7
|
import { kwirthLogApiRef } from '../api/types.esm.js';
|
|
8
|
-
import {
|
|
8
|
+
import { ESignalMessageLevel, InstanceConfigScopeEnum, InstanceMessageChannelEnum, EInstanceMessageType, EOpsCommand, accessKeySerialize, EInstanceMessageFlow, EInstanceMessageAction, EInstanceConfigView, EInstanceConfigObject } from '@jfvilas/kwirth-common';
|
|
9
9
|
import { Options } from './Options.esm.js';
|
|
10
10
|
import { ComponentNotFound, ErrorType, ClusterList, KwirthNews, ObjectSelector, StatusLog } from '@jfvilas/plugin-kwirth-frontend';
|
|
11
11
|
import { Box, Grid, Card, CardHeader, TextField, InputAdornment, CardContent } from '@material-ui/core';
|
|
@@ -50,7 +50,7 @@ const EntityKwirthLogContent = (props) => {
|
|
|
50
50
|
wrapLines: props.wrapLines !== void 0 ? props.wrapLines : false
|
|
51
51
|
});
|
|
52
52
|
const [showStatusDialog, setShowStatusDialog] = useState(false);
|
|
53
|
-
const [statusLevel, setStatusLevel] = useState(
|
|
53
|
+
const [statusLevel, setStatusLevel] = useState(ESignalMessageLevel.INFO);
|
|
54
54
|
const preRef = useRef(null);
|
|
55
55
|
const lastRef = useRef(null);
|
|
56
56
|
const [backendVersion, setBackendVersion] = useState("");
|
|
@@ -70,7 +70,7 @@ const EntityKwirthLogContent = (props) => {
|
|
|
70
70
|
const logBoxRef = useRef(null);
|
|
71
71
|
const [logBoxTop, setLogBoxTop] = useState(0);
|
|
72
72
|
const adornmentSelected = { margin: 0, borderWidth: 1, borderStyle: "solid", borderColor: "gray", paddingLeft: 3, paddingRight: 3, backgroundColor: "gray", cursor: "pointer", color: "white" };
|
|
73
|
-
const adornmentNotSelected = { margin: 0, borderWidth: 1, borderStyle: "solid",
|
|
73
|
+
const adornmentNotSelected = { margin: 0, borderWidth: 1, borderStyle: "solid", paddingLeft: 3, paddingRight: 3, cursor: "pointer" };
|
|
74
74
|
useEffect(() => {
|
|
75
75
|
if (logBoxRef.current) setLogBoxTop(logBoxRef.current.getBoundingClientRect().top);
|
|
76
76
|
});
|
|
@@ -114,7 +114,7 @@ const EntityKwirthLogContent = (props) => {
|
|
|
114
114
|
setSelectedContainerNames(getContainerList(cluster.pods, validNamespaces, podList.map((pod) => pod.name), props.excludeContainers || []));
|
|
115
115
|
} else {
|
|
116
116
|
setMessages([{
|
|
117
|
-
type:
|
|
117
|
+
type: EInstanceMessageType.SIGNAL,
|
|
118
118
|
text: "Select namespace in order to decide which pod logs to view.",
|
|
119
119
|
namespace: "",
|
|
120
120
|
pod: "",
|
|
@@ -128,7 +128,7 @@ const EntityKwirthLogContent = (props) => {
|
|
|
128
128
|
const processLogMessage = (wsEvent) => {
|
|
129
129
|
let instanceMessage = JSON.parse(wsEvent.data);
|
|
130
130
|
switch (instanceMessage.type) {
|
|
131
|
-
case
|
|
131
|
+
case EInstanceMessageType.DATA:
|
|
132
132
|
let logMessage = instanceMessage;
|
|
133
133
|
let bname = logMessage.namespace + "/" + logMessage.pod + "/" + logMessage.container;
|
|
134
134
|
let text = logMessage.text;
|
|
@@ -164,8 +164,8 @@ const EntityKwirthLogContent = (props) => {
|
|
|
164
164
|
}
|
|
165
165
|
}
|
|
166
166
|
break;
|
|
167
|
-
case
|
|
168
|
-
if (instanceMessage.flow ===
|
|
167
|
+
case EInstanceMessageType.SIGNAL:
|
|
168
|
+
if (instanceMessage.flow === EInstanceMessageFlow.RESPONSE && instanceMessage.action === EInstanceMessageAction.START) {
|
|
169
169
|
if (instanceMessage.instance !== "")
|
|
170
170
|
setInstance(instanceMessage.instance);
|
|
171
171
|
else {
|
|
@@ -179,13 +179,13 @@ const EntityKwirthLogContent = (props) => {
|
|
|
179
179
|
if (signalMessage.text) {
|
|
180
180
|
addMessage(signalMessage.level, signalMessage.text);
|
|
181
181
|
switch (signalMessage.level) {
|
|
182
|
-
case
|
|
182
|
+
case ESignalMessageLevel.INFO:
|
|
183
183
|
alertApi.post({ message: signalMessage.text, severity: "info", display: "transient" });
|
|
184
184
|
break;
|
|
185
|
-
case
|
|
185
|
+
case ESignalMessageLevel.WARNING:
|
|
186
186
|
alertApi.post({ message: signalMessage.text, severity: "warning", display: "transient" });
|
|
187
187
|
break;
|
|
188
|
-
case
|
|
188
|
+
case ESignalMessageLevel.ERROR:
|
|
189
189
|
alertApi.post({ message: signalMessage.text, severity: "error", display: "transient" });
|
|
190
190
|
break;
|
|
191
191
|
default:
|
|
@@ -196,7 +196,7 @@ const EntityKwirthLogContent = (props) => {
|
|
|
196
196
|
}
|
|
197
197
|
break;
|
|
198
198
|
default:
|
|
199
|
-
addMessage(
|
|
199
|
+
addMessage(ESignalMessageLevel.ERROR, "Invalid message type received: " + instanceMessage.type);
|
|
200
200
|
alertApi.post({ message: "Invalid message type received: " + instanceMessage.type, severity: "error", display: "transient" });
|
|
201
201
|
break;
|
|
202
202
|
}
|
|
@@ -205,7 +205,7 @@ const EntityKwirthLogContent = (props) => {
|
|
|
205
205
|
setStatusMessages((prev) => [...prev, {
|
|
206
206
|
level,
|
|
207
207
|
text,
|
|
208
|
-
type:
|
|
208
|
+
type: EInstanceMessageType.SIGNAL
|
|
209
209
|
}]);
|
|
210
210
|
};
|
|
211
211
|
const websocketOnMessage = (wsEvent) => {
|
|
@@ -224,25 +224,25 @@ const EntityKwirthLogContent = (props) => {
|
|
|
224
224
|
case InstanceMessageChannelEnum.OPS:
|
|
225
225
|
let opsMessage = instanceMessage;
|
|
226
226
|
if (opsMessage.data?.data)
|
|
227
|
-
addMessage(
|
|
227
|
+
addMessage(ESignalMessageLevel.WARNING, "Operations message: " + opsMessage.data.data);
|
|
228
228
|
else
|
|
229
|
-
addMessage(
|
|
229
|
+
addMessage(ESignalMessageLevel.WARNING, "Operations message: " + JSON.stringify(opsMessage));
|
|
230
230
|
break;
|
|
231
231
|
default:
|
|
232
|
-
addMessage(
|
|
233
|
-
addMessage(
|
|
232
|
+
addMessage(ESignalMessageLevel.ERROR, "Invalid channel in message: " + instanceMessage.channel);
|
|
233
|
+
addMessage(ESignalMessageLevel.ERROR, "Invalid message: " + JSON.stringify(instanceMessage));
|
|
234
234
|
break;
|
|
235
235
|
}
|
|
236
236
|
};
|
|
237
237
|
const websocketOnOpen = (ws, options) => {
|
|
238
238
|
let cluster = validClusters.find((cluster2) => cluster2.name === selectedClusterName);
|
|
239
239
|
if (!cluster) {
|
|
240
|
-
addMessage(
|
|
240
|
+
addMessage(ESignalMessageLevel.ERROR, "No cluster selected");
|
|
241
241
|
return;
|
|
242
242
|
}
|
|
243
243
|
let pods = cluster.pods.filter((p2) => selectedNamespaces.includes(p2.namespace));
|
|
244
244
|
if (!pods) {
|
|
245
|
-
addMessage(
|
|
245
|
+
addMessage(ESignalMessageLevel.ERROR, "No pods found");
|
|
246
246
|
return;
|
|
247
247
|
}
|
|
248
248
|
console.log(`WS connected`);
|
|
@@ -258,13 +258,13 @@ const EntityKwirthLogContent = (props) => {
|
|
|
258
258
|
}
|
|
259
259
|
let iConfig = {
|
|
260
260
|
channel: InstanceMessageChannelEnum.LOG,
|
|
261
|
-
objects:
|
|
262
|
-
action:
|
|
263
|
-
flow:
|
|
261
|
+
objects: EInstanceConfigObject.PODS,
|
|
262
|
+
action: EInstanceMessageAction.START,
|
|
263
|
+
flow: EInstanceMessageFlow.REQUEST,
|
|
264
264
|
instance: "",
|
|
265
265
|
accessKey: accessKeySerialize(accessKey),
|
|
266
266
|
scope: InstanceConfigScopeEnum.VIEW,
|
|
267
|
-
view: selectedContainerNames.length > 0 ?
|
|
267
|
+
view: selectedContainerNames.length > 0 ? EInstanceConfigView.CONTAINER : EInstanceConfigView.POD,
|
|
268
268
|
namespace: selectedNamespaces.join(","),
|
|
269
269
|
group: "",
|
|
270
270
|
pod: selectedPodNames.map((p2) => p2).join(","),
|
|
@@ -275,18 +275,18 @@ const EntityKwirthLogContent = (props) => {
|
|
|
275
275
|
maxMessages: LOG_MAX_MESSAGES,
|
|
276
276
|
fromStart: options.fromStart
|
|
277
277
|
},
|
|
278
|
-
type:
|
|
278
|
+
type: EInstanceMessageType.SIGNAL
|
|
279
279
|
};
|
|
280
280
|
ws.send(JSON.stringify(iConfig));
|
|
281
281
|
} else {
|
|
282
|
-
addMessage(
|
|
282
|
+
addMessage(ESignalMessageLevel.ERROR, "No accessKey for starting log streaming");
|
|
283
283
|
return;
|
|
284
284
|
}
|
|
285
285
|
};
|
|
286
286
|
const startLogViewer = (options) => {
|
|
287
287
|
let cluster = validClusters.find((cluster2) => cluster2.name === selectedClusterName);
|
|
288
288
|
if (!cluster) {
|
|
289
|
-
addMessage(
|
|
289
|
+
addMessage(ESignalMessageLevel.ERROR, "No cluster selected");
|
|
290
290
|
return;
|
|
291
291
|
}
|
|
292
292
|
setMessages([]);
|
|
@@ -298,7 +298,7 @@ const EntityKwirthLogContent = (props) => {
|
|
|
298
298
|
setWebsocket(ws);
|
|
299
299
|
} catch (err) {
|
|
300
300
|
setMessages([{
|
|
301
|
-
type:
|
|
301
|
+
type: EInstanceMessageType.DATA,
|
|
302
302
|
text: `Error opening log stream: ${err}`,
|
|
303
303
|
namespace: "",
|
|
304
304
|
pod: "",
|
|
@@ -314,7 +314,7 @@ const EntityKwirthLogContent = (props) => {
|
|
|
314
314
|
};
|
|
315
315
|
const stopLogViewer = () => {
|
|
316
316
|
messages.push({
|
|
317
|
-
type:
|
|
317
|
+
type: EInstanceMessageType.DATA,
|
|
318
318
|
text: "============================================================================================================================",
|
|
319
319
|
namespace: "",
|
|
320
320
|
pod: "",
|
|
@@ -348,30 +348,30 @@ const EntityKwirthLogContent = (props) => {
|
|
|
348
348
|
const onClickRestart = () => {
|
|
349
349
|
var cluster = validClusters.find((cluster2) => cluster2.name === selectedClusterName);
|
|
350
350
|
if (!cluster) {
|
|
351
|
-
addMessage(
|
|
351
|
+
addMessage(ESignalMessageLevel.ERROR, "No cluster selected");
|
|
352
352
|
return;
|
|
353
353
|
}
|
|
354
354
|
let restartKey = cluster.accessKeys.get(InstanceConfigScopeEnum.RESTART);
|
|
355
355
|
if (!restartKey) {
|
|
356
|
-
addMessage(
|
|
356
|
+
addMessage(ESignalMessageLevel.ERROR, "No access key present");
|
|
357
357
|
return;
|
|
358
358
|
}
|
|
359
359
|
if (!instance) {
|
|
360
|
-
addMessage(
|
|
360
|
+
addMessage(ESignalMessageLevel.ERROR, "No instance has been established");
|
|
361
361
|
return;
|
|
362
362
|
}
|
|
363
363
|
let pods = cluster.pods.filter((pod) => selectedNamespaces.includes(pod.namespace));
|
|
364
364
|
for (let pod of pods) {
|
|
365
365
|
let opsMessage = {
|
|
366
366
|
msgtype: "opsmessage",
|
|
367
|
-
action:
|
|
368
|
-
flow:
|
|
369
|
-
type:
|
|
367
|
+
action: EInstanceMessageAction.COMMAND,
|
|
368
|
+
flow: EInstanceMessageFlow.IMMEDIATE,
|
|
369
|
+
type: EInstanceMessageType.DATA,
|
|
370
370
|
channel: InstanceMessageChannelEnum.OPS,
|
|
371
371
|
instance: "",
|
|
372
372
|
id: "1",
|
|
373
373
|
accessKey: accessKeySerialize(restartKey),
|
|
374
|
-
command:
|
|
374
|
+
command: EOpsCommand.RESTARTPOD,
|
|
375
375
|
namespace: pod.namespace,
|
|
376
376
|
group: "",
|
|
377
377
|
pod: pod.name,
|
|
@@ -381,9 +381,9 @@ const EntityKwirthLogContent = (props) => {
|
|
|
381
381
|
msgtype: "routemessage",
|
|
382
382
|
accessKey: accessKeySerialize(restartKey),
|
|
383
383
|
destChannel: InstanceMessageChannelEnum.OPS,
|
|
384
|
-
action:
|
|
385
|
-
flow:
|
|
386
|
-
type:
|
|
384
|
+
action: EInstanceMessageAction.ROUTE,
|
|
385
|
+
flow: EInstanceMessageFlow.IMMEDIATE,
|
|
386
|
+
type: EInstanceMessageType.SIGNAL,
|
|
387
387
|
channel: InstanceMessageChannelEnum.LOG,
|
|
388
388
|
instance,
|
|
389
389
|
data: opsMessage
|
|
@@ -408,7 +408,7 @@ const EntityKwirthLogContent = (props) => {
|
|
|
408
408
|
const prepareText = (txt) => {
|
|
409
409
|
return txt ? txt.length > 25 ? txt.substring(0, 25) + "..." : txt : "N/A";
|
|
410
410
|
};
|
|
411
|
-
return /* @__PURE__ */ React.createElement(Grid, { container: true, direction: "row" }, /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(Typography, { variant: "h5" }, prepareText(title))), /* @__PURE__ */ React.createElement(Grid, { item: true, style: { marginTop: "-8px" } }, /* @__PURE__ */ React.createElement(IconButton, { title: "info", disabled: !statusMessages.some((m) => m.type ===
|
|
411
|
+
return /* @__PURE__ */ React.createElement(Grid, { container: true, direction: "row" }, /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(Typography, { variant: "h5" }, prepareText(title))), /* @__PURE__ */ React.createElement(Grid, { item: true, style: { marginTop: "-8px" } }, /* @__PURE__ */ React.createElement(IconButton, { title: "info", disabled: !statusMessages.some((m) => m.type === EInstanceMessageType.SIGNAL && m.level === ESignalMessageLevel.INFO), onClick: () => show(ESignalMessageLevel.INFO) }, /* @__PURE__ */ React.createElement(InfoIcon, { style: { color: statusMessages.some((m) => m.type === EInstanceMessageType.SIGNAL && m.level === ESignalMessageLevel.INFO) ? "#1D63ED" : "#BDBDBD" } })), /* @__PURE__ */ React.createElement(IconButton, { title: "warning", disabled: !statusMessages.some((m) => m.type === EInstanceMessageType.SIGNAL && m.level === ESignalMessageLevel.WARNING), onClick: () => show(ESignalMessageLevel.WARNING), style: { marginLeft: "-16px" } }, /* @__PURE__ */ React.createElement(WarningIcon, { style: { color: statusMessages.some((m) => m.type === EInstanceMessageType.SIGNAL && m.level === ESignalMessageLevel.WARNING) ? "orange" : "#BDBDBD" } })), /* @__PURE__ */ React.createElement(IconButton, { title: "error", disabled: !statusMessages.some((m) => m.type === EInstanceMessageType.SIGNAL && m.level === ESignalMessageLevel.ERROR), onClick: () => show(ESignalMessageLevel.ERROR), style: { marginLeft: "-16px" } }, /* @__PURE__ */ React.createElement(ErrorIcon, { style: { color: statusMessages.some((m) => m.type === EInstanceMessageType.SIGNAL && m.level === ESignalMessageLevel.ERROR) ? "red" : "#BDBDBD" } }))));
|
|
412
412
|
};
|
|
413
413
|
const statusClear = (level) => {
|
|
414
414
|
setStatusMessages(statusMessages.filter((m) => m.level !== level));
|
|
@@ -422,7 +422,7 @@ const EntityKwirthLogContent = (props) => {
|
|
|
422
422
|
const onChangeFilter = (event) => {
|
|
423
423
|
setFilter(event.target?.value);
|
|
424
424
|
};
|
|
425
|
-
const
|
|
425
|
+
const formatLogLine = (logLine) => {
|
|
426
426
|
if (!logLine.pod) {
|
|
427
427
|
return /* @__PURE__ */ React.createElement(React.Fragment, null, logLine.text + "\n");
|
|
428
428
|
}
|
|
@@ -484,7 +484,7 @@ const EntityKwirthLogContent = (props) => {
|
|
|
484
484
|
endAdornment: /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(InputAdornment, { position: "start", onClick: () => started && setFilterRegex(!filterRegex), style: { margin: 0 } }, /* @__PURE__ */ React.createElement(Typography, { style: filterRegex ? adornmentSelected : adornmentNotSelected }, ".*")), /* @__PURE__ */ React.createElement(InputAdornment, { position: "start", onClick: () => started && setFilterCasing(!filterCasing), style: { margin: 0, marginLeft: 1 } }, /* @__PURE__ */ React.createElement(Typography, { style: filterCasing ? adornmentSelected : adornmentNotSelected }, "Aa")))
|
|
485
485
|
}
|
|
486
486
|
}
|
|
487
|
-
))), /* @__PURE__ */ React.createElement(Divider, null), /* @__PURE__ */ React.createElement(CardContent, { style: { flexGrow: 1, overflow: "hidden", display: "flex", flexDirection: "column" } }, /* @__PURE__ */ React.createElement(Box, { style: { overflowY: "auto", width: "100%", flexGrow: 1, height: `calc(100vh - ${logBoxTop}px - 25px)`, overflowX: kwirthLogOptionsRef.current.wrapLines ? "hidden" : "auto" } }, /* @__PURE__ */ React.createElement("pre", { ref: preRef, style: { whiteSpace: kwirthLogOptionsRef.current.wrapLines ? "pre-wrap" : "pre", wordBreak: kwirthLogOptionsRef.current.wrapLines ? "break-word" : "normal" } }, messages.map((m) =>
|
|
487
|
+
))), /* @__PURE__ */ React.createElement(Divider, null), /* @__PURE__ */ React.createElement(CardContent, { style: { flexGrow: 1, overflow: "hidden", display: "flex", flexDirection: "column" } }, /* @__PURE__ */ React.createElement(Box, { style: { overflowY: "auto", width: "100%", flexGrow: 1, height: `calc(100vh - ${logBoxTop}px - 25px)`, overflowX: kwirthLogOptionsRef.current.wrapLines ? "hidden" : "auto" } }, /* @__PURE__ */ React.createElement("pre", { ref: preRef, style: { whiteSpace: kwirthLogOptionsRef.current.wrapLines ? "pre-wrap" : "pre", wordBreak: kwirthLogOptionsRef.current.wrapLines ? "break-word" : "normal" } }, messages.map((m) => formatLogLine(m))), /* @__PURE__ */ React.createElement("span", { ref: lastRef }))))))), showStatusDialog && /* @__PURE__ */ React.createElement(StatusLog, { level: statusLevel, onClose: () => setShowStatusDialog(false), statusMessages, onClear: statusClear }));
|
|
488
488
|
};
|
|
489
489
|
|
|
490
490
|
export { EntityKwirthLogContent };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityKwirthLogContent.esm.js","sources":["../../src/components/EntityKwirthLogContent.tsx"],"sourcesContent":["/*\r\nCopyright 2025 Julio Fernandez\r\n\r\nLicensed under the Apache License, Version 2.0 (the \"License\");\r\nyou may not use this file except in compliance with the License.\r\nYou may obtain a copy of the License at\r\n\r\n http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nUnless required by applicable law or agreed to in writing, software\r\ndistributed under the License is distributed on an \"AS IS\" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n*/\r\nimport React, { useEffect, useRef, useState } from 'react'\r\nimport useAsync from 'react-use/esm/useAsync'\r\n\r\nimport { Progress, WarningPanel } from '@backstage/core-components'\r\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api'\r\nimport { ANNOTATION_BACKSTAGE_KUBERNETES_LABELID, ANNOTATION_BACKSTAGE_KUBERNETES_LABELSELECTOR, isKwirthAvailable, ClusterValidPods, PodData, ILogLine, IStatusLine, getPodList, getContainerList, IBackendInfo } from '@jfvilas/plugin-kwirth-common'\r\nimport { MissingAnnotationEmptyState, useEntity } from '@backstage/plugin-catalog-react'\r\n\r\n// kwirth\r\nimport { kwirthLogApiRef } from '../api'\r\nimport { accessKeySerialize, ILogMessage, InstanceMessageActionEnum, InstanceConfigScopeEnum, InstanceConfigViewEnum, IInstanceMessage, InstanceMessageTypeEnum, ISignalMessage, SignalMessageLevelEnum, InstanceConfigObjectEnum, InstanceConfig, InstanceMessageFlowEnum, InstanceMessageChannelEnum, IOpsMessage, OpsCommandEnum, IRouteMessage, IOpsMessageResponse } from '@jfvilas/kwirth-common'\r\n\r\n// kwirthlog components\r\nimport { IOptions } from './IOptions'\r\nimport { Options } from './Options'\r\nimport { KwirthNews, ComponentNotFound, ObjectSelector, StatusLog, ClusterList, ErrorType } from '@jfvilas/plugin-kwirth-frontend'\r\n\r\n// Material-UI\r\nimport { Grid, Card, CardHeader, CardContent, Box, TextField, InputAdornment, BoxProps } from '@material-ui/core'\r\nimport Divider from '@material-ui/core/Divider'\r\nimport IconButton from '@material-ui/core/IconButton'\r\nimport Typography from '@material-ui/core/Typography'\r\n\r\n// Icons\r\nimport PlayIcon from '@material-ui/icons/PlayArrow'\r\nimport PauseIcon from '@material-ui/icons/Pause'\r\nimport StopIcon from '@material-ui/icons/Stop'\r\nimport InfoIcon from '@material-ui/icons/Info'\r\nimport WarningIcon from '@material-ui/icons/Warning'\r\nimport ErrorIcon from '@material-ui/icons/Error'\r\nimport DownloadIcon from '@material-ui/icons/CloudDownload'\r\nimport KwirthLogLogo from '../assets/kwirthlog-logo.svg'\r\nimport RefreshIcon from '@material-ui/icons/Refresh'\r\nimport { VERSION } from '../version'\r\n\r\ntype BoxWithRefProps = BoxProps & { ref?: React.Ref<HTMLDivElement> }\r\nconst RefBox = Box as React.FC<BoxWithRefProps>\r\n\r\nconst LOG_MAX_MESSAGES=1000\r\n\r\nexport interface IEntityKwirthLogProps {\r\n enableRestart: boolean\r\n fromStart?: boolean\r\n showTimestamp?: boolean\r\n showNames?: boolean\r\n followLog?: boolean\r\n wrapLines?: boolean\r\n hideVersion?: boolean\r\n excludeContainers?: string[]\r\n}\r\n\r\nexport const EntityKwirthLogContent: React.FC<IEntityKwirthLogProps> = (props:IEntityKwirthLogProps) => { \r\n const { entity } = useEntity()\r\n const kwirthLogApi = useApi(kwirthLogApiRef)\r\n const alertApi = useApi(alertApiRef)\r\n const [validClusters, setResources] = useState<ClusterValidPods[]>([])\r\n const [selectedClusterName, setSelectedClusterName] = useState('')\r\n const [selectedNamespaces, setSelectedNamespaces] = useState<string[]>([])\r\n const [selectedPodNames, setSelectedPodNames] = useState<string[]>([])\r\n const [selectedContainerNames, setSelectedContainerNames] = useState<string[]>([])\r\n const [started, setStarted] = useState(false)\r\n const [stopped, setStopped] = useState(true)\r\n const paused=useRef<boolean>(false)\r\n const [messages, setMessages] = useState<ILogLine[]>([])\r\n const [pendingMessages, setPendingMessages] = useState<ILogLine[]>([])\r\n const [statusMessages, setStatusMessages] = useState<IStatusLine[]>([])\r\n const [websocket, setWebsocket] = useState<WebSocket>()\r\n const [instance, setInstance] = useState<string>()\r\n const kwirthLogOptionsRef = useRef<IOptions>({\r\n fromStart: props.fromStart!==undefined? props.fromStart : false, \r\n showTimestamp: props.showTimestamp!==undefined?props.showTimestamp:false, \r\n showNames: props.showNames!==undefined?props.showNames : true, \r\n followLog: props.followLog!==undefined? props.followLog : true, \r\n wrapLines: props.wrapLines!==undefined? props.wrapLines : false\r\n })\r\n const [showStatusDialog, setShowStatusDialog] = useState(false)\r\n const [statusLevel, setStatusLevel] = useState<SignalMessageLevelEnum>(SignalMessageLevelEnum.INFO)\r\n const preRef = useRef<HTMLPreElement|null>(null)\r\n const lastRef = useRef<HTMLPreElement|null>(null)\r\n const [ backendVersion, setBackendVersion ] = useState<string>('')\r\n const [ backendInfo, setBackendInfo ] = useState<IBackendInfo>()\r\n const { loading, error } = useAsync ( async () => {\r\n if (backendVersion==='') setBackendVersion(await kwirthLogApi.getVersion())\r\n if (!backendInfo) setBackendInfo(await kwirthLogApi.getInfo())\r\n let reqScopes = [InstanceConfigScopeEnum.VIEW]\r\n if (props.enableRestart) reqScopes.push(InstanceConfigScopeEnum.RESTART)\r\n let data:ClusterValidPods[] = await kwirthLogApi.requestAccess(entity, InstanceMessageChannelEnum.LOG, reqScopes)\r\n setResources(data)\r\n })\r\n const buffer = useRef<Map<string,string>>(new Map())\r\n const [filter, setFilter] = useState<string>('')\r\n const [filterCasing, setFilterCasing] = useState(false)\r\n const [filterRegex, setFilterRegex] = useState(false)\r\n const logBoxRef = useRef<HTMLDivElement | null>(null)\r\n const [logBoxTop, setLogBoxTop] = useState(0)\r\n\r\n const adornmentSelected= { margin: 0, borderWidth:1, borderStyle:'solid', borderColor:'gray', paddingLeft:3, paddingRight:3, backgroundColor:'gray', cursor: 'pointer', color:'white'}\r\n const adornmentNotSelected = { margin: 0, borderWidth:1, borderStyle: 'solid', borderColor:'#f0f0f0', backgroundColor:'#f0f0f0', paddingLeft:3, paddingRight:3, cursor:'pointer'}\r\n\r\n useEffect(() => {\r\n if (logBoxRef.current) setLogBoxTop(logBoxRef.current.getBoundingClientRect().top)\r\n })\r\n\r\n const clickStart = (options:IOptions) => {\r\n if (!paused.current) {\r\n setStarted(true)\r\n paused.current=false\r\n setStopped(false)\r\n startLogViewer(options)\r\n }\r\n else {\r\n setMessages( (prev) => [ ...prev, ...pendingMessages])\r\n setPendingMessages([])\r\n paused.current=false\r\n setStarted(true)\r\n }\r\n }\r\n\r\n const onClickPause = () => {\r\n setStarted(false)\r\n paused.current=true\r\n }\r\n\r\n const onClickStop = () => {\r\n setStarted(false)\r\n setStopped(true)\r\n paused.current=false\r\n stopLogViewer()\r\n }\r\n\r\n const onSelectCluster = (clusterName:string|undefined) => {\r\n if (started) onClickStop()\r\n if (clusterName) {\r\n setSelectedClusterName(clusterName)\r\n setSelectedPodNames([])\r\n setSelectedContainerNames([])\r\n setStatusMessages([])\r\n let cluster = validClusters.find(cluster => cluster.name === clusterName)\r\n\r\n if (cluster && cluster.pods) {\r\n let validNamespaces = Array.from(new Set(cluster.pods.map(pod => pod.namespace)))\r\n if (validNamespaces.length === 1) {\r\n setSelectedNamespaces(validNamespaces)\r\n let podList = getPodList (cluster.pods, validNamespaces)\r\n setSelectedPodNames(podList.map(pod => pod.name))\r\n setSelectedContainerNames(getContainerList(cluster.pods, validNamespaces, podList.map(pod => pod.name), props.excludeContainers || []))\r\n }\r\n else {\r\n setMessages([{\r\n type: InstanceMessageTypeEnum.SIGNAL,\r\n text: 'Select namespace in order to decide which pod logs to view.',\r\n namespace: '',\r\n pod: '',\r\n container: ''\r\n }])\r\n setSelectedNamespaces([])\r\n }\r\n }\r\n }\r\n }\r\n\r\n const processLogMessage = (wsEvent:any) => {\r\n let instanceMessage = JSON.parse(wsEvent.data) as IInstanceMessage\r\n switch (instanceMessage.type) {\r\n case InstanceMessageTypeEnum.DATA:\r\n let logMessage = instanceMessage as ILogMessage\r\n let bname = logMessage.namespace+'/'+logMessage.pod+'/'+logMessage.container\r\n let text = logMessage.text\r\n if (!buffer.current.has(bname)) buffer.current.set(bname,'')\r\n if (buffer.current.get(bname)) {\r\n text = buffer.current.get(bname) + text\r\n buffer.current.set(bname,'')\r\n }\r\n if (!text.endsWith('\\n')) {\r\n let i = text.lastIndexOf('\\n')\r\n buffer.current.set(bname,text.substring(i))\r\n text = text.substring(0,i)\r\n }\r\n\r\n for (let line of text.split('\\n')) {\r\n if (line.trim() === '') continue\r\n\r\n let logLine:ILogLine = {\r\n text: line,\r\n namespace: logMessage.namespace,\r\n pod: logMessage.pod,\r\n container: logMessage.container,\r\n type: logMessage.type\r\n }\r\n\r\n if (paused.current) {\r\n setPendingMessages((prev) => [ ...prev, logLine ])\r\n }\r\n else {\r\n setMessages((prev) => {\r\n while (prev.length>LOG_MAX_MESSAGES-1) {\r\n prev.splice(0,1)\r\n }\r\n if (kwirthLogOptionsRef.current.followLog && lastRef.current) lastRef.current.scrollIntoView({ behavior: 'instant', block: 'start' })\r\n return [ ...prev, logLine ]\r\n })\r\n }\r\n }\r\n break\r\n case InstanceMessageTypeEnum.SIGNAL:\r\n if (instanceMessage.flow === InstanceMessageFlowEnum.RESPONSE && instanceMessage.action === InstanceMessageActionEnum.START) {\r\n if (instanceMessage.instance!=='')\r\n setInstance(instanceMessage.instance)\r\n else {\r\n let signalMessage = instanceMessage as ISignalMessage\r\n if (signalMessage.text) {\r\n alertApi.post({ message: signalMessage.text, severity:'error', display:'transient' })\r\n }\r\n }\r\n }\r\n else {\r\n let signalMessage = instanceMessage as ISignalMessage\r\n if (signalMessage.text) {\r\n addMessage(signalMessage.level, signalMessage.text)\r\n switch(signalMessage.level) {\r\n case SignalMessageLevelEnum.INFO:\r\n alertApi.post({ message: signalMessage.text, severity:'info', display:'transient' })\r\n break\r\n case SignalMessageLevelEnum.WARNING:\r\n alertApi.post({ message: signalMessage.text, severity:'warning', display:'transient' })\r\n break\r\n case SignalMessageLevelEnum.ERROR:\r\n alertApi.post({ message: signalMessage.text, severity:'error', display:'transient' })\r\n break\r\n default:\r\n alertApi.post({ message: signalMessage.text, severity:'success', display:'transient' })\r\n break\r\n }\r\n }\r\n }\r\n break\r\n default:\r\n addMessage(SignalMessageLevelEnum.ERROR, 'Invalid message type received: ' + instanceMessage.type)\r\n alertApi.post({ message: 'Invalid message type received: ' + instanceMessage.type, severity:'error', display:'transient' })\r\n break\r\n }\r\n }\r\n\r\n const addMessage = (level:SignalMessageLevelEnum, text:string) => {\r\n setStatusMessages ((prev) => [...prev, {\r\n level,\r\n text,\r\n type: InstanceMessageTypeEnum.SIGNAL,\r\n }])\r\n }\r\n\r\n const websocketOnMessage = (wsEvent:any) => {\r\n let instanceMessage:IInstanceMessage\r\n try {\r\n instanceMessage = JSON.parse(wsEvent.data) as IInstanceMessage\r\n }\r\n catch (err) {\r\n console.log(err)\r\n console.log(wsEvent.data)\r\n return\r\n }\r\n\r\n switch(instanceMessage.channel) {\r\n case InstanceMessageChannelEnum.LOG:\r\n processLogMessage(wsEvent)\r\n break\r\n case InstanceMessageChannelEnum.OPS:\r\n let opsMessage = instanceMessage as IOpsMessageResponse\r\n if (opsMessage.data?.data) \r\n addMessage (SignalMessageLevelEnum.WARNING, 'Operations message: '+opsMessage.data.data)\r\n else\r\n addMessage (SignalMessageLevelEnum.WARNING, 'Operations message: '+JSON.stringify(opsMessage))\r\n break\r\n default:\r\n addMessage (SignalMessageLevelEnum.ERROR, 'Invalid channel in message: '+instanceMessage.channel)\r\n addMessage (SignalMessageLevelEnum.ERROR, 'Invalid message: '+JSON.stringify(instanceMessage))\r\n break\r\n }\r\n }\r\n\r\n const websocketOnOpen = (ws:WebSocket, options:IOptions) => {\r\n let cluster=validClusters.find(cluster => cluster.name === selectedClusterName)\r\n if (!cluster) {\r\n addMessage(SignalMessageLevelEnum.ERROR,'No cluster selected')\r\n return\r\n }\r\n let pods = cluster.pods.filter(p => selectedNamespaces.includes(p.namespace))\r\n if (!pods) {\r\n addMessage(SignalMessageLevelEnum.ERROR,'No pods found')\r\n return\r\n }\r\n console.log(`WS connected`)\r\n let accessKey = cluster.accessKeys.get(InstanceConfigScopeEnum.VIEW)\r\n if (accessKey) {\r\n let containers:string[] = []\r\n if (selectedContainerNames.length>0) {\r\n for(var p of selectedPodNames) {\r\n for (var c of selectedContainerNames) {\r\n containers.push(p+'+'+c)\r\n }\r\n }\r\n }\r\n let iConfig:InstanceConfig = {\r\n channel: InstanceMessageChannelEnum.LOG,\r\n objects: InstanceConfigObjectEnum.PODS,\r\n action: InstanceMessageActionEnum.START,\r\n flow: InstanceMessageFlowEnum.REQUEST,\r\n instance: '',\r\n accessKey: accessKeySerialize(accessKey),\r\n scope: InstanceConfigScopeEnum.VIEW,\r\n view: (selectedContainerNames.length > 0 ? InstanceConfigViewEnum.CONTAINER : InstanceConfigViewEnum.POD),\r\n namespace: selectedNamespaces.join(','),\r\n group: '',\r\n pod: selectedPodNames.map(p => p).join(','),\r\n container: containers.join(','),\r\n data: {\r\n timestamp: options.showTimestamp,\r\n previous: false,\r\n maxMessages: LOG_MAX_MESSAGES,\r\n fromStart: options.fromStart\r\n },\r\n type: InstanceMessageTypeEnum.SIGNAL\r\n }\r\n ws.send(JSON.stringify(iConfig))\r\n }\r\n else {\r\n addMessage(SignalMessageLevelEnum.ERROR,'No accessKey for starting log streaming')\r\n return\r\n }\r\n }\r\n\r\n const startLogViewer = (options:IOptions) => {\r\n let cluster=validClusters.find(cluster => cluster.name===selectedClusterName);\r\n if (!cluster) {\r\n addMessage(SignalMessageLevelEnum.ERROR,'No cluster selected')\r\n return\r\n }\r\n\r\n setMessages([])\r\n try {\r\n let ws = new WebSocket(cluster.url)\r\n ws.onopen = () => websocketOnOpen(ws, options)\r\n ws.onmessage = (event) => websocketOnMessage(event)\r\n ws.onclose = (event) => websocketOnClose(event)\r\n setWebsocket(ws)\r\n }\r\n catch (err) {\r\n setMessages([ {\r\n type: InstanceMessageTypeEnum.DATA,\r\n text: `Error opening log stream: ${err}`,\r\n namespace: '',\r\n pod: '',\r\n container: ''\r\n } ])\r\n }\r\n\r\n }\r\n\r\n const websocketOnClose = (_event:any) => {\r\n console.log(`WS disconnected`)\r\n setStarted(false)\r\n paused.current=false\r\n setStopped(true)\r\n }\r\n\r\n const stopLogViewer = () => {\r\n messages.push({\r\n type: InstanceMessageTypeEnum.DATA,\r\n text: '============================================================================================================================',\r\n namespace: '',\r\n pod: '',\r\n container: ''\r\n })\r\n websocket?.close()\r\n }\r\n\r\n const onChangeLogConfig = (options:IOptions) => {\r\n kwirthLogOptionsRef.current=options\r\n if (started) {\r\n clickStart(options)\r\n }\r\n }\r\n\r\n const onClickDownload = () => {\r\n let content = preRef.current!.innerHTML.replaceAll('<pre>','').replaceAll('</pre>','\\n')\r\n content = content.replaceAll('<span style=\"color: green;\">','')\r\n content = content.replaceAll('<span style=\"color: blue;\">','')\r\n content = content.replaceAll('</span>','')\r\n let filename = selectedClusterName+'-'+selectedNamespaces+'-'+entity.metadata.name+'.txt'\r\n let mimeType:string = 'text/plain'\r\n \r\n const blob = new Blob([content], { type: mimeType })\r\n const url = URL.createObjectURL(blob)\r\n const link = document.createElement('a')\r\n link.href = url\r\n link.download = filename\r\n document.body.appendChild(link)\r\n link.click()\r\n document.body.removeChild(link)\r\n URL.revokeObjectURL(url)\r\n }\r\n\r\n const onClickRestart = () => {\r\n // we perform a route command from channel 'log' to channel 'ops'\r\n var cluster=validClusters.find(cluster => cluster.name===selectedClusterName);\r\n if (!cluster) {\r\n addMessage(SignalMessageLevelEnum.ERROR,'No cluster selected')\r\n return\r\n }\r\n let restartKey = cluster.accessKeys.get(InstanceConfigScopeEnum.RESTART)\r\n if (!restartKey) {\r\n addMessage(SignalMessageLevelEnum.ERROR,'No access key present')\r\n return\r\n }\r\n if (!instance) {\r\n addMessage(SignalMessageLevelEnum.ERROR,'No instance has been established')\r\n return\r\n }\r\n\r\n let pods:PodData[] = (cluster.pods as PodData[]).filter(pod => selectedNamespaces.includes(pod.namespace))\r\n for (let pod of pods) {\r\n let opsMessage:IOpsMessage = {\r\n msgtype: 'opsmessage',\r\n action: InstanceMessageActionEnum.COMMAND,\r\n flow: InstanceMessageFlowEnum.IMMEDIATE,\r\n type: InstanceMessageTypeEnum.DATA,\r\n channel: InstanceMessageChannelEnum.OPS,\r\n instance: '',\r\n id: '1',\r\n accessKey: accessKeySerialize(restartKey),\r\n command: OpsCommandEnum.RESTARTPOD,\r\n namespace: pod.namespace,\r\n group: '',\r\n pod: pod.name,\r\n container: ''\r\n }\r\n let routeMessage: IRouteMessage = {\r\n msgtype: 'routemessage',\r\n accessKey: accessKeySerialize(restartKey),\r\n destChannel: InstanceMessageChannelEnum.OPS,\r\n action: InstanceMessageActionEnum.ROUTE,\r\n flow: InstanceMessageFlowEnum.IMMEDIATE,\r\n type: InstanceMessageTypeEnum.SIGNAL,\r\n channel: InstanceMessageChannelEnum.LOG,\r\n instance: instance,\r\n data: opsMessage\r\n }\r\n websocket?.send(JSON.stringify(routeMessage))\r\n }\r\n }\r\n\r\n const actionButtons = () => {\r\n let hasViewKey=false, hasRestartKey = false\r\n let cluster=validClusters.find(cluster => cluster.name===selectedClusterName)\r\n if (cluster) {\r\n hasViewKey = Boolean(cluster.accessKeys.get(InstanceConfigScopeEnum.VIEW))\r\n hasRestartKey = Boolean(cluster.accessKeys.get(InstanceConfigScopeEnum.RESTART))\r\n }\r\n\r\n return <>\r\n { props.enableRestart &&\r\n <IconButton title='Restart' onClick={onClickRestart} disabled={selectedPodNames.length === 0 || !hasRestartKey || !websocket || !started}>\r\n <RefreshIcon />\r\n </IconButton>\r\n }\r\n <IconButton title='Download' onClick={onClickDownload} disabled={messages.length<=1}>\r\n <DownloadIcon />\r\n </IconButton>\r\n <IconButton onClick={() => clickStart(kwirthLogOptionsRef.current)} title=\"Play\" disabled={started || !paused || selectedPodNames.length === 0 || !hasViewKey}>\r\n <PlayIcon />\r\n </IconButton>\r\n <IconButton onClick={onClickPause} title=\"Pause\" disabled={!((started && !paused.current) && selectedPodNames.length > 0)}>\r\n <PauseIcon />\r\n </IconButton>\r\n <IconButton onClick={onClickStop} title=\"Stop\" disabled={stopped || selectedPodNames.length === 0}>\r\n <StopIcon />\r\n </IconButton>\r\n </>\r\n }\r\n\r\n const statusButtons = (title:string) => {\r\n const show = (level:SignalMessageLevelEnum) => {\r\n setShowStatusDialog(true)\r\n setStatusLevel(level)\r\n }\r\n\r\n const prepareText = (txt:string|undefined) => {\r\n return txt? (txt.length>25? txt.substring(0,25)+\"...\":txt) : 'N/A'\r\n }\r\n\r\n return (\r\n <Grid container direction='row' >\r\n <Grid item>\r\n <Typography variant='h5'>{prepareText(title)}</Typography>\r\n </Grid>\r\n <Grid item style={{marginTop:'-8px'}}>\r\n <IconButton title=\"info\" disabled={!statusMessages.some(m=>m.type === InstanceMessageTypeEnum.SIGNAL && m.level=== SignalMessageLevelEnum.INFO)} onClick={() => show(SignalMessageLevelEnum.INFO)}>\r\n <InfoIcon style={{ color:statusMessages.some(m=>m.type === InstanceMessageTypeEnum.SIGNAL && m.level=== SignalMessageLevelEnum.INFO)?'blue':'#BDBDBD'}}/>\r\n </IconButton>\r\n <IconButton title=\"warning\" disabled={!statusMessages.some(m=>m.type === InstanceMessageTypeEnum.SIGNAL && m.level=== SignalMessageLevelEnum.WARNING)} onClick={() => show(SignalMessageLevelEnum.WARNING)} style={{marginLeft:'-16px'}}>\r\n <WarningIcon style={{ color:statusMessages.some(m=>m.type === InstanceMessageTypeEnum.SIGNAL && m.level=== SignalMessageLevelEnum.WARNING)?'orange':'#BDBDBD'}}/>\r\n </IconButton>\r\n <IconButton title=\"error\" disabled={!statusMessages.some(m=>m.type === InstanceMessageTypeEnum.SIGNAL && m.level=== SignalMessageLevelEnum.ERROR)} onClick={() => show(SignalMessageLevelEnum.ERROR)} style={{marginLeft:'-16px'}}>\r\n <ErrorIcon style={{ color:statusMessages.some(m=>m.type === InstanceMessageTypeEnum.SIGNAL && m.level=== SignalMessageLevelEnum.ERROR)?'red':'#BDBDBD'}}/>\r\n </IconButton>\r\n </Grid>\r\n </Grid>\r\n )\r\n }\r\n\r\n const statusClear = (level: SignalMessageLevelEnum) => {\r\n setStatusMessages(statusMessages.filter(m=> m.level!==level))\r\n setShowStatusDialog(false)\r\n }\r\n \r\n const onSelectObject = (namespaces:string[], podNames:string[], containerNames:string[]) => {\r\n setSelectedNamespaces(namespaces)\r\n setSelectedPodNames(podNames)\r\n setSelectedContainerNames(containerNames)\r\n }\r\n\r\n const onChangeFilter = (event: any) => {\r\n setFilter(event.target?.value)\r\n }\r\n\r\n const formatMessage = (logLine:ILogLine) => {\r\n if (!logLine.pod) {\r\n return <>{logLine.text+'\\n'}</>\r\n }\r\n\r\n if (props.excludeContainers && props.excludeContainers.length>0) {\r\n if (props.excludeContainers.includes(logLine.container)) return <></>\r\n }\r\n\r\n if (filter!=='') {\r\n if (filterCasing) {\r\n if (filterRegex) {\r\n try {\r\n const regex=new RegExp(filter)\r\n if (!regex.test(logLine.text) && !regex.test(logLine.pod) && !regex.test(logLine.container)) return <></>\r\n }\r\n catch { return <></> }\r\n }\r\n else {\r\n if (!logLine.text.includes(filter) && !logLine.pod.includes(filter) && !logLine.container.includes(filter)) return <></>\r\n }\r\n }\r\n else {\r\n if (filterRegex) {\r\n try {\r\n const regex=new RegExp(filter.toLocaleLowerCase())\r\n if (!regex.test(logLine.text.toLocaleLowerCase()) && !regex.test(logLine.pod.toLocaleLowerCase()) && !regex.test(logLine.container.toLocaleLowerCase())) return <></>\r\n }\r\n catch { return <></> }\r\n }\r\n else {\r\n if (!logLine.text.toLocaleLowerCase().includes(filter.toLowerCase()) && !logLine.pod.toLocaleLowerCase().includes(filter.toLocaleLowerCase()) && !logLine.container.toLocaleLowerCase().includes(filter.toLocaleLowerCase())) return <></>\r\n }\r\n }\r\n }\r\n\r\n let podPrefix = <></>\r\n if (selectedPodNames.length !== 1 || kwirthLogOptionsRef.current.showNames) { // +++test\r\n podPrefix = <span style={{color:\"green\"}}>{logLine.pod+' '}</span>\r\n }\r\n\r\n let containerPrefix = <></>\r\n if (selectedContainerNames.length !== 1){\r\n containerPrefix = <span style={{color:\"blue\"}}>{logLine.container+' '}</span>\r\n }\r\n return <>{podPrefix}{containerPrefix}{logLine.text+'\\n'}</>\r\n }\r\n\r\n return (<>\r\n\r\n { loading && <Progress/> }\r\n\r\n {!isKwirthAvailable(entity) && !loading && error && (\r\n <WarningPanel title={'An error has ocurred while obtaining data from kuebernetes clusters.'} message={error?.message} />\r\n )}\r\n\r\n {!isKwirthAvailable(entity) && !loading && (\r\n <MissingAnnotationEmptyState readMoreUrl='https://github.com/jfvilas/plugin-kwirth-log' annotation={[ANNOTATION_BACKSTAGE_KUBERNETES_LABELID, ANNOTATION_BACKSTAGE_KUBERNETES_LABELSELECTOR]}/>\r\n )}\r\n\r\n { isKwirthAvailable(entity) && !loading && validClusters && validClusters.length===0 &&\r\n <ComponentNotFound error={ErrorType.NO_CLUSTERS} entity={entity}/>\r\n }\r\n\r\n { isKwirthAvailable(entity) && !loading && validClusters && validClusters.length>0 && validClusters.reduce((sum,cluster) => sum+cluster.pods.length, 0)===0 &&\r\n <ComponentNotFound error={ErrorType.NO_PODS} entity={entity}/>\r\n }\r\n\r\n { isKwirthAvailable(entity) && !loading && validClusters && validClusters.length>0 && validClusters.reduce((sum,cluster) => sum+cluster.pods.length, 0)>0 &&\r\n <RefBox ref={logBoxRef as any} sx={{ display: 'flex', height: `calc(100vh - ${logBoxTop}px - 25px)`}}>\r\n <Box sx={{ width: '200px', maxWidth:'200px'}}>\r\n <Grid container direction='column'>\r\n <Grid item> \r\n <Card>\r\n <ClusterList resources={validClusters} selectedClusterName={selectedClusterName} onSelect={onSelectCluster}/>\r\n </Card>\r\n </Grid>\r\n <Grid item>\r\n <Card>\r\n <Options options={kwirthLogOptionsRef.current} onChange={onChangeLogConfig} disabled={selectedContainerNames.length === 0 || started || paused.current}/>\r\n </Card>\r\n </Grid>\r\n {!props.hideVersion &&\r\n <Grid item>\r\n <Card>\r\n <KwirthNews latestVersions={backendInfo} backendVersion={backendVersion} ownVersion={VERSION}/>\r\n </Card>\r\n </Grid>\r\n }\r\n </Grid>\r\n </Box>\r\n\r\n <Box sx={{ flexGrow: 1, flex:1, overflow:'hidden', p:1, marginLeft:'8px' }}>\r\n\r\n { !selectedClusterName && \r\n <img src={KwirthLogLogo} alt='No cluster selected' style={{ left:'40%', marginTop:'10%', width:'20%', position:'relative' }} />\r\n }\r\n\r\n { selectedClusterName && <>\r\n <Card style={{ marginTop:-8, height:'100%', display:'flex', flexDirection:'column' }}>\r\n <CardHeader\r\n title={statusButtons(selectedClusterName)}\r\n style={{marginTop:-4, marginBottom:4, flexShrink:0}}\r\n action={actionButtons()}\r\n />\r\n \r\n <Grid container style={{alignItems:'end'}}>\r\n <Grid item style={{width:'66%'}}>\r\n <Typography style={{marginLeft:14}}>\r\n <ObjectSelector cluster={validClusters.find(cluster => cluster.name === selectedClusterName)!} onSelect={onSelectObject} disabled={selectedClusterName === '' || started || paused.current} selectedNamespaces={selectedNamespaces} selectedPodNames={selectedPodNames} selectedContainerNames={selectedContainerNames} scope={InstanceConfigScopeEnum.VIEW} excludeCotainers={props.excludeContainers}/>\r\n </Typography>\r\n </Grid>\r\n <Grid item style={{width:'33%', marginLeft:0}} >\r\n <TextField value={filter} onChange={onChangeFilter} label='Filter' fullWidth style={{marginBottom:6, marginLeft:0}} disabled={!started} \r\n InputProps={{ endAdornment: \r\n <>\r\n <InputAdornment position=\"start\" onClick={() => started && setFilterRegex(!filterRegex)} style={{margin: 0}}>\r\n <Typography style={filterRegex? adornmentSelected : adornmentNotSelected}>.*</Typography>\r\n </InputAdornment>\r\n <InputAdornment position=\"start\" onClick={() => started && setFilterCasing(!filterCasing)} style={{margin: 0, marginLeft:1}}>\r\n <Typography style={filterCasing? adornmentSelected : adornmentNotSelected}>Aa</Typography>\r\n </InputAdornment>\r\n </>\r\n }}\r\n />\r\n </Grid>\r\n </Grid>\r\n <Divider/>\r\n <CardContent style={{ flexGrow: 1, overflow: 'hidden', display: 'flex', flexDirection: 'column' }}>\r\n <Box style={{ overflowY: 'auto', width: '100%', flexGrow: 1, height: `calc(100vh - ${logBoxTop}px - 25px)`, overflowX: (kwirthLogOptionsRef.current.wrapLines?'hidden':'auto')}}>\r\n <pre ref={preRef} style={{whiteSpace: (kwirthLogOptionsRef.current.wrapLines ? 'pre-wrap' : 'pre'), wordBreak: kwirthLogOptionsRef.current.wrapLines ? 'break-word' : 'normal'}} >\r\n { messages.map (m => formatMessage(m)) }\r\n </pre>\r\n <span ref={lastRef}/>\r\n </Box> \r\n </CardContent>\r\n </Card>\r\n </>}\r\n </Box>\r\n </RefBox>\r\n }\r\n { showStatusDialog && <StatusLog level={statusLevel} onClose={() => setShowStatusDialog(false)} statusMessages={statusMessages} onClear={statusClear}/>}\r\n </>)\r\n}\r\n"],"names":["cluster","p"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"EntityKwirthLogContent.esm.js","sources":["../../src/components/EntityKwirthLogContent.tsx"],"sourcesContent":["/*\r\nCopyright 2025 Julio Fernandez\r\n\r\nLicensed under the Apache License, Version 2.0 (the \"License\");\r\nyou may not use this file except in compliance with the License.\r\nYou may obtain a copy of the License at\r\n\r\n http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nUnless required by applicable law or agreed to in writing, software\r\ndistributed under the License is distributed on an \"AS IS\" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n*/\r\nimport React, { useEffect, useRef, useState } from 'react'\r\nimport useAsync from 'react-use/esm/useAsync'\r\n\r\nimport { Progress, WarningPanel } from '@backstage/core-components'\r\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api'\r\nimport { ANNOTATION_BACKSTAGE_KUBERNETES_LABELID, ANNOTATION_BACKSTAGE_KUBERNETES_LABELSELECTOR, isKwirthAvailable, ClusterValidPods, PodData, ILogLine, IStatusLine, getPodList, getContainerList, IBackendInfo } from '@jfvilas/plugin-kwirth-common'\r\nimport { MissingAnnotationEmptyState, useEntity } from '@backstage/plugin-catalog-react'\r\n\r\n// kwirth\r\nimport { kwirthLogApiRef } from '../api'\r\nimport { accessKeySerialize, ILogMessage, InstanceConfigScopeEnum, IInstanceMessage, ISignalMessage, IInstanceConfig, InstanceMessageChannelEnum, IOpsMessage, IRouteMessage, IOpsMessageResponse, EInstanceMessageType, EInstanceMessageFlow, EInstanceMessageAction, ESignalMessageLevel, EInstanceConfigObject, EInstanceConfigView, EOpsCommand } from '@jfvilas/kwirth-common'\r\n\r\n// kwirthlog components\r\nimport { IOptions } from './IOptions'\r\nimport { Options } from './Options'\r\nimport { KwirthNews, ComponentNotFound, ObjectSelector, StatusLog, ClusterList, ErrorType } from '@jfvilas/plugin-kwirth-frontend'\r\n\r\n// Material-UI\r\nimport { Grid, Card, CardHeader, CardContent, Box, TextField, InputAdornment, BoxProps } from '@material-ui/core'\r\nimport Divider from '@material-ui/core/Divider'\r\nimport IconButton from '@material-ui/core/IconButton'\r\nimport Typography from '@material-ui/core/Typography'\r\n\r\n// Icons\r\nimport PlayIcon from '@material-ui/icons/PlayArrow'\r\nimport PauseIcon from '@material-ui/icons/Pause'\r\nimport StopIcon from '@material-ui/icons/Stop'\r\nimport InfoIcon from '@material-ui/icons/Info'\r\nimport WarningIcon from '@material-ui/icons/Warning'\r\nimport ErrorIcon from '@material-ui/icons/Error'\r\nimport DownloadIcon from '@material-ui/icons/CloudDownload'\r\nimport KwirthLogLogo from '../assets/kwirthlog-logo.svg'\r\nimport RefreshIcon from '@material-ui/icons/Refresh'\r\nimport { VERSION } from '../version'\r\n\r\ntype BoxWithRefProps = BoxProps & { ref?: React.Ref<HTMLDivElement> }\r\nconst RefBox = Box as React.FC<BoxWithRefProps>\r\n\r\nconst LOG_MAX_MESSAGES=1000\r\n\r\nexport interface IEntityKwirthLogProps {\r\n enableRestart: boolean\r\n fromStart?: boolean\r\n showTimestamp?: boolean\r\n showNames?: boolean\r\n followLog?: boolean\r\n wrapLines?: boolean\r\n hideVersion?: boolean\r\n excludeContainers?: string[]\r\n}\r\n\r\nexport const EntityKwirthLogContent: React.FC<IEntityKwirthLogProps> = (props:IEntityKwirthLogProps) => { \r\n const { entity } = useEntity()\r\n const kwirthLogApi = useApi(kwirthLogApiRef)\r\n const alertApi = useApi(alertApiRef)\r\n const [validClusters, setResources] = useState<ClusterValidPods[]>([])\r\n const [selectedClusterName, setSelectedClusterName] = useState('')\r\n const [selectedNamespaces, setSelectedNamespaces] = useState<string[]>([])\r\n const [selectedPodNames, setSelectedPodNames] = useState<string[]>([])\r\n const [selectedContainerNames, setSelectedContainerNames] = useState<string[]>([])\r\n const [started, setStarted] = useState(false)\r\n const [stopped, setStopped] = useState(true)\r\n const paused=useRef<boolean>(false)\r\n const [messages, setMessages] = useState<ILogLine[]>([])\r\n const [pendingMessages, setPendingMessages] = useState<ILogLine[]>([])\r\n const [statusMessages, setStatusMessages] = useState<IStatusLine[]>([])\r\n const [websocket, setWebsocket] = useState<WebSocket>()\r\n const [instance, setInstance] = useState<string>()\r\n const kwirthLogOptionsRef = useRef<IOptions>({\r\n fromStart: props.fromStart!==undefined? props.fromStart : false, \r\n showTimestamp: props.showTimestamp!==undefined?props.showTimestamp:false, \r\n showNames: props.showNames!==undefined?props.showNames : true, \r\n followLog: props.followLog!==undefined? props.followLog : true, \r\n wrapLines: props.wrapLines!==undefined? props.wrapLines : false\r\n })\r\n const [showStatusDialog, setShowStatusDialog] = useState(false)\r\n const [statusLevel, setStatusLevel] = useState<ESignalMessageLevel>(ESignalMessageLevel.INFO)\r\n const preRef = useRef<HTMLPreElement|null>(null)\r\n const lastRef = useRef<HTMLPreElement|null>(null)\r\n const [ backendVersion, setBackendVersion ] = useState<string>('')\r\n const [ backendInfo, setBackendInfo ] = useState<IBackendInfo>()\r\n const { loading, error } = useAsync ( async () => {\r\n if (backendVersion==='') setBackendVersion(await kwirthLogApi.getVersion())\r\n if (!backendInfo) setBackendInfo(await kwirthLogApi.getInfo())\r\n let reqScopes = [InstanceConfigScopeEnum.VIEW]\r\n if (props.enableRestart) reqScopes.push(InstanceConfigScopeEnum.RESTART)\r\n let data:ClusterValidPods[] = await kwirthLogApi.requestAccess(entity, InstanceMessageChannelEnum.LOG, reqScopes)\r\n setResources(data)\r\n })\r\n const buffer = useRef<Map<string,string>>(new Map())\r\n const [filter, setFilter] = useState<string>('')\r\n const [filterCasing, setFilterCasing] = useState(false)\r\n const [filterRegex, setFilterRegex] = useState(false)\r\n const logBoxRef = useRef<HTMLDivElement | null>(null)\r\n const [logBoxTop, setLogBoxTop] = useState(0)\r\n\r\n const adornmentSelected= { margin: 0, borderWidth:1, borderStyle:'solid', borderColor:'gray', paddingLeft:3, paddingRight:3, backgroundColor:'gray', cursor: 'pointer', color:'white'}\r\n const adornmentNotSelected = { margin: 0, borderWidth:1, borderStyle: 'solid', paddingLeft:3, paddingRight:3, cursor:'pointer'}\r\n useEffect(() => {\r\n if (logBoxRef.current) setLogBoxTop(logBoxRef.current.getBoundingClientRect().top)\r\n })\r\n\r\n const clickStart = (options:IOptions) => {\r\n if (!paused.current) {\r\n setStarted(true)\r\n paused.current=false\r\n setStopped(false)\r\n startLogViewer(options)\r\n }\r\n else {\r\n setMessages( (prev) => [ ...prev, ...pendingMessages])\r\n setPendingMessages([])\r\n paused.current=false\r\n setStarted(true)\r\n }\r\n }\r\n\r\n const onClickPause = () => {\r\n setStarted(false)\r\n paused.current=true\r\n }\r\n\r\n const onClickStop = () => {\r\n setStarted(false)\r\n setStopped(true)\r\n paused.current=false\r\n stopLogViewer()\r\n }\r\n\r\n const onSelectCluster = (clusterName:string|undefined) => {\r\n if (started) onClickStop()\r\n if (clusterName) {\r\n setSelectedClusterName(clusterName)\r\n setSelectedPodNames([])\r\n setSelectedContainerNames([])\r\n setStatusMessages([])\r\n let cluster = validClusters.find(cluster => cluster.name === clusterName)\r\n\r\n if (cluster && cluster.pods) {\r\n let validNamespaces = Array.from(new Set(cluster.pods.map(pod => pod.namespace)))\r\n if (validNamespaces.length === 1) {\r\n setSelectedNamespaces(validNamespaces)\r\n let podList = getPodList (cluster.pods, validNamespaces)\r\n setSelectedPodNames(podList.map(pod => pod.name))\r\n setSelectedContainerNames(getContainerList(cluster.pods, validNamespaces, podList.map(pod => pod.name), props.excludeContainers || []))\r\n }\r\n else {\r\n setMessages([{\r\n type: EInstanceMessageType.SIGNAL,\r\n text: 'Select namespace in order to decide which pod logs to view.',\r\n namespace: '',\r\n pod: '',\r\n container: ''\r\n }])\r\n setSelectedNamespaces([])\r\n }\r\n }\r\n }\r\n }\r\n\r\n const processLogMessage = (wsEvent:any) => {\r\n let instanceMessage = JSON.parse(wsEvent.data) as IInstanceMessage\r\n switch (instanceMessage.type) {\r\n case EInstanceMessageType.DATA:\r\n let logMessage = instanceMessage as ILogMessage\r\n let bname = logMessage.namespace+'/'+logMessage.pod+'/'+logMessage.container\r\n let text = logMessage.text\r\n if (!buffer.current.has(bname)) buffer.current.set(bname,'')\r\n if (buffer.current.get(bname)) {\r\n text = buffer.current.get(bname) + text\r\n buffer.current.set(bname,'')\r\n }\r\n if (!text.endsWith('\\n')) {\r\n let i = text.lastIndexOf('\\n')\r\n buffer.current.set(bname,text.substring(i))\r\n text = text.substring(0,i)\r\n }\r\n\r\n for (let line of text.split('\\n')) {\r\n if (line.trim() === '') continue\r\n\r\n let logLine:ILogLine = {\r\n text: line,\r\n namespace: logMessage.namespace,\r\n pod: logMessage.pod,\r\n container: logMessage.container,\r\n type: logMessage.type\r\n }\r\n\r\n if (paused.current) {\r\n setPendingMessages((prev) => [ ...prev, logLine ])\r\n }\r\n else {\r\n setMessages((prev) => {\r\n while (prev.length>LOG_MAX_MESSAGES-1) {\r\n prev.splice(0,1)\r\n }\r\n if (kwirthLogOptionsRef.current.followLog && lastRef.current) lastRef.current.scrollIntoView({ behavior: 'instant', block: 'start' })\r\n return [ ...prev, logLine ]\r\n })\r\n }\r\n }\r\n break\r\n case EInstanceMessageType.SIGNAL:\r\n if (instanceMessage.flow === EInstanceMessageFlow.RESPONSE && instanceMessage.action === EInstanceMessageAction.START) {\r\n if (instanceMessage.instance!=='')\r\n setInstance(instanceMessage.instance)\r\n else {\r\n let signalMessage = instanceMessage as ISignalMessage\r\n if (signalMessage.text) {\r\n alertApi.post({ message: signalMessage.text, severity:'error', display:'transient' })\r\n }\r\n }\r\n }\r\n else {\r\n let signalMessage = instanceMessage as ISignalMessage\r\n if (signalMessage.text) {\r\n addMessage(signalMessage.level, signalMessage.text)\r\n switch(signalMessage.level) {\r\n case ESignalMessageLevel.INFO:\r\n alertApi.post({ message: signalMessage.text, severity:'info', display:'transient' })\r\n break\r\n case ESignalMessageLevel.WARNING:\r\n alertApi.post({ message: signalMessage.text, severity:'warning', display:'transient' })\r\n break\r\n case ESignalMessageLevel.ERROR:\r\n alertApi.post({ message: signalMessage.text, severity:'error', display:'transient' })\r\n break\r\n default:\r\n alertApi.post({ message: signalMessage.text, severity:'success', display:'transient' })\r\n break\r\n }\r\n }\r\n }\r\n break\r\n default:\r\n addMessage(ESignalMessageLevel.ERROR, 'Invalid message type received: ' + instanceMessage.type)\r\n alertApi.post({ message: 'Invalid message type received: ' + instanceMessage.type, severity:'error', display:'transient' })\r\n break\r\n }\r\n }\r\n\r\n const addMessage = (level:ESignalMessageLevel, text:string) => {\r\n setStatusMessages ((prev) => [...prev, {\r\n level,\r\n text,\r\n type: EInstanceMessageType.SIGNAL,\r\n }])\r\n }\r\n\r\n const websocketOnMessage = (wsEvent:any) => {\r\n let instanceMessage:IInstanceMessage\r\n try {\r\n instanceMessage = JSON.parse(wsEvent.data) as IInstanceMessage\r\n }\r\n catch (err) {\r\n console.log(err)\r\n console.log(wsEvent.data)\r\n return\r\n }\r\n\r\n switch(instanceMessage.channel) {\r\n case InstanceMessageChannelEnum.LOG:\r\n processLogMessage(wsEvent)\r\n break\r\n case InstanceMessageChannelEnum.OPS:\r\n let opsMessage = instanceMessage as IOpsMessageResponse\r\n if (opsMessage.data?.data) \r\n addMessage (ESignalMessageLevel.WARNING, 'Operations message: '+opsMessage.data.data)\r\n else\r\n addMessage (ESignalMessageLevel.WARNING, 'Operations message: '+JSON.stringify(opsMessage))\r\n break\r\n default:\r\n addMessage (ESignalMessageLevel.ERROR, 'Invalid channel in message: '+instanceMessage.channel)\r\n addMessage (ESignalMessageLevel.ERROR, 'Invalid message: '+JSON.stringify(instanceMessage))\r\n break\r\n }\r\n }\r\n\r\n const websocketOnOpen = (ws:WebSocket, options:IOptions) => {\r\n let cluster=validClusters.find(cluster => cluster.name === selectedClusterName)\r\n if (!cluster) {\r\n addMessage(ESignalMessageLevel.ERROR,'No cluster selected')\r\n return\r\n }\r\n let pods = cluster.pods.filter(p => selectedNamespaces.includes(p.namespace))\r\n if (!pods) {\r\n addMessage(ESignalMessageLevel.ERROR,'No pods found')\r\n return\r\n }\r\n console.log(`WS connected`)\r\n let accessKey = cluster.accessKeys.get(InstanceConfigScopeEnum.VIEW)\r\n if (accessKey) {\r\n let containers:string[] = []\r\n if (selectedContainerNames.length>0) {\r\n for(var p of selectedPodNames) {\r\n for (var c of selectedContainerNames) {\r\n containers.push(p+'+'+c)\r\n }\r\n }\r\n }\r\n let iConfig:IInstanceConfig = {\r\n channel: InstanceMessageChannelEnum.LOG,\r\n objects: EInstanceConfigObject.PODS,\r\n action: EInstanceMessageAction.START,\r\n flow: EInstanceMessageFlow.REQUEST,\r\n instance: '',\r\n accessKey: accessKeySerialize(accessKey),\r\n scope: InstanceConfigScopeEnum.VIEW,\r\n view: (selectedContainerNames.length > 0 ? EInstanceConfigView.CONTAINER : EInstanceConfigView.POD),\r\n namespace: selectedNamespaces.join(','),\r\n group: '',\r\n pod: selectedPodNames.map(p => p).join(','),\r\n container: containers.join(','),\r\n data: {\r\n timestamp: options.showTimestamp,\r\n previous: false,\r\n maxMessages: LOG_MAX_MESSAGES,\r\n fromStart: options.fromStart\r\n },\r\n type: EInstanceMessageType.SIGNAL\r\n }\r\n ws.send(JSON.stringify(iConfig))\r\n }\r\n else {\r\n addMessage(ESignalMessageLevel.ERROR,'No accessKey for starting log streaming')\r\n return\r\n }\r\n }\r\n\r\n const startLogViewer = (options:IOptions) => {\r\n let cluster=validClusters.find(cluster => cluster.name===selectedClusterName);\r\n if (!cluster) {\r\n addMessage(ESignalMessageLevel.ERROR,'No cluster selected')\r\n return\r\n }\r\n\r\n setMessages([])\r\n try {\r\n let ws = new WebSocket(cluster.url)\r\n ws.onopen = () => websocketOnOpen(ws, options)\r\n ws.onmessage = (event) => websocketOnMessage(event)\r\n ws.onclose = (event) => websocketOnClose(event)\r\n setWebsocket(ws)\r\n }\r\n catch (err) {\r\n setMessages([ {\r\n type: EInstanceMessageType.DATA,\r\n text: `Error opening log stream: ${err}`,\r\n namespace: '',\r\n pod: '',\r\n container: ''\r\n } ])\r\n }\r\n\r\n }\r\n\r\n const websocketOnClose = (_event:any) => {\r\n console.log(`WS disconnected`)\r\n setStarted(false)\r\n paused.current=false\r\n setStopped(true)\r\n }\r\n\r\n const stopLogViewer = () => {\r\n messages.push({\r\n type: EInstanceMessageType.DATA,\r\n text: '============================================================================================================================',\r\n namespace: '',\r\n pod: '',\r\n container: ''\r\n })\r\n websocket?.close()\r\n }\r\n\r\n const onChangeLogConfig = (options:IOptions) => {\r\n kwirthLogOptionsRef.current=options\r\n if (started) {\r\n clickStart(options)\r\n }\r\n }\r\n\r\n const onClickDownload = () => {\r\n let content = preRef.current!.innerHTML.replaceAll('<pre>','').replaceAll('</pre>','\\n')\r\n content = content.replaceAll('<span style=\"color: green;\">','')\r\n content = content.replaceAll('<span style=\"color: blue;\">','')\r\n content = content.replaceAll('</span>','')\r\n let filename = selectedClusterName+'-'+selectedNamespaces+'-'+entity.metadata.name+'.txt'\r\n let mimeType:string = 'text/plain'\r\n \r\n const blob = new Blob([content], { type: mimeType })\r\n const url = URL.createObjectURL(blob)\r\n const link = document.createElement('a')\r\n link.href = url\r\n link.download = filename\r\n document.body.appendChild(link)\r\n link.click()\r\n document.body.removeChild(link)\r\n URL.revokeObjectURL(url)\r\n }\r\n\r\n const onClickRestart = () => {\r\n // we perform a route command from channel 'log' to channel 'ops'\r\n var cluster=validClusters.find(cluster => cluster.name===selectedClusterName);\r\n if (!cluster) {\r\n addMessage(ESignalMessageLevel.ERROR,'No cluster selected')\r\n return\r\n }\r\n let restartKey = cluster.accessKeys.get(InstanceConfigScopeEnum.RESTART)\r\n if (!restartKey) {\r\n addMessage(ESignalMessageLevel.ERROR,'No access key present')\r\n return\r\n }\r\n if (!instance) {\r\n addMessage(ESignalMessageLevel.ERROR,'No instance has been established')\r\n return\r\n }\r\n\r\n let pods:PodData[] = (cluster.pods as PodData[]).filter(pod => selectedNamespaces.includes(pod.namespace))\r\n for (let pod of pods) {\r\n let opsMessage:IOpsMessage = {\r\n msgtype: 'opsmessage',\r\n action: EInstanceMessageAction.COMMAND,\r\n flow: EInstanceMessageFlow.IMMEDIATE,\r\n type: EInstanceMessageType.DATA,\r\n channel: InstanceMessageChannelEnum.OPS,\r\n instance: '',\r\n id: '1',\r\n accessKey: accessKeySerialize(restartKey),\r\n command: EOpsCommand.RESTARTPOD,\r\n namespace: pod.namespace,\r\n group: '',\r\n pod: pod.name,\r\n container: ''\r\n }\r\n let routeMessage: IRouteMessage = {\r\n msgtype: 'routemessage',\r\n accessKey: accessKeySerialize(restartKey),\r\n destChannel: InstanceMessageChannelEnum.OPS,\r\n action: EInstanceMessageAction.ROUTE,\r\n flow: EInstanceMessageFlow.IMMEDIATE,\r\n type: EInstanceMessageType.SIGNAL,\r\n channel: InstanceMessageChannelEnum.LOG,\r\n instance: instance,\r\n data: opsMessage\r\n }\r\n websocket?.send(JSON.stringify(routeMessage))\r\n }\r\n }\r\n\r\n const actionButtons = () => {\r\n let hasViewKey=false, hasRestartKey = false\r\n let cluster=validClusters.find(cluster => cluster.name===selectedClusterName)\r\n if (cluster) {\r\n hasViewKey = Boolean(cluster.accessKeys.get(InstanceConfigScopeEnum.VIEW))\r\n hasRestartKey = Boolean(cluster.accessKeys.get(InstanceConfigScopeEnum.RESTART))\r\n }\r\n\r\n return <>\r\n { props.enableRestart &&\r\n <IconButton title='Restart' onClick={onClickRestart} disabled={selectedPodNames.length === 0 || !hasRestartKey || !websocket || !started}>\r\n <RefreshIcon />\r\n </IconButton>\r\n }\r\n <IconButton title='Download' onClick={onClickDownload} disabled={messages.length<=1}>\r\n <DownloadIcon />\r\n </IconButton>\r\n <IconButton onClick={() => clickStart(kwirthLogOptionsRef.current)} title=\"Play\" disabled={started || !paused || selectedPodNames.length === 0 || !hasViewKey}>\r\n <PlayIcon />\r\n </IconButton>\r\n <IconButton onClick={onClickPause} title=\"Pause\" disabled={!((started && !paused.current) && selectedPodNames.length > 0)}>\r\n <PauseIcon />\r\n </IconButton>\r\n <IconButton onClick={onClickStop} title=\"Stop\" disabled={stopped || selectedPodNames.length === 0}>\r\n <StopIcon />\r\n </IconButton>\r\n </>\r\n }\r\n\r\n const statusButtons = (title:string) => {\r\n const show = (level:ESignalMessageLevel) => {\r\n setShowStatusDialog(true)\r\n setStatusLevel(level)\r\n }\r\n\r\n const prepareText = (txt:string|undefined) => {\r\n return txt? (txt.length>25? txt.substring(0,25)+\"...\":txt) : 'N/A'\r\n }\r\n\r\n return (\r\n <Grid container direction='row' >\r\n <Grid item>\r\n <Typography variant='h5'>{prepareText(title)}</Typography>\r\n </Grid>\r\n <Grid item style={{marginTop:'-8px'}}>\r\n <IconButton title=\"info\" disabled={!statusMessages.some(m=>m.type === EInstanceMessageType.SIGNAL && m.level=== ESignalMessageLevel.INFO)} onClick={() => show(ESignalMessageLevel.INFO)}>\r\n <InfoIcon style={{ color:statusMessages.some(m=>m.type === EInstanceMessageType.SIGNAL && m.level=== ESignalMessageLevel.INFO)?'#1D63ED':'#BDBDBD'}}/>\r\n </IconButton>\r\n <IconButton title=\"warning\" disabled={!statusMessages.some(m=>m.type === EInstanceMessageType.SIGNAL && m.level=== ESignalMessageLevel.WARNING)} onClick={() => show(ESignalMessageLevel.WARNING)} style={{marginLeft:'-16px'}}>\r\n <WarningIcon style={{ color:statusMessages.some(m=>m.type === EInstanceMessageType.SIGNAL && m.level=== ESignalMessageLevel.WARNING)?'orange':'#BDBDBD'}}/>\r\n </IconButton>\r\n <IconButton title=\"error\" disabled={!statusMessages.some(m=>m.type === EInstanceMessageType.SIGNAL && m.level=== ESignalMessageLevel.ERROR)} onClick={() => show(ESignalMessageLevel.ERROR)} style={{marginLeft:'-16px'}}>\r\n <ErrorIcon style={{ color:statusMessages.some(m=>m.type === EInstanceMessageType.SIGNAL && m.level=== ESignalMessageLevel.ERROR)?'red':'#BDBDBD'}}/>\r\n </IconButton>\r\n </Grid>\r\n </Grid>\r\n )\r\n }\r\n\r\n const statusClear = (level: ESignalMessageLevel) => {\r\n setStatusMessages(statusMessages.filter(m=> m.level!==level))\r\n setShowStatusDialog(false)\r\n }\r\n \r\n const onSelectObject = (namespaces:string[], podNames:string[], containerNames:string[]) => {\r\n setSelectedNamespaces(namespaces)\r\n setSelectedPodNames(podNames)\r\n setSelectedContainerNames(containerNames)\r\n }\r\n\r\n const onChangeFilter = (event: any) => {\r\n setFilter(event.target?.value)\r\n }\r\n\r\n const formatLogLine = (logLine:ILogLine) => {\r\n if (!logLine.pod) {\r\n return <>{logLine.text+'\\n'}</>\r\n }\r\n\r\n if (props.excludeContainers && props.excludeContainers.length>0) {\r\n if (props.excludeContainers.includes(logLine.container)) return <></>\r\n }\r\n\r\n if (filter!=='') {\r\n if (filterCasing) {\r\n if (filterRegex) {\r\n try {\r\n const regex=new RegExp(filter)\r\n if (!regex.test(logLine.text) && !regex.test(logLine.pod) && !regex.test(logLine.container)) return <></>\r\n }\r\n catch { return <></> }\r\n }\r\n else {\r\n if (!logLine.text.includes(filter) && !logLine.pod.includes(filter) && !logLine.container.includes(filter)) return <></>\r\n }\r\n }\r\n else {\r\n if (filterRegex) {\r\n try {\r\n const regex=new RegExp(filter.toLocaleLowerCase())\r\n if (!regex.test(logLine.text.toLocaleLowerCase()) && !regex.test(logLine.pod.toLocaleLowerCase()) && !regex.test(logLine.container.toLocaleLowerCase())) return <></>\r\n }\r\n catch { return <></> }\r\n }\r\n else {\r\n if (!logLine.text.toLocaleLowerCase().includes(filter.toLowerCase()) && !logLine.pod.toLocaleLowerCase().includes(filter.toLocaleLowerCase()) && !logLine.container.toLocaleLowerCase().includes(filter.toLocaleLowerCase())) return <></>\r\n }\r\n }\r\n }\r\n\r\n let podPrefix = <></>\r\n if (selectedPodNames.length !== 1 || kwirthLogOptionsRef.current.showNames) { // +++test\r\n podPrefix = <span style={{color:\"green\"}}>{logLine.pod+' '}</span>\r\n }\r\n\r\n let containerPrefix = <></>\r\n if (selectedContainerNames.length !== 1){\r\n containerPrefix = <span style={{color:\"blue\"}}>{logLine.container+' '}</span>\r\n }\r\n return <>{podPrefix}{containerPrefix}{logLine.text+'\\n'}</>\r\n }\r\n\r\n return (<>\r\n\r\n { loading && <Progress/> }\r\n\r\n {!isKwirthAvailable(entity) && !loading && error && (\r\n <WarningPanel title={'An error has ocurred while obtaining data from kuebernetes clusters.'} message={error?.message} />\r\n )}\r\n\r\n {!isKwirthAvailable(entity) && !loading && (\r\n <MissingAnnotationEmptyState readMoreUrl='https://github.com/jfvilas/plugin-kwirth-log' annotation={[ANNOTATION_BACKSTAGE_KUBERNETES_LABELID, ANNOTATION_BACKSTAGE_KUBERNETES_LABELSELECTOR]}/>\r\n )}\r\n\r\n { isKwirthAvailable(entity) && !loading && validClusters && validClusters.length===0 &&\r\n <ComponentNotFound error={ErrorType.NO_CLUSTERS} entity={entity}/>\r\n }\r\n\r\n { isKwirthAvailable(entity) && !loading && validClusters && validClusters.length>0 && validClusters.reduce((sum,cluster) => sum+cluster.pods.length, 0)===0 &&\r\n <ComponentNotFound error={ErrorType.NO_PODS} entity={entity}/>\r\n }\r\n\r\n { isKwirthAvailable(entity) && !loading && validClusters && validClusters.length>0 && validClusters.reduce((sum,cluster) => sum+cluster.pods.length, 0)>0 &&\r\n <RefBox ref={logBoxRef as any} sx={{ display: 'flex', height: `calc(100vh - ${logBoxTop}px - 25px)`}}>\r\n <Box sx={{ width: '200px', maxWidth:'200px'}}>\r\n <Grid container direction='column'>\r\n <Grid item> \r\n <Card>\r\n <ClusterList resources={validClusters} selectedClusterName={selectedClusterName} onSelect={onSelectCluster}/>\r\n </Card>\r\n </Grid>\r\n <Grid item>\r\n <Card>\r\n <Options options={kwirthLogOptionsRef.current} onChange={onChangeLogConfig} disabled={selectedContainerNames.length === 0 || started || paused.current}/>\r\n </Card>\r\n </Grid>\r\n {!props.hideVersion &&\r\n <Grid item>\r\n <Card>\r\n <KwirthNews latestVersions={backendInfo} backendVersion={backendVersion} ownVersion={VERSION}/>\r\n </Card>\r\n </Grid>\r\n }\r\n </Grid>\r\n </Box>\r\n\r\n <Box sx={{ flexGrow: 1, flex:1, overflow:'hidden', p:1, marginLeft:'8px' }}>\r\n\r\n { !selectedClusterName && \r\n <img src={KwirthLogLogo} alt='No cluster selected' style={{ left:'40%', marginTop:'10%', width:'20%', position:'relative' }} />\r\n }\r\n\r\n { selectedClusterName && <>\r\n <Card style={{ marginTop:-8, height:'100%', display:'flex', flexDirection:'column' }}>\r\n <CardHeader\r\n title={statusButtons(selectedClusterName)}\r\n style={{marginTop:-4, marginBottom:4, flexShrink:0}}\r\n action={actionButtons()}\r\n />\r\n \r\n <Grid container style={{alignItems:'end'}}>\r\n <Grid item style={{width:'66%'}}>\r\n <Typography style={{marginLeft:14}}>\r\n <ObjectSelector cluster={validClusters.find(cluster => cluster.name === selectedClusterName)!} onSelect={onSelectObject} disabled={selectedClusterName === '' || started || paused.current} selectedNamespaces={selectedNamespaces} selectedPodNames={selectedPodNames} selectedContainerNames={selectedContainerNames} scope={InstanceConfigScopeEnum.VIEW} excludeCotainers={props.excludeContainers}/>\r\n </Typography>\r\n </Grid>\r\n <Grid item style={{width:'33%', marginLeft:0}} >\r\n <TextField value={filter} onChange={onChangeFilter} label='Filter' fullWidth style={{marginBottom:6, marginLeft:0}} disabled={!started} \r\n InputProps={{ endAdornment: \r\n <>\r\n <InputAdornment position=\"start\" onClick={() => started && setFilterRegex(!filterRegex)} style={{margin: 0}}>\r\n <Typography style={filterRegex? adornmentSelected : adornmentNotSelected}>.*</Typography>\r\n </InputAdornment>\r\n <InputAdornment position=\"start\" onClick={() => started && setFilterCasing(!filterCasing)} style={{margin: 0, marginLeft:1}}>\r\n <Typography style={filterCasing? adornmentSelected : adornmentNotSelected}>Aa</Typography>\r\n </InputAdornment>\r\n </>\r\n }}\r\n />\r\n </Grid>\r\n </Grid>\r\n <Divider/>\r\n <CardContent style={{ flexGrow: 1, overflow: 'hidden', display: 'flex', flexDirection: 'column' }}>\r\n <Box style={{ overflowY: 'auto', width: '100%', flexGrow: 1, height: `calc(100vh - ${logBoxTop}px - 25px)`, overflowX: (kwirthLogOptionsRef.current.wrapLines?'hidden':'auto')}}>\r\n <pre ref={preRef} style={{whiteSpace: (kwirthLogOptionsRef.current.wrapLines ? 'pre-wrap' : 'pre'), wordBreak: kwirthLogOptionsRef.current.wrapLines ? 'break-word' : 'normal'}} >\r\n { messages.map (m => formatLogLine(m)) }\r\n </pre>\r\n <span ref={lastRef}/>\r\n </Box> \r\n </CardContent>\r\n </Card>\r\n </>}\r\n </Box>\r\n </RefBox>\r\n }\r\n { showStatusDialog && <StatusLog level={statusLevel} onClose={() => setShowStatusDialog(false)} statusMessages={statusMessages} onClear={statusClear}/>}\r\n </>)\r\n}\r\n"],"names":["cluster","p"],"mappings":"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"}
|
|
@@ -13,7 +13,7 @@ const Options = (props) => {
|
|
|
13
13
|
setOptions(a);
|
|
14
14
|
props.onChange(a);
|
|
15
15
|
};
|
|
16
|
-
return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(CardHeader, { title: "Options" }), /* @__PURE__ */ React.createElement(Divider, { style: { marginTop: 8 } }), /* @__PURE__ */ React.createElement(Grid, { container: true, direction: "column", spacing: 0 }, /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(FormControlLabel, { style: { marginLeft: 8 }, label: "From start", control: /* @__PURE__ */ React.createElement(Checkbox, { checked: options.fromStart, onChange: () => handleChange({ fromStart: !options.fromStart }), disabled: props.disabled }) })), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(FormControlLabel, { style: { marginLeft: 8 }, label: "Show timestamp", control: /* @__PURE__ */ React.createElement(Checkbox, { checked: options.showTimestamp, onChange: () => handleChange({ showTimestamp: !options.showTimestamp }), disabled: props.disabled }) })), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(FormControlLabel, { style: { marginLeft: 8 }, label: "Show names", control: /* @__PURE__ */ React.createElement(Checkbox, { checked: options.showNames, onChange: () => handleChange({ showNames: !options.showNames }), disabled: props.disabled }) })), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(FormControlLabel, { style: { marginLeft: 8 }, label: "Follow log", control: /* @__PURE__ */ React.createElement(Checkbox, { checked: options.followLog, onChange: () => handleChange({ followLog: !options.followLog }) }), disabled: props.disabled })), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(FormControlLabel, { style: { marginLeft: 8 }, label: "Wrap lines", control: /* @__PURE__ */ React.createElement(Checkbox, { checked: options.wrapLines, onChange: () => handleChange({ wrapLines: !options.wrapLines }) }), disabled: props.disabled })), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(Typography, { style: { fontSize: 9, marginLeft: 20, marginTop: 4, marginBottom: 6 } }, "Powered by ", /* @__PURE__ */ React.createElement("a", { href: "https://jfvilas.github.io/kwirth/", target: "_blank", style: { color: "
|
|
16
|
+
return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(CardHeader, { title: "Options" }), /* @__PURE__ */ React.createElement(Divider, { style: { marginTop: 8 } }), /* @__PURE__ */ React.createElement(Grid, { container: true, direction: "column", spacing: 0 }, /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(FormControlLabel, { style: { marginLeft: 8 }, label: "From start", control: /* @__PURE__ */ React.createElement(Checkbox, { checked: options.fromStart, onChange: () => handleChange({ fromStart: !options.fromStart }), disabled: props.disabled }) })), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(FormControlLabel, { style: { marginLeft: 8 }, label: "Show timestamp", control: /* @__PURE__ */ React.createElement(Checkbox, { checked: options.showTimestamp, onChange: () => handleChange({ showTimestamp: !options.showTimestamp }), disabled: props.disabled }) })), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(FormControlLabel, { style: { marginLeft: 8 }, label: "Show names", control: /* @__PURE__ */ React.createElement(Checkbox, { checked: options.showNames, onChange: () => handleChange({ showNames: !options.showNames }), disabled: props.disabled }) })), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(FormControlLabel, { style: { marginLeft: 8 }, label: "Follow log", control: /* @__PURE__ */ React.createElement(Checkbox, { checked: options.followLog, onChange: () => handleChange({ followLog: !options.followLog }) }), disabled: props.disabled })), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(FormControlLabel, { style: { marginLeft: 8 }, label: "Wrap lines", control: /* @__PURE__ */ React.createElement(Checkbox, { checked: options.wrapLines, onChange: () => handleChange({ wrapLines: !options.wrapLines }) }), disabled: props.disabled })), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(Typography, { style: { fontSize: 9, marginLeft: 20, marginTop: 4, marginBottom: 6 } }, "Powered by ", /* @__PURE__ */ React.createElement("a", { href: "https://jfvilas.github.io/kwirth/", target: "_blank", style: { color: "#1D63ED" } }, "Kwirth")))));
|
|
17
17
|
};
|
|
18
18
|
|
|
19
19
|
export { Options };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Options.esm.js","sources":["../../src/components/Options.tsx"],"sourcesContent":["/*\r\nCopyright 2025 Julio Fernandez\r\n\r\nLicensed under the Apache License, Version 2.0 (the \"License\");\r\nyou may not use this file except in compliance with the License.\r\nYou may obtain a copy of the License at\r\n\r\n http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nUnless required by applicable law or agreed to in writing, software\r\ndistributed under the License is distributed on an \"AS IS\" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n*/\r\nimport React, { useState } from 'react'\r\nimport CardHeader from '@material-ui/core/CardHeader'\r\nimport Checkbox from '@material-ui/core/Checkbox'\r\nimport Divider from '@material-ui/core/Divider'\r\nimport FormControlLabel from '@material-ui/core/FormControlLabel'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport { Typography } from '@material-ui/core'\r\nimport { IOptions } from './IOptions'\r\n\r\ninterface IProps {\r\n options: IOptions,\r\n disabled: boolean,\r\n onChange: (options:IOptions) => void\r\n}\r\n\r\nconst Options = (props: IProps) => {\r\n const [options, setOptions] = useState<IOptions>(props.options);\r\n\r\n const handleChange = (change:any) => {\r\n var a = {...options,...change}\r\n setOptions(a)\r\n props.onChange(a)\r\n }\r\n\r\n return (<>\r\n <CardHeader title={'Options'}/>\r\n <Divider style={{marginTop:8}}/>\r\n <Grid container direction='column' spacing={0}>\r\n <Grid item >\r\n <FormControlLabel style={{marginLeft:8}} label=\"From start\" control={<Checkbox checked={options.fromStart} onChange={() => handleChange({fromStart:!options.fromStart})} disabled={props.disabled}/>} />\r\n </Grid>\r\n <Grid item >\r\n <FormControlLabel style={{marginLeft:8}} label=\"Show timestamp\" control={<Checkbox checked={options.showTimestamp} onChange={() => handleChange({showTimestamp:!options.showTimestamp})} disabled={props.disabled}/>} />\r\n </Grid>\r\n <Grid item >\r\n <FormControlLabel style={{marginLeft:8}} label=\"Show names\" control={<Checkbox checked={options.showNames} onChange={() => handleChange({showNames:!options.showNames})} disabled={props.disabled}/>} />\r\n </Grid>\r\n <Grid item >\r\n <FormControlLabel style={{marginLeft:8}} label=\"Follow log\" control={<Checkbox checked={options.followLog} onChange={() => handleChange({followLog:!options.followLog})} />} disabled={props.disabled}/>\r\n </Grid>\r\n <Grid item >\r\n <FormControlLabel style={{marginLeft:8}} label=\"Wrap lines\" control={<Checkbox checked={options.wrapLines} onChange={() => handleChange({wrapLines:!options.wrapLines})} />} disabled={props.disabled}/>\r\n </Grid>\r\n <Grid item >\r\n <Typography style={{fontSize:9, marginLeft:20, marginTop:4, marginBottom:6}}>Powered by <a href='https://jfvilas.github.io/kwirth/' target='_blank' style={{color:'
|
|
1
|
+
{"version":3,"file":"Options.esm.js","sources":["../../src/components/Options.tsx"],"sourcesContent":["/*\r\nCopyright 2025 Julio Fernandez\r\n\r\nLicensed under the Apache License, Version 2.0 (the \"License\");\r\nyou may not use this file except in compliance with the License.\r\nYou may obtain a copy of the License at\r\n\r\n http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nUnless required by applicable law or agreed to in writing, software\r\ndistributed under the License is distributed on an \"AS IS\" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n*/\r\nimport React, { useState } from 'react'\r\nimport CardHeader from '@material-ui/core/CardHeader'\r\nimport Checkbox from '@material-ui/core/Checkbox'\r\nimport Divider from '@material-ui/core/Divider'\r\nimport FormControlLabel from '@material-ui/core/FormControlLabel'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport { Typography } from '@material-ui/core'\r\nimport { IOptions } from './IOptions'\r\n\r\ninterface IProps {\r\n options: IOptions,\r\n disabled: boolean,\r\n onChange: (options:IOptions) => void\r\n}\r\n\r\nconst Options = (props: IProps) => {\r\n const [options, setOptions] = useState<IOptions>(props.options);\r\n\r\n const handleChange = (change:any) => {\r\n var a = {...options,...change}\r\n setOptions(a)\r\n props.onChange(a)\r\n }\r\n\r\n return (<>\r\n <CardHeader title={'Options'}/>\r\n <Divider style={{marginTop:8}}/>\r\n <Grid container direction='column' spacing={0}>\r\n <Grid item >\r\n <FormControlLabel style={{marginLeft:8}} label=\"From start\" control={<Checkbox checked={options.fromStart} onChange={() => handleChange({fromStart:!options.fromStart})} disabled={props.disabled}/>} />\r\n </Grid>\r\n <Grid item >\r\n <FormControlLabel style={{marginLeft:8}} label=\"Show timestamp\" control={<Checkbox checked={options.showTimestamp} onChange={() => handleChange({showTimestamp:!options.showTimestamp})} disabled={props.disabled}/>} />\r\n </Grid>\r\n <Grid item >\r\n <FormControlLabel style={{marginLeft:8}} label=\"Show names\" control={<Checkbox checked={options.showNames} onChange={() => handleChange({showNames:!options.showNames})} disabled={props.disabled}/>} />\r\n </Grid>\r\n <Grid item >\r\n <FormControlLabel style={{marginLeft:8}} label=\"Follow log\" control={<Checkbox checked={options.followLog} onChange={() => handleChange({followLog:!options.followLog})} />} disabled={props.disabled}/>\r\n </Grid>\r\n <Grid item >\r\n <FormControlLabel style={{marginLeft:8}} label=\"Wrap lines\" control={<Checkbox checked={options.wrapLines} onChange={() => handleChange({wrapLines:!options.wrapLines})} />} disabled={props.disabled}/>\r\n </Grid>\r\n <Grid item >\r\n <Typography style={{fontSize:9, marginLeft:20, marginTop:4, marginBottom:6}}>Powered by <a href='https://jfvilas.github.io/kwirth/' target='_blank' style={{color:'#1D63ED'}}>Kwirth</a></Typography>\r\n </Grid>\r\n </Grid>\r\n </>)\r\n}\r\n\r\nexport { Options }"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
|
|
2
2
|
import { DiscoveryApi, FetchApi } from '@backstage/core-plugin-api';
|
|
3
|
+
import * as _backstage_frontend_plugin_api from '@backstage/frontend-plugin-api';
|
|
3
4
|
import { Entity } from '@backstage/catalog-model';
|
|
4
5
|
import { InstanceConfigScopeEnum } from '@jfvilas/kwirth-common';
|
|
5
6
|
import { ClusterValidPods, IBackendInfo } from '@jfvilas/plugin-kwirth-common';
|
|
@@ -11,6 +12,8 @@ interface IEntityKwirthLogProps {
|
|
|
11
12
|
showNames?: boolean;
|
|
12
13
|
followLog?: boolean;
|
|
13
14
|
wrapLines?: boolean;
|
|
15
|
+
hideVersion?: boolean;
|
|
16
|
+
excludeContainers?: string[];
|
|
14
17
|
}
|
|
15
18
|
|
|
16
19
|
declare const kwirthLogPlugin: _backstage_core_plugin_api.BackstagePlugin<{
|
|
@@ -24,7 +27,7 @@ interface KwirthLogApi {
|
|
|
24
27
|
getVersion(): Promise<any>;
|
|
25
28
|
getInfo(): any;
|
|
26
29
|
}
|
|
27
|
-
declare const kwirthLogApiRef:
|
|
30
|
+
declare const kwirthLogApiRef: _backstage_frontend_plugin_api.ApiRef<KwirthLogApi>;
|
|
28
31
|
|
|
29
32
|
interface KwirthLogClientOptions {
|
|
30
33
|
discoveryApi: DiscoveryApi;
|
|
@@ -45,7 +48,5 @@ declare class KwirthLogClient implements KwirthLogApi {
|
|
|
45
48
|
requestAccess(entity: Entity, channel: string, scopes: InstanceConfigScopeEnum[]): Promise<ClusterValidPods[]>;
|
|
46
49
|
}
|
|
47
50
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
export { EntityKwirthLogContent, KwirthLogClient, VERSION, kwirthLogApiRef, kwirthLogPlugin };
|
|
51
|
+
export { EntityKwirthLogContent, KwirthLogClient, kwirthLogApiRef, kwirthLogPlugin };
|
|
51
52
|
export type { KwirthLogApi, KwirthLogClientOptions };
|
package/dist/version.esm.js
CHANGED
package/dist/version.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.esm.js","sources":["../src/version.ts"],"sourcesContent":["export const VERSION:string=\"0.
|
|
1
|
+
{"version":3,"file":"version.esm.js","sources":["../src/version.ts"],"sourcesContent":["export const VERSION:string=\"0.14.2\"; \r\n"],"names":[],"mappings":"AAAO,MAAM,OAAA,GAAe;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jfvilas/plugin-kwirth-log",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.2",
|
|
4
4
|
"description": "Frontend plugin for viewing real-time Kubernetes logs in Backstage",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Backstage",
|
|
@@ -44,6 +44,13 @@
|
|
|
44
44
|
},
|
|
45
45
|
"main": "./dist/index.esm.js",
|
|
46
46
|
"types": "./dist/index.d.ts",
|
|
47
|
+
"typesVersions": {
|
|
48
|
+
"*": {
|
|
49
|
+
"package.json": [
|
|
50
|
+
"package.json"
|
|
51
|
+
]
|
|
52
|
+
}
|
|
53
|
+
},
|
|
47
54
|
"files": [
|
|
48
55
|
"dist"
|
|
49
56
|
],
|
|
@@ -57,20 +64,20 @@
|
|
|
57
64
|
"test": "backstage-cli package test"
|
|
58
65
|
},
|
|
59
66
|
"dependencies": {
|
|
60
|
-
"@backstage/catalog-model": "^1.
|
|
61
|
-
"@backstage/core-components": "^0.
|
|
62
|
-
"@backstage/core-plugin-api": "^1.
|
|
63
|
-
"@backstage/frontend-plugin-api": "^0.
|
|
64
|
-
"@backstage/integration-react": "^1.
|
|
65
|
-
"@backstage/plugin-auth-react": "^0.1.
|
|
66
|
-
"@backstage/plugin-catalog-react": "^1.
|
|
67
|
+
"@backstage/catalog-model": "^1.7.7",
|
|
68
|
+
"@backstage/core-components": "^0.18.8",
|
|
69
|
+
"@backstage/core-plugin-api": "^1.12.4",
|
|
70
|
+
"@backstage/frontend-plugin-api": "^0.15.1",
|
|
71
|
+
"@backstage/integration-react": "^1.2.16",
|
|
72
|
+
"@backstage/plugin-auth-react": "^0.1.25",
|
|
73
|
+
"@backstage/plugin-catalog-react": "^2.1.0",
|
|
67
74
|
"@material-ui/core": "^4.12.2",
|
|
68
75
|
"@material-ui/icons": "^4.9.1",
|
|
69
76
|
"@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0",
|
|
70
77
|
"react-use": "^17.2.4"
|
|
71
78
|
},
|
|
72
79
|
"devDependencies": {
|
|
73
|
-
"@backstage/cli": "^0.
|
|
80
|
+
"@backstage/cli": "^0.36.0",
|
|
74
81
|
"@testing-library/dom": "^10.0.0",
|
|
75
82
|
"@testing-library/jest-dom": "^6.0.0",
|
|
76
83
|
"@testing-library/react": "^15.0.0",
|