@jfvilas/plugin-kwirth-log 0.13.3 → 0.13.5

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
@@ -67,46 +67,61 @@ It's very simple and straightforward, it is in fact very similar to any other fo
67
67
  ## Configuration: Entity Pages
68
68
  For Kwirth plugin to be usable on the frontend, you must tailor your Entity Page to include the Kwirth components.
69
69
 
70
- 1. Add the plugin as a tab in your Entity pages:
71
-
72
- Firstly, import the plugin module.
73
- ```typescript
74
- // In packages/app/src/components/catalog/EntityPage.tsx
75
- import { EntityKwirthLogContent } from '@jfvilas/plugin-kwirth-log';
76
- import { isKwirthAvailable } from '@jfvilas/plugin-kwirth-common';
77
- ```
78
-
79
- Then, add a tab to your EntityPage (the 'if' is optional, you can keep the 'KwirthLog' tab always visible if you prefer to do it that way).
80
- ```jsx
81
- // Note: Add to any other Pages as well (e.g. defaultEntityPage or webSiteEntityPage, for example)
82
- const serviceEntityPage = (
83
- <EntityLayout>
84
- {/* other tabs... */}
85
- <EntityLayout.Route if={isKwirthAvailable} path="/kwirthlog" title="KwirthLog">
86
- <EntityKwirthLogContent enableRestart={false} />
87
- </EntityLayout.Route>
88
- </EntityLayout>
89
- )
90
- ```
91
-
92
- You can setup some default *viewing* options on the `EntityKwirthLogContent` component, so, when the entity loads the default options will be set. These options are:
93
- - `formStart`
94
- - `showNames`
95
- - `showTimestamp`
96
- - `followLog`
97
- - `wrapLines`
98
- (The meaning of these properties are explained at the end of this document)
99
-
100
- For example, you could setup your default log stream like this:
101
- ```jsx
102
- ...
103
- <EntityLayout.Route if={isKwirthAvailable} path="/kwirthlog" title="KwirthLog">
104
- <EntityKwirthLogContent enableRestart={false} fromStrat={true} showTimestamp={true} wrapLines={true} />
105
- </EntityLayout.Route>
106
- ...
107
- ```
108
-
109
- 2. Label your catalog-info according to one of these two startegies:
70
+ #### 1. Add the plugin as a tab in your Entity pages:
71
+
72
+ Firstly, import the plugin module.
73
+
74
+ ```typescript
75
+ // In packages/app/src/components/catalog/EntityPage.tsx
76
+ import { EntityKwirthLogContent } from '@jfvilas/plugin-kwirth-log';
77
+ import { isKwirthAvailable } from '@jfvilas/plugin-kwirth-common';
78
+ ```
79
+
80
+ Then, add a tab to your EntityPage (the 'if' is optional, you can keep the 'KwirthLog' tab always visible if you prefer to do it that way).
81
+
82
+ ```jsx
83
+ // Note: Add to any other Pages as well (e.g. defaultEntityPage or webSiteEntityPage, for example)
84
+ const serviceEntityPage = (
85
+ <EntityLayout>
86
+ {/* other tabs... */}
87
+ <EntityLayout.Route if={isKwirthAvailable} path="/kwirthlog" title="KwirthLog">
88
+ <EntityKwirthLogContent enableRestart={false} />
89
+ </EntityLayout.Route>
90
+ </EntityLayout>
91
+ )
92
+ ```
93
+
94
+ You can setup some default *viewing* options on the `EntityKwirthLogContent` component, so, when the entity loads the default options will be set. These options are:
95
+ - `fromStart`
96
+ - `showNames`
97
+ - `showTimestamp`
98
+ - `followLog`
99
+ - `wrapLines`
100
+
101
+ For example, you could setup your default log stream like this (The meaning of these properties are explained at the end of this document):
102
+
103
+ ```jsx
104
+ ...
105
+ <EntityLayout.Route if={isKwirthAvailable} path="/kwirthlog" title="KwirthLog">
106
+ <EntityKwirthLogContent enableRestart={false} fromStrat={true} showTimestamp={true} wrapLines={true} />
107
+ </EntityLayout.Route>
108
+ ...
109
+ ```
110
+
111
+ You can also set some behaviour options for the plugin:
112
+ - `hideVersion` (optional `boolean`) if set to `true`, version information updates will not be shown.
113
+ - `excludeContainers` (optional `string[]`), an array of container names that will be excluded from visualization. For example, if you have pods that include sidecars, you can exclude sidecard log messages using this property. What follows is an example on how to use these properties:
114
+
115
+ ```jsx
116
+ ...
117
+ <EntityLayout.Route if={isKwirthAvailable} path="/kwirthlog" title="KwirthLog">
118
+ <EntityKwirthLogContent hideVersion excludeContainers={['istio-proxy', 'nginx']} />
119
+ </EntityLayout.Route>
120
+ ...
121
+ ```
122
+
123
+ #### 2. Label your catalog-info
124
+ Use one of these two startegies:
110
125
 
