@jfvilas/plugin-kwirth-metrics 0.12.8 → 0.13.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/README.md +23 -8
  2. package/dist/api/KwirthMetricsClient.esm.js +4 -57
  3. package/dist/api/KwirthMetricsClient.esm.js.map +1 -1
  4. package/dist/api/types.esm.js.map +1 -1
  5. package/dist/components/{EntityKwirthMetricsContent/EntityKwirthMetricsContent.esm.js → EntityKwirthMetricsContent.esm.js} +84 -64
  6. package/dist/components/EntityKwirthMetricsContent.esm.js.map +1 -0
  7. package/dist/components/{Options/Options.esm.js → Options.esm.js} +1 -1
  8. package/dist/components/Options.esm.js.map +1 -0
  9. package/dist/index.d.ts +5 -4
  10. package/dist/index.esm.js +4 -0
  11. package/dist/index.esm.js.map +1 -1
  12. package/dist/plugin.esm.js +1 -1
  13. package/dist/plugin.esm.js.map +1 -1
  14. package/dist/routes.esm.js.map +1 -1
  15. package/package.json +2 -1
  16. package/dist/assets/kwirthmetrics-component-not-found.svg +0 -29
  17. package/dist/components/ClusterList/ClusterList.esm.js +0 -30
  18. package/dist/components/ClusterList/ClusterList.esm.js.map +0 -1
  19. package/dist/components/ComponentNotFound/ComponentNotFound.esm.js +0 -63
  20. package/dist/components/ComponentNotFound/ComponentNotFound.esm.js.map +0 -1
  21. package/dist/components/EntityKwirthMetricsContent/EntityKwirthMetricsContent.esm.js.map +0 -1
  22. package/dist/components/EntityKwirthMetricsContent/index.esm.js +0 -2
  23. package/dist/components/EntityKwirthMetricsContent/index.esm.js.map +0 -1
  24. package/dist/components/ObjectSelector/ObjectSelector.esm.js +0 -82
  25. package/dist/components/ObjectSelector/ObjectSelector.esm.js.map +0 -1
  26. package/dist/components/Options/Options.esm.js.map +0 -1
  27. package/dist/components/ShowError/ShowError.esm.js +0 -20
  28. package/dist/components/ShowError/ShowError.esm.js.map +0 -1
  29. package/dist/components/StatusLog/StatusLog.esm.js +0 -10
  30. package/dist/components/StatusLog/StatusLog.esm.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntityKwirthMetricsContent.esm.js","sources":["../../src/components/EntityKwirthMetricsContent.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 { isKwirthAvailable, ClusterValidPods, PodData, IStatusLine, MetricDefinition, ANNOTATION_BACKSTAGE_KUBERNETES_LABELID, ANNOTATION_BACKSTAGE_KUBERNETES_LABELSELECTOR, IBackendInfo, getPodList, getContainerList } from '@jfvilas/plugin-kwirth-common'\r\nimport { MissingAnnotationEmptyState, useEntity } from '@backstage/plugin-catalog-react'\r\n\r\n// kwirthMetrics\r\nimport { kwirthMetricsApiRef } from '../api'\r\nimport { accessKeySerialize, MetricsConfigModeEnum, MetricsMessage, InstanceMessageActionEnum, InstanceMessageFlowEnum, InstanceConfigScopeEnum, InstanceConfigViewEnum, IInstanceMessage, InstanceMessageTypeEnum, ISignalMessage, SignalMessageLevelEnum, InstanceConfigObjectEnum, InstanceConfig, InstanceMessageChannelEnum, OpsCommandEnum, IOpsMessageResponse, IOpsMessage, IRouteMessage } from '@jfvilas/kwirth-common'\r\nimport { ClusterList, ObjectSelector, ShowError, StatusLog, KwirthNews, ComponentNotFound, ErrorType } from '@jfvilas/plugin-kwirth-frontend'\r\nimport { VERSION } from '../index'\r\n\r\n// Material-UI\r\nimport { Box, Checkbox, FormControl, Grid, MenuItem, Select, Card, CardHeader, CardContent, Divider, IconButton, Typography, Tooltip as MUITooltip } from '@material-ui/core'\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 RefreshIcon from '@material-ui/icons/Refresh'\r\nimport KwirthMetricsLogo from '../assets/kwirthmetrics-logo.svg'\r\n\r\nimport { Area, AreaChart, Bar, BarChart, CartesianGrid, LabelList, Legend, Line, LineChart, ResponsiveContainer, Tooltip, XAxis, YAxis } from 'recharts'\r\nimport { IMetricsOptions } from './IOptions'\r\nimport { Options } from './Options'\r\n\r\nexport interface IProps {\r\n allMetrics: boolean\r\n enableRestart: boolean\r\n width?: number\r\n depth?: number\r\n interval?: number\r\n chart?: string\r\n}\r\n\r\nexport const EntityKwirthMetricsContent: React.FC<IProps> = (props:IProps) => { \r\n const kwirthMetricsApi = useApi(kwirthMetricsApiRef)\r\n const alertApi = useApi(alertApiRef)\r\n const { entity } = useEntity()\r\n const [validClusters, setValidClusters] = 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 [selectedMetrics, setSelectedMetrics] = useState<string[]>([])\r\n const [showError, setShowError] = useState('')\r\n const [started, setStarted] = useState(false)\r\n const [stopped, setStopped] = useState(true)\r\n const paused=useRef<boolean>(false)\r\n const [metricsMessages, setMetricsMessages] = useState<MetricsMessage[]>([])\r\n const [statusMessages, setStatusMessages] = useState<IStatusLine[]>([])\r\n const [websocket, setWebsocket] = useState<WebSocket>()\r\n const [instance, setInstance] = useState<string>()\r\n const kwirthMetricsOptionsRef = useRef<IMetricsOptions>({\r\n depth: props.depth !==undefined? props.depth : 10,\r\n width: props.width !==undefined? props.width : 3,\r\n interval: props.interval !==undefined? props.interval : 15,\r\n chart: props.chart !==undefined? props.chart : 'area',\r\n aggregate:false,\r\n merge:false,\r\n stack:false\r\n })\r\n const [showStatusDialog, setShowStatusDialog] = useState(false)\r\n const [statusLevel, setStatusLevel] = useState<SignalMessageLevelEnum>(SignalMessageLevelEnum.INFO)\r\n const [backendVersion, setBackendVersion ] = useState<string>('')\r\n const [ backendInfo, setBackendInfo ] = useState<IBackendInfo>()\r\n const [_refresh,setRefresh] = useState(0)\r\n const [allMetrics, setAllMetrics] = useState<MetricDefinition[]>(\r\n [\r\n {metric:'kwirth_container_memory_percentage',help:'',eval:'',type:'counter'},\r\n {metric:'kwirth_container_cpu_percentage',help:'',eval:'',type:'counter'},\r\n {metric:'kwirth_container_transmit_percentage',help:'',eval:'',type:'counter'},\r\n {metric:'kwirth_container_receive_percentage',help:'',eval:'',type:'counter'},\r\n {metric:'kwirth_container_transmit_mbps',help:'',eval:'',type:'counter'},\r\n {metric:'kwirth_container_receive_mbps',help:'',eval:'',type:'counter'}\r\n ])\r\n const { loading, error } = useAsync ( async () => {\r\n if (backendVersion==='') setBackendVersion(await kwirthMetricsApi.getVersion())\r\n if (!backendInfo) setBackendInfo(await kwirthMetricsApi.getInfo())\r\n let reqScopes = [InstanceConfigScopeEnum.STREAM]\r\n if (props.enableRestart) reqScopes.push(InstanceConfigScopeEnum.RESTART)\r\n let data = await kwirthMetricsApi.requestAccess(entity,'metrics', reqScopes)\r\n setValidClusters(data)\r\n })\r\n\r\n const colours = [\r\n \"#6e5bb8\", // morado oscuro\r\n \"#4a9076\", // verde oscuro\r\n \"#b56c52\", // naranja oscuro\r\n \"#7f6b97\", // color lavanda oscuro\r\n \"#b0528f\", // rosa oscuro\r\n \"#b0b052\", // amarillo oscuro\r\n \"#b05252\", // rojo oscuro\r\n \"#5285b0\", // azul oscuro\r\n \"#a38ad6\", // morado pastel\r\n \"#89c1a0\", // verde pastel\r\n \"#e4a28a\", // naranja pastel\r\n \"#b09dbd\", // lavanda pastel\r\n \"#e2a4c6\", // rosa pastel\r\n \"#c5c89e\", // amarillo pastel\r\n \"#e2a4a4\", // rojo pastel\r\n \"#90b7e2\", // azul pastel\r\n \"#f8d5e1\", // rosa claro pastel\r\n \"#b2d7f0\", // azul muy claro pastel\r\n \"#f7e1b5\", // amarillo muy claro pastel\r\n \"#d0f0c0\", // verde muy claro pastel\r\n \"#f5b0a1\", // coral pastel\r\n \"#d8a7db\", // lavanda muy claro pastel\r\n \"#f4c2c2\", // rosa suave pastel\r\n \"#e6c7b9\", // marron claro pastel\r\n \"#f0e2b6\", // crema pastel\r\n \"#a7c7e7\", // azul palido pastel\r\n \"#f5e6a5\", // amarillo palido pastel\r\n \"#e3c8f5\", // lilas pastel\r\n \"#d0c4e8\", // lila palido pastel\r\n \"#b8d8b8\", // verde claro pastel\r\n \"#d2ebfa\", // azul muy claro pastel\r\n \"#f1c1d2\" // rosa bebe pastel\r\n ]\r\n \r\n const clickStart = () => {\r\n if (!paused.current) {\r\n setMetricsMessages([])\r\n setStarted(true)\r\n paused.current=false\r\n setStopped(false)\r\n startMetricsViewer()\r\n }\r\n else {\r\n paused.current=false\r\n setStarted(true)\r\n }\r\n }\r\n\r\n const clickPause = () => {\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 stopMetricsViewer()\r\n }\r\n\r\n const onSelectCluster = async (clusterName:string|undefined) => {\r\n if (started) onClickStop()\r\n // if (clusterName) {\r\n // setSelectedClusterName(clusterName)\r\n // setSelectedNamespaces([])\r\n // setSelectedPodNames([])\r\n // setSelectedContainerNames([])\r\n // setMetricsMessages([])\r\n // setStatusMessages([])\r\n // let cluster = clusterValidPods.find(cluster => cluster.name === clusterName)\r\n // if (cluster && cluster.metrics) {\r\n // cluster.metrics.sort( (a,_b) => a.metric.startsWith('kwirth')? -1:1)\r\n // setAllMetrics(cluster.metrics)\r\n // }\r\n // }\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 && cluster.metrics) {\r\n cluster.metrics.sort( (a,_b) => a.metric.startsWith('kwirth')? -1:1)\r\n setAllMetrics(cluster.metrics)\r\n\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 setSelectedNamespaces([])\r\n }\r\n }\r\n }\r\n }\r\n\r\n const processMetricsMessage = (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 metricsMessage = instanceMessage as MetricsMessage\r\n if (metricsMessage.timestamp===0) { // initial metrics values\r\n metricsMessage.timestamp = Date.now()\r\n setMetricsMessages([metricsMessage])\r\n }\r\n else {\r\n setMetricsMessages((prev) => {\r\n while (prev.length>kwirthMetricsOptionsRef.current.depth) {\r\n prev.splice(0,1)\r\n }\r\n if (paused.current)\r\n return prev\r\n else\r\n return [ ...prev, metricsMessage ]\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 websocketOnChunk = (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.METRICS:\r\n processMetricsMessage(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 console.log('Invalid channel in message: ', instanceMessage)\r\n break\r\n }\r\n\r\n }\r\n\r\n const websocketOnOpen = (ws:WebSocket) => {\r\n let cluster=validClusters.find(cluster => cluster.name===selectedClusterName)\r\n if (!cluster) {\r\n addMessage(SignalMessageLevelEnum.ERROR, 'Cluster not found')\r\n return\r\n }\r\n let pods = cluster.pods.filter(p => selectedNamespaces.includes(p.namespace))\r\n if (!pods || pods.length===0) {\r\n addMessage(SignalMessageLevelEnum.ERROR, 'Pod not found')\r\n return\r\n }\r\n\r\n console.log(`WS connected`)\r\n let accessKey = cluster.accessKeys.get(InstanceConfigScopeEnum.STREAM)\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 var iConfig:InstanceConfig = {\r\n channel: InstanceMessageChannelEnum.METRICS,\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.STREAM,\r\n view: (selectedContainerNames.length > 0 ? InstanceConfigViewEnum.CONTAINER : InstanceConfigViewEnum.POD),\r\n namespace: selectedNamespaces.join(','),\r\n group: '',\r\n pod: selectedPodNames.join(','),\r\n container: containers.join(','),\r\n data: {\r\n mode: MetricsConfigModeEnum.STREAM,\r\n aggregate: kwirthMetricsOptionsRef.current.aggregate,\r\n metrics: selectedMetrics,\r\n interval: kwirthMetricsOptionsRef.current.interval\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, 'AccessKey has not been obtained')\r\n return\r\n }\r\n }\r\n\r\n const startMetricsViewer = () => {\r\n let cluster=validClusters.find(cluster => cluster.name===selectedClusterName)\r\n if (!cluster) {\r\n addMessage(SignalMessageLevelEnum.ERROR, 'Cluster not found')\r\n return\r\n }\r\n\r\n try {\r\n let ws = new WebSocket(cluster.url)\r\n ws.onopen = () => websocketOnOpen(ws)\r\n ws.onmessage = (event) => websocketOnChunk(event)\r\n ws.onclose = (event) => websocketOnClose(event)\r\n setWebsocket(ws)\r\n }\r\n catch (err) {\r\n addMessage(SignalMessageLevelEnum.ERROR, 'Error starting websocket')\r\n }\r\n\r\n }\r\n\r\n const websocketOnClose = (_event:any) => {\r\n console.log(`WS disconnected from remote`)\r\n setStarted(false)\r\n paused.current=false\r\n setStopped(true)\r\n }\r\n\r\n const stopMetricsViewer = () => {\r\n websocket?.close()\r\n }\r\n\r\n const onChangeOptions = (options:IMetricsOptions) => {\r\n kwirthMetricsOptionsRef.current=options\r\n setRefresh(Math.random())\r\n }\r\n \r\n const actionButtons = () => {\r\n let hasStreamKey = false, hasRestartKey = false\r\n let cluster=validClusters.find(cluster => cluster.name===selectedClusterName)\r\n if (cluster) {\r\n hasStreamKey = Boolean(cluster.accessKeys.has(InstanceConfigScopeEnum.STREAM))\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 onClick={clickStart} title=\"Play\" disabled={started || !paused || selectedPodNames.length === 0 || selectedMetrics.length==0 || !hasStreamKey}>\r\n <PlayIcon />\r\n </IconButton>\r\n <IconButton onClick={clickPause} 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 onMetricsChange = (event:any) => {\r\n setSelectedMetrics(event.target.value)\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)?'gold':'#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 mergeSeries = (names:string[], series:any[]) => {\r\n if (!names || names.length===0) return []\r\n var resultSeries:any[] = []\r\n\r\n for (var i=0; i<series[0].length; i++) {\r\n var item: { [key: string]: string|number } = {}\r\n for (var j=0; j<series.length; j++ ) {\r\n if (series[j][i]) {\r\n item['timestamp'] = series[0][i].timestamp\r\n item[names[j]] = series[j][i].value\r\n }\r\n }\r\n resultSeries.push(item)\r\n }\r\n return resultSeries\r\n }\r\n\r\n const addChart = (options: IMetricsOptions, metric:MetricDefinition, names:string[], series:any[], colour:string) => {\r\n var result = <></>\r\n var mergedSeries = mergeSeries(names, series)\r\n\r\n const renderLabel = (data:any) => {\r\n var values:any[] = series.map (s => s[data.index])\r\n var total:number =values.reduce((acc,value) => acc+value.value, 0)\r\n return <text x={data.x + data.width/3.5} y={data.y-10}>{total.toPrecision(3).replace(/0+$/, \"\")}</text>\r\n }\r\n let height=300\r\n\r\n switch (options.chart) {\r\n case 'value':\r\n height=40+series.length*80\r\n result = (\r\n <Grid>\r\n {\r\n <Typography>\r\n { series.map( (serie,index) => {\r\n return (<>\r\n <Typography >\r\n {serie[serie.length-1].value}\r\n </Typography>\r\n <Typography >\r\n {names[index]}\r\n </Typography>\r\n </>)\r\n })}\r\n </Typography>\r\n }\r\n </Grid>\r\n\r\n )\r\n break\r\n case 'line':\r\n result = (\r\n <LineChart data={mergedSeries}>\r\n <CartesianGrid strokeDasharray=\"3 3\"/>\r\n <XAxis dataKey=\"timestamp\" fontSize={8}/>\r\n <YAxis />\r\n <Tooltip />\r\n <Legend/>\r\n { series.map ((_serie,index) => <Line key={index} name={names[index]} type=\"monotone\" dataKey={names[index]} stroke={series.length===1?colour:colours[index]} activeDot={{ r: 8 }} />) }\r\n </LineChart>\r\n )\r\n break\r\n case 'area':\r\n result = (\r\n <AreaChart data={mergedSeries}>\r\n <defs>\r\n {\r\n series.map( (_serie,index) => {\r\n return (\r\n <linearGradient key={index} id={`color${series.length===1?colour:colours[index]}`} x1='0' y1='0' x2='0' y2='1'>\r\n <stop offset='7%' stopColor={series.length===1?colour:colours[index]} stopOpacity={0.8}/>\r\n <stop offset='93%' stopColor={series.length===1?colour:colours[index]} stopOpacity={0}/>\r\n </linearGradient>\r\n )\r\n })\r\n }\r\n </defs>\r\n <CartesianGrid strokeDasharray=\"3 3\"/>\r\n <XAxis dataKey=\"timestamp\" fontSize={8}/>\r\n <YAxis />\r\n <Tooltip />\r\n <Legend/>\r\n { series.map ((_serie,index) => \r\n <Area key={index} name={names[index]} type=\"monotone\" {...(options.stack? {stackId:\"1\"}:{})} dataKey={names[index]} stroke={series.length===1?colour:colours[index]} fill={`url(#color${series.length===1?colour:colours[index]})`}/> )}\r\n </AreaChart>\r\n )\r\n break\r\n case 'bar':\r\n result = (\r\n <BarChart data={mergedSeries}>\r\n <CartesianGrid strokeDasharray=\"3 3\"/>\r\n <XAxis dataKey=\"timestamp\" fontSize={8}/>\r\n <YAxis />\r\n <Tooltip/>\r\n <Legend/>\r\n { series.map ((_serie,index) =>\r\n <Bar name={names[index]} {...(options.stack? {stackId:\"1\"}:{})} dataKey={names[index]} stroke={series.length===1?colour:colours[index]} fill={series.length===1?colour:colours[index]}>\r\n { index === series.length-1 && series.length > 1 ? <LabelList dataKey={names[index]} position='insideTop' content={ renderLabel }/> : null }\r\n </Bar>\r\n )}\r\n </BarChart>\r\n )\r\n break\r\n default:\r\n break\r\n }\r\n\r\n let title = metric.metric.replaceAll('_',' ')\r\n title = title[0].toLocaleUpperCase()+ title.substring(1)\r\n title = title.replaceAll('cpu', 'CPU')\r\n title = title.replaceAll(' fs ', ' FS ')\r\n title = title.replaceAll(' io ', ' IO ')\r\n title = title.replaceAll('oom', 'OOM')\r\n title = title.replaceAll('nvm', 'NVM')\r\n title = title.replaceAll('rss', 'RSS')\r\n title = title.replaceAll('failcnt', 'fail count')\r\n return (\r\n <Grid style={{width:'100%', marginBottom:32}}>\r\n <MUITooltip title={<Typography style={{fontSize:12}}><b>{metric.metric}</b><br/><br/>{metric.help}</Typography>}>\r\n <Typography align='center'>{title}</Typography>\r\n </MUITooltip>\r\n <ResponsiveContainer height={height} key={metric+JSON.stringify(names)}>\r\n {result}\r\n </ResponsiveContainer> \r\n </Grid>\r\n )\r\n }\r\n\r\n const showMetrics = (options: IMetricsOptions) => {\r\n if (!metricsMessages || metricsMessages.length === 0) {\r\n if (selectedNamespaces.length === 0) \r\n return <Typography>Select namespace chip on top.</Typography>\r\n else\r\n return <>\r\n {started?<Typography>Waiting for first data, be patient...</Typography>:<Typography>Configure <b>chart options</b>, select some <b>metrics on top</b>, and <b>press PLAY</b> on top-right button to start viewing.</Typography>}\r\n </>\r\n }\r\n\r\n let cluster = validClusters.find(cluster => cluster.name === selectedClusterName)\r\n if (!cluster) return\r\n\r\n let data:Map<string, Map<string, { timestamp:string, value:number}[]>> = new Map()\r\n for (let metricsMessage of metricsMessages) {\r\n let ts = new Date(metricsMessage.timestamp)\r\n let timestamp = `${ts.getHours().toString().padStart(2,'0')}:${ts.getMinutes().toString().padStart(2,'0')}:${ts.getSeconds().toString().padStart(2,'0')}`\r\n for (var i=0;i<metricsMessage.assets.length;i++) {\r\n var assetName=metricsMessage.assets[i].assetName\r\n for (var metrics of metricsMessage.assets[i].values) {\r\n if (!data.has(assetName)) data.set(assetName, new Map())\r\n if (!data.get(assetName)?.has(metrics.metricName)) data.get(assetName)?.set(metrics.metricName,[])\r\n data.get(assetName)?.get(metrics.metricName)?.push({timestamp, value:metrics.metricValue})\r\n }\r\n } \r\n }\r\n\r\n let allCharts:any[] = []\r\n if (options.merge) {\r\n var assetNames=Array.from(data.keys())\r\n var firstAsset=assetNames[0]\r\n var allMetrics:string[] = Array.from(new Set(data.get(firstAsset)!.keys()))\r\n\r\n for (let metric of allMetrics) {\r\n let metricDefinition = cluster.metrics?.find(m => m.metric === metric)!\r\n var series = assetNames.map(an => {\r\n return data.get(an)!.get(metric)\r\n })\r\n allCharts.push(<>{addChart(options, metricDefinition, assetNames, series, '')}</>)\r\n }\r\n\r\n let rows = []\r\n for (let i = 0; i < allCharts.length; i += options.width) {\r\n rows.push(allCharts.slice(i, i + options.width))\r\n }\r\n return (<>\r\n {rows.map((row, index) => (\r\n <div key={index} style={{ display: 'flex', justifyContent: 'space-around' }}>\r\n {row}\r\n </div>\r\n ))}\r\n </>)\r\n }\r\n else {\r\n let allCharts = Array.from(data.keys()!).map( (asset, index) => {\r\n return Array.from(data.get(asset)?.keys()!).map ( metric => {\r\n var serie:any=data.get(asset)?.get(metric)!\r\n let metricDefinition = cluster.metrics?.find(m => m.metric === metric)!\r\n return (<>{addChart(options, metricDefinition, [asset], [serie], colours[index])}</>)\r\n })\r\n })\r\n\r\n // convert allResults (a list of charts) into a series of rows of charts\r\n let rows = []\r\n for (var resultAsset of allCharts) {\r\n for (let i = 0; i < resultAsset.length; i += options.width) {\r\n rows.push(resultAsset.slice(i, i + options.width))\r\n }\r\n }\r\n return (<>\r\n {rows.map((row, index) => (\r\n <div key={index} style={{ display: 'flex', justifyContent: 'space-around' }}>\r\n {row}\r\n </div>\r\n ))}\r\n </>)\r\n }\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 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 onClickRestart = () => {\r\n // we perform a route command from channel 'metrics' to channel 'ops'\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 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\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 om: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 rm: 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.METRICS,\r\n instance: instance,\r\n data: om\r\n }\r\n websocket?.send(JSON.stringify(rm))\r\n }\r\n }\r\n\r\n return (<>\r\n { showError!=='' && <ShowError message={showError} onClose={() => setShowError('')}/> }\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/kwirth' 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'}}>\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 metricsOptions={kwirthMetricsOptionsRef.current!} selectedNamespaces={selectedNamespaces} selectedPodNames={selectedPodNames} selectedContainerNames={selectedContainerNames} onChange={onChangeOptions} disabled={selectedNamespaces.length === 0 || 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, p:1, marginLeft:'8px' }}>\r\n\r\n { !selectedClusterName && \r\n <img src={KwirthMetricsLogo} 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}}>\r\n <CardHeader title={statusButtons(selectedClusterName)} style={{marginTop:-4, marginBottom:4, flexShrink:0}} action={actionButtons()} />\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.STREAM}/>\r\n </Typography>\r\n </Grid>\r\n <Grid item style={{width:'33%', marginLeft:0, marginBottom:6, maxWidth:'33%' }}>\r\n <FormControl style={{width:'100%'}}>\r\n <Select value={selectedMetrics} MenuProps={{variant:'menu'}} multiple onChange={onMetricsChange} renderValue={(selected) => (selected as string[]).join(', ').substring(0,40)+'...'} disabled={selectedClusterName === '' || selectedNamespaces.length === 0 || started}>\r\n {\r\n allMetrics.map(m => \r\n <MenuItem key={m.metric} value={m.metric} style={{marginTop:'-8px', marginBottom:'-8px'}}>\r\n <Checkbox checked={selectedMetrics.includes(m.metric)} style={{marginTop:'-8px', marginBottom:'-8px'}}/>\r\n <Typography style={{marginTop:'-8px', marginBottom:'-8px'}}>{m.metric}</Typography>\r\n </MenuItem>\r\n )\r\n }\r\n </Select>\r\n </FormControl>\r\n </Grid>\r\n </Grid>\r\n\r\n <Divider/>\r\n <CardContent style={{ overflow: 'auto' }}>\r\n { showMetrics(kwirthMetricsOptionsRef.current) }\r\n </CardContent>\r\n </Card>\r\n </>}\r\n </Box> \r\n </Box>\r\n }\r\n\r\n { showStatusDialog && <StatusLog level={statusLevel} onClose={() => setShowStatusDialog(false)} statusMessages={statusMessages} onClear={statusClear}/>}\r\n </>)\r\n}\r\n"],"names":["cluster","p","MUITooltip","allMetrics","i","allCharts"],"mappings":"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"}
