web: Enable custom metadata for Service resources

Being able to add custom annotations and labels to generated resources
helps to make the generated Zuul clusters more turnkey.  For example,
in clusters where Ambassador Edge stack is being employed, ingress
configuration may be provided by a custom config annotation on the
underlying resources.

This change introduces annotation and label templates in such a way as
to make this functionality more extensible later (eg: they exist in a
template -> service sub-property of the respective configuration
objects) so as to make it easier to apply similar behaviour later to
other resource types.  The functionality applies to all existing
services (executor, web, fingergw, and preview).

Change-Id: I202f01caa8f35d93d8ffa06931e476be330c8f48
This commit is contained in:
Michael Kelly 2022-11-03 16:32:02 -07:00
parent 974aa34b0c
commit 70cc519fec
No known key found for this signature in database
GPG Key ID: 77F7FE93040ECF3E
5 changed files with 282 additions and 6 deletions

View File

@ -101,6 +101,21 @@ spec:
type: integer
default: 21600
minimum: 0
template:
type: object
properties:
service:
type: object
properties:
metadata:
type: object
properties:
labels:
x-kubernetes-preserve-unknown-fields: true
type: object
annotations:
x-kubernetes-preserve-unknown-fields: true
type: object
merger:
type: object
properties:
@ -118,12 +133,42 @@ spec:
default: 1
status_url:
type: string
template:
type: object
properties:
service:
type: object
properties:
metadata:
type: object
properties:
labels:
x-kubernetes-preserve-unknown-fields: true
type: object
annotations:
x-kubernetes-preserve-unknown-fields: true
type: object
fingergw:
type: object
properties:
count:
type: integer
default: 1
template:
type: object
properties:
service:
type: object
properties:
metadata:
type: object
properties:
labels:
x-kubernetes-preserve-unknown-fields: true
type: object
annotations:
x-kubernetes-preserve-unknown-fields: true
type: object
connections:
type: object
x-kubernetes-preserve-unknown-fields: true
@ -161,6 +206,21 @@ spec:
count:
type: integer
default: 0
template:
type: object
properties:
service:
type: object
properties:
metadata:
type: object
properties:
labels:
x-kubernetes-preserve-unknown-fields: true
type: object
annotations:
x-kubernetes-preserve-unknown-fields: true
type: object
registry:
type: object
properties:

View File

@ -439,6 +439,26 @@ verbatim):
The key name in the secret should be ``sshkey``.
.. attr:: template
Template for generated resources
.. attr:: service
Template to apply to service resource
.. attr:: metadata
Template metadata to apply
.. attr:: labels
Key-Value pairs of labels to be applied
.. attr:: annotations
Key-Value pairs of labels to be applied
.. attr:: terminationGracePeriodSeconds
:default: 21600
@ -466,6 +486,26 @@ verbatim):
How many Zuul webservers to manage. This is a required
component and should be at least 1.
.. attr:: template
Template for generated resources
.. attr:: service
Template to apply to service resource
.. attr:: metadata
Template metadata to apply
.. attr:: labels
Key-Value pairs of labels to be applied
.. attr:: annotations
Key-Value pairs of labels to be applied
.. attr:: fingergw
.. attr:: count
@ -473,6 +513,26 @@ verbatim):
How many Zuul finger gateway servers to manage.
.. attr:: template
Template for generated resources
.. attr:: service
Template to apply to service resource
.. attr:: metadata
Template metadata to apply
.. attr:: labels
Key-Value pairs of labels to be applied
.. attr:: annotations
Key-Value pairs of labels to be applied
.. attr:: connections
This is a mapping designed to match the `connections` entries
@ -617,6 +677,26 @@ verbatim):
How many Zuul Preview servers to manage.
.. attr:: template
Template for generated resources
.. attr:: service
Template to apply to service resource
.. attr:: metadata
Template metadata to apply
.. attr:: labels
Key-Value pairs of labels to be applied
.. attr:: annotations
Key-Value pairs of labels to be applied
.. attr:: registry
.. attr:: count

View File

@ -101,6 +101,21 @@ spec:
type: integer
default: 21600
minimum: 0
template:
type: object
properties:
service:
type: object
properties:
metadata:
type: object
properties:
labels:
x-kubernetes-preserve-unknown-fields: true
type: object
annotations:
x-kubernetes-preserve-unknown-fields: true
type: object
merger:
type: object
properties:
@ -118,12 +133,42 @@ spec:
default: 1
status_url:
type: string
template:
type: object
properties:
service:
type: object
properties:
metadata:
type: object
properties:
labels:
x-kubernetes-preserve-unknown-fields: true
type: object
annotations:
x-kubernetes-preserve-unknown-fields: true
type: object
fingergw:
type: object
properties:
count:
type: integer
default: 1
template:
type: object
properties:
service:
type: object
properties:
metadata:
type: object
properties:
labels:
x-kubernetes-preserve-unknown-fields: true
type: object
annotations:
x-kubernetes-preserve-unknown-fields: true
type: object
connections:
type: object
x-kubernetes-preserve-unknown-fields: true
@ -161,6 +206,21 @@ spec:
count:
type: integer
default: 0
template:
type: object
properties:
service:
type: object
properties:
metadata:
type: object
properties:
labels:
x-kubernetes-preserve-unknown-fields: true
type: object
annotations:
x-kubernetes-preserve-unknown-fields: true
type: object
registry:
type: object
properties:

