Compare commits
144 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 00becd0fab | |||
| 0b7faf42ac | |||
| 6480058dba | |||
| e2d2025c38 | |||
| 118cd8e1cb | |||
| 93892ec341 | |||
| 0a1db3d5cf | |||
| 56604353a2 | |||
| 96cbc7ec18 | |||
| 2389545811 | |||
| 3da5c3eb13 | |||
| 295e43c993 | |||
| 6d8fb2930e | |||
| d0d78eb1be | |||
| 8a95436200 | |||
| afcfc36e5f | |||
| 966f0672c7 | |||
| 51ba51320a | |||
| 35cb630582 | |||
| 49396e0b8a | |||
| 9a6bbba2de | |||
| c8fcb7359f | |||
| 5c6164c2d6 | |||
| 8a8b63bab9 | |||
| c3df85fef6 | |||
| 5e19d886e5 | |||
| 95b686d20c | |||
| 285a6cca10 | |||
| 3ee1679e1d | |||
| 7d49989247 | |||
| b17db72a63 | |||
| 0f6e89dbe0 | |||
| 14cd62652c | |||
| a788cff019 | |||
| d951961c49 | |||
| 1ba0e4df60 | |||
| b761286e38 | |||
| 1400b4a58d | |||
| e2f8f0042a | |||
| 059523dbf2 | |||
| b9392c085c | |||
| c3e2280489 | |||
| 1722e9bcf1 | |||
| ef6738e62e | |||
| ee9e8e95c2 | |||
| df1042fb5a | |||
| a2b0e07505 | |||
| 7a49d313a5 | |||
| 254d38f05f | |||
| 7f4f1674b8 | |||
| 569ebb06f1 | |||
| a5512f8f8a | |||
| 530070b05c | |||
| ad2ea458c4 | |||
| 6783eb019d | |||
| 6f1753c46d | |||
| e943d982ef | |||
| 213303b10e | |||
| 13d860f7f4 | |||
| 47ae89c7e6 | |||
| 7bb30fccab | |||
| f38708f864 | |||
| d9fa868eaa | |||
| 24c8634b09 | |||
| 937cb67c30 | |||
| 07afdb14c1 | |||
| 8c82240186 | |||
| 4e44c8104c | |||
| 2e97926d70 | |||
| d6c34a8349 | |||
| e85c443284 | |||
| 58292c747e | |||
| 607d4301bf | |||
| 269ab7e376 | |||
| 324617b0de | |||
| 6a897ff5a3 | |||
| 10205747f2 | |||
| c56e2aa5b4 | |||
| 167ce8cff5 | |||
| 539caf68a0 | |||
| eec4f30c67 | |||
| 9609cc2c3a | |||
| 59a5bfde2f | |||
| 98390f73c8 | |||
| 8417a0363d | |||
| 5910080e17 | |||
| 922111d2de | |||
| 4352af0abc | |||
| 164bfec8b3 | |||
| d91040c0a0 | |||
| 4942164b9a | |||
| 1082767c59 | |||
| 74c16555dd | |||
| ae6c219132 | |||
| ade37a82c7 | |||
| b249805bf3 | |||
| efd5d819f3 | |||
| b2700d990d | |||
| d0d0b28c9a | |||
| 0a162de948 | |||
| 442c98f5d1 | |||
| 73fd1235c2 | |||
| c68e979ba0 | |||
| 96e8f0db60 | |||
| 46cd92059c | |||
| 0000ad9f4b | |||
| 7642eb3dc7 | |||
| 3326cd3c38 | |||
| 5ac5e6bc03 | |||
| 54946f8caf | |||
| addc69413c | |||
| 50b0f9cf89 | |||
| bc933d1668 | |||
| 8c124da61a | |||
| b6cdead8e6 | |||
| eb78ab24e6 | |||
| e6b527aae6 | |||
| 7ece4e42dd | |||
| c2d6250a91 | |||
| bc74e6f201 | |||
| 27698eda01 | |||
| b11b62a970 | |||
| 5012c4ae5d | |||
| e539810c80 | |||
| a274eacba2 | |||
| e28ed88e2f | |||
| 1ecdba097b | |||
| 6ee68880ae | |||
| 28918e3359 | |||
| ee15631900 | |||
| 6acf4ec41f | |||
| 155d821738 | |||
| bc7d3d18ed | |||
| 3b41c38dba | |||
| 1cbdca4eab | |||
| b929abd3f8 | |||
| c51bc8745e | |||
| 63b56ae029 | |||
| a2c4d5e66c | |||
| b30f3885be | |||
| d436fe1645 | |||
| 39901f5ca4 | |||
| 6d31bcd7a0 | |||
| c439bfd2ad |
@@ -0,0 +1,105 @@
|
||||
name: Release
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- 'v*'
|
||||
|
||||
jobs:
|
||||
release:
|
||||
name: Release
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
|
||||
- name: Checkout main
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Extract tag version
|
||||
id: versioning
|
||||
run: |
|
||||
tag=${GITHUB_REF/refs\/tags\//}
|
||||
tag=${tag#v}
|
||||
echo ::set-output name=tag_version::$tag
|
||||
|
||||
- name: Extract chart version
|
||||
id: chart_version
|
||||
run: |
|
||||
CHART_VERSION=$(cat charts/onechart/Chart.yaml | grep ^version:)
|
||||
CHART_VERSION=${CHART_VERSION#version: }
|
||||
echo $CHART_VERSION
|
||||
echo ::set-output name=chart_version::$CHART_VERSION
|
||||
|
||||
CHART_VERSION=$(cat charts/cron-job/Chart.yaml | grep ^version:)
|
||||
CHART_VERSION=${CHART_VERSION#version: }
|
||||
echo $CHART_VERSION
|
||||
echo ::set-output name=cron_job_chart_version::$CHART_VERSION
|
||||
|
||||
- name: Ensure tag and chart version matches
|
||||
run: |
|
||||
echo "$TAG_VERSION"
|
||||
echo "$CHART_VERSION"
|
||||
echo "$CRON_JOB_CHART_VERSION"
|
||||
if [ "$TAG_VERSION" != "$CHART_VERSION" ]
|
||||
then
|
||||
echo "Tag version does not match chart version"
|
||||
exit 1
|
||||
fi
|
||||
if [ "$TAG_VERSION" != "$CRON_JOB_CHART_VERSION" ]
|
||||
then
|
||||
echo "Tag version does not match cron-job chart version"
|
||||
exit 1
|
||||
fi
|
||||
env:
|
||||
TAG_VERSION: ${{ steps.versioning.outputs.tag_version }}
|
||||
CHART_VERSION: ${{ steps.chart_version.outputs.chart_version }}
|
||||
CRON_JOB_CHART_VERSION: ${{ steps.chart_version.outputs.cron_job_chart_version }}
|
||||
|
||||
- name: Create Release
|
||||
id: create_release
|
||||
uses: actions/create-release@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
tag_name: ${{ github.ref }}
|
||||
release_name: Release ${{ github.ref }}
|
||||
draft: false
|
||||
prerelease: false
|
||||
|
||||
- name: Publishing to the Helm repository
|
||||
run: |
|
||||
git config --global user.email "action@github.com"
|
||||
git config --global user.name "Github Action"
|
||||
git checkout master
|
||||
|
||||
make package
|
||||
|
||||
git add .
|
||||
git commit -m "Publishing $TAG_VERSION to the Helm repository"
|
||||
git push origin master
|
||||
env:
|
||||
TAG_VERSION: ${{ steps.versioning.outputs.tag_version }}
|
||||
|
||||
- name: Preparing the next release version
|
||||
run: |
|
||||
git config --global user.email "action@github.com"
|
||||
git config --global user.name "Github Action"
|
||||
git checkout master
|
||||
|
||||
without_major_version=${CHART_VERSION#*.}
|
||||
without_patch_version=${without_major_version%.*}
|
||||
increased_minor_version=$(($without_patch_version + 1))
|
||||
major_version=${CHART_VERSION%%.*}
|
||||
increased_version="$major_version.$increased_minor_version.0"
|
||||
echo "The new version will be $increased_version"
|
||||
|
||||
sed -i "s/version: $CHART_VERSION/version: $increased_version/" charts/onechart/Chart.yaml
|
||||
sed -i "s/version: $CHART_VERSION/version: $increased_version/" charts/cron-job/Chart.yaml
|
||||
|
||||
git status
|
||||
git add .
|
||||
git commit -m "The next release version will be $increased_version"
|
||||
git push origin master
|
||||
env:
|
||||
CHART_VERSION: ${{ steps.chart_version.outputs.chart_version }}
|
||||
@@ -1,4 +1,6 @@
|
||||
|
||||
.PHONY: all lint kubeval test package debug debug-ui
|
||||
|
||||
all: lint kubeval test package
|
||||
|
||||
lint:
|
||||
@@ -10,30 +12,38 @@ kubeval:
|
||||
rm -rf manifests && true
|
||||
mkdir manifests
|
||||
helm template charts/onechart --output-dir manifests
|
||||
find manifests/ -name '*.yaml' | xargs kubeval --ignore-missing-schemas -v 1.13.0
|
||||
find manifests/ -name '*.yaml' | xargs kubeval --ignore-missing-schemas -v 1.18.0
|
||||
find manifests/ -name '*.yaml' | xargs kubeval --ignore-missing-schemas -v 1.20.0
|
||||
find manifests/ -name '*.yaml' | xargs kubeval --ignore-missing-schemas -v 1.24.0
|
||||
|
||||
rm -rf manifests && true
|
||||
mkdir manifests
|
||||
helm template charts/cron-job --output-dir manifests
|
||||
find manifests/ -name '*.yaml' | xargs kubeval --ignore-missing-schemas -v 1.13.0
|
||||
find manifests/ -name '*.yaml' | xargs kubeval --ignore-missing-schemas -v 1.18.0
|
||||
find manifests/ -name '*.yaml' | xargs kubeval --ignore-missing-schemas -v 1.20.0
|
||||
find manifests/ -name '*.yaml' | xargs kubeval --ignore-missing-schemas -v 1.24.0
|
||||
|
||||
rm -rf manifests && true
|
||||
mkdir manifests
|
||||
helm template charts/namespaces --output-dir manifests
|
||||
find manifests/ -name '*.yaml' | xargs kubeval --ignore-missing-schemas -v 1.13.0
|
||||
find manifests/ -name '*.yaml' | xargs kubeval --ignore-missing-schemas -v 1.18.0
|
||||
helm template charts/namespaces --output-dir manifests -f charts/namespaces/fixture.yaml
|
||||
find manifests/ -name '*.yaml' | xargs kubeval --ignore-missing-schemas -v 1.20.0
|
||||
find manifests/ -name '*.yaml' | xargs kubeval --ignore-missing-schemas -v 1.24.0
|
||||
|
||||
test:
|
||||
helm dependency update charts/onechart
|
||||
helm unittest charts/onechart
|
||||
|
||||
helm dependency update charts/cron-job
|
||||
helm unittest charts/cron-job
|
||||
|
||||
helm unittest charts/namespaces
|
||||
|
||||
helm unittest charts/static-site
|
||||
|
||||
package:
|
||||
helm dependency update charts/onechart
|
||||
helm package charts/onechart
|
||||
mv onechart*.tgz docs
|
||||
|
||||
helm dependency update charts/cron-job
|
||||
helm package charts/cron-job
|
||||
mv cron-job*.tgz docs
|
||||
|
||||
@@ -43,8 +53,13 @@ package:
|
||||
helm repo index docs --url https://chart.onechart.dev
|
||||
|
||||
debug:
|
||||
helm dependency update charts/onechart
|
||||
helm template charts/onechart/ -f values.yaml --debug
|
||||
|
||||
debug-cron-job:
|
||||
helm dependency update charts/cron-job
|
||||
helm template charts/cron-job/ -f values-cron-job.yaml --debug
|
||||
|
||||
debug-ui:
|
||||
#gimlet chart configure -s charts/onechart/values.schema.json -u charts/onechart/helm-ui.json onechart/onechart
|
||||
/home/laszlo/projects/gimlet-cli/build/gimlet chart configure -s charts/onechart/values.schema.json -u charts/onechart/helm-ui.json onechart/onechart
|
||||
|
||||
@@ -4,7 +4,7 @@ A generic Helm chart for your application deployments.
|
||||
|
||||
Because no-one can remember the Kubernetes yaml syntax.
|
||||
|
||||
https://onechart.dev/
|
||||
https://gimlet.io/docs/onechart-reference
|
||||
|
||||
## Getting started
|
||||
|
||||
@@ -30,27 +30,45 @@ helm install my-release onechart/onechart \
|
||||
--set image.tag=1.19.3
|
||||
```
|
||||
|
||||
See all [Examples](/examples/deploying-an-image)
|
||||
See all [Examples](/website/docs/examples/)
|
||||
|
||||
## Contribution Guidelines
|
||||
|
||||
Thank you for your interest in contributing to the Gimlet project.
|
||||
|
||||
Below are some of the guidelines and best practices for contributing to this repository:
|
||||
Below are some guidelines and best practices for contributing to this repository:
|
||||
|
||||
### Issues
|
||||
|
||||
If you are running a fork of OneChart and would like to upstream a feature, please open a pull request for it.
|
||||
|
||||
### New Features
|
||||
|
||||
If you are planning to add a new feature to OneChart, please open an issue for it first. Helm charts are prone to having too many features, and OneChart want to keep the supported use-cases in-check. Proposed features have to be generally applicable, targeting newcomers to the Kubernetes ecosystem.
|
||||
|
||||
### New Features / Components
|
||||
|
||||
If you have any ideas on new features or want to improve the existing features, you can suggest it by opening a [GitHub issue](https://github.com/gimlet-io/onechart/issues/new). Make sure to include detailed information about the feature requests, use cases, and any other information that could be helpful.
|
||||
|
||||
### Pull Request Process
|
||||
|
||||
* Fork the repository.
|
||||
* Create a new branch and make your changes.
|
||||
* Open a pull request with detailed commit message and reference issue number if applicable.
|
||||
* A maintainer will review your pull request, and help you throughout the process.
|
||||
|
||||
## Development
|
||||
|
||||
Development of OneChart does not differ from developing a regular Helm chart.
|
||||
|
||||
The source for OneChart is under `charts/onechart` where you can locate the `Chart.yaml`, `values.yaml` and the templates.
|
||||
|
||||
We write unit tests for our helm charts. Pull requests are only accepted with proper test coverage.
|
||||
|
||||
The tests are located under `charts/onechart/test` and use the https://github.com/DataDog/helm-unittest.git Helm plugin to run the tests.
|
||||
|
||||
For installation, refer to the CI workflow at `.github/workflows/build.yaml`.
|
||||
|
||||
## Release process
|
||||
|
||||
`make all` to test and package the Helm chart.
|
||||
The chart archives are put under `docs/` together with the Helm repository manifest (index.yaml)
|
||||
It is then served with Github Pages on https://chart.onechart.dev
|
||||
|
||||
Github Actions is used to automate the make calls on git tag events.
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
# Patterns to ignore when building packages.
|
||||
# This supports shell glob matching, relative path matching, and
|
||||
# negation (prefixed with !). Only one pattern per line.
|
||||
.DS_Store
|
||||
# Common VCS dirs
|
||||
.git/
|
||||
.gitignore
|
||||
.bzr/
|
||||
.bzrignore
|
||||
.hg/
|
||||
.hgignore
|
||||
.svn/
|
||||
# Common backup files
|
||||
*.swp
|
||||
*.bak
|
||||
*.tmp
|
||||
*.orig
|
||||
*~
|
||||
# Various IDEs
|
||||
.project
|
||||
.idea/
|
||||
*.tmproj
|
||||
.vscode/
|
||||
@@ -0,0 +1,18 @@
|
||||
apiVersion: v2
|
||||
name: common
|
||||
description: A Helm chart for Kubernetes
|
||||
|
||||
# A chart can be either an 'application' or a 'library' chart.
|
||||
#
|
||||
# Application charts are a collection of templates that can be packaged into versioned archives
|
||||
# to be deployed.
|
||||
#
|
||||
# Library charts provide useful utilities or functions for the chart developer. They're included as
|
||||
# a dependency of application charts to inject those utilities and functions into the rendering
|
||||
# pipeline. Library charts do not define any templates and therefore cannot be deployed.
|
||||
type: library
|
||||
|
||||
# This is the chart version. This version number should be incremented each time you make changes
|
||||
# to the chart and its templates, including the app version.
|
||||
# Versions are expected to follow Semantic Versioning (https://semver.org/)
|
||||
version: 0.2.0
|
||||
@@ -0,0 +1,15 @@
|
||||
{{- define "common.configmap.tpl" -}}
|
||||
{{- if .Values.vars }}
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: {{ template "common.robustName" .Release.Name }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "helm-chart.labels" . | nindent 4 }}
|
||||
data:
|
||||
{{- range $key, $val := .Values.vars }}
|
||||
{{ $key }}: {{ $val | quote }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end -}}
|
||||
@@ -0,0 +1,16 @@
|
||||
{{- define "common.customFileConfigmap.tpl" -}}
|
||||
{{- range .Values.volumes }}
|
||||
{{- if .fileName }}
|
||||
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: {{ template "common.robustName" .fileName }}
|
||||
namespace: {{ $.Release.Namespace }}
|
||||
data:
|
||||
{{ .fileName }}: |
|
||||
{{- .fileContent | nindent 4 }}
|
||||
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end -}}
|
||||
@@ -0,0 +1,21 @@
|
||||
{{- define "common.envFromRef.tpl" -}}
|
||||
{{- if or (or (or (.Values.vars) (.Values.secretEnabled)) .Values.sealedSecrets) .Values.secretName }}
|
||||
envFrom: &envFrom
|
||||
{{- if .Values.vars }}
|
||||
- configMapRef:
|
||||
name: {{ template "common.robustName" .Release.Name }}
|
||||
{{- end }}
|
||||
{{- if .Values.secretEnabled }}
|
||||
- secretRef:
|
||||
name: {{ include "common.robustName" $.Release.Name }}
|
||||
{{- end }}
|
||||
{{- if .Values.secretName }}
|
||||
- secretRef:
|
||||
name: {{ .Values.secretName }}
|
||||
{{- end }}
|
||||
{{- if .Values.sealedSecrets }}
|
||||
- secretRef:
|
||||
name: {{ template "common.robustName" .Release.Name }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
@@ -1,3 +1,4 @@
|
||||
{{- define "common.fileSecret.tpl" -}}
|
||||
{{- range .Values.fileSecrets }}
|
||||
---
|
||||
kind: Secret
|
||||
@@ -11,3 +12,4 @@ data:
|
||||
{{ $key }}: {{ $val | b64enc }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end -}}
|
||||
@@ -0,0 +1,10 @@
|
||||
{{/* vim: set filetype=mustache: */}}
|
||||
|
||||
{{/*
|
||||
Create robustName that can be used as Kubernetes resource name, and as subdomain as well
|
||||
\w – Latin letters, digits, underscore '_' .
|
||||
\W – all but \w .
|
||||
*/}}
|
||||
{{- define "common.robustName" -}}
|
||||
{{ regexReplaceAll "\\W+" . "-" | replace "_" "-" | lower | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
@@ -0,0 +1,26 @@
|
||||
{{- define "common.pvc.tpl" -}}
|
||||
{{- range .Values.volumes }}
|
||||
{{- if not (or .existingClaim .hostPath .fileName .emptyDir .existingConfigMap) }}
|
||||
{{- $robustName := include "common.robustName" $.Release.Name }}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: {{ printf "%s-%s" $robustName .name }}
|
||||
namespace: {{ $.Release.Namespace }}
|
||||
{{- if .pvcAnnotations }}
|
||||
annotations:
|
||||
{{- toYaml .pvcAnnotations | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
accessModes:
|
||||
- {{ .accessMode | default "ReadWriteOnce" }}
|
||||
{{- if .storageClass }}
|
||||
storageClassName: {{ .storageClass }}
|
||||
{{- end }}
|
||||
resources:
|
||||
requests:
|
||||
storage: {{ .size | default "1Gi" }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end -}}
|
||||
+3
-1
@@ -1,5 +1,6 @@
|
||||
{{- define "common.sealedFileSecret.tpl" -}}
|
||||
{{- range .Values.sealedFileSecrets }}
|
||||
{{- $robustName := include "robustName" $.Release.Name -}}
|
||||
{{- $robustName := include "common.robustName" $.Release.Name }}
|
||||
---
|
||||
apiVersion: bitnami.com/v1alpha1
|
||||
kind: SealedSecret
|
||||
@@ -22,3 +23,4 @@ spec:
|
||||
name: {{ printf "%s-%s" $.Release.Name .name }}
|
||||
namespace: {{ $.Release.Namespace }}
|
||||
{{- end }}
|
||||
{{- end -}}
|
||||
+6
-4
@@ -1,8 +1,9 @@
|
||||
{{- if .Values.sealedSecrets }}
|
||||
{{- define "common.sealedSecret.tpl" -}}
|
||||
{{- if .Values.sealedSecrets }}
|
||||
apiVersion: bitnami.com/v1alpha1
|
||||
kind: SealedSecret
|
||||
metadata:
|
||||
name: {{ template "robustName" .Release.Name }}
|
||||
name: {{ template "common.robustName" .Release.Name }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "helm-chart.labels" . | nindent 4 }}
|
||||
@@ -15,6 +16,7 @@ spec:
|
||||
{{- end }}
|
||||
template:
|
||||
metadata:
|
||||
name: {{ template "robustName" .Release.Name }}
|
||||
name: {{ template "common.robustName" .Release.Name }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end -}}
|
||||
@@ -0,0 +1,33 @@
|
||||
{{- define "common.volumeMountsRef.tpl" -}}
|
||||
{{- if or (or (or (.Values.volumes) (.Values.sealedFileSecrets)) .Values.fileSecrets) .Values.existingFileSecrets }}
|
||||
volumeMounts: &volumeMounts
|
||||
{{- range .Values.volumes }}
|
||||
{{- if not (hasPrefix "init-" .name) }}
|
||||
- name: {{ .name }}
|
||||
mountPath: {{ .path }}
|
||||
{{- if .subPath }}
|
||||
subPath: {{ .subPath }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- range .Values.sealedFileSecrets }}
|
||||
- name: {{ .name }}
|
||||
mountPath: {{ .path }}
|
||||
readOnly: true
|
||||
{{- end }}
|
||||
{{- range .Values.fileSecrets }}
|
||||
- name: {{ .name }}
|
||||
mountPath: {{ .path }}
|
||||
readOnly: true
|
||||
{{- end }}
|
||||
{{- range .Values.existingFileSecrets }}
|
||||
- name: {{ .name }}
|
||||
mountPath: {{ .path }}
|
||||
{{- if .subPath}}
|
||||
subPath: {{ .subPath }}
|
||||
{{- end }}
|
||||
readOnly: true
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
{{- define "common.volumesRef.tpl" -}}
|
||||
{{- if or (or (or (.Values.volumes) (.Values.sealedFileSecrets)) .Values.fileSecrets) .Values.existingFileSecrets }}
|
||||
volumes:
|
||||
{{- range .Values.volumes }}
|
||||
- name: {{ .name }}
|
||||
{{- if .emptyDir }}
|
||||
emptyDir: {}
|
||||
{{- else if .existingConfigMap }}
|
||||
configMap:
|
||||
name: {{ .existingConfigMap }}
|
||||
{{- else if .fileName }}
|
||||
configMap:
|
||||
name: {{ template "common.robustName" .fileName }}
|
||||
{{- else if .hostPath }}
|
||||
hostPath:
|
||||
path: {{ .hostPath.path }}
|
||||
{{- if .hostPath.type }}
|
||||
type: {{ .hostPath.type }}
|
||||
{{- end }}
|
||||
{{- else }}
|
||||
persistentVolumeClaim:
|
||||
{{- if .existingClaim }}
|
||||
claimName: {{ .existingClaim }}
|
||||
{{ else }}
|
||||
claimName: {{ printf "%s-%s" $.Release.Name .name }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- range .Values.sealedFileSecrets }}
|
||||
- name: {{ .name }}
|
||||
secret:
|
||||
secretName: {{ printf "%s-%s" $.Release.Name .name }}
|
||||
{{- end }}
|
||||
{{- range .Values.fileSecrets }}
|
||||
- name: {{ .name }}
|
||||
secret:
|
||||
secretName: {{ printf "%s-%s" $.Release.Name .name }}
|
||||
{{- end }}
|
||||
{{- range .Values.existingFileSecrets }}
|
||||
- name: {{ .name }}
|
||||
secret:
|
||||
secretName: {{ .name }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end -}}
|
||||
@@ -0,0 +1,6 @@
|
||||
dependencies:
|
||||
- name: common
|
||||
repository: file://../common
|
||||
version: 0.2.0
|
||||
digest: sha256:ea028bf07fdc361daabca0c0155e4511cc4fffda94d2f697f4d16013f250c8a8
|
||||
generated: "2023-02-17T15:14:21.719376584+01:00"
|
||||
@@ -15,4 +15,9 @@ type: application
|
||||
# This is the chart version. This version number should be incremented each time you make changes
|
||||
# to the chart and its templates, including the app version.
|
||||
# Versions are expected to follow Semantic Versioning (https://semver.org/)
|
||||
version: 0.1.2
|
||||
version: 0.45.0
|
||||
|
||||
dependencies:
|
||||
- name: common
|
||||
version: 0.2.0
|
||||
repository: file://../common
|
||||
|
||||
Binary file not shown.
@@ -0,0 +1,71 @@
|
||||
[
|
||||
{
|
||||
"schemaIDs": [
|
||||
"#/properties/image",
|
||||
"#/properties/shell",
|
||||
"#/properties/command"
|
||||
],
|
||||
"uiSchema": {
|
||||
"#/properties/replicas": {
|
||||
"ui:widget": "range"
|
||||
}
|
||||
},
|
||||
"metaData": {
|
||||
"name": "Basics",
|
||||
"icon": "M17 8l4 4m0 0l-4 4m4-4H3"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schemaIDs": [
|
||||
"#/properties/resources"
|
||||
],
|
||||
"uiSchema": {
|
||||
},
|
||||
"metaData": {
|
||||
"name": "Resources",
|
||||
"icon": "M9 7h6m0 10v-3m-3 3h.01M9 17h.01M9 14h.01M12 14h.01M15 11h.01M12 11h.01M9 11h.01M7 21h10a2 2 0 002-2V5a2 2 0 00-2-2H7a2 2 0 00-2 2v14a2 2 0 002 2z"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schemaIDs": [
|
||||
"#/properties/vars"
|
||||
],
|
||||
"uiSchema": {
|
||||
"#/properties/vars": {
|
||||
"additionalProperties": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
},
|
||||
"metaData": {
|
||||
"name": "Environment Variables",
|
||||
"icon": "M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schemaIDs": [
|
||||
"#/properties/sealedSecrets"
|
||||
],
|
||||
"uiSchema": {
|
||||
"#/properties/sealedSecrets": {
|
||||
"additionalProperties": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
},
|
||||
"metaData": {
|
||||
"name": "Sealed Secrets",
|
||||
"icon": "M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schemaIDs": [
|
||||
"#/properties/volumes"
|
||||
],
|
||||
"uiSchema": {},
|
||||
"metaData": {
|
||||
"name": "Volumes",
|
||||
"icon": "M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4m0 5c0 2.21-3.582 4-8 4s-8-1.79-8-4"
|
||||
}
|
||||
}
|
||||
]
|
||||
@@ -48,7 +48,7 @@ Selector labels
|
||||
*/}}
|
||||
{{- define "helm-chart.selectorLabels" -}}
|
||||
app.kubernetes.io/name: {{ include "helm-chart.name" . }}
|
||||
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||
app.kubernetes.io/instance: {{ template "robustName" .Release.Name }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
@@ -61,3 +61,12 @@ Create the name of the service account to use
|
||||
{{- default "default" .Values.serviceAccount.name }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create robustName that can be used as Kubernetes resource name, and as subdomain as well
|
||||
\w – Latin letters, digits, underscore '_' .
|
||||
\W – all but \w .
|
||||
*/}}
|
||||
{{- define "robustName" -}}
|
||||
{{ regexReplaceAll "\\W+" . "-" | replace "_" "-" | lower | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
@@ -1,13 +1 @@
|
||||
{{- if .Values.vars }}
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: {{ .Release.Name }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "helm-chart.labels" . | nindent 4 }}
|
||||
data:
|
||||
{{- range $key, $val := .Values.vars }}
|
||||
{{ $key }}: {{ $val | quote }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- include "common.configmap.tpl" . -}}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
apiVersion: batch/v1beta1
|
||||
apiVersion: batch/v1
|
||||
kind: CronJob
|
||||
metadata:
|
||||
name: {{ .Release.Name }}
|
||||
@@ -7,10 +7,9 @@ metadata:
|
||||
{{- include "helm-chart.labels" . | nindent 4 }}
|
||||
spec:
|
||||
schedule: {{ .Values.schedule | quote }}
|
||||
successfulJobsHistoryLimit: 1
|
||||
failedJobsHistoryLimit: 1
|
||||
concurrencyPolicy: Forbid
|
||||
startingDeadlineSeconds: 120
|
||||
{{- with .Values.constraints }}
|
||||
{{- toYaml . | nindent 2 }}
|
||||
{{- end }}
|
||||
jobTemplate:
|
||||
spec:
|
||||
template:
|
||||
@@ -30,37 +29,20 @@ spec:
|
||||
- {{ .Values.shell }}
|
||||
- -c
|
||||
- {{ .Values.command | quote }}
|
||||
envFrom:
|
||||
{{- if .Values.vars }}
|
||||
- configMapRef:
|
||||
name: {{ .Release.Name }}
|
||||
{{- end }}
|
||||
{{- if .Values.secret.enabled }}
|
||||
- secretRef:
|
||||
name: {{ .Release.Name }}
|
||||
{{- end }}
|
||||
volumeMounts:
|
||||
{{- range .Values.volumes }}
|
||||
- name: {{ .name }}
|
||||
mountPath: {{ .path }}
|
||||
{{- end }}
|
||||
{{- include "common.envFromRef.tpl" . | nindent 14 }}
|
||||
{{- include "common.volumeMountsRef.tpl" . | nindent 14 }}
|
||||
resources:
|
||||
{{- toYaml .Values.resources | nindent 16 }}
|
||||
volumes:
|
||||
{{- range .Values.volumes }}
|
||||
- name: {{ .name }}
|
||||
persistentVolumeClaim:
|
||||
claimName: {{ printf "%s-%s" $.Release.Name .name }}
|
||||
{{- end }}
|
||||
{{ with .Values.nodeSelector }}
|
||||
{{- include "common.volumesRef.tpl" . | nindent 10 }}
|
||||
{{- with .Values.nodeSelector }}
|
||||
nodeSelector:
|
||||
{{ toYaml . | nindent 8 }}
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
{{ with .Values.affinity }}
|
||||
{{- with .Values.affinity }}
|
||||
affinity:
|
||||
{{ toYaml . | nindent 8 }}
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
{{ with .Values.tolerations }}
|
||||
{{- with .Values.tolerations }}
|
||||
tolerations:
|
||||
{{ toYaml . | nindent 8 }}
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
{{- include "common.fileSecret.tpl" . -}}
|
||||
@@ -1,15 +1 @@
|
||||
{{- range .Values.volumes }}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: {{ printf "%s-%s" $.Release.Name .name }}
|
||||
namespace: {{ $.Release.Namespace }}
|
||||
spec:
|
||||
accessModes:
|
||||
- {{ .accessMode | default "ReadWriteOnce" }}
|
||||
storageClassName: {{ .storageClass | default "local-path" }}
|
||||
resources:
|
||||
requests:
|
||||
storage: {{ .size | default "1Gi" }}
|
||||
{{- end }}
|
||||
{{- include "common.pvc.tpl" . -}}
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
{{- include "common.sealedFileSecret.tpl" . -}}
|
||||
@@ -0,0 +1 @@
|
||||
{{- include "common.sealedSecret.tpl" . -}}
|
||||
@@ -13,7 +13,7 @@ tests:
|
||||
path: spec.jobTemplate.spec.template.spec.containers[0].envFrom
|
||||
content:
|
||||
configMapRef:
|
||||
name: RELEASE-NAME
|
||||
name: release-name
|
||||
- it: Should not reference configmap if vars are not set
|
||||
asserts:
|
||||
- isNull:
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
suite: test cron job
|
||||
templates:
|
||||
- cronJob.yaml
|
||||
tests:
|
||||
- it: Should have default constraints
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.successfulJobsHistoryLimit
|
||||
value: 1
|
||||
- it: Should constraints be configurable
|
||||
set:
|
||||
constraints:
|
||||
successfulJobsHistoryLimit: 2
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.successfulJobsHistoryLimit
|
||||
value: 2
|
||||
@@ -0,0 +1,28 @@
|
||||
suite: test deployment
|
||||
templates:
|
||||
- cronJob.yaml
|
||||
tests:
|
||||
- it: Should mount volume
|
||||
set: &values
|
||||
sealedFileSecrets:
|
||||
- name: google-account-key
|
||||
path: /google-account-key
|
||||
filesToMount:
|
||||
- name: key.json
|
||||
sourcePath: my-google-acoount-key.json
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.jobTemplate.spec.template.spec.containers[0].volumeMounts
|
||||
value:
|
||||
- name: google-account-key
|
||||
mountPath: /google-account-key
|
||||
readOnly: true
|
||||
- it: Should reference volume
|
||||
set: *values
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.jobTemplate.spec.template.spec.volumes
|
||||
value:
|
||||
- name: google-account-key
|
||||
secret:
|
||||
secretName: RELEASE-NAME-google-account-key
|
||||
@@ -5,16 +5,16 @@ templates:
|
||||
tests:
|
||||
- it: Should reference secret if secret is enabled
|
||||
set:
|
||||
secret.enabled: true
|
||||
secretEnabled: true
|
||||
asserts:
|
||||
- contains:
|
||||
path: spec.jobTemplate.spec.template.spec.containers[0].envFrom
|
||||
content:
|
||||
secretRef:
|
||||
name: RELEASE-NAME
|
||||
name: release-name
|
||||
- it: Should not reference secret if secret is disabled
|
||||
set:
|
||||
secret.enabled: false
|
||||
secretEnabled: false
|
||||
asserts:
|
||||
- isNull:
|
||||
path: spec.jobTemplate.spec.template.spec.containers[0].envFrom
|
||||
|
||||
@@ -0,0 +1,316 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema",
|
||||
"$id": "http://example.com/example.json",
|
||||
"type": "object",
|
||||
"title": "The root schema",
|
||||
"description": "The root schema comprises the entire JSON document.",
|
||||
"default": {},
|
||||
"required": [],
|
||||
"properties": {
|
||||
"image": {
|
||||
"$id": "#/properties/image",
|
||||
"type": "object",
|
||||
"title": "Image",
|
||||
"description": "The image to deploy",
|
||||
"default": {},
|
||||
"examples": [
|
||||
{
|
||||
"repository": "nginx",
|
||||
"tag": "latest"
|
||||
}
|
||||
],
|
||||
"required": [
|
||||
"repository",
|
||||
"tag"
|
||||
],
|
||||
"properties": {
|
||||
"repository": {
|
||||
"$id": "#/properties/image/properties/repository",
|
||||
"type": "string",
|
||||
"title": "Repository",
|
||||
"description": "",
|
||||
"default": "nginx",
|
||||
"examples": [
|
||||
"nginx"
|
||||
]
|
||||
},
|
||||
"tag": {
|
||||
"$id": "#/properties/image/properties/tag",
|
||||
"type": "string",
|
||||
"title": "Tag",
|
||||
"description": "",
|
||||
"default": "1.19.3",
|
||||
"examples": [
|
||||
"latest"
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"podAnnotations": {
|
||||
"$id": "#/properties/podAnnotations",
|
||||
"type": "object",
|
||||
"title": "The podAnnotations schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": {},
|
||||
"examples": [
|
||||
{}
|
||||
],
|
||||
"required": [],
|
||||
"additionalProperties": true
|
||||
},
|
||||
"resources": {
|
||||
"$id": "#/properties/resources",
|
||||
"type": "object",
|
||||
"title": "",
|
||||
"description": "",
|
||||
"default": {},
|
||||
"examples": [
|
||||
{
|
||||
"requests": {
|
||||
"cpu": "200m",
|
||||
"memory": "200mi"
|
||||
},
|
||||
"limits": {
|
||||
"cpu": "200m",
|
||||
"memory": "200mi"
|
||||
}
|
||||
}
|
||||
],
|
||||
"required": [],
|
||||
"properties": {
|
||||
"requests": {
|
||||
"$id": "#/properties/resources/properties/requests",
|
||||
"type": "object",
|
||||
"title": "Requests",
|
||||
"description": "The typical resources your app uses",
|
||||
"default": {},
|
||||
"examples": [
|
||||
{
|
||||
"cpu": "200m",
|
||||
"memory": "200mi"
|
||||
}
|
||||
],
|
||||
"required": [
|
||||
"cpu",
|
||||
"memory"
|
||||
],
|
||||
"properties": {
|
||||
"cpu": {
|
||||
"$id": "#/properties/resources/properties/requests/properties/cpu",
|
||||
"type": "string",
|
||||
"title": "CPU",
|
||||
"description": "",
|
||||
"default": "200m",
|
||||
"examples": [
|
||||
"200m"
|
||||
]
|
||||
},
|
||||
"memory": {
|
||||
"$id": "#/properties/resources/properties/requests/properties/memory",
|
||||
"type": "string",
|
||||
"title": "Memory",
|
||||
"description": "",
|
||||
"default": "200Mi",
|
||||
"examples": [
|
||||
"200mi"
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"limits": {
|
||||
"$id": "#/properties/resources/properties/limits",
|
||||
"type": "object",
|
||||
"title": "Limits",
|
||||
"description": "The maximum resources your app may use",
|
||||
"default": {},
|
||||
"examples": [
|
||||
{
|
||||
"cpu": "200m",
|
||||
"memory": "200mi"
|
||||
}
|
||||
],
|
||||
"required": [
|
||||
"cpu",
|
||||
"memory"
|
||||
],
|
||||
"properties": {
|
||||
"cpu": {
|
||||
"$id": "#/properties/resources/properties/limits/properties/cpu",
|
||||
"type": "string",
|
||||
"title": "CPU",
|
||||
"description": "The hard ceiling for the app's CPU usage. The app will be throttled to this limit. 1000m or 1000 CPU shares = 1 CPU core",
|
||||
"default": "200m",
|
||||
"examples": [
|
||||
"200m"
|
||||
]
|
||||
},
|
||||
"memory": {
|
||||
"$id": "#/properties/resources/properties/limits/properties/memory",
|
||||
"type": "string",
|
||||
"title": "Memory",
|
||||
"description": "The hard ceiling for the app's memory usage. The app will be RESTARTED if it reaches this limit",
|
||||
"default": "200Mi",
|
||||
"examples": [
|
||||
"200mi"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"nodeSelector": {
|
||||
"$id": "#/properties/nodeSelector",
|
||||
"type": "object",
|
||||
"title": "The nodeSelector schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": {},
|
||||
"examples": [
|
||||
{}
|
||||
],
|
||||
"required": [],
|
||||
"additionalProperties": true
|
||||
},
|
||||
"tolerations": {
|
||||
"$id": "#/properties/tolerations",
|
||||
"type": "array",
|
||||
"title": "The tolerations schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": [],
|
||||
"examples": [
|
||||
[]
|
||||
],
|
||||
"additionalItems": true,
|
||||
"items": {
|
||||
"$id": "#/properties/tolerations/items"
|
||||
}
|
||||
},
|
||||
"affinity": {
|
||||
"$id": "#/properties/affinity",
|
||||
"type": "object",
|
||||
"title": "The affinity schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": {},
|
||||
"examples": [
|
||||
{}
|
||||
],
|
||||
"required": [],
|
||||
"additionalProperties": true
|
||||
},
|
||||
"secret": {
|
||||
"$id": "#/properties/secret",
|
||||
"type": "object",
|
||||
"title": "The secret schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": {},
|
||||
"examples": [
|
||||
{
|
||||
"enabled": false
|
||||
}
|
||||
],
|
||||
"required": [
|
||||
"enabled"
|
||||
],
|
||||
"properties": {
|
||||
"enabled": {
|
||||
"$id": "#/properties/secret/properties/enabled",
|
||||
"type": "boolean",
|
||||
"title": "The enabled schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": false,
|
||||
"examples": [
|
||||
false
|
||||
]
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
},
|
||||
"shell": {
|
||||
"$id": "#/properties/shell",
|
||||
"type": "string",
|
||||
"title": "Shell",
|
||||
"description": "The shell to use",
|
||||
"default": "/bin/sh"
|
||||
},
|
||||
"command": {
|
||||
"$id": "#/properties/command",
|
||||
"type": "string",
|
||||
"title": "Command",
|
||||
"description": "The command to run in the cronjob",
|
||||
"default": "echo \"I'm alive\""
|
||||
},
|
||||
"vars": {
|
||||
"$id": "#/properties/vars",
|
||||
"type": "object",
|
||||
"title": "Environment variables",
|
||||
"description": "",
|
||||
"default": {},
|
||||
"examples": [
|
||||
{
|
||||
"VAR_1": "value 1",
|
||||
"VAR_2": "value 2"
|
||||
}
|
||||
],
|
||||
"required": [],
|
||||
"properties": {},
|
||||
"additionalProperties": true
|
||||
},
|
||||
"sealedSecrets": {
|
||||
"$id": "#/properties/sealedSecrets",
|
||||
"type": "object",
|
||||
"title": "Sealed Secrets",
|
||||
"description": "",
|
||||
"default": {},
|
||||
"examples": [
|
||||
{
|
||||
"VAR_1": "value 1",
|
||||
"VAR_2": "value 2"
|
||||
}
|
||||
],
|
||||
"required": [],
|
||||
"properties": {},
|
||||
"additionalProperties": true
|
||||
},
|
||||
"volumes": {
|
||||
"$id": "#/properties/volumes",
|
||||
"type": "array",
|
||||
"title": "Volumes",
|
||||
"default": [],
|
||||
"additionalItems": true,
|
||||
"items": {
|
||||
"$id": "#/properties/volumes/items",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {
|
||||
"$id": "#/properties/volumes/items/anyOf/0/properties/name",
|
||||
"type": "string",
|
||||
"title": "Name",
|
||||
"description": "The name of the volume. Used only to recognize the volumes purpose in the config later on",
|
||||
"default": "data"
|
||||
},
|
||||
"path": {
|
||||
"$id": "#/properties/volumes/items/anyOf/0/properties/path",
|
||||
"type": "string",
|
||||
"title": "Path",
|
||||
"description": "The mount path inside the container",
|
||||
"default": "/data"
|
||||
},
|
||||
"size": {
|
||||
"$id": "#/properties/volumes/items/anyOf/0/properties/size",
|
||||
"type": "string",
|
||||
"title": "Size",
|
||||
"description": "",
|
||||
"default": "10Gi"
|
||||
},
|
||||
"storageClass": {
|
||||
"$id": "#/properties/volumes/items/anyOf/0/properties/storageClass",
|
||||
"type": "string",
|
||||
"title": "Storage Class",
|
||||
"description": "The slug indicating the disk type in your cloud provider. `standard` on Google Cloud, `default` on Azure; `do-block-storage` on Digital Ocean",
|
||||
"default": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
}
|
||||
@@ -27,3 +27,9 @@ affinity: {}
|
||||
|
||||
secret:
|
||||
enabled: false
|
||||
|
||||
constraints:
|
||||
successfulJobsHistoryLimit: 1
|
||||
failedJobsHistoryLimit: 1
|
||||
concurrencyPolicy: Forbid
|
||||
startingDeadlineSeconds: 120
|
||||
|
||||
@@ -15,4 +15,4 @@ type: application
|
||||
# This is the chart version. This version number should be incremented each time you make changes
|
||||
# to the chart and its templates, including the app version.
|
||||
# Versions are expected to follow Semantic Versioning (https://semver.org/)
|
||||
version: 0.2.0
|
||||
version: 0.3.0
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
namespaces:
|
||||
- name: staging
|
||||
quota:
|
||||
cpu: 32
|
||||
memory: "64Gi"
|
||||
storage: "500Gi"
|
||||
overcommit:
|
||||
cpu: 1
|
||||
memory: 1
|
||||
podMaximumResources:
|
||||
cpu: 4
|
||||
memory: "8Gi"
|
||||
podDefaultResources:
|
||||
cpu: "200m"
|
||||
memory: "200Mi"
|
||||
podResourceOvercommit:
|
||||
cpu: 2
|
||||
memory: 1
|
||||
@@ -1,22 +1,5 @@
|
||||
{{- range .Values.namespaces }}
|
||||
{{- $limits := $.Values.pod.limits }}
|
||||
{{- if .pod }}
|
||||
{{- if .pod.limits }}
|
||||
{{- $limits = .pod.limits }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- $overcommit := $.Values.pod.overcommit }}
|
||||
{{- if .pod }}
|
||||
{{- if .pod.overcommit }}
|
||||
{{- $overcommit = .pod.overcommit }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- $defaults := $.Values.pod.defaults }}
|
||||
{{- if .pod }}
|
||||
{{- if .pod.defaults }}
|
||||
{{- $defaults = .pod.defaults }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- if and .podMaximumResources (and .podDefaultResources .podResourceOvercommit) }}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: LimitRange
|
||||
@@ -26,19 +9,26 @@ metadata:
|
||||
spec:
|
||||
limits:
|
||||
- type: Container
|
||||
{{- if .podMaximumResources }}
|
||||
max:
|
||||
cpu: 4
|
||||
memory: "8Gi"
|
||||
min:
|
||||
cpu: "100m"
|
||||
memory: "50Mi"
|
||||
cpu: {{ .podMaximumResources.cpu }}
|
||||
memory: {{ .podMaximumResources.memory }}
|
||||
{{- end }}
|
||||
{{- if .podDefaultResources }}
|
||||
default:
|
||||
cpu: {{ $defaults.cpu }}
|
||||
memory: {{ $defaults.memory }}
|
||||
cpu: {{ .podDefaultResources.cpu }}
|
||||
memory: {{ .podDefaultResources.memory }}
|
||||
defaultRequest:
|
||||
cpu: {{ $defaults.cpu }}
|
||||
memory: {{ $defaults.memory }}
|
||||
cpu: {{ .podDefaultResources.cpu }}
|
||||
memory: {{ .podDefaultResources.memory }}
|
||||
{{- end }}
|
||||
maxLimitRequestRatio:
|
||||
cpu: {{ $overcommit.cpu }}
|
||||
memory: {{ $overcommit.memory }}
|
||||
{{- if .podResourceOvercommit }}
|
||||
cpu: {{ .podResourceOvercommit.cpu }}
|
||||
memory: {{ .podResourceOvercommit.memory }}
|
||||
{{ else }}
|
||||
cpu: 1
|
||||
memory: 1
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
@@ -4,8 +4,8 @@ apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
name: {{ .name }}
|
||||
{{- if .annotations }}
|
||||
annotations:
|
||||
{{- if .annotations }}
|
||||
{{- toYaml .annotations | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
@@ -1,16 +1,5 @@
|
||||
{{- range .Values.namespaces }}
|
||||
{{- $budget := $.Values.namespace.budget }}
|
||||
{{- if .namespace }}
|
||||
{{- if .namespace.budget }}
|
||||
{{- $budget = .namespace.budget }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- $overcommit := $.Values.namespace.overcommit }}
|
||||
{{- if .namespace }}
|
||||
{{- if .namespace.overcommit }}
|
||||
{{- $overcommit = .namespace.overcommit }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- if and .quota .overcommit }}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: ResourceQuota
|
||||
@@ -18,9 +7,10 @@ metadata:
|
||||
name: {{ .name }}
|
||||
spec:
|
||||
hard:
|
||||
limits.cpu: {{ $budget.cpu | mul $overcommit.cpu }}
|
||||
limits.memory: {{ $budget.memory | regexFind "[1-9]+" | mul $overcommit.memory }}{{ $budget.memory | regexFind "[a-zA-Z]+" }}
|
||||
requests.cpu: {{ $budget.cpu }}
|
||||
requests.memory: {{ $budget.memory }}
|
||||
requests.storage: {{ $budget.storage }}
|
||||
limits.cpu: {{ .quota.cpu | mul .overcommit.cpu }}
|
||||
limits.memory: {{ .quota.memory | regexFind "[1-9]+" | mul .overcommit.memory }}{{ .quota.memory | regexFind "[a-zA-Z]+" }}
|
||||
requests.cpu: {{ .quota.cpu }}
|
||||
requests.memory: {{ .quota.memory }}
|
||||
requests.storage: {{ .quota.storage }}
|
||||
{{- end }}
|
||||
{{- end -}}
|
||||
|
||||
@@ -2,52 +2,19 @@ suite: test deployment
|
||||
templates:
|
||||
- limit-range.yaml
|
||||
tests:
|
||||
- it: Should set default limits
|
||||
set:
|
||||
pod:
|
||||
limits:
|
||||
cpu: 4
|
||||
memory: "8Gi"
|
||||
defaults:
|
||||
cpu: "200m"
|
||||
memory: "200Mi"
|
||||
overcommit:
|
||||
cpu: 10
|
||||
memory: 2
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.limits
|
||||
value:
|
||||
- type: Container
|
||||
max:
|
||||
cpu: 4
|
||||
memory: "8Gi"
|
||||
min:
|
||||
cpu: "100m"
|
||||
memory: "50Mi"
|
||||
default:
|
||||
cpu: "200m"
|
||||
memory: "200Mi"
|
||||
defaultRequest:
|
||||
cpu: "200m"
|
||||
memory: "200Mi"
|
||||
maxLimitRequestRatio:
|
||||
cpu: 10
|
||||
memory: 2
|
||||
- it: Should set namespace specific limits
|
||||
set:
|
||||
namespaces:
|
||||
- name: staging
|
||||
pod:
|
||||
limits:
|
||||
cpu: 4
|
||||
memory: "8Gi"
|
||||
defaults:
|
||||
cpu: "200m"
|
||||
memory: "200Mi"
|
||||
overcommit:
|
||||
cpu: 10
|
||||
memory: 2
|
||||
podMaximumResources:
|
||||
cpu: 4
|
||||
memory: "8Gi"
|
||||
podDefaultResources:
|
||||
cpu: "200m"
|
||||
memory: "200Mi"
|
||||
podResourceOvercommit:
|
||||
cpu: 2
|
||||
memory: 1
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.limits
|
||||
@@ -56,9 +23,6 @@ tests:
|
||||
max:
|
||||
cpu: 4
|
||||
memory: "8Gi"
|
||||
min:
|
||||
cpu: "100m"
|
||||
memory: "50Mi"
|
||||
default:
|
||||
cpu: "200m"
|
||||
memory: "200Mi"
|
||||
@@ -66,5 +30,5 @@ tests:
|
||||
cpu: "200m"
|
||||
memory: "200Mi"
|
||||
maxLimitRequestRatio:
|
||||
cpu: 10
|
||||
memory: 2
|
||||
cpu: 2
|
||||
memory: 1
|
||||
|
||||
@@ -10,3 +10,10 @@ tests:
|
||||
- equal:
|
||||
path: metadata.name
|
||||
value: staging
|
||||
- it: Should not set annotations if none provided in values
|
||||
set:
|
||||
namespaces:
|
||||
- name: staging
|
||||
asserts:
|
||||
- isNull:
|
||||
path: metadata.annotations
|
||||
|
||||
@@ -2,16 +2,37 @@ suite: test deployment
|
||||
templates:
|
||||
- resource-quota.yaml
|
||||
tests:
|
||||
- it: Should set default quota values
|
||||
- it: Should set namespace specific quotas
|
||||
set:
|
||||
namespace:
|
||||
budget:
|
||||
cpu: 32
|
||||
memory: "64Gi"
|
||||
storage: "500Gi"
|
||||
overcommit:
|
||||
cpu: 2
|
||||
memory: 1
|
||||
namespaces:
|
||||
- name: staging
|
||||
quota:
|
||||
cpu: 32
|
||||
memory: "64Gi"
|
||||
storage: "500Gi"
|
||||
overcommit:
|
||||
cpu: 1
|
||||
memory: 1
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.hard
|
||||
value:
|
||||
limits.cpu: 32
|
||||
limits.memory: "64Gi"
|
||||
requests.cpu: 32
|
||||
requests.memory: "64Gi"
|
||||
requests.storage: "500Gi"
|
||||
- it: Should handle overcommit
|
||||
set:
|
||||
namespaces:
|
||||
- name: staging
|
||||
quota:
|
||||
cpu: 32
|
||||
memory: "64Gi"
|
||||
storage: "500Gi"
|
||||
overcommit:
|
||||
cpu: 2
|
||||
memory: 1
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.hard
|
||||
@@ -21,29 +42,3 @@ tests:
|
||||
requests.cpu: 32
|
||||
requests.memory: "64Gi"
|
||||
requests.storage: "500Gi"
|
||||
- it: Should set namespace specific quotas
|
||||
set:
|
||||
namespaces:
|
||||
- name: staging
|
||||
namespace:
|
||||
budget:
|
||||
cpu: 8
|
||||
memory: "16Gi"
|
||||
storage: "100Gi"
|
||||
namespace:
|
||||
budget:
|
||||
cpu: 32
|
||||
memory: "64Gi"
|
||||
storage: "500Gi"
|
||||
overcommit:
|
||||
cpu: 2
|
||||
memory: 1
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.hard
|
||||
value:
|
||||
limits.cpu: 16
|
||||
limits.memory: "16Gi"
|
||||
requests.cpu: 8
|
||||
requests.memory: "16Gi"
|
||||
requests.storage: "100Gi"
|
||||
|
||||
@@ -1,715 +0,0 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema",
|
||||
"$id": "http://example.com/example.json",
|
||||
"type": "object",
|
||||
"title": "The root schema",
|
||||
"description": "The root schema comprises the entire JSON document.",
|
||||
"default": {},
|
||||
"examples": [
|
||||
{
|
||||
"namespaces": [
|
||||
{
|
||||
"name": "staging",
|
||||
"namespace": {
|
||||
"budget": {
|
||||
"cpu": 32,
|
||||
"memory": "64Gi",
|
||||
"storage": "500Gi"
|
||||
},
|
||||
"overcommit": {
|
||||
"cpu": 2,
|
||||
"memory": 1
|
||||
}
|
||||
},
|
||||
"pod": {
|
||||
"limits": {
|
||||
"cpu": 4,
|
||||
"memory": "8Gi"
|
||||
},
|
||||
"defaults": {
|
||||
"cpu": "200m",
|
||||
"memory": "200Mi"
|
||||
},
|
||||
"overcommit": {
|
||||
"cpu": 10,
|
||||
"memory": 2
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"namespace": {
|
||||
"budget": {
|
||||
"cpu": 32,
|
||||
"memory": "64Gi",
|
||||
"storage": "500Gi"
|
||||
},
|
||||
"overcommit": {
|
||||
"cpu": 2,
|
||||
"memory": 1
|
||||
}
|
||||
},
|
||||
"pod": {
|
||||
"limits": {
|
||||
"cpu": 4,
|
||||
"memory": "8Gi"
|
||||
},
|
||||
"defaults": {
|
||||
"cpu": "200m",
|
||||
"memory": "200Mi"
|
||||
},
|
||||
"overcommit": {
|
||||
"cpu": 10,
|
||||
"memory": 2
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"required": [
|
||||
"namespaces",
|
||||
"namespace",
|
||||
"pod"
|
||||
],
|
||||
"properties": {
|
||||
"namespaces": {
|
||||
"$id": "#/properties/namespaces",
|
||||
"type": "array",
|
||||
"title": "The namespaces schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": [],
|
||||
"examples": [
|
||||
[
|
||||
{
|
||||
"name": "staging",
|
||||
"namespace": {
|
||||
"budget": {
|
||||
"cpu": 32,
|
||||
"memory": "64Gi",
|
||||
"storage": "500Gi"
|
||||
},
|
||||
"overcommit": {
|
||||
"cpu": 2,
|
||||
"memory": 1
|
||||
}
|
||||
},
|
||||
"pod": {
|
||||
"limits": {
|
||||
"cpu": 4,
|
||||
"memory": "8Gi"
|
||||
},
|
||||
"defaults": {
|
||||
"cpu": "200m",
|
||||
"memory": "200Mi"
|
||||
},
|
||||
"overcommit": {
|
||||
"cpu": 10,
|
||||
"memory": 2
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
],
|
||||
"additionalItems": true,
|
||||
"items": {
|
||||
"$id": "#/properties/namespaces/items",
|
||||
"anyOf": [
|
||||
{
|
||||
"$id": "#/properties/namespaces/items/anyOf/0",
|
||||
"type": "object",
|
||||
"title": "The first anyOf schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": {},
|
||||
"examples": [
|
||||
{
|
||||
"name": "staging",
|
||||
"namespace": {
|
||||
"budget": {
|
||||
"cpu": 32,
|
||||
"memory": "64Gi",
|
||||
"storage": "500Gi"
|
||||
},
|
||||
"overcommit": {
|
||||
"cpu": 2,
|
||||
"memory": 1
|
||||
}
|
||||
},
|
||||
"pod": {
|
||||
"limits": {
|
||||
"cpu": 4,
|
||||
"memory": "8Gi"
|
||||
},
|
||||
"defaults": {
|
||||
"cpu": "200m",
|
||||
"memory": "200Mi"
|
||||
},
|
||||
"overcommit": {
|
||||
"cpu": 10,
|
||||
"memory": 2
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"required": [
|
||||
"name",
|
||||
"namespace",
|
||||
"pod"
|
||||
],
|
||||
"properties": {
|
||||
"name": {
|
||||
"$id": "#/properties/namespaces/items/anyOf/0/properties/name",
|
||||
"type": "string",
|
||||
"title": "The name schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": "",
|
||||
"examples": [
|
||||
"staging"
|
||||
]
|
||||
},
|
||||
"namespace": {
|
||||
"$id": "#/properties/namespaces/items/anyOf/0/properties/namespace",
|
||||
"type": "object",
|
||||
"title": "The namespace schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": {},
|
||||
"examples": [
|
||||
{
|
||||
"budget": {
|
||||
"cpu": 32,
|
||||
"memory": "64Gi",
|
||||
"storage": "500Gi"
|
||||
},
|
||||
"overcommit": {
|
||||
"cpu": 2,
|
||||
"memory": 1
|
||||
}
|
||||
}
|
||||
],
|
||||
"required": [
|
||||
"budget",
|
||||
"overcommit"
|
||||
],
|
||||
"properties": {
|
||||
"budget": {
|
||||
"$id": "#/properties/namespaces/items/anyOf/0/properties/namespace/properties/budget",
|
||||
"type": "object",
|
||||
"title": "The budget schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": {},
|
||||
"examples": [
|
||||
{
|
||||
"cpu": 32,
|
||||
"memory": "64Gi",
|
||||
"storage": "500Gi"
|
||||
}
|
||||
],
|
||||
"required": [
|
||||
"cpu",
|
||||
"memory",
|
||||
"storage"
|
||||
],
|
||||
"properties": {
|
||||
"cpu": {
|
||||
"$id": "#/properties/namespaces/items/anyOf/0/properties/namespace/properties/budget/properties/cpu",
|
||||
"type": "integer",
|
||||
"title": "The cpu schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": 0,
|
||||
"examples": [
|
||||
32
|
||||
]
|
||||
},
|
||||
"memory": {
|
||||
"$id": "#/properties/namespaces/items/anyOf/0/properties/namespace/properties/budget/properties/memory",
|
||||
"type": "string",
|
||||
"title": "The memory schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": "",
|
||||
"examples": [
|
||||
"64Gi"
|
||||
]
|
||||
},
|
||||
"storage": {
|
||||
"$id": "#/properties/namespaces/items/anyOf/0/properties/namespace/properties/budget/properties/storage",
|
||||
"type": "string",
|
||||
"title": "The storage schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": "",
|
||||
"examples": [
|
||||
"500Gi"
|
||||
]
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
},
|
||||
"overcommit": {
|
||||
"$id": "#/properties/namespaces/items/anyOf/0/properties/namespace/properties/overcommit",
|
||||
"type": "object",
|
||||
"title": "The overcommit schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": {},
|
||||
"examples": [
|
||||
{
|
||||
"cpu": 2,
|
||||
"memory": 1
|
||||
}
|
||||
],
|
||||
"required": [
|
||||
"cpu",
|
||||
"memory"
|
||||
],
|
||||
"properties": {
|
||||
"cpu": {
|
||||
"$id": "#/properties/namespaces/items/anyOf/0/properties/namespace/properties/overcommit/properties/cpu",
|
||||
"type": "integer",
|
||||
"title": "The cpu schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": 0,
|
||||
"examples": [
|
||||
2
|
||||
]
|
||||
},
|
||||
"memory": {
|
||||
"$id": "#/properties/namespaces/items/anyOf/0/properties/namespace/properties/overcommit/properties/memory",
|
||||
"type": "integer",
|
||||
"title": "The memory schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": 0,
|
||||
"examples": [
|
||||
1
|
||||
]
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
},
|
||||
"pod": {
|
||||
"$id": "#/properties/namespaces/items/anyOf/0/properties/pod",
|
||||
"type": "object",
|
||||
"title": "The pod schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": {},
|
||||
"examples": [
|
||||
{
|
||||
"limits": {
|
||||
"cpu": 4,
|
||||
"memory": "8Gi"
|
||||
},
|
||||
"defaults": {
|
||||
"cpu": "200m",
|
||||
"memory": "200Mi"
|
||||
},
|
||||
"overcommit": {
|
||||
"cpu": 10,
|
||||
"memory": 2
|
||||
}
|
||||
}
|
||||
],
|
||||
"required": [
|
||||
"limits",
|
||||
"defaults",
|
||||
"overcommit"
|
||||
],
|
||||
"properties": {
|
||||
"limits": {
|
||||
"$id": "#/properties/namespaces/items/anyOf/0/properties/pod/properties/limits",
|
||||
"type": "object",
|
||||
"title": "The limits schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": {},
|
||||
"examples": [
|
||||
{
|
||||
"cpu": 4,
|
||||
"memory": "8Gi"
|
||||
}
|
||||
],
|
||||
"required": [
|
||||
"cpu",
|
||||
"memory"
|
||||
],
|
||||
"properties": {
|
||||
"cpu": {
|
||||
"$id": "#/properties/namespaces/items/anyOf/0/properties/pod/properties/limits/properties/cpu",
|
||||
"type": "integer",
|
||||
"title": "The cpu schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": 0,
|
||||
"examples": [
|
||||
4
|
||||
]
|
||||
},
|
||||
"memory": {
|
||||
"$id": "#/properties/namespaces/items/anyOf/0/properties/pod/properties/limits/properties/memory",
|
||||
"type": "string",
|
||||
"title": "The memory schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": "",
|
||||
"examples": [
|
||||
"8Gi"
|
||||
]
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
},
|
||||
"defaults": {
|
||||
"$id": "#/properties/namespaces/items/anyOf/0/properties/pod/properties/defaults",
|
||||
"type": "object",
|
||||
"title": "The defaults schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": {},
|
||||
"examples": [
|
||||
{
|
||||
"cpu": "200m",
|
||||
"memory": "200Mi"
|
||||
}
|
||||
],
|
||||
"required": [
|
||||
"cpu",
|
||||
"memory"
|
||||
],
|
||||
"properties": {
|
||||
"cpu": {
|
||||
"$id": "#/properties/namespaces/items/anyOf/0/properties/pod/properties/defaults/properties/cpu",
|
||||
"type": "string",
|
||||
"title": "The cpu schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": "",
|
||||
"examples": [
|
||||
"200m"
|
||||
]
|
||||
},
|
||||
"memory": {
|
||||
"$id": "#/properties/namespaces/items/anyOf/0/properties/pod/properties/defaults/properties/memory",
|
||||
"type": "string",
|
||||
"title": "The memory schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": "",
|
||||
"examples": [
|
||||
"200Mi"
|
||||
]
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
},
|
||||
"overcommit": {
|
||||
"$id": "#/properties/namespaces/items/anyOf/0/properties/pod/properties/overcommit",
|
||||
"type": "object",
|
||||
"title": "The overcommit schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": {},
|
||||
"examples": [
|
||||
{
|
||||
"cpu": 10,
|
||||
"memory": 2
|
||||
}
|
||||
],
|
||||
"required": [
|
||||
"cpu",
|
||||
"memory"
|
||||
],
|
||||
"properties": {
|
||||
"cpu": {
|
||||
"$id": "#/properties/namespaces/items/anyOf/0/properties/pod/properties/overcommit/properties/cpu",
|
||||
"type": "integer",
|
||||
"title": "The cpu schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": 0,
|
||||
"examples": [
|
||||
10
|
||||
]
|
||||
},
|
||||
"memory": {
|
||||
"$id": "#/properties/namespaces/items/anyOf/0/properties/pod/properties/overcommit/properties/memory",
|
||||
"type": "integer",
|
||||
"title": "The memory schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": 0,
|
||||
"examples": [
|
||||
2
|
||||
]
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"namespace": {
|
||||
"$id": "#/properties/namespace",
|
||||
"type": "object",
|
||||
"title": "The namespace schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": {},
|
||||
"examples": [
|
||||
{
|
||||
"budget": {
|
||||
"cpu": 32,
|
||||
"memory": "64Gi",
|
||||
"storage": "500Gi"
|
||||
},
|
||||
"overcommit": {
|
||||
"cpu": 2,
|
||||
"memory": 1
|
||||
}
|
||||
}
|
||||
],
|
||||
"required": [
|
||||
"budget",
|
||||
"overcommit"
|
||||
],
|
||||
"properties": {
|
||||
"budget": {
|
||||
"$id": "#/properties/namespace/properties/budget",
|
||||
"type": "object",
|
||||
"title": "The budget schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": {},
|
||||
"examples": [
|
||||
{
|
||||
"cpu": 32,
|
||||
"memory": "64Gi",
|
||||
"storage": "500Gi"
|
||||
}
|
||||
],
|
||||
"required": [
|
||||
"cpu",
|
||||
"memory",
|
||||
"storage"
|
||||
],
|
||||
"properties": {
|
||||
"cpu": {
|
||||
"$id": "#/properties/namespace/properties/budget/properties/cpu",
|
||||
"type": "integer",
|
||||
"title": "The cpu schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": 0,
|
||||
"examples": [
|
||||
32
|
||||
]
|
||||
},
|
||||
"memory": {
|
||||
"$id": "#/properties/namespace/properties/budget/properties/memory",
|
||||
"type": "string",
|
||||
"title": "The memory schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": "",
|
||||
"examples": [
|
||||
"64Gi"
|
||||
]
|
||||
},
|
||||
"storage": {
|
||||
"$id": "#/properties/namespace/properties/budget/properties/storage",
|
||||
"type": "string",
|
||||
"title": "The storage schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": "",
|
||||
"examples": [
|
||||
"500Gi"
|
||||
]
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
},
|
||||
"overcommit": {
|
||||
"$id": "#/properties/namespace/properties/overcommit",
|
||||
"type": "object",
|
||||
"title": "The overcommit schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": {},
|
||||
"examples": [
|
||||
{
|
||||
"cpu": 2,
|
||||
"memory": 1
|
||||
}
|
||||
],
|
||||
"required": [
|
||||
"cpu",
|
||||
"memory"
|
||||
],
|
||||
"properties": {
|
||||
"cpu": {
|
||||
"$id": "#/properties/namespace/properties/overcommit/properties/cpu",
|
||||
"type": "integer",
|
||||
"title": "The cpu schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": 0,
|
||||
"examples": [
|
||||
2
|
||||
]
|
||||
},
|
||||
"memory": {
|
||||
"$id": "#/properties/namespace/properties/overcommit/properties/memory",
|
||||
"type": "integer",
|
||||
"title": "The memory schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": 0,
|
||||
"examples": [
|
||||
1
|
||||
]
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
},
|
||||
"pod": {
|
||||
"$id": "#/properties/pod",
|
||||
"type": "object",
|
||||
"title": "The pod schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": {},
|
||||
"examples": [
|
||||
{
|
||||
"limits": {
|
||||
"cpu": 4,
|
||||
"memory": "8Gi"
|
||||
},
|
||||
"defaults": {
|
||||
"cpu": "200m",
|
||||
"memory": "200Mi"
|
||||
},
|
||||
"overcommit": {
|
||||
"cpu": 10,
|
||||
"memory": 2
|
||||
}
|
||||
}
|
||||
],
|
||||
"required": [
|
||||
"limits",
|
||||
"defaults",
|
||||
"overcommit"
|
||||
],
|
||||
"properties": {
|
||||
"limits": {
|
||||
"$id": "#/properties/pod/properties/limits",
|
||||
"type": "object",
|
||||
"title": "The limits schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": {},
|
||||
"examples": [
|
||||
{
|
||||
"cpu": 4,
|
||||
"memory": "8Gi"
|
||||
}
|
||||
],
|
||||
"required": [
|
||||
"cpu",
|
||||
"memory"
|
||||
],
|
||||
"properties": {
|
||||
"cpu": {
|
||||
"$id": "#/properties/pod/properties/limits/properties/cpu",
|
||||
"type": "integer",
|
||||
"title": "The cpu schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": 0,
|
||||
"examples": [
|
||||
4
|
||||
]
|
||||
},
|
||||
"memory": {
|
||||
"$id": "#/properties/pod/properties/limits/properties/memory",
|
||||
"type": "string",
|
||||
"title": "The memory schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": "",
|
||||
"examples": [
|
||||
"8Gi"
|
||||
]
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
},
|
||||
"defaults": {
|
||||
"$id": "#/properties/pod/properties/defaults",
|
||||
"type": "object",
|
||||
"title": "The defaults schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": {},
|
||||
"examples": [
|
||||
{
|
||||
"cpu": "200m",
|
||||
"memory": "200Mi"
|
||||
}
|
||||
],
|
||||
"required": [
|
||||
"cpu",
|
||||
"memory"
|
||||
],
|
||||
"properties": {
|
||||
"cpu": {
|
||||
"$id": "#/properties/pod/properties/defaults/properties/cpu",
|
||||
"type": "string",
|
||||
"title": "The cpu schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": "",
|
||||
"examples": [
|
||||
"200m"
|
||||
]
|
||||
},
|
||||
"memory": {
|
||||
"$id": "#/properties/pod/properties/defaults/properties/memory",
|
||||
"type": "string",
|
||||
"title": "The memory schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": "",
|
||||
"examples": [
|
||||
"200Mi"
|
||||
]
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
},
|
||||
"overcommit": {
|
||||
"$id": "#/properties/pod/properties/overcommit",
|
||||
"type": "object",
|
||||
"title": "The overcommit schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": {},
|
||||
"examples": [
|
||||
{
|
||||
"cpu": 10,
|
||||
"memory": 2
|
||||
}
|
||||
],
|
||||
"required": [
|
||||
"cpu",
|
||||
"memory"
|
||||
],
|
||||
"properties": {
|
||||
"cpu": {
|
||||
"$id": "#/properties/pod/properties/overcommit/properties/cpu",
|
||||
"type": "integer",
|
||||
"title": "The cpu schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": 0,
|
||||
"examples": [
|
||||
10
|
||||
]
|
||||
},
|
||||
"memory": {
|
||||
"$id": "#/properties/pod/properties/overcommit/properties/memory",
|
||||
"type": "integer",
|
||||
"title": "The memory schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"default": 0,
|
||||
"examples": [
|
||||
2
|
||||
]
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
}
|
||||
@@ -1,40 +1 @@
|
||||
namespaces:
|
||||
- name: staging
|
||||
namespace:
|
||||
budget:
|
||||
cpu: 32
|
||||
memory: "64Gi"
|
||||
storage: "500Gi"
|
||||
overcommit:
|
||||
cpu: 2
|
||||
memory: 1
|
||||
pod:
|
||||
limits:
|
||||
cpu: 4
|
||||
memory: "8Gi"
|
||||
defaults:
|
||||
cpu: "200m"
|
||||
memory: "200Mi"
|
||||
overcommit:
|
||||
cpu: 10
|
||||
memory: 2
|
||||
|
||||
namespace:
|
||||
budget:
|
||||
cpu: 32
|
||||
memory: "64Gi"
|
||||
storage: "500Gi"
|
||||
overcommit:
|
||||
cpu: 2
|
||||
memory: 1
|
||||
|
||||
pod:
|
||||
limits:
|
||||
cpu: 4
|
||||
memory: "8Gi"
|
||||
defaults:
|
||||
cpu: "200m"
|
||||
memory: "200Mi"
|
||||
overcommit:
|
||||
cpu: 10
|
||||
memory: 2
|
||||
namespaces: []
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
dependencies:
|
||||
- name: common
|
||||
repository: file://../common
|
||||
version: 0.2.0
|
||||
digest: sha256:ea028bf07fdc361daabca0c0155e4511cc4fffda94d2f697f4d16013f250c8a8
|
||||
generated: "2023-02-17T15:13:57.926786542+01:00"
|
||||
@@ -15,4 +15,9 @@ type: application
|
||||
# This is the chart version. This version number should be incremented each time you make changes
|
||||
# to the chart and its templates, including the app version.
|
||||
# Versions are expected to follow Semantic Versioning (https://semver.org/)
|
||||
version: 0.18.0
|
||||
version: 0.45.0
|
||||
|
||||
dependencies:
|
||||
- name: common
|
||||
version: 0.2.0
|
||||
repository: file://../common
|
||||
|
||||
Binary file not shown.
@@ -19,8 +19,7 @@
|
||||
"schemaIDs": [
|
||||
"#/properties/resources"
|
||||
],
|
||||
"uiSchema": {
|
||||
},
|
||||
"uiSchema": {},
|
||||
"metaData": {
|
||||
"name": "Resources",
|
||||
"icon": "M9 7h6m0 10v-3m-3 3h.01M9 17h.01M9 14h.01M12 14h.01M15 11h.01M12 11h.01M9 11h.01M7 21h10a2 2 0 002-2V5a2 2 0 00-2-2H7a2 2 0 00-2 2v14a2 2 0 002 2z"
|
||||
@@ -28,7 +27,8 @@
|
||||
},
|
||||
{
|
||||
"schemaIDs": [
|
||||
"#/properties/probe"
|
||||
"#/properties/probe",
|
||||
"#/properties/livenessProbe"
|
||||
],
|
||||
"uiSchema": {
|
||||
"#/properties/probe": {
|
||||
@@ -49,6 +49,25 @@
|
||||
"ui:widget": "range"
|
||||
}
|
||||
}
|
||||
},
|
||||
"#/properties/livenessProbe": {
|
||||
"settings": {
|
||||
"initialDelaySeconds": {
|
||||
"ui:widget": "range"
|
||||
},
|
||||
"periodSeconds": {
|
||||
"ui:widget": "range"
|
||||
},
|
||||
"successThreshold": {
|
||||
"ui:widget": "range"
|
||||
},
|
||||
"timeoutSeconds": {
|
||||
"ui:widget": "range"
|
||||
},
|
||||
"failureThreshold": {
|
||||
"ui:widget": "range"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"metaData": {
|
||||
@@ -74,6 +93,7 @@
|
||||
},
|
||||
{
|
||||
"schemaIDs": [
|
||||
"#/properties/secretEnabled",
|
||||
"#/properties/sealedSecrets"
|
||||
],
|
||||
"uiSchema": {
|
||||
@@ -84,7 +104,7 @@
|
||||
}
|
||||
},
|
||||
"metaData": {
|
||||
"name": "Sealed Secrets",
|
||||
"name": "Secrets",
|
||||
"icon": "M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"
|
||||
}
|
||||
},
|
||||
@@ -92,7 +112,18 @@
|
||||
"schemaIDs": [
|
||||
"#/properties/volumes"
|
||||
],
|
||||
"uiSchema": {},
|
||||
"uiSchema": {
|
||||
"#/properties/volumes": {
|
||||
"items": {
|
||||
"emptyDir": {
|
||||
"ui:widget": "hidden"
|
||||
},
|
||||
"configMapValue": {
|
||||
"ui:widget": "textarea"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"metaData": {
|
||||
"name": "Volumes",
|
||||
"icon": "M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4m0 5c0 2.21-3.582 4-8 4s-8-1.79-8-4"
|
||||
@@ -104,7 +135,7 @@
|
||||
],
|
||||
"uiSchema": {},
|
||||
"metaData": {
|
||||
"name": "Host Names",
|
||||
"name": "Ingress",
|
||||
"icon": "M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1"
|
||||
}
|
||||
},
|
||||
@@ -118,5 +149,17 @@
|
||||
"name": "High Availability",
|
||||
"icon": "M9 12l2 2 4-4M7.835 4.697a3.42 3.42 0 001.946-.806 3.42 3.42 0 014.438 0 3.42 3.42 0 001.946.806 3.42 3.42 0 013.138 3.138 3.42 3.42 0 00.806 1.946 3.42 3.42 0 010 4.438 3.42 3.42 0 00-.806 1.946 3.42 3.42 0 01-3.138 3.138 3.42 3.42 0 00-1.946.806 3.42 3.42 0 01-4.438 0 3.42 3.42 0 00-1.946-.806 3.42 3.42 0 01-3.138-3.138 3.42 3.42 0 00-.806-1.946 3.42 3.42 0 010-4.438 3.42 3.42 0 00.806-1.946 3.42 3.42 0 013.138-3.138z"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schemaIDs": [
|
||||
"#/properties/podAnnotations",
|
||||
"#/properties/gitSha",
|
||||
"#/properties/gitRepository"
|
||||
],
|
||||
"uiSchema": {},
|
||||
"metaData": {
|
||||
"name": "Misc",
|
||||
"icon": "M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-3 7h3m-3 4h3m-6-4h.01M9 16h.01"
|
||||
}
|
||||
}
|
||||
]
|
||||
]
|
||||
@@ -48,7 +48,7 @@ Selector labels
|
||||
*/}}
|
||||
{{- define "helm-chart.selectorLabels" -}}
|
||||
app.kubernetes.io/name: {{ include "helm-chart.name" . }}
|
||||
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||
app.kubernetes.io/instance: {{ template "robustName" .Release.Name }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
@@ -68,5 +68,5 @@ Create robustName that can be used as Kubernetes resource name, and as subdomain
|
||||
\W – all but \w .
|
||||
*/}}
|
||||
{{- define "robustName" -}}
|
||||
{{ regexReplaceAll "[^0-9A-Za-z_\\.]+" . "-" | replace "_" "-" | lower | trunc 63 | trimSuffix "-" | trimPrefix "-" }}
|
||||
{{ regexReplaceAll "\\W+" . "-" | replace "_" "-" | lower | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
@@ -1,13 +1 @@
|
||||
{{- if .Values.vars }}
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: {{ template "robustName" .Release.Name }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "helm-chart.labels" . | nindent 4 }}
|
||||
data:
|
||||
{{- range $key, $val := .Values.vars }}
|
||||
{{ $key }}: {{ $val | quote }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- include "common.configmap.tpl" . -}}
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
{{- include "common.customFileConfigmap.tpl" . -}}
|
||||
@@ -5,11 +5,26 @@ metadata:
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "helm-chart.labels" . | nindent 4 }}
|
||||
annotations:
|
||||
kubectl.kubernetes.io/default-container: {{ template "robustName" .Release.Name }}
|
||||
{{- if .Values.gitSha }}
|
||||
gimlet.io/git-sha: {{ .Values.gitSha }}
|
||||
{{- end }}
|
||||
spec:
|
||||
replicas: {{ .Values.replicas }}
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- include "helm-chart.selectorLabels" . | nindent 6 }}
|
||||
{{- $singleReplica := eq (.Values.replicas | int64) 1 }}
|
||||
{{- $strategyNotDefined := not .Values.strategy }}
|
||||
{{- if and (and .Values.volumes $singleReplica) $strategyNotDefined}}
|
||||
strategy:
|
||||
type: Recreate
|
||||
{{- end }}
|
||||
{{- if .Values.strategy }}
|
||||
strategy:
|
||||
type: {{ .Values.strategy }}
|
||||
{{- end }}
|
||||
template:
|
||||
metadata:
|
||||
annotations:
|
||||
@@ -17,6 +32,12 @@ spec:
|
||||
{{- with .Values.podAnnotations }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- if .Values.gitSha }}
|
||||
gimlet.io/git-sha: {{ .Values.gitSha }}
|
||||
{{- end }}
|
||||
{{- if .Values.gitRepository }}
|
||||
gimlet.io/git-repository: {{ .Values.gitRepository }}
|
||||
{{- end }}
|
||||
labels:
|
||||
{{- include "helm-chart.selectorLabels" . | nindent 8 }}
|
||||
spec:
|
||||
@@ -26,6 +47,28 @@ spec:
|
||||
{{- end }}
|
||||
securityContext:
|
||||
{{- toYaml .Values.podSecurityContext | nindent 8 }}
|
||||
{{- if .Values.serviceAccount }}
|
||||
serviceAccountName: {{ .Values.serviceAccount }}
|
||||
{{- end }}
|
||||
initContainers:
|
||||
{{- range .Values.initContainers }}
|
||||
- name: {{ .name }}
|
||||
image: "{{ .image }}:{{ .tag }}"
|
||||
imagePullPolicy: {{ .imagePullPolicy | default "IfNotPresent" }}
|
||||
{{- if .command }}
|
||||
command:
|
||||
- {{ $.Values.shell }}
|
||||
- -c
|
||||
- {{ .command | quote}}
|
||||
{{- end }}
|
||||
volumeMounts:
|
||||
{{- range $.Values.volumes }}
|
||||
{{if (or (hasPrefix "shared-" .name) (hasPrefix "init-" .name))}}
|
||||
- mountPath: {{ .path }}
|
||||
name: {{ .name }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
containers:
|
||||
- name: {{ template "robustName" .Release.Name }}
|
||||
securityContext: &securityContext
|
||||
@@ -38,28 +81,18 @@ spec:
|
||||
- -c
|
||||
- {{ .Values.command | quote }}
|
||||
{{- end }}
|
||||
{{- if or (or (.Values.vars) (.Values.secretEnabled)) .Values.sealedSecrets }}
|
||||
envFrom: &envFrom
|
||||
{{- if .Values.vars }}
|
||||
- configMapRef:
|
||||
name: {{ template "robustName" .Release.Name }}
|
||||
{{- end }}
|
||||
{{- if .Values.secretEnabled }}
|
||||
- secretRef:
|
||||
name: {{ .Values.secretName | default (include "robustName" $.Release.Name) }}
|
||||
{{- end }}
|
||||
{{- if .Values.sealedSecrets }}
|
||||
- secretRef:
|
||||
name: {{ template "robustName" .Release.Name }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- include "common.envFromRef.tpl" . | nindent 10 }}
|
||||
ports:
|
||||
{{- if not .Values.containerPortYaml }}
|
||||
{{- if not .Values.ports }}
|
||||
- name: http
|
||||
containerPort: {{ .Values.containerPort }}
|
||||
protocol: TCP
|
||||
{{ else }}
|
||||
{{- toYaml .Values.containerPortYaml | nindent 12 }}
|
||||
{{- range .Values.ports }}
|
||||
- name: {{ .name }}
|
||||
containerPort: {{ .containerPort }}
|
||||
protocol: TCP
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- if .Values.probe.enabled }}
|
||||
readinessProbe:
|
||||
@@ -71,33 +104,31 @@ spec:
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- if or (or (.Values.volumes) (.Values.sealedFileSecrets)) .Values.fileSecrets }}
|
||||
volumeMounts: &volumeMounts
|
||||
{{- range .Values.volumes }}
|
||||
- name: {{ .name }}
|
||||
mountPath: {{ .path }}
|
||||
{{- end }}
|
||||
{{- range .Values.sealedFileSecrets }}
|
||||
- name: {{ .name }}
|
||||
mountPath: {{ .path }}
|
||||
readOnly: true
|
||||
{{- end }}
|
||||
{{- range .Values.fileSecrets }}
|
||||
- name: {{ .name }}
|
||||
mountPath: {{ .path }}
|
||||
readOnly: true
|
||||
{{- if .Values.livenessProbe.enabled }}
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: {{ .Values.livenessProbe.path }}
|
||||
port: {{ .Values.containerPort }}
|
||||
scheme: HTTP
|
||||
{{- with .Values.livenessProbe.settings }}
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- include "common.volumeMountsRef.tpl" . | nindent 10 }}
|
||||
{{- if not .Values.resources.ignore }}
|
||||
resources:
|
||||
{{- toYaml .Values.resources | nindent 12 }}
|
||||
{{- if .Values.debugSidecarEnabled }}
|
||||
- name: {{ template "robustName" .Release.Name }}-debug
|
||||
{{- end }}
|
||||
{{- if .Values.sidecar }}
|
||||
- name: {{ template "robustName" .Release.Name }}-sidecar
|
||||
securityContext: *securityContext
|
||||
image: {{ .Values.debugSidecar.image }}
|
||||
image: {{ .Values.sidecar.repository }}:{{ .Values.sidecar.tag }}
|
||||
{{- if .Values.sidecar.command }}
|
||||
command:
|
||||
- {{ .Values.debugSidecar.shell }}
|
||||
- {{ .Values.sidecar.shell }}
|
||||
- -c
|
||||
- {{ .Values.debugSidecar.command | quote }}
|
||||
- {{ .Values.sidecar.command | quote }}
|
||||
{{- end }}
|
||||
{{- if or (or (.Values.vars) (.Values.secretEnabled)) .Values.sealedSecrets }}
|
||||
envFrom: *envFrom
|
||||
{{- end }}
|
||||
@@ -105,24 +136,7 @@ spec:
|
||||
volumeMounts: *volumeMounts
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- if or (or (.Values.volumes) (.Values.sealedFileSecrets)) .Values.fileSecrets }}
|
||||
volumes:
|
||||
{{- range .Values.volumes }}
|
||||
- name: {{ .name }}
|
||||
persistentVolumeClaim:
|
||||
claimName: {{ printf "%s-%s" $.Release.Name .name }}
|
||||
{{- end }}
|
||||
{{- range .Values.sealedFileSecrets }}
|
||||
- name: {{ .name }}
|
||||
secret:
|
||||
secretName: {{ printf "%s-%s" $.Release.Name .name }}
|
||||
{{- end }}
|
||||
{{- range .Values.fileSecrets }}
|
||||
- name: {{ .name }}
|
||||
secret:
|
||||
secretName: {{ printf "%s-%s" $.Release.Name .name }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- include "common.volumesRef.tpl" . | nindent 6 }}
|
||||
{{- with .Values.nodeSelector }}
|
||||
nodeSelector:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
{{- if .Values.extraDeploy }}
|
||||
{{ .Values.extraDeploy }}
|
||||
{{- end }}
|
||||
@@ -0,0 +1 @@
|
||||
{{- include "common.fileSecret.tpl" . -}}
|
||||
@@ -1,34 +1,57 @@
|
||||
{{- $labels := include "helm-chart.labels" . -}}
|
||||
|
||||
{{- with .Values.ingress -}}
|
||||
{{- $robustName := include "robustName" $.Release.Name -}}
|
||||
{{- if semverCompare ">=1.14-0" $.Capabilities.KubeVersion.GitVersion -}}
|
||||
apiVersion: networking.k8s.io/v1beta1
|
||||
{{- else -}}
|
||||
apiVersion: extensions/v1beta1
|
||||
{{/* OneChart ingress snippet */}}
|
||||
{{- define "onechart.ingress" }}
|
||||
{{- $robustName := include "robustName" .root.Release.Name -}}
|
||||
{{- $resourceName := $robustName -}}
|
||||
{{- if .longName }}
|
||||
{{- $resourceName = printf "%s-%s" $robustName (include "robustName" .ingress.host) -}}
|
||||
{{- end }}
|
||||
---
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: {{ $robustName }}
|
||||
namespace: {{ $.Release.Namespace }}
|
||||
name: {{ $resourceName }}
|
||||
namespace: {{ .root.Release.Namespace }}
|
||||
labels:
|
||||
{{- $labels | nindent 4 }}
|
||||
{{- with .annotations }}
|
||||
{{- include "helm-chart.labels" .root | nindent 4 }}
|
||||
{{- if or (or .root.Values.gitSha .ingress.annotations) .root.Values.gitRepository }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- if .ingress.annotations }}
|
||||
{{- toYaml .ingress.annotations | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- if .root.Values.gitSha }}
|
||||
gimlet.io/git-sha: {{ .root.Values.gitSha }}
|
||||
{{- end }}
|
||||
{{- if .root.Values.gitRepository }}
|
||||
gimlet.io/git-repository: {{ .root.Values.gitRepository }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
spec:
|
||||
{{- if default false .tlsEnabled }}
|
||||
{{- if .ingress.ingressClassName }}
|
||||
ingressClassName: {{ .ingress.ingressClassName }}
|
||||
{{- end }}
|
||||
{{- if default false .ingress.tlsEnabled }}
|
||||
tls:
|
||||
- hosts:
|
||||
- {{ template "robustName" .host | quote }}
|
||||
secretName: {{ printf "tls-%s" $robustName }}
|
||||
- {{ .ingress.host | quote }}
|
||||
secretName: {{ printf "tls-%s" $resourceName }}
|
||||
{{- end }}
|
||||
rules:
|
||||
- host: {{ template "robustName" .host | quote }}
|
||||
- host: {{ .ingress.host | quote }}
|
||||
http:
|
||||
paths:
|
||||
- backend:
|
||||
serviceName: {{ template "robustName" $.Release.Name }}
|
||||
servicePort: {{ $.Values.containerPort }}
|
||||
- path: {{ .ingress.path | default "/" | quote }}
|
||||
pathType: "Prefix"
|
||||
backend:
|
||||
service:
|
||||
name: {{ $robustName }}
|
||||
port:
|
||||
number: {{ if .root.Values.svcPort }}{{ .root.Values.svcPort }}{{ else }}{{ .root.Values.containerPort }}{{ end }}
|
||||
{{- end }}
|
||||
|
||||
{{- with .Values.ingress }}
|
||||
{{- template "onechart.ingress" (dict "root" $ "ingress" .) }}
|
||||
{{- end }}
|
||||
|
||||
{{- range .Values.ingresses }}
|
||||
{{template "onechart.ingress" (dict "root" $ "ingress" . "longName" true) }}
|
||||
{{- end }}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{{- if and (.Values.podDisruptionBudgetEnabled) (gt (.Values.replicas | int64) 1) }}
|
||||
apiVersion: policy/v1beta1
|
||||
apiVersion: policy/v1
|
||||
kind: PodDisruptionBudget
|
||||
metadata:
|
||||
name: {{ template "robustName" .Release.Name }}
|
||||
|
||||
@@ -1,16 +1 @@
|
||||
{{- range .Values.volumes }}
|
||||
{{- $robustName := include "robustName" $.Release.Name -}}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: {{ printf "%s-%s" $robustName .name }}
|
||||
namespace: {{ $.Release.Namespace }}
|
||||
spec:
|
||||
accessModes:
|
||||
- {{ .accessMode | default "ReadWriteOnce" }}
|
||||
storageClassName: {{ .storageClass | default "local-path" }}
|
||||
resources:
|
||||
requests:
|
||||
storage: {{ .size | default "1Gi" }}
|
||||
{{- end }}
|
||||
{{- include "common.pvc.tpl" . -}}
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
{{- include "common.sealedFileSecret.tpl" . -}}
|
||||
@@ -0,0 +1 @@
|
||||
{{- include "common.sealedSecret.tpl" . -}}
|
||||
@@ -5,12 +5,42 @@ metadata:
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "helm-chart.labels" . | nindent 4 }}
|
||||
{{- if or .Values.gitRepository .Values.gitSha }}
|
||||
annotations:
|
||||
{{- if .Values.gitRepository }}
|
||||
gimlet.io/git-repository: {{ .Values.gitRepository }}
|
||||
{{- end }}
|
||||
{{- if .Values.gitSha }}
|
||||
gimlet.io/git-sha: {{ .Values.gitSha }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
spec:
|
||||
type: {{ if .Values.nodePortEnabled }}NodePort{{ else }}ClusterIP{{ end }}
|
||||
type: {{ if .Values.nodePortEnabled }}NodePort{{ else if .Values.loadbalancerEnabled }}LoadBalancer{{ else }}ClusterIP{{ end }}
|
||||
{{- if .Values.stickySessions }}
|
||||
sessionAffinityConfig:
|
||||
clientIP:
|
||||
timeoutSeconds: 10800
|
||||
externalTrafficPolicy: Local
|
||||
{{- end }}
|
||||
ports:
|
||||
- port: {{ .Values.containerPort }}
|
||||
{{- if not .Values.ports }}
|
||||
- port: {{ if .Values.svcPort }}{{ .Values.svcPort }}{{ else }}{{ .Values.containerPort }}{{ end }}
|
||||
targetPort: http
|
||||
protocol: TCP
|
||||
name: http
|
||||
{{- if .Values.nodePort }}
|
||||
nodePort: {{ .Values.nodePort }}
|
||||
{{- end }}
|
||||
{{ else }}
|
||||
{{- range .Values.ports }}
|
||||
- name: {{ .name }}
|
||||
port: {{ if .svcPort }}{{ .svcPort }}{{ else }}{{ .containerPort }}{{ end }}
|
||||
{{- if .nodePort }}
|
||||
nodePort: {{ .nodePort }}
|
||||
{{- end }}
|
||||
targetPort: {{ .name }}
|
||||
protocol: TCP
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
selector:
|
||||
{{- include "helm-chart.selectorLabels" . | nindent 4 }}
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
suite: test deployment
|
||||
templates:
|
||||
- custom-file-configmap.yaml
|
||||
tests:
|
||||
- it: Should create configmaps for custom string files
|
||||
set:
|
||||
volumes:
|
||||
- fileName: myFile.conf
|
||||
fileContent: |
|
||||
blablabla
|
||||
bla
|
||||
path: /randomPath/myFile.conf
|
||||
subPath: myFile.conf
|
||||
asserts:
|
||||
- hasDocuments:
|
||||
count: 1
|
||||
- equal:
|
||||
path: data
|
||||
value:
|
||||
myFile.conf: |
|
||||
blablabla
|
||||
bla
|
||||
@@ -1,12 +0,0 @@
|
||||
suite: test deployment
|
||||
templates:
|
||||
- deployment.yaml
|
||||
- configmap.yaml
|
||||
tests:
|
||||
- it: Should add a debug sidecar
|
||||
set:
|
||||
debugSidecarEnabled: true
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.containers[1].image
|
||||
value: debian:stable-slim
|
||||
@@ -0,0 +1,44 @@
|
||||
suite: test deployment
|
||||
templates:
|
||||
- deployment.yaml
|
||||
- configmap.yaml
|
||||
- pvc.yaml
|
||||
tests:
|
||||
- it: Should mount volume
|
||||
set:
|
||||
existingFileSecrets:
|
||||
- name: my-existing-secret
|
||||
path: /config
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.containers[0].volumeMounts
|
||||
value:
|
||||
- name: my-existing-secret
|
||||
mountPath: /config
|
||||
readOnly: true
|
||||
- it: Should mount volume with optional subPath
|
||||
set:
|
||||
existingFileSecrets:
|
||||
- name: my-existing-secret
|
||||
path: /config/config.yaml
|
||||
subPath: config.yml
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.containers[0].volumeMounts
|
||||
value:
|
||||
- name: my-existing-secret
|
||||
mountPath: /config/config.yaml
|
||||
subPath: config.yml
|
||||
readOnly: true
|
||||
- it: Should reference volume
|
||||
set:
|
||||
existingFileSecrets:
|
||||
- name: my-existing-secret
|
||||
path: /config
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.volumes
|
||||
value:
|
||||
- name: my-existing-secret
|
||||
secret:
|
||||
secretName: my-existing-secret
|
||||
@@ -0,0 +1,31 @@
|
||||
suite: test deployment
|
||||
templates:
|
||||
- deployment.yaml
|
||||
- configmap.yaml
|
||||
tests:
|
||||
- it: Should set name, image and tag
|
||||
set:
|
||||
initContainers:
|
||||
- name: pod1
|
||||
image: nginx
|
||||
tag: 1.2.2
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.initContainers[0].name
|
||||
value: pod1
|
||||
- equal:
|
||||
path: spec.template.spec.initContainers[0].image
|
||||
value: "nginx:1.2.2"
|
||||
- it: Should set command
|
||||
set:
|
||||
initContainers:
|
||||
- command: "while true; do date; sleep 2; done &&
|
||||
ls /data &&
|
||||
printf something"
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.initContainers[0].command
|
||||
value: ['/bin/sh', '-c', 'while true; do date; sleep 2; done && ls /data && printf something']
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
suite: test deployment
|
||||
templates:
|
||||
- deployment.yaml
|
||||
- configmap.yaml
|
||||
tests:
|
||||
- it: Should set a liveness probe
|
||||
set:
|
||||
livenessProbe:
|
||||
enabled: true
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.containers[0].livenessProbe
|
||||
value:
|
||||
httpGet:
|
||||
path: "/"
|
||||
port: 80
|
||||
scheme: HTTP
|
||||
initialDelaySeconds: 0
|
||||
periodSeconds: 10
|
||||
successThreshold: 1
|
||||
timeoutSeconds: 3
|
||||
failureThreshold: 3
|
||||
- it: Should not set a livenessProbe
|
||||
asserts:
|
||||
- isNull:
|
||||
path: spec.template.spec.containers[0].livenessProbe
|
||||
- it: Should tune liveness probe
|
||||
set:
|
||||
livenessProbe:
|
||||
enabled: true
|
||||
settings:
|
||||
periodSeconds: 30
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.containers[0].livenessProbe
|
||||
value:
|
||||
httpGet:
|
||||
path: "/"
|
||||
port: 80
|
||||
scheme: HTTP
|
||||
initialDelaySeconds: 0
|
||||
periodSeconds: 30
|
||||
successThreshold: 1
|
||||
timeoutSeconds: 3
|
||||
failureThreshold: 3
|
||||
+10
-19
@@ -5,35 +5,26 @@ templates:
|
||||
tests:
|
||||
- it: Should set custom ports
|
||||
set:
|
||||
containerPortYaml:
|
||||
- port: 21
|
||||
targetPort: ftp
|
||||
protocol: TCP
|
||||
ports:
|
||||
- containerPort: 21
|
||||
name: ftp
|
||||
- port: 3001
|
||||
targetPort: passive-1
|
||||
protocol: TCP
|
||||
- containerPort: 3001
|
||||
name: passive-1
|
||||
- port: 3002
|
||||
targetPort: passive-2
|
||||
protocol: TCP
|
||||
- containerPort: 3002
|
||||
name: passive-2
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.containers[0].ports
|
||||
value:
|
||||
- port: 21
|
||||
targetPort: ftp
|
||||
- name: ftp
|
||||
containerPort: 21
|
||||
protocol: TCP
|
||||
name: ftp
|
||||
- port: 3001
|
||||
targetPort: passive-1
|
||||
- name: passive-1
|
||||
containerPort: 3001
|
||||
protocol: TCP
|
||||
name: passive-1
|
||||
- port: 3002
|
||||
targetPort: passive-2
|
||||
- name: passive-2
|
||||
containerPort: 3002
|
||||
protocol: TCP
|
||||
name: passive-2
|
||||
- it: Should set default port
|
||||
asserts:
|
||||
- equal:
|
||||
@@ -0,0 +1,18 @@
|
||||
suite: test deployment
|
||||
templates:
|
||||
- deployment.yaml
|
||||
- configmap.yaml
|
||||
tests:
|
||||
- it: Should render resoucres if not ignored by default
|
||||
set:
|
||||
{}
|
||||
asserts:
|
||||
- isNotNull:
|
||||
path: spec.template.spec.containers[0].resources
|
||||
- it: Should ignore resources if ignore flag is set
|
||||
set:
|
||||
resources:
|
||||
ignore: true
|
||||
asserts:
|
||||
- isNull:
|
||||
path: spec.template.spec.containers[0].resources
|
||||
@@ -1,6 +1,6 @@
|
||||
suite: test deployment
|
||||
templates:
|
||||
- sealed-file-secret.yaml
|
||||
- sealedFileSecret.yaml
|
||||
tests:
|
||||
- it: Should generate a sealed secret with the file
|
||||
set: &values
|
||||
@@ -13,6 +13,11 @@ tests:
|
||||
{
|
||||
"what": "this is a fixture"
|
||||
}
|
||||
- name: deploy-key
|
||||
path: /deploy-key
|
||||
filesToMount:
|
||||
- name: deploy-key
|
||||
source: xyz
|
||||
# sourcePath: my-google-account-key.json
|
||||
asserts:
|
||||
- equal:
|
||||
@@ -21,3 +26,5 @@ tests:
|
||||
{
|
||||
"what": "this is a fixture"
|
||||
}
|
||||
- hasDocuments:
|
||||
count: 2
|
||||
|
||||
@@ -12,15 +12,8 @@ tests:
|
||||
content:
|
||||
secretRef:
|
||||
name: release-name
|
||||
- it: Should not reference secret if secret is disabled
|
||||
- it: Should reference secret by name
|
||||
set:
|
||||
secretEnabled: false
|
||||
asserts:
|
||||
- isNull:
|
||||
path: spec.template.spec.containers[0].envFrom
|
||||
- it: Should not reference secret if secret is disabled
|
||||
set:
|
||||
secretEnabled: true
|
||||
secretName: my-custom-secret
|
||||
asserts:
|
||||
- contains:
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
suite: test deployment
|
||||
templates:
|
||||
- deployment.yaml
|
||||
- configmap.yaml
|
||||
tests:
|
||||
- it: Should inject a sidecar if one is specified
|
||||
set:
|
||||
sidecar:
|
||||
repository: debian
|
||||
tag: stable-slim
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.containers[1].image
|
||||
value: debian:stable-slim
|
||||
- it: Should inject a debug sidecar with shell and command specified
|
||||
set:
|
||||
sidecar:
|
||||
repository: debian
|
||||
tag: stable-slim
|
||||
shell: "/bin/bash"
|
||||
command: "while true; do sleep 30; done;"
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.containers[1].image
|
||||
value: debian:stable-slim
|
||||
@@ -31,3 +31,191 @@ tests:
|
||||
- name: data
|
||||
persistentVolumeClaim:
|
||||
claimName: RELEASE-NAME-data
|
||||
- it: Should recreate to avoid stuck deployments
|
||||
set:
|
||||
volumes:
|
||||
- name: data
|
||||
path: /var/lib/1clickinfra/data
|
||||
size: 10Gi
|
||||
storageClass: default
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.strategy.type
|
||||
value: Recreate
|
||||
- it: Should strategy take precedence
|
||||
set:
|
||||
volumes:
|
||||
- name: data
|
||||
path: /var/lib/1clickinfra/data
|
||||
size: 10Gi
|
||||
storageClass: default
|
||||
strategy: RollingUpdate
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.strategy.type
|
||||
value: RollingUpdate
|
||||
- it: Should strategy be set
|
||||
set:
|
||||
strategy: Dummy
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.strategy.type
|
||||
value: Dummy
|
||||
- it: Should use the existing claim
|
||||
set:
|
||||
volumes:
|
||||
- name: data
|
||||
path: /var/lib/1clickinfra/data
|
||||
existingClaim: my-static-claim
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.volumes
|
||||
value:
|
||||
- name: data
|
||||
persistentVolumeClaim:
|
||||
claimName: my-static-claim
|
||||
- it: Should use emptyDir
|
||||
set:
|
||||
volumes:
|
||||
- name: data
|
||||
path: /var/lib/1clickinfra/data
|
||||
emptyDir: true
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.volumes
|
||||
value:
|
||||
- name: data
|
||||
emptyDir: {}
|
||||
- it: Should use hostPath
|
||||
set:
|
||||
volumes:
|
||||
- name: data
|
||||
path: /var/lib/1clickinfra/data
|
||||
hostPath:
|
||||
path: /somewhere/over/the/rainbow
|
||||
type: DirectoryOrCreate
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.volumes
|
||||
value:
|
||||
- name: data
|
||||
hostPath:
|
||||
path: /somewhere/over/the/rainbow
|
||||
type: DirectoryOrCreate
|
||||
- it: Should use hostPath without type
|
||||
set:
|
||||
volumes:
|
||||
- name: data
|
||||
path: /var/lib/1clickinfra/data
|
||||
hostPath:
|
||||
path: /somewhere/over/the/rainbow
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.volumes
|
||||
value:
|
||||
- name: data
|
||||
hostPath:
|
||||
path: /somewhere/over/the/rainbow
|
||||
- it: Should use emptyDir
|
||||
set:
|
||||
volumes:
|
||||
- name: myScratchDisk
|
||||
path: /randomPath
|
||||
emptyDir: true
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.volumes
|
||||
value:
|
||||
- name: myScratchDisk
|
||||
emptyDir: {}
|
||||
- equal:
|
||||
path: spec.template.spec.containers[0].volumeMounts
|
||||
value:
|
||||
- name: myScratchDisk
|
||||
mountPath: /randomPath
|
||||
- it: Should use a configMap
|
||||
set:
|
||||
volumes:
|
||||
- existingConfigMap: my-configmap
|
||||
name: volume-name
|
||||
path: /randomPath/app.conf
|
||||
subPath: app.conf
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.volumes
|
||||
value:
|
||||
- name: volume-name
|
||||
configMap:
|
||||
name: my-configmap
|
||||
- equal:
|
||||
path: spec.template.spec.containers[0].volumeMounts
|
||||
value:
|
||||
- name: volume-name
|
||||
mountPath: /randomPath/app.conf
|
||||
subPath: app.conf
|
||||
- it: Should use a configmap with custom value
|
||||
set:
|
||||
volumes:
|
||||
- name: volume-name
|
||||
fileName: myfile.conf
|
||||
fileContent: |
|
||||
blablabla
|
||||
bla
|
||||
path: /randomPath/myfile.conf
|
||||
subPath: myfile.conf
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.volumes
|
||||
value:
|
||||
- name: volume-name
|
||||
configMap:
|
||||
name: myfile-conf
|
||||
- equal:
|
||||
path: spec.template.spec.containers[0].volumeMounts
|
||||
value:
|
||||
- name: volume-name
|
||||
mountPath: /randomPath/myfile.conf
|
||||
subPath: myfile.conf
|
||||
- it: Should mount a volume only for the init container
|
||||
set:
|
||||
initContainers:
|
||||
- name : pod
|
||||
volumes:
|
||||
- name: init-volume
|
||||
path: /data
|
||||
emptyDir: true
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.volumes
|
||||
value:
|
||||
- name: init-volume
|
||||
emptyDir: {}
|
||||
- equal:
|
||||
path: spec.template.spec.initContainers[0].volumeMounts
|
||||
value:
|
||||
- name: init-volume
|
||||
mountPath: /data
|
||||
- notEqual:
|
||||
path: spec.template.spec.containers[0].volumeMounts
|
||||
value:
|
||||
- name: init-volume
|
||||
emptyDir: {}
|
||||
- it: Should mount a shared volume between the main container and the init container
|
||||
set:
|
||||
initContainers:
|
||||
- name: pod
|
||||
volumes:
|
||||
- name: shared-volume
|
||||
path: /data
|
||||
emptyDir: true
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.initContainers[0].volumeMounts
|
||||
value:
|
||||
- name: shared-volume
|
||||
mountPath: /data
|
||||
- equal:
|
||||
path: spec.template.spec.containers[0].volumeMounts
|
||||
value:
|
||||
- name: shared-volume
|
||||
mountPath: /data
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
suite: test service
|
||||
templates:
|
||||
- extraDeploy.yaml
|
||||
tests:
|
||||
- it: Should include additional yaml pieces
|
||||
set:
|
||||
extraDeploy: |
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: NetworkPolicy
|
||||
metadata:
|
||||
name: test-network-policy
|
||||
namespace: default
|
||||
spec:
|
||||
podSelector:
|
||||
matchLabels:
|
||||
role: db
|
||||
policyTypes:
|
||||
- Ingress
|
||||
- Egress
|
||||
ingress:
|
||||
- from:
|
||||
- ipBlock:
|
||||
cidr: 172.17.0.0/16
|
||||
except:
|
||||
- 172.17.1.0/24
|
||||
- namespaceSelector:
|
||||
matchLabels:
|
||||
project: myproject
|
||||
- podSelector:
|
||||
matchLabels:
|
||||
role: frontend
|
||||
ports:
|
||||
- protocol: TCP
|
||||
port: 6379
|
||||
egress:
|
||||
- to:
|
||||
- ipBlock:
|
||||
cidr: 10.0.0.0/24
|
||||
ports:
|
||||
- protocol: TCP
|
||||
port: 5978
|
||||
asserts:
|
||||
- equal:
|
||||
path: kind
|
||||
value: NetworkPolicy
|
||||
- it: Should include multiple yaml pieces
|
||||
set:
|
||||
extraDeploy: |
|
||||
---
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: NetworkPolicy
|
||||
---
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: NetworkPolicy
|
||||
asserts:
|
||||
- hasDocuments:
|
||||
count: 2
|
||||
@@ -20,10 +20,14 @@ tests:
|
||||
- host: chart-example.local
|
||||
http:
|
||||
paths:
|
||||
- backend:
|
||||
serviceName: release-name
|
||||
servicePort: 80
|
||||
- it: Should conform to DNS names
|
||||
- path: "/"
|
||||
pathType: "Prefix"
|
||||
backend:
|
||||
service:
|
||||
name: release-name
|
||||
port:
|
||||
number: 80
|
||||
- it: Should pass ingress host name as is, user must sanitize it
|
||||
set:
|
||||
ingress:
|
||||
host: feature/my_branch.local
|
||||
@@ -33,25 +37,84 @@ tests:
|
||||
path: spec.tls
|
||||
value:
|
||||
- hosts:
|
||||
- feature-my-branch.local
|
||||
- feature/my_branch.local
|
||||
secretName: tls-release-name
|
||||
- equal:
|
||||
path: spec.rules
|
||||
value:
|
||||
- host: feature-my-branch.local
|
||||
- host: feature/my_branch.local
|
||||
http:
|
||||
paths:
|
||||
- backend:
|
||||
serviceName: release-name
|
||||
servicePort: 80
|
||||
- path: "/"
|
||||
pathType: "Prefix"
|
||||
backend:
|
||||
service:
|
||||
name: release-name
|
||||
port:
|
||||
number: 80
|
||||
- it: Should set Ingress annotation
|
||||
set:
|
||||
ingress:
|
||||
host: chart-example.local
|
||||
annotations:
|
||||
kubernetes.io/ingress.class: nginx
|
||||
just/a-random: annotation
|
||||
asserts:
|
||||
- equal:
|
||||
path: metadata.annotations
|
||||
value:
|
||||
just/a-random: annotation
|
||||
- it: Should set ingress class
|
||||
set:
|
||||
ingress:
|
||||
host: chart-example.local
|
||||
ingressClassName: nginx
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.ingressClassName
|
||||
value: nginx
|
||||
- it: Should generate multiple ingresses
|
||||
set:
|
||||
ingresses:
|
||||
- host: chart-example.local
|
||||
annotations:
|
||||
kubernetes.io/ingress.class: nginx
|
||||
- host: another.local
|
||||
annotations:
|
||||
kubernetes.io/ingress.class: nginx
|
||||
asserts:
|
||||
- hasDocuments:
|
||||
count: 2
|
||||
- it: Should generate multiple ingresses
|
||||
set:
|
||||
ingress:
|
||||
host: chart-example.local
|
||||
annotations:
|
||||
kubernetes.io/ingress.class: nginx
|
||||
ingresses:
|
||||
- host: chart-example.local
|
||||
annotations:
|
||||
kubernetes.io/ingress.class: nginx
|
||||
- host: another.local
|
||||
annotations:
|
||||
kubernetes.io/ingress.class: nginx
|
||||
asserts:
|
||||
- hasDocuments:
|
||||
count: 3
|
||||
- it: Should have unique TLS secret names
|
||||
set:
|
||||
ingresses:
|
||||
- host: chart-example.local
|
||||
tlsEnabled: true
|
||||
annotations:
|
||||
kubernetes.io/ingress.class: nginx
|
||||
- host: another.local
|
||||
tlsEnabled: true
|
||||
annotations:
|
||||
kubernetes.io/ingress.class: nginx
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.tls
|
||||
value:
|
||||
- hosts:
|
||||
- chart-example.local
|
||||
secretName: tls-release-name-chart-example-local
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
suite: test ingress
|
||||
templates:
|
||||
- ingress.yaml
|
||||
tests:
|
||||
- it: Should default
|
||||
set:
|
||||
ingress:
|
||||
host: chart-example.local
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.rules[0].http.paths[0].path
|
||||
value: "/"
|
||||
- it: Should use path
|
||||
set:
|
||||
ingress:
|
||||
host: chart-example.local
|
||||
path: "/mypath"
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.rules[0].http.paths[0].path
|
||||
value: "/mypath"
|
||||
@@ -0,0 +1,23 @@
|
||||
suite: test deployment
|
||||
templates:
|
||||
- ingress.yaml
|
||||
tests:
|
||||
- it: Should use container port
|
||||
set:
|
||||
ingress:
|
||||
host: chart-example.local
|
||||
containerPort: 1234
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.rules[0].http.paths[0].backend.service.port.number
|
||||
value: 1234
|
||||
- it: Should use service port
|
||||
set:
|
||||
ingress:
|
||||
host: chart-example.local
|
||||
svcPort: 1234
|
||||
containerPort: 5678
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.rules[0].http.paths[0].backend.service.port.number
|
||||
value: 1234
|
||||
@@ -0,0 +1,18 @@
|
||||
suite: test service
|
||||
templates:
|
||||
- ingress.yaml
|
||||
tests:
|
||||
- it: Should set Gimlet taxonomy on Ingress
|
||||
set:
|
||||
gitRepository: github.com/laszlocph/demo-app
|
||||
gitSha: xyz
|
||||
ingress:
|
||||
host: chart-example.local
|
||||
tlsEnabled: true
|
||||
asserts:
|
||||
- equal:
|
||||
path: metadata.annotations
|
||||
value:
|
||||
gimlet.io/git-repository: github.com/laszlocph/demo-app
|
||||
gimlet.io/git-sha: xyz
|
||||
|
||||
@@ -13,3 +13,36 @@ tests:
|
||||
- equal:
|
||||
path: spec.storageClassName
|
||||
value: default
|
||||
- it: Should assign annotations to the PVC
|
||||
set:
|
||||
volumes:
|
||||
- name: data
|
||||
path: /var/lib/1clickinfra/data
|
||||
size: 10Gi
|
||||
storageClass: default
|
||||
pvcAnnotations:
|
||||
rancher.io/local-path/volume-type: local
|
||||
asserts:
|
||||
- equal:
|
||||
path: metadata.annotations
|
||||
value:
|
||||
rancher.io/local-path/volume-type: local
|
||||
- it: Should not generate a claim when using existing claim
|
||||
set:
|
||||
volumes:
|
||||
- name: data
|
||||
path: /var/lib/1clickinfra/data
|
||||
existingClaim: my-static-claim
|
||||
asserts:
|
||||
- hasDocuments:
|
||||
count: 0
|
||||
- it: Should not generate a claim when using host path
|
||||
set:
|
||||
volumes:
|
||||
- name: data
|
||||
path: /var/lib/1clickinfra/data
|
||||
hostPath:
|
||||
path: /data/test
|
||||
asserts:
|
||||
- hasDocuments:
|
||||
count: 0
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
suite: test deployment
|
||||
templates:
|
||||
- sealed-secret.yaml
|
||||
- sealedSecret.yaml
|
||||
tests:
|
||||
- it: Should put sealed secrets in SealedSecret
|
||||
set:
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
suite: test deployment
|
||||
templates:
|
||||
- service.yaml
|
||||
tests:
|
||||
- it: Should set containerPort as default
|
||||
set:
|
||||
containerPort: 11111
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.ports[0].port
|
||||
value: 11111
|
||||
- it: Should set svcPort if it is defined
|
||||
set:
|
||||
containerPort: 11111
|
||||
svcPort: 22222
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.ports[0].port
|
||||
value: 22222
|
||||
- it: Should set nodePort if it is defined
|
||||
set:
|
||||
containerPort: 11111
|
||||
nodePort: 33333
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.ports[0].nodePort
|
||||
value: 33333
|
||||
@@ -0,0 +1,66 @@
|
||||
suite: test deployment
|
||||
templates:
|
||||
- service.yaml
|
||||
tests:
|
||||
- it: Should set custom ports
|
||||
set:
|
||||
ports:
|
||||
- containerPort: 21
|
||||
name: ftp
|
||||
- containerPort: 3001
|
||||
name: passive-1
|
||||
- containerPort: 3002
|
||||
name: passive-2
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.ports
|
||||
value:
|
||||
- name: ftp
|
||||
port: 21
|
||||
targetPort: ftp
|
||||
protocol: TCP
|
||||
- name: passive-1
|
||||
port: 3001
|
||||
targetPort: passive-1
|
||||
protocol: TCP
|
||||
- name: passive-2
|
||||
port: 3002
|
||||
targetPort: passive-2
|
||||
protocol: TCP
|
||||
- it: Should set custom svc port
|
||||
set:
|
||||
ports:
|
||||
- containerPort: 2021
|
||||
svcPort: 21
|
||||
name: ftp
|
||||
- containerPort: 3001
|
||||
nodePort: 33001
|
||||
name: passive-1
|
||||
- containerPort: 3002
|
||||
name: passive-2
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.ports
|
||||
value:
|
||||
- name: ftp
|
||||
port: 21
|
||||
targetPort: ftp
|
||||
protocol: TCP
|
||||
- name: passive-1
|
||||
port: 3001
|
||||
nodePort: 33001
|
||||
targetPort: passive-1
|
||||
protocol: TCP
|
||||
- name: passive-2
|
||||
port: 3002
|
||||
targetPort: passive-2
|
||||
protocol: TCP
|
||||
- it: Should set default port
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.ports
|
||||
value:
|
||||
- port: 80
|
||||
targetPort: http
|
||||
protocol: TCP
|
||||
name: http
|
||||
@@ -0,0 +1,11 @@
|
||||
suite: test deployment
|
||||
templates:
|
||||
- service.yaml
|
||||
tests:
|
||||
- it: Should set NodePort if flag enabled
|
||||
set:
|
||||
stickySessions: true
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.externalTrafficPolicy
|
||||
value: Local
|
||||
@@ -0,0 +1,14 @@
|
||||
suite: test service
|
||||
templates:
|
||||
- service.yaml
|
||||
tests:
|
||||
- it: Should set Gimlet taxonomy
|
||||
set:
|
||||
gitRepository: github.com/laszlocph/demo-app
|
||||
gitSha: xyz
|
||||
asserts:
|
||||
- equal:
|
||||
path: metadata.annotations
|
||||
value:
|
||||
gimlet.io/git-repository: github.com/laszlocph/demo-app
|
||||
gimlet.io/git-sha: xyz
|
||||
@@ -14,3 +14,10 @@ tests:
|
||||
- equal:
|
||||
path: spec.type
|
||||
value: NodePort
|
||||
- it: Should set LoadBalancer if flag enabled
|
||||
set:
|
||||
loadbalancerEnabled: true
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.type
|
||||
value: LoadBalancer
|
||||
|
||||
@@ -84,6 +84,53 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"initContainers": {
|
||||
"$id": "#/properties/initcontainers",
|
||||
"type": "array",
|
||||
"title": "Init Containers",
|
||||
"default": [],
|
||||
"additionalItems": true,
|
||||
"items": {
|
||||
"$id": "#/properties/initcontainers/items",
|
||||
"type": "object",
|
||||
"anyOf": [
|
||||
{
|
||||
"id": "#/properties/volumes/oneOf/0",
|
||||
"title": "InitContainer",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {
|
||||
"type": "string",
|
||||
"title": "Name",
|
||||
"description": "The name of the init container"
|
||||
},
|
||||
"image": {
|
||||
"type": "string",
|
||||
"title": "Image"
|
||||
},
|
||||
"tag": {
|
||||
"type": "string",
|
||||
"title": "Tag"
|
||||
},
|
||||
"imagePullPolicy": {
|
||||
"type": "string",
|
||||
"title": "Command",
|
||||
"default": "IfNotPresent"
|
||||
},
|
||||
"command": {
|
||||
"type": "string",
|
||||
"title": "Command"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"name",
|
||||
"image",
|
||||
"tag"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"replicas": {
|
||||
"$id": "#/properties/replicas",
|
||||
"type": "integer",
|
||||
@@ -133,8 +180,8 @@
|
||||
"podAnnotations": {
|
||||
"$id": "#/properties/podAnnotations",
|
||||
"type": "object",
|
||||
"title": "The podAnnotations schema",
|
||||
"description": "An explanation about the purpose of this instance.",
|
||||
"title": "Pod annotations",
|
||||
"description": "Annotations to place on pods",
|
||||
"default": {},
|
||||
"examples": [
|
||||
{}
|
||||
@@ -142,6 +189,20 @@
|
||||
"required": [],
|
||||
"additionalProperties": true
|
||||
},
|
||||
"gitSha": {
|
||||
"$id": "#/properties/gitSha",
|
||||
"type": "string",
|
||||
"title": "Commit Hash",
|
||||
"description": "The git hash that you are deploying",
|
||||
"default": ""
|
||||
},
|
||||
"gitRepository": {
|
||||
"$id": "#/properties/gitRepository",
|
||||
"type": "string",
|
||||
"title": "GitHub Repository",
|
||||
"description": "The git repository that you are deploying",
|
||||
"default": ""
|
||||
},
|
||||
"podSecurityContext": {
|
||||
"$id": "#/properties/podSecurityContext",
|
||||
"type": "object",
|
||||
@@ -212,6 +273,16 @@
|
||||
],
|
||||
"required": [],
|
||||
"properties": {
|
||||
"ignore": {
|
||||
"$id": "#/properties/resources/properties/ignore",
|
||||
"type": "boolean",
|
||||
"title": "Ignore",
|
||||
"description": "If set to true, resource configuration will be ignored",
|
||||
"default": false,
|
||||
"examples": [
|
||||
true
|
||||
]
|
||||
},
|
||||
"requests": {
|
||||
"$id": "#/properties/resources/properties/requests",
|
||||
"type": "object",
|
||||
@@ -334,7 +405,7 @@
|
||||
"$id": "#/properties/probe",
|
||||
"type": "object",
|
||||
"title": "Healthcheck",
|
||||
"description": "The Kubernetes Readiness probe that determines whether your app is healthy and if should receive traffic",
|
||||
"description": "The Kubernetes Readiness probe determines whether your app is healthy and if it should receive traffic",
|
||||
"default": {},
|
||||
"examples": [
|
||||
{
|
||||
@@ -385,10 +456,10 @@
|
||||
"$id": "#/properties/probe/properties/settings/properties/initialDelaySeconds",
|
||||
"type": "integer",
|
||||
"title": "Initial Delay Seconds",
|
||||
"description": "Number of seconds after the container has started before the probes is initiated",
|
||||
"description": "Number of seconds after the container has started before the probe is initiated",
|
||||
"default": 0,
|
||||
"minimum": 0,
|
||||
"maximum": 60
|
||||
"maximum": 180
|
||||
},
|
||||
"periodSeconds": {
|
||||
"$id": "#/properties/probe/properties/settings/properties/periodSeconds",
|
||||
@@ -421,7 +492,107 @@
|
||||
"$id": "#/properties/probe/properties/settings/properties/failureThreshold",
|
||||
"type": "integer",
|
||||
"title": "Failure Threshold",
|
||||
"description": "When a probe fails, Kubernetes will tries this many times before giving up. Giving up the pod will be marked Unready and won't get any traffic",
|
||||
"description": "When a probe fails, Kubernetes will try this many times before giving up. Giving up the pod will be marked Unready and won't get any traffic",
|
||||
"default": 3,
|
||||
"minimum": 1,
|
||||
"maximum": 15
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"livenessProbe": {
|
||||
"$id": "#/properties/livenessProbe",
|
||||
"type": "object",
|
||||
"title": "Liveness check",
|
||||
"description": "The Kubernetes Liveness probe determines whether your app is healthy and if it should be restarted",
|
||||
"default": {},
|
||||
"examples": [
|
||||
{
|
||||
"enabled": false,
|
||||
"path": "/"
|
||||
}
|
||||
],
|
||||
"required": [
|
||||
"enabled",
|
||||
"path"
|
||||
],
|
||||
"properties": {
|
||||
"enabled": {
|
||||
"$id": "#/properties/livenessProbe/properties/enabled",
|
||||
"type": "boolean",
|
||||
"title": "",
|
||||
"description": "",
|
||||
"default": false,
|
||||
"examples": [
|
||||
false
|
||||
]
|
||||
},
|
||||
"path": {
|
||||
"$id": "#/properties/livenessProbe/properties/path",
|
||||
"type": "string",
|
||||
"title": "Path",
|
||||
"description": "Fill in the description",
|
||||
"default": "/",
|
||||
"examples": [
|
||||
"/"
|
||||
]
|
||||
},
|
||||
"settings": {
|
||||
"$id": "#/properties/livenessProbe/properties/settings",
|
||||
"type": "object",
|
||||
"title": "Probe thresholds",
|
||||
"description": "Tune the probe behavior",
|
||||
"examples": [
|
||||
{
|
||||
"failureThreshold": 3,
|
||||
"periodSeconds": 10,
|
||||
"successThreshold": 1,
|
||||
"timeoutSeconds": 10
|
||||
}
|
||||
],
|
||||
"properties": {
|
||||
"initialDelaySeconds": {
|
||||
"$id": "#/properties/livenessProbe/properties/settings/properties/initialDelaySeconds",
|
||||
"type": "integer",
|
||||
"title": "Initial Delay Seconds",
|
||||
"description": "Number of seconds after the container has started before the probe is initiated",
|
||||
"default": 0,
|
||||
"minimum": 0,
|
||||
"maximum": 180
|
||||
},
|
||||
"periodSeconds": {
|
||||
"$id": "#/properties/livenessProbe/properties/settings/properties/periodSeconds",
|
||||
"type": "integer",
|
||||
"title": "Period",
|
||||
"description": "How often (in seconds) to perform the probe",
|
||||
"default": 10,
|
||||
"minimum": 1,
|
||||
"maximum": 60
|
||||
},
|
||||
"successThreshold": {
|
||||
"$id": "#/properties/livenessProbe/properties/settings/properties/successThreshold",
|
||||
"type": "integer",
|
||||
"title": "Success Threshold",
|
||||
"description": "Minimum consecutive successes for the probe to be considered successful after having failed",
|
||||
"default": 1,
|
||||
"minimum": 1,
|
||||
"maximum": 15
|
||||
},
|
||||
"timeoutSeconds": {
|
||||
"$id": "#/properties/livenessProbe/properties/settings/properties/timeoutSeconds",
|
||||
"type": "integer",
|
||||
"title": "Timeout",
|
||||
"description": "Number of seconds after which the probe times out",
|
||||
"default": 3,
|
||||
"minimum": 1,
|
||||
"maximum": 30
|
||||
},
|
||||
"failureThreshold": {
|
||||
"$id": "#/properties/livenessProbe/properties/settings/properties/failureThreshold",
|
||||
"type": "integer",
|
||||
"title": "Failure Threshold",
|
||||
"description": "When a probe fails, Kubernetes will try this many times before giving up. Giving up the pod will be marked Unready and won't get any traffic",
|
||||
"default": 3,
|
||||
"minimum": 1,
|
||||
"maximum": 15
|
||||
@@ -484,10 +655,17 @@
|
||||
"properties": {},
|
||||
"additionalProperties": true
|
||||
},
|
||||
"secretEnabled": {
|
||||
"$id": "#/properties/secretEnabled",
|
||||
"type": "boolean",
|
||||
"title": "Existing secret",
|
||||
"description": "If enabled, a secret will be referenced from the deployment whose name matches the deployment name",
|
||||
"default": false
|
||||
},
|
||||
"sealedSecrets": {
|
||||
"$id": "#/properties/sealedSecrets",
|
||||
"type": "object",
|
||||
"title": "Sealed Secrets",
|
||||
"title": "Sealed secrets",
|
||||
"description": "",
|
||||
"default": {},
|
||||
"examples": [
|
||||
@@ -527,6 +705,16 @@
|
||||
"my-release.mycompany.com"
|
||||
]
|
||||
},
|
||||
"path": {
|
||||
"$id": "#/properties/ingress/properties/ingressPath",
|
||||
"type": "string",
|
||||
"title": "Path",
|
||||
"description": "The API path where your service is accessible",
|
||||
"default": "/",
|
||||
"examples": [
|
||||
"/api/myservice"
|
||||
]
|
||||
},
|
||||
"tlsEnabled": {
|
||||
"$id": "#/properties/ingress/properties/tlsEnabled",
|
||||
"type": "boolean",
|
||||
@@ -541,7 +729,7 @@
|
||||
"$id": "#/properties/ingress/properties/annotations",
|
||||
"type": "object",
|
||||
"title": "Annotations",
|
||||
"description": "",
|
||||
"description": "Annotations are used to control ingress behavior. See the full list for the Ingress Nginx project at https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/. Use the `cert-manager.io/cluster-issuer:\"letsencrypt\"` one to request TLS certificates, `kubernetes.io/ingress.class: \"nginx\"` to select an ingress controller.",
|
||||
"default": {},
|
||||
"examples": [
|
||||
{
|
||||
@@ -552,6 +740,49 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"existingFileSecrets": {
|
||||
"$id": "#/properties/existingFileSecrets",
|
||||
"type": "array",
|
||||
"title": "Existing file secrets",
|
||||
"description": "Allows to mount existing secrets into a container",
|
||||
"default": [],
|
||||
"additionalItems": true,
|
||||
"items": {
|
||||
"$id": "#/properties/existingFileSecrets/items",
|
||||
"type": "object",
|
||||
"anyOf": [
|
||||
{
|
||||
"id": "#/properties/existingFileSecrets/oneOf/0",
|
||||
"title": "existingFileSecrets",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {
|
||||
"type": "string",
|
||||
"title": "Name",
|
||||
"description": "The name of the existing secret to mount",
|
||||
"default": "data"
|
||||
},
|
||||
"path": {
|
||||
"type": "string",
|
||||
"title": "Path",
|
||||
"description": "The mount path inside the container",
|
||||
"default": "/data"
|
||||
},
|
||||
"subPath": {
|
||||
"type": "string",
|
||||
"title": "SubPath",
|
||||
"description": "The optinal mount subpath inside the container, to only mount a specific file but not a complete directory.",
|
||||
"default": "config.yaml"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"name",
|
||||
"path"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"volumes": {
|
||||
"$id": "#/properties/volumes",
|
||||
"type": "array",
|
||||
@@ -561,38 +792,221 @@
|
||||
"items": {
|
||||
"$id": "#/properties/volumes/items",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {
|
||||
"$id": "#/properties/volumes/items/anyOf/0/properties/name",
|
||||
"type": "string",
|
||||
"title": "Name",
|
||||
"description": "The name of the volume. Used only to recognize the volumes purpose in the config later on",
|
||||
"default": "data"
|
||||
"anyOf": [
|
||||
{
|
||||
"id": "#/properties/volumes/oneOf/0",
|
||||
"title": "Volume",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {
|
||||
"type": "string",
|
||||
"title": "Name",
|
||||
"description": "The name of the volume. Used only to recognize the volumes purpose in the config later on",
|
||||
"default": "data"
|
||||
},
|
||||
"path": {
|
||||
"type": "string",
|
||||
"title": "Path",
|
||||
"description": "The mount path inside the container",
|
||||
"default": "/data"
|
||||
},
|
||||
"size": {
|
||||
"type": "string",
|
||||
"title": "Size",
|
||||
"description": "eg: 10Gi"
|
||||
},
|
||||
"storageClass": {
|
||||
"type": "string",
|
||||
"title": "Storage Class",
|
||||
"description": "The slug indicating the disk type in your cloud provider. `standard` on Google Cloud, `default` on Azure; `do-block-storage` on Digital Ocean"
|
||||
},
|
||||
"pvcAnnotations": {
|
||||
"type": "object",
|
||||
"title": "Annotations",
|
||||
"description": "Annotations are used to control the persistance claim behavior.",
|
||||
"default": {},
|
||||
"examples": [
|
||||
{
|
||||
"rancher.io/local-path/volume-type": "local"
|
||||
}
|
||||
],
|
||||
"additionalProperties": true
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"name",
|
||||
"path",
|
||||
"size"
|
||||
]
|
||||
},
|
||||
"path": {
|
||||
"$id": "#/properties/volumes/items/anyOf/0/properties/path",
|
||||
"type": "string",
|
||||
"title": "Path",
|
||||
"description": "The mount path inside the container",
|
||||
"default": "/data"
|
||||
{
|
||||
"id": "#/properties/volumes/oneOf/1",
|
||||
"title": "Use an existing volume claim",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {
|
||||
"type": "string",
|
||||
"title": "Name",
|
||||
"description": "The name of the volume. Used only to recognize the volumes purpose in the config later on",
|
||||
"default": "data"
|
||||
},
|
||||
"existingClaim": {
|
||||
"type": "string",
|
||||
"title": "Existing Claim",
|
||||
"description": "Use an existing PersistentVolumeClaim"
|
||||
},
|
||||
"path": {
|
||||
"type": "string",
|
||||
"title": "Path",
|
||||
"description": "The mount path inside the container",
|
||||
"default": "/data"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"name",
|
||||
"path",
|
||||
"existingClaim"
|
||||
]
|
||||
},
|
||||
"size": {
|
||||
"$id": "#/properties/volumes/items/anyOf/0/properties/size",
|
||||
"type": "string",
|
||||
"title": "Size",
|
||||
"description": "",
|
||||
"default": "10Gi"
|
||||
{
|
||||
"id": "#/properties/volumes/oneOf/2",
|
||||
"title": "Use a path from the host",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {
|
||||
"type": "string",
|
||||
"title": "Name",
|
||||
"description": "The name of the volume. Used only to recognize the volumes purpose in the config later on",
|
||||
"default": "data"
|
||||
},
|
||||
"hostPath": {
|
||||
"type": "object",
|
||||
"title": "Path on the host",
|
||||
"description": "Use a physical path on the host machine",
|
||||
"properties": {
|
||||
"path": {
|
||||
"type": "string",
|
||||
"title": "Path on Host",
|
||||
"description": "Use a physical path on the host machine"
|
||||
},
|
||||
"type": {
|
||||
"type": "string",
|
||||
"title": "Path Type",
|
||||
"enum": [
|
||||
"DirectoryOrCreate",
|
||||
"Directory",
|
||||
"FileOrCreate",
|
||||
"File",
|
||||
"Socket",
|
||||
"CharDevice",
|
||||
"BlockDevice"
|
||||
]
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"path"
|
||||
]
|
||||
},
|
||||
"path": {
|
||||
"type": "string",
|
||||
"title": "Path",
|
||||
"description": "The mount path inside the container",
|
||||
"default": "/data"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"name",
|
||||
"path",
|
||||
"hostPath"
|
||||
]
|
||||
},
|
||||
"storageClass": {
|
||||
"$id": "#/properties/volumes/items/anyOf/0/properties/storageClass",
|
||||
"type": "string",
|
||||
"title": "Storage Class",
|
||||
"description": "The slug indicating the disk type in your cloud provider. `standard` on Google Cloud, `default` on Azure; `do-block-storage` on Digital Ocean",
|
||||
"default": ""
|
||||
{
|
||||
"id": "#/properties/volumes/oneOf/3",
|
||||
"title": "Use an ephemeral volume",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {
|
||||
"type": "string",
|
||||
"title": "Name",
|
||||
"default": "ephemeral-volume"
|
||||
},
|
||||
"emptyDir": {
|
||||
"type": "boolean",
|
||||
"title": "ephemeral volume (emptyDir)",
|
||||
"description": "Enable to use a non-persistent disk",
|
||||
"default": true
|
||||
},
|
||||
"path": {
|
||||
"type": "string",
|
||||
"title": "Path",
|
||||
"description": "The mount path inside the container",
|
||||
"default": "/data"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"name",
|
||||
"emptyDir",
|
||||
"path"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "#/properties/volumes/oneOf/4",
|
||||
"title": "Mount an existing configMap as a file",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"existingConfigMap": {
|
||||
"type": "string",
|
||||
"title": "Name",
|
||||
"description": "The name of the configMap to mount",
|
||||
"default": "data"
|
||||
},
|
||||
"path": {
|
||||
"type": "string",
|
||||
"title": "Path",
|
||||
"description": "The mount path inside the container",
|
||||
"default": "/data/dummy.conf"
|
||||
},
|
||||
"subPath": {
|
||||
"type": "string",
|
||||
"title": "subPath",
|
||||
"description": "Mount single file",
|
||||
"default": "dummy.conf"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"existingConfigMap",
|
||||
"path"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "#/properties/volumes/oneOf/5",
|
||||
"title": "Custom string to mount as a file",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"fileName": {
|
||||
"type": "string",
|
||||
"title": "File name"
|
||||
},
|
||||
"fileContent": {
|
||||
"type": "string",
|
||||
"title": "File content"
|
||||
},
|
||||
"path": {
|
||||
"type": "string",
|
||||
"title": "Path",
|
||||
"description": "The mount path inside the container",
|
||||
"default": "/data"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"fileName",
|
||||
"fileContent",
|
||||
"path"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,16 @@ image:
|
||||
tag: "latest"
|
||||
pullPolicy: IfNotPresent
|
||||
|
||||
# ingress:
|
||||
# host: chart-example.local
|
||||
# ingressClassName: nginx
|
||||
# tlsEnabled: true
|
||||
# annotations:
|
||||
# cert-manager.io/cluster-issuer: letsencrypt-staging
|
||||
|
||||
# vars:
|
||||
# MY_VAR: "value"
|
||||
|
||||
replicas: 1
|
||||
|
||||
nameOverride: ""
|
||||
@@ -40,16 +50,21 @@ probe:
|
||||
timeoutSeconds: 3
|
||||
failureThreshold: 3
|
||||
|
||||
# Before you use a liveness probe: https://srcco.de/posts/kubernetes-liveness-probes-are-dangerous.html
|
||||
livenessProbe:
|
||||
enabled: false
|
||||
path: "/"
|
||||
settings:
|
||||
initialDelaySeconds: 0
|
||||
periodSeconds: 10
|
||||
successThreshold: 1
|
||||
timeoutSeconds: 3
|
||||
failureThreshold: 3
|
||||
|
||||
secretEnabled: false
|
||||
|
||||
shell: "/bin/sh"
|
||||
|
||||
debugSidecarEnabled: false
|
||||
debugSidecar:
|
||||
image: debian:stable-slim
|
||||
shell: "/bin/bash"
|
||||
command: "while true; do sleep 30; done;"
|
||||
|
||||
podDisruptionBudgetEnabled: true
|
||||
spreadAcrossNodes: false
|
||||
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
# Patterns to ignore when building packages.
|
||||
# This supports shell glob matching, relative path matching, and
|
||||
# negation (prefixed with !). Only one pattern per line.
|
||||
.DS_Store
|
||||
# Common VCS dirs
|
||||
.git/
|
||||
.gitignore
|
||||
.bzr/
|
||||
.bzrignore
|
||||
.hg/
|
||||
.hgignore
|
||||
.svn/
|
||||
# Common backup files
|
||||
*.swp
|
||||
*.bak
|
||||
*.tmp
|
||||
*.orig
|
||||
*~
|
||||
# Various IDEs
|
||||
.project
|
||||
.idea/
|
||||
*.tmproj
|
||||
.vscode/
|
||||
@@ -0,0 +1,18 @@
|
||||
apiVersion: v2
|
||||
name: static-site
|
||||
description: Chart to build and deploy static sites
|
||||
# A chart can be either an 'application' or a 'library' chart.
|
||||
#
|
||||
# Application charts are a collection of templates that can be packaged into versioned archives
|
||||
# to be deployed.
|
||||
#
|
||||
# Library charts provide useful utilities or functions for the chart developer. They're included as
|
||||
# a dependency of application charts to inject those utilities and functions into the rendering
|
||||
# pipeline. Library charts do not define any templates and therefore cannot be deployed.
|
||||
type: application
|
||||
|
||||
# This is the chart version. This version number should be incremented each time you make changes
|
||||
# to the chart and its templates, including the app version.
|
||||
# Versions are expected to follow Semantic Versioning (https://semver.org/)
|
||||
version: 0.1.0
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
[
|
||||
{
|
||||
"schemaIDs": [
|
||||
"#/properties/gitCloneUrl",
|
||||
"#/properties/buildImage",
|
||||
"#/properties/buildTag",
|
||||
"#/properties/buildScript",
|
||||
"#/properties/builtAssets"
|
||||
|
||||
],
|
||||
"uiSchema": {
|
||||
"#/properties/buildScript":{
|
||||
"ui:widget": "textarea"
|
||||
}
|
||||
},
|
||||
"metaData": {
|
||||
"name": "Build",
|
||||
"icon": "M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-3 7h3m-3 4h3m-6-4h.01M9 16h.01"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schemaIDs": [
|
||||
"#/properties/ingress"
|
||||
],
|
||||
"uiSchema": {},
|
||||
"metaData": {
|
||||
"name": "Ingress",
|
||||
"icon": "M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1"
|
||||
}
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1 @@
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
{{/*
|
||||
Expand the name of the chart.
|
||||
*/}}
|
||||
{{- define "staticSite.name" -}}
|
||||
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create a default fully qualified app name.
|
||||
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
|
||||
If release name contains chart name it will be used as a full name.
|
||||
*/}}
|
||||
{{- define "staticSite.fullname" -}}
|
||||
{{- if .Values.fullnameOverride }}
|
||||
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
|
||||
{{- else }}
|
||||
{{- $name := default .Chart.Name .Values.nameOverride }}
|
||||
{{- if contains $name .Release.Name }}
|
||||
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
|
||||
{{- else }}
|
||||
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create chart name and version as used by the chart label.
|
||||
*/}}
|
||||
{{- define "staticSite.chart" -}}
|
||||
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Common labels
|
||||
*/}}
|
||||
{{- define "staticSite.labels" -}}
|
||||
helm.sh/chart: {{ include "staticSite.chart" . }}
|
||||
{{ include "staticSite.selectorLabels" . }}
|
||||
{{- if .Chart.AppVersion }}
|
||||
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
|
||||
{{- end }}
|
||||
app.kubernetes.io/managed-by: {{ .Release.Service }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Selector labels
|
||||
*/}}
|
||||
{{- define "staticSite.selectorLabels" -}}
|
||||
app.kubernetes.io/name: {{ include "staticSite.name" . }}
|
||||
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create the name of the service account to use
|
||||
*/}}
|
||||
{{- define "staticSite.serviceAccountName" -}}
|
||||
{{- if .Values.serviceAccount.create }}
|
||||
{{- default (include "staticSite.fullname" .) .Values.serviceAccount.name }}
|
||||
{{- else }}
|
||||
{{- default "default" .Values.serviceAccount.name }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create robustName that can be used as Kubernetes resource name, and as subdomain as well
|
||||
\w – Latin letters, digits, underscore '_' .
|
||||
\W – all but \w .
|
||||
*/}}
|
||||
{{- define "robustName" -}}
|
||||
{{ regexReplaceAll "\\W+" . "-" | replace "_" "-" | lower | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
@@ -0,0 +1,61 @@
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: {{ template "robustName" .Release.Name }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "staticSite.labels" . | nindent 4 }}
|
||||
spec:
|
||||
replicas: {{ .Values.replicaCount }}
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- include "staticSite.selectorLabels" . | nindent 6 }}
|
||||
template:
|
||||
metadata:
|
||||
{{- with .Values.podAnnotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
labels:
|
||||
{{- include "staticSite.selectorLabels" . | nindent 8 }}
|
||||
spec:
|
||||
{{- with .Values.imagePullSecrets }}
|
||||
imagePullSecrets:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
serviceAccountName: {{ template "robustName" .Release.Name }}
|
||||
securityContext:
|
||||
{{- toYaml .Values.podSecurityContext | nindent 8 }}
|
||||
volumes:
|
||||
- name: static-files
|
||||
emptyDir: {}
|
||||
initContainers:
|
||||
- name: init-con
|
||||
image: {{ .Values.buildImage }}:{{ .Values.buildTag }}
|
||||
{{- if .Values.buildScript }}
|
||||
command:
|
||||
- sh
|
||||
- -c
|
||||
- |
|
||||
git clone {{ .Values.gitCloneUrl}} &&
|
||||
cd {{ regexFind "([^\\/]+$)" .Values.gitCloneUrl | replace ".git" "" }} &&
|
||||
{{ .Values.buildScript | nindent 12}}
|
||||
mkdir -p /usr/share/nginx/html &&
|
||||
cp -r ./{{ .Values.builtAssets }}. /usr/share/nginx/html
|
||||
{{- end }}
|
||||
volumeMounts:
|
||||
- name: static-files
|
||||
mountPath: /usr/share/nginx/html
|
||||
containers:
|
||||
- name: {{ template "robustName" .Release.Name }}
|
||||
securityContext:
|
||||
{{- toYaml .Values.securityContext | nindent 12 }}
|
||||
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
|
||||
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
||||
volumeMounts:
|
||||
- name: static-files
|
||||
mountPath: /usr/share/nginx/html
|
||||
ports:
|
||||
- name: http
|
||||
containerPort: {{ .Values.service.port }}
|
||||
protocol: TCP
|
||||
@@ -0,0 +1,52 @@
|
||||
{{/* OneChart ingress snippet */}}
|
||||
{{- define "onechart.ingress" }}
|
||||
{{- $robustName := include "robustName" .root.Release.Name -}}
|
||||
{{- $resourceName := $robustName -}}
|
||||
{{- if .longName }}
|
||||
{{- $resourceName = printf "%s-%s" $robustName (include "robustName" .ingress.host) -}}
|
||||
{{- end }}
|
||||
---
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: {{ $resourceName }}
|
||||
namespace: {{ .root.Release.Namespace }}
|
||||
labels:
|
||||
{{- include "staticSite.labels" .root | nindent 4 }}
|
||||
{{- if or (or .root.Values.gitSha .ingress.annotations) .root.Values.gitRepository }}
|
||||
annotations:
|
||||
{{- if .ingress.annotations }}
|
||||
{{- toYaml .ingress.annotations | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
spec:
|
||||
{{- if .ingress.ingressClassName }}
|
||||
ingressClassName: {{ .ingress.ingressClassName }}
|
||||
{{- end }}
|
||||
{{- if default false .ingress.tlsEnabled }}
|
||||
tls:
|
||||
- hosts:
|
||||
- {{ .ingress.host | quote }}
|
||||
secretName: {{ printf "tls-%s" $resourceName }}
|
||||
{{- end }}
|
||||
rules:
|
||||
- host: {{ .ingress.host | quote }}
|
||||
http:
|
||||
paths:
|
||||
- path: {{ .ingress.path | default "/" | quote }}
|
||||
pathType: "Prefix"
|
||||
backend:
|
||||
service:
|
||||
name: {{ $robustName }}
|
||||
port:
|
||||
number: {{ .root.Values.service.port }}
|
||||
{{- end }}
|
||||
|
||||
{{- with .Values.ingress }}
|
||||
{{- template "onechart.ingress" (dict "root" $ "ingress" .) }}
|
||||
{{- end }}
|
||||
|
||||
{{- range .Values.ingresses }}
|
||||
{{template "onechart.ingress" (dict "root" $ "ingress" . "longName" true) }}
|
||||
{{- end }}
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ template "robustName" .Release.Name }}
|
||||
labels:
|
||||
{{- include "staticSite.labels" . | nindent 4 }}
|
||||
spec:
|
||||
type: {{ .Values.service.type }}
|
||||
ports:
|
||||
- port: {{ .Values.service.port }}
|
||||
targetPort: http
|
||||
protocol: TCP
|
||||
name: http
|
||||
selector:
|
||||
{{- include "staticSite.selectorLabels" . | nindent 4 }}
|
||||
@@ -0,0 +1,12 @@
|
||||
{{- if .Values.serviceAccount.create -}}
|
||||
apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
name: {{ template "robustName" .Release.Name }}
|
||||
labels:
|
||||
{{- include "staticSite.labels" . | nindent 4 }}
|
||||
{{- with .Values.serviceAccount.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
@@ -0,0 +1,15 @@
|
||||
suite: test deployment
|
||||
templates:
|
||||
- deployment.yaml
|
||||
tests:
|
||||
- it: Should set image, tag and command
|
||||
set:
|
||||
gitCloneUrl: https:/github.com/mycompany/myrepo.git
|
||||
buildImage: nginx
|
||||
buildTag: x.y.z
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.template.spec.initContainers[0].image
|
||||
value: nginx:x.y.z
|
||||
|
||||
|
||||
@@ -0,0 +1,120 @@
|
||||
suite: test deployment
|
||||
templates:
|
||||
- ingress.yaml
|
||||
tests:
|
||||
- it: Should set Ingress host name
|
||||
set:
|
||||
ingress:
|
||||
host: chart-example.local
|
||||
tlsEnabled: true
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.tls
|
||||
value:
|
||||
- hosts:
|
||||
- chart-example.local
|
||||
secretName: tls-release-name
|
||||
- equal:
|
||||
path: spec.rules
|
||||
value:
|
||||
- host: chart-example.local
|
||||
http:
|
||||
paths:
|
||||
- path: "/"
|
||||
pathType: "Prefix"
|
||||
backend:
|
||||
service:
|
||||
name: release-name
|
||||
port:
|
||||
number: 80
|
||||
- it: Should pass ingress host name as is, user must sanitize it
|
||||
set:
|
||||
ingress:
|
||||
host: feature/my_branch.local
|
||||
tlsEnabled: true
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.tls
|
||||
value:
|
||||
- hosts:
|
||||
- feature/my_branch.local
|
||||
secretName: tls-release-name
|
||||
- equal:
|
||||
path: spec.rules
|
||||
value:
|
||||
- host: feature/my_branch.local
|
||||
http:
|
||||
paths:
|
||||
- path: "/"
|
||||
pathType: "Prefix"
|
||||
backend:
|
||||
service:
|
||||
name: release-name
|
||||
port:
|
||||
number: 80
|
||||
- it: Should set Ingress annotation
|
||||
set:
|
||||
ingress:
|
||||
host: chart-example.local
|
||||
annotations:
|
||||
just/a-random: annotation
|
||||
asserts:
|
||||
- equal:
|
||||
path: metadata.annotations
|
||||
value:
|
||||
just/a-random: annotation
|
||||
- it: Should set ingress class
|
||||
set:
|
||||
ingress:
|
||||
host: chart-example.local
|
||||
ingressClassName: nginx
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.ingressClassName
|
||||
value: nginx
|
||||
- it: Should generate multiple ingresses
|
||||
set:
|
||||
ingresses:
|
||||
- host: chart-example.local
|
||||
annotations:
|
||||
kubernetes.io/ingress.class: nginx
|
||||
- host: another.local
|
||||
annotations:
|
||||
kubernetes.io/ingress.class: nginx
|
||||
asserts:
|
||||
- hasDocuments:
|
||||
count: 2
|
||||
- it: Should generate multiple ingresses
|
||||
set:
|
||||
ingress:
|
||||
host: chart-example.local
|
||||
annotations:
|
||||
kubernetes.io/ingress.class: nginx
|
||||
ingresses:
|
||||
- host: chart-example.local
|
||||
annotations:
|
||||
kubernetes.io/ingress.class: nginx
|
||||
- host: another.local
|
||||
annotations:
|
||||
kubernetes.io/ingress.class: nginx
|
||||
asserts:
|
||||
- hasDocuments:
|
||||
count: 3
|
||||
- it: Should have unique TLS secret names
|
||||
set:
|
||||
ingresses:
|
||||
- host: chart-example.local
|
||||
tlsEnabled: true
|
||||
annotations:
|
||||
kubernetes.io/ingress.class: nginx
|
||||
- host: another.local
|
||||
tlsEnabled: true
|
||||
annotations:
|
||||
kubernetes.io/ingress.class: nginx
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.tls
|
||||
value:
|
||||
- hosts:
|
||||
- chart-example.local
|
||||
secretName: tls-release-name-chart-example-local
|
||||
@@ -0,0 +1,21 @@
|
||||
suite: test ingress
|
||||
templates:
|
||||
- ingress.yaml
|
||||
tests:
|
||||
- it: Should default
|
||||
set:
|
||||
ingress:
|
||||
host: chart-example.local
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.rules[0].http.paths[0].path
|
||||
value: "/"
|
||||
- it: Should use path
|
||||
set:
|
||||
ingress:
|
||||
host: chart-example.local
|
||||
path: "/mypath"
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.rules[0].http.paths[0].path
|
||||
value: "/mypath"
|
||||
@@ -0,0 +1,12 @@
|
||||
suite: test deployment
|
||||
templates:
|
||||
- ingress.yaml
|
||||
tests:
|
||||
- it: Should use service port
|
||||
set:
|
||||
ingress:
|
||||
host: chart-example.local
|
||||
asserts:
|
||||
- equal:
|
||||
path: spec.rules[0].http.paths[0].backend.service.port.number
|
||||
value: 1234
|
||||
@@ -0,0 +1,125 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema",
|
||||
"$id": "http://example.com/example.json",
|
||||
"type": "object",
|
||||
"title": "The root schema",
|
||||
"description": "The root schema comprises the entire JSON document.",
|
||||
"default": {},
|
||||
"examples": [
|
||||
{
|
||||
"gitCloneUrl": "https://github.com/gimlet-io/hugo-site.git",
|
||||
"buildImage": "node",
|
||||
"buildTag": "latest",
|
||||
"buildScript": "npm install && npm install -g gatsby-cli && gatsby build",
|
||||
"builtAssets": "public/"
|
||||
}
|
||||
],
|
||||
"required": [
|
||||
"gitCloneUrl",
|
||||
"buildImage",
|
||||
"buildTag",
|
||||
"buildScript",
|
||||
"builtAssets"
|
||||
],
|
||||
"properties": {
|
||||
"gitCloneUrl": {
|
||||
"$id": "#/properties/gitCloneUrl",
|
||||
"type": "string",
|
||||
"title": "Repo url",
|
||||
"description": "The static site's git repository",
|
||||
"default": "https://github.com/gimlet-io/hugo-site.git"
|
||||
},
|
||||
"buildImage": {
|
||||
"$id": "#/properties/buildImage",
|
||||
"type": "string",
|
||||
"title": "Build image",
|
||||
"description": "The image that will be used for the build proccess",
|
||||
"default":"bitnami/git"
|
||||
},
|
||||
"buildTag": {
|
||||
"$id": "#/properties/buildTag",
|
||||
"type": "string",
|
||||
"title": "Image tag",
|
||||
"default": "latest"
|
||||
},
|
||||
"buildScript": {
|
||||
"$id": "#/properties/buildScript",
|
||||
"type": "string",
|
||||
"title": "Build script",
|
||||
"description": "Commands required for the build to be completed",
|
||||
"default": "# !/usr/bin/env bash\n# pre -reqs\napt-get update && apt-get install -y wget\n\n# Setting up Hugo \nwget https://github.com/gohugoio/hugo/releases/download/v0.111.3/hugo_0.111.3_Linux-64bit.tar.gz &&\ntar -xzf hugo_0.111.3_Linux-64bit.tar.gz &&\nchmod +x hugo\n\n./hugo"
|
||||
|
||||
},
|
||||
"builtAssets": {
|
||||
"$id": "#/properties/builtAssets",
|
||||
"type": "string",
|
||||
"title": "Built assets",
|
||||
"description": "The folder containing the build's generated files",
|
||||
"default": "public/"
|
||||
},
|
||||
"ingress": {
|
||||
"$id": "#/properties/ingress",
|
||||
"type": "object",
|
||||
"title": "Incoming traffic",
|
||||
"description": "",
|
||||
"default": {},
|
||||
"examples": [
|
||||
{
|
||||
"tlsEnabled": false,
|
||||
"annotations": {
|
||||
"kubernetes.io/ingress.class": "nginx"
|
||||
},
|
||||
"host": "my-release.mycompany.com"
|
||||
}
|
||||
],
|
||||
"required": [],
|
||||
"properties": {
|
||||
"host": {
|
||||
"$id": "#/properties/ingress/properties/host",
|
||||
"type": "string",
|
||||
"title": "Host Name",
|
||||
"description": "Where your application will be accessible",
|
||||
"default": "",
|
||||
"examples": [
|
||||
"my-release.mycompany.com"
|
||||
]
|
||||
},
|
||||
"path": {
|
||||
"$id": "#/properties/ingress/properties/ingressPath",
|
||||
"type": "string",
|
||||
"title": "Path",
|
||||
"description": "The API path where your service is accessible",
|
||||
"default": "/",
|
||||
"examples": [
|
||||
"/api/myservice"
|
||||
]
|
||||
},
|
||||
"tlsEnabled": {
|
||||
"$id": "#/properties/ingress/properties/tlsEnabled",
|
||||
"type": "boolean",
|
||||
"title": "HTTPS",
|
||||
"description": "",
|
||||
"default": false,
|
||||
"examples": [
|
||||
false
|
||||
]
|
||||
},
|
||||
"annotations": {
|
||||
"$id": "#/properties/ingress/properties/annotations",
|
||||
"type": "object",
|
||||
"title": "Annotations",
|
||||
"description": "Annotations are used to control ingress behavior. See the full list for the Ingress Nginx project at https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/. Use the `cert-manager.io/cluster-issuer:\"letsencrypt\"` one to request TLS certificates, `kubernetes.io/ingress.class: \"nginx\"` to select an ingress controller.",
|
||||
"default": {},
|
||||
"examples": [
|
||||
{
|
||||
"kubernetes.io/ingress.class": "nginx"
|
||||
}
|
||||
],
|
||||
"additionalProperties": true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
},
|
||||
"additionalProperties": true
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
# Default values for static-site.
|
||||
# This is a YAML-formatted file.
|
||||
# Declare variables to be passed into your templates.
|
||||
|
||||
replicaCount: 1
|
||||
|
||||
image:
|
||||
repository: nginx
|
||||
tag: latest
|
||||
pullPolicy: IfNotPresent
|
||||
|
||||
imagePullSecrets: []
|
||||
nameOverride: ""
|
||||
fullnameOverride: ""
|
||||
|
||||
serviceAccount:
|
||||
# Specifies whether a service account should be created
|
||||
create: true
|
||||
# Annotations to add to the service account
|
||||
annotations: {}
|
||||
# The name of the service account to use.
|
||||
# If not set and create is true, a name is generated using the fullname template
|
||||
name: ""
|
||||
|
||||
podAnnotations: {}
|
||||
|
||||
podSecurityContext: {}
|
||||
# fsGroup: 2000
|
||||
|
||||
securityContext:
|
||||
# capabilities:
|
||||
# drop:
|
||||
# - ALL
|
||||
# readOnlyRootFilesystem: true
|
||||
# runAsNonRoot: true
|
||||
runAsUser: 0
|
||||
|
||||
service:
|
||||
type: ClusterIP
|
||||
port: 80
|
||||
|
||||
# ingress:
|
||||
# host: dummyapp.127.0.0.1.nip.io
|
||||
# ingressClassName: nginx
|
||||
# tlsEnabled: false
|
||||
# annotations:
|
||||
# cert-manager.io/cluster-issuer: letsencrypt-staging
|
||||
|
||||
|
||||
resources:
|
||||
requests:
|
||||
cpu: 200m
|
||||
memory: 200Mi
|
||||
limits:
|
||||
cpu: 200m
|
||||
memory: 200Mi
|
||||
|
||||
nodeSelector: {}
|
||||
|
||||
tolerations: []
|
||||
|
||||
affinity: {}
|
||||
|
||||
# values to build and deploy static sites
|
||||
gitCloneUrl: https://github.com/gimlet-io/hugo-site.git
|
||||
buildImage: bitnami/git # the image must have git installed
|
||||
buildTag: latest
|
||||
buildScript: |
|
||||
# !/usr/bin/env bash
|
||||
# pre -reqs
|
||||
apt-get update && apt-get install -y wget
|
||||
|
||||
# Setting up Hugo
|
||||
wget https://github.com/gohugoio/hugo/releases/download/v0.111.3/hugo_0.111.3_Linux-64bit.tar.gz &&
|
||||
tar -xzf hugo_0.111.3_Linux-64bit.tar.gz &&
|
||||
chmod +x hugo
|
||||
|
||||
./hugo
|
||||
builtAssets: public/
|
||||
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user