111
126
  - **Strategy 1: one-to-one**. Add `backstage.io/kubernetes-id` annotation to your `catalog-info.yaml` for the entities deployed to Kubernetes you want to work with on Backstage. This is the same annotation that the Kubernetes core plugin uses, so, maybe you already have added it to your components. Exmaple:
112
127
 
@@ -120,7 +135,7 @@ For Kwirth plugin to be usable on the frontend, you must tailor your Entity Page
120
135
 
121
136
  ```yaml
122
137
  metadata:
123
- annotaations:
138
+ annotations:
124
139
  backstage.io/kubernetes-id: 'app=core,artifact=backend'
125
140
  ```
126
141
 
@@ -1,4 +1,4 @@
1
- import React, { useState, useRef } from 'react';
1
+ import React, { useState, useRef, useEffect } from 'react';
2
2
  import useAsync from 'react-use/esm/useAsync';
3
3
  import { Progress, WarningPanel } from '@backstage/core-components';
4
4
  import { useApi, alertApiRef } from '@backstage/core-plugin-api';
@@ -8,7 +8,6 @@ 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';
12
11
  import { Box, Grid, Card, CardHeader, TextField, InputAdornment, CardContent } from '@material-ui/core';
13
12
  import Divider from '@material-ui/core/Divider';
14
13
  import IconButton from '@material-ui/core/IconButton';
@@ -22,7 +21,9 @@ import ErrorIcon from '@material-ui/icons/Error';
22
21
  import DownloadIcon from '@material-ui/icons/CloudDownload';
23
22
  import KwirthLogLogo from '../assets/kwirthlog-logo.svg';
24
23
  import RefreshIcon from '@material-ui/icons/Refresh';
24
+ import { VERSION } from '../version.esm.js';
25
25
 
26
+ const RefBox = Box;
26
27
  const LOG_MAX_MESSAGES = 1e3;
