feat(common): Release v2.4.0 (#245)

Signed-off-by: Christopher Larivière <lariviere.c@gmail.com>
Co-authored-by: Christopher Larivière <lariviere.c@gmail.com>
Co-authored-by: Markus Reiter <me@reitermark.us>
This commit is contained in:
Bernd Schorgers 2023-12-10 09:56:08 +01:00 committed by GitHub
parent 44b1665b61
commit 3d3028b889
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
30 changed files with 364 additions and 61 deletions

View file

@ -4,7 +4,7 @@ controllers:
main:
image:
repository: ghcr.io/mendhak/http-https-echo
tag: 30
tag: 31
pullPolicy: IfNotPresent
env:
@ -25,7 +25,7 @@ controllers:
- third-container
image:
repository: ghcr.io/mendhak/http-https-echo
tag: 30
tag: 31
env:
HTTP_PORT: 8888
HTTPS_PORT: 9998
@ -34,7 +34,7 @@ controllers:
dependsOn: main
image:
repository: ghcr.io/mendhak/http-https-echo
tag: 30
tag: 31
second-controller:
type: deployment
@ -42,7 +42,7 @@ controllers:
main:
image:
repository: ghcr.io/mendhak/http-https-echo
tag: 30
tag: 31
pullPolicy: IfNotPresent
env:
HTTP_PORT: 8889

View file

@ -4,7 +4,7 @@ controllers:
main:
image:
repository: ghcr.io/mendhak/http-https-echo
tag: 30
tag: 31
pullPolicy: IfNotPresent
probes:

View file

@ -7,7 +7,7 @@ controllers:
main:
image:
repository: ghcr.io/mendhak/http-https-echo
tag: 30
tag: 31
pullPolicy: IfNotPresent
service:

View file

@ -4,7 +4,7 @@ controllers:
main:
image:
repository: ghcr.io/mendhak/http-https-echo
tag: 30
tag: 31
pullPolicy: IfNotPresent
service:

View file

@ -59,4 +59,5 @@ persistence:
type: persistentVolumeClaim
accessMode: ReadWriteOnce
size: 1Gi
mountPath: /config
globalMounts:
- path: /config

View file

@ -31,3 +31,17 @@ tests:
equal:
path: spec.template.spec.containers[0].image
value: ghcr.io/mendhak/http-https-echo:1.23
- it: template tag should pass
set:
controllers.main.containers.main.image:
repository: ghcr.io/mendhak/http-https-echo
tag: "{{.Chart.Version}}"
asserts:
- documentIndex: 0
isKind:
of: Deployment
- documentIndex: 0
equal:
path: spec.template.spec.containers[0].image
value: ghcr.io/mendhak/http-https-echo:1.0.0

View file

@ -37,13 +37,13 @@ tests:
second-container:
image:
repository: ghcr.io/mendhak/http-https-echo
tag: 30
tag: 31
second:
containers:
first-container:
image:
repository: ghcr.io/mendhak/http-https-echo
tag: 30
tag: 31
persistence:
data:
@ -268,7 +268,7 @@ tests:
second-container:
image:
repository: ghcr.io/mendhak/http-https-echo
tag: 30
tag: 31
asserts:
- documentIndex: &StatefulSetDoc 0
isKind:

View file

@ -0,0 +1,38 @@
---
# yaml-language-server: $schema=https://raw.githubusercontent.com/helm-unittest/helm-unittest/main/schema/helm-testsuite.json
suite: container workingDir override
templates:
- common.yaml
tests:
- it: default should pass
asserts:
- documentIndex: 0
isKind:
of: Deployment
- documentIndex: 0
notExists:
path: spec.template.spec.containers[0].workingDir
- it: string should pass
set:
controllers.main.containers.main.workingDir: /work
asserts:
- documentIndex: 0
isKind:
of: Deployment
- documentIndex: 0
equal:
path: spec.template.spec.containers[0].workingDir
value: /work
- it: quoted string should pass
set:
controllers.main.containers.main.workingDir: "/work"
asserts:
- documentIndex: 0
isKind:
of: Deployment
- documentIndex: 0
equal:
path: spec.template.spec.containers[0].workingDir
value: /work

View file

@ -26,7 +26,7 @@ tests:
main:
image:
repository: ghcr.io/mendhak/http-https-echo
tag: 30
tag: 31
asserts:
- hasDocuments:
count: 3
@ -62,7 +62,7 @@ tests:
main:
image:
repository: ghcr.io/mendhak/http-https-echo
tag: 30
tag: 31
asserts:
- hasDocuments:
count: 3

View file

@ -38,13 +38,13 @@ tests:
second-container:
image:
repository: ghcr.io/mendhak/http-https-echo
tag: 30
tag: 31
second:
containers:
first-container:
image:
repository: ghcr.io/mendhak/http-https-echo
tag: 30
tag: 31
persistence:
config:

View file

@ -1,6 +1,6 @@
---
# yaml-language-server: $schema=https://raw.githubusercontent.com/helm-unittest/helm-unittest/main/schema/helm-testsuite.json
suite: ingress service reference
suite: route service reference
templates:
- common.yaml
tests:
@ -11,6 +11,14 @@ tests:
parentRefs:
- name: parentName
namespace: parentNamespace
rules:
- backendRefs:
- group: ""
kind: Service
name: RELEASE-NAME
namespace: NAMESPACE
port: 8080
weight: 1
asserts:
- documentIndex: &HTTPRouteDocument 2
isKind:
@ -54,3 +62,55 @@ tests:
namespace: serviceNamespace
port: 1234
weight: 123
- it: custom service reference with filter should fail
set:
route.main:
enabled: true
parentRefs:
- name: parentName
namespace: parentNamespace
rules:
- backendRefs:
- group: test
name: pathService
port: 1234
namespace: serviceNamespace
weight: 123
filters:
- type: RequestRedirect
requestRedirect:
scheme: https
statusCode: 301
asserts:
- failedTemplate:
errorMessage: "backend refs and request redirect filters cannot co-exist."
- it: custom service with filter should pass
set:
route.main:
enabled: true
parentRefs:
- name: parentName
namespace: parentNamespace
rules:
- filters:
- type: RequestRedirect
requestRedirect:
scheme: https
statusCode: 301
asserts:
- documentIndex: &HTTPRouteDocument 2
isKind:
of: HTTPRoute
- documentIndex: *HTTPRouteDocument
equal:
path: spec.rules[0].filters[0]
value:
type: RequestRedirect
requestRedirect:
scheme: https
statusCode: 301
- documentIndex: *HTTPRouteDocument
notExists:
path: spec.rules[0].backendRefs[0]

View file

@ -73,6 +73,8 @@ tests:
- backendRefs:
- name: test
namespace: test
kind: Service
weight: 1
matches:
- path:
type: PathPrefix
@ -83,6 +85,8 @@ tests:
path:
type: ReplacePrefixMatch
replacePrefixMatch: ""
timeouts:
backendRequest: 30s
grpc:
enabled: true
kind: GRPCRoute
@ -93,6 +97,8 @@ tests:
- backendRefs:
- name: test
namespace: test
kind: Service
weight: 1
matches:
- path:
type: PathPrefix
@ -113,6 +119,8 @@ tests:
- backendRefs:
- name: test
namespace: test
kind: Service
weight: 1
matches:
- path:
type: PathPrefix
@ -133,6 +141,8 @@ tests:
- backendRefs:
- name: test
namespace: test
kind: Service
weight: 1
matches:
- path:
type: PathPrefix
@ -153,6 +163,8 @@ tests:
- backendRefs:
- name: test
namespace: test
kind: Service
weight: 1
matches:
- path:
type: PathPrefix
@ -229,6 +241,9 @@ tests:
- documentIndex: &HTTPRouteDocument 6
notExists:
path: spec.rules[0].filters
- documentIndex: &HTTPRouteDocument 6
notExists:
path: spec.rules[0].timeouts
- it: hostnames shouldn't be used for TCPRoutes and UDPRoutes
set:
@ -291,3 +306,49 @@ tests:
equal:
path: spec.parentRefs[0].sectionName
value: parentSection
- it: timeouts should only be used for HTTPRoutes
set:
route:
main:
enabled: true
kind: HTTPRoute
parentRefs:
- name: parentName
namespace: parentNamespace
rules:
- backendRefs:
- name: test
namespace: test
timeouts:
backendRequest: 30s
grpc:
enabled: true
kind: GRPCRoute
parentRefs:
- name: parentName
namespace: parentNamespace
rules:
- backendRefs:
- name: test
namespace: test
matches:
- path:
type: PathPrefix
value: /test
timeouts:
backendRequest: 10s
asserts:
- documentIndex: &HTTPRouteDocument 2
isKind:
of: GRPCRoute
- documentIndex: &HTTPRouteDocument 2
notExists:
path: spec.rules[0].timeouts.backendRequest
- documentIndex: &HTTPRouteDocument 3
isKind:
of: HTTPRoute
- documentIndex: &HTTPRouteDocument 3
equal:
path: spec.rules[0].timeouts.backendRequest
value: 30s

View file

@ -5,7 +5,7 @@ controllers:
main:
image:
repository: ghcr.io/mendhak/http-https-echo
tag: 30
tag: 31
pullPolicy: IfNotPresent
service:

View file

@ -3,7 +3,7 @@ apiVersion: v2
name: common
description: Function library for Helm charts
type: library
version: 2.3.0
version: 2.4.0
kubeVersion: ">=1.22.0-0"
keywords:
- common
@ -16,19 +16,30 @@ annotations:
artifacthub.io/changes: |-
- kind: added
description: |-
Add support for `appProtocol` in Kubernetes services.
Add support for `timeouts` in HTTPRoute.
- kind: added
description: |-
Add support for route filters for HTTPRoute and GRPCRoute.
- kind: added
description: |-
Add support `dataSource` and `dataSourceRef` fields in StatefulSet volumeClaimTemplates.
- kind: added
description: |-
Add support `dataSource` and `dataSourceRef` fields in persistentVolumeClaim persistence items.
Add support for `workingDir` for containers.
- kind: fixed
description: |-
GRPCRoute support for matches was not supported.
Defaulting image tags to chart.Appversion was removed without a proper alternative
- kind: fixed
description: |-
`valuefrom`-style environment variables can now use Helm templating again.
Using RequestRedirect is not allowed with BackendRefs in Routes.
- kind: fixed
description: |-
StatefulSet objects would not always fall back to proper defaults and error out
- kind: changed
description: |-
routes will no longer auto target its service.
It will need to be explicitly defined as below
```yaml
- backendRefs:
- group: ""
kind: Service
name: foo
namespace: foo-namespace
port: 8080
weight: 1
```

View file

@ -175,7 +175,7 @@ The following table contains an overview of available values and their descripti
| route.main.labels | object | `{}` | Provide additional labels which may be required. |
| route.main.nameOverride | string | `nil` | Override the name suffix that is used for this route. |
| route.main.parentRefs | list | `[{"group":"gateway.networking.k8s.io","kind":"Gateway","name":null,"namespace":null,"sectionName":null}]` | Configure the resource the route attaches to. |
| route.main.rules | list | `[{"backendRefs":[{"group":"","kind":"Service","name":"main","namespace":null,"port":null,"weight":1}],"filters":[],"matches":[{"path":{"type":"PathPrefix","value":"/"}}]}]` | Configure rules for routing. Defaults to the primary service. |
| route.main.rules | list | `[{"backendRefs":[{"group":"","kind":"Service","name":"main","namespace":null,"port":null,"weight":1}],"timeouts":{}"filters":[],"matches":[{"path":{"type":"PathPrefix","value":"/"}}]}]` | Configure rules for routing. Defaults to the primary service. |
| route.main.rules[0].backendRefs | list | `[{"group":"","kind":"Service","name":"main","namespace":null,"port":null,"weight":1}]` | Configure backends where matching requests should be sent. |
| secrets | object | See below | Use this to populate secrets with the values you specify. Be aware that these values are not encrypted by default, and could therefore visible to anybody with access to the values.yaml file. Additional Secrets can be added by adding a dictionary key similar to the 'secret' object. |
| secrets.secret.annotations | object | `{}` | Annotations to add to the Secret |

View file

@ -24,9 +24,6 @@ within the common library.
-}}
---
apiVersion: {{ $apiVersion }}
{{- if and (ne $routeKind "GRPCRoute") (ne $routeKind "HTTPRoute") (ne $routeKind "TCPRoute") (ne $routeKind "TLSRoute") (ne $routeKind "UDPRoute") }}
{{- fail (printf "Not a valid route kind (%s)" $routeKind) }}
{{- end }}
kind: {{ $routeKind }}
metadata:
name: {{ $routeObject.name }}
@ -79,5 +76,11 @@ spec:
{{- toYaml . | nindent 6 }}
{{- end }}
{{- end }}
{{- if (eq $routeKind "HTTPRoute") }}
{{- with .timeouts }}
timeouts:
{{- toYaml . | nindent 6 }}
{{- end }}
{{- end }}
{{- end }}
{{- end }}

