@backstage-community/plugin-tekton 3.18.0 → 3.20.0
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/CHANGELOG.md +20 -0
- package/README.md +9 -0
- package/dist/components/PipelineRunList/PipelineRunRowActions.esm.js +3 -3
- package/dist/components/PipelineRunList/PipelineRunRowActions.esm.js.map +1 -1
- package/dist/components/PipelineRunLogs/PipelineRunLogDialog.esm.js +1 -1
- package/dist/components/PipelineRunLogs/PodLogsDownloadLink.esm.js +1 -1
- package/dist/components/PipelineRunLogs/TaskStatusStepper.esm.js +1 -1
- package/dist/components/PipelineRunOutput/PipelineRunOutputDialog.esm.js +1 -1
- package/dist/components/common/PermissionAlert.esm.js +6 -1
- package/dist/components/common/PermissionAlert.esm.js.map +1 -1
- package/dist/components/pipeline-topology/PipelineLayout.esm.js +2 -2
- package/dist/components/pipeline-topology/PipelineTaskNode.esm.js +2 -2
- package/dist/components/pipeline-topology/PipelineTaskNode.esm.js.map +1 -1
- package/dist/components/pipeline-topology/PipelineVisualization.esm.js +1 -1
- package/dist/components/pipeline-topology/PipelineVisualization.esm.js.map +1 -1
- package/dist/components/pipeline-topology/pipelineComponentFactory.esm.js +3 -3
- package/dist/components/pipeline-topology/pipelineComponentFactory.esm.js.map +1 -1
- package/dist/hooks/useResourcesClusters.esm.js +1 -1
- package/dist/hooks/useResourcesClusters.esm.js.map +1 -1
- package/dist/hooks/useTektonViewPermission.esm.js +7 -4
- package/dist/hooks/useTektonViewPermission.esm.js.map +1 -1
- package/dist/models.esm.js +0 -4
- package/dist/models.esm.js.map +1 -1
- package/dist/node_modules_dist/style-inject/dist/style-inject.es.esm.js +1 -1
- package/dist/node_modules_dist/style-inject/dist/style-inject.es.esm.js.map +1 -1
- package/dist/plugin.esm.js +1 -1
- package/dist/utils/pipeline-topology-utils.esm.js +3 -3
- package/dist/utils/pipeline-topology-utils.esm.js.map +1 -1
- package/dist/utils/pipelineRun-utils.esm.js +1 -1
- package/dist/utils/taskRun-utils.esm.js +2 -2
- package/package.json +8 -8
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
### Dependencies
|
|
2
2
|
|
|
3
|
+
## 3.20.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 48e0647: Use Kubernetes plugin permissions for Tekton plugin, remove tekton-specific permissions from tekton-common plugin
|
|
8
|
+
- 585f020: Update aonic-ui/pipelines version
|
|
9
|
+
|
|
10
|
+
### Patch Changes
|
|
11
|
+
|
|
12
|
+
- 0ac3320: Updated dependency `@types/lodash` to `4.17.15`.
|
|
13
|
+
- 3e35324: Updated dependency `start-server-and-test` to `2.0.10`.
|
|
14
|
+
- Updated dependencies [48e0647]
|
|
15
|
+
- @backstage-community/plugin-tekton-common@1.6.0
|
|
16
|
+
|
|
17
|
+
## 3.19.0
|
|
18
|
+
|
|
19
|
+
### Minor Changes
|
|
20
|
+
|
|
21
|
+
- a7730fc: Update shared react library @janus-idp/shared-react to version 2.16.0 with newer @kubernetes/client-node@1.0.0-rc7.
|
|
22
|
+
|
|
3
23
|
## 3.18.0
|
|
4
24
|
|
|
5
25
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -140,6 +140,15 @@ The Tekton plugin enables you to visualize the `PipelineRun` resources available
|
|
|
140
140
|
);
|
|
141
141
|
```
|
|
142
142
|
|
|
143
|
+
#### Permissions
|
|
144
|
+
|
|
145
|
+
If you are using permissions, please ensure that the following Kubernetes permissions are enabled:
|
|
146
|
+
|
|
147
|
+
- `kubernetes.clusters.read `
|
|
148
|
+
- `kubernetes.resources.read`
|
|
149
|
+
|
|
150
|
+
Read [the documentation](https://github.com/backstage/backstage/blob/master/docs/features/kubernetes/permissions.md) for more info on these permissions.
|
|
151
|
+
|
|
143
152
|
## For users
|
|
144
153
|
|
|
145
154
|
### Using the Tekton plugin in Backstage
|
|
@@ -6,7 +6,7 @@ import { Flex, FlexItem } from '@patternfly/react-core';
|
|
|
6
6
|
import { Tooltip } from '@patternfly/react-core/dist/esm/components/Tooltip/Tooltip';
|
|
7
7
|
import { ComputedStatus, pipelineRunFilterReducer } from '@janus-idp/shared-react';
|
|
8
8
|
import { TektonResourcesContext } from '../../hooks/TektonResourcesContext.esm.js';
|
|
9
|
-
import { getTaskrunsOutputGroup,
|
|
9
|
+
import { getTaskrunsOutputGroup, hasExternalLink, isSbomTaskRun } from '../../utils/taskRun-utils.esm.js';
|
|
10
10
|
import OutputIcon from '../Icons/OutputIcon.esm.js';
|
|
11
11
|
import ViewLogsIcon from '../Icons/ViewLogsIcon.esm.js';
|
|
12
12
|
import PipelineRunLogDialog from '../PipelineRunLogs/PipelineRunLogDialog.esm.js';
|
|
@@ -69,7 +69,7 @@ const PipelineRunRowActions = ({
|
|
|
69
69
|
closeDialog,
|
|
70
70
|
pods,
|
|
71
71
|
taskRuns,
|
|
72
|
-
activeTask: noActiveTask ?
|
|
72
|
+
activeTask: noActiveTask ? void 0 : activeTaskName
|
|
73
73
|
}
|
|
74
74
|
), /* @__PURE__ */ React.createElement(
|
|
75
75
|
PipelineRunOutputDialog,
|
|
@@ -108,7 +108,7 @@ const PipelineRunRowActions = ({
|
|
|
108
108
|
"data-testid": "view-sbom-icon",
|
|
109
109
|
disabled: !sbomTaskRun || !isSbomTaskRun(sbomTaskRun),
|
|
110
110
|
size: "small",
|
|
111
|
-
onClick: !hasExternalLink(sbomTaskRun) ? () => openDialog() :
|
|
111
|
+
onClick: !hasExternalLink(sbomTaskRun) ? () => openDialog() : void 0,
|
|
112
112
|
style: { pointerEvents: "auto", padding: 0 }
|
|
113
113
|
},
|
|
114
114
|
/* @__PURE__ */ React.createElement(PipelineRunSBOMLink, { sbomTaskRun })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PipelineRunRowActions.esm.js","sources":["../../../src/components/PipelineRunList/PipelineRunRowActions.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport * as React from 'react';\n\nimport { kubernetesProxyPermission } from '@backstage/plugin-kubernetes-common';\nimport { usePermission } from '@backstage/plugin-permission-react';\n\nimport { IconButton } from '@material-ui/core';\nimport { Flex, FlexItem } from '@patternfly/react-core';\nimport { Tooltip } from '@patternfly/react-core/dist/esm/components/Tooltip/Tooltip';\n\nimport {\n ComputedStatus,\n pipelineRunFilterReducer,\n PipelineRunKind,\n TaskRunKind,\n} from '@janus-idp/shared-react';\n\nimport { TektonResourcesContext } from '../../hooks/TektonResourcesContext';\nimport {\n getTaskrunsOutputGroup,\n hasExternalLink,\n isSbomTaskRun,\n} from '../../utils/taskRun-utils';\nimport OutputIcon from '../Icons/OutputIcon';\nimport ViewLogsIcon from '../Icons/ViewLogsIcon';\nimport PipelineRunLogDialog from '../PipelineRunLogs/PipelineRunLogDialog';\nimport PipelineRunOutputDialog from '../PipelineRunOutput/PipelineRunOutputDialog';\nimport PipelineRunSBOMLink from './PipelineRunSBOMLink';\n\nconst PipelineRunRowActions: React.FC<{ pipelineRun: PipelineRunKind }> = ({\n pipelineRun,\n}) => {\n const { watchResourcesData } = React.useContext(TektonResourcesContext);\n const [open, setOpen] = React.useState<boolean>(false);\n\n const [openOutput, setOpenOutput] = React.useState<boolean>(false);\n const [noActiveTask, setNoActiveTask] = React.useState(false);\n const pods = watchResourcesData?.pods?.data || [];\n const taskRuns = watchResourcesData?.taskruns?.data || [];\n const { sbomTaskRun } = getTaskrunsOutputGroup(\n pipelineRun?.metadata?.name,\n taskRuns,\n );\n const activeTaskName = sbomTaskRun?.metadata?.name;\n\n const hasKubernetesProxyAccess = usePermission({\n permission: kubernetesProxyPermission,\n });\n\n const openDialog = (viewLogs?: boolean) => {\n if (viewLogs) setNoActiveTask(true);\n setOpen(true);\n };\n\n const openOutputDialog = () => {\n setOpenOutput(true);\n };\n\n const closeDialog = () => {\n setNoActiveTask(false);\n setOpen(false);\n };\n\n const {\n acsImageScanTaskRun,\n acsImageCheckTaskRun,\n acsDeploymentCheckTaskRun,\n ecTaskRun,\n } = getTaskrunsOutputGroup(pipelineRun?.metadata?.name, taskRuns);\n\n const finishedTaskruns = [\n ...(acsImageScanTaskRun ? [acsImageScanTaskRun] : []),\n ...(acsImageCheckTaskRun ? [acsImageCheckTaskRun] : []),\n ...(acsDeploymentCheckTaskRun ? [acsDeploymentCheckTaskRun] : []),\n ...(ecTaskRun ? [ecTaskRun] : []),\n ].filter((taskRun: TaskRunKind) =>\n [\n ComputedStatus.Succeeded,\n ComputedStatus.Failed,\n ComputedStatus.Skipped,\n ].includes(pipelineRunFilterReducer(taskRun)),\n );\n\n const results =\n pipelineRun?.status?.pipelineResults || pipelineRun?.status?.results || [];\n\n const disabled =\n results.length === 0 ? finishedTaskruns.length === 0 : results.length === 0;\n\n return (\n <>\n <PipelineRunLogDialog\n pipelineRun={pipelineRun}\n open={open}\n closeDialog={closeDialog}\n pods={pods}\n taskRuns={taskRuns}\n activeTask={noActiveTask ? undefined : activeTaskName}\n />\n\n <PipelineRunOutputDialog\n pipelineRun={pipelineRun}\n taskRuns={taskRuns}\n open={openOutput}\n closeDialog={() => {\n setOpenOutput(false);\n }}\n />\n <Flex gap={{ default: 'gapXs' }}>\n <FlexItem>\n <Tooltip\n content={\n hasKubernetesProxyAccess.allowed\n ? 'View logs'\n : 'Unauthorized to view logs'\n }\n >\n <IconButton\n size=\"small\"\n data-testid=\"view-logs-icon\"\n onClick={() => openDialog(true)}\n disabled={!hasKubernetesProxyAccess.allowed}\n style={{ pointerEvents: 'auto', padding: 0 }}\n >\n <ViewLogsIcon disabled={!hasKubernetesProxyAccess.allowed} />\n </IconButton>\n </Tooltip>\n </FlexItem>\n\n <FlexItem align={{ default: 'alignLeft' }}>\n <Tooltip\n content={\n !sbomTaskRun\n ? 'View SBOM is not applicable for this PipelineRun'\n : 'View SBOM'\n }\n >\n <IconButton\n data-testid=\"view-sbom-icon\"\n disabled={!sbomTaskRun || !isSbomTaskRun(sbomTaskRun)}\n size=\"small\"\n onClick={\n !hasExternalLink(sbomTaskRun) ? () => openDialog() : undefined\n }\n style={{ pointerEvents: 'auto', padding: 0 }}\n >\n <PipelineRunSBOMLink sbomTaskRun={sbomTaskRun} />\n </IconButton>\n </Tooltip>\n </FlexItem>\n <FlexItem align={{ default: 'alignLeft' }}>\n <Tooltip\n content={\n disabled\n ? 'View Output is not applicable for this PipelineRun'\n : 'View Output'\n }\n >\n <IconButton\n data-testid=\"view-output-icon\"\n disabled={disabled}\n size=\"small\"\n onClick={() => openOutputDialog()}\n style={{ pointerEvents: 'auto', padding: 0 }}\n >\n <OutputIcon disabled={disabled} />\n </IconButton>\n </Tooltip>\n </FlexItem>\n </Flex>\n </>\n );\n};\nexport default React.memo(PipelineRunRowActions);\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PipelineRunRowActions.esm.js","sources":["../../../src/components/PipelineRunList/PipelineRunRowActions.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport * as React from 'react';\n\nimport { kubernetesProxyPermission } from '@backstage/plugin-kubernetes-common';\nimport { usePermission } from '@backstage/plugin-permission-react';\n\nimport { IconButton } from '@material-ui/core';\nimport { Flex, FlexItem } from '@patternfly/react-core';\nimport { Tooltip } from '@patternfly/react-core/dist/esm/components/Tooltip/Tooltip';\n\nimport {\n ComputedStatus,\n pipelineRunFilterReducer,\n PipelineRunKind,\n TaskRunKind,\n} from '@janus-idp/shared-react';\n\nimport { TektonResourcesContext } from '../../hooks/TektonResourcesContext';\nimport {\n getTaskrunsOutputGroup,\n hasExternalLink,\n isSbomTaskRun,\n} from '../../utils/taskRun-utils';\nimport OutputIcon from '../Icons/OutputIcon';\nimport ViewLogsIcon from '../Icons/ViewLogsIcon';\nimport PipelineRunLogDialog from '../PipelineRunLogs/PipelineRunLogDialog';\nimport PipelineRunOutputDialog from '../PipelineRunOutput/PipelineRunOutputDialog';\nimport PipelineRunSBOMLink from './PipelineRunSBOMLink';\n\nconst PipelineRunRowActions: React.FC<{ pipelineRun: PipelineRunKind }> = ({\n pipelineRun,\n}) => {\n const { watchResourcesData } = React.useContext(TektonResourcesContext);\n const [open, setOpen] = React.useState<boolean>(false);\n\n const [openOutput, setOpenOutput] = React.useState<boolean>(false);\n const [noActiveTask, setNoActiveTask] = React.useState(false);\n const pods = watchResourcesData?.pods?.data || [];\n const taskRuns = watchResourcesData?.taskruns?.data || [];\n const { sbomTaskRun } = getTaskrunsOutputGroup(\n pipelineRun?.metadata?.name,\n taskRuns,\n );\n const activeTaskName = sbomTaskRun?.metadata?.name;\n\n const hasKubernetesProxyAccess = usePermission({\n permission: kubernetesProxyPermission,\n });\n\n const openDialog = (viewLogs?: boolean) => {\n if (viewLogs) setNoActiveTask(true);\n setOpen(true);\n };\n\n const openOutputDialog = () => {\n setOpenOutput(true);\n };\n\n const closeDialog = () => {\n setNoActiveTask(false);\n setOpen(false);\n };\n\n const {\n acsImageScanTaskRun,\n acsImageCheckTaskRun,\n acsDeploymentCheckTaskRun,\n ecTaskRun,\n } = getTaskrunsOutputGroup(pipelineRun?.metadata?.name, taskRuns);\n\n const finishedTaskruns = [\n ...(acsImageScanTaskRun ? [acsImageScanTaskRun] : []),\n ...(acsImageCheckTaskRun ? [acsImageCheckTaskRun] : []),\n ...(acsDeploymentCheckTaskRun ? [acsDeploymentCheckTaskRun] : []),\n ...(ecTaskRun ? [ecTaskRun] : []),\n ].filter((taskRun: TaskRunKind) =>\n [\n ComputedStatus.Succeeded,\n ComputedStatus.Failed,\n ComputedStatus.Skipped,\n ].includes(pipelineRunFilterReducer(taskRun)),\n );\n\n const results =\n pipelineRun?.status?.pipelineResults || pipelineRun?.status?.results || [];\n\n const disabled =\n results.length === 0 ? finishedTaskruns.length === 0 : results.length === 0;\n\n return (\n <>\n <PipelineRunLogDialog\n pipelineRun={pipelineRun}\n open={open}\n closeDialog={closeDialog}\n pods={pods}\n taskRuns={taskRuns}\n activeTask={noActiveTask ? undefined : activeTaskName}\n />\n\n <PipelineRunOutputDialog\n pipelineRun={pipelineRun}\n taskRuns={taskRuns}\n open={openOutput}\n closeDialog={() => {\n setOpenOutput(false);\n }}\n />\n <Flex gap={{ default: 'gapXs' }}>\n <FlexItem>\n <Tooltip\n content={\n hasKubernetesProxyAccess.allowed\n ? 'View logs'\n : 'Unauthorized to view logs'\n }\n >\n <IconButton\n size=\"small\"\n data-testid=\"view-logs-icon\"\n onClick={() => openDialog(true)}\n disabled={!hasKubernetesProxyAccess.allowed}\n style={{ pointerEvents: 'auto', padding: 0 }}\n >\n <ViewLogsIcon disabled={!hasKubernetesProxyAccess.allowed} />\n </IconButton>\n </Tooltip>\n </FlexItem>\n\n <FlexItem align={{ default: 'alignLeft' }}>\n <Tooltip\n content={\n !sbomTaskRun\n ? 'View SBOM is not applicable for this PipelineRun'\n : 'View SBOM'\n }\n >\n <IconButton\n data-testid=\"view-sbom-icon\"\n disabled={!sbomTaskRun || !isSbomTaskRun(sbomTaskRun)}\n size=\"small\"\n onClick={\n !hasExternalLink(sbomTaskRun) ? () => openDialog() : undefined\n }\n style={{ pointerEvents: 'auto', padding: 0 }}\n >\n <PipelineRunSBOMLink sbomTaskRun={sbomTaskRun} />\n </IconButton>\n </Tooltip>\n </FlexItem>\n <FlexItem align={{ default: 'alignLeft' }}>\n <Tooltip\n content={\n disabled\n ? 'View Output is not applicable for this PipelineRun'\n : 'View Output'\n }\n >\n <IconButton\n data-testid=\"view-output-icon\"\n disabled={disabled}\n size=\"small\"\n onClick={() => openOutputDialog()}\n style={{ pointerEvents: 'auto', padding: 0 }}\n >\n <OutputIcon disabled={disabled} />\n </IconButton>\n </Tooltip>\n </FlexItem>\n </Flex>\n </>\n );\n};\nexport default React.memo(PipelineRunRowActions);\n"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React__default from 'react';
|
|
2
2
|
import { ErrorBoundary } from '@backstage/core-components';
|
|
3
|
-
import { makeStyles,
|
|
3
|
+
import { makeStyles, Dialog, DialogTitle, Box, IconButton, DialogContent, createStyles } from '@material-ui/core';
|
|
4
4
|
import CloseIcon from '@mui/icons-material/Close';
|
|
5
5
|
import { tektonGroupColor } from '../../types/types.esm.js';
|
|
6
6
|
import ResourceBadge from '../PipelineRunList/ResourceBadge.esm.js';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React__default from 'react';
|
|
2
2
|
import { useApi } from '@backstage/core-plugin-api';
|
|
3
|
-
import { makeStyles,
|
|
3
|
+
import { makeStyles, Link, createStyles } from '@material-ui/core';
|
|
4
4
|
import DownloadIcon from '@mui/icons-material/FileDownloadOutlined';
|
|
5
5
|
import classNames from 'classnames';
|
|
6
6
|
import { downloadLogFile } from '@janus-idp/shared-react';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React__default from 'react';
|
|
2
2
|
import useInterval from 'react-use/lib/useInterval';
|
|
3
|
-
import { makeStyles,
|
|
3
|
+
import { makeStyles, StepButton, createStyles, CircularProgress } from '@material-ui/core';
|
|
4
4
|
import Step from '@material-ui/core/Step';
|
|
5
5
|
import StepLabel from '@material-ui/core/StepLabel';
|
|
6
6
|
import Stepper from '@material-ui/core/Stepper';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React__default from 'react';
|
|
2
2
|
import { ErrorBoundary } from '@backstage/core-components';
|
|
3
|
-
import { makeStyles,
|
|
3
|
+
import { makeStyles, Dialog, DialogTitle, Box, IconButton, DialogContent, createStyles } from '@material-ui/core';
|
|
4
4
|
import CloseIcon from '@mui/icons-material/Close';
|
|
5
5
|
import { tektonGroupColor } from '../../types/types.esm.js';
|
|
6
6
|
import PipelineRunOutput from '../PipelineRunList/PipelineRunOutput.esm.js';
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import React__default from 'react';
|
|
2
2
|
import { Alert, AlertTitle } from '@material-ui/lab';
|
|
3
|
+
import { kubernetesClustersReadPermission, kubernetesResourcesReadPermission } from '@backstage/plugin-kubernetes-common';
|
|
3
4
|
|
|
5
|
+
const permissions = [
|
|
6
|
+
kubernetesClustersReadPermission,
|
|
7
|
+
kubernetesResourcesReadPermission
|
|
8
|
+
].map((p) => p.name).join(", ");
|
|
4
9
|
const PermissionAlert = () => {
|
|
5
|
-
return /* @__PURE__ */ React__default.createElement(Alert, { severity: "warning", "data-testid": "no-permission-alert" }, /* @__PURE__ */ React__default.createElement(AlertTitle, null, "Permission required"), "To view Tekton Pipeline Runs, contact your administrator to give you the
|
|
10
|
+
return /* @__PURE__ */ React__default.createElement(Alert, { severity: "warning", "data-testid": "no-permission-alert" }, /* @__PURE__ */ React__default.createElement(AlertTitle, null, "Permission required"), "To view Tekton Pipeline Runs, contact your administrator to give you the following permission(s): ", permissions, ".");
|
|
6
11
|
};
|
|
7
12
|
|
|
8
13
|
export { PermissionAlert as default };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PermissionAlert.esm.js","sources":["../../../src/components/common/PermissionAlert.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport { Alert, AlertTitle } from '@material-ui/lab';\n\nconst PermissionAlert = () => {\n return (\n <Alert severity=\"warning\" data-testid=\"no-permission-alert\">\n <AlertTitle>Permission required</AlertTitle>\n To view Tekton Pipeline Runs, contact your administrator to give you the\n
|
|
1
|
+
{"version":3,"file":"PermissionAlert.esm.js","sources":["../../../src/components/common/PermissionAlert.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport { Alert, AlertTitle } from '@material-ui/lab';\nimport {\n kubernetesClustersReadPermission,\n kubernetesResourcesReadPermission,\n} from '@backstage/plugin-kubernetes-common';\n\nconst permissions = [\n kubernetesClustersReadPermission,\n kubernetesResourcesReadPermission,\n]\n .map(p => p.name)\n .join(', ');\n\nconst PermissionAlert = () => {\n return (\n <Alert severity=\"warning\" data-testid=\"no-permission-alert\">\n <AlertTitle>Permission required</AlertTitle>\n To view Tekton Pipeline Runs, contact your administrator to give you the\n following permission(s): {permissions}.\n </Alert>\n );\n};\nexport default PermissionAlert;\n"],"names":["React"],"mappings":";;;;AAuBA,MAAM,WAAc,GAAA;AAAA,EAClB,gCAAA;AAAA,EACA;AACF,CAAA,CACG,IAAI,CAAK,CAAA,KAAA,CAAA,CAAE,IAAI,CAAA,CACf,KAAK,IAAI,CAAA;AAEZ,MAAM,kBAAkB,MAAM;AAC5B,EAAA,uBACGA,cAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAM,QAAS,EAAA,SAAA,EAAU,aAAY,EAAA,qBAAA,EAAA,kBACnCA,cAAA,CAAA,aAAA,CAAA,UAAA,EAAA,IAAA,EAAW,qBAAmB,CAAA,EAAa,oGAElB,EAAA,WAAA,EAAY,GACxC,CAAA;AAEJ;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React__default from 'react';
|
|
2
|
-
import { Visualization, GRAPH_POSITION_CHANGE_EVENT, GRAPH_LAYOUT_END_EVENT, VisualizationProvider, TopologyView, VisualizationSurface, TopologyControlBar, createTopologyControlButtons,
|
|
3
|
-
import { DROP_SHADOW_SPACING,
|
|
2
|
+
import { Visualization, GRAPH_POSITION_CHANGE_EVENT, GRAPH_LAYOUT_END_EVENT, VisualizationProvider, TopologyView, VisualizationSurface, TopologyControlBar, createTopologyControlButtons, action, defaultControlButtonsOptions } from '@patternfly/react-topology';
|
|
3
|
+
import { DROP_SHADOW_SPACING, GRAPH_MIN_WIDTH, TOOLBAR_HEIGHT, NODE_HEIGHT } from '../../consts/pipeline-topology-const.esm.js';
|
|
4
4
|
import { getLayoutData } from '../../utils/pipeline-topology-utils.esm.js';
|
|
5
5
|
import pipelineComponentFactory, { layoutFactory } from './pipelineComponentFactory.esm.js';
|
|
6
6
|
|
|
@@ -48,7 +48,7 @@ const PipelineTaskNode = ({
|
|
|
48
48
|
const passedData = React__default.useMemo(() => {
|
|
49
49
|
const newData = { ...data };
|
|
50
50
|
Object.keys(newData).forEach((key) => {
|
|
51
|
-
if (newData[key] ===
|
|
51
|
+
if (newData[key] === void 0) {
|
|
52
52
|
delete newData[key];
|
|
53
53
|
}
|
|
54
54
|
});
|
|
@@ -81,7 +81,7 @@ const PipelineTaskNode = ({
|
|
|
81
81
|
{
|
|
82
82
|
className: "bs-tkn-pipeline-task-node",
|
|
83
83
|
element,
|
|
84
|
-
onContextMenu: data.showContextMenu ? onContextMenu :
|
|
84
|
+
onContextMenu: data.showContextMenu ? onContextMenu : void 0,
|
|
85
85
|
contextMenuOpen,
|
|
86
86
|
scaleNode: (hover || contextMenuOpen) && detailsLevel !== ScaleDetailsLevel.high,
|
|
87
87
|
hideDetailsAtMedium: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PipelineTaskNode.esm.js","sources":["../../../src/components/pipeline-topology/PipelineTaskNode.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport { Tooltip } from '@patternfly/react-core';\nimport {\n DEFAULT_LAYER,\n DEFAULT_WHEN_OFFSET,\n GraphElement,\n Layer,\n Node,\n RunStatus,\n ScaleDetailsLevel,\n TaskNode,\n TOP_LAYER,\n useDetailsLevel,\n useHover,\n WhenDecorator,\n WithContextMenuProps,\n WithSelectionProps,\n} from '@patternfly/react-topology';\n// eslint-disable-next-line @backstage/no-undeclared-imports\nimport { observer } from 'mobx-react';\n\nimport { PipelineTaskWithStatus, TaskRunKind } from '@janus-idp/shared-react';\n\nimport { NodeType } from '../../consts/pipeline-topology-const';\nimport {\n TEKTON_PIPELINE_RUN,\n TEKTON_PIPELINE_TASK,\n} from '../../consts/tekton-const';\nimport { TektonResourcesContext } from '../../hooks/TektonResourcesContext';\nimport { StepStatus } from '../../types/taskRun';\nimport { TektonResourcesContextData } from '../../types/types';\nimport { createStepStatus } from '../../utils/pipeline-step-utils';\nimport { getTaskStatus } from '../../utils/pipelineRun-utils';\nimport PipelineRunLogDialog from '../PipelineRunLogs/PipelineRunLogDialog';\nimport { PipelineVisualizationStepList } from './PipelineVisualizationStepList';\n\nimport './PipelineTaskNode.css';\n\ntype PipelineTaskNodeProps = {\n element: Node;\n} & WithContextMenuProps &\n WithSelectionProps &\n GraphElement;\n\nconst PipelineTaskNode = ({\n element,\n onContextMenu,\n contextMenuOpen,\n ...rest\n}: PipelineTaskNodeProps) => {\n const [open, setOpen] = React.useState<boolean>(false);\n const { watchResourcesData } = React.useContext<TektonResourcesContextData>(\n TektonResourcesContext,\n );\n const data = element.getData();\n const triggerRef = React.useRef<SVGGElement | null>(null);\n\n const pipelineRun = data.pipelineRun;\n const [hover, hoverRef] = useHover();\n const detailsLevel = useDetailsLevel();\n const isFinallyTask = element.getType() === NodeType.FINALLY_NODE;\n\n const pods = watchResourcesData?.pods?.data || [];\n const taskRuns = watchResourcesData?.taskruns?.data || [];\n const openDialog = () => {\n setOpen(true);\n };\n\n const closeDialog = () => {\n setOpen(false);\n };\n\n const computedTask: PipelineTaskWithStatus = data.task;\n const stepList =\n computedTask?.status?.steps || computedTask?.taskSpec?.steps || [];\n\n const taskStatus = getTaskStatus(data.pipelineRun, data.task);\n\n const stepStatusList: StepStatus[] = stepList.map((step: { name: string }) =>\n createStepStatus(step, taskStatus),\n );\n const succeededStepsCount = stepStatusList.filter(\n ({ status }) => status === RunStatus.Succeeded,\n ).length;\n\n const badge =\n stepStatusList.length > 0 && data.status\n ? `${succeededStepsCount}/${stepStatusList.length}`\n : null;\n\n const passedData = React.useMemo(() => {\n const newData = { ...data };\n Object.keys(newData).forEach(key => {\n if (newData[key] === undefined) {\n delete newData[key];\n }\n });\n return newData;\n }, [data]);\n\n const hasTaskIcon = !!(data.taskIconClass || data.taskIcon);\n const whenDecorator = data.whenStatus ? (\n <WhenDecorator\n element={element}\n status={data.whenStatus}\n leftOffset={\n hasTaskIcon\n ? DEFAULT_WHEN_OFFSET + (element.getBounds().height - 4) * 0.75\n : DEFAULT_WHEN_OFFSET\n }\n />\n ) : null;\n const activeTaskId = taskRuns.find(\n (tr: TaskRunKind) =>\n tr?.metadata?.labels?.[TEKTON_PIPELINE_RUN] ===\n pipelineRun?.metadata?.name &&\n tr?.metadata?.labels?.[TEKTON_PIPELINE_TASK] === data.task?.name,\n )?.metadata?.name;\n\n const taskNode = (\n <>\n <PipelineRunLogDialog\n pipelineRun={pipelineRun}\n open={open}\n closeDialog={closeDialog}\n pods={pods}\n taskRuns={taskRuns}\n activeTask={activeTaskId}\n />\n <TaskNode\n className=\"bs-tkn-pipeline-task-node\"\n element={element}\n onContextMenu={data.showContextMenu ? onContextMenu : undefined}\n contextMenuOpen={contextMenuOpen}\n scaleNode={\n (hover || contextMenuOpen) && detailsLevel !== ScaleDetailsLevel.high\n }\n hideDetailsAtMedium\n {...passedData}\n {...rest}\n badge={badge}\n truncateLength={element.getData()?.label?.length}\n onSelect={activeTaskId && openDialog}\n >\n {whenDecorator}\n </TaskNode>\n </>\n );\n\n return (\n <Layer\n id={\n detailsLevel !== ScaleDetailsLevel.high && (hover || contextMenuOpen)\n ? TOP_LAYER\n : DEFAULT_LAYER\n }\n >\n <g\n data-test={`task ${element.getLabel()}`}\n className=\"bs-tkn-pipeline-task-node\"\n ref={hoverRef as React.LegacyRef<SVGGElement>}\n >\n <Tooltip\n position=\"bottom\"\n enableFlip={false}\n content={\n <PipelineVisualizationStepList\n isSpecOverview={!data.status}\n taskName={element.getLabel()}\n steps={stepStatusList}\n isFinallyTask={isFinallyTask}\n />\n }\n triggerRef={triggerRef}\n >\n <g ref={triggerRef}>{taskNode}</g>\n </Tooltip>\n </g>\n </Layer>\n );\n};\n\nexport default React.memo(observer(PipelineTaskNode));\n"],"names":["React"],"mappings":";;;;;;;;;;;;;AA4DA,MAAM,mBAAmB,CAAC;AAAA,EACxB,OAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EACA,GAAG;AACL,CAA6B,KAAA;AAC3B,EAAA,MAAM,CAAC,IAAM,EAAA,OAAO,CAAI,GAAAA,cAAA,CAAM,SAAkB,KAAK,CAAA;AACrD,EAAM,MAAA,EAAE,kBAAmB,EAAA,GAAIA,cAAM,CAAA,UAAA;AAAA,IACnC;AAAA,GACF;AACA,EAAM,MAAA,IAAA,GAAO,QAAQ,OAAQ,EAAA;AAC7B,EAAM,MAAA,UAAA,GAAaA,cAAM,CAAA,MAAA,CAA2B,IAAI,CAAA;AAExD,EAAA,MAAM,cAAc,IAAK,CAAA,WAAA;AACzB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,QAAS,EAAA;AACnC,EAAA,MAAM,eAAe,eAAgB,EAAA;AACrC,EAAA,MAAM,aAAgB,GAAA,OAAA,CAAQ,OAAQ,EAAA,KAAM,QAAS,CAAA,YAAA;AAErD,EAAA,MAAM,IAAO,GAAA,kBAAA,EAAoB,IAAM,EAAA,IAAA,IAAQ,EAAC;AAChD,EAAA,MAAM,QAAW,GAAA,kBAAA,EAAoB,QAAU,EAAA,IAAA,IAAQ,EAAC;AACxD,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,GACd;AAEA,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,GACf;AAEA,EAAA,MAAM,eAAuC,IAAK,CAAA,IAAA;AAClD,EAAA,MAAM,WACJ,YAAc,EAAA,MAAA,EAAQ,SAAS,YAAc,EAAA,QAAA,EAAU,SAAS,EAAC;AAEnE,EAAA,MAAM,UAAa,GAAA,aAAA,CAAc,IAAK,CAAA,WAAA,EAAa,KAAK,IAAI,CAAA;AAE5D,EAAA,MAAM,iBAA+B,QAAS,CAAA,GAAA;AAAA,IAAI,CAAC,IAAA,KACjD,gBAAiB,CAAA,IAAA,EAAM,UAAU;AAAA,GACnC;AACA,EAAA,MAAM,sBAAsB,cAAe,CAAA,MAAA;AAAA,IACzC,CAAC,EAAE,MAAO,EAAA,KAAM,WAAW,SAAU,CAAA;AAAA,GACrC,CAAA,MAAA;AAEF,EAAM,MAAA,KAAA,GACJ,cAAe,CAAA,MAAA,GAAS,CAAK,IAAA,IAAA,CAAK,MAC9B,GAAA,CAAA,EAAG,mBAAmB,CAAA,CAAA,EAAI,cAAe,CAAA,MAAM,CAC/C,CAAA,GAAA,IAAA;AAEN,EAAM,MAAA,UAAA,GAAaA,cAAM,CAAA,OAAA,CAAQ,MAAM;AACrC,IAAM,MAAA,OAAA,GAAU,EAAE,GAAG,IAAK,EAAA;AAC1B,IAAA,MAAA,CAAO,IAAK,CAAA,OAAO,CAAE,CAAA,OAAA,CAAQ,CAAO,GAAA,KAAA;AAClC,MAAI,IAAA,OAAA,CAAQ,GAAG,CAAA,KAAM,
|
|
1
|
+
{"version":3,"file":"PipelineTaskNode.esm.js","sources":["../../../src/components/pipeline-topology/PipelineTaskNode.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport { Tooltip } from '@patternfly/react-core';\nimport {\n DEFAULT_LAYER,\n DEFAULT_WHEN_OFFSET,\n GraphElement,\n Layer,\n Node,\n RunStatus,\n ScaleDetailsLevel,\n TaskNode,\n TOP_LAYER,\n useDetailsLevel,\n useHover,\n WhenDecorator,\n WithContextMenuProps,\n WithSelectionProps,\n} from '@patternfly/react-topology';\n// eslint-disable-next-line @backstage/no-undeclared-imports\nimport { observer } from 'mobx-react';\n\nimport { PipelineTaskWithStatus, TaskRunKind } from '@janus-idp/shared-react';\n\nimport { NodeType } from '../../consts/pipeline-topology-const';\nimport {\n TEKTON_PIPELINE_RUN,\n TEKTON_PIPELINE_TASK,\n} from '../../consts/tekton-const';\nimport { TektonResourcesContext } from '../../hooks/TektonResourcesContext';\nimport { StepStatus } from '../../types/taskRun';\nimport { TektonResourcesContextData } from '../../types/types';\nimport { createStepStatus } from '../../utils/pipeline-step-utils';\nimport { getTaskStatus } from '../../utils/pipelineRun-utils';\nimport PipelineRunLogDialog from '../PipelineRunLogs/PipelineRunLogDialog';\nimport { PipelineVisualizationStepList } from './PipelineVisualizationStepList';\n\nimport './PipelineTaskNode.css';\n\ntype PipelineTaskNodeProps = {\n element: Node;\n} & WithContextMenuProps &\n WithSelectionProps &\n GraphElement;\n\nconst PipelineTaskNode = ({\n element,\n onContextMenu,\n contextMenuOpen,\n ...rest\n}: PipelineTaskNodeProps) => {\n const [open, setOpen] = React.useState<boolean>(false);\n const { watchResourcesData } = React.useContext<TektonResourcesContextData>(\n TektonResourcesContext,\n );\n const data = element.getData();\n const triggerRef = React.useRef<SVGGElement | null>(null);\n\n const pipelineRun = data.pipelineRun;\n const [hover, hoverRef] = useHover();\n const detailsLevel = useDetailsLevel();\n const isFinallyTask = element.getType() === NodeType.FINALLY_NODE;\n\n const pods = watchResourcesData?.pods?.data || [];\n const taskRuns = watchResourcesData?.taskruns?.data || [];\n const openDialog = () => {\n setOpen(true);\n };\n\n const closeDialog = () => {\n setOpen(false);\n };\n\n const computedTask: PipelineTaskWithStatus = data.task;\n const stepList =\n computedTask?.status?.steps || computedTask?.taskSpec?.steps || [];\n\n const taskStatus = getTaskStatus(data.pipelineRun, data.task);\n\n const stepStatusList: StepStatus[] = stepList.map((step: { name: string }) =>\n createStepStatus(step, taskStatus),\n );\n const succeededStepsCount = stepStatusList.filter(\n ({ status }) => status === RunStatus.Succeeded,\n ).length;\n\n const badge =\n stepStatusList.length > 0 && data.status\n ? `${succeededStepsCount}/${stepStatusList.length}`\n : null;\n\n const passedData = React.useMemo(() => {\n const newData = { ...data };\n Object.keys(newData).forEach(key => {\n if (newData[key] === undefined) {\n delete newData[key];\n }\n });\n return newData;\n }, [data]);\n\n const hasTaskIcon = !!(data.taskIconClass || data.taskIcon);\n const whenDecorator = data.whenStatus ? (\n <WhenDecorator\n element={element}\n status={data.whenStatus}\n leftOffset={\n hasTaskIcon\n ? DEFAULT_WHEN_OFFSET + (element.getBounds().height - 4) * 0.75\n : DEFAULT_WHEN_OFFSET\n }\n />\n ) : null;\n const activeTaskId = taskRuns.find(\n (tr: TaskRunKind) =>\n tr?.metadata?.labels?.[TEKTON_PIPELINE_RUN] ===\n pipelineRun?.metadata?.name &&\n tr?.metadata?.labels?.[TEKTON_PIPELINE_TASK] === data.task?.name,\n )?.metadata?.name;\n\n const taskNode = (\n <>\n <PipelineRunLogDialog\n pipelineRun={pipelineRun}\n open={open}\n closeDialog={closeDialog}\n pods={pods}\n taskRuns={taskRuns}\n activeTask={activeTaskId}\n />\n <TaskNode\n className=\"bs-tkn-pipeline-task-node\"\n element={element}\n onContextMenu={data.showContextMenu ? onContextMenu : undefined}\n contextMenuOpen={contextMenuOpen}\n scaleNode={\n (hover || contextMenuOpen) && detailsLevel !== ScaleDetailsLevel.high\n }\n hideDetailsAtMedium\n {...passedData}\n {...rest}\n badge={badge}\n truncateLength={element.getData()?.label?.length}\n onSelect={activeTaskId && openDialog}\n >\n {whenDecorator}\n </TaskNode>\n </>\n );\n\n return (\n <Layer\n id={\n detailsLevel !== ScaleDetailsLevel.high && (hover || contextMenuOpen)\n ? TOP_LAYER\n : DEFAULT_LAYER\n }\n >\n <g\n data-test={`task ${element.getLabel()}`}\n className=\"bs-tkn-pipeline-task-node\"\n ref={hoverRef as React.LegacyRef<SVGGElement>}\n >\n <Tooltip\n position=\"bottom\"\n enableFlip={false}\n content={\n <PipelineVisualizationStepList\n isSpecOverview={!data.status}\n taskName={element.getLabel()}\n steps={stepStatusList}\n isFinallyTask={isFinallyTask}\n />\n }\n triggerRef={triggerRef}\n >\n <g ref={triggerRef}>{taskNode}</g>\n </Tooltip>\n </g>\n </Layer>\n );\n};\n\nexport default React.memo(observer(PipelineTaskNode));\n"],"names":["React"],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@ const PipelineVisualization = ({
|
|
|
9
9
|
taskRuns
|
|
10
10
|
}) => {
|
|
11
11
|
useDarkTheme();
|
|
12
|
-
const model = getGraphDataModel(pipelineRun ??
|
|
12
|
+
const model = getGraphDataModel(pipelineRun ?? void 0, taskRuns ?? []);
|
|
13
13
|
return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, !model || model.nodes.length === 0 && model.edges.length === 0 ? /* @__PURE__ */ React__default.createElement("div", { "data-testid": "pipeline-no-tasks" }, "This Pipeline Run has no tasks to visualize") : /* @__PURE__ */ React__default.createElement(
|
|
14
14
|
"div",
|
|
15
15
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PipelineVisualization.esm.js","sources":["../../../src/components/pipeline-topology/PipelineVisualization.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport { PipelineRunKind, TaskRunKind } from '@janus-idp/shared-react';\n\nimport { useDarkTheme } from '../../hooks/useDarkTheme';\nimport { getGraphDataModel } from '../../utils/pipeline-topology-utils';\nimport { PipelineLayout } from './PipelineLayout';\n\nimport './PipelineVisualization.css';\n\ntype PipelineVisualizationProps = {\n pipelineRun: PipelineRunKind | null;\n taskRuns: TaskRunKind[];\n};\n\nexport const PipelineVisualization = ({\n pipelineRun,\n taskRuns,\n}: PipelineVisualizationProps) => {\n useDarkTheme();\n\n const model = getGraphDataModel(pipelineRun ?? undefined, taskRuns ?? []);\n\n return (\n <>\n {!model || (model.nodes.length === 0 && model.edges.length === 0) ? (\n <div data-testid=\"pipeline-no-tasks\">\n This Pipeline Run has no tasks to visualize\n </div>\n ) : (\n <div\n data-testid=\"pipelineRun-visualization\"\n className=\"bs-tkn-pipeline-visualization__layout\"\n >\n <PipelineLayout model={model} />\n </div>\n )}\n </>\n );\n};\n"],"names":["React"],"mappings":";;;;;;AA8BO,MAAM,wBAAwB,CAAC;AAAA,EACpC,WAAA;AAAA,EACA;AACF,CAAkC,KAAA;AAChC,EAAa,YAAA,EAAA;AAEb,EAAA,MAAM,QAAQ,iBAAkB,CAAA,WAAA,IAAe,
|
|
1
|
+
{"version":3,"file":"PipelineVisualization.esm.js","sources":["../../../src/components/pipeline-topology/PipelineVisualization.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport { PipelineRunKind, TaskRunKind } from '@janus-idp/shared-react';\n\nimport { useDarkTheme } from '../../hooks/useDarkTheme';\nimport { getGraphDataModel } from '../../utils/pipeline-topology-utils';\nimport { PipelineLayout } from './PipelineLayout';\n\nimport './PipelineVisualization.css';\n\ntype PipelineVisualizationProps = {\n pipelineRun: PipelineRunKind | null;\n taskRuns: TaskRunKind[];\n};\n\nexport const PipelineVisualization = ({\n pipelineRun,\n taskRuns,\n}: PipelineVisualizationProps) => {\n useDarkTheme();\n\n const model = getGraphDataModel(pipelineRun ?? undefined, taskRuns ?? []);\n\n return (\n <>\n {!model || (model.nodes.length === 0 && model.edges.length === 0) ? (\n <div data-testid=\"pipeline-no-tasks\">\n This Pipeline Run has no tasks to visualize\n </div>\n ) : (\n <div\n data-testid=\"pipelineRun-visualization\"\n className=\"bs-tkn-pipeline-visualization__layout\"\n >\n <PipelineLayout model={model} />\n </div>\n )}\n </>\n );\n};\n"],"names":["React"],"mappings":";;;;;;AA8BO,MAAM,wBAAwB,CAAC;AAAA,EACpC,WAAA;AAAA,EACA;AACF,CAAkC,KAAA;AAChC,EAAa,YAAA,EAAA;AAEb,EAAA,MAAM,QAAQ,iBAAkB,CAAA,WAAA,IAAe,MAAW,EAAA,QAAA,IAAY,EAAE,CAAA;AAExE,EAAA,mFAEK,CAAC,KAAA,IAAU,KAAM,CAAA,KAAA,CAAM,WAAW,CAAK,IAAA,KAAA,CAAM,KAAM,CAAA,MAAA,KAAW,oBAC5DA,cAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAI,aAAY,EAAA,mBAAA,EAAA,EAAoB,6CAErC,CAEA,mBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAY,EAAA,2BAAA;AAAA,MACZ,SAAU,EAAA;AAAA,KAAA;AAAA,oBAEVA,cAAA,CAAA,aAAA,CAAC,kBAAe,KAAc,EAAA;AAAA,GAGpC,CAAA;AAEJ;;;;"}
|
|
@@ -24,7 +24,7 @@ const layoutFactory = (type, graph) => {
|
|
|
24
24
|
case PipelineLayout.DAGRE_VIEWER:
|
|
25
25
|
return new PipelineDagreLayout(graph, { nodesep: 25 });
|
|
26
26
|
default:
|
|
27
|
-
return
|
|
27
|
+
return void 0;
|
|
28
28
|
}
|
|
29
29
|
};
|
|
30
30
|
const pipelineComponentFactory = (kind, type) => {
|
|
@@ -50,10 +50,10 @@ const pipelineComponentFactory = (kind, type) => {
|
|
|
50
50
|
case GROUPED_EDGE_TYPE:
|
|
51
51
|
return TaskGroupEdge;
|
|
52
52
|
default:
|
|
53
|
-
return
|
|
53
|
+
return void 0;
|
|
54
54
|
}
|
|
55
55
|
}
|
|
56
|
-
return
|
|
56
|
+
return void 0;
|
|
57
57
|
};
|
|
58
58
|
|
|
59
59
|
export { pipelineComponentFactory as default, layoutFactory };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipelineComponentFactory.esm.js","sources":["../../../src/components/pipeline-topology/pipelineComponentFactory.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport {\n ComponentFactory,\n DagreLayout,\n DefaultTaskGroup,\n Graph,\n GraphComponent,\n GraphElement,\n LayoutFactory,\n ModelKind,\n PipelineDagreLayout,\n SpacerNode,\n TaskEdge,\n withPanZoom,\n} from '@patternfly/react-topology';\n\nimport { NodeType, PipelineLayout } from '../../consts/pipeline-topology-const';\nimport { getLayoutData } from '../../utils/pipeline-topology-utils';\nimport PipelineTaskNode from './PipelineTaskNode';\nimport TaskGroupEdge from './TaskGroupEdge';\n\nconst GROUPED_EDGE_TYPE = 'GROUPED_EDGE';\n\nexport const layoutFactory: LayoutFactory = (type: string, graph: Graph) => {\n switch (type) {\n case PipelineLayout.DAGRE_BUILDER:\n case PipelineLayout.DAGRE_BUILDER_SPACED:\n return new DagreLayout(graph, {\n // Hack to get around undesirable defaults\n linkDistance: 0,\n nodeDistance: 0,\n groupDistance: 0,\n collideDistance: 0,\n simulationSpeed: 0,\n chargeStrength: 0,\n allowDrag: false,\n layoutOnDrag: false,\n ...getLayoutData(type),\n });\n case PipelineLayout.DAGRE_VIEWER:\n return new PipelineDagreLayout(graph, { nodesep: 25 });\n default:\n return undefined;\n }\n};\n\nconst pipelineComponentFactory: ComponentFactory = (\n kind: ModelKind,\n type: string,\n): React.ComponentType<{ element: GraphElement }> | undefined => {\n if (kind === ModelKind.graph) {\n return withPanZoom()(GraphComponent) as React.ComponentType<{\n element: GraphElement;\n }>;\n }\n if (kind === ModelKind.edge) {\n return TaskEdge as React.ComponentType<{ element: GraphElement }>;\n }\n if (kind === ModelKind.node) {\n switch (type) {\n case NodeType.TASK_NODE:\n case NodeType.FINALLY_NODE:\n return PipelineTaskNode as React.ComponentType<any>;\n case 'task-group':\n case NodeType.FINALLY_GROUP:\n return DefaultTaskGroup as React.ComponentType<{\n element: GraphElement;\n }>;\n case NodeType.SPACER_NODE:\n return SpacerNode as React.ComponentType<{ element: GraphElement }>;\n case 'finally-spacer-edge':\n case NodeType.EDGE:\n return TaskEdge as React.ComponentType<{ element: GraphElement }>;\n case GROUPED_EDGE_TYPE:\n return TaskGroupEdge as React.ComponentType<{ element: GraphElement }>;\n default:\n return undefined;\n }\n }\n return undefined;\n};\n\nexport default pipelineComponentFactory;\n"],"names":[],"mappings":";;;;;;AAqCA,MAAM,iBAAoB,GAAA,cAAA;AAEb,MAAA,aAAA,GAA+B,CAAC,IAAA,EAAc,KAAiB,KAAA;AAC1E,EAAA,QAAQ,IAAM;AAAA,IACZ,KAAK,cAAe,CAAA,aAAA;AAAA,IACpB,KAAK,cAAe,CAAA,oBAAA;AAClB,MAAO,OAAA,IAAI,YAAY,KAAO,EAAA;AAAA;AAAA,QAE5B,YAAc,EAAA,CAAA;AAAA,QACd,YAAc,EAAA,CAAA;AAAA,QACd,aAAe,EAAA,CAAA;AAAA,QACf,eAAiB,EAAA,CAAA;AAAA,QACjB,eAAiB,EAAA,CAAA;AAAA,QACjB,cAAgB,EAAA,CAAA;AAAA,QAChB,SAAW,EAAA,KAAA;AAAA,QACX,YAAc,EAAA,KAAA;AAAA,QACd,GAAG,cAAc,IAAI;AAAA,OACtB,CAAA;AAAA,IACH,KAAK,cAAe,CAAA,YAAA;AAClB,MAAA,OAAO,IAAI,mBAAoB,CAAA,KAAA,EAAO,EAAE,OAAA,EAAS,IAAI,CAAA;AAAA,IACvD;AACE,MAAO,OAAA,
|
|
1
|
+
{"version":3,"file":"pipelineComponentFactory.esm.js","sources":["../../../src/components/pipeline-topology/pipelineComponentFactory.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport {\n ComponentFactory,\n DagreLayout,\n DefaultTaskGroup,\n Graph,\n GraphComponent,\n GraphElement,\n LayoutFactory,\n ModelKind,\n PipelineDagreLayout,\n SpacerNode,\n TaskEdge,\n withPanZoom,\n} from '@patternfly/react-topology';\n\nimport { NodeType, PipelineLayout } from '../../consts/pipeline-topology-const';\nimport { getLayoutData } from '../../utils/pipeline-topology-utils';\nimport PipelineTaskNode from './PipelineTaskNode';\nimport TaskGroupEdge from './TaskGroupEdge';\n\nconst GROUPED_EDGE_TYPE = 'GROUPED_EDGE';\n\nexport const layoutFactory: LayoutFactory = (type: string, graph: Graph) => {\n switch (type) {\n case PipelineLayout.DAGRE_BUILDER:\n case PipelineLayout.DAGRE_BUILDER_SPACED:\n return new DagreLayout(graph, {\n // Hack to get around undesirable defaults\n linkDistance: 0,\n nodeDistance: 0,\n groupDistance: 0,\n collideDistance: 0,\n simulationSpeed: 0,\n chargeStrength: 0,\n allowDrag: false,\n layoutOnDrag: false,\n ...getLayoutData(type),\n });\n case PipelineLayout.DAGRE_VIEWER:\n return new PipelineDagreLayout(graph, { nodesep: 25 });\n default:\n return undefined;\n }\n};\n\nconst pipelineComponentFactory: ComponentFactory = (\n kind: ModelKind,\n type: string,\n): React.ComponentType<{ element: GraphElement }> | undefined => {\n if (kind === ModelKind.graph) {\n return withPanZoom()(GraphComponent) as React.ComponentType<{\n element: GraphElement;\n }>;\n }\n if (kind === ModelKind.edge) {\n return TaskEdge as React.ComponentType<{ element: GraphElement }>;\n }\n if (kind === ModelKind.node) {\n switch (type) {\n case NodeType.TASK_NODE:\n case NodeType.FINALLY_NODE:\n return PipelineTaskNode as React.ComponentType<any>;\n case 'task-group':\n case NodeType.FINALLY_GROUP:\n return DefaultTaskGroup as React.ComponentType<{\n element: GraphElement;\n }>;\n case NodeType.SPACER_NODE:\n return SpacerNode as React.ComponentType<{ element: GraphElement }>;\n case 'finally-spacer-edge':\n case NodeType.EDGE:\n return TaskEdge as React.ComponentType<{ element: GraphElement }>;\n case GROUPED_EDGE_TYPE:\n return TaskGroupEdge as React.ComponentType<{ element: GraphElement }>;\n default:\n return undefined;\n }\n }\n return undefined;\n};\n\nexport default pipelineComponentFactory;\n"],"names":[],"mappings":";;;;;;AAqCA,MAAM,iBAAoB,GAAA,cAAA;AAEb,MAAA,aAAA,GAA+B,CAAC,IAAA,EAAc,KAAiB,KAAA;AAC1E,EAAA,QAAQ,IAAM;AAAA,IACZ,KAAK,cAAe,CAAA,aAAA;AAAA,IACpB,KAAK,cAAe,CAAA,oBAAA;AAClB,MAAO,OAAA,IAAI,YAAY,KAAO,EAAA;AAAA;AAAA,QAE5B,YAAc,EAAA,CAAA;AAAA,QACd,YAAc,EAAA,CAAA;AAAA,QACd,aAAe,EAAA,CAAA;AAAA,QACf,eAAiB,EAAA,CAAA;AAAA,QACjB,eAAiB,EAAA,CAAA;AAAA,QACjB,cAAgB,EAAA,CAAA;AAAA,QAChB,SAAW,EAAA,KAAA;AAAA,QACX,YAAc,EAAA,KAAA;AAAA,QACd,GAAG,cAAc,IAAI;AAAA,OACtB,CAAA;AAAA,IACH,KAAK,cAAe,CAAA,YAAA;AAClB,MAAA,OAAO,IAAI,mBAAoB,CAAA,KAAA,EAAO,EAAE,OAAA,EAAS,IAAI,CAAA;AAAA,IACvD;AACE,MAAO,OAAA,MAAA;AAAA;AAEb;AAEM,MAAA,wBAAA,GAA6C,CACjD,IAAA,EACA,IAC+D,KAAA;AAC/D,EAAI,IAAA,IAAA,KAAS,UAAU,KAAO,EAAA;AAC5B,IAAO,OAAA,WAAA,GAAc,cAAc,CAAA;AAAA;AAIrC,EAAI,IAAA,IAAA,KAAS,UAAU,IAAM,EAAA;AAC3B,IAAO,OAAA,QAAA;AAAA;AAET,EAAI,IAAA,IAAA,KAAS,UAAU,IAAM,EAAA;AAC3B,IAAA,QAAQ,IAAM;AAAA,MACZ,KAAK,QAAS,CAAA,SAAA;AAAA,MACd,KAAK,QAAS,CAAA,YAAA;AACZ,QAAO,OAAA,gBAAA;AAAA,MACT,KAAK,YAAA;AAAA,MACL,KAAK,QAAS,CAAA,aAAA;AACZ,QAAO,OAAA,gBAAA;AAAA,MAGT,KAAK,QAAS,CAAA,WAAA;AACZ,QAAO,OAAA,UAAA;AAAA,MACT,KAAK,qBAAA;AAAA,MACL,KAAK,QAAS,CAAA,IAAA;AACZ,QAAO,OAAA,QAAA;AAAA,MACT,KAAK,iBAAA;AACH,QAAO,OAAA,aAAA;AAAA,MACT;AACE,QAAO,OAAA,MAAA;AAAA;AACX;AAEF,EAAO,OAAA,MAAA;AACT;;;;"}
|
|
@@ -9,7 +9,7 @@ const useResourcesClusters = (k8sObjectsResponse) => {
|
|
|
9
9
|
let isMounted = true;
|
|
10
10
|
if (isMounted && !loading && kubernetesObjects && !error) {
|
|
11
11
|
const k8sResourcesClusters = getClusters(kubernetesObjects);
|
|
12
|
-
{
|
|
12
|
+
if (k8sResourcesClusters) {
|
|
13
13
|
setClusters(k8sResourcesClusters);
|
|
14
14
|
}
|
|
15
15
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useResourcesClusters.esm.js","sources":["../../src/hooks/useResourcesClusters.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useEffect, useState } from 'react';\n\nimport { KubernetesObjects } from '@backstage/plugin-kubernetes-react';\n\nimport { useDeepCompareMemoize } from '@janus-idp/shared-react';\n\nimport { ClusterErrors } from '../types/types';\nimport { getClusters } from '../utils/tekton-utils';\n\nexport const useResourcesClusters = (k8sObjectsResponse: KubernetesObjects) => {\n const { kubernetesObjects, loading, error } = k8sObjectsResponse;\n const [clusters, setClusters] = useState<{\n clusters: string[];\n errors: ClusterErrors[];\n }>({ clusters: [], errors: [] });\n\n useEffect(() => {\n let isMounted = true;\n if (isMounted && !loading && kubernetesObjects && !error) {\n const k8sResourcesClusters = getClusters(kubernetesObjects);\n if (k8sResourcesClusters) {\n setClusters(k8sResourcesClusters);\n }\n }\n return () => {\n isMounted = false;\n };\n }, [loading, kubernetesObjects, error]);\n\n return useDeepCompareMemoize(clusters);\n};\n"],"names":[],"mappings":";;;;AAwBa,MAAA,oBAAA,GAAuB,CAAC,kBAA0C,KAAA;AAC7E,EAAA,MAAM,EAAE,iBAAA,EAAmB,OAAS,EAAA,KAAA,EAAU,GAAA,kBAAA;AAC9C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,QAG7B,CAAA,EAAE,QAAU,EAAA,EAAI,EAAA,MAAA,EAAQ,EAAC,EAAG,CAAA;AAE/B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAY,GAAA,IAAA;AAChB,IAAA,IAAI,SAAa,IAAA,CAAC,OAAW,IAAA,iBAAA,IAAqB,CAAC,KAAO,EAAA;AACxD,MAAM,MAAA,oBAAA,GAAuB,YAAY,iBAAiB,CAAA;AAC1D,
|
|
1
|
+
{"version":3,"file":"useResourcesClusters.esm.js","sources":["../../src/hooks/useResourcesClusters.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useEffect, useState } from 'react';\n\nimport { KubernetesObjects } from '@backstage/plugin-kubernetes-react';\n\nimport { useDeepCompareMemoize } from '@janus-idp/shared-react';\n\nimport { ClusterErrors } from '../types/types';\nimport { getClusters } from '../utils/tekton-utils';\n\nexport const useResourcesClusters = (k8sObjectsResponse: KubernetesObjects) => {\n const { kubernetesObjects, loading, error } = k8sObjectsResponse;\n const [clusters, setClusters] = useState<{\n clusters: string[];\n errors: ClusterErrors[];\n }>({ clusters: [], errors: [] });\n\n useEffect(() => {\n let isMounted = true;\n if (isMounted && !loading && kubernetesObjects && !error) {\n const k8sResourcesClusters = getClusters(kubernetesObjects);\n if (k8sResourcesClusters) {\n setClusters(k8sResourcesClusters);\n }\n }\n return () => {\n isMounted = false;\n };\n }, [loading, kubernetesObjects, error]);\n\n return useDeepCompareMemoize(clusters);\n};\n"],"names":[],"mappings":";;;;AAwBa,MAAA,oBAAA,GAAuB,CAAC,kBAA0C,KAAA;AAC7E,EAAA,MAAM,EAAE,iBAAA,EAAmB,OAAS,EAAA,KAAA,EAAU,GAAA,kBAAA;AAC9C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,QAG7B,CAAA,EAAE,QAAU,EAAA,EAAI,EAAA,MAAA,EAAQ,EAAC,EAAG,CAAA;AAE/B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAY,GAAA,IAAA;AAChB,IAAA,IAAI,SAAa,IAAA,CAAC,OAAW,IAAA,iBAAA,IAAqB,CAAC,KAAO,EAAA;AACxD,MAAM,MAAA,oBAAA,GAAuB,YAAY,iBAAiB,CAAA;AAC1D,MAAA,IAAI,oBAAsB,EAAA;AACxB,QAAA,WAAA,CAAY,oBAAoB,CAAA;AAAA;AAClC;AAEF,IAAA,OAAO,MAAM;AACX,MAAY,SAAA,GAAA,KAAA;AAAA,KACd;AAAA,GACC,EAAA,CAAC,OAAS,EAAA,iBAAA,EAAmB,KAAK,CAAC,CAAA;AAEtC,EAAA,OAAO,sBAAsB,QAAQ,CAAA;AACvC;;;;"}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { usePermission } from '@backstage/plugin-permission-react';
|
|
2
|
-
import {
|
|
2
|
+
import { kubernetesClustersReadPermission, kubernetesResourcesReadPermission } from '@backstage/plugin-kubernetes-common';
|
|
3
3
|
|
|
4
4
|
const useTektonViewPermission = () => {
|
|
5
|
-
const
|
|
6
|
-
permission:
|
|
5
|
+
const clusterReadPermission = usePermission({
|
|
6
|
+
permission: kubernetesClustersReadPermission
|
|
7
7
|
});
|
|
8
|
-
|
|
8
|
+
const clusterResourcesReadPermission = usePermission({
|
|
9
|
+
permission: kubernetesResourcesReadPermission
|
|
10
|
+
});
|
|
11
|
+
return clusterReadPermission.allowed && clusterResourcesReadPermission.allowed;
|
|
9
12
|
};
|
|
10
13
|
|
|
11
14
|
export { useTektonViewPermission };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTektonViewPermission.esm.js","sources":["../../src/hooks/useTektonViewPermission.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { usePermission } from '@backstage/plugin-permission-react';\n\nimport {
|
|
1
|
+
{"version":3,"file":"useTektonViewPermission.esm.js","sources":["../../src/hooks/useTektonViewPermission.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { usePermission } from '@backstage/plugin-permission-react';\n\nimport {\n kubernetesClustersReadPermission,\n kubernetesResourcesReadPermission,\n} from '@backstage/plugin-kubernetes-common';\n\nexport const useTektonViewPermission = () => {\n const clusterReadPermission = usePermission({\n permission: kubernetesClustersReadPermission,\n });\n\n const clusterResourcesReadPermission = usePermission({\n permission: kubernetesResourcesReadPermission,\n });\n\n return (\n clusterReadPermission.allowed && clusterResourcesReadPermission.allowed\n );\n};\n"],"names":[],"mappings":";;;AAsBO,MAAM,0BAA0B,MAAM;AAC3C,EAAA,MAAM,wBAAwB,aAAc,CAAA;AAAA,IAC1C,UAAY,EAAA;AAAA,GACb,CAAA;AAED,EAAA,MAAM,iCAAiC,aAAc,CAAA;AAAA,IACnD,UAAY,EAAA;AAAA,GACb,CAAA;AAED,EACE,OAAA,qBAAA,CAAsB,WAAW,8BAA+B,CAAA,OAAA;AAEpE;;;;"}
|
package/dist/models.esm.js
CHANGED
|
@@ -1,13 +1,9 @@
|
|
|
1
1
|
import './types/types.esm.js';
|
|
2
2
|
|
|
3
3
|
const PipelineRunGVK = {
|
|
4
|
-
apiVersion: "v1",
|
|
5
|
-
apiGroup: "tekton.dev",
|
|
6
4
|
kind: "PipelineRun"
|
|
7
5
|
};
|
|
8
6
|
const TaskRunGVK = {
|
|
9
|
-
apiVersion: "v1",
|
|
10
|
-
apiGroup: "tekton.dev",
|
|
11
7
|
kind: "TaskRun"
|
|
12
8
|
};
|
|
13
9
|
var ModelsPlural = /* @__PURE__ */ ((ModelsPlural2) => {
|
package/dist/models.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.esm.js","sources":["../src/models.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { GroupVersionKind, tektonGroupColor } from './types/types';\n\nexport const PipelineRunGVK: GroupVersionKind = {\n apiVersion: 'v1',\n apiGroup: 'tekton.dev',\n kind: 'PipelineRun',\n};\n\nexport const PipelineRunModel = {\n ...PipelineRunGVK,\n abbr: 'PLR',\n color: tektonGroupColor,\n};\n\nexport const TaskRunGVK: GroupVersionKind = {\n apiVersion: 'v1',\n apiGroup: 'tekton.dev',\n kind: 'TaskRun',\n};\n\nexport enum ModelsPlural {\n pipelineruns = 'pipelineruns',\n taskruns = 'taskruns',\n pods = 'pods',\n}\n\nexport const tektonResourceModels: { [key: string]: GroupVersionKind } = {\n [ModelsPlural.pipelineruns]: PipelineRunGVK,\n [ModelsPlural.taskruns]: TaskRunGVK,\n};\n"],"names":["ModelsPlural"],"mappings":";;AAiBO,MAAM,cAAmC,GAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"models.esm.js","sources":["../src/models.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { GroupVersionKind, tektonGroupColor } from './types/types';\n\nexport const PipelineRunGVK: GroupVersionKind = {\n apiVersion: 'v1',\n apiGroup: 'tekton.dev',\n kind: 'PipelineRun',\n};\n\nexport const PipelineRunModel = {\n ...PipelineRunGVK,\n abbr: 'PLR',\n color: tektonGroupColor,\n};\n\nexport const TaskRunGVK: GroupVersionKind = {\n apiVersion: 'v1',\n apiGroup: 'tekton.dev',\n kind: 'TaskRun',\n};\n\nexport enum ModelsPlural {\n pipelineruns = 'pipelineruns',\n taskruns = 'taskruns',\n pods = 'pods',\n}\n\nexport const tektonResourceModels: { [key: string]: GroupVersionKind } = {\n [ModelsPlural.pipelineruns]: PipelineRunGVK,\n [ModelsPlural.taskruns]: TaskRunGVK,\n};\n"],"names":["ModelsPlural"],"mappings":";;AAiBO,MAAM,cAAmC,GAAA;AAAA,EAG9C,IAAM,EAAA;AACR;AAQO,MAAM,UAA+B,GAAA;AAAA,EAG1C,IAAM,EAAA;AACR;AAEY,IAAA,YAAA,qBAAAA,aAAL,KAAA;AACL,EAAAA,cAAA,cAAe,CAAA,GAAA,cAAA;AACf,EAAAA,cAAA,UAAW,CAAA,GAAA,UAAA;AACX,EAAAA,cAAA,MAAO,CAAA,GAAA,MAAA;AAHG,EAAAA,OAAAA,aAAAA;AAAA,CAAA,EAAA,YAAA,IAAA,EAAA;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"style-inject.es.esm.js","sources":["../../../../../../node_modules/style-inject/dist/style-inject.es.js"],"sourcesContent":["function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n"],"names":[],"mappings":"AAAA,SAAS,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE;AAC/B,EAAE,KAAK,GAAG,KAAK,
|
|
1
|
+
{"version":3,"file":"style-inject.es.esm.js","sources":["../../../../../../node_modules/style-inject/dist/style-inject.es.js"],"sourcesContent":["function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n"],"names":[],"mappings":"AAAA,SAAS,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE;AAC/B,EAAE,KAAK,GAAG,KAAK,MAAM,GAAG,GAAG,GAAG,EAAE;AAChC,EAAE,IAAI,QAAQ,GAAG,GAAG,CAAC,QAAQ;;AAE7B,EAAE,IAAI,CAAC,GAAG,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,EAAE,OAAO;;AAExD,EAAE,IAAI,IAAI,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACtE,EAAE,IAAI,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AAC7C,EAAE,KAAK,CAAC,IAAI,GAAG,UAAU;;AAEzB,EAAE,IAAI,QAAQ,KAAK,KAAK,EAAE;AAC1B,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE;AACzB,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC;AAC/C,KAAK,MAAM;AACX,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC7B;AACA,GAAG,MAAM;AACT,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC3B;;AAEA,EAAE,IAAI,KAAK,CAAC,UAAU,EAAE;AACxB,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,GAAG,GAAG;AAClC,GAAG,MAAM;AACT,IAAI,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;AACnD;AACA;;;;","x_google_ignoreList":[0]}
|
package/dist/plugin.esm.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createPlugin, createApiFactory,
|
|
1
|
+
import { createPlugin, createApiFactory, oneloginAuthApiRef, oktaAuthApiRef, microsoftAuthApiRef, googleAuthApiRef, gitlabAuthApiRef, fetchApiRef, discoveryApiRef, createComponentExtension } from '@backstage/core-plugin-api';
|
|
2
2
|
import { KubernetesAuthProviders, KubernetesBackendClient, KubernetesProxyClient } from '@backstage/plugin-kubernetes-react';
|
|
3
3
|
import { kubernetesAuthProvidersApiRef, kubernetesApiRef, kubernetesProxyApiRef } from './types/types.esm.js';
|
|
4
4
|
|
|
@@ -2,7 +2,7 @@ import { RunStatus, getSpacerNodes, getEdgesFromNodes, ModelKind, WhenStatus } f
|
|
|
2
2
|
import { uniq, minBy } from 'lodash';
|
|
3
3
|
import { ComputedStatus } from '@janus-idp/shared-react';
|
|
4
4
|
import { DAG } from '../components/pipeline-topology/dag.esm.js';
|
|
5
|
-
import {
|
|
5
|
+
import { DEFAULT_BADGE_WIDTH, NODE_WIDTH, NODE_HEIGHT, NODE_PADDING, DEFAULT_NODE_ICON_WIDTH, NodeType, DEFAULT_FINALLLY_GROUP_PADDING, PipelineLayout, DEFAULT_NODE_HEIGHT, DAGRE_BUILDER_SPACED_PROPS, DAGRE_VIEWER_SPACED_PROPS, DAGRE_VIEWER_PROPS, DAGRE_BUILDER_PROPS, REGEX_EXTRACT_DEPS } from '../consts/pipeline-topology-const.esm.js';
|
|
6
6
|
import { getPLRTaskRuns, appendPipelineRunStatus } from './pipelineRun-utils.esm.js';
|
|
7
7
|
|
|
8
8
|
const createGenericNode = (type, width, height) => (name, data) => ({
|
|
@@ -68,12 +68,12 @@ const getWhenStatus = (status) => {
|
|
|
68
68
|
case ComputedStatus.Idle:
|
|
69
69
|
return WhenStatus.Unmet;
|
|
70
70
|
default:
|
|
71
|
-
return
|
|
71
|
+
return void 0;
|
|
72
72
|
}
|
|
73
73
|
};
|
|
74
74
|
const getTaskWhenStatus = (task) => {
|
|
75
75
|
if (!task.when) {
|
|
76
|
-
return
|
|
76
|
+
return void 0;
|
|
77
77
|
}
|
|
78
78
|
return getWhenStatus(task.status?.reason);
|
|
79
79
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline-topology-utils.esm.js","sources":["../../src/utils/pipeline-topology-utils.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n EdgeModel,\n getEdgesFromNodes,\n getSpacerNodes,\n GraphModel,\n ModelKind,\n RunStatus,\n WhenStatus,\n} from '@patternfly/react-topology';\nimport * as dagre from 'dagre';\nimport { minBy, uniq } from 'lodash';\n\nimport {\n ComputedStatus,\n PipelineRunKind,\n PipelineTask,\n PipelineTaskParam,\n PipelineTaskWithStatus,\n TaskRunKind,\n} from '@janus-idp/shared-react';\n\nimport { DAG, Vertex } from '../components/pipeline-topology/dag';\nimport {\n DAGRE_BUILDER_PROPS,\n DAGRE_BUILDER_SPACED_PROPS,\n DAGRE_VIEWER_PROPS,\n DAGRE_VIEWER_SPACED_PROPS,\n DEFAULT_BADGE_WIDTH,\n DEFAULT_FINALLLY_GROUP_PADDING,\n DEFAULT_NODE_HEIGHT,\n DEFAULT_NODE_ICON_WIDTH,\n FINALLY_NODE_PADDING,\n NODE_HEIGHT,\n NODE_PADDING,\n NODE_WIDTH,\n NodeType,\n PipelineLayout,\n REGEX_EXTRACT_DEPS,\n WHEN_EXPRESSION_SPACING,\n} from '../consts/pipeline-topology-const';\nimport {\n FinallyNodeModel,\n LoadingNodeModel,\n NodeCreator,\n NodeCreatorSetup,\n PipelineEdgeModel,\n PipelineMixedNodeModel,\n PipelineRunAfterNodeModelData,\n} from '../types/pipeline-topology-types';\nimport { appendPipelineRunStatus, getPLRTaskRuns } from './pipelineRun-utils';\n\nconst createGenericNode: NodeCreatorSetup =\n (type, width?, height?) => (name, data) => ({\n id: name,\n label: data?.label || name,\n runAfterTasks: data?.runAfterTasks || [],\n ...(data && { data }),\n height: height ?? NODE_HEIGHT,\n width: width ?? NODE_WIDTH,\n type,\n });\n\nconst getMaxFinallyNode = (finallyTaskList: PipelineTaskWithStatus[]) => {\n const sortedFinallyTaskList = [...finallyTaskList].sort(\n (a, b) => b.name.length - a.name.length,\n );\n return sortedFinallyTaskList[0]?.name || '';\n};\n\nexport const createFinallyNode = (\n height: number,\n): NodeCreator<FinallyNodeModel> =>\n createGenericNode(\n NodeType.FINALLY_NODE,\n NODE_WIDTH + WHEN_EXPRESSION_SPACING + FINALLY_NODE_PADDING * 2,\n height,\n );\n\nexport const createLoadingNode: NodeCreator<LoadingNodeModel> =\n createGenericNode(NodeType.LOADING_NODE);\n\nconst createPipelineTaskNode = (\n type: NodeType,\n data: PipelineRunAfterNodeModelData,\n) => createGenericNode(type, data.width, data.height)(data.id ?? '', data);\n\nexport const getTextWidth = (\n text: string,\n font: string = '0.8rem RedHatText',\n): number => {\n if (!text || text.length === 0) {\n return 0;\n }\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n if (!context) {\n return text.length;\n }\n context.font = font;\n const { width } = context.measureText(text);\n return width;\n};\n\nexport const extractDepsFromContextVariables = (\n contextVariable: string | null | undefined,\n) => {\n let matches;\n const deps: string[] = [];\n if (!contextVariable) {\n return deps;\n }\n // eslint-disable-next-line no-cond-assign\n while ((matches = REGEX_EXTRACT_DEPS.exec(contextVariable)) !== null) {\n // This is necessary to avoid infinite loops with zero-width matches\n if (matches.index === REGEX_EXTRACT_DEPS.lastIndex) {\n REGEX_EXTRACT_DEPS.lastIndex++;\n }\n if (matches) {\n if (!deps.includes(matches[1])) {\n deps.push(matches[1]);\n }\n }\n }\n return deps;\n};\n\nexport const getSpacerNode = (\n node: PipelineMixedNodeModel,\n): PipelineMixedNodeModel => ({\n ...node,\n height: 1,\n width: 1,\n});\n\nexport const getWhenStatus = (\n status: ComputedStatus,\n): WhenStatus | undefined => {\n switch (status) {\n case ComputedStatus.Succeeded:\n case ComputedStatus.Failed:\n return WhenStatus.Met;\n case ComputedStatus.Skipped:\n case ComputedStatus['In Progress']:\n case ComputedStatus.Idle:\n return WhenStatus.Unmet;\n default:\n return undefined;\n }\n};\n\nexport const getTaskWhenStatus = (\n task: PipelineTaskWithStatus,\n): WhenStatus | undefined => {\n if (!task.when) {\n return undefined;\n }\n return getWhenStatus(task.status?.reason as ComputedStatus);\n};\n\nconst getDepsFromContextVariables = (task: PipelineTask) => {\n const depsFromContextVariables: string[] = [];\n if (task.params) {\n task.params.forEach((p: PipelineTaskParam) => {\n if (Array.isArray(p.value)) {\n p.value.forEach(paramValue => {\n depsFromContextVariables.push(\n ...extractDepsFromContextVariables(paramValue),\n );\n });\n } else {\n depsFromContextVariables.push(\n ...extractDepsFromContextVariables(p.value),\n );\n }\n });\n }\n if (task?.when) {\n task.when.forEach(({ input, values }) => {\n depsFromContextVariables.push(...extractDepsFromContextVariables(input));\n values.forEach((whenValue: string) => {\n depsFromContextVariables.push(\n ...extractDepsFromContextVariables(whenValue),\n );\n });\n });\n }\n return depsFromContextVariables;\n};\n\nconst getRunAfterTasks = (task: PipelineTask, dag: DAG, vertex: Vertex) => {\n const runAfterTasks: string[] = [];\n const depsFromContextVariables = getDepsFromContextVariables(task);\n\n const dependancies = uniq([...vertex.dependancyNames]);\n if (dependancies) {\n dependancies.forEach(dep => {\n const depObj = dag.vertices.get(dep) as Vertex;\n if (\n depObj.level - vertex.level <= 1 ||\n vertex.data.runAfter?.includes(depObj.name)\n ) {\n runAfterTasks.push(dep);\n }\n });\n }\n if (depsFromContextVariables.length > 0) {\n const v = depsFromContextVariables.map(d => {\n return dag.vertices.get(d) as Vertex;\n });\n const minLevelDep = minBy(v, (d: Vertex) => d.level) as Vertex;\n const nearestDeps = v.filter(v1 => v1.level === minLevelDep.level);\n nearestDeps.forEach(nd => {\n if (nd.level - vertex.level <= 1 || vertex.dependancyNames.length === 0) {\n runAfterTasks.push(nd.name);\n }\n });\n }\n return runAfterTasks;\n};\n\nexport const getGraphDataModel = (\n pipelineRun: PipelineRunKind | undefined,\n taskRuns: TaskRunKind[],\n): {\n graph: GraphModel;\n nodes: PipelineMixedNodeModel[];\n edges: EdgeModel[];\n} | null => {\n if (!pipelineRun) {\n return null;\n }\n\n const plrTaskRuns = getPLRTaskRuns(taskRuns, pipelineRun?.metadata?.name);\n\n const taskList = appendPipelineRunStatus(pipelineRun, plrTaskRuns);\n\n const dag = new DAG();\n taskList?.forEach((task: PipelineTask) => {\n dag.addEdges(task.name, task, '', task.runAfter || []);\n });\n\n const nodes: PipelineMixedNodeModel[] = [];\n const maxWidthForLevel: { [key: string]: number } = {};\n dag.topologicalSort((v: Vertex) => {\n if (!maxWidthForLevel[v.level]) {\n maxWidthForLevel[v.level] = getTextWidth(v.name);\n } else {\n maxWidthForLevel[v.level] = Math.max(\n maxWidthForLevel[v.level],\n getTextWidth(v.name),\n );\n }\n });\n dag.topologicalSort((vertex: Vertex) => {\n const task = vertex.data as PipelineTask;\n const runAfterTasks = getRunAfterTasks(task, dag, vertex);\n const badgePadding =\n Object.keys(pipelineRun.spec)?.length > 0 ? DEFAULT_BADGE_WIDTH : 0;\n const isTaskSkipped = pipelineRun?.status?.skippedTasks?.some(\n t => t.name === task.name,\n );\n nodes.push(\n createPipelineTaskNode(NodeType.TASK_NODE, {\n id: vertex.name,\n label: vertex.name,\n width:\n maxWidthForLevel[vertex.level] +\n NODE_PADDING * 2 +\n DEFAULT_NODE_ICON_WIDTH +\n badgePadding,\n runAfterTasks,\n status: isTaskSkipped ? RunStatus.Skipped : vertex.data.status?.reason,\n whenStatus: getTaskWhenStatus(vertex.data),\n task: vertex.data,\n pipelineRun,\n }),\n );\n });\n\n const finallyTaskList = appendPipelineRunStatus(\n pipelineRun,\n plrTaskRuns,\n true,\n );\n\n const finallyNodes = finallyTaskList.map(fTask => {\n const isTaskSkipped = pipelineRun?.status?.skippedTasks?.some(\n t => t.name === fTask.name,\n );\n\n return createPipelineTaskNode(NodeType.FINALLY_NODE, {\n id: fTask.name,\n label: fTask.name,\n width:\n getTextWidth(getMaxFinallyNode(finallyTaskList)) +\n NODE_PADDING * 2 +\n DEFAULT_FINALLLY_GROUP_PADDING * 2,\n height: DEFAULT_NODE_HEIGHT,\n runAfterTasks: [],\n status: isTaskSkipped\n ? RunStatus.Skipped\n : (fTask.status?.reason as RunStatus),\n whenStatus: getTaskWhenStatus(fTask),\n task: fTask,\n pipelineRun,\n });\n });\n\n const finallyGroup = finallyNodes.length\n ? [\n {\n id: 'finally-group-id',\n type: NodeType.FINALLY_GROUP,\n children: finallyNodes.map(n => n.id),\n group: true,\n style: { padding: DEFAULT_FINALLLY_GROUP_PADDING },\n },\n ]\n : [];\n const spacerNodes: PipelineMixedNodeModel[] = (\n getSpacerNodes([...nodes, ...finallyNodes], NodeType.SPACER_NODE, [\n NodeType.FINALLY_NODE,\n ]) as PipelineMixedNodeModel[]\n ).map(getSpacerNode);\n\n const edges: PipelineEdgeModel[] = getEdgesFromNodes(\n [...nodes, ...spacerNodes, ...finallyNodes],\n NodeType.SPACER_NODE,\n NodeType.EDGE,\n NodeType.EDGE,\n [NodeType.FINALLY_NODE],\n NodeType.EDGE,\n );\n\n return {\n graph: {\n id: `${pipelineRun?.metadata?.name}-graph`,\n type: ModelKind.graph,\n layout: PipelineLayout.DAGRE_VIEWER,\n scaleExtent: [0.5, 1],\n },\n nodes: [\n ...nodes,\n ...spacerNodes,\n ...finallyNodes,\n ...finallyGroup,\n ] as PipelineMixedNodeModel[],\n edges,\n };\n};\n\nexport const getLayoutData = (\n layout: PipelineLayout,\n): dagre.GraphLabel | null => {\n switch (layout) {\n case PipelineLayout.DAGRE_BUILDER:\n return DAGRE_BUILDER_PROPS;\n case PipelineLayout.DAGRE_VIEWER:\n return DAGRE_VIEWER_PROPS;\n case PipelineLayout.DAGRE_VIEWER_SPACED:\n return DAGRE_VIEWER_SPACED_PROPS;\n case PipelineLayout.DAGRE_BUILDER_SPACED:\n return DAGRE_BUILDER_SPACED_PROPS;\n default:\n return null;\n }\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pipeline-topology-utils.esm.js","sources":["../../src/utils/pipeline-topology-utils.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n EdgeModel,\n getEdgesFromNodes,\n getSpacerNodes,\n GraphModel,\n ModelKind,\n RunStatus,\n WhenStatus,\n} from '@patternfly/react-topology';\nimport * as dagre from 'dagre';\nimport { minBy, uniq } from 'lodash';\n\nimport {\n ComputedStatus,\n PipelineRunKind,\n PipelineTask,\n PipelineTaskParam,\n PipelineTaskWithStatus,\n TaskRunKind,\n} from '@janus-idp/shared-react';\n\nimport { DAG, Vertex } from '../components/pipeline-topology/dag';\nimport {\n DAGRE_BUILDER_PROPS,\n DAGRE_BUILDER_SPACED_PROPS,\n DAGRE_VIEWER_PROPS,\n DAGRE_VIEWER_SPACED_PROPS,\n DEFAULT_BADGE_WIDTH,\n DEFAULT_FINALLLY_GROUP_PADDING,\n DEFAULT_NODE_HEIGHT,\n DEFAULT_NODE_ICON_WIDTH,\n FINALLY_NODE_PADDING,\n NODE_HEIGHT,\n NODE_PADDING,\n NODE_WIDTH,\n NodeType,\n PipelineLayout,\n REGEX_EXTRACT_DEPS,\n WHEN_EXPRESSION_SPACING,\n} from '../consts/pipeline-topology-const';\nimport {\n FinallyNodeModel,\n LoadingNodeModel,\n NodeCreator,\n NodeCreatorSetup,\n PipelineEdgeModel,\n PipelineMixedNodeModel,\n PipelineRunAfterNodeModelData,\n} from '../types/pipeline-topology-types';\nimport { appendPipelineRunStatus, getPLRTaskRuns } from './pipelineRun-utils';\n\nconst createGenericNode: NodeCreatorSetup =\n (type, width?, height?) => (name, data) => ({\n id: name,\n label: data?.label || name,\n runAfterTasks: data?.runAfterTasks || [],\n ...(data && { data }),\n height: height ?? NODE_HEIGHT,\n width: width ?? NODE_WIDTH,\n type,\n });\n\nconst getMaxFinallyNode = (finallyTaskList: PipelineTaskWithStatus[]) => {\n const sortedFinallyTaskList = [...finallyTaskList].sort(\n (a, b) => b.name.length - a.name.length,\n );\n return sortedFinallyTaskList[0]?.name || '';\n};\n\nexport const createFinallyNode = (\n height: number,\n): NodeCreator<FinallyNodeModel> =>\n createGenericNode(\n NodeType.FINALLY_NODE,\n NODE_WIDTH + WHEN_EXPRESSION_SPACING + FINALLY_NODE_PADDING * 2,\n height,\n );\n\nexport const createLoadingNode: NodeCreator<LoadingNodeModel> =\n createGenericNode(NodeType.LOADING_NODE);\n\nconst createPipelineTaskNode = (\n type: NodeType,\n data: PipelineRunAfterNodeModelData,\n) => createGenericNode(type, data.width, data.height)(data.id ?? '', data);\n\nexport const getTextWidth = (\n text: string,\n font: string = '0.8rem RedHatText',\n): number => {\n if (!text || text.length === 0) {\n return 0;\n }\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n if (!context) {\n return text.length;\n }\n context.font = font;\n const { width } = context.measureText(text);\n return width;\n};\n\nexport const extractDepsFromContextVariables = (\n contextVariable: string | null | undefined,\n) => {\n let matches;\n const deps: string[] = [];\n if (!contextVariable) {\n return deps;\n }\n // eslint-disable-next-line no-cond-assign\n while ((matches = REGEX_EXTRACT_DEPS.exec(contextVariable)) !== null) {\n // This is necessary to avoid infinite loops with zero-width matches\n if (matches.index === REGEX_EXTRACT_DEPS.lastIndex) {\n REGEX_EXTRACT_DEPS.lastIndex++;\n }\n if (matches) {\n if (!deps.includes(matches[1])) {\n deps.push(matches[1]);\n }\n }\n }\n return deps;\n};\n\nexport const getSpacerNode = (\n node: PipelineMixedNodeModel,\n): PipelineMixedNodeModel => ({\n ...node,\n height: 1,\n width: 1,\n});\n\nexport const getWhenStatus = (\n status: ComputedStatus,\n): WhenStatus | undefined => {\n switch (status) {\n case ComputedStatus.Succeeded:\n case ComputedStatus.Failed:\n return WhenStatus.Met;\n case ComputedStatus.Skipped:\n case ComputedStatus['In Progress']:\n case ComputedStatus.Idle:\n return WhenStatus.Unmet;\n default:\n return undefined;\n }\n};\n\nexport const getTaskWhenStatus = (\n task: PipelineTaskWithStatus,\n): WhenStatus | undefined => {\n if (!task.when) {\n return undefined;\n }\n return getWhenStatus(task.status?.reason as ComputedStatus);\n};\n\nconst getDepsFromContextVariables = (task: PipelineTask) => {\n const depsFromContextVariables: string[] = [];\n if (task.params) {\n task.params.forEach((p: PipelineTaskParam) => {\n if (Array.isArray(p.value)) {\n p.value.forEach(paramValue => {\n depsFromContextVariables.push(\n ...extractDepsFromContextVariables(paramValue),\n );\n });\n } else {\n depsFromContextVariables.push(\n ...extractDepsFromContextVariables(p.value),\n );\n }\n });\n }\n if (task?.when) {\n task.when.forEach(({ input, values }) => {\n depsFromContextVariables.push(...extractDepsFromContextVariables(input));\n values.forEach((whenValue: string) => {\n depsFromContextVariables.push(\n ...extractDepsFromContextVariables(whenValue),\n );\n });\n });\n }\n return depsFromContextVariables;\n};\n\nconst getRunAfterTasks = (task: PipelineTask, dag: DAG, vertex: Vertex) => {\n const runAfterTasks: string[] = [];\n const depsFromContextVariables = getDepsFromContextVariables(task);\n\n const dependancies = uniq([...vertex.dependancyNames]);\n if (dependancies) {\n dependancies.forEach(dep => {\n const depObj = dag.vertices.get(dep) as Vertex;\n if (\n depObj.level - vertex.level <= 1 ||\n vertex.data.runAfter?.includes(depObj.name)\n ) {\n runAfterTasks.push(dep);\n }\n });\n }\n if (depsFromContextVariables.length > 0) {\n const v = depsFromContextVariables.map(d => {\n return dag.vertices.get(d) as Vertex;\n });\n const minLevelDep = minBy(v, (d: Vertex) => d.level) as Vertex;\n const nearestDeps = v.filter(v1 => v1.level === minLevelDep.level);\n nearestDeps.forEach(nd => {\n if (nd.level - vertex.level <= 1 || vertex.dependancyNames.length === 0) {\n runAfterTasks.push(nd.name);\n }\n });\n }\n return runAfterTasks;\n};\n\nexport const getGraphDataModel = (\n pipelineRun: PipelineRunKind | undefined,\n taskRuns: TaskRunKind[],\n): {\n graph: GraphModel;\n nodes: PipelineMixedNodeModel[];\n edges: EdgeModel[];\n} | null => {\n if (!pipelineRun) {\n return null;\n }\n\n const plrTaskRuns = getPLRTaskRuns(taskRuns, pipelineRun?.metadata?.name);\n\n const taskList = appendPipelineRunStatus(pipelineRun, plrTaskRuns);\n\n const dag = new DAG();\n taskList?.forEach((task: PipelineTask) => {\n dag.addEdges(task.name, task, '', task.runAfter || []);\n });\n\n const nodes: PipelineMixedNodeModel[] = [];\n const maxWidthForLevel: { [key: string]: number } = {};\n dag.topologicalSort((v: Vertex) => {\n if (!maxWidthForLevel[v.level]) {\n maxWidthForLevel[v.level] = getTextWidth(v.name);\n } else {\n maxWidthForLevel[v.level] = Math.max(\n maxWidthForLevel[v.level],\n getTextWidth(v.name),\n );\n }\n });\n dag.topologicalSort((vertex: Vertex) => {\n const task = vertex.data as PipelineTask;\n const runAfterTasks = getRunAfterTasks(task, dag, vertex);\n const badgePadding =\n Object.keys(pipelineRun.spec)?.length > 0 ? DEFAULT_BADGE_WIDTH : 0;\n const isTaskSkipped = pipelineRun?.status?.skippedTasks?.some(\n t => t.name === task.name,\n );\n nodes.push(\n createPipelineTaskNode(NodeType.TASK_NODE, {\n id: vertex.name,\n label: vertex.name,\n width:\n maxWidthForLevel[vertex.level] +\n NODE_PADDING * 2 +\n DEFAULT_NODE_ICON_WIDTH +\n badgePadding,\n runAfterTasks,\n status: isTaskSkipped ? RunStatus.Skipped : vertex.data.status?.reason,\n whenStatus: getTaskWhenStatus(vertex.data),\n task: vertex.data,\n pipelineRun,\n }),\n );\n });\n\n const finallyTaskList = appendPipelineRunStatus(\n pipelineRun,\n plrTaskRuns,\n true,\n );\n\n const finallyNodes = finallyTaskList.map(fTask => {\n const isTaskSkipped = pipelineRun?.status?.skippedTasks?.some(\n t => t.name === fTask.name,\n );\n\n return createPipelineTaskNode(NodeType.FINALLY_NODE, {\n id: fTask.name,\n label: fTask.name,\n width:\n getTextWidth(getMaxFinallyNode(finallyTaskList)) +\n NODE_PADDING * 2 +\n DEFAULT_FINALLLY_GROUP_PADDING * 2,\n height: DEFAULT_NODE_HEIGHT,\n runAfterTasks: [],\n status: isTaskSkipped\n ? RunStatus.Skipped\n : (fTask.status?.reason as RunStatus),\n whenStatus: getTaskWhenStatus(fTask),\n task: fTask,\n pipelineRun,\n });\n });\n\n const finallyGroup = finallyNodes.length\n ? [\n {\n id: 'finally-group-id',\n type: NodeType.FINALLY_GROUP,\n children: finallyNodes.map(n => n.id),\n group: true,\n style: { padding: DEFAULT_FINALLLY_GROUP_PADDING },\n },\n ]\n : [];\n const spacerNodes: PipelineMixedNodeModel[] = (\n getSpacerNodes([...nodes, ...finallyNodes], NodeType.SPACER_NODE, [\n NodeType.FINALLY_NODE,\n ]) as PipelineMixedNodeModel[]\n ).map(getSpacerNode);\n\n const edges: PipelineEdgeModel[] = getEdgesFromNodes(\n [...nodes, ...spacerNodes, ...finallyNodes],\n NodeType.SPACER_NODE,\n NodeType.EDGE,\n NodeType.EDGE,\n [NodeType.FINALLY_NODE],\n NodeType.EDGE,\n );\n\n return {\n graph: {\n id: `${pipelineRun?.metadata?.name}-graph`,\n type: ModelKind.graph,\n layout: PipelineLayout.DAGRE_VIEWER,\n scaleExtent: [0.5, 1],\n },\n nodes: [\n ...nodes,\n ...spacerNodes,\n ...finallyNodes,\n ...finallyGroup,\n ] as PipelineMixedNodeModel[],\n edges,\n };\n};\n\nexport const getLayoutData = (\n layout: PipelineLayout,\n): dagre.GraphLabel | null => {\n switch (layout) {\n case PipelineLayout.DAGRE_BUILDER:\n return DAGRE_BUILDER_PROPS;\n case PipelineLayout.DAGRE_VIEWER:\n return DAGRE_VIEWER_PROPS;\n case PipelineLayout.DAGRE_VIEWER_SPACED:\n return DAGRE_VIEWER_SPACED_PROPS;\n case PipelineLayout.DAGRE_BUILDER_SPACED:\n return DAGRE_BUILDER_SPACED_PROPS;\n default:\n return null;\n }\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { isEmpty, get, find, cloneDeep, isFinite, each, trim } from 'lodash';
|
|
2
|
-
import { ComputedStatus,
|
|
2
|
+
import { ComputedStatus, SucceedConditionReason, pipelineRunStatus, pipelineRunFilterReducer } from '@janus-idp/shared-react';
|
|
3
3
|
import { TEKTON_PIPELINE_RUN, TEKTON_PIPELINE_TASK } from '../consts/tekton-const.esm.js';
|
|
4
4
|
|
|
5
5
|
const s = 1e3;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { TaskRunResultsAnnotations,
|
|
1
|
+
import { TaskRunResultsAnnotations, TaskRunResultsTypeValue, TaskRunResultsKeyValue } from '@aonic-ui/pipelines';
|
|
2
2
|
import { pipelineRunFilterReducer } from '@janus-idp/shared-react';
|
|
3
|
-
import {
|
|
3
|
+
import { TEKTON_PIPELINE_RUN, TEKTON_PIPELINE_TASK } from '../consts/tekton-const.esm.js';
|
|
4
4
|
|
|
5
5
|
const getSortedTaskRuns = (tRuns) => {
|
|
6
6
|
if (!tRuns || tRuns.length === 0) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage-community/plugin-tekton",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.20.0",
|
|
4
4
|
"main": "dist/index.esm.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -27,15 +27,15 @@
|
|
|
27
27
|
"start": "backstage-cli package start",
|
|
28
28
|
"build": "backstage-cli package build",
|
|
29
29
|
"lint": "backstage-cli package lint",
|
|
30
|
-
"test": "backstage-cli package test",
|
|
30
|
+
"test": "backstage-cli package test --passWithNoTests --coverage",
|
|
31
31
|
"clean": "backstage-cli package clean",
|
|
32
32
|
"prepack": "backstage-cli package prepack",
|
|
33
33
|
"postpack": "backstage-cli package postpack",
|
|
34
34
|
"prepublish": "./fix-style-inject-imports.sh"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@aonic-ui/pipelines": "^3.
|
|
38
|
-
"@backstage-community/plugin-tekton-common": "^1.
|
|
37
|
+
"@aonic-ui/pipelines": "^3.1.0",
|
|
38
|
+
"@backstage-community/plugin-tekton-common": "^1.6.0",
|
|
39
39
|
"@backstage/catalog-model": "^1.7.3",
|
|
40
40
|
"@backstage/core-components": "^0.16.3",
|
|
41
41
|
"@backstage/core-plugin-api": "^1.10.3",
|
|
@@ -45,8 +45,8 @@
|
|
|
45
45
|
"@backstage/plugin-kubernetes-react": "^0.5.3",
|
|
46
46
|
"@backstage/plugin-permission-react": "^0.4.30",
|
|
47
47
|
"@backstage/theme": "^0.6.3",
|
|
48
|
-
"@janus-idp/shared-react": "^2.
|
|
49
|
-
"@kubernetes/client-node": "
|
|
48
|
+
"@janus-idp/shared-react": "^2.16.0",
|
|
49
|
+
"@kubernetes/client-node": "1.0.0-rc7",
|
|
50
50
|
"@material-ui/core": "^4.9.13",
|
|
51
51
|
"@material-ui/icons": "^4.11.3",
|
|
52
52
|
"@material-ui/lab": "^4.0.0-alpha.45",
|
|
@@ -79,12 +79,12 @@
|
|
|
79
79
|
"@testing-library/react-hooks": "8.0.1",
|
|
80
80
|
"@testing-library/user-event": "14.5.2",
|
|
81
81
|
"@types/dagre": "^0.7.52",
|
|
82
|
-
"@types/lodash": "4.17.
|
|
82
|
+
"@types/lodash": "4.17.15",
|
|
83
83
|
"@types/node": "18.19.68",
|
|
84
84
|
"cross-fetch": "4.0.0",
|
|
85
85
|
"msw": "1.3.5",
|
|
86
86
|
"prettier": "3.4.2",
|
|
87
|
-
"start-server-and-test": "2.0.
|
|
87
|
+
"start-server-and-test": "2.0.10"
|
|
88
88
|
},
|
|
89
89
|
"files": [
|
|
90
90
|
"app-config.dynamic.yaml",
|