Skip to content

Commit

Permalink
feature: add service port spec for el
Browse files Browse the repository at this point in the history
add the ability to specify the service port for a eventlistener
service. Default TLS Port 8443 is not set when service port is
specified by the user.

Signed-off-by: Vibhav Bobade <vibhav.bobde@gmail.com>
  • Loading branch information
waveywaves committed Dec 10, 2021
1 parent d360e8f commit cbd349f
Show file tree
Hide file tree
Showing 7 changed files with 107 additions and 7 deletions.
14 changes: 14 additions & 0 deletions docs/eventlisteners.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ or more [`Interceptors`](./interceptors.md).
- [Specifying `TriggerGroups`](#specifying-triggergroups)
- [Specifying `Resources`](#specifying-resources)
- [Specifying a `kubernetesResource` object](#specifying-a-kubernetesresource-object)
- [Specifying `Service` configuration](#specifying-service-configuration)
- [Specifying `Replicas`](#specifying-replicas)
- [Specifying a `CustomResource` object](#specifying-a-customresource-object)
- [Contract for the `CustomResource` object](#contract-for-the-customresource-object)
Expand Down Expand Up @@ -282,6 +283,7 @@ spec:
resources:
kubernetesResource:
serviceType: NodePort
servicePort: 80
spec:
template:
metadata:
Expand All @@ -300,6 +302,18 @@ spec:
effect: NoSchedule
```

#### Specifying `Service` configuration

The type and port for the `Service` created for the `EventListener` can be configured via the `ServiceType` and `ServicePort`
specifications respectively. By default, the `Service` type is set to `ClusterIP` and port is set to `8080`.
```yaml
spec:
resources:
kubernetesResource:
serviceType: LoadBalancer
servicePort: 8128
```

#### Specifying `Replicas`

You can optionally use the `replicas` field to instruct Tekton Triggers to deploy more than one instance of your `EventListener` in individual Kubernetes Pods.
Expand Down
18 changes: 18 additions & 0 deletions examples/v1beta1/eventlisteners/eventlistener-serviceconfig.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
apiVersion: triggers.tekton.dev/v1beta1
kind: EventListener
metadata:
name: listener-serviceconfig
spec:
serviceAccountName: tekton-triggers-example-sa
triggers:
- name: foo-trig
bindings:
- ref: pipeline-binding
- ref: message-binding
template:
ref: pipeline-template
resources:
kubernetesResource:
serviceType: LoadBalancer
servicePort: 5050
1 change: 1 addition & 0 deletions pkg/apis/triggers/v1beta1/event_listener_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ type CustomResource struct {
type KubernetesResource struct {
Replicas *int32 `json:"replicas,omitempty"`
ServiceType corev1.ServiceType `json:"serviceType,omitempty"`
ServicePort *int32 `json:"servicePort,omitempty"`
duckv1.WithPodSpec `json:"spec,omitempty"`
}

Expand Down
5 changes: 5 additions & 0 deletions pkg/apis/triggers/v1beta1/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 13 additions & 0 deletions pkg/reconciler/eventlistener/resources/common_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,3 +87,16 @@ func withTLSPort(el *v1beta1.EventListener) {
c.Port = &x
})))
}

func withServiceTypeLoadBalancer(el *v1beta1.EventListener) {
el.Spec.Resources.KubernetesResource = &v1beta1.KubernetesResource{
ServiceType: "LoadBalancer",
}
}

func withServicePort80(el *v1beta1.EventListener) {
port := int32(80)
el.Spec.Resources.KubernetesResource = &v1beta1.KubernetesResource{
ServicePort: &port,
}
}
11 changes: 9 additions & 2 deletions pkg/reconciler/eventlistener/resources/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,12 +50,19 @@ var metricsPort = corev1.ServicePort{

func MakeService(ctx context.Context, el *v1beta1.EventListener, c Config) *corev1.Service {
// for backward compatibility with original behavior
var serviceType corev1.ServiceType
var (
serviceType corev1.ServiceType
servicePort corev1.ServicePort
)
if el.Spec.Resources.KubernetesResource != nil && el.Spec.Resources.KubernetesResource.ServiceType != "" {
serviceType = el.Spec.Resources.KubernetesResource.ServiceType
}
if el.Spec.Resources.KubernetesResource != nil && el.Spec.Resources.KubernetesResource.ServicePort != nil {
port := int(*el.Spec.Resources.KubernetesResource.ServicePort)
c.Port = &port
}

servicePort := ServicePort(el, c)
servicePort = ServicePort(el, c)

return &corev1.Service{
ObjectMeta: ObjectMeta(el, FilterLabels(ctx, el.Labels), c.StaticResourceLabels),
Expand Down
52 changes: 47 additions & 5 deletions pkg/reconciler/eventlistener/resources/service_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,11 +68,7 @@ func TestService(t *testing.T) {
},
}, {
name: "EventListener with type: LoadBalancer",
el: makeEL(func(el *v1beta1.EventListener) {
el.Spec.Resources.KubernetesResource = &v1beta1.KubernetesResource{
ServiceType: "LoadBalancer",
}
}, withStatus),
el: makeEL(withServiceTypeLoadBalancer, withStatus),
want: &corev1.Service{
ObjectMeta: metav1.ObjectMeta{
Name: generatedResourceName,
Expand Down Expand Up @@ -100,6 +96,35 @@ func TestService(t *testing.T) {
"eventlistener": eventListenerName,
},
},
}}, {
name: "EventListener with service port: 80",
el: makeEL(withServicePort80, withStatus),
want: &corev1.Service{
ObjectMeta: metav1.ObjectMeta{
Name: generatedResourceName,
Namespace: namespace,
Labels: map[string]string{
"app.kubernetes.io/managed-by": "EventListener",
"app.kubernetes.io/part-of": "Triggers",
"eventlistener": eventListenerName,
},
OwnerReferences: []metav1.OwnerReference{*kmeta.NewControllerRef(makeEL())},
},
Spec: corev1.ServiceSpec{
Ports: []corev1.ServicePort{{
Name: eventListenerServicePortName,
Protocol: corev1.ProtocolTCP,
Port: int32(80),
TargetPort: intstr.IntOrString{
IntVal: int32(eventListenerContainerPort),
},
}, metricsPort},
Selector: map[string]string{
"app.kubernetes.io/managed-by": "EventListener",
"app.kubernetes.io/part-of": "Triggers",
"eventlistener": eventListenerName,
},
},
}}}

for _, tt := range tests {
Expand All @@ -118,6 +143,7 @@ func TestServicePort(t *testing.T) {
el *v1beta1.EventListener
config Config
expectedServicePort corev1.ServicePort
expectedServiceType corev1.ServiceType
}{{
name: "EventListener with status",
el: makeEL(withStatus),
Expand Down Expand Up @@ -174,6 +200,22 @@ func TestServicePort(t *testing.T) {
IntVal: int32(eventListenerContainerPort),
},
},
}, {
name: "EventListener with ServicePort: 80",
el: makeEL(withStatus, withServicePort80),
config: *MakeConfig(func(d *Config) {
p := 80
d.Port = &p
}),
expectedServicePort: corev1.ServicePort{
Name: eventListenerServicePortName,
Protocol: corev1.ProtocolTCP,
Port: int32(80),
TargetPort: intstr.IntOrString{
IntVal: int32(eventListenerContainerPort),
},
},
expectedServiceType: "LoadBalancer",
}}

for _, tt := range tests {
Expand Down

0 comments on commit cbd349f

Please # to comment.