View file

@ -29,10 +29,10 @@ metadata:
spec:
revisionHistoryLimit: {{ $statefulsetObject.revisionHistoryLimit }}
replicas: {{ $statefulsetObject.replicas }}
podManagementPolicy: {{ default "OrderedReady" $statefulsetObject.statefulset.podManagementPolicy }}
podManagementPolicy: {{ dig "statefulset" "podManagementPolicy" "OrderedReady" $statefulsetObject }}
updateStrategy:
type: {{ $statefulsetObject.strategy }}
{{- if and (eq $statefulsetObject.strategy "RollingUpdate") $statefulsetObject.rollingUpdate.partition }}
{{- if and (eq $statefulsetObject.strategy "RollingUpdate") (dig "rollingUpdate" "partition" nil $statefulsetObject) }}
rollingUpdate:
partition: {{ $statefulsetObject.rollingUpdate.partition }}
{{- end }}

View file

@ -17,6 +17,9 @@ command: {{ . | trim | nindent 2 }}
{{- end -}}
{{- with (include "bjw-s.common.lib.container.field.args" (dict "ctx" $ctx) | trim) }}
args: {{ . | trim | nindent 2 }}
{{- end -}}
{{- with $containerObject.workingDir }}
workingDir: {{ . | trim }}
{{- end -}}
{{- with $containerObject.securityContext }}
securityContext: {{ toYaml . | trim | nindent 2 }}

