Skip to content

Commit

Permalink
Check Tekton EventListeners CRD version to use matching api
Browse files Browse the repository at this point in the history
  • Loading branch information
jerolimov committed Sep 14, 2020
1 parent abc92b9 commit 1fb87f6
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 11 deletions.
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import { getRandomChars } from '@console/shared';
import { apiVersionForModel, RouteKind } from '@console/internal/module/k8s';
import { RouteModel } from '@console/internal/models';
import { apiVersionForModel, k8sGet, RouteKind } from '@console/internal/module/k8s';
import { CustomResourceDefinitionModel, RouteModel } from '@console/internal/models';
import { EventListenerModel, TriggerTemplateModel } from '../../../../models';
import { PipelineRun } from '../../../../utils/pipeline-augment';
import { PIPELINE_SERVICE_ACCOUNT } from '../../const';
import {
TriggerBindingKind,
EventListenerKind,
EventListenerKindBindingReference,
TriggerBindingKind,
TriggerTemplateKind,
TriggerTemplateKindParam,
} from '../../resource-types';
Expand All @@ -28,10 +29,36 @@ export const createTriggerTemplate = (
};
};

export const createEventListener = (
export const createEventListener = async (
triggerBindings: TriggerBindingKind[],
triggerTemplate: TriggerTemplateKind,
): EventListenerKind => {
): Promise<EventListenerKind> => {
const eventListenerCRD = await k8sGet(
CustomResourceDefinitionModel,
'eventlisteners.triggers.tekton.dev',
);
const eventListenerVersion = eventListenerCRD.metadata.labels?.version?.replace(/^v/, '');

const mapTriggerBindings: (
triggerBinding: TriggerBindingKind,
) => EventListenerKindBindingReference = (triggerBinding: TriggerBindingKind) => {
// The Tekton CRD `EventListeners` before Tekton Triggers 0.5 requires a name
// instead of a ref here to link `TriggerBinding` or `ClusterTriggerBinding`.
// This API was changed in 0.5 (deprecated) and finally changed (removed) in 0.6.
// The Tekton CRDs introduced a version field also with version 0.6,
// so we check just for 'no version' to support the older version as well.
if (!eventListenerVersion) {
return {
kind: triggerBinding.kind,
name: triggerBinding.metadata.name,
} as EventListenerKindBindingReference;
}
return {
kind: triggerBinding.kind,
ref: triggerBinding.metadata.name,
};
};

return {
apiVersion: apiVersionForModel(EventListenerModel),
kind: EventListenerModel.kind,
Expand All @@ -42,7 +69,7 @@ export const createEventListener = (
serviceAccountName: PIPELINE_SERVICE_ACCOUNT,
triggers: [
{
bindings: triggerBindings.map(({ kind, metadata: { name } }) => ({ kind, name })),
bindings: triggerBindings.map(mapTriggerBindings),
template: { name: triggerTemplate.metadata.name },
},
],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ export const submitTrigger = async (
pipelineRun,
triggerTemplateParams,
);
const eventListener: EventListenerKind = createEventListener(
const eventListener: EventListenerKind = await createEventListener(
[triggerBinding.resource],
triggerTemplate,
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,16 @@ export type TriggerTemplateKind = K8sResourceCommon & {
};

export type EventListenerKindBindingReference = {
// TriggerBinding / ClusterTriggerBinding name reference
name: string;
kind?: string;
// TriggerBinding / ClusterTriggerBinding reference
kind: string;
// Ref is used since Tekton Triggers 0.5 (part of OpenShift Pipeline Operator 1.1)
ref: string;
// We also support older operators, so need to show & save the old field as well.
// https://github.com/tektoncd/triggers/pull/603/files
// https://github.com/tektoncd/triggers/releases/tag/v0.5.0 and
// https://github.com/tektoncd/triggers/releases/tag/v0.6.0
/** @deprecated use ref instead */
name?: string;
};

export type EventListenerKindTrigger = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,9 @@ export const getEventListenerTriggerBindingNames = (
): ResourceModelLink[] =>
bindings?.map((binding) => ({
model: getResourceModelFromBindingKind(binding.kind),
name: binding.name,
// Ref is used since Tekton Triggers 0.5 (OpenShift Pipeline Operator 1.1)
// We keep the fallback to name here to support also OpenShift Pipeline Operator 1.0.
name: binding.ref || binding.name,
}));

export const getTriggerTemplatePipelineName = (triggerTemplate: TriggerTemplateKind): string => {
Expand Down

0 comments on commit 1fb87f6

Please sign in to comment.