@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.
@@ -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 { SignalMessageLevelEnum, InstanceConfigScopeEnum, InstanceMessageChannelEnum, InstanceMessageTypeEnum, OpsCommandEnum, accessKeySerialize, InstanceMessageFlowEnum, InstanceMessageActionEnum, InstanceConfigViewEnum, InstanceConfigObjectEnum } from '@jfvilas/kwirth-common';
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(SignalMessageLevelEnum.INFO);
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", borderColor: "#f0f0f0", backgroundColor: "#f0f0f0", paddingLeft: 3, paddingRight: 3, cursor: "pointer" };
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: InstanceMessageTypeEnum.SIGNAL,
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 InstanceMessageTypeEnum.DATA:
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 InstanceMessageTypeEnum.SIGNAL:
168
- if (instanceMessage.flow === InstanceMessageFlowEnum.RESPONSE && instanceMessage.action === InstanceMessageActionEnum.START) {
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 SignalMessageLevelEnum.INFO:
182
+ case ESignalMessageLevel.INFO:
183
183
  alertApi.post({ message: signalMessage.text, severity: "info", display: "transient" });
184
184
  break;
185
- case SignalMessageLevelEnum.WARNING:
185
+ case ESignalMessageLevel.WARNING:
186
186
  alertApi.post({ message: signalMessage.text, severity: "warning", display: "transient" });
187
187
  break;
188
- case SignalMessageLevelEnum.ERROR:
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(SignalMessageLevelEnum.ERROR, "Invalid message type received: " + instanceMessage.type);
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: InstanceMessageTypeEnum.SIGNAL
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(SignalMessageLevelEnum.WARNING, "Operations message: " + opsMessage.data.data);
227
+ addMessage(ESignalMessageLevel.WARNING, "Operations message: " + opsMessage.data.data);
228
228
  else
229
- addMessage(SignalMessageLevelEnum.WARNING, "Operations message: " + JSON.stringify(opsMessage));
229
+ addMessage(ESignalMessageLevel.WARNING, "Operations message: " + JSON.stringify(opsMessage));
230
230
  break;
231
231
  default:
232
- addMessage(SignalMessageLevelEnum.ERROR, "Invalid channel in message: " + instanceMessage.channel);
233
- addMessage(SignalMessageLevelEnum.ERROR, "Invalid message: " + JSON.stringify(instanceMessage));
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(SignalMessageLevelEnum.ERROR, "No cluster selected");
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(SignalMessageLevelEnum.ERROR, "No pods found");
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: InstanceConfigObjectEnum.PODS,
262
- action: InstanceMessageActionEnum.START,
263
- flow: InstanceMessageFlowEnum.REQUEST,
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 ? InstanceConfigViewEnum.CONTAINER : InstanceConfigViewEnum.POD,
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: InstanceMessageTypeEnum.SIGNAL
278
+ type: EInstanceMessageType.SIGNAL
279
279
  };
280
280
  ws.send(JSON.stringify(iConfig));
281
281
  } else {
282
- addMessage(SignalMessageLevelEnum.ERROR, "No accessKey for starting log streaming");
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(SignalMessageLevelEnum.ERROR, "No cluster selected");
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: InstanceMessageTypeEnum.DATA,
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: InstanceMessageTypeEnum.DATA,
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(SignalMessageLevelEnum.ERROR, "No cluster selected");
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(SignalMessageLevelEnum.ERROR, "No access key present");
356
+ addMessage(ESignalMessageLevel.ERROR, "No access key present");
357
357
  return;
358
358
  }