View file

@ -8,12 +8,18 @@ Convert container values to an object
{{- $_ := set $objectValues "identifier" $identifier -}}
{{- /* Convert float64 image tags to string */ -}}
{{- /* Process image tags */ -}}
{{- if kindIs "map" $objectValues.image -}}
{{- $imageTag := dig "image" "tag" "" $objectValues -}}
{{- /* Convert float64 image tags to string */ -}}
{{- if kindIs "float64" $imageTag -}}
{{- $_ := set $objectValues.image "tag" ($imageTag | toString) -}}
{{- $imageTag = $imageTag | toString -}}
{{- end -}}
{{- /* Process any templates in the tag */ -}}
{{- $imageTag = tpl $imageTag $rootContext -}}
{{- $_ := set $objectValues.image "tag" $imageTag -}}
{{- end -}}
{{- /* Return the container object */ -}}

View file

@ -7,7 +7,7 @@ Image used by the container.
{{- $containerObject := $ctx.containerObject -}}
{{- $imageRepo := $containerObject.image.repository -}}
{{- $imageTag := default $rootContext.Chart.AppVersion $containerObject.image.tag -}}
{{- $imageTag := $containerObject.image.tag -}}
{{- if and $imageRepo $imageTag -}}
{{- printf "%s:%s" $imageRepo $imageTag -}}

