Skip to content

Commit

Permalink
Merge pull request #5433 from vikram-raj/odc-3589
Browse files Browse the repository at this point in the history
Bug 1835425: Don't show Remove Trigger when there are no triggers
  • Loading branch information
openshift-merge-robot committed May 27, 2020
2 parents 10ec138 + b145c46 commit 24c9cce
Show file tree
Hide file tree
Showing 8 changed files with 97 additions and 35 deletions.
Expand Up @@ -4,7 +4,7 @@ import { KebabAction, navFactory } from '@console/internal/components/utils';
import { k8sGet, k8sList } from '@console/internal/module/k8s';
import { ErrorPage404 } from '@console/internal/components/error';
import { getPipelineKebabActions } from '../../utils/pipeline-actions';
import { getLatestRun } from '../../utils/pipeline-augment';
import { getLatestRun, PipelineRun } from '../../utils/pipeline-augment';
import { PipelineRunModel, PipelineModel } from '../../models';
import { useMenuActionsWithUserLabel } from '../pipelineruns/triggered-by';
import {
Expand All @@ -16,12 +16,13 @@ import {
parametersValidationSchema,
resourcesValidationSchema,
} from './detail-page-tabs';
import { usePipelineTriggerTemplateNames } from './utils/triggers';

const PipelineDetailsPage: React.FC<DetailsPageProps> = (props) => {
const [errorCode, setErrorCode] = React.useState(null);
const [menuActions, setMenuActions] = React.useState<KebabAction[]>([]);

const [latestPipelineRun, setLatestPipelineRun] = React.useState<PipelineRun>({});
const { name, namespace } = props;
const templateNames = usePipelineTriggerTemplateNames(name, namespace) || [];

React.useEffect(() => {
k8sGet(PipelineModel, name, namespace)
Expand All @@ -33,7 +34,7 @@ const PipelineDetailsPage: React.FC<DetailsPageProps> = (props) => {
})
.then((listres) => {
const latestRun = getLatestRun({ data: listres }, 'creationTimestamp');
setMenuActions(getPipelineKebabActions(latestRun));
setLatestPipelineRun(latestRun);
})
.catch((error) => {
setErrorCode(error.response.status);
Expand All @@ -42,7 +43,9 @@ const PipelineDetailsPage: React.FC<DetailsPageProps> = (props) => {
.catch((error) => setErrorCode(error.response.status));
}, [name, namespace]);

const augmentedMenuActions: KebabAction[] = useMenuActionsWithUserLabel(menuActions);
const augmentedMenuActions: KebabAction[] = useMenuActionsWithUserLabel(
getPipelineKebabActions(latestPipelineRun, templateNames.length > 0),
);

if (errorCode === 404) {
return <ErrorPage404 />;
Expand All @@ -51,6 +54,7 @@ const PipelineDetailsPage: React.FC<DetailsPageProps> = (props) => {
<DetailsPage
{...props}
menuActions={augmentedMenuActions}
customData={templateNames}
pages={[
navFactory.details(PipelineDetails),
navFactory.editYaml(),
Expand Down
Expand Up @@ -6,17 +6,20 @@ import {
PipelineTask,
} from '../../../../utils/pipeline-augment';
import { TriggerTemplateModel } from '../../../../models';
import { usePipelineTriggerTemplateNames, RouteTemplate } from '../../utils/triggers';
import { RouteTemplate } from '../../utils/triggers';
import DynamicResourceLinkList from '../../resource-overview/DynamicResourceLinkList';
import TriggerTemplateResourceLink from '../../resource-overview/TriggerTemplateResourceLink';
import PipelineVisualization from './PipelineVisualization';

interface PipelineDetailsProps {
obj: Pipeline;
customData: RouteTemplate[];
}

const PipelineDetails: React.FC<PipelineDetailsProps> = ({ obj: pipeline }) => {
const routeTemplates: RouteTemplate[] = usePipelineTriggerTemplateNames(pipeline) || [];
const PipelineDetails: React.FC<PipelineDetailsProps> = ({
obj: pipeline,
customData: routeTemplates,
}) => {
const taskLinks = pipeline.spec.tasks
.filter((pipelineTask: PipelineTask) => !!pipelineTask.taskRef)
.map((task) => ({
Expand Down
Expand Up @@ -6,10 +6,9 @@ import { referenceForModel } from '@console/internal/module/k8s';
import { pipelineFilterReducer } from '../../../utils/pipeline-filter-reducer';
import { Pipeline } from '../../../utils/pipeline-augment';
import { PipelineModel, PipelineRunModel } from '../../../models';
import { getPipelineKebabActions } from '../../../utils/pipeline-actions';
import LinkedPipelineRunTaskStatus from '../../pipelineruns/status/LinkedPipelineRunTaskStatus';
import { ResourceKebabWithUserLabel } from '../../pipelineruns/triggered-by';
import { tableColumnClasses } from './pipeline-table';
import PipelineRowKebabActions from './PipelineRowKebabActions';

const pipelineReference = referenceForModel(PipelineModel);
const pipelinerunReference = referenceForModel(PipelineRunModel);
Expand Down Expand Up @@ -62,11 +61,7 @@ const PipelineRow: RowFunction<Pipeline> = ({ obj, index, key, style }) => {
'-'}
</TableData>
<TableData className={tableColumnClasses[6]}>
<ResourceKebabWithUserLabel
actions={getPipelineKebabActions(obj.latestRun)}
kind={pipelineReference}
resource={obj}
/>
<PipelineRowKebabActions pipeline={obj} />
</TableData>
</TableRow>
);
Expand Down
@@ -0,0 +1,30 @@
import * as React from 'react';
import { referenceForModel } from '@console/internal/module/k8s';
import { ResourceKebabWithUserLabel } from '../../pipelineruns/triggered-by';
import { getPipelineKebabActions } from '../../../utils/pipeline-actions';
import { Pipeline } from '../../../utils/pipeline-augment';
import { PipelineModel } from '../../../models';
import { usePipelineTriggerTemplateNames } from '../utils/triggers';

type PipelineRowKebabActionsProps = {
pipeline: Pipeline;
};

const pipelineReference = referenceForModel(PipelineModel);

const PipelineRowKebabActions: React.FC<PipelineRowKebabActionsProps> = ({ pipeline }) => {
const {
metadata: { name, namespace },
} = pipeline;
const templateNames = usePipelineTriggerTemplateNames(name, namespace) || [];

return (
<ResourceKebabWithUserLabel
actions={getPipelineKebabActions(pipeline.latestRun, templateNames.length > 0)}
kind={pipelineReference}
resource={pipeline}
/>
);
};

export default PipelineRowKebabActions;
Expand Up @@ -14,11 +14,15 @@ type TriggerTemplateSelectorProps = {

const TriggerTemplateSelector: React.FC<TriggerTemplateSelectorProps> = (props) => {
const { name, pipeline, placeholder } = props;
const {
metadata: { name: pipelineName, namespace },
} = pipeline;

const [field] = useField(name);
const selection = field.value;

const templateNames: RouteTemplate[] = usePipelineTriggerTemplateNames(pipeline) || [];
const templateNames: RouteTemplate[] =
usePipelineTriggerTemplateNames(pipelineName, namespace) || [];
const items = templateNames.reduce(
(acc, { triggerTemplateName }) => ({ ...acc, [triggerTemplateName]: triggerTemplateName }),
{},
Expand Down
Expand Up @@ -13,11 +13,7 @@ import {
WatchK8sResultsObject,
} from '@console/internal/components/utils/k8s-watch-hook';
import { EventListenerModel, PipelineRunModel, TriggerTemplateModel } from '../../../models';
import {
getResourceModelFromBindingKind,
Pipeline,
PipelineRun,
} from '../../../utils/pipeline-augment';
import { getResourceModelFromBindingKind, PipelineRun } from '../../../utils/pipeline-augment';
import {
EventListenerKind,
EventListenerKindTrigger,
Expand Down Expand Up @@ -59,10 +55,7 @@ const useEventListenerRoutes = (
return mapValues(results, (result: WatchK8sResultsObject<RouteKind>) => result.data);
};

const useAllEventListeners = (resource: K8sResourceCommon) => {
const {
metadata: { namespace },
} = resource;
const useAllEventListeners = (namespace: string) => {
const eventListenerResource: WatchK8sResource = React.useMemo(
() => ({
kind: referenceForModel(EventListenerModel),
Expand All @@ -83,11 +76,11 @@ export type RouteTemplate = {
triggerTemplateName: string;
};

export const usePipelineTriggerTemplateNames = (pipeline: Pipeline): RouteTemplate[] | null => {
const eventListenerResources = useAllEventListeners(pipeline);
const {
metadata: { namespace },
} = pipeline;
export const usePipelineTriggerTemplateNames = (
pipelineName: string,
namespace: string,
): RouteTemplate[] | null => {
const eventListenerResources = useAllEventListeners(namespace);
const triggerTemplateResources: WatchK8sResources<TriggerTemplateMapping> = React.useMemo(() => {
if (!eventListenerResources) {
return {};
Expand Down Expand Up @@ -126,7 +119,7 @@ export const usePipelineTriggerTemplateNames = (pipeline: Pipeline): RouteTempla
const plr: PipelineRun = triggerTemplate?.spec?.resourcetemplates?.find(
({ kind }) => kind === PipelineRunModel.kind,
);
return plr?.spec?.pipelineRef?.name === getResourceName(pipeline);
return plr?.spec?.pipelineRef?.name === pipelineName;
})
.map(getResourceName);

Expand Down Expand Up @@ -203,7 +196,7 @@ export const getTriggerTemplatePipelineName = (triggerTemplate: TriggerTemplateK
};

export const useTriggerTemplateEventListenerNames = (triggerTemplate: TriggerTemplateKind) => {
const eventListenerResources = useAllEventListeners(triggerTemplate) || [];
const eventListenerResources = useAllEventListeners(triggerTemplate.metadata.namespace) || [];

return eventListenerResources
.filter((eventListener: EventListenerKind) =>
Expand All @@ -215,7 +208,7 @@ export const useTriggerTemplateEventListenerNames = (triggerTemplate: TriggerTem
};

export const useTriggerBindingEventListenerNames = (triggerBinding: TriggerBindingKind) => {
const eventListenerResources = useAllEventListeners(triggerBinding) || [];
const eventListenerResources = useAllEventListeners(triggerBinding.metadata.namespace) || [];
return eventListenerResources
.filter((eventListener: EventListenerKind) =>
eventListener.spec.triggers.find(({ bindings }) =>
Expand Down
Expand Up @@ -4,6 +4,7 @@ import {
rerunPipelineAndRedirect,
reRunPipelineRun,
startPipeline,
getPipelineKebabActions,
} from '../pipeline-actions';
import { PipelineRun, Pipeline } from '../pipeline-augment';

Expand Down Expand Up @@ -83,3 +84,32 @@ describe('PipelineAction testing stopPipelineRun create correct labels and callb
expect(stopAction.hidden).not.toBeFalsy();
});
});

describe('getPipelineKebabActions', () => {
it('expect Remove Trigger option is present', () => {
const pipelineKebabActions = getPipelineKebabActions(actionPipelineRuns[0], true);
expect(pipelineKebabActions.length).toBe(6);
expect(pipelineKebabActions[3](PipelineModel, actionPipelines[0]).label).toBe('Remove Trigger');
});
it('expect Remove Trigger option is not present', () => {
const pipelineKebabActions = getPipelineKebabActions(actionPipelineRuns[0], false);
expect(pipelineKebabActions.length).toBe(5);
expect(pipelineKebabActions[3](PipelineModel, actionPipelines[0]).label).not.toBe(
'Remove Trigger',
);
});
it('expect Start Last Run option is present', () => {
const pipelineKebabActions = getPipelineKebabActions(actionPipelineRuns[0], false);
expect(pipelineKebabActions.length).toBe(5);
expect(pipelineKebabActions[1](PipelineRunModel, actionPipelineRuns[0]).label).toBe(
'Start Last Run',
);
});
it('expect Start Last Run option is not present', () => {
const pipelineKebabActions = getPipelineKebabActions(undefined, false);
expect(pipelineKebabActions.length).toBe(4);
expect(pipelineKebabActions[1](PipelineRunModel, actionPipelineRuns[0]).label).not.toBe(
'Start Last Run',
);
});
});
7 changes: 5 additions & 2 deletions frontend/packages/dev-console/src/utils/pipeline-actions.tsx
Expand Up @@ -228,11 +228,14 @@ const removeTrigger: KebabAction = (kind: K8sKind, pipeline: Pipeline) => ({
verb: 'delete',
},
});
export const getPipelineKebabActions = (pipelineRun?: PipelineRun): KebabAction[] => [
export const getPipelineKebabActions = (
pipelineRun?: PipelineRun,
isTriggerPresent?: boolean,
): KebabAction[] => [
(model, resource: Pipeline) => startPipeline(model, resource, handlePipelineRunSubmit),
...(pipelineRun ? [() => rerunPipelineAndRedirect(PipelineRunModel, pipelineRun)] : []),
(model, pipeline) => addTrigger(EventListenerModel, pipeline),
(model, pipeline) => removeTrigger(EventListenerModel, pipeline),
...(isTriggerPresent ? [(model, pipeline) => removeTrigger(EventListenerModel, pipeline)] : []),
editPipeline,
Kebab.factory.Delete,
];
Expand Down

0 comments on commit 24c9cce

Please sign in to comment.