359
359
  if (!instance) {
360
- addMessage(SignalMessageLevelEnum.ERROR, "No instance has been established");
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: InstanceMessageActionEnum.COMMAND,
368
- flow: InstanceMessageFlowEnum.IMMEDIATE,
369
- type: InstanceMessageTypeEnum.DATA,
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: OpsCommandEnum.RESTARTPOD,
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: InstanceMessageActionEnum.ROUTE,
385
- flow: InstanceMessageFlowEnum.IMMEDIATE,
386
- type: InstanceMessageTypeEnum.SIGNAL,
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 === InstanceMessageTypeEnum.SIGNAL && m.level === SignalMessageLevelEnum.INFO), onClick: () => show(SignalMessageLevelEnum.INFO) }, /* @__PURE__ */ React.createElement(InfoIcon, { style: { color: statusMessages.some((m) => m.type === InstanceMessageTypeEnum.SIGNAL && m.level === SignalMessageLevelEnum.INFO) ? "blue" : "#BDBDBD" } })), /* @__PURE__ */ React.createElement(IconButton, { title: "warning", disabled: !statusMessages.some((m) => m.type === InstanceMessageTypeEnum.SIGNAL && m.level === SignalMessageLevelEnum.WARNING), onClick: () => show(SignalMessageLevelEnum.WARNING), style: { marginLeft: "-16px" } }, /* @__PURE__ */ React.createElement(WarningIcon, { style: { color: statusMessages.some((m) => m.type === InstanceMessageTypeEnum.SIGNAL && m.level === SignalMessageLevelEnum.WARNING) ? "orange" : "#BDBDBD" } })), /* @__PURE__ */ React.createElement(IconButton, { title: "error", disabled: !statusMessages.some((m) => m.type === InstanceMessageTypeEnum.SIGNAL && m.level === SignalMessageLevelEnum.ERROR), onClick: () => show(SignalMessageLevelEnum.ERROR), style: { marginLeft: "-16px" } }, /* @__PURE__ */ React.createElement(ErrorIcon, { style: { color: statusMessages.some((m) => m.type === InstanceMessageTypeEnum.SIGNAL && m.level === SignalMessageLevelEnum.ERROR) ? "red" : "#BDBDBD" } }))));
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 formatMessage = (logLine) => {
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) => formatMessage(m))), /* @__PURE__ */ React.createElement("span", { ref: lastRef }))))))), showStatusDialog && /* @__PURE__ */ React.createElement(StatusLog, { level: statusLevel, onClose: () => setShowStatusDialog(false), statusMessages, onClear: statusClear }));
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: "blue" } }, "Kwirth")))));
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:'blue'}}>Kwirth</a></Typography>\r\n </Grid>\r\n </Grid>\r\n </>)\r\n}\r\n\r\nexport { Options }"],"names":[],"mappings":"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"}
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":";;;;;;;;AA8BA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAkB;AAC/B,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,QAAA,CAAmB,MAAM,OAAO,CAAA;AAE9D,EAAA,MAAM,YAAA,GAAe,CAAC,MAAA,KAAe;AACjC,IAAA,IAAI,CAAA,GAAI,EAAC,GAAG,OAAA,EAAQ,GAAG,MAAA,EAAM;AAC7B,IAAA,UAAA,CAAW,CAAC,CAAA;AACZ,IAAA,KAAA,CAAM,SAAS,CAAC,CAAA;AAAA,EACpB,CAAA;AAEA,EAAA,uBAAQ,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,kBACJ,KAAA,CAAA,aAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAO,SAAA,EAAU,mBAC7B,KAAA,CAAA,aAAA,CAAC,OAAA,EAAA,EAAQ,KAAA,EAAO,EAAC,SAAA,EAAU,CAAA,IAAG,CAAA,kBAC9B,KAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAS,IAAA,EAAC,SAAA,EAAU,QAAA,EAAS,OAAA,EAAS,CAAA,EAAA,kBACxC,KAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAA,kBACN,KAAA,CAAA,aAAA,CAAC,oBAAiB,KAAA,EAAO,EAAC,UAAA,EAAW,CAAA,EAAC,EAAG,KAAA,EAAM,cAAa,OAAA,kBAAS,KAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAS,OAAA,EAAS,OAAA,CAAQ,SAAA,EAAW,UAAU,MAAM,YAAA,CAAa,EAAC,SAAA,EAAU,CAAC,OAAA,CAAQ,SAAA,EAAU,CAAA,EAAG,QAAA,EAAU,KAAA,CAAM,QAAA,EAAS,CAAA,EAAI,CAC1M,mBACA,KAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAA,kBACN,KAAA,CAAA,aAAA,CAAC,gBAAA,EAAA,EAAiB,OAAO,EAAC,UAAA,EAAW,CAAA,EAAC,EAAG,KAAA,EAAM,gBAAA,EAAiB,yBAAS,KAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAS,OAAA,EAAS,OAAA,CAAQ,aAAA,EAAe,QAAA,EAAU,MAAM,YAAA,CAAa,EAAC,aAAA,EAAc,CAAC,OAAA,CAAQ,aAAA,EAAc,GAAG,QAAA,EAAU,KAAA,CAAM,QAAA,EAAS,CAAA,EAAI,CAC1N,CAAA,kBACA,KAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAA,kBACN,KAAA,CAAA,aAAA,CAAC,gBAAA,EAAA,EAAiB,KAAA,EAAO,EAAC,YAAW,CAAA,EAAC,EAAG,KAAA,EAAM,YAAA,EAAa,OAAA,kBAAS,KAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAS,OAAA,EAAS,OAAA,CAAQ,SAAA,EAAW,QAAA,EAAU,MAAM,YAAA,CAAa,EAAC,WAAU,CAAC,OAAA,CAAQ,SAAA,EAAU,CAAA,EAAG,QAAA,EAAU,MAAM,QAAA,EAAS,CAAA,EAAI,CAC1M,CAAA,kBACA,KAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,MAAI,IAAA,EAAA,kBACN,KAAA,CAAA,aAAA,CAAC,gBAAA,EAAA,EAAiB,KAAA,EAAO,EAAC,UAAA,EAAW,CAAA,EAAC,EAAI,KAAA,EAAM,YAAA,EAAa,OAAA,kBAAS,KAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAS,OAAA,EAAS,QAAQ,SAAA,EAAW,QAAA,EAAU,MAAM,YAAA,CAAa,EAAC,SAAA,EAAU,CAAC,OAAA,CAAQ,SAAA,EAAU,CAAA,EAAG,CAAA,EAAI,QAAA,EAAU,MAAM,QAAA,EAAS,CAC3M,CAAA,kBACA,KAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAA,kBACN,KAAA,CAAA,aAAA,CAAC,gBAAA,EAAA,EAAiB,KAAA,EAAO,EAAC,UAAA,EAAW,CAAA,EAAC,EAAI,OAAM,YAAA,EAAa,OAAA,kBAAS,KAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAS,OAAA,EAAS,OAAA,CAAQ,WAAW,QAAA,EAAU,MAAM,YAAA,CAAa,EAAC,SAAA,EAAU,CAAC,QAAQ,SAAA,EAAU,CAAA,EAAG,CAAA,EAAI,QAAA,EAAU,KAAA,CAAM,QAAA,EAAS,CAC3M,CAAA,kBACA,KAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAA,kBACN,KAAA,CAAA,aAAA,CAAC,cAAW,KAAA,EAAO,EAAC,QAAA,EAAS,CAAA,EAAG,UAAA,EAAW,EAAA,EAAI,SAAA,EAAU,CAAA,EAAG,YAAA,EAAa,CAAA,EAAC,EAAA,EAAG,aAAA,kBAAW,KAAA,CAAA,aAAA,CAAC,GAAA,EAAA,EAAE,MAAK,mCAAA,EAAoC,MAAA,EAAO,QAAA,EAAS,KAAA,EAAO,EAAC,KAAA,EAAM,SAAA,EAAS,EAAA,EAAG,QAAM,CAAI,CAC5L,CACJ,CACJ,CAAA;AACJ;;;;"}
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: _backstage_core_plugin_api.ApiRef<KwirthLogApi>;
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
- declare const VERSION = "0.13.4";
49
-
50
- export { EntityKwirthLogContent, KwirthLogClient, VERSION, kwirthLogApiRef, kwirthLogPlugin };
51
+ export { EntityKwirthLogContent, KwirthLogClient, kwirthLogApiRef, kwirthLogPlugin };
51
52
  export type { KwirthLogApi, KwirthLogClientOptions };
@@ -1,4 +1,4 @@
1
- const VERSION = "0.13.5";
1
+ const VERSION = "0.14.2";
2
2
 
3
3
  export { VERSION };
4
4
  //# sourceMappingURL=version.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.esm.js","sources":["../src/version.ts"],"sourcesContent":["export const VERSION:string=\"0.13.5\"; \r\n"],"names":[],"mappings":"AAAO,MAAM,OAAA,GAAe;;;;"}
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.13.5",
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.5.0",
61
- "@backstage/core-components": "^0.14.9",
62
- "@backstage/core-plugin-api": "^1.9.3",
63
- "@backstage/frontend-plugin-api": "^0.7.0",
64
- "@backstage/integration-react": "^1.1.29",
65
- "@backstage/plugin-auth-react": "^0.1.4",
66
- "@backstage/plugin-catalog-react": "^1.12.2",
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.26.11",
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",