View file

@ -19,7 +19,7 @@ Returns the value for containers
{{- range $key, $containerValues := $enabledContainers -}}
{{- /* Create object from the container values */ -}}
{{- $containerObject := (include "bjw-s.common.lib.container.valuesToObject" (dict "rootContext" $ "id" $key "values" $containerValues)) | fromYaml -}}
{{- $containerObject := (include "bjw-s.common.lib.container.valuesToObject" (dict "rootContext" $rootContext "id" $key "values" $containerValues)) | fromYaml -}}
{{- /* Perform validations on the Container before rendering */ -}}
{{- include "bjw-s.common.lib.container.validate" (dict "rootContext" $ "controllerObject" $controllerObject "containerObject" $containerObject) -}}

View file

@ -25,7 +25,7 @@ Returns the value for initContainers
{{- if $containerEnabled -}}
{{- /* Create object from the container values */ -}}
{{- $containerObject := (include "bjw-s.common.lib.container.valuesToObject" (dict "rootContext" $ "id" $key "values" $containerValues)) | fromYaml -}}
{{- $containerObject := (include "bjw-s.common.lib.container.valuesToObject" (dict "rootContext" $rootContext "id" $key "values" $containerValues)) | fromYaml -}}
{{- /* Perform validations on the Container before rendering */ -}}
{{- include "bjw-s.common.lib.container.validate" (dict "rootContext" $ "controllerObject" $controllerObject "containerObject" $containerObject) -}}

