@backstage-community/plugin-tekton 3.16.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.
Files changed (151) hide show
  1. package/CHANGELOG.md +801 -0
  2. package/README.md +369 -0
  3. package/app-config.dynamic.yaml +12 -0
  4. package/dist/components/Charts/PipelineBars.esm.js +49 -0
  5. package/dist/components/Charts/PipelineBars.esm.js.map +1 -0
  6. package/dist/components/Icons/CriticalRiskIcon.esm.js +22 -0
  7. package/dist/components/Icons/CriticalRiskIcon.esm.js.map +1 -0
  8. package/dist/components/Icons/EqualsIcon.esm.js +22 -0
  9. package/dist/components/Icons/EqualsIcon.esm.js.map +1 -0
  10. package/dist/components/Icons/LinkToSbomIcon.esm.js +37 -0
  11. package/dist/components/Icons/LinkToSbomIcon.esm.js.map +1 -0
  12. package/dist/components/Icons/OutputIcon.esm.js +36 -0
  13. package/dist/components/Icons/OutputIcon.esm.js.map +1 -0
  14. package/dist/components/Icons/SignedBadge.esm.js +16 -0
  15. package/dist/components/Icons/SignedBadge.esm.js.map +1 -0
  16. package/dist/components/Icons/ViewLogsIcon.esm.js +35 -0
  17. package/dist/components/Icons/ViewLogsIcon.esm.js.map +1 -0
  18. package/dist/components/PipelineRunList/PipelineRunColumnHeader.esm.js +43 -0
  19. package/dist/components/PipelineRunList/PipelineRunColumnHeader.esm.js.map +1 -0
  20. package/dist/components/PipelineRunList/PipelineRunList.esm.js +185 -0
  21. package/dist/components/PipelineRunList/PipelineRunList.esm.js.map +1 -0
  22. package/dist/components/PipelineRunList/PipelineRunListSearchBar.esm.js +42 -0
  23. package/dist/components/PipelineRunList/PipelineRunListSearchBar.esm.js.map +1 -0
  24. package/dist/components/PipelineRunList/PipelineRunOutput.esm.js +70 -0
  25. package/dist/components/PipelineRunList/PipelineRunOutput.esm.js.map +1 -0
  26. package/dist/components/PipelineRunList/PipelineRunRow.css.esm.js +7 -0
  27. package/dist/components/PipelineRunList/PipelineRunRow.css.esm.js.map +1 -0
  28. package/dist/components/PipelineRunList/PipelineRunRow.esm.js +110 -0
  29. package/dist/components/PipelineRunList/PipelineRunRow.esm.js.map +1 -0
  30. package/dist/components/PipelineRunList/PipelineRunRowActions.esm.js +137 -0
  31. package/dist/components/PipelineRunList/PipelineRunRowActions.esm.js.map +1 -0
  32. package/dist/components/PipelineRunList/PipelineRunSBOMLink.esm.js +25 -0
  33. package/dist/components/PipelineRunList/PipelineRunSBOMLink.esm.js.map +1 -0
  34. package/dist/components/PipelineRunList/PipelineRunTableBody.esm.js +32 -0
  35. package/dist/components/PipelineRunList/PipelineRunTableBody.esm.js.map +1 -0
  36. package/dist/components/PipelineRunList/PipelineRunTaskStatus.esm.js +11 -0
  37. package/dist/components/PipelineRunList/PipelineRunTaskStatus.esm.js.map +1 -0
  38. package/dist/components/PipelineRunList/PipelineRunVulnerabilities.esm.js +81 -0
  39. package/dist/components/PipelineRunList/PipelineRunVulnerabilities.esm.js.map +1 -0
  40. package/dist/components/PipelineRunList/PipelineTableHeader.esm.js +53 -0
  41. package/dist/components/PipelineRunList/PipelineTableHeader.esm.js.map +1 -0
  42. package/dist/components/PipelineRunList/PlrStatus.css.esm.js +7 -0
  43. package/dist/components/PipelineRunList/PlrStatus.css.esm.js.map +1 -0
  44. package/dist/components/PipelineRunList/PlrStatus.esm.js +11 -0
  45. package/dist/components/PipelineRunList/PlrStatus.esm.js.map +1 -0
  46. package/dist/components/PipelineRunList/ResourceBadge.css.esm.js +7 -0
  47. package/dist/components/PipelineRunList/ResourceBadge.css.esm.js.map +1 -0
  48. package/dist/components/PipelineRunList/ResourceBadge.esm.js +15 -0
  49. package/dist/components/PipelineRunList/ResourceBadge.esm.js.map +1 -0
  50. package/dist/components/PipelineRunLogs/PipelineRunLogDialog.esm.js +82 -0
  51. package/dist/components/PipelineRunLogs/PipelineRunLogDialog.esm.js.map +1 -0
  52. package/dist/components/PipelineRunLogs/PipelineRunLogDownloader.esm.js +47 -0
  53. package/dist/components/PipelineRunLogs/PipelineRunLogDownloader.esm.js.map +1 -0
  54. package/dist/components/PipelineRunLogs/PipelineRunLogViewer.esm.js +53 -0
  55. package/dist/components/PipelineRunLogs/PipelineRunLogViewer.esm.js.map +1 -0
  56. package/dist/components/PipelineRunLogs/PipelineRunLogs.esm.js +69 -0
  57. package/dist/components/PipelineRunLogs/PipelineRunLogs.esm.js.map +1 -0
  58. package/dist/components/PipelineRunLogs/PodLogsDownloadLink.esm.js +69 -0
  59. package/dist/components/PipelineRunLogs/PodLogsDownloadLink.esm.js.map +1 -0
  60. package/dist/components/PipelineRunLogs/TaskStatusStepper.esm.js +128 -0
  61. package/dist/components/PipelineRunLogs/TaskStatusStepper.esm.js.map +1 -0
  62. package/dist/components/PipelineRunOutput/PipelineRunOutputDialog.esm.js +62 -0
  63. package/dist/components/PipelineRunOutput/PipelineRunOutputDialog.esm.js.map +1 -0
  64. package/dist/components/Router.esm.js +16 -0
  65. package/dist/components/Router.esm.js.map +1 -0
  66. package/dist/components/Tekton/TektonCIComponent.esm.js +53 -0
  67. package/dist/components/Tekton/TektonCIComponent.esm.js.map +1 -0
  68. package/dist/components/common/ClusterSelector.css.esm.js +7 -0
  69. package/dist/components/common/ClusterSelector.css.esm.js.map +1 -0
  70. package/dist/components/common/ClusterSelector.esm.js +46 -0
  71. package/dist/components/common/ClusterSelector.esm.js.map +1 -0
  72. package/dist/components/common/ErrorPanel.esm.js +33 -0
  73. package/dist/components/common/ErrorPanel.esm.js.map +1 -0
  74. package/dist/components/common/PermissionAlert.esm.js +9 -0
  75. package/dist/components/common/PermissionAlert.esm.js.map +1 -0
  76. package/dist/components/common/ResourceStatus.css.esm.js +7 -0
  77. package/dist/components/common/ResourceStatus.css.esm.js.map +1 -0
  78. package/dist/components/common/StatusSelector.css.esm.js +7 -0
  79. package/dist/components/common/StatusSelector.css.esm.js.map +1 -0
  80. package/dist/components/common/StatusSelector.esm.js +48 -0
  81. package/dist/components/common/StatusSelector.esm.js.map +1 -0
  82. package/dist/components/common/TableExpandCollapse.esm.js +44 -0
  83. package/dist/components/common/TableExpandCollapse.esm.js.map +1 -0
  84. package/dist/components/pipeline-topology/PipelineLayout.esm.js +126 -0
  85. package/dist/components/pipeline-topology/PipelineLayout.esm.js.map +1 -0
  86. package/dist/components/pipeline-topology/PipelineRunVisualization.esm.js +13 -0
  87. package/dist/components/pipeline-topology/PipelineRunVisualization.esm.js.map +1 -0
  88. package/dist/components/pipeline-topology/PipelineTaskNode.css.esm.js +7 -0
  89. package/dist/components/pipeline-topology/PipelineTaskNode.css.esm.js.map +1 -0
  90. package/dist/components/pipeline-topology/PipelineTaskNode.esm.js +132 -0
  91. package/dist/components/pipeline-topology/PipelineTaskNode.esm.js.map +1 -0
  92. package/dist/components/pipeline-topology/PipelineVisualization.css.esm.js +7 -0
  93. package/dist/components/pipeline-topology/PipelineVisualization.css.esm.js.map +1 -0
  94. package/dist/components/pipeline-topology/PipelineVisualization.esm.js +24 -0
  95. package/dist/components/pipeline-topology/PipelineVisualization.esm.js.map +1 -0
  96. package/dist/components/pipeline-topology/PipelineVisualizationStepList.css.esm.js +7 -0
  97. package/dist/components/pipeline-topology/PipelineVisualizationStepList.css.esm.js.map +1 -0
  98. package/dist/components/pipeline-topology/PipelineVisualizationStepList.esm.js +39 -0
  99. package/dist/components/pipeline-topology/PipelineVisualizationStepList.esm.js.map +1 -0
  100. package/dist/components/pipeline-topology/PipelineVisualizationView.esm.js +41 -0
  101. package/dist/components/pipeline-topology/PipelineVisualizationView.esm.js.map +1 -0
  102. package/dist/components/pipeline-topology/TaskGroupEdge.esm.js +16 -0
  103. package/dist/components/pipeline-topology/TaskGroupEdge.esm.js.map +1 -0
  104. package/dist/components/pipeline-topology/dag.esm.js +119 -0
  105. package/dist/components/pipeline-topology/dag.esm.js.map +1 -0
  106. package/dist/components/pipeline-topology/pipelineComponentFactory.esm.js +60 -0
  107. package/dist/components/pipeline-topology/pipelineComponentFactory.esm.js.map +1 -0
  108. package/dist/consts/pipeline-topology-const.esm.js +66 -0
  109. package/dist/consts/pipeline-topology-const.esm.js.map +1 -0
  110. package/dist/consts/tekton-const.esm.js +7 -0
  111. package/dist/consts/tekton-const.esm.js.map +1 -0
  112. package/dist/hooks/TektonResourcesContext.esm.js +16 -0
  113. package/dist/hooks/TektonResourcesContext.esm.js.map +1 -0
  114. package/dist/hooks/useAllWatchResources.esm.js +35 -0
  115. package/dist/hooks/useAllWatchResources.esm.js.map +1 -0
  116. package/dist/hooks/useDarkTheme.esm.js +21 -0
  117. package/dist/hooks/useDarkTheme.esm.js.map +1 -0
  118. package/dist/hooks/usePipelineRunScanResults.esm.js +35 -0
  119. package/dist/hooks/usePipelineRunScanResults.esm.js.map +1 -0
  120. package/dist/hooks/usePodLogsOfPipelineRun.esm.js +67 -0
  121. package/dist/hooks/usePodLogsOfPipelineRun.esm.js.map +1 -0
  122. package/dist/hooks/useResourcesClusters.esm.js +24 -0
  123. package/dist/hooks/useResourcesClusters.esm.js.map +1 -0
  124. package/dist/hooks/useTektonObjectsResponse.esm.js +78 -0
  125. package/dist/hooks/useTektonObjectsResponse.esm.js.map +1 -0
  126. package/dist/hooks/useTektonViewPermission.esm.js +12 -0
  127. package/dist/hooks/useTektonViewPermission.esm.js.map +1 -0
  128. package/dist/index.d.ts +32 -0
  129. package/dist/index.esm.js +3 -0
  130. package/dist/index.esm.js.map +1 -0
  131. package/dist/models.esm.js +21 -0
  132. package/dist/models.esm.js.map +1 -0
  133. package/dist/plugin.esm.js +72 -0
  134. package/dist/plugin.esm.js.map +1 -0
  135. package/dist/types/types.esm.js +15 -0
  136. package/dist/types/types.esm.js.map +1 -0
  137. package/dist/utils/isTektonCIAvailable.esm.js +7 -0
  138. package/dist/utils/isTektonCIAvailable.esm.js.map +1 -0
  139. package/dist/utils/log-downloader-utils.esm.js +33 -0
  140. package/dist/utils/log-downloader-utils.esm.js.map +1 -0
  141. package/dist/utils/pipeline-step-utils.esm.js +53 -0
  142. package/dist/utils/pipeline-step-utils.esm.js.map +1 -0
  143. package/dist/utils/pipeline-topology-utils.esm.js +250 -0
  144. package/dist/utils/pipeline-topology-utils.esm.js.map +1 -0
  145. package/dist/utils/pipelineRun-utils.esm.js +128 -0
  146. package/dist/utils/pipelineRun-utils.esm.js.map +1 -0
  147. package/dist/utils/taskRun-utils.esm.js +50 -0
  148. package/dist/utils/taskRun-utils.esm.js.map +1 -0
  149. package/dist/utils/tekton-utils.esm.js +191 -0
  150. package/dist/utils/tekton-utils.esm.js.map +1 -0
  151. package/package.json +114 -0
