Skip to content

Commit 0adc571

Browse files
dibyomtekton-robot
authored andcommitted
Adds support for name/value embedded Bindings
This commit adds support for a more concise syntax for TriggerBindings embedded in a Trigger or EventListener: NEW SYNTAX: ``` bindings: - ref: some-name - name: commit_id # embedded binding value: "$(body.head_commit_id) ``` OLD SYNTAX ``` bindings: - name: some-name spec: params: - name: commit_id # embedded binding value: "$(body.head_commit_id) ``` The old embedded syntax is deprecated and Triggers will convert any old style embedded bindings to the new syntax via the MutatingAdmissionWebhook. BREAKING CHANGE: With this change, users cannot specify both `name` and `ref` for a single binding. Use `ref` to refer to a TriggerBinding resource and `name` for embedded bindings. Fixes #617 Signed-off-by: Dibyo Mukherjee <dibyo@google.com>
1 parent cb18793 commit 0adc571

16 files changed

+533
-413
lines changed

cmd/binding-eval/cmd/root.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,14 @@ func evalBinding(w io.Writer, bindingPath, httpPath string) error {
7777
return fmt.Errorf("error reading bindings: %w", err)
7878
}
7979

80+
bindingParams := []v1alpha1.Param{}
81+
for _, b := range bindings {
82+
bindingParams = append(bindingParams, b.Spec.Params...)
83+
}
8084
t := template.ResolvedTrigger{
81-
TriggerBindings: bindings,
85+
BindingParams: bindingParams,
8286
}
87+
8388
params, err := template.ResolveParams(t, body, r.Header)
8489
if err != nil {
8590
return fmt.Errorf("error resolving params: %w", err)

cmd/binding-eval/cmd/root_test.go

-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
// +build e2e
2-
31
/*
42
Copyright 2020 The Tekton Authors
53

cmd/triggerrun/cmd/root_test.go

+2-12
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
// +build e2e
2-
31
/*
42
Copyright 2020 The Tekton Authors
53
@@ -215,22 +213,14 @@ func Test_processTriggerSpec(t *testing.T) {
215213
name: "testing-name",
216214
args: args{
217215
t: &v1alpha1.Trigger{
218-
TypeMeta: metav1.TypeMeta{
219-
Kind: "TriggerRun",
220-
APIVersion: "tekton.dev/v1alpha1"},
221216
ObjectMeta: metav1.ObjectMeta{
222217
Name: "my-triggerRun",
223218
},
224219
Spec: v1alpha1.TriggerSpec{
225-
Bindings: []*v1alpha1.TriggerSpecBinding{
226-
{Ref: "git-event-binding"}, // These should be references to TriggerBindings defined below
227-
},
228-
Template: v1alpha1.TriggerSpecTemplate{
229-
Name: "simple-pipeline-template", // This should be a reference to a TriggerTemplate defined below
230-
},
220+
Bindings: []*v1alpha1.TriggerSpecBinding{{Ref: "git-event-binding"}}, // These should be references to TriggerBindings defined below
221+
Template: v1alpha1.TriggerSpecTemplate{Name: "simple-pipeline-template"}, // This should be a reference to a TriggerTemplate defined below
231222
},
232223
},
233-
234224
request: r,
235225
event: eventBody,
236226
resources: test.Resources{

docs/eventlisteners.md

+30-20
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,32 @@ and apply them to [TriggerTemplates](./triggertemplates.md) in order to create
1414
Tekton resources. In addition, EventListeners allow lightweight event processing
1515
using [Event Interceptors](#Interceptors).
1616

17-
- [Syntax](#syntax)
18-
- [ServiceAccountName](#serviceAccountName)
19-
- [Replicas](#replicas)
20-
- [PodTemplate](#podTemplate)
21-
- [Triggers](#triggers)
22-
- [Interceptors](#interceptors)
23-
- [Logging](#logging)
24-
- [Labels](#labels)
25-
- [Annotations](#annotations)
26-
- [EventListener Response](#eventlistener-response)
27-
- [How does the EventListener work?](#how-does-the-eventlistener-work)
28-
- [Examples](#examples)
29-
- [Multi-Tenant Concerns](#multi-tenant-concerns)
17+
- [EventListener](#eventlistener)
18+
- [Syntax](#syntax)
19+
- [ServiceAccountName](#serviceaccountname)
20+
- [Triggers](#triggers)
21+
- [ServiceType](#servicetype)
22+
- [Replicas](#replicas)
23+
- [PodTemplate](#podtemplate)
24+
- [Resources](#resources)
25+
- [Logging](#logging)
26+
- [Labels](#labels)
27+
- [Annotations](#annotations)
28+
- [Interceptors](#interceptors)
29+
- [Webhook Interceptors](#webhook-interceptors)
30+
- [Event Interceptor Services](#event-interceptor-services)
31+
- [GitHub Interceptors](#github-interceptors)
32+
- [GitLab Interceptors](#gitlab-interceptors)
33+
- [Bitbucket Interceptors](#bitbucket-interceptors)
34+
- [CEL Interceptors](#cel-interceptors)
35+
- [Overlays](#overlays)
36+
- [EventListener Response](#eventlistener-response)
37+
- [How does the EventListener work?](#how-does-the-eventlistener-work)
38+
- [Examples](#examples)
39+
- [Multi-Tenant Concerns](#multi-tenant-concerns)
40+
- [Multiple EventListeners (One EventListener Per Namespace)](#multiple-eventlisteners-one-eventlistener-per-namespace)
41+
- [Multiple EventListeners (Multiple EventListeners per Namespace)](#multiple-eventlisteners-multiple-eventlisteners-per-namespace)
42+
- [ServiceAccount per EventListenerTrigger](#serviceaccount-per-eventlistenertrigger)
3043

3144
## Syntax
3245

@@ -102,7 +115,7 @@ The `triggers` field is required. Each EventListener can consist of one or more
102115
- `name` - (Optional) a valid
103116
[Kubernetes name](https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#syntax-and-character-set)
104117
- [`interceptors`](#interceptors) - (Optional) list of interceptors to use
105-
- `bindings` - (Optional) A list of `TriggerBindings` reference to use or embedded TriggerBindingsSpecs to use.
118+
- `bindings` - (Optional) A list of bindings to use. Can either be a reference to existing `TriggerBinding` resources or embedded name/value pairs.
106119
- `template` - (Optional) The name of `TriggerTemplate` to use
107120
- `triggerRef` - (Optional) Reference to the [`Trigger`](./triggers.md).
108121

@@ -115,12 +128,9 @@ triggers:
115128
- github:
116129
eventTypes: ["pull_request"]
117130
bindings:
118-
- ref: pipeline-binding
119-
- name: message-binding
120-
spec:
121-
params:
122-
- name: message
123-
value: Hello from the Triggers EventListener!
131+
- ref: pipeline-binding # Reference to a TriggerBinding object
132+
- name: message # Embedded Binding
133+
value: Hello from the Triggers EventListener!
124134
template:
125135
name: pipeline-template
126136
```

docs/triggers.md

+3-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ weight: 9
88

99
A `Trigger` is resource that combines `TriggerTemplate`, `TriggerBindings` and `interceptors`. The `Trigger` is processed by EventListener which referenced it when it receives an incoming.
1010

11-
- [Syntax](#syntax)
11+
- [Triggers](#triggers)
12+
- [Syntax](#syntax)
1213

1314
## Syntax
1415

@@ -24,7 +25,7 @@ the following fields:
2425
`Trigger` resource object, for example a `name`.
2526
- [`spec`][kubernetes-overview] - Specifies the configuration information for
2627
your Trigger resource object. The spec include:
27-
- [`bindings`] - A list of `TriggerBindings` reference to use or embedded TriggerBindingsSpecs to use
28+
- [`bindings`] - (Optional) A list of bindings to use. Can either be a reference to existing `TriggerBinding` resources or embedded name/value pairs.
2829
- [`template`] - The name of `TriggerTemplate` to use
2930
- [`interceptors`](./eventlisteners.md#interceptors) - (Optional) list of interceptors to use
3031
- [`serviceAccountName`] - (Optional) Specifies the ServiceAccount provided to EventListener by Trigger to create resources

examples/gitlab/gitlab-push-listener.yaml

+4-12
Original file line numberDiff line numberDiff line change
@@ -34,17 +34,6 @@ spec:
3434
value: $(tt.params.gitrepositoryurl)
3535
---
3636
apiVersion: triggers.tekton.dev/v1alpha1
37-
kind: TriggerBinding
38-
metadata:
39-
name: gitlab-push-binding
40-
spec:
41-
params:
42-
- name: gitrevision
43-
value: $(body.checkout_sha)
44-
- name: gitrepositoryurl
45-
value: $(body.repository.git_http_url)
46-
---
47-
apiVersion: triggers.tekton.dev/v1alpha1
4837
kind: EventListener
4938
metadata:
5039
name: gitlab-listener
@@ -60,6 +49,9 @@ spec:
6049
eventTypes:
6150
- Push Hook # Only push events
6251
bindings:
63-
- ref: gitlab-push-binding
52+
- name: gitrevision
53+
value: $(body.checkout_sha)
54+
- name: gitrepositoryurl
55+
value: $(body.repository.git_http_url)
6456
template:
6557
name: gitlab-echo-template

pkg/apis/triggers/v1alpha1/trigger_defaults.go

+21-3
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,34 @@ package v1alpha1
1818

1919
import (
2020
"context"
21+
22+
"knative.dev/pkg/ptr"
2123
)
2224

2325
type triggerSpecBindingArray []*TriggerSpecBinding
2426

2527
// SetDefaults sets the defaults on the object.
2628
func (t *Trigger) SetDefaults(ctx context.Context) {
27-
if IsUpgradeViaDefaulting(ctx) {
28-
// set defaults
29-
triggerSpecBindingArray(t.Spec.Bindings).defaultBindings()
29+
if !IsUpgradeViaDefaulting(ctx) {
30+
return
31+
}
32+
triggerSpecBindingArray(t.Spec.Bindings).defaultBindings()
33+
34+
// Upgrade old style embedded bindings to new concise syntax
35+
bindings := []*TriggerSpecBinding{}
36+
for _, b := range t.Spec.Bindings {
37+
if b.Spec == nil {
38+
bindings = append(bindings, b)
39+
} else {
40+
for _, p := range b.Spec.Params {
41+
bindings = append(bindings, &TriggerSpecBinding{
42+
Name: p.Name,
43+
Value: ptr.String(p.Value),
44+
})
45+
}
46+
}
3047
}
48+
t.Spec.Bindings = bindings
3149
}
3250

3351
// set default TriggerBinding kind for Bindings in TriggerSpec

pkg/apis/triggers/v1alpha1/trigger_defaults_test.go

+72-27
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222

2323
"github.com/google/go-cmp/cmp"
2424
"github.com/tektoncd/triggers/pkg/apis/triggers/v1alpha1"
25+
"knative.dev/pkg/ptr"
2526
)
2627

2728
func TestTriggerSetDefaults(t *testing.T) {
@@ -31,41 +32,85 @@ func TestTriggerSetDefaults(t *testing.T) {
3132
want *v1alpha1.Trigger
3233
wc func(context.Context) context.Context
3334
}{{
34-
name: "default binding",
35+
name: "default binding kind",
3536
in: &v1alpha1.Trigger{
3637
Spec: v1alpha1.TriggerSpec{
37-
Bindings: []*v1alpha1.TriggerSpecBinding{
38-
{
39-
Ref: "binding",
40-
},
41-
{
42-
Kind: v1alpha1.NamespacedTriggerBindingKind,
43-
Ref: "namespace-binding",
44-
},
45-
{
46-
Kind: v1alpha1.ClusterTriggerBindingKind,
47-
Ref: "cluster-binding",
48-
},
49-
},
38+
Bindings: []*v1alpha1.TriggerSpecBinding{{
39+
Ref: "binding",
40+
}, {
41+
Kind: v1alpha1.NamespacedTriggerBindingKind,
42+
Ref: "namespace-binding",
43+
}, {
44+
Kind: v1alpha1.ClusterTriggerBindingKind,
45+
Ref: "cluster-binding",
46+
}},
5047
},
5148
},
5249
wc: v1alpha1.WithUpgradeViaDefaulting,
5350
want: &v1alpha1.Trigger{
5451
Spec: v1alpha1.TriggerSpec{
55-
Bindings: []*v1alpha1.TriggerSpecBinding{
56-
{
57-
Kind: v1alpha1.NamespacedTriggerBindingKind,
58-
Ref: "binding",
59-
},
60-
{
61-
Kind: v1alpha1.NamespacedTriggerBindingKind,
62-
Ref: "namespace-binding",
63-
},
64-
{
65-
Kind: v1alpha1.ClusterTriggerBindingKind,
66-
Ref: "cluster-binding",
52+
Bindings: []*v1alpha1.TriggerSpecBinding{{
53+
Kind: v1alpha1.NamespacedTriggerBindingKind,
54+
Ref: "binding",
55+
}, {
56+
Kind: v1alpha1.NamespacedTriggerBindingKind,
57+
Ref: "namespace-binding",
58+
}, {
59+
Kind: v1alpha1.ClusterTriggerBindingKind,
60+
Ref: "cluster-binding",
61+
}},
62+
},
63+
},
64+
}, {
65+
name: "default old embed binding to new",
66+
in: &v1alpha1.Trigger{
67+
Spec: v1alpha1.TriggerSpec{
68+
Bindings: []*v1alpha1.TriggerSpecBinding{{
69+
Kind: v1alpha1.NamespacedTriggerBindingKind,
70+
Ref: "binding",
71+
}, {
72+
Kind: v1alpha1.NamespacedTriggerBindingKind,
73+
Spec: &v1alpha1.TriggerBindingSpec{
74+
Params: []v1alpha1.Param{{
75+
Name: "p1",
76+
Value: "v1",
77+
}, {
78+
Name: "p2",
79+
Value: "v2",
80+
}},
6781
},
68-
},
82+
}},
83+
},
84+
},
85+
wc: v1alpha1.WithUpgradeViaDefaulting,
86+
want: &v1alpha1.Trigger{
87+
Spec: v1alpha1.TriggerSpec{
88+
Bindings: []*v1alpha1.TriggerSpecBinding{{
89+
Kind: v1alpha1.NamespacedTriggerBindingKind,
90+
Ref: "binding",
91+
}, {
92+
Name: "p1",
93+
Value: ptr.String("v1"),
94+
}, {
95+
Name: "p2",
96+
Value: ptr.String("v2"),
97+
}},
98+
},
99+
},
100+
}, {
101+
name: "upgrade context not set",
102+
in: &v1alpha1.Trigger{
103+
Spec: v1alpha1.TriggerSpec{
104+
Bindings: []*v1alpha1.TriggerSpecBinding{{
105+
Ref: "binding",
106+
}},
107+
},
108+
},
109+
want: &v1alpha1.Trigger{
110+
Spec: v1alpha1.TriggerSpec{
111+
Bindings: []*v1alpha1.TriggerSpecBinding{{
112+
Ref: "binding", // If upgrade context was set, Kind should have been added
113+
}},
69114
},
70115
},
71116
}}

pkg/apis/triggers/v1alpha1/trigger_types.go

+21-5
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,27 @@ type TriggerSpecTemplate struct {
4444
}
4545

4646
type TriggerSpecBinding struct {
47-
Name string `json:"name,omitempty"`
48-
Kind TriggerBindingKind `json:"kind,omitempty"`
49-
Ref string `json:"ref,omitempty"`
50-
Spec *TriggerBindingSpec `json:"spec,omitempty"`
51-
APIVersion string `json:"apiversion,omitempty"`
47+
// Name is the name of the binding param
48+
// Mutually exclusive with Ref
49+
Name string `json:"name,omitempty"`
50+
// Value is the value of the binding param. Can contain JSONPath
51+
// Has to be pointer since "" is a valid value
52+
// Required if Name is also specified.
53+
Value *string `json:"value,omitempty"`
54+
55+
// Ref is a reference to a TriggerBinding kind.
56+
// Mutually exclusive with Name
57+
Ref string `json:"ref,omitempty"`
58+
59+
// Kind can only be provided if Ref is also provided. Defaults to TriggerBinding
60+
Kind TriggerBindingKind `json:"kind,omitempty"`
61+
62+
// Spec is the deprecated way of embedding TriggerBindings.
63+
// TODO(#782): Remove deprecated syntax.
64+
Spec *TriggerBindingSpec `json:"spec,omitempty"`
65+
66+
// APIVersion of the binding ref
67+
APIVersion string `json:"apiversion,omitempty"`
5268
}
5369

5470
// +genclient

0 commit comments

Comments
 (0)