View file

@ -3,5 +3,23 @@ Validate Route values
*/}}
{{- define "bjw-s.common.lib.route.validate" -}}
{{- $rootContext := .rootContext -}}
{{- $routeValues := .object -}}
{{- $routeObject := .object -}}
{{/* Route Types */}}
{{- $routeKind := $routeObject.kind | default "HTTPRoute"}}
{{- if and (ne $routeKind "GRPCRoute") (ne $routeKind "HTTPRoute") (ne $routeKind "TCPRoute") (ne $routeKind "TLSRoute") (ne $routeKind "UDPRoute") }}
{{- fail (printf "Not a valid route kind (%s)" $routeKind) }}
{{- end }}
{{/* Route Rules */}}
{{- range $routeObject.rules }}
{{- if and (.filters) (.backendRefs) }}
{{- range .filters }}
{{- if eq .type "RequestRedirect" }}
{{- fail (printf "backend refs and request redirect filters cannot co-exist.")}}
{{- end }}
{{- end }}
{{- end }}
{{- end }}
{{- end -}}

View file

@ -40,7 +40,7 @@ VolumeClaimTemplates for StatefulSet
{{- /* Default to empty list */ -}}
{{- $volumeClaimTemplates := list -}}
{{- range $index, $volumeClaimTemplate := $statefulsetObject.statefulset.volumeClaimTemplates }}
{{- range $index, $volumeClaimTemplate := (dig "statefulset" "volumeClaimTemplates" list $statefulsetObject) }}
{{- $vct := include "bjw-s.common.lib.statefulset.volumeclaimtemplate" (dict "rootContext" $rootContext "values" $volumeClaimTemplate) -}}
{{- $volumeClaimTemplates = append $volumeClaimTemplates ($vct | fromYaml) -}}
{{- end -}}

View file

@ -161,7 +161,8 @@ controllers:
# - name: data
# labels: {}
# annotations: {}
# mountPath: /data
# globalMounts:
# - path: /data
# accessMode: "ReadWriteOnce"
# dataSourceRef:
# apiGroup: snapshot.storage.k8s.io
@ -171,8 +172,9 @@ controllers:
# - name: backup
# labels: {}
# annotations: {}
# mountPath: /backup
# subPath: theSubPath
# globalMounts:
# - path: /backup
# subPath: theSubPath
# accessMode: "ReadWriteOnce"
# size: 2Gi
# storageClass: cheap-storage-class
@ -207,6 +209,8 @@ controllers:
command: []
# -- Override the args for the default container
args: []
# -- Override the working directory for the default container
workingDir:
# -- Environment variables. Template enabled.
# Syntax options:
@ -589,13 +593,7 @@ route:
# -- Configure rules for routing. Defaults to the primary service.
rules:
- # -- Configure backends where matching requests should be sent.
backendRefs:
- group: ""
kind: Service
name: main
namespace:
port:
weight: 1
backendRefs: []
## Configure conditions used for matching incoming requests. Only for HTTPRoutes
matches:
- path:
@ -603,6 +601,8 @@ route:
value: /
## Request filters that are applied to the rules.
filters: []
## Request timeout that are applied to the rules.
timeouts: {}
# -- Configure persistence for the chart here.
# Additional items can be added by adding a dictionary key similar to the 'config' key.

