@jfvilas/plugin-kwirth-log 0.13.0 → 0.13.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/README.md CHANGED
@@ -1,8 +1,6 @@
1
1
  # Backstage frontend KwirthLog plugin
2
2
  This package is a Backstage frontend plugin for **viewing Kubernetes logs** in real-time (live-streaming) via Kwirth.
3
3
 
4
- **NOTE: KwithLog requires Kwirth vesrsion 0.3.160 or greater**
5
-
6
4
  This Backstage plugin allows you to live-stream Kubernetes logs associated to your Backstage entities directly inside your Backstage instance. It's very important to understand that for this plugin to work...:
7
5
 
8
6
  - You need to install the Kwirth [Backstage backend plugin](https://www.npmjs.com/package/@jfvilas/plugin-kwirth-backend).
@@ -13,6 +11,17 @@ Kwirth is a really-easy-to-use data-exporting system for Kubernetes that runs in
13
11
  You can access [Kwirth project here](https://github.com/jfvilas/kwirth).
14
12
 
15
13
 
14
+ ## Version compatibility
15
+ Following table shows version compatibility between this Kwirth Backstage plugin and Kwirth Core server.
16
+
17
+ | Plugin Kwirth version | Kwirth version |
18
+ |-|-|
19
+ |0.13.0|0.4.131|
20
+ |0.12.8|0.4.45|
21
+ |0.12.5|0.4.20|
22
+ |0.11.3|0.3.160|
23
+
24
+
16
25
  ## What is this plugin for?
17
26
  This Backstage plugin adds Backstage a feature for viewing real-time Kubernetes logs of your Backstage entities directly inside Backstage frontend application. The plugin will be enabled for any entity that is correctly tagged (according to Backstage Kubernetes core feature) and its correpsonding Kubernetes resources are found on any of the clusters that have been added to Backstage.
18
27
 
@@ -38,17 +47,6 @@ Let's explain this by following a user working sequence:
38
47
  If everyting is correctly configured and tagged, the user should see a list of clusters. When selecting a cluster, the user should see a list of namespaces where the entity is running.
39
48
 
40
49
 
41
- ## Version compatibility
42
- Following table shows version compatibility between this Kwirth Backstage plugin and Kwirth Core server.
43
-
44
- | Plugin Kwirth version | Kwirth version |
45
- |-|-|
46
- |0.13.0|0.4.131|
47
- |0.12.8|0.4.45|
48
- |0.12.5|0.4.20|
49
- |0.11.3|0.3.160|
50
-
51
-
52
50
  ## Installation
53
51
  It's very simple and straightforward, it is in fact very similar to any other forntend Backstage plugin.
54
52
 
@@ -58,7 +56,7 @@ It's very simple and straightforward, it is in fact very similar to any other fo
58
56
 
59
57
  ```sh
60
58
  # From your Backstage root directory
61
- yarn --cwd packages/app add @jfvilas/plugin-kwirth-log @jfvilas/plugin-kwirth-common @jfvilas/kwirth-common
59
+ yarn --cwd packages/app add @jfvilas/plugin-kwirth-log @jfvilas/plugin-kwirth-frontend @jfvilas/plugin-kwirth-common @jfvilas/kwirth-common
62
60
  ```
63
61
 
64
62
  3. Make sure the [Kwirth backend plugin](https://www.npmjs.com/package/@jfvilas/plugin-kwirth-backend#configure) is installed and configured.
@@ -8,6 +8,7 @@ import { kwirthLogApiRef } from '../api/types.esm.js';
8
8
  import { SignalMessageLevelEnum, InstanceConfigScopeEnum, InstanceMessageChannelEnum, InstanceMessageTypeEnum, OpsCommandEnum, accessKeySerialize, InstanceMessageFlowEnum, InstanceMessageActionEnum, InstanceConfigViewEnum, InstanceConfigObjectEnum } 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
+ import { VERSION } from '../index.esm.js';
11
12
  import { Box, Grid, Card, CardHeader, TextField, InputAdornment, CardContent } from '@material-ui/core';
12
13
  import Divider from '@material-ui/core/Divider';
13
14
  import IconButton from '@material-ui/core/IconButton';
@@ -454,7 +455,7 @@ const EntityKwirthLogContent = (props) => {
454
455
  }
455
456
  return /* @__PURE__ */ React.createElement(React.Fragment, null, podPrefix, containerPrefix, logLine.text + "\n");
456
457
  };
457
- return /* @__PURE__ */ React.createElement(React.Fragment, null, loading && /* @__PURE__ */ React.createElement(Progress, null), !isKwirthAvailable(entity) && !loading && error && /* @__PURE__ */ React.createElement(WarningPanel, { title: "An error has ocurred while obtaining data from kuebernetes clusters.", message: error?.message }), !isKwirthAvailable(entity) && !loading && /* @__PURE__ */ React.createElement(MissingAnnotationEmptyState, { readMoreUrl: "https://github.com/jfvilas/plugin-kwirth-log", annotation: [ANNOTATION_BACKSTAGE_KUBERNETES_LABELID, ANNOTATION_BACKSTAGE_KUBERNETES_LABELSELECTOR] }), isKwirthAvailable(entity) && !loading && validClusters && validClusters.length === 0 && /* @__PURE__ */ React.createElement(ComponentNotFound, { error: ErrorType.NO_CLUSTERS, entity }), isKwirthAvailable(entity) && !loading && validClusters && validClusters.length > 0 && validClusters.reduce((sum, cluster) => sum + cluster.pods.length, 0) === 0 && /* @__PURE__ */ React.createElement(ComponentNotFound, { error: ErrorType.NO_PODS, entity }), isKwirthAvailable(entity) && !loading && validClusters && validClusters.length > 0 && validClusters.reduce((sum, cluster) => sum + cluster.pods.length, 0) > 0 && /* @__PURE__ */ React.createElement(Box, { sx: { display: "flex", height: "70vh" } }, /* @__PURE__ */ React.createElement(Box, { sx: { width: "200px", maxWidth: "200px" } }, /* @__PURE__ */ React.createElement(Grid, { container: true, direction: "column" }, /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(Card, null, /* @__PURE__ */ React.createElement(ClusterList, { resources: validClusters, selectedClusterName, onSelect: onSelectCluster }))), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(Card, null, /* @__PURE__ */ React.createElement(Options, { options: kwirthLogOptionsRef.current, onChange: onChangeLogConfig, disabled: selectedContainerNames.length === 0 || started || paused.current }))), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(Card, null, /* @__PURE__ */ React.createElement(KwirthNews, { latestVersions: backendInfo, backendVersion }))))), /* @__PURE__ */ React.createElement(Box, { sx: { flexGrow: 1, flex: 1, overflow: "hidden", p: 1, marginLeft: "8px" } }, !selectedClusterName && /* @__PURE__ */ React.createElement("img", { src: KwirthLogLogo, alt: "No cluster selected", style: { left: "40%", marginTop: "10%", width: "20%", position: "relative" } }), selectedClusterName && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Card, { style: { marginTop: -8, height: "100%", display: "flex", flexDirection: "column" } }, /* @__PURE__ */ React.createElement(
458
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, loading && /* @__PURE__ */ React.createElement(Progress, null), !isKwirthAvailable(entity) && !loading && error && /* @__PURE__ */ React.createElement(WarningPanel, { title: "An error has ocurred while obtaining data from kuebernetes clusters.", message: error?.message }), !isKwirthAvailable(entity) && !loading && /* @__PURE__ */ React.createElement(MissingAnnotationEmptyState, { readMoreUrl: "https://github.com/jfvilas/plugin-kwirth-log", annotation: [ANNOTATION_BACKSTAGE_KUBERNETES_LABELID, ANNOTATION_BACKSTAGE_KUBERNETES_LABELSELECTOR] }), isKwirthAvailable(entity) && !loading && validClusters && validClusters.length === 0 && /* @__PURE__ */ React.createElement(ComponentNotFound, { error: ErrorType.NO_CLUSTERS, entity }), isKwirthAvailable(entity) && !loading && validClusters && validClusters.length > 0 && validClusters.reduce((sum, cluster) => sum + cluster.pods.length, 0) === 0 && /* @__PURE__ */ React.createElement(ComponentNotFound, { error: ErrorType.NO_PODS, entity }), isKwirthAvailable(entity) && !loading && validClusters && validClusters.length > 0 && validClusters.reduce((sum, cluster) => sum + cluster.pods.length, 0) > 0 && /* @__PURE__ */ React.createElement(Box, { sx: { display: "flex", height: "70vh" } }, /* @__PURE__ */ React.createElement(Box, { sx: { width: "200px", maxWidth: "200px" } }, /* @__PURE__ */ React.createElement(Grid, { container: true, direction: "column" }, /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(Card, null, /* @__PURE__ */ React.createElement(ClusterList, { resources: validClusters, selectedClusterName, onSelect: onSelectCluster }))), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(Card, null, /* @__PURE__ */ React.createElement(Options, { options: kwirthLogOptionsRef.current, onChange: onChangeLogConfig, disabled: selectedContainerNames.length === 0 || started || paused.current }))), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(Card, null, /* @__PURE__ */ React.createElement(KwirthNews, { latestVersions: backendInfo, backendVersion, ownVersion: VERSION }))))), /* @__PURE__ */ React.createElement(Box, { sx: { flexGrow: 1, flex: 1, overflow: "hidden", p: 1, marginLeft: "8px" } }, !selectedClusterName && /* @__PURE__ */ React.createElement("img", { src: KwirthLogLogo, alt: "No cluster selected", style: { left: "40%", marginTop: "10%", width: "20%", position: "relative" } }), selectedClusterName && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Card, { style: { marginTop: -8, height: "100%", display: "flex", flexDirection: "column" } }, /* @__PURE__ */ React.createElement(
458
459
  CardHeader,
459
460
  {
460
461
  title: statusButtons(selectedClusterName),
@@ -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, { 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 } 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\n\r\nconst LOG_MAX_MESSAGES=1000\r\n\r\nexport interface IProps {\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}\r\n\r\nexport const EntityKwirthLogContent: React.FC<IProps> = (props:IProps) => { \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\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 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)))\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 (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 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 <Box sx={{ display: 'flex', height:'70vh'}}>\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 <Grid item>\r\n <Card>\r\n <KwirthNews latestVersions={backendInfo} backendVersion={backendVersion}/>\r\n </Card>\r\n </Grid>\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}/>\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 }}>\r\n <pre ref={preRef} style={{overflowX: (kwirthLogOptionsRef.current.wrapLines?'hidden':'auto'), 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 </Box>\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, { 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\nimport { VERSION } from '../index'\r\n\r\n// Material-UI\r\nimport { Grid, Card, CardHeader, CardContent, Box, TextField, InputAdornment } 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\n\r\nconst LOG_MAX_MESSAGES=1000\r\n\r\nexport interface IProps {\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}\r\n\r\nexport const EntityKwirthLogContent: React.FC<IProps> = (props:IProps) => { \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\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 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)))\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 (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 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 <Box sx={{ display: 'flex', height:'70vh'}}>\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 <Grid item>\r\n <Card>\r\n <KwirthNews latestVersions={backendInfo} backendVersion={backendVersion} ownVersion={VERSION}/>\r\n </Card>\r\n </Grid>\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}/>\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 }}>\r\n <pre ref={preRef} style={{overflowX: (kwirthLogOptionsRef.current.wrapLines?'hidden':'auto'), 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 </Box>\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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"}
package/dist/index.esm.js CHANGED
@@ -2,7 +2,7 @@ export { EntityKwirthLogContent, kwirthLogPlugin } from './plugin.esm.js';
2
2
  export { KwirthLogClient } from './api/KwirthLogClient.esm.js';
3
3
  export { kwirthLogApiRef } from './api/types.esm.js';
4
4
 
5
- const VERSION = "0.12.9";
5
+ const VERSION = "0.13.2";
6
6
 
7
7
  export { VERSION };
8
8
  //# sourceMappingURL=index.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/index.ts"],"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\nexport const VERSION='0.12.9'\r\n\r\nexport { EntityKwirthLogContent, kwirthLogPlugin } from './plugin'\r\nexport { KwirthLogClient, kwirthLogApiRef } from './api'\r\n\r\nexport type { KwirthLogApi, KwirthLogClientOptions } from './api'\r\n"],"names":[],"mappings":";;;;AAeO,MAAM,OAAA,GAAQ;;;;"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/index.ts"],"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\nexport const VERSION='0.13.2'\r\n\r\nexport { EntityKwirthLogContent, kwirthLogPlugin } from './plugin'\r\nexport { KwirthLogClient, kwirthLogApiRef } from './api'\r\n\r\nexport type { KwirthLogApi, KwirthLogClientOptions } from './api'\r\n"],"names":[],"mappings":";;;;AAeO,MAAM,OAAA,GAAQ;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jfvilas/plugin-kwirth-log",
3
- "version": "0.13.0",
3
+ "version": "0.13.2",
4
4
  "description": "Frontend plugin for viewing real-time Kubernetes logs in Backstage",
5
5
  "keywords": [
6
6
  "Backstage",
@@ -15,6 +15,7 @@
15
15
  "pluginId": "kwirth",
16
16
  "pluginPackages": [
17
17
  "@jfvilas/plugin-kwirth-log",
18
+ "@jfvilas/plugin-kwirth-frontend",
18
19
  "@jfvilas/plugin-kwirth-backend",
19
20
  "@jfvilas/plugin-kwirth-common"
20
21
  ]