@@ -0,0 +1,191 @@
1
+ import { pluralize } from '@patternfly/react-core';
2
+ import { get } from 'lodash';
3
+ import { pipelineRunStatus, getTaskRunsForPipelineRun, updateTaskStatus, ComputedStatus, pipelineRunFilterReducer, SucceedConditionReason } from '@janus-idp/shared-react';
4
+ import { getPipelineRunScanResults } from '../hooks/usePipelineRunScanResults.esm.js';
5
+ import { PipelineRunGVK, TaskRunGVK } from '../models.esm.js';
6
+
7
+ const getClusters = (k8sObjects) => {
8
+ const clusters = k8sObjects.items.map(
9
+ (item) => item.cluster.name
10
+ );
11
+ const errors = k8sObjects.items.map(
12
+ (item) => item.errors
13
+ );
14
+ return { clusters, errors };
15
+ };
16
+ const isTektonResource = (kind) => [PipelineRunGVK.kind, TaskRunGVK.kind].includes(kind);
17
+ const getResourceType = (kind) => {
18
+ switch (kind) {
19
+ case PipelineRunGVK.kind:
20
+ return "pipelineruns";
21
+ case TaskRunGVK.kind:
22
+ return "taskruns";
23
+ default:
24
+ return "";
25
+ }
26
+ };
27
+ const getTektonResources = (cluster, k8sObjects) => k8sObjects.items?.[cluster]?.resources?.reduce(
28
+ (acc, res) => {
29
+ if (res.type === "pods") {
30
+ return {
31
+ ...acc,
32
+ pods: { data: res.resources }
33
+ };
34
+ }
35
+ if (res.type !== "customresources" || res.type === "customresources" && res.resources.length === 0) {
36
+ return acc;
37
+ }
38
+ const customResKind = res.resources[0].kind;
39
+ return {
40
+ ...acc,
41
+ ...isTektonResource(customResKind) && {
42
+ [getResourceType(customResKind)]: {
43
+ data: res.resources
44
+ }
45
+ }
46
+ };
47
+ },
48
+ {}
49
+ );
50
+ const totalPipelineRunTasks = (pipelinerun) => {
51
+ if (!pipelinerun?.status?.pipelineSpec) {
52
+ return 0;
53
+ }
54
+ const totalTasks = (pipelinerun.status.pipelineSpec?.tasks || []).length;
55
+ const finallyTasks = (pipelinerun.status.pipelineSpec?.finally || []).length ?? 0;
56
+ return totalTasks + finallyTasks;
57
+ };
58
+ const getTaskStatusOfPLR = (pipelinerun, taskRuns) => {
59
+ const totalTasks = totalPipelineRunTasks(pipelinerun);
60
+ const plrTasks = getTaskRunsForPipelineRun(pipelinerun, taskRuns);
61
+ const plrTaskLength = plrTasks?.length;
62
+ const skippedTaskLength = pipelinerun?.status?.skippedTasks?.length || 0;
63
+ const taskStatus = updateTaskStatus(pipelinerun, plrTasks);
64
+ if (plrTasks?.length > 0) {
65
+ const pipelineRunHasFailure = taskStatus[ComputedStatus.Failed] > 0;
66
+ const pipelineRunIsCancelled = pipelineRunFilterReducer(pipelinerun) === ComputedStatus.Cancelled;
67
+ const unhandledTasks = totalTasks >= plrTaskLength ? totalTasks - plrTaskLength - skippedTaskLength : totalTasks;
68
+ if (pipelineRunHasFailure || pipelineRunIsCancelled) {
69
+ taskStatus[ComputedStatus.Cancelled] += unhandledTasks;
70
+ } else {
71
+ taskStatus[ComputedStatus.Pending] += unhandledTasks;
72
+ }
73
+ } else if (pipelinerun?.status?.conditions?.[0]?.status === "False" || pipelinerun?.spec?.status === SucceedConditionReason.PipelineRunCancelled) {
74
+ taskStatus[ComputedStatus.Cancelled] = totalTasks;
75
+ } else if (pipelinerun?.spec?.status === SucceedConditionReason.PipelineRunPending) {
76
+ taskStatus[ComputedStatus.Pending] += totalTasks;
77
+ } else {
78
+ taskStatus[ComputedStatus.PipelineNotStarted]++;
79
+ }
80
+ return taskStatus;
81
+ };
82
+ const getDuration = (seconds, long) => {
83
+ if (seconds === 0) {
84
+ return "less than a sec";
85
+ }
86
+ let sec = Math.round(seconds);
87
+ let min = 0;
88
+ let hr = 0;
89
+ let duration = "";
90
+ if (sec >= 60) {
91
+ min = Math.floor(sec / 60);
92
+ sec %= 60;
93
+ }
94
+ if (min >= 60) {
95
+ hr = Math.floor(min / 60);
96
+ min %= 60;
97
+ }
98
+ if (hr > 0) {
99
+ duration += long ? pluralize(hr, "hour", "hours") : `${hr}h`;
100
+ duration += " ";
101
+ }
102
+ if (min > 0) {
103
+ duration += long ? pluralize(min, "minute", "minutes") : `${min}m`;
104
+ duration += " ";
105
+ }
106
+ if (sec > 0) {
107
+ duration += long ? pluralize(sec, "second", "seconds") : `${sec}s`;
108
+ }
109
+ return duration.trim();
110
+ };
111
+ const descendingComparator = (a, b, orderBy) => {
112
+ if (get(b, orderBy) < get(a, orderBy)) {
113
+ return -1;
114
+ }
115
+ if (get(b, orderBy) > get(a, orderBy)) {
116
+ return 1;
117
+ }
118
+ return 0;
119
+ };
120
+ const calculateDurationInSeconds = (startTime, endTime) => {
121
+ const start = new Date(startTime).getTime();
122
+ const end = endTime ? new Date(endTime).getTime() : (/* @__PURE__ */ new Date()).getTime();
123
+ const durationInSeconds = (end - start) / 1e3;
124
+ return durationInSeconds;
125
+ };
126
+ const durationComparator = (a, b) => {
127
+ const durationA = a.status?.startTime ? calculateDurationInSeconds(a.status?.startTime, a.status?.completionTime) : 0;
128
+ const durationB = b.status?.startTime ? calculateDurationInSeconds(b.status?.startTime, b.status?.completionTime) : 0;
129
+ if (durationB < durationA) {
130
+ return -1;
131
+ }
132
+ if (durationB > durationA) {
133
+ return 1;
134
+ }
135
+ return 0;
136
+ };
137
+ const vulnerabilitiesSortValue = (scanResults) => {
138
+ if (!scanResults?.vulnerabilities) {
139
+ return -1;
140
+ }
141
+ return (scanResults.vulnerabilities.critical ?? 0) * 1e9 + (scanResults.vulnerabilities.high ?? 0) * 1e6 + (scanResults.vulnerabilities.medium ?? 0) * 1e3 + (scanResults.vulnerabilities.low ?? 0);
142
+ };
143
+ const vulnerabilitiesComparator = (a, b) => {
144
+ const vulnerabilitiesSortValueA = vulnerabilitiesSortValue(
145
+ getPipelineRunScanResults(a)
146
+ );
147
+ const vulnerabilitiesSortValueB = vulnerabilitiesSortValue(
148
+ getPipelineRunScanResults(b)
149
+ );
150
+ if (vulnerabilitiesSortValueB < vulnerabilitiesSortValueA) {
151
+ return -1;
152
+ }
153
+ if (vulnerabilitiesSortValueB > vulnerabilitiesSortValueA) {
154
+ return 1;
155
+ }
156
+ return 0;
157
+ };
158
+ const getComparator = (order, orderBy, orderById) => {
159
+ switch (orderById) {
160
+ case "duration":
161
+ return (a, b) => {
162
+ return order === "desc" ? durationComparator(a, b) : -durationComparator(a, b);
163
+ };
164
+ case "vulnerabilities":
165
+ return (a, b) => {
166
+ return order === "desc" ? vulnerabilitiesComparator(a, b) : -vulnerabilitiesComparator(a, b);
167
+ };
168
+ default:
169
+ return (a, b) => {
170
+ return order === "desc" ? descendingComparator(a, b, orderBy) : -descendingComparator(a, b, orderBy);
171
+ };
172
+ }
173
+ };
174
+ const calculateDuration = (startTime, endTime, long) => {
175
+ const durationInSeconds = calculateDurationInSeconds(startTime, endTime);
176
+ return getDuration(durationInSeconds, long);
177
+ };
178
+ const pipelineRunDuration = (run) => {
179
+ if (!run || Object.keys(run).length === 0) {
180
+ return "-";
181
+ }
182
+ const startTime = run.status?.startTime;
183
+ const completionTime = run.status?.completionTime;
184
+ if (!startTime || !completionTime && pipelineRunStatus(run) !== "Running") {
185
+ return "-";
186
+ }
187
+ return calculateDuration(startTime, completionTime, true);
188
+ };
189
+
190
+ export { calculateDuration, calculateDurationInSeconds, descendingComparator, durationComparator, getClusters, getComparator, getDuration, getTaskStatusOfPLR, getTektonResources, pipelineRunDuration, totalPipelineRunTasks, vulnerabilitiesComparator };
191
+ //# sourceMappingURL=tekton-utils.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tekton-utils.esm.js","sources":["../../src/utils/tekton-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 ClusterObjects,\n ObjectsByEntityResponse,\n} from '@backstage/plugin-kubernetes-common';\n\nimport { pluralize } from '@patternfly/react-core';\nimport { get } from 'lodash';\n\nimport {\n ComputedStatus,\n getTaskRunsForPipelineRun,\n pipelineRunFilterReducer,\n PipelineRunKind,\n pipelineRunStatus,\n SucceedConditionReason,\n TaskRunKind,\n TaskStatusTypes,\n updateTaskStatus,\n} from '@janus-idp/shared-react';\n\nimport { getPipelineRunScanResults } from '../hooks/usePipelineRunScanResults';\nimport { PipelineRunGVK, TaskRunGVK } from '../models';\nimport {\n ClusterErrors,\n Order,\n PipelineRunScanResults,\n TektonResponseData,\n} from '../types/types';\n\nexport const getClusters = (k8sObjects: ObjectsByEntityResponse) => {\n const clusters: string[] = k8sObjects.items.map(\n (item: ClusterObjects) => item.cluster.name,\n );\n const errors: ClusterErrors[] = k8sObjects.items.map(\n (item: ClusterObjects) => item.errors,\n );\n return { clusters, errors };\n};\n\nconst isTektonResource = (kind: string) =>\n [PipelineRunGVK.kind, TaskRunGVK.kind].includes(kind);\n\nconst getResourceType = (kind: string) => {\n switch (kind) {\n case PipelineRunGVK.kind:\n return 'pipelineruns';\n case TaskRunGVK.kind:\n return 'taskruns';\n default:\n return '';\n }\n};\n\nexport const getTektonResources = (\n cluster: number,\n k8sObjects: ObjectsByEntityResponse,\n) =>\n k8sObjects.items?.[cluster]?.resources?.reduce(\n (acc: TektonResponseData, res: any) => {\n if (res.type === 'pods') {\n return {\n ...acc,\n pods: { data: res.resources },\n };\n }\n if (\n res.type !== 'customresources' ||\n (res.type === 'customresources' && res.resources.length === 0)\n ) {\n return acc;\n }\n const customResKind = res.resources[0].kind;\n return {\n ...acc,\n ...(isTektonResource(customResKind) && {\n [getResourceType(customResKind)]: {\n data: res.resources,\n },\n }),\n };\n },\n {},\n );\n\nexport const totalPipelineRunTasks = (pipelinerun: PipelineRunKind): number => {\n if (!pipelinerun?.status?.pipelineSpec) {\n return 0;\n }\n const totalTasks = (pipelinerun.status.pipelineSpec?.tasks || []).length;\n const finallyTasks =\n (pipelinerun.status.pipelineSpec?.finally || []).length ?? 0;\n return totalTasks + finallyTasks;\n};\n\nexport const getTaskStatusOfPLR = (\n pipelinerun: PipelineRunKind,\n taskRuns: TaskRunKind[],\n) => {\n const totalTasks = totalPipelineRunTasks(pipelinerun);\n const plrTasks = getTaskRunsForPipelineRun(pipelinerun, taskRuns);\n const plrTaskLength = plrTasks?.length;\n const skippedTaskLength = pipelinerun?.status?.skippedTasks?.length || 0;\n\n const taskStatus: TaskStatusTypes = updateTaskStatus(pipelinerun, plrTasks);\n\n if (plrTasks?.length > 0) {\n const pipelineRunHasFailure = taskStatus[ComputedStatus.Failed] > 0;\n const pipelineRunIsCancelled =\n pipelineRunFilterReducer(pipelinerun) === ComputedStatus.Cancelled;\n const unhandledTasks =\n totalTasks >= plrTaskLength\n ? totalTasks - plrTaskLength - skippedTaskLength\n : totalTasks;\n\n if (pipelineRunHasFailure || pipelineRunIsCancelled) {\n taskStatus[ComputedStatus.Cancelled] += unhandledTasks;\n } else {\n taskStatus[ComputedStatus.Pending] += unhandledTasks;\n }\n } else if (\n pipelinerun?.status?.conditions?.[0]?.status === 'False' ||\n pipelinerun?.spec?.status === SucceedConditionReason.PipelineRunCancelled\n ) {\n taskStatus[ComputedStatus.Cancelled] = totalTasks;\n } else if (\n pipelinerun?.spec?.status === SucceedConditionReason.PipelineRunPending\n ) {\n taskStatus[ComputedStatus.Pending] += totalTasks;\n } else {\n taskStatus[ComputedStatus.PipelineNotStarted]++;\n }\n return taskStatus;\n};\n\nexport const getDuration = (seconds: number, long?: boolean): string => {\n if (seconds === 0) {\n return 'less than a sec';\n }\n let sec = Math.round(seconds);\n let min = 0;\n let hr = 0;\n let duration = '';\n if (sec >= 60) {\n min = Math.floor(sec / 60);\n sec %= 60;\n }\n if (min >= 60) {\n hr = Math.floor(min / 60);\n min %= 60;\n }\n if (hr > 0) {\n duration += long ? pluralize(hr, 'hour', 'hours') : `${hr}h`;\n duration += ' ';\n }\n if (min > 0) {\n duration += long ? pluralize(min, 'minute', 'minutes') : `${min}m`;\n duration += ' ';\n }\n if (sec > 0) {\n duration += long ? pluralize(sec, 'second', 'seconds') : `${sec}s`;\n }\n\n return duration.trim();\n};\n\nexport const descendingComparator = (\n a: PipelineRunKind,\n b: PipelineRunKind,\n orderBy: string,\n) => {\n if (get(b, orderBy) < get(a, orderBy)) {\n return -1;\n }\n if (get(b, orderBy) > get(a, orderBy)) {\n return 1;\n }\n return 0;\n};\n\nexport const calculateDurationInSeconds = (\n startTime: string,\n endTime?: string,\n) => {\n const start = new Date(startTime).getTime();\n const end = endTime ? new Date(endTime).getTime() : new Date().getTime();\n const durationInSeconds = (end - start) / 1000;\n return durationInSeconds;\n};\n\nexport const durationComparator = (a: PipelineRunKind, b: PipelineRunKind) => {\n const durationA = a.status?.startTime\n ? calculateDurationInSeconds(a.status?.startTime, a.status?.completionTime)\n : 0;\n\n const durationB = b.status?.startTime\n ? calculateDurationInSeconds(b.status?.startTime, b.status?.completionTime)\n : 0;\n\n if (durationB < durationA) {\n return -1;\n }\n if (durationB > durationA) {\n return 1;\n }\n return 0;\n};\n\nconst vulnerabilitiesSortValue = (\n scanResults: PipelineRunScanResults,\n): number => {\n if (!scanResults?.vulnerabilities) {\n return -1;\n }\n // Expect no more than 999 of any one severity\n return (\n (scanResults.vulnerabilities.critical ?? 0) * 1000000000 +\n (scanResults.vulnerabilities.high ?? 0) * 1000000 +\n (scanResults.vulnerabilities.medium ?? 0) * 1000 +\n (scanResults.vulnerabilities.low ?? 0)\n );\n};\n\nexport const vulnerabilitiesComparator = (\n a: PipelineRunKind,\n b: PipelineRunKind,\n) => {\n const vulnerabilitiesSortValueA = vulnerabilitiesSortValue(\n getPipelineRunScanResults(a),\n );\n const vulnerabilitiesSortValueB = vulnerabilitiesSortValue(\n getPipelineRunScanResults(b),\n );\n\n if (vulnerabilitiesSortValueB < vulnerabilitiesSortValueA) {\n return -1;\n }\n if (vulnerabilitiesSortValueB > vulnerabilitiesSortValueA) {\n return 1;\n }\n return 0;\n};\n\nexport const getComparator = (\n order: Order,\n orderBy: string,\n orderById: string,\n) => {\n switch (orderById) {\n case 'duration':\n return (a: PipelineRunKind, b: PipelineRunKind) => {\n return order === 'desc'\n ? durationComparator(a, b)\n : -durationComparator(a, b);\n };\n case 'vulnerabilities':\n return (a: PipelineRunKind, b: PipelineRunKind) => {\n return order === 'desc'\n ? vulnerabilitiesComparator(a, b)\n : -vulnerabilitiesComparator(a, b);\n };\n default:\n return (a: PipelineRunKind, b: PipelineRunKind) => {\n return order === 'desc'\n ? descendingComparator(a, b, orderBy)\n : -descendingComparator(a, b, orderBy);\n };\n }\n};\n\nexport const calculateDuration = (\n startTime: string,\n endTime?: string,\n long?: boolean,\n) => {\n const durationInSeconds = calculateDurationInSeconds(startTime, endTime);\n return getDuration(durationInSeconds, long);\n};\n\nexport const pipelineRunDuration = (run: PipelineRunKind): string => {\n if (!run || Object.keys(run).length === 0) {\n return '-';\n }\n const startTime = run.status?.startTime;\n const completionTime = run.status?.completionTime;\n\n // Duration cannot be computed if start time is missing or a completed/failed pipeline/task has no end time\n if (!startTime || (!completionTime && pipelineRunStatus(run) !== 'Running')) {\n return '-';\n }\n return calculateDuration(startTime, completionTime, true);\n};\n"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,114 @@
1
+ {
2
+ "name": "@backstage-community/plugin-tekton",
3
+ "version": "3.16.0",
4
+ "main": "dist/index.esm.js",
5
+ "types": "dist/index.d.ts",
6
+ "license": "Apache-2.0",
7
+ "publishConfig": {
8
+ "access": "public",
9
+ "main": "dist/index.esm.js",
10
+ "types": "dist/index.d.ts"
11
+ },
12
+ "backstage": {
13
+ "role": "frontend-plugin",
14
+ "supported-versions": "^1.32.0",
15
+ "pluginId": "tekton",
16
+ "pluginPackage": "@backstage-community/plugin-tekton",
17
+ "pluginPackages": [
18
+ "@backstage-community/plugin-tekton",
19
+ "@backstage-community/plugin-tekton-common"
20
+ ]
21
+ },
22
+ "sideEffects": [
23
+ "./**/*.css",
24
+ "./**/*.css.esm.js"
25
+ ],
26
+ "scripts": {
27
+ "start": "backstage-cli package start",
28
+ "build": "backstage-cli package build",
29
+ "lint": "backstage-cli package lint",
30
+ "test": "backstage-cli package test",
31
+ "clean": "backstage-cli package clean",
32
+ "prepack": "backstage-cli package prepack",
33
+ "postpack": "backstage-cli package postpack"
34
+ },
35
+ "dependencies": {
36
+ "@aonic-ui/pipelines": "^1.1.1",
37
+ "@backstage-community/plugin-tekton-common": "^1.4.0",
38
+ "@backstage/catalog-model": "^1.7.0",
39
+ "@backstage/core-components": "^0.15.1",
40
+ "@backstage/core-plugin-api": "^1.10.0",
41
+ "@backstage/plugin-catalog-react": "^1.14.0",
42
+ "@backstage/plugin-kubernetes": "^0.11.16",
43
+ "@backstage/plugin-kubernetes-common": "^0.8.3",
44
+ "@backstage/plugin-kubernetes-react": "^0.4.4",
45
+ "@backstage/plugin-permission-react": "^0.4.27",
46
+ "@backstage/theme": "^0.6.0",
47
+ "@janus-idp/shared-react": "^2.13.1",
48
+ "@kubernetes/client-node": "^0.22.1",
49
+ "@material-ui/core": "^4.9.13",
50
+ "@material-ui/icons": "^4.11.3",
51
+ "@material-ui/lab": "^4.0.0-alpha.45",
52
+ "@mui/icons-material": "5.15.17",
53
+ "@patternfly/patternfly": "^5.1.0",
54
+ "@patternfly/react-charts": "^7.1.1",
55
+ "@patternfly/react-core": "^5.1.2",
56
+ "@patternfly/react-tokens": "^5.1.2",
57
+ "@patternfly/react-topology": "^5.1.0",
58
+ "classnames": "^2.3.2",
59
+ "dagre": "^0.8.5",
60
+ "lodash": "^4.17.21",
61
+ "react-measure": "^2.5.2",
62
+ "react-use": "^17.4.0"
63
+ },
64
+ "peerDependencies": {
65
+ "react": "^16.13.1 || ^17.0.0 || ^18.0.0",
66
+ "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0",
67
+ "react-router-dom": "^6.0.0"
68
+ },
69
+ "devDependencies": {
70
+ "@backstage/cli": "0.28.2",
71
+ "@backstage/core-app-api": "1.15.1",
72
+ "@backstage/dev-utils": "1.1.2",
73
+ "@backstage/test-utils": "1.7.0",
74
+ "@playwright/test": "1.45.3",
75
+ "@redhat-developer/red-hat-developer-hub-theme": "0.4.0",
76
+ "@testing-library/jest-dom": "6.4.8",
77
+ "@testing-library/react": "14.3.1",
78
+ "@testing-library/react-hooks": "8.0.1",
79
+ "@testing-library/user-event": "14.5.2",
80
+ "@types/dagre": "^0.7.52",
81
+ "@types/lodash": "4.17.5",
82
+ "@types/node": "18.19.34",
83
+ "cross-fetch": "4.0.0",
84
+ "msw": "1.3.3",
85
+ "prettier": "3.3.3",
86
+ "start-server-and-test": "2.0.8"
87
+ },
88
+ "files": [
89
+ "app-config.dynamic.yaml",
90
+ "dist"
91
+ ],
92
+ "repository": {
93
+ "type": "git",
94
+ "url": "git+https://github.com/backstage/community-plugins.git",
95
+ "directory": "workspaces/tekton/plugins/tekton"
96
+ },
97
+ "keywords": [
98
+ "support:production",
99
+ "lifecycle:active",
100
+ "kubernetes",
101
+ "tekton",
102
+ "backstage",
103
+ "plugin"
104
+ ],
105
+ "homepage": "https://red.ht/rhdh",
106
+ "bugs": "https://github.com/backstage/community-plugins/issues",
107
+ "maintainers": [
108
+ "christoph-jerolimov",
109
+ "@debsmita1",
110
+ "@divyanshiGupta"
111
+ ],
112
+ "author": "Red Hat",
113
+ "module": "./dist/index.esm.js"
114
+ }