27
28
  const EntityKwirthLogContent = (props) => {
28
29
  const { entity } = useEntity();
@@ -66,8 +67,13 @@ const EntityKwirthLogContent = (props) => {
66
67
  const [filter, setFilter] = useState("");
67
68
  const [filterCasing, setFilterCasing] = useState(false);
68
69
  const [filterRegex, setFilterRegex] = useState(false);
70
+ const logBoxRef = useRef(null);
71
+ const [logBoxTop, setLogBoxTop] = useState(0);
69
72
  const adornmentSelected = { margin: 0, borderWidth: 1, borderStyle: "solid", borderColor: "gray", paddingLeft: 3, paddingRight: 3, backgroundColor: "gray", cursor: "pointer", color: "white" };
70
73
  const adornmentNotSelected = { margin: 0, borderWidth: 1, borderStyle: "solid", borderColor: "#f0f0f0", backgroundColor: "#f0f0f0", paddingLeft: 3, paddingRight: 3, cursor: "pointer" };
74
+ useEffect(() => {
75
+ if (logBoxRef.current) setLogBoxTop(logBoxRef.current.getBoundingClientRect().top);
76
+ });
71
77
  const clickStart = (options) => {
72
78
  if (!paused.current) {
73
79
  setStarted(true);
@@ -105,7 +111,7 @@ const EntityKwirthLogContent = (props) => {
105
111
  setSelectedNamespaces(validNamespaces);
106
112
  let podList = getPodList(cluster.pods, validNamespaces);
107
113
  setSelectedPodNames(podList.map((pod) => pod.name));
108
- setSelectedContainerNames(getContainerList(cluster.pods, validNamespaces, podList.map((pod) => pod.name)));
114
+ setSelectedContainerNames(getContainerList(cluster.pods, validNamespaces, podList.map((pod) => pod.name), props.excludeContainers || []));
109
115
  } else {
110
116
  setMessages([{
111
117
  type: InstanceMessageTypeEnum.SIGNAL,
@@ -420,6 +426,9 @@ const EntityKwirthLogContent = (props) => {
420
426
  if (!logLine.pod) {
421
427
  return /* @__PURE__ */ React.createElement(React.Fragment, null, logLine.text + "\n");
422
428
  }
429
+ if (props.excludeContainers && props.excludeContainers.length > 0) {
430
+ if (props.excludeContainers.includes(logLine.container)) return /* @__PURE__ */ React.createElement(React.Fragment, null);
431
+ }
423
432
  if (filter !== "") {
424
433
  if (filterCasing) {
425
434
  if (filterRegex) {
@@ -455,14 +464,14 @@ const EntityKwirthLogContent = (props) => {
455
464
  }
456
465
  return /* @__PURE__ */ React.createElement(React.Fragment, null, podPrefix, containerPrefix, logLine.text + "\n");
457
466
  };
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(
467
+ 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(RefBox, { ref: logBoxRef, sx: { display: "flex", height: `calc(100vh - ${logBoxTop}px - 25px)` } }, /* @__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 }))), !props.hideVersion && /* @__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(
459
468
  CardHeader,
460
469
  {
461
470
  title: statusButtons(selectedClusterName),
462
471
  style: { marginTop: -4, marginBottom: 4, flexShrink: 0 },
463
472
  action: actionButtons()
464
473
  }
465
- ), /* @__PURE__ */ React.createElement(Grid, { container: true, style: { alignItems: "end" } }, /* @__PURE__ */ React.createElement(Grid, { item: true, style: { width: "66%" } }, /* @__PURE__ */ React.createElement(Typography, { style: { marginLeft: 14 } }, /* @__PURE__ */ React.createElement(ObjectSelector, { cluster: validClusters.find((cluster) => cluster.name === selectedClusterName), onSelect: onSelectObject, disabled: selectedClusterName === "" || started || paused.current, selectedNamespaces, selectedPodNames, selectedContainerNames, scope: InstanceConfigScopeEnum.VIEW }))), /* @__PURE__ */ React.createElement(Grid, { item: true, style: { width: "33%", marginLeft: 0 } }, /* @__PURE__ */ React.createElement(
474
+ ), /* @__PURE__ */ React.createElement(Grid, { container: true, style: { alignItems: "end" } }, /* @__PURE__ */ React.createElement(Grid, { item: true, style: { width: "66%" } }, /* @__PURE__ */ React.createElement(Typography, { style: { marginLeft: 14 } }, /* @__PURE__ */ React.createElement(ObjectSelector, { cluster: validClusters.find((cluster) => cluster.name === selectedClusterName), onSelect: onSelectObject, disabled: selectedClusterName === "" || started || paused.current, selectedNamespaces, selectedPodNames, selectedContainerNames, scope: InstanceConfigScopeEnum.VIEW, excludeCotainers: props.excludeContainers }))), /* @__PURE__ */ React.createElement(Grid, { item: true, style: { width: "33%", marginLeft: 0 } }, /* @__PURE__ */ React.createElement(
466
475
  TextField,
467
476
  {
468
477
  value: filter,
@@ -475,7 +484,7 @@ const EntityKwirthLogContent = (props) => {
475
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")))
476
485
  }
477
486
  }
478
- ))), /* @__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 } }, /* @__PURE__ */ React.createElement("pre", { ref: preRef, style: { overflowX: kwirthLogOptionsRef.current.wrapLines ? "hidden" : "auto", 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) => formatMessage(m))), /* @__PURE__ */ React.createElement("span", { ref: lastRef }))))))), showStatusDialog && /* @__PURE__ */ React.createElement(StatusLog, { level: statusLevel, onClose: () => setShowStatusDialog(false), statusMessages, onClear: statusClear }));
479
488
  };
480
489
 
481
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, { 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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"}
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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"}
package/dist/index.d.ts CHANGED
@@ -1,15 +1,14 @@
1
- import * as React from 'react';
2
1
  import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
3
2
  import { DiscoveryApi, FetchApi } from '@backstage/core-plugin-api';
4
3
  import { Entity } from '@backstage/catalog-model';
5
4
  import { InstanceConfigScopeEnum } from '@jfvilas/kwirth-common';
6
- import { ClusterValidPods } from '@jfvilas/plugin-kwirth-common';
5
+ import { ClusterValidPods, IBackendInfo } from '@jfvilas/plugin-kwirth-common';
7
6
 
8
- interface IProps {
7
+ interface IEntityKwirthLogProps {
9
8
  enableRestart: boolean;
10
9
  fromStart?: boolean;
11
10
  showTimestamp?: boolean;
12
- showPodNames?: boolean;
11
+ showNames?: boolean;
13
12
  followLog?: boolean;
14
13
  wrapLines?: boolean;
15
14
  }
@@ -17,7 +16,7 @@ interface IProps {
17
16
  declare const kwirthLogPlugin: _backstage_core_plugin_api.BackstagePlugin<{
18
17
  root: _backstage_core_plugin_api.RouteRef<undefined>;
19
18
  }, {}, {}>;
20
- declare const EntityKwirthLogContent: (props: IProps) => React.JSX.Element;
19
+ declare const EntityKwirthLogContent: (props: IEntityKwirthLogProps) => JSX.Element;
21
20
 
22
21
  interface KwirthLogApi {
23
22
  getResources(entity: Entity): Promise<any>;
@@ -41,12 +40,12 @@ declare class KwirthLogClient implements KwirthLogApi {
41
40
  * @returns an array of clusters (with their correpsonding info) and a pod list for each, where the entity has been dicovered
42
41
  */
43
42
  getVersion(): Promise<string>;
44
- getInfo(): Promise<string>;
43
+ getInfo(): Promise<IBackendInfo>;
45
44
  getResources(entity: Entity): Promise<ClusterValidPods>;
46
45
  requestAccess(entity: Entity, channel: string, scopes: InstanceConfigScopeEnum[]): Promise<ClusterValidPods[]>;
47
46
  }
48
47
 
49
- declare const VERSION = "0.12.9";
48
+ declare const VERSION = "0.13.4";
50
49
 
51
50
  export { EntityKwirthLogContent, KwirthLogClient, VERSION, kwirthLogApiRef, kwirthLogPlugin };
52
51
  export type { KwirthLogApi, KwirthLogClientOptions };
package/dist/index.esm.js CHANGED
@@ -1,8 +1,4 @@
1
1
  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
-
5
- const VERSION = "0.13.2";
6
-
7
- export { VERSION };
8
4
  //# 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.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;;;;"}
1
+ {"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
@@ -24,10 +24,7 @@ const kwirthLogPlugin = createPlugin({
24
24
  const EntityKwirthLogContent = kwirthLogPlugin.provide(
25
25
  createRoutableExtension({
26
26
  name: "EntityKwirthLogContent",
27
- component: () => (
28
- //import('./components/EntityKwirthLogContent').then(m => m.EntityKwirthLogContent),
29
- import('./components/EntityKwirthLogContent.esm.js').then((m) => m.EntityKwirthLogContent)
30
- ),
27
+ component: () => import('./components/EntityKwirthLogContent.esm.js').then((m) => m.EntityKwirthLogContent),
31
28
  mountPoint: rootRouteRef
32
29
  })
33
30
  );
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.esm.js","sources":["../src/plugin.ts"],"sourcesContent":["/*\r\nCopyright 2024 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\n\r\nimport { kwirthLogApiRef, KwirthLogClient } from './api'\r\nimport { createApiFactory, createPlugin, createRoutableExtension } from '@backstage/core-plugin-api'\r\nimport { discoveryApiRef, fetchApiRef } from '@backstage/core-plugin-api'\r\nimport { rootRouteRef } from './routes'\r\n\r\nexport const kwirthLogPlugin = createPlugin({\r\n id: 'kwirthlog', \r\n apis: [\r\n createApiFactory({\r\n api: kwirthLogApiRef,\r\n deps: {\r\n discoveryApi: discoveryApiRef,\r\n fetchApi: fetchApiRef,\r\n },\r\n factory({ discoveryApi, fetchApi }) {\r\n return new KwirthLogClient({ discoveryApi, fetchApi });\r\n },\r\n }),\r\n ],\r\n routes: {\r\n root: rootRouteRef\r\n }\r\n})\r\n\r\nexport const EntityKwirthLogContent = kwirthLogPlugin.provide(\r\n createRoutableExtension({\r\n name: 'EntityKwirthLogContent',\r\n component: () =>\r\n //import('./components/EntityKwirthLogContent').then(m => m.EntityKwirthLogContent),\r\n import('./components/EntityKwirthLogContent').then(m => m.EntityKwirthLogContent as (props: any) => JSX.Element),\r\n mountPoint: rootRouteRef\r\n })\r\n)\r\n"],"names":[],"mappings":";;;;;AAqBO,MAAM,kBAAkB,YAAA,CAAa;AAAA,EAC1C,EAAA,EAAI,WAAA;AAAA,EACJ,IAAA,EAAM;AAAA,IACJ,gBAAA,CAAiB;AAAA,MACf,GAAA,EAAK,eAAA;AAAA,MACL,IAAA,EAAM;AAAA,QACJ,YAAA,EAAc,eAAA;AAAA,QACd,QAAA,EAAU;AAAA,OACZ;AAAA,MACA,OAAA,CAAQ,EAAE,YAAA,EAAc,QAAA,EAAS,EAAG;AAClC,QAAA,OAAO,IAAI,eAAA,CAAgB,EAAE,YAAA,EAAc,UAAU,CAAA;AAAA,MACvD;AAAA,KACD;AAAA,GACH;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM;AAAA;AAEV,CAAC;AAEM,MAAM,yBAAyB,eAAA,CAAgB,OAAA;AAAA,EACpD,uBAAA,CAAwB;AAAA,IACtB,IAAA,EAAM,wBAAA;AAAA,IACN,SAAA,EAAW;AAAA;AAAA,MAET,OAAO,4CAAqC,CAAA,CAAE,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,sBAAqD;AAAA,KAAA;AAAA,IACjH,UAAA,EAAY;AAAA,GACb;AACH;;;;"}
1
+ {"version":3,"file":"plugin.esm.js","sources":["../src/plugin.ts"],"sourcesContent":["/*\r\nCopyright 2024 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\n\r\nimport { kwirthLogApiRef, KwirthLogClient } from './api'\r\nimport { createApiFactory, createPlugin, createRoutableExtension } from '@backstage/core-plugin-api'\r\nimport { discoveryApiRef, fetchApiRef } from '@backstage/core-plugin-api'\r\nimport { rootRouteRef } from './routes'\r\nimport { IEntityKwirthLogProps } from './components/EntityKwirthLogContent'\r\n\r\nexport const kwirthLogPlugin = createPlugin({\r\n id: 'kwirthlog', \r\n apis: [\r\n createApiFactory({\r\n api: kwirthLogApiRef,\r\n deps: {\r\n discoveryApi: discoveryApiRef,\r\n fetchApi: fetchApiRef,\r\n },\r\n factory({ discoveryApi, fetchApi }) {\r\n return new KwirthLogClient({ discoveryApi, fetchApi });\r\n },\r\n }),\r\n ],\r\n routes: {\r\n root: rootRouteRef\r\n }\r\n})\r\n\r\nexport const EntityKwirthLogContent : (props: IEntityKwirthLogProps) => JSX.Element = kwirthLogPlugin.provide(\r\n createRoutableExtension({\r\n name: 'EntityKwirthLogContent',\r\n component: () =>\r\n import('./components/EntityKwirthLogContent').then(m => m.EntityKwirthLogContent as (props: IEntityKwirthLogProps) => JSX.Element),\r\n mountPoint: rootRouteRef\r\n })\r\n)\r\n"],"names":[],"mappings":";;;;;AAsBO,MAAM,kBAAkB,YAAA,CAAa;AAAA,EAC1C,EAAA,EAAI,WAAA;AAAA,EACJ,IAAA,EAAM;AAAA,IACJ,gBAAA,CAAiB;AAAA,MACf,GAAA,EAAK,eAAA;AAAA,MACL,IAAA,EAAM;AAAA,QACJ,YAAA,EAAc,eAAA;AAAA,QACd,QAAA,EAAU;AAAA,OACZ;AAAA,MACA,OAAA,CAAQ,EAAE,YAAA,EAAc,QAAA,EAAS,EAAG;AAClC,QAAA,OAAO,IAAI,eAAA,CAAgB,EAAE,YAAA,EAAc,UAAU,CAAA;AAAA,MACvD;AAAA,KACD;AAAA,GACH;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM;AAAA;AAEV,CAAC;AAEM,MAAM,yBAAyE,eAAA,CAAgB,OAAA;AAAA,EACpG,uBAAA,CAAwB;AAAA,IACtB,IAAA,EAAM,wBAAA;AAAA,IACN,SAAA,EAAW,MACT,OAAO,4CAAqC,EAAE,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,sBAAuE,CAAA;AAAA,IACnI,UAAA,EAAY;AAAA,GACb;AACH;;;;"}
@@ -0,0 +1,4 @@
1
+ const VERSION = "0.13.5";
2
+
3
+ export { VERSION };
4
+ //# sourceMappingURL=version.esm.js.map
@@ -0,0 +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;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jfvilas/plugin-kwirth-log",
3
- "version": "0.13.3",
3
+ "version": "0.13.5",
4
4
  "description": "Frontend plugin for viewing real-time Kubernetes logs in Backstage",
5
5
  "keywords": [
6
6
  "Backstage",