@@ -7,7 +7,7 @@ import Select from '@material-ui/core/Select';
7
7
  import { FormControlLabel, Checkbox, Typography } from '@material-ui/core';
8
8
 
9
9
  const Options = (props) => {
10
- const [options, setOptions] = useState(props.options);
10
+ const [options, setOptions] = useState(props.metricsOptions);
11
11
  const handleChange = (change) => {
12
12
  var a = { ...options, ...change };
13
13
  setOptions(a);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Options.esm.js","sources":["../../src/components/Options.tsx"],"sourcesContent":["import React, { useState } from 'react'\r\nimport CardHeader from '@material-ui/core/CardHeader'\r\nimport Divider from '@material-ui/core/Divider'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport MenuItem from '@material-ui/core/MenuItem'\r\nimport Select from '@material-ui/core/Select'\r\nimport { Checkbox, FormControlLabel, Typography } from '@material-ui/core'\r\nimport { IMetricsOptions, IOptions } from './IOptions'\r\n\r\nconst Options = (props: IOptions) => {\r\n const [options, setOptions] = useState<IMetricsOptions>(props.metricsOptions)\r\n\r\n const handleChange = (change:any) => {\r\n var a = {...options,...change}\r\n setOptions(a)\r\n props.onChange(a)\r\n }\r\n\r\n const multiAssets = () => {\r\n if (!props.selectedNamespaces) return false\r\n if (!props.selectedPodNames) return false\r\n if (!props.selectedContainerNames) return false\r\n\r\n if (props.selectedPodNames.length>1) return true\r\n if (props.selectedContainerNames.length>1) return true\r\n return false\r\n }\r\n\r\n return (<>\r\n <CardHeader title={'Options'}/>\r\n <Divider style={{marginTop:8}}/>\r\n <Grid container direction='column' spacing={1}>\r\n <Grid item style={{marginTop:16}} >\r\n <FormControlLabel style={{marginLeft:24}} label=\"Width&nbsp;&nbsp;&nbsp;\" labelPlacement='start' disabled={props.disabled} control={\r\n <Select value={options.width} onChange={(evt) => handleChange({width:evt.target.value})} style={{width:80, marginLeft:16}} disabled={props.disabled}>\r\n <MenuItem value={1}>1</MenuItem>\r\n <MenuItem value={2}>2</MenuItem>\r\n <MenuItem value={3}>3</MenuItem>\r\n <MenuItem value={4}>4</MenuItem>\r\n </Select>\r\n } />\r\n </Grid>\r\n\r\n <Grid item >\r\n <FormControlLabel style={{marginLeft:24}} label=\"Interval\" labelPlacement='start' disabled={props.disabled} control={\r\n <Select value={options.interval} onChange={(evt) => handleChange({interval:evt.target.value})} style={{width:80, marginLeft:16}} disabled={props.disabled}>\r\n <MenuItem value={5}>5</MenuItem>\r\n <MenuItem value={10}>10</MenuItem>\r\n <MenuItem value={30}>30</MenuItem>\r\n <MenuItem value={60}>60</MenuItem>\r\n </Select>\r\n } />\r\n </Grid>\r\n\r\n <Grid item>\r\n <FormControlLabel style={{marginLeft:24}} label=\"Depth&nbsp;&nbsp;&nbsp;&nbsp;\" labelPlacement='start' disabled={props.disabled} control={\r\n <Select value={options.depth} onChange={(evt) => handleChange({depth:evt.target.value})} style={{width:80, marginLeft:8}} disabled={props.disabled}>\r\n <MenuItem value={10}>10</MenuItem>\r\n <MenuItem value={50}>50</MenuItem>\r\n <MenuItem value={100}>100</MenuItem>\r\n </Select>\r\n } />\r\n </Grid>\r\n\r\n <Grid item >\r\n <FormControlLabel style={{marginLeft:24}} label=\"Chart\" labelPlacement='start' disabled={props.disabled} control={\r\n <Select value={options.chart} onChange={(evt) => handleChange({chart:evt.target.value})} style={{width:80, marginLeft:28}} disabled={props.disabled}>\r\n <MenuItem value={'value'}>Value</MenuItem>\r\n <MenuItem value={'line'}>Line</MenuItem>\r\n <MenuItem value={'area'}>Area</MenuItem>\r\n <MenuItem value={'bar'}>Bar</MenuItem>\r\n </Select>\r\n } />\r\n </Grid>\r\n <Grid item>\r\n <FormControlLabel control={<Checkbox checked={options.aggregate} onChange={(evt) => handleChange({aggregate:evt.target.checked})}/>} disabled={!multiAssets() || options.merge} label='Aggregate' style={{marginLeft:12}}/>\r\n </Grid>\r\n <Grid item>\r\n <FormControlLabel control={<Checkbox checked={options.merge} onChange={(evt) => handleChange({merge:evt.target.checked})}/>} disabled={!multiAssets() || options.aggregate || !'area bar'.includes(options.chart)} label='Merge' style={{marginLeft:12}}/>\r\n </Grid>\r\n <Grid item>\r\n <FormControlLabel control={<Checkbox checked={options.stack} onChange={(evt) => handleChange({stack:evt.target.checked})}/>} disabled={!options.merge || !('area bar'.includes(options.chart))} label='Stack' style={{marginLeft:12, marginBottom:16}}/>\r\n </Grid>\r\n <Grid item>\r\n <Typography style={{fontSize:9, marginLeft:22, marginTop:4, marginBottom:6}}>Powered by <a href='https://jfvilas.github.io/kwirth/' target='_blank' style={{color:'blue'}}>Kwirth</a></Typography>\r\n </Grid>\r\n </Grid>\r\n </>)\r\n}\r\n\r\nexport { Options }"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- /// <reference types="react" />
2
1
  import * as react from 'react';
3
2
  import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
4
3
  import { DiscoveryApi, FetchApi } from '@backstage/core-plugin-api';
@@ -16,9 +15,9 @@ declare const EntityKwirthMetricsContent: (props: {
16
15
 
17
16
  interface KwirthMetricsApi {
18
17
  requestAccess(entity: Entity, channel: string, scopes: InstanceConfigScopeEnum[]): Promise<ClusterValidPods[]>;
19
- getMetrics(clusterName: string): Promise<string[]>;
20
18
  getResources(entity: Entity): Promise<ClusterValidPods>;
21
19
  getVersion(): Promise<string>;
20
+ getInfo(): any;
22
21
  }
23
22
  declare const kwirthMetricsApiRef: _backstage_core_plugin_api.ApiRef<KwirthMetricsApi>;
24
23
 
@@ -30,11 +29,13 @@ declare class KwirthMetricsClient implements KwirthMetricsApi {
30
29
  private readonly discoveryApi;
31
30
  private readonly fetchApi;
32
31
  constructor(options: KwirthMetricsClientOptions);
32
+ getInfo(): Promise<string>;
33
33
  getVersion(): Promise<string>;
34
34
  getResources(entity: Entity): Promise<ClusterValidPods>;
35
- getMetrics(clusterName: string): Promise<string[]>;
36
35
  requestAccess(entity: Entity, channel: string, scopes: InstanceConfigScopeEnum[]): Promise<ClusterValidPods[]>;
37
36
  }
38
37
 
39
- export { EntityKwirthMetricsContent, KwirthMetricsClient, kwirthMetricsApiRef, kwirthMetricsPlugin };
38
+ declare const VERSION = "0.12.9";
39
+
40
+ export { EntityKwirthMetricsContent, KwirthMetricsClient, VERSION, kwirthMetricsApiRef, kwirthMetricsPlugin };
40
41
  export type { KwirthMetricsApi, KwirthMetricsClientOptions };
package/dist/index.esm.js CHANGED
@@ -1,4 +1,8 @@
1
1
  export { EntityKwirthMetricsContent, kwirthMetricsPlugin } from './plugin.esm.js';
2
2
  export { KwirthMetricsClient } from './api/KwirthMetricsClient.esm.js';
3
3
  export { kwirthMetricsApiRef } from './api/types.esm.js';
4
+
5
+ const VERSION = "0.12.9";
6
+
7
+ export { VERSION };
4
8
  //# sourceMappingURL=index.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/index.ts"],"sourcesContent":["export const VERSION='0.12.9'\r\n\r\nexport { EntityKwirthMetricsContent, kwirthMetricsPlugin } from './plugin'\r\nexport { KwirthMetricsClient as KwirthMetricsClient, kwirthMetricsApiRef as kwirthMetricsApiRef } from './api'\r\n\r\nexport type { KwirthMetricsApi, KwirthMetricsClientOptions } from './api'"],"names":[],"mappings":";;;;AAAO,MAAM,OAAA,GAAQ;;;;"}
@@ -24,7 +24,7 @@ const kwirthMetricsPlugin = createPlugin({
24
24
  const EntityKwirthMetricsContent = kwirthMetricsPlugin.provide(
25
25
  createRoutableExtension({
26
26
  name: "EntityKwirthMetricsContent",
27
- component: () => import('./components/EntityKwirthMetricsContent/index.esm.js').then((m) => m.EntityKwirthMetricsContent),
27
+ component: () => import('./components/EntityKwirthMetricsContent.esm.js').then((m) => m.EntityKwirthMetricsContent),
28
28
  mountPoint: rootRouteRef
29
29
  })
30
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\nimport { kwirthMetricsApiRef, KwirthMetricsClient } 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 kwirthMetricsPlugin = createPlugin({\r\n id: 'kwirthmetrics', \r\n apis: [\r\n createApiFactory({\r\n api: kwirthMetricsApiRef,\r\n deps: {\r\n discoveryApi: discoveryApiRef,\r\n fetchApi: fetchApiRef,\r\n },\r\n factory({ discoveryApi, fetchApi }) {\r\n return new KwirthMetricsClient({ discoveryApi, fetchApi });\r\n },\r\n }),\r\n ],\r\n routes: {\r\n root: rootRouteRef\r\n }\r\n});\r\n\r\nexport const EntityKwirthMetricsContent = kwirthMetricsPlugin.provide(\r\n createRoutableExtension({\r\n name: 'EntityKwirthMetricsContent',\r\n component: () =>\r\n import('./components/EntityKwirthMetricsContent').then(m => m.EntityKwirthMetricsContent),\r\n mountPoint: rootRouteRef\r\n })\r\n);\r\n"],"names":[],"mappings":";;;;;AAoBO,MAAM,sBAAsB,YAAa,CAAA;AAAA,EAC9C,EAAI,EAAA,eAAA;AAAA,EACJ,IAAM,EAAA;AAAA,IACJ,gBAAiB,CAAA;AAAA,MACf,GAAK,EAAA,mBAAA;AAAA,MACL,IAAM,EAAA;AAAA,QACJ,YAAc,EAAA,eAAA;AAAA,QACd,QAAU,EAAA;AAAA,OACZ;AAAA,MACA,OAAQ,CAAA,EAAE,YAAc,EAAA,QAAA,EAAY,EAAA;AAClC,QAAA,OAAO,IAAI,mBAAA,CAAoB,EAAE,YAAA,EAAc,UAAU,CAAA;AAAA;AAC3D,KACD;AAAA,GACH;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,IAAM,EAAA;AAAA;AAEV,CAAC;AAEM,MAAM,6BAA6B,mBAAoB,CAAA,OAAA;AAAA,EAC5D,uBAAwB,CAAA;AAAA,IACtB,IAAM,EAAA,4BAAA;AAAA,IACN,SAAA,EAAW,MACT,OAAO,sDAAyC,EAAE,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,0BAA0B,CAAA;AAAA,IAC1F,UAAY,EAAA;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\nimport { kwirthMetricsApiRef, KwirthMetricsClient } 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 kwirthMetricsPlugin = createPlugin({\r\n id: 'kwirthmetrics', \r\n apis: [\r\n createApiFactory({\r\n api: kwirthMetricsApiRef,\r\n deps: {\r\n discoveryApi: discoveryApiRef,\r\n fetchApi: fetchApiRef,\r\n },\r\n factory({ discoveryApi, fetchApi }) {\r\n return new KwirthMetricsClient({ discoveryApi, fetchApi });\r\n },\r\n }),\r\n ],\r\n routes: {\r\n root: rootRouteRef\r\n }\r\n});\r\n\r\nexport const EntityKwirthMetricsContent = kwirthMetricsPlugin.provide(\r\n createRoutableExtension({\r\n name: 'EntityKwirthMetricsContent',\r\n component: () =>\r\n import('./components/EntityKwirthMetricsContent').then(m => m.EntityKwirthMetricsContent),\r\n mountPoint: rootRouteRef\r\n })\r\n);\r\n"],"names":[],"mappings":";;;;;AAoBO,MAAM,sBAAsB,YAAA,CAAa;AAAA,EAC9C,EAAA,EAAI,eAAA;AAAA,EACJ,IAAA,EAAM;AAAA,IACJ,gBAAA,CAAiB;AAAA,MACf,GAAA,EAAK,mBAAA;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,mBAAA,CAAoB,EAAE,YAAA,EAAc,UAAU,CAAA;AAAA,MAC3D;AAAA,KACD;AAAA,GACH;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM;AAAA;AAEV,CAAC;AAEM,MAAM,6BAA6B,mBAAA,CAAoB,OAAA;AAAA,EAC5D,uBAAA,CAAwB;AAAA,IACtB,IAAA,EAAM,4BAAA;AAAA,IACN,SAAA,EAAW,MACT,OAAO,gDAAyC,EAAE,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,0BAA0B,CAAA;AAAA,IAC1F,UAAA,EAAY;AAAA,GACb;AACH;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"routes.esm.js","sources":["../src/routes.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\nimport { createRouteRef } from '@backstage/core-plugin-api';\r\n\r\nexport const rootRouteRef = createRouteRef({\r\n id: 'kwirth',\r\n});\r\n"],"names":[],"mappings":";;AAiBO,MAAM,eAAe,cAAe,CAAA;AAAA,EACzC,EAAI,EAAA;AACN,CAAC;;;;"}
1
+ {"version":3,"file":"routes.esm.js","sources":["../src/routes.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\nimport { createRouteRef } from '@backstage/core-plugin-api';\r\n\r\nexport const rootRouteRef = createRouteRef({\r\n id: 'kwirth',\r\n});\r\n"],"names":[],"mappings":";;AAiBO,MAAM,eAAe,cAAA,CAAe;AAAA,EACzC,EAAA,EAAI;AACN,CAAC;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jfvilas/plugin-kwirth-metrics",
3
- "version": "0.12.8",
3
+ "version": "0.13.1",
4
4
  "description": "Frontend plugin for viewing Kubernetes resource usage (metrics) in Backstage",
5
5
  "keywords": [
6
6
  "Backstage",
@@ -16,6 +16,7 @@
16
16
  "pluginId": "kwirt",
17
17
  "pluginPackages": [
18
18
  "@jfvilas/plugin-kwirth-metrics",
19
+ "@jfvilas/plugin-kwirth-frontend",
19
20
  "@jfvilas/plugin-kwirth-common",
20
21
  "@jfvilas/plugin-kwirth-backend"
21
22
  ]
@@ -1,29 +0,0 @@
1
- <svg viewBox="0 0 340 260" width="340px" height="260px" xmlns="http://www.w3.org/2000/svg" xmlns:bx="https://boxy-svg.com">
2
- <defs>
3
- <bx:export>
4
- <bx:file format="svg"></bx:file>
5
- </bx:export>
6
- </defs>
7
- <g transform="matrix(0.9912869334220885, 0, 0, 0.9992620348930358, -14.405802726745609, -13.716870307922363)">
8
- <rect style="fill-rule: nonzero; stroke: rgb(255, 255, 255); stroke-width: 0px; fill: rgb(230, 230, 230); transform-origin: 251.826px 205.425px;" transform="matrix(0.985986, -0.166827, 0.164416, 0.986394, -63.927027, -123.853593)" x="111.287" y="192.512" width="281.077" height="25.826" rx="12.015" ry="12.015"></rect>
9
- <rect style="fill-rule: nonzero; stroke: rgb(255, 255, 255); stroke-width: 0px; fill: rgb(230, 230, 230); transform-origin: 183.734px 205.425px;" transform="matrix(0.985986, -0.166827, 0.164416, 0.986394, 25.09495, -102.378974)" x="81.196" y="192.512" width="205.077" height="25.826" rx="12.015" ry="12.015"></rect>
10
- <rect style="fill-rule: nonzero; stroke: rgb(255, 255, 255); stroke-width: 0px; fill: rgb(230, 230, 230); transform-origin: 233.847px 205.425px;" transform="matrix(0.985986, -0.166827, 0.164416, 0.986394, -88.514386, -142.044601)" x="103.341" y="192.512" width="261.01" height="25.826" rx="12.015" ry="12.015"></rect>
11
- <rect style="fill-rule: nonzero; stroke: rgb(255, 255, 255); stroke-width: 0px; fill: rgb(230, 230, 230); transform-origin: 293.722px 205.425px;" transform="matrix(0.985986, -0.166827, 0.164416, 0.986394, -99.946111, -14.149463)" x="129.802" y="192.512" width="327.839" height="25.826" rx="12.015" ry="12.015"></rect>
12
- <rect style="fill-rule: nonzero; stroke: rgb(255, 255, 255); stroke-width: 0px; fill: rgb(230, 230, 230); transform-origin: 230.511px 205.425px;" transform="matrix(0.985986, -0.166827, 0.164416, 0.986394, -36.575721, 10.839559)" x="101.867" y="192.512" width="257.287" height="25.826" rx="12.015" ry="12.015"></rect>
13
- <rect style="fill-rule: nonzero; stroke: rgb(255, 255, 255); stroke-width: 0px; fill: rgb(230, 230, 230); transform-origin: 233.847px 205.425px;" transform="matrix(0.985986, -0.166827, 0.164416, 0.986394, -59.583989, -36.241093)" x="103.341" y="192.512" width="261.01" height="25.826" rx="12.015" ry="12.015"></rect>
14
- </g>
15
- <defs id="defs2713"></defs>
16
- <path style="color: rgb(0, 0, 0); font-style: normal; font-variant: normal; font-weight: normal; font-stretch: normal; font-size: medium; line-height: normal; font-family: sans-serif; font-feature-settings: normal; text-indent: 0px; text-align: start; text-decoration: none solid rgb(0, 0, 0); letter-spacing: normal; word-spacing: normal; text-transform: none; writing-mode: lr-tb; direction: ltr; text-orientation: mixed; dominant-baseline: auto; baseline-shift: baseline; text-anchor: start; white-space: normal; clip-rule: nonzero; display: inline; overflow: visible; visibility: visible; opacity: 1; isolation: auto; mix-blend-mode: normal; color-interpolation: srgb; color-interpolation-filters: linearrgb; vector-effect: none; fill: rgb(255, 255, 255); fill-opacity: 1; fill-rule: evenodd; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-dashoffset: 0; stroke-opacity: 1; color-rendering: auto; image-rendering: auto; shape-rendering: auto; text-rendering: auto; paint-order: fill; stroke-width: 9px; stroke: rgb(74, 74, 74);" d="M 88.657 30.45 L 234.73 30.45 L 234.73 224.269 L 88.657 224.269 L 88.657 30.45 Z" id="path3310"></path>
17
- <g id="g3330" transform="matrix(0.441208, 0, 0, 0.468544, -801.855, -5194.43)">
18
- <path id="path3312" d="m 2063.75,11395.242 h 238.125" style="fill: none; fill-rule: evenodd; stroke-width: 23.8125; stroke-linecap: round; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 0.870588; paint-order: fill; stroke: rgb(167, 171, 176);"></path>
19
- <path id="path3316" d="m 2063.75,11501.075 h 238.125" style="fill: none; fill-rule: evenodd; stroke-width: 23.8125; stroke-linecap: round; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 0.870588; paint-order: fill; stroke: rgb(167, 171, 176);"></path>
20
- <g transform="matrix(1.4118204,0,0,1.4118204,755.9522,3488.749)" id="g3328">
21
- <path style="fill-opacity: 1; fill-rule: evenodd; stroke-width: 0.193224px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; paint-order: fill; fill: rgb(188, 187, 186); stroke: rgb(167, 171, 176);" d="m 978.95834,5562.2084 v -42.3334 h 26.45836 v 42.3334 z" id="path3318"></path>
22
- <path id="path3320" d="m 1010.7083,5562.2084 v -52.9167 h 26.4584 v 52.9167 z" style="fill-opacity: 1; fill-rule: evenodd; stroke-width: 0.216031px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; paint-order: fill; fill: rgb(188, 187, 186); stroke: rgb(167, 171, 176);"></path>
23
- <path style="fill-opacity: 1; fill-rule: evenodd; stroke-width: 0.236651px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; paint-order: fill; fill: rgb(188, 187, 186); stroke: rgb(167, 171, 176);" d="m 1042.4583,5562.2084 v -63.5 h 26.4584 v 63.5 z" id="path3322"></path>
24
- <path id="path3324" d="m 947.20834,5562.2084 v -31.75 h 26.45836 v 31.75 z" style="fill-opacity: 1; fill-rule: evenodd; stroke-width: 0.167337px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; paint-order: fill; fill: rgb(188, 187, 186); stroke: rgb(167, 171, 176);"></path>
25
- <path id="path3326" transform="scale(0.26458333)" d="m 4011.668,20662.062 a 7.8996132,7.8996132 0 0 0 -7.4668,10.43 l 5.0429,14.922 -432.4082,144.131 a 10.002756,10.002756 0 1 0 6.3262,18.978 l 432.4824,-144.162 4.9082,14.528 a 7.8996132,7.8996132 0 0 0 13.4141,2.689 l 16.8711,-19.182 16.8691,-19.179 a 7.8996132,7.8996132 0 0 0 -0.8945,-11.299 v 0 a 7.8996132,7.8996132 0 0 0 -0.6289,-0.477 7.8996132,7.8996132 0 0 0 -2.8554,-1.189 l -25.045,-5.02 -25.0449,-5.019 a 7.8996132,7.8996132 0 0 0 -1.5683,-0.155 z" style="color: rgb(0, 0, 0); font-style: normal; font-variant: normal; font-weight: normal; font-stretch: normal; font-size: medium; line-height: normal; font-family: sans-serif; font-feature-settings: normal; text-indent: 0px; text-align: start; text-decoration: none solid rgb(0, 0, 0); letter-spacing: normal; word-spacing: normal; text-transform: none; writing-mode: lr-tb; direction: ltr; text-orientation: mixed; dominant-baseline: auto; baseline-shift: baseline; text-anchor: start; white-space: normal; clip-rule: nonzero; display: inline; overflow: visible; visibility: visible; opacity: 1; isolation: auto; mix-blend-mode: normal; color-interpolation: srgb; color-interpolation-filters: linearrgb; vector-effect: none; fill-opacity: 1; fill-rule: evenodd; stroke-width: 20; stroke-linecap: round; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-dashoffset: 0; stroke-opacity: 1; color-rendering: auto; image-rendering: auto; shape-rendering: auto; text-rendering: auto; paint-order: fill; stroke: rgb(167, 171, 176); fill: rgb(170, 169, 168);"></path>
26
- </g>
27
- </g>
28
- <text style="fill: rgb(74, 74, 74); font-family: Consolas; font-size: 34px; font-weight: 700; stroke-miterlimit: 10; stroke-width: 0px; white-space: pre;" transform="matrix(0.474467, 0, 0, 0.44399, 48.3521, 109.292)" x="114.293" y="147.365">KwirthMetrics</text>
29
- </svg>
@@ -1,30 +0,0 @@
1
- import React from 'react';
2
- import Box from '@material-ui/core/Box';
3
- import CardHeader from '@material-ui/core/CardHeader';
4
- import Divider from '@material-ui/core/Divider';
5
- import List from '@material-ui/core/List';
6
- import ListItem from '@material-ui/core/ListItem';
7
- import ListItemText from '@material-ui/core/ListItemText';
8
- import Typography from '@material-ui/core/Typography';
9
- import { makeStyles } from '@material-ui/core/styles';
10
-
11
- const useStyles = makeStyles((_theme) => ({
12
- clusterBox: {
13
- display: "flex",
14
- marginTop: "8px"
15
- }
16
- }));
17
- const ClusterList = (props) => {
18
- const classes = useStyles();
19
- const { resources, selectedClusterName, onSelect } = props;
20
- return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(CardHeader, { title: "Clusters" }), /* @__PURE__ */ React.createElement(Divider, { style: { marginTop: 8 } }), /* @__PURE__ */ React.createElement(List, { dense: true }, resources.map((cluster, index) => /* @__PURE__ */ React.createElement(ListItem, { button: true, key: index, selected: selectedClusterName === cluster.name, onClick: () => onSelect(cluster.name), disabled: cluster.data.length === 0 }, /* @__PURE__ */ React.createElement(
21
- ListItemText,
22
- {
23
- primary: cluster.name,
24
- secondary: /* @__PURE__ */ React.createElement(Box, { component: "span", className: classes.clusterBox }, /* @__PURE__ */ React.createElement(Typography, { component: "span", style: { fontSize: 12 } }, cluster.title))
25
- }
26
- )))));
27
- };
28
-
29
- export { ClusterList };
30
- //# sourceMappingURL=ClusterList.esm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ClusterList.esm.js","sources":["../../../src/components/ClusterList/ClusterList.tsx"],"sourcesContent":["import React from 'react'\r\nimport Box from '@material-ui/core/Box'\r\nimport CardHeader from '@material-ui/core/CardHeader'\r\nimport Divider from '@material-ui/core/Divider'\r\nimport List from '@material-ui/core/List'\r\nimport ListItem from '@material-ui/core/ListItem'\r\nimport ListItemText from '@material-ui/core/ListItemText'\r\nimport Typography from '@material-ui/core/Typography'\r\nimport { makeStyles, Theme } from '@material-ui/core/styles'\r\nimport { ClusterValidPods } from '@jfvilas/plugin-kwirth-common'\r\n\r\nconst useStyles = makeStyles((_theme: Theme) => ({\r\n clusterBox: {\r\n display: 'flex',\r\n marginTop: '8px',\r\n },\r\n}));\r\n \r\nconst ClusterList = (props: {\r\n\t\tresources: ClusterValidPods[]\r\n\t\tselectedClusterName: string\r\n\t\tonSelect:(name:string|undefined) => void\r\n\t}) => {\r\n \r\n const classes=useStyles();\r\n const { resources, selectedClusterName, onSelect } = props;\r\n \r\n\treturn (\r\n\t\t<>\r\n\t\t<CardHeader title={'Clusters'}/>\r\n\t\t\r\n\t\t<Divider style={{marginTop:8}}/>\r\n\r\n\t\t<List dense>\r\n\t\t\t{resources.map((cluster, index) => (\r\n\t\t\t<ListItem button key={index} selected={selectedClusterName === cluster.name} onClick={() => onSelect(cluster.name)} disabled={cluster.data.length===0}>\r\n\t\t\t\t<ListItemText\r\n\t\t\t\tprimary={cluster.name}\r\n\t\t\t\tsecondary={\r\n\t\t\t\t\t<Box component={'span'} className={classes.clusterBox}>\r\n\t\t\t\t\t<Typography component={'span'} style={{fontSize:12}}>\r\n\t\t\t\t\t\t{cluster.title}\r\n\t\t\t\t\t</Typography>\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t}\r\n\t\t\t\t/>\r\n\t\t\t</ListItem>\r\n\t\t\t))}\r\n\t\t</List>\r\n\t\t</>\r\n\t)\r\n}\r\n\r\nexport { ClusterList }"],"names":[],"mappings":";;;;;;;;;;AAWA,MAAM,SAAA,GAAY,UAAW,CAAA,CAAC,MAAmB,MAAA;AAAA,EAC7C,UAAY,EAAA;AAAA,IACV,OAAS,EAAA,MAAA;AAAA,IACT,SAAW,EAAA;AAAA;AAEjB,CAAE,CAAA,CAAA;AAEI,MAAA,WAAA,GAAc,CAAC,KAId,KAAA;AAEH,EAAA,MAAM,UAAQ,SAAU,EAAA;AACxB,EAAA,MAAM,EAAE,SAAA,EAAW,mBAAqB,EAAA,QAAA,EAAa,GAAA,KAAA;AAExD,EAAA,iFAEE,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,OAAO,UAAW,EAAA,CAAA,sCAE7B,OAAQ,EAAA,EAAA,KAAA,EAAO,EAAC,SAAU,EAAA,CAAA,IAAG,CAE9B,kBAAA,KAAA,CAAA,aAAA,CAAC,QAAK,KAAK,EAAA,IAAA,EAAA,EACT,UAAU,GAAI,CAAA,CAAC,SAAS,KACzB,qBAAA,KAAA,CAAA,aAAA,CAAC,YAAS,MAAM,EAAA,IAAA,EAAC,KAAK,KAAO,EAAA,QAAA,EAAU,wBAAwB,OAAQ,CAAA,IAAA,EAAM,SAAS,MAAM,QAAA,CAAS,QAAQ,IAAI,CAAA,EAAG,UAAU,OAAQ,CAAA,IAAA,CAAK,WAAS,CACnJ,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACD,SAAS,OAAQ,CAAA,IAAA;AAAA,MACjB,2BACE,KAAA,CAAA,aAAA,CAAA,GAAA,EAAA,EAAI,WAAW,MAAQ,EAAA,SAAA,EAAW,QAAQ,UAC3C,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,cAAW,SAAW,EAAA,MAAA,EAAQ,OAAO,EAAC,QAAA,EAAS,IAC9C,EAAA,EAAA,OAAA,CAAQ,KACV,CACA;AAAA;AAAA,GAGF,CACC,CACF,CACA,CAAA;AAEF;;;;"}
@@ -1,63 +0,0 @@
1
- import React from 'react';
2
- import { CodeSnippet } from '@backstage/core-components';
3
- import { Grid, Typography, Button } from '@material-ui/core';
4
- import KwirthComponentNotFound from '../../assets/kwirthmetrics-component-not-found.svg';
5
- import { ANNOTATION_BACKSTAGE_KUBERNETES_LABELID, ANNOTATION_BACKSTAGE_KUBERNETES_LABELSELECTOR } from '@jfvilas/plugin-kwirth-common';
6
-
7
- var ErrorType = /* @__PURE__ */ ((ErrorType2) => {
8
- ErrorType2[ErrorType2["NO_PODS"] = 0] = "NO_PODS";
9
- ErrorType2[ErrorType2["NO_CLUSTERS"] = 1] = "NO_CLUSTERS";
10
- return ErrorType2;
11
- })(ErrorType || {});
12
- const KUBERNETES_YAML = `apiVersion: apps/v1
13
- kind: Deployment
14
- metadata:
15
- name: '$entityName'
16
- description: '$entityDescription'
17
- labels:
18
- ${ANNOTATION_BACKSTAGE_KUBERNETES_LABELID} : '$entityName'
19
- # Or just don't add this label and use Backstage label selector this way:
20
- # ${ANNOTATION_BACKSTAGE_KUBERNETES_LABELSELECTOR}: app=$entityName
21
- spec:
22
- selector:
23
- matchLabels:
24
- app: '$entityName'
25
- template:
26
- metadata:
27
- name: '$entityName'-pod
28
- labels:
29
- app: '$entityName'
30
- # Or just don't add this label and use Backstage label selector this way:
31
- # ${ANNOTATION_BACKSTAGE_KUBERNETES_LABELSELECTOR}: app=$entityName
32
- spec:
33
- containers:
34
- - name: '$entityName'
35
- image: your-OCI-image
36
- ...`;
37
- const ComponentNotFound = (props) => {
38
- var text = "";
39
- var content = /* @__PURE__ */ React.createElement(
40
- CodeSnippet,
41
- {
42
- text: KUBERNETES_YAML.replaceAll("$entityName", props.entity.metadata.name).replaceAll("$entityDescription", props.entity.metadata.description),
43
- language: "yaml",
44
- showLineNumbers: true,
45
- highlightedNumbers: [7, 17],
46
- customStyle: { background: "inherit" }
47
- }
48
- );
49
- var nopodsMsg = `Although this component is well tagged inside Backstage, and we have found some clusters configured in Backstage, we were unable to find "${props.entity.metadata.name}" running on any pod. Maybe you need to tag Kubernetes objects (deployment and pod templates).`;
50
- var noclustersMsg = `Although this component has a correct 'kubernetes-id' in the ${props.entity.metadata.name} Component YAML, we couldn't find any cluster. Maybe you need to tag Kubernetes objects (deployments and pod templates).`;
51
- switch (props.error) {
52
- case 0 /* NO_PODS */:
53
- text = nopodsMsg;
54
- break;
55
- case 1 /* NO_CLUSTERS */:
56
- text = noclustersMsg;
57
- break;
58
- }
59
- return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Grid, { container: true, direction: "row", justifyContent: "flex-start", alignItems: "flex-start", spacing: 2 }, /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 6, md: 6 }, /* @__PURE__ */ React.createElement(Grid, { container: true, direction: "column" }, /* @__PURE__ */ React.createElement(Grid, { item: true, xs: true }, /* @__PURE__ */ React.createElement(Typography, { variant: "h5" }, "Component not found")), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: true }, /* @__PURE__ */ React.createElement(Typography, { variant: "body1" }, text)), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: true }, content))), /* @__PURE__ */ React.createElement("img", { src: KwirthComponentNotFound, style: { left: "10%", marginTop: "10%", width: "30%", position: "relative" } })), /* @__PURE__ */ React.createElement(Button, { variant: "contained", color: "primary", target: "_blank", href: "https://backstage.io/docs/features/kubernetes/configuration#surfacing-your-kubernetes-components-as-part-of-an-entity" }, "READ MORE"));
60
- };
61
-
62
- export { ComponentNotFound, ErrorType };
63
- //# sourceMappingURL=ComponentNotFound.esm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ComponentNotFound.esm.js","sources":["../../../src/components/ComponentNotFound/ComponentNotFound.tsx"],"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\nimport React from 'react'\r\nimport { Entity } from '@backstage/catalog-model'\r\nimport { CodeSnippet } from '@backstage/core-components'\r\nimport { Button, Grid, Typography } from '@material-ui/core'\r\nimport KwirthComponentNotFound from '../../assets/kwirthmetrics-component-not-found.svg'\r\nimport { ANNOTATION_BACKSTAGE_KUBERNETES_LABELID, ANNOTATION_BACKSTAGE_KUBERNETES_LABELSELECTOR } from '@jfvilas/plugin-kwirth-common'\r\n\r\nenum ErrorType {\r\n NO_PODS,\r\n NO_CLUSTERS\r\n}\r\n\r\nconst KUBERNETES_YAML = `apiVersion: apps/v1\r\nkind: Deployment\r\nmetadata:\r\n name: '$entityName'\r\n description: '$entityDescription'\r\n labels:\r\n ${ANNOTATION_BACKSTAGE_KUBERNETES_LABELID} : '$entityName'\r\n # Or just don't add this label and use Backstage label selector this way:\r\n # ${ANNOTATION_BACKSTAGE_KUBERNETES_LABELSELECTOR}: app=$entityName\r\nspec:\r\n selector:\r\n matchLabels:\r\n app: '$entityName'\r\n template:\r\n metadata:\r\n name: '$entityName'-pod\r\n labels:\r\n app: '$entityName'\r\n # Or just don't add this label and use Backstage label selector this way:\r\n # ${ANNOTATION_BACKSTAGE_KUBERNETES_LABELSELECTOR}: app=$entityName\r\n spec:\r\n containers:\r\n - name: '$entityName'\r\n image: your-OCI-image\r\n ...`;\r\n\r\nconst ComponentNotFound = (props: {error: ErrorType, entity:Entity}) => {\r\n var text:string='';\r\n var content:JSX.Element=<CodeSnippet\r\n text={KUBERNETES_YAML.replaceAll('$entityName', props.entity.metadata.name).replaceAll('$entityDescription',props.entity.metadata.description!)}\r\n language=\"yaml\"\r\n showLineNumbers\r\n highlightedNumbers={[7, 17]}\r\n customStyle={{ background: 'inherit' }}\r\n />;\r\n\r\n var nopodsMsg=`Although this component is well tagged inside Backstage, and we have found some clusters configured in Backstage, we were unable to find \"${props.entity.metadata.name}\" running on any pod. Maybe you need to tag Kubernetes objects (deployment and pod templates).`;\r\n var noclustersMsg=`Although this component has a correct 'kubernetes-id' in the ${props.entity.metadata.name} Component YAML, we couldn't find any cluster. Maybe you need to tag Kubernetes objects (deployments and pod templates).`;\r\n \r\n switch(props.error) {\r\n case ErrorType.NO_PODS:\r\n text=nopodsMsg;\r\n break;\r\n case ErrorType.NO_CLUSTERS:\r\n text=noclustersMsg;\r\n break;\r\n }\r\n\r\n return (<>\r\n <Grid container direction=\"row\" justifyContent=\"flex-start\" alignItems=\"flex-start\" spacing={2} >\r\n <Grid item xs={6} md={6}>\r\n <Grid container direction=\"column\">\r\n <Grid item xs>\r\n <Typography variant=\"h5\">{'Component not found'}</Typography>\r\n </Grid>\r\n <Grid item xs>\r\n <Typography variant=\"body1\">{text}</Typography>\r\n </Grid>\r\n <Grid item xs>\r\n {content}\r\n </Grid>\r\n </Grid>\r\n </Grid>\r\n {\r\n <img src={KwirthComponentNotFound} style={{ left:'10%', marginTop:'10%', width:'30%', position:'relative' }} />\r\n }\r\n </Grid>\r\n <Button variant=\"contained\" color=\"primary\" target=\"_blank\" href=\"https://backstage.io/docs/features/kubernetes/configuration#surfacing-your-kubernetes-components-as-part-of-an-entity\">\r\n READ MORE\r\n </Button>\r\n </>);\r\n}\r\n\r\nexport { ComponentNotFound, ErrorType }"],"names":["ErrorType"],"mappings":"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"}