Skip to content

Commit d7371f7

Browse files
Merge pull request #13353 from lokanandaprabhu/feature/ODC-7426
ODC-7426: Deletion of pipeline run after tekton result installation should be user-friendly
2 parents c1b77d8 + d863a59 commit d7371f7

15 files changed

Lines changed: 234 additions & 23 deletions

File tree

frontend/packages/pipelines-plugin/locales/en/pipelines-plugin.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@
105105
"Task status": "Task status",
106106
"Started": "Started",
107107
"Signed": "Signed",
108+
"Archived in Tekton results": "Archived in Tekton results",
108109
"Unknown failure condition": "Unknown failure condition",
109110
"Failure on task {{taskName}} - check logs for details.": "Failure on task {{taskName}} - check logs for details.",
110111
"Error downloading logs.": "Error downloading logs.",
@@ -127,6 +128,8 @@
127128
"High": "High",
128129
"Medium": "Medium",
129130
"Low": "Low",
131+
"Resource is being deleted.": "Resource is being deleted.",
132+
"Resource is being fetched from Tekton Results.": "Resource is being fetched from Tekton Results.",
130133
"View GitHub App": "View GitHub App",
131134
"EventListener details": "EventListener details",
132135
"URL": "URL",
@@ -448,6 +451,8 @@
448451
"Invalid PipelineRun configuration, unable to start Pipeline.": "Invalid PipelineRun configuration, unable to start Pipeline.",
449452
"Edit Pipeline": "Edit Pipeline",
450453
"Start last run": "Start last run",
454+
"This action will delete resource from k8s but still the resource can be fetched from Tekton Results": "This action will delete resource from k8s but still the resource can be fetched from Tekton Results",
455+
"Delete {{kind}}": "Delete {{kind}}",
451456
"Stop": "Stop",
452457
"Let the running tasks complete, then execute finally tasks": "Let the running tasks complete, then execute finally tasks",
453458
"Interrupt any executing non finally tasks, then execute finally tasks": "Interrupt any executing non finally tasks, then execute finally tasks",
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
.pipelinerun-details-page {
2+
display: flex;
3+
&__results-indicator {
4+
margin-left: var(--pf-global--spacer--xs);
5+
color: var(--pf-global--Color--400);
6+
font-size: var(--pf-global--FontSize--lg);
7+
align-self: center;
8+
}
9+
}

frontend/packages/pipelines-plugin/src/components/pipelineruns/PipelineRunDetailsPage.tsx

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import * as React from 'react';
22
import { Tooltip } from '@patternfly/react-core';
3+
import { ArchiveIcon } from '@patternfly/react-icons';
34
import { useTranslation } from 'react-i18next';
45
import { DetailsPage, DetailsPageProps } from '@console/internal/components/factory';
56
import { KebabAction, navFactory, viewYamlComponent } from '@console/internal/components/utils';
@@ -20,6 +21,8 @@ import { useTaskRuns } from './hooks/useTaskRuns';
2021
import PipelineRunParametersForm from './PipelineRunParametersForm';
2122
import { useMenuActionsWithUserAnnotation } from './triggered-by';
2223