View File

@ -32,6 +32,20 @@ metadata:
app.kubernetes.io/instance: {{ instance_name }}
app.kubernetes.io/part-of: zuul
app.kubernetes.io/component: zuul-executor
{%- for name, value in spec.executor.template.service.metadata.labels.items() %}
{{ name }}: {{ value }}
{%- endfor %}
{%- if spec.executor.template.service.metadata.annotations %}
annotations:
{%- for name, value in spec.executor.template.service.metadata.annotations.items() %}
{%- if '\n' in value %}
{{ name }}: |
{{ value | indent(6) }}
{%- else %}
{{ name }}: {{ value }}
{%- endif %}
{%- endfor %}
{%- endif %}
spec:
type: ClusterIP
clusterIP: None
@ -55,6 +69,20 @@ metadata:
app.kubernetes.io/instance: {{ instance_name }}
app.kubernetes.io/part-of: zuul
app.kubernetes.io/component: zuul-web
{%- for name, value in spec.web.template.service.metadata.labels.items() %}
{{ name }}: {{ value }}
{%- endfor %}
{%- if spec.web.template.service.metadata.annotations %}
annotations:
{%- for name, value in spec.web.template.service.metadata.annotations.items() %}
{%- if '\n' in value %}
{{ name }}: |
{{ value | indent(6) }}
{%- else %}
{{ name }}: {{ value }}
{%- endif %}
{%- endfor %}
{%- endif %}
spec:
type: NodePort
ports:
@ -77,6 +105,20 @@ metadata:
app.kubernetes.io/instance: {{ instance_name }}
app.kubernetes.io/part-of: zuul
app.kubernetes.io/component: zuul-fingergw
{%- for name, value in spec.fingergw.template.service.metadata.labels.items() %}
{{ name }}: {{ value }}
{%- endfor %}
{%- if spec.fingergw.template.service.metadata.annotations %}
annotations:
{%- for name, value in spec.fingergw.template.service.metadata.annotations.items() %}
{%- if '\n' in value %}
{{ name }}: |
{{ value | indent(6) }}
{%- else %}
{{ name }}: {{ value }}
{%- endif %}
{%- endfor %}
{%- endif %}
spec:
type: NodePort
ports:
@ -444,6 +486,20 @@ metadata:
app.kubernetes.io/instance: {{ instance_name }}
app.kubernetes.io/part-of: zuul
app.kubernetes.io/component: zuul-preview
{%- for name, value in spec.preview.template.service.metadata.labels.items() %}
{{ name }}: {{ value }}
{%- endfor %}
{%- if spec.preview.template.service.metadata.annotations %}
annotations:
{%- for name, value in spec.preview.template.service.metadata.annotations.items() %}
{%- if '\n' in value %}
{{ name }}: |
{{ value | indent(6) }}
{%- else %}
{{ name }}: {{ value }}
{%- endif %}
{%- endfor %}
{%- endif %}
spec:
type: NodePort
ports:

View File

@ -28,6 +28,14 @@ from . import pxc
from . import zookeeper
def add_template_properties(spec):
template = spec.setdefault('template', {})
service_template = template.setdefault('service', {})
service_metadata = service_template.setdefault('metadata', {})
service_metadata.setdefault('labels', {})
service_metadata.setdefault('annotations', {})
class Zuul:
def __init__(self, namespace, name, logger, spec, zuul_image_version):
self.api = pykube.HTTPClient(pykube.KubeConfig.from_env())
@ -70,13 +78,25 @@ class Zuul:
'/etc/zuul/tenant/main.yaml'
self.spec.setdefault('scheduler', {}).setdefault(
'storageClassName', '')
self.spec.setdefault('executor', {}).setdefault('count', 1)
self.spec.setdefault('executor', {}).setdefault(
'terminationGracePeriodSeconds', 21600)
executor = self.spec.setdefault('executor', {})
executor.setdefault('count', 1)
executor.setdefault('terminationGracePeriodSeconds', 21600)
add_template_properties(executor)
self.spec.setdefault('merger', {}).setdefault('count', 0)
self.spec.setdefault('web', {}).setdefault('count', 1)
self.spec.setdefault('fingergw', {}).setdefault('count', 1)
self.spec.setdefault('preview', {}).setdefault('count', 0)
web = self.spec.setdefault('web', {})
web.setdefault('count', 1)
add_template_properties(web)
fingergw = self.spec.setdefault('fingergw', {})
fingergw.setdefault('count', 1)
add_template_properties(fingergw)
registry = self.spec.setdefault('preview', {})
registry.setdefault('count', 0)
add_template_properties(registry)
registry = self.spec.setdefault('registry', {})
registry.setdefault('count', 0)
registry.setdefault('volumeSize', '80Gi')