View file

@ -13,7 +13,7 @@ controllers:
main:
image:
repository: ghcr.io/mendhak/http-https-echo
tag: 30
tag: 31
pullPolicy: IfNotPresent
service:
@ -46,14 +46,14 @@ controllers:
main:
image:
repository: ghcr.io/mendhak/http-https-echo
tag: 30
tag: 31
pullPolicy: IfNotPresent
second:
containers:
main:
image:
repository: ghcr.io/mendhak/http-https-echo
tag: 30
tag: 31
pullPolicy: IfNotPresent
service:

View file

@ -81,7 +81,8 @@ persistence:
media:
enabled: true
existingClaim: nas-media
mountPath: /data/nas-media
globalMounts:
- path: /data/nas-media
probes:
liveness:

View file

@ -2,7 +2,7 @@
apiVersion: helm.toolkit.fluxcd.io/v2beta1
kind: HelmRelease
metadata:
name: vaultwarden
name: &app vaultwarden
namespace: default
spec:
interval: 15m
@ -45,10 +45,10 @@ spec:
main:
ports:
http:
port: 80
port: &port 80
websocket:
enabled: true
port: 3012
port: &websocket-port 3012
ingress:
# -- Enable and configure ingress settings for the chart under this key.
@ -73,6 +73,48 @@ spec:
name: main
port: websocket
route:
# -- Enable and configure route settings for the chart under this key.
main:
enabled: true
parentRefs:
- name: gateway
namespace: gateway-namespace
sectionName: gateway-section
hostnames:
- chart-example.local
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- kind: Service
port: *port
name: *app
namespace: default
weight: 1
- matches:
- path:
type: PathPrefix
value: /notifications/hub/negotiate
backendRefs:
- kind: Service
port: *port
name: *app
namespace: default
weight: 1
- matches:
- path:
type: PathPrefix
value: /notifications/hub
backendRefs:
- kind: Service
port: *websocket-port
name: *app
namespace: default
weight: 1
# -- Configure persistence settings for the chart under this key.
persistence:
config:
@ -80,4 +122,5 @@ spec:
type: persistentVolumeClaim
accessMode: ReadWriteOnce
size: 1Gi
mountPath: /config
globalMounts:
- path: /config

View file

@ -52,6 +52,48 @@ ingress:
name: main
port: websocket
route:
# -- Enable and configure route settings for the chart under this key.
main:
enabled: true
parentRefs:
- name: gateway
namespace: gateway-namespace
sectionName: gateway-section
hostnames:
- chart-example.local
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- kind: Service
port: 80
name: main
namespace: default
weight: 1
- matches:
- path:
type: PathPrefix
value: /notifications/hub/negotiate
backendRefs:
- kind: Service
port: 80
name: main
namespace: default
weight: 1
- matches:
- path:
type: PathPrefix
value: /notifications/hub
backendRefs:
- kind: Service
port: 3012
name: main
namespace: default
weight: 1
# -- Configure persistence settings for the chart under this key.
persistence:
config:
@ -59,4 +101,5 @@ persistence:
type: persistentVolumeClaim
accessMode: ReadWriteOnce
size: 1Gi
mountPath: /config
globalMounts:
- path: /config

View file

@ -59,4 +59,5 @@ persistence:
type: persistentVolumeClaim
accessMode: ReadWriteOnce
size: 1Gi
mountPath: /config
globalMounts:
- path: /config