24+
import './PipelineRunDetailsPage.scss';
25+
2326
const PipelineRunDetailsPage: React.FC<DetailsPageProps> = (props) => {
2427
const { kindObj, match, namespace, name } = props;
2528
const { t } = useTranslation();
@@ -30,17 +33,23 @@ const PipelineRunDetailsPage: React.FC<DetailsPageProps> = (props) => {
3033
);
3134
const breadcrumbsFor = useDevPipelinesBreadcrumbsFor(kindObj, match);
3235
const badge = usePipelineTechPreviewBadge(props.namespace);
33-
const resourceTitleFunc = (obj: PipelineRunKind): string | JSX.Element =>
34-
obj?.metadata?.annotations?.[chainsSignedAnnotation] === 'true' ? (
35-
<div style={{ display: 'flex' }}>
36+
const resourceTitleFunc = (obj: PipelineRunKind): string | JSX.Element => {
37+
return (
38+
<div className="pipelinerun-details-page">
3639
{obj?.metadata?.name}{' '}
37-
<Tooltip content={t('pipelines-plugin~Signed')}>
38-
<img src={SignedPipelinerunIcon} alt={t('pipelines-plugin~Signed')} />
39-
</Tooltip>
40+
{obj?.metadata?.annotations?.[chainsSignedAnnotation] === 'true' && (
41+
<Tooltip content={t('pipelines-plugin~Signed')}>
42+
<img src={SignedPipelinerunIcon} alt={t('pipelines-plugin~Signed')} />
43+
</Tooltip>
44+
)}
45+
{obj?.metadata?.annotations?.['resource.deleted.in.k8s'] === 'true' && (
46+
<Tooltip content={t('pipelines-plugin~Archived in Tekton results')}>
47+
<ArchiveIcon className="pipelinerun-details-page__results-indicator" />
48+
</Tooltip>
49+
)}
4050
</div>
41-
) : (
42-
obj?.metadata?.name
4351
);
52+
};
4453

4554
const [pipelineRun, loaded, error] = usePipelineRun(namespace, name);
4655

frontend/packages/pipelines-plugin/src/components/pipelineruns/list-page/PipelineRunList.scss

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,18 @@
22
&__signed-indicator {
33
display: inline-block;
44
--pf-c-table--cell--Color: var(--pf-global--BackgroundColor--dark-transparent-100);
5-
margin-left: var(--pf-global--spacer-sm);
5+
margin-left: var(--pf-global--spacer--sm);
66
> img {
77
height: var(--pf-global--FontSize--lg);
88
position: relative;
99
top: 4px;
1010
}
1111
}
12+
&__results-indicator {
13+
display: inline-block;
14+
margin-left: var(--pf-global--spacer--xs);
15+
> svg{
16+
color: var(--pf-global--Color--400);
17+
}
18+
}
1219
}

frontend/packages/pipelines-plugin/src/components/pipelineruns/list-page/PipelineRunRow.tsx

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import * as React from 'react';
22
import { Tooltip } from '@patternfly/react-core';
3+
import { ArchiveIcon } from '@patternfly/react-icons';
34
import { useTranslation } from 'react-i18next';
45
import { TableData, RowFunctionArgs } from '@console/internal/components/factory';
56
import { Timestamp, ResourceLink } from '@console/internal/components/utils';
@@ -53,13 +54,22 @@ const PipelineRunRow: React.FC<RowFunctionArgs<PipelineRunKind>> = ({ obj, custo
5354
namespace={obj.metadata.namespace}
5455
data-test-id={obj.metadata.name}
5556
nameSuffix={
56-
obj?.metadata?.annotations?.[chainsSignedAnnotation] === 'true' ? (
57-
<Tooltip content={t('pipelines-plugin~Signed')}>
58-
<div className="opp-pipeline-run-list__signed-indicator">
59-
<img src={SignedPipelinerunIcon} alt={t('pipelines-plugin~Signed')} />
60-
</div>
61-
</Tooltip>
62-
) : null
57+
<>
58+
{obj?.metadata?.annotations?.[chainsSignedAnnotation] === 'true' ? (
59+
<Tooltip content={t('pipelines-plugin~Signed')}>
60+
<div className="opp-pipeline-run-list__signed-indicator">
61+
<img src={SignedPipelinerunIcon} alt={t('pipelines-plugin~Signed')} />
62+
</div>
63+
</Tooltip>
64+
) : null}
65+
{obj?.metadata?.annotations?.['resource.deleted.in.k8s'] === 'true' ? (
66+
<Tooltip content={t('pipelines-plugin~Archived in Tekton results')}>
67+
<div className="opp-pipeline-run-list__results-indicator">
68+
<ArchiveIcon />
69+
</div>
70+
</Tooltip>
71+
) : null}
72+
</>
6373
}
6474
/>
6575
</TableData>
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import * as React from 'react';
2+
import * as _ from 'lodash';
3+
import { useTranslation } from 'react-i18next';
4+
import { Kebab, ResourceKebabProps } from '@console/internal/components/utils';
5+
import { connectToModel } from '@console/internal/kinds';
6+
7+
export const ResourceKebab = connectToModel((props: ResourceKebabProps) => {
8+
const { t } = useTranslation();
9+
const { actions, kindObj, resource, isDisabled, customData, terminatingTooltip } = props;
10+
if (!kindObj) {
11+
return null;
12+
}
13+
const options = _.reject(
14+
actions.map((a) => a(kindObj, resource, null, customData)),
15+
'hidden',
16+
);
17+
const isResourceLoadedFromTR =
18+
resource?.metadata?.annotations?.['resource.loaded.from.tektonResults'];
19+
const isResourceDeletedInK8s = resource?.metadata?.annotations?.['resource.deleted.in.k8s'];
20+
return (
21+
<Kebab
22+
options={options}
23+
key={resource.metadata.uid}
24+
isDisabled={
25+
isDisabled ??
26+
((_.has(resource.metadata, 'deletionTimestamp') && !isResourceLoadedFromTR) ||
27+
options.length === 0)
28+
}
29+
terminatingTooltip={
30+
_.has(resource.metadata, 'deletionTimestamp') && !isResourceLoadedFromTR
31+
? terminatingTooltip || t('pipelines-plugin~Resource is being deleted.')
32+
: isResourceDeletedInK8s
33+
? t('pipelines-plugin~Resource is being fetched from Tekton Results.')
34+
: ''
35+
}
36+
/>
37+
);
38+
});

frontend/packages/pipelines-plugin/src/components/pipelineruns/triggered-by/ResourceKebabWithUserLabel.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import * as React from 'react';
2-
import { KebabAction, ResourceKebab } from '@console/internal/components/utils';
2+
import { KebabAction } from '@console/internal/components/utils';
33
import { useMenuActionsWithUserAnnotation } from './hooks';
4+
import { ResourceKebab } from './ResourceKebab';
45

56
const ResourceKebabWithUserLabel: React.FC<React.ComponentProps<typeof ResourceKebab>> = ({
67
actions,

frontend/packages/pipelines-plugin/src/components/pipelineruns/utils/tekton-results.ts

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import * as _ from 'lodash';
12
import {
23
K8sResourceCommon,
34
MatchExpression,
@@ -58,7 +59,28 @@ const throw404 = () => {
5859

5960
// decoding result base64
6061
export const decodeValue = (value: string) => atob(value);
61-
export const decodeValueJson = (value: string) => (value ? JSON.parse(decodeValue(value)) : null);
62+
export const decodeValueJson = (value: string) => {
63+
const decodedValue = value ? JSON.parse(decodeValue(value)) : null;
64+
let resourceDeletedInK8sAnnotation;
65+
if (_.has(decodedValue?.metadata, 'deletionTimestamp')) {
66+
delete decodedValue?.metadata?.deletionTimestamp;
67+
resourceDeletedInK8sAnnotation = { 'resource.deleted.in.k8s': 'true' };
68+
}
69+
const decodedValueWithTRAnnotation = decodedValue
70+
? {
71+
...decodedValue,
72+
metadata: {
73+
...decodedValue?.metadata,
74+
annotations: {
75+
...decodedValue?.metadata?.annotations,
76+
'resource.loaded.from.tektonResults': 'true',
77+
...resourceDeletedInK8sAnnotation,
78+
},
79+
},
80+
}
81+
: null;
82+
return decodedValueWithTRAnnotation;
83+
};
6284

6385
// filter functions
6486
export const AND = (...expressions: string[]) => expressions.filter((x) => x).join(' && ');

frontend/packages/pipelines-plugin/src/components/pipelines/modals/common/utils.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ export const getPipelineRunData = (
113113
delete annotations['results.tekton.dev/log'];
114114
delete annotations['results.tekton.dev/record'];
115115
delete annotations['results.tekton.dev/result'];
116+
delete annotations['resource.deleted.in.k8s'];
117+
delete annotations['resource.loaded.from.tektonResults'];
116118

117119
const newPipelineRun = {
118120
apiVersion: pipeline ? pipeline.apiVersion : latestRun.apiVersion,

frontend/packages/pipelines-plugin/src/components/repository/RepositoryPipelineRunRow.tsx

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import * as React from 'react';
22
import { Tooltip } from '@patternfly/react-core';
3+
import { ArchiveIcon } from '@patternfly/react-icons';
4+
import { useTranslation } from 'react-i18next';
35
import { TableData, RowFunctionArgs } from '@console/internal/components/factory';
46
import {
57
ResourceLink,
@@ -51,6 +53,7 @@ const RepositoryPipelineRunRow: React.FC<RowFunctionArgs<PipelineRunKind>> = ({
5153
obj,
5254
customData,
5355
}) => {
56+
const { t } = useTranslation();
5457
const plrLabels = obj.metadata.labels;
5558
const plrAnnotations = obj.metadata.annotations;
5659
const { operatorVersion, taskRuns } = customData;
@@ -63,6 +66,17 @@ const RepositoryPipelineRunRow: React.FC<RowFunctionArgs<PipelineRunKind>> = ({
6366
name={obj.metadata.name}
6467
namespace={obj.metadata.namespace}
6568
data-test-id={obj.metadata.name}
69+
nameSuffix={
70+
<>
71+
{obj?.metadata?.annotations?.['resource.deleted.in.k8s'] === 'true' ? (
72+
<Tooltip content={t('pipelines-plugin~Archived in Tekton results')}>
73+
<div className="opp-pipeline-run-list__results-indicator">
74+
<ArchiveIcon />
75+
</div>
76+
</Tooltip>
77+
) : null}
78+
</>
79+
}
6680
/>
6781
</TableData>
6882
<TableData className={tableColumnClasses[1]} columnID="sha">

0 commit comments

Comments
 (0)