From ed3c9b5839bb642755e2cae485851438a8adce55 Mon Sep 17 00:00:00 2001 From: Angel Kafazov Date: Tue, 3 Dec 2024 12:14:21 +0200 Subject: [PATCH] chore (move): charts from private to public (#26) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: add extension-manager-operator and crds charts with initial templates and values * major refactoring of all charts --------- Signed-off-by: Angel Kafazov Co-authored-by: Tobias Oetzel Co-authored-by: tobias-oetzel Co-authored-by: Bastian Echterhölter --- .github/workflows/common.yaml | 1 + .../extension-manager-operator-crds.yaml | 28 +++ .../workflows/extension-manager-operator.yaml | 28 +++ .gitignore | 1 + .helmdocsignore | 1 + README.md | 18 ++ Taskfile.yaml | 41 ++++- charts/_templates.gotmpl | 18 ++ charts/account-operator-crds/Chart.yaml | 2 +- charts/account-operator-crds/README.md | 12 ++ charts/account-operator-crds/values.yaml | 1 + charts/account-operator/Chart.lock | 8 +- charts/account-operator/Chart.yaml | 6 +- charts/account-operator/README.md | 40 +++++ .../charts/account-operator-crds-0.1.5.tgz | Bin 5139 -> 0 bytes .../charts/account-operator-crds-0.1.6.tgz | Bin 0 -> 5346 bytes .../account-operator/charts/common-0.1.4.tgz | Bin 22092 -> 0 bytes .../account-operator/charts/common-0.1.5.tgz | Bin 0 -> 4512 bytes .../templates/deployment.yaml | 36 +--- .../templates/service-account.yaml | 1 - .../templates/webhook/pki.yaml | 2 - .../templates/webhook/service.yaml | 1 - .../__snapshot__/deployment_test.yaml.snap | 142 +++++++++------ .../tests/deployment_test.yaml | 52 +++++- charts/account-operator/values.yaml | 51 +++--- charts/common/.helmignore | 1 + charts/common/Chart.yaml | 2 +- charts/common/README.md | 54 ++++++ charts/common/README.md.gotmpl | 33 ++++ .../common/templates/_certManagerEnabled.tpl | 3 - .../common/templates/_deploymentHelpers.tpl | 140 +++++++++++++++ charts/common/templates/_getKeyLookup.tpl | 92 ++++++++++ charts/common/templates/_imagePullSecret.tpl | 2 +- charts/common/templates/_istioEnabled.tpl | 2 +- charts/common/templates/_tplvalues.tpl | 19 ++ charts/common/test-chart/Chart.lock | 6 +- charts/common/test-chart/Chart.yaml | 4 +- .../common/test-chart/charts/common-0.1.4.tgz | Bin 19341 -> 0 bytes .../common/test-chart/charts/common-0.1.5.tgz | Bin 0 -> 4514 bytes .../templates/testHasNestedKey.yaml | 6 + .../test-chart/templates/valueLookup.yaml | 7 + charts/common/test-chart/templates/vs.yaml | 1 - .../tests/__snapshot__/istio_test.yaml.snap | 2 - .../test-chart/tests/hasNestedKey_test.yaml | 42 +++++ .../common/test-chart/tests/istio_test.yaml | 2 + .../test-chart/tests/valueLookup_test.yaml | 87 +++++++++ charts/common/test-chart/values.yaml | 1 - charts/common/values.yaml | 75 ++++++++ charts/example-content/Chart.lock | 8 +- charts/example-content/Chart.yaml | 6 +- charts/example-content/README.MD | 27 ++- charts/example-content/README.md | 21 +++ .../example-content/charts/common-0.1.4.tgz | Bin 22092 -> 0 bytes .../example-content/charts/common-0.1.5.tgz | Bin 0 -> 4513 bytes charts/example-content/templates/deploy.yaml | 31 +--- .../templates/istio-virtual-service.yaml | 4 +- charts/example-content/templates/sa.yaml | 3 +- .../tests/__snapshot__/deploy_test.yaml.snap | 38 +++- .../tests/__snapshot__/istio_test.yaml.snap | 24 +-- charts/example-content/values.yaml | 12 +- .../.helmignore | 23 +++ .../Chart.yaml | 24 +++ .../extension-manager-operator-crds/README.md | 6 + ...core.openmfp.io_contentconfigurations.yaml | 170 ++++++++++++++++++ .../test-values.yaml | 1 + .../__snapshot__/deployment_test.yaml.snap | 168 +++++++++++++++++ .../tests/deployment_test.yaml | 12 ++ .../values.yaml | 1 + charts/extension-manager-operator/.helmignore | 23 +++ charts/extension-manager-operator/Chart.lock | 9 + charts/extension-manager-operator/Chart.yaml | 14 ++ charts/extension-manager-operator/README.md | 22 +++ .../charts/common-0.1.5.tgz | Bin 0 -> 4513 bytes .../extension-manager-operator-crds-0.1.3.tgz | Bin 0 -> 3513 bytes .../templates/cluster-role.yaml | 50 ++++++ .../templates/cluster-rolebinding.yaml | 12 ++ .../templates/deployment.yaml | 41 +++++ .../templates/service-account.yaml | 5 + .../test-values.yaml | 2 + .../__snapshot__/deployment_test.yaml.snap | 139 ++++++++++++++ .../tests/deployment_test.yaml | 100 +++++++++++ charts/extension-manager-operator/values.yaml | 15 ++ charts/openmfp-crds/Chart.yaml | 2 +- charts/openmfp-crds/README.md | 19 ++ charts/openmfp/Chart.yaml | 2 +- charts/openmfp/README.md | 20 +++ charts/portal/Chart.lock | 6 +- charts/portal/Chart.yaml | 4 +- charts/portal/README.MD | 29 ++- charts/portal/README.md | 23 +++ charts/portal/charts/common-0.1.4.tgz | Bin 22092 -> 0 bytes charts/portal/charts/common-0.1.5.tgz | Bin 0 -> 4511 bytes charts/portal/templates/deploy.yaml | 31 +--- charts/portal/templates/external-secrets.yaml | 2 +- .../templates/istio-destination-rule.yaml | 1 - .../templates/istio-peerauthentication.yaml | 1 - .../templates/istio-virtual-service.yaml | 1 - charts/portal/templates/sa.yaml | 1 - charts/portal/templates/service.yaml | 1 - charts/portal/templates/sidecar.yaml | 1 - .../tests/__snapshot__/deploy_test.yaml.snap | 31 ++-- .../external-secrets_test.yaml.snap | 23 +-- .../istio-virtual_service_test.yaml.snap | 5 +- .../tests/__snapshot__/istio_test.yaml.snap | 136 ++++++-------- charts/portal/tests/deploy_test.yaml | 2 + .../tests/istio-virtual_service_test.yaml | 2 + charts/portal/tests/istio_test.yaml | 2 + charts/portal/values.yaml | 16 +- 108 files changed, 2040 insertions(+), 403 deletions(-) create mode 100644 .github/workflows/extension-manager-operator-crds.yaml create mode 100644 .github/workflows/extension-manager-operator.yaml create mode 100644 .helmdocsignore create mode 100644 README.md create mode 100644 charts/_templates.gotmpl create mode 100644 charts/account-operator-crds/README.md create mode 100644 charts/account-operator/README.md delete mode 100644 charts/account-operator/charts/account-operator-crds-0.1.5.tgz create mode 100644 charts/account-operator/charts/account-operator-crds-0.1.6.tgz delete mode 100644 charts/account-operator/charts/common-0.1.4.tgz create mode 100644 charts/account-operator/charts/common-0.1.5.tgz create mode 100644 charts/common/.helmignore create mode 100644 charts/common/README.md create mode 100644 charts/common/README.md.gotmpl delete mode 100644 charts/common/templates/_certManagerEnabled.tpl create mode 100644 charts/common/templates/_deploymentHelpers.tpl create mode 100644 charts/common/templates/_getKeyLookup.tpl create mode 100644 charts/common/templates/_tplvalues.tpl delete mode 100644 charts/common/test-chart/charts/common-0.1.4.tgz create mode 100644 charts/common/test-chart/charts/common-0.1.5.tgz create mode 100644 charts/common/test-chart/templates/testHasNestedKey.yaml create mode 100644 charts/common/test-chart/templates/valueLookup.yaml create mode 100644 charts/common/test-chart/tests/hasNestedKey_test.yaml create mode 100644 charts/common/test-chart/tests/valueLookup_test.yaml create mode 100644 charts/example-content/README.md delete mode 100644 charts/example-content/charts/common-0.1.4.tgz create mode 100644 charts/example-content/charts/common-0.1.5.tgz create mode 100644 charts/extension-manager-operator-crds/.helmignore create mode 100644 charts/extension-manager-operator-crds/Chart.yaml create mode 100644 charts/extension-manager-operator-crds/README.md create mode 100644 charts/extension-manager-operator-crds/templates/core.openmfp.io_contentconfigurations.yaml create mode 100644 charts/extension-manager-operator-crds/test-values.yaml create mode 100644 charts/extension-manager-operator-crds/tests/__snapshot__/deployment_test.yaml.snap create mode 100644 charts/extension-manager-operator-crds/tests/deployment_test.yaml create mode 100644 charts/extension-manager-operator-crds/values.yaml create mode 100644 charts/extension-manager-operator/.helmignore create mode 100644 charts/extension-manager-operator/Chart.lock create mode 100644 charts/extension-manager-operator/Chart.yaml create mode 100644 charts/extension-manager-operator/README.md create mode 100644 charts/extension-manager-operator/charts/common-0.1.5.tgz create mode 100644 charts/extension-manager-operator/charts/extension-manager-operator-crds-0.1.3.tgz create mode 100644 charts/extension-manager-operator/templates/cluster-role.yaml create mode 100644 charts/extension-manager-operator/templates/cluster-rolebinding.yaml create mode 100644 charts/extension-manager-operator/templates/deployment.yaml create mode 100644 charts/extension-manager-operator/templates/service-account.yaml create mode 100644 charts/extension-manager-operator/test-values.yaml create mode 100644 charts/extension-manager-operator/tests/__snapshot__/deployment_test.yaml.snap create mode 100644 charts/extension-manager-operator/tests/deployment_test.yaml create mode 100644 charts/extension-manager-operator/values.yaml create mode 100644 charts/openmfp-crds/README.md create mode 100644 charts/openmfp/README.md create mode 100644 charts/portal/README.md delete mode 100644 charts/portal/charts/common-0.1.4.tgz create mode 100644 charts/portal/charts/common-0.1.5.tgz diff --git a/.github/workflows/common.yaml b/.github/workflows/common.yaml index 0c6009415..b371d7f44 100644 --- a/.github/workflows/common.yaml +++ b/.github/workflows/common.yaml @@ -16,6 +16,7 @@ jobs: chartName: common additionalTestFilesCommand: '' chartRepos: 'bitnami=https://charts.bitnami.com/bitnami,openfga=https://openfga.github.io/helm-charts' + skipVulnerabilityScan: true secrets: inherit updateVersionFile: diff --git a/.github/workflows/extension-manager-operator-crds.yaml b/.github/workflows/extension-manager-operator-crds.yaml new file mode 100644 index 000000000..cd3a3c47b --- /dev/null +++ b/.github/workflows/extension-manager-operator-crds.yaml @@ -0,0 +1,28 @@ +name: Build extension-manager-operator-crds Workflow +on: + push: + paths: + - 'charts/extension-manager-operator-crds/**' + - '.github/workflows/extension-manager-operator-crds.yaml' + +jobs: + pipeline: + concurrency: + group: extension-manager-operator-crds-${{ github.ref }} + cancel-in-progress: true + uses: openmfp/gha/.github/workflows/pipeline-chart.yml@main + with: + chartFolder: charts + chartName: extension-manager-operator-crds + additionalTestFilesCommand: '' + chartRepos: 'bitnami=https://charts.bitnami.com/bitnami,openfga=https://openfga.github.io/helm-charts' + secrets: inherit + + updateVersionFile: + if: ${{ github.ref == 'refs/heads/main' }} + needs: [pipeline] + uses: openmfp/gha/.github/workflows/job-update-version-file.yml@main + secrets: inherit + with: + componentVersionKey: "extension-manager-operator-crds" + version: ${{ needs.pipeline.outputs.version }} diff --git a/.github/workflows/extension-manager-operator.yaml b/.github/workflows/extension-manager-operator.yaml new file mode 100644 index 000000000..75c5e926b --- /dev/null +++ b/.github/workflows/extension-manager-operator.yaml @@ -0,0 +1,28 @@ +name: Build extension-manager-operator Workflow +on: + push: + paths: + - 'charts/extension-manager-operator/**' + - '.github/workflows/extension-manager-operator.yaml' + +jobs: + pipeline: + concurrency: + group: extension-manager-operator-${{ github.ref }} + cancel-in-progress: true + uses: openmfp/gha/.github/workflows/pipeline-chart.yml@main + with: + chartFolder: charts + chartName: extension-manager-operator + additionalTestFilesCommand: '' + chartRepos: 'bitnami=https://charts.bitnami.com/bitnami,openfga=https://openfga.github.io/helm-charts' + secrets: inherit + + updateVersionFile: + if: ${{ github.ref == 'refs/heads/main' }} + needs: [pipeline] + uses: openmfp/gha/.github/workflows/job-update-version-file.yml@main + secrets: inherit + with: + componentVersionKey: "extension-manager-operator" + version: ${{ needs.pipeline.outputs.version }} diff --git a/.gitignore b/.gitignore index f392e285f..831d11709 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .idea .vscode/settings.json +bin/ diff --git a/.helmdocsignore b/.helmdocsignore new file mode 100644 index 000000000..eab41bb67 --- /dev/null +++ b/.helmdocsignore @@ -0,0 +1 @@ +charts/common/test-chart \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 000000000..1e36182c2 --- /dev/null +++ b/README.md @@ -0,0 +1,18 @@ +# helm-charts + +This repository contains public helm charts for the OpenMFP project. + +## Taskfile +It uses Taskfile and task command to local dev tooling. The following tasks are available: `lint, helmtest, test, update, validate, vulnerability, helm-docs`. + +## Updating charts +If a chart is changed, it could be dependency of other chart or its dependencies must be updated. To do it, run `task update`. + +## Helm-docs +Using https://github.com/norwoodj/helm-docs to generate charts documentation. Documentation can be updated by running `task helm-docs` command. + +## Github Actions +Each chart is automatically tested, packaged and published to github repository. Workflows are located in the [.github/workflows](.github/workflows) folder. + +## OWASP vulnerability scanning +Kube-linter and kube-score can be run locally with `task vulnerability`. PR changes are also scanned on github and found vulnerability are visible under the Security project section on Github. \ No newline at end of file diff --git a/Taskfile.yaml b/Taskfile.yaml index b805157fe..d6d8be93f 100644 --- a/Taskfile.yaml +++ b/Taskfile.yaml @@ -3,27 +3,56 @@ version: '3' vars: LOCAL_BIN: bin CHARTS: - sh: "ls charts/ | sed 's/^/charts\\//g' | paste -sd ',' -" + sh: "printf '%s,%s' $(ls -d charts/*/ | paste -sd ',' -) 'charts/common/test-chart'" + CHANGED_CHARTS: + sh: "git status --porcelain | grep '^ M charts/' | cut -d'/' -f2 | sort -u | sed 's|^|charts/|' | paste -sd ',' -" tasks: + ## Setup + setup:kube-lint: + internal: true + cmds: + - mkdir -p $(pwd)/{{.LOCAL_BIN}} + - test -s {{.LOCAL_BIN}}/kube-linter || GOBIN=$(pwd)/{{.LOCAL_BIN}} go install golang.stackrox.io/kube-linter/cmd/kube-linter@latest + - chmod +x $(pwd)/{{.LOCAL_BIN}}/kube-linter + setup:helm-docs: + internal: true + cmds: + - test -s {{.LOCAL_BIN}}/helm-docs || GOBIN=$(pwd)/{{.LOCAL_BIN}} go install github.com/norwoodj/helm-docs/cmd/helm-docs@latest ## Development lint: deps: [] cmds: - "ct lint --target-branch main --validate-maintainers=false --charts={{.CHARTS}}" - package: - cmds: - - helm package ./charts/openmfp helmtest: cmds: - "for chart in $(echo {{.CHARTS}} | tr ',' ' '); do helm unittest $chart; done" test: deps: + - task: update - task: helmtest + update-changed: + deps: + - task: helm-docs + cmds: + - "for chart in $(echo {{.CHANGED_CHARTS}} | tr ',' ' '); do helm dependency update $chart; done" update: + deps: + - task: helm-docs cmds: - "for chart in $(echo {{.CHARTS}} | tr ',' ' '); do helm dependency update $chart; done" validate: cmds: - task: lint - - task: package - - task: test \ No newline at end of file + # - task: package + - task: test + - task: vulnerability + vulnerability: + deps: + - task: setup:kube-lint + cmds: + - "{{.LOCAL_BIN}}/kube-linter lint \"charts/\" --format \"plain\"" + helm-docs: + deps: + - task: setup:helm-docs + cmds: + - "{{.LOCAL_BIN}}/helm-docs --chart-search-root charts/ --template-files=README.md.gotmpl" \ No newline at end of file diff --git a/charts/_templates.gotmpl b/charts/_templates.gotmpl new file mode 100644 index 000000000..a01784f66 --- /dev/null +++ b/charts/_templates.gotmpl @@ -0,0 +1,18 @@ +{{ template "chart.header" . }} +{{ template "chart.description" . }} + +{{ template "chart.versionBadge" . }}{{ template "chart.typeBadge" . }}{{ template "chart.appVersionBadge" . }} + +## Configuration + +The chart supports the following configuration parameters in the table below. Additionally, default configuration parameters documented in [common/README.md](../common/README.md) are not explicitely listed in the table but are also supported. + +{{ template "chart.valuesHeader" . }} + +Default configuration parameters, which can be overriden either globally or on a chart level are documented in [common/README.md](../common/README.md). + +{{ template "chart.valuesTable" . }} + +{{ template "chart.requirementsSection" . }} + +{{ template "helm-docs.versionFooter" . }} diff --git a/charts/account-operator-crds/Chart.yaml b/charts/account-operator-crds/Chart.yaml index 2e6f69809..f28f61693 100644 --- a/charts/account-operator-crds/Chart.yaml +++ b/charts/account-operator-crds/Chart.yaml @@ -4,6 +4,6 @@ description: A Helm chart for Kubernetes type: application -version: 0.1.5 +version: 0.1.6 appVersion: "1.16.0" diff --git a/charts/account-operator-crds/README.md b/charts/account-operator-crds/README.md new file mode 100644 index 000000000..50a5c1f6d --- /dev/null +++ b/charts/account-operator-crds/README.md @@ -0,0 +1,12 @@ +# account-operator-crds + +![Version: 0.1.6](https://img.shields.io/badge/Version-0.1.6-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 1.16.0](https://img.shields.io/badge/AppVersion-1.16.0-informational?style=flat-square) + +A Helm chart for Kubernetes + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| kcp.enabled | bool | `false` | Enable KCP | + diff --git a/charts/account-operator-crds/values.yaml b/charts/account-operator-crds/values.yaml index f569f4f46..1125312a8 100644 --- a/charts/account-operator-crds/values.yaml +++ b/charts/account-operator-crds/values.yaml @@ -1,2 +1,3 @@ kcp: + # -- Enable KCP enabled: false diff --git a/charts/account-operator/Chart.lock b/charts/account-operator/Chart.lock index 52685bc63..4ba972e60 100644 --- a/charts/account-operator/Chart.lock +++ b/charts/account-operator/Chart.lock @@ -1,9 +1,9 @@ dependencies: - name: account-operator-crds repository: file://../account-operator-crds - version: 0.1.5 + version: 0.1.6 - name: common repository: file://../common - version: 0.1.4 -digest: sha256:9d2466bb6f196f2355a55ff621f6017cee086f9600280b009e55249ab6a6335f -generated: "2024-11-21T17:36:43.666194+01:00" + version: 0.1.5 +digest: sha256:5dcb2935c71c2e917170ef3b54c5ea586ab30269a5ec960353bfcbb362c073e1 +generated: "2024-11-27T20:12:23.434477831+02:00" diff --git a/charts/account-operator/Chart.yaml b/charts/account-operator/Chart.yaml index 494972af3..9dfc6f517 100644 --- a/charts/account-operator/Chart.yaml +++ b/charts/account-operator/Chart.yaml @@ -2,13 +2,13 @@ apiVersion: v2 name: account-operator description: A Helm chart for Kubernetes type: application -version: 0.4.20 +version: 0.4.21 appVersion: "0.108.0" dependencies: - name: account-operator-crds - version: 0.1.5 + version: 0.1.6 condition: crds.enabled repository: file://../account-operator-crds - name: common - version: 0.1.4 + version: 0.1.5 repository: file://../common diff --git a/charts/account-operator/README.md b/charts/account-operator/README.md new file mode 100644 index 000000000..a749e6901 --- /dev/null +++ b/charts/account-operator/README.md @@ -0,0 +1,40 @@ +# account-operator + +![Version: 0.4.21](https://img.shields.io/badge/Version-0.4.21-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 0.108.0](https://img.shields.io/badge/AppVersion-0.108.0-informational?style=flat-square) + +A Helm chart for Kubernetes + +## Requirements + +| Repository | Name | Version | +|------------|------|---------| +| file://../account-operator-crds | account-operator-crds | 0.1.6 | +| file://../common | common | 0.1.5 | + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| crds.enabled | bool | `true` | Enable CRDs | +| deployment.specTemplate.annotations | object | `{}` | The annotations for the deployment | +| deployment.specTemplate.labels | object | `{}` | The labels for the deployment | +| image.name | string | `"ghcr.io/openmfp/account-operator"` | The image repository | +| image.tag | string | `"latest"` | The image tag | +| kcp | object | `{"enabled":false,"virtualWorkspaceUrl":""}` | The KCP configuration | +| kcp.enabled | bool | `false` | Enable KCP | +| kcp.virtualWorkspaceUrl | string | `""` | The URL for the virtual workspace | +| kubeconfigSecret | string | `""` | The secret for kubeconfig | +| logLevel | string | `"warn"` | The log level | +| security.mountServiceAccountToken | bool | `false` | Mount the service account token | +| subroutines.extension.enabled | bool | `true` | Enable extension subroutines | +| subroutines.extensionReady.enabled | bool | `true` | Enable extension ready subroutines | +| subroutines.fga.creatorRelation | string | `"owner"` | The creator relation for FGA | +| subroutines.fga.enabled | bool | `true` | Enable FGA subroutines | +| subroutines.fga.grpcAddr | string | `""` | The gRPC address for FGA | +| subroutines.fga.objectType | string | `"account"` | The object type for FGA | +| subroutines.fga.parentRelation | string | `"parent"` | The parent relation for FGA | +| subroutines.fga.rootNamespace | string | `"openmfp-root"` | The root namespace for FGA | +| subroutines.namespace.enabled | bool | `true` | Enable namespace subroutines | +| webhooks.certDir | string | `"/certs"` | The directory for webhook certificates | +| webhooks.enabled | bool | `false` | Enable webhooks | + diff --git a/charts/account-operator/charts/account-operator-crds-0.1.5.tgz b/charts/account-operator/charts/account-operator-crds-0.1.5.tgz deleted file mode 100644 index b245dcd3079d429d9e9fcad5d2205c4b5080af92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5139 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 B_j&*T diff --git a/charts/account-operator/charts/account-operator-crds-0.1.6.tgz b/charts/account-operator/charts/account-operator-crds-0.1.6.tgz new file mode 100644 index 0000000000000000000000000000000000000000..d7dbe12e9f0144999841269d306b18d615dee02d GIT binary patch literal 5346 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 AcK`qY literal 0 HcmV?d00001 diff --git a/charts/account-operator/charts/common-0.1.4.tgz b/charts/account-operator/charts/common-0.1.4.tgz deleted file mode 100644 index a395f60bb1aa92a04a5156a1db17789bc29fad21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22092 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�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 H0Ez$r;@{hd diff --git a/charts/account-operator/charts/common-0.1.5.tgz b/charts/account-operator/charts/common-0.1.5.tgz new file mode 100644 index 0000000000000000000000000000000000000000..17b38ee60c182f7c7f48df7c60b6fb6498e30912 GIT binary patch literal 4512 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 literal 0 HcmV?d00001 diff --git a/charts/account-operator/templates/deployment.yaml b/charts/account-operator/templates/deployment.yaml index 5dbe63a07..c76056e92 100644 --- a/charts/account-operator/templates/deployment.yaml +++ b/charts/account-operator/templates/deployment.yaml @@ -2,13 +2,12 @@ apiVersion: apps/v1 kind: Deployment metadata: name: {{ include "common.entity.name" . }} - namespace: {{ .Release.Namespace }} {{- if .Values.webhooks.enabled }} annotations: cert-manager.io/inject-ca-from: {{ .Release.Namespace }}/{{ include "common.entity.name" . }}-serving-cert {{- end }} spec: - revisionHistoryLimit: {{ .Values.deployment.revisionHistoryLimit }} + revisionHistoryLimit: {{ include "common.getKeyValue" (dict "Values" .Values "key" "deployment.revisionHistoryLimit") }} selector: matchLabels: service: {{ include "common.entity.name" . }} @@ -34,42 +33,19 @@ spec: - operator - --leader-elect - --log-level={{ .Values.logLevel }} - - "--health-probe-bind-address=:{{ .Values.health.port }}" + - '--health-probe-bind-address=:{{ include "common.getKeyValue" (dict "Values" .Values "key" "health.port") }}' image: {{ .Values.image.name }}:{{ .Chart.AppVersion }} name: manager - securityContext: - runAsNonRoot: true + {{ include "common.container.securityContext" . | nindent 10 }} ports: - - containerPort: {{ .Values.metrics.port }} - name: metrics - protocol: TCP - - name: health-port - containerPort: {{ .Values.health.port }} - protocol: TCP + {{ include "common.PortsMetricsHealth" . | nindent 10 }} {{- if .Values.webhooks.enabled }} - name: webhook-port containerPort: 9443 protocol: TCP {{- end }} - livenessProbe: - httpGet: - path: /healthz - port: {{ .Values.health.port}} - initialDelaySeconds: 15 - periodSeconds: 20 - readinessProbe: - httpGet: - path: /readyz - port: {{ .Values.health.port}} - initialDelaySeconds: 5 - periodSeconds: 10 - resources: - limits: - cpu: {{ .Values.deployment.resources.limits.cpu }} - memory: {{ .Values.deployment.resources.limits.memory }} - requests: - cpu: {{ .Values.deployment.resources.requests.cpu }} - memory: {{ .Values.deployment.resources.requests.memory }} + {{ include "common.operatorHealthAndReadyness" . | nindent 10 }} + {{ include "common.resources" . | nindent 10 }} env: - name: SUBROUTINES_NAMESPACE_ENABLED value: "{{ .Values.subroutines.namespace.enabled }}" diff --git a/charts/account-operator/templates/service-account.yaml b/charts/account-operator/templates/service-account.yaml index 2eaf7c467..490c917a9 100644 --- a/charts/account-operator/templates/service-account.yaml +++ b/charts/account-operator/templates/service-account.yaml @@ -2,5 +2,4 @@ apiVersion: v1 kind: ServiceAccount metadata: name: {{ include "common.entity.name" . }} - namespace: {{ .Release.Namespace }} {{- include "common.imagePullSecret" . }} diff --git a/charts/account-operator/templates/webhook/pki.yaml b/charts/account-operator/templates/webhook/pki.yaml index a0375a863..9e4d73ff3 100644 --- a/charts/account-operator/templates/webhook/pki.yaml +++ b/charts/account-operator/templates/webhook/pki.yaml @@ -3,7 +3,6 @@ apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: {{ include "common.entity.name" . }}-selfsigned-issuer - namespace: {{ .Release.namespace }} spec: selfSigned: {} --- @@ -11,7 +10,6 @@ apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: {{ include "common.entity.name" . }}-serving-cert - namespace: {{ .Release.namespace }} spec: dnsNames: - {{ include "common.entity.name" . }}-webhook.{{ .Release.Namespace }}.svc diff --git a/charts/account-operator/templates/webhook/service.yaml b/charts/account-operator/templates/webhook/service.yaml index 7c8eb409f..c42d42a78 100644 --- a/charts/account-operator/templates/webhook/service.yaml +++ b/charts/account-operator/templates/webhook/service.yaml @@ -3,7 +3,6 @@ apiVersion: v1 kind: Service metadata: name: {{ include "common.entity.name" . }}-webhook - namespace: {{ .Release.Namespace }} spec: ports: - port: 443 diff --git a/charts/account-operator/tests/__snapshot__/deployment_test.yaml.snap b/charts/account-operator/tests/__snapshot__/deployment_test.yaml.snap index 74b97e52d..f3c889aba 100644 --- a/charts/account-operator/tests/__snapshot__/deployment_test.yaml.snap +++ b/charts/account-operator/tests/__snapshot__/deployment_test.yaml.snap @@ -209,7 +209,7 @@ operator match the snapshot: apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: - name: RELEASE-NAME-account-operator + name: account-operator rules: - apiGroups: - core.openmfp.io @@ -265,32 +265,31 @@ operator match the snapshot: apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: - name: RELEASE-NAME-account-operator + name: account-operator roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole - name: RELEASE-NAME-account-operator + name: account-operator subjects: - kind: ServiceAccount - name: RELEASE-NAME-account-operator + name: account-operator namespace: NAMESPACE 4: | apiVersion: apps/v1 kind: Deployment metadata: - name: RELEASE-NAME-account-operator - namespace: NAMESPACE + name: account-operator spec: revisionHistoryLimit: 3 selector: matchLabels: - service: RELEASE-NAME-account-operator + service: account-operator template: metadata: annotations: null labels: control-plane: controller-manager - service: RELEASE-NAME-account-operator + service: account-operator spec: containers: - args: @@ -298,6 +297,7 @@ operator match the snapshot: - --leader-elect - --log-level=warn - --health-probe-bind-address=:8081 + automountServiceAccountToken: false env: - name: SUBROUTINES_NAMESPACE_ENABLED value: "true" @@ -327,11 +327,11 @@ operator match the snapshot: value: /certs image: ghcr.io/openmfp/account-operator:0.0.0 livenessProbe: + failureThreshold: 1 httpGet: path: /healthz port: 8081 - initialDelaySeconds: 15 - periodSeconds: 20 + periodSeconds: 10 name: manager ports: - containerPort: 8080 @@ -354,9 +354,19 @@ operator match the snapshot: cpu: 150m memory: 128Mi securityContext: + readOnlyRootFilesystem: true runAsNonRoot: true + seccompProfile: + type: RuntimeDefault + serviceAccountName: account-operator + startupProbe: + failureThreshold: 30 + httpGet: + path: /readyz + port: 8081 + periodSeconds: 10 volumeMounts: null - serviceAccountName: RELEASE-NAME-account-operator + serviceAccountName: account-operator terminationGracePeriodSeconds: 10 volumes: null 5: | @@ -365,8 +375,7 @@ operator match the snapshot: - name: github kind: ServiceAccount metadata: - name: RELEASE-NAME-account-operator - namespace: NAMESPACE + name: account-operator operator match the snapshot (with kubeconfigSecret): 1: | apiVersion: apiextensions.k8s.io/v1 @@ -578,7 +587,7 @@ operator match the snapshot (with kubeconfigSecret): apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: - name: RELEASE-NAME-account-operator + name: account-operator rules: - apiGroups: - core.openmfp.io @@ -634,32 +643,31 @@ operator match the snapshot (with kubeconfigSecret): apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: - name: RELEASE-NAME-account-operator + name: account-operator roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole - name: RELEASE-NAME-account-operator + name: account-operator subjects: - kind: ServiceAccount - name: RELEASE-NAME-account-operator + name: account-operator namespace: NAMESPACE 4: | apiVersion: apps/v1 kind: Deployment metadata: - name: RELEASE-NAME-account-operator - namespace: NAMESPACE + name: account-operator spec: revisionHistoryLimit: 3 selector: matchLabels: - service: RELEASE-NAME-account-operator + service: account-operator template: metadata: annotations: null labels: control-plane: controller-manager - service: RELEASE-NAME-account-operator + service: account-operator spec: containers: - args: @@ -667,6 +675,7 @@ operator match the snapshot (with kubeconfigSecret): - --leader-elect - --log-level=warn - --health-probe-bind-address=:8081 + automountServiceAccountToken: false env: - name: SUBROUTINES_NAMESPACE_ENABLED value: "true" @@ -698,11 +707,11 @@ operator match the snapshot (with kubeconfigSecret): value: /api-kubeconfig/kubeconfig image: ghcr.io/openmfp/account-operator:0.0.0 livenessProbe: + failureThreshold: 1 httpGet: path: /healthz port: 8081 - initialDelaySeconds: 15 - periodSeconds: 20 + periodSeconds: 10 name: manager ports: - containerPort: 8080 @@ -719,17 +728,27 @@ operator match the snapshot (with kubeconfigSecret): periodSeconds: 10 resources: limits: - cpu: 260m + cpu: 100m memory: 512Mi requests: - cpu: 150m - memory: 128Mi + cpu: 40m + memory: 50Mi securityContext: + readOnlyRootFilesystem: true runAsNonRoot: true + seccompProfile: + type: RuntimeDefault + serviceAccountName: account-operator + startupProbe: + failureThreshold: 30 + httpGet: + path: /readyz + port: 8081 + periodSeconds: 10 volumeMounts: - mountPath: /api-kubeconfig name: external-api-server - serviceAccountName: RELEASE-NAME-account-operator + serviceAccountName: account-operator terminationGracePeriodSeconds: 10 volumes: - name: external-api-server @@ -741,8 +760,7 @@ operator match the snapshot (with kubeconfigSecret): - name: github kind: ServiceAccount metadata: - name: RELEASE-NAME-account-operator - namespace: NAMESPACE + name: account-operator operator match the snapshot with webhook enabled: 1: | apiVersion: apiextensions.k8s.io/v1 @@ -954,7 +972,7 @@ operator match the snapshot with webhook enabled: apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: - name: RELEASE-NAME-account-operator + name: account-operator rules: - apiGroups: - core.openmfp.io @@ -1010,35 +1028,34 @@ operator match the snapshot with webhook enabled: apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: - name: RELEASE-NAME-account-operator + name: account-operator roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole - name: RELEASE-NAME-account-operator + name: account-operator subjects: - kind: ServiceAccount - name: RELEASE-NAME-account-operator + name: account-operator namespace: NAMESPACE 4: | apiVersion: apps/v1 kind: Deployment metadata: annotations: - cert-manager.io/inject-ca-from: NAMESPACE/RELEASE-NAME-account-operator-serving-cert - name: RELEASE-NAME-account-operator - namespace: NAMESPACE + cert-manager.io/inject-ca-from: NAMESPACE/account-operator-serving-cert + name: account-operator spec: revisionHistoryLimit: 3 selector: matchLabels: - service: RELEASE-NAME-account-operator + service: account-operator template: metadata: annotations: traffic.sidecar.istio.io/excludeInboundPorts: "9443" labels: control-plane: controller-manager - service: RELEASE-NAME-account-operator + service: account-operator spec: containers: - args: @@ -1046,6 +1063,7 @@ operator match the snapshot with webhook enabled: - --leader-elect - --log-level=warn - --health-probe-bind-address=:8081 + automountServiceAccountToken: false env: - name: SUBROUTINES_NAMESPACE_ENABLED value: "true" @@ -1075,11 +1093,11 @@ operator match the snapshot with webhook enabled: value: /certs image: ghcr.io/openmfp/account-operator:0.0.0 livenessProbe: + failureThreshold: 1 httpGet: path: /healthz port: 8081 - initialDelaySeconds: 15 - periodSeconds: 20 + periodSeconds: 10 name: manager ports: - containerPort: 8080 @@ -1095,7 +1113,7 @@ operator match the snapshot with webhook enabled: httpGet: path: /readyz port: 8081 - initialDelaySeconds: 5 + initialDelaySeconds: 45 periodSeconds: 10 resources: limits: @@ -1105,39 +1123,48 @@ operator match the snapshot with webhook enabled: cpu: 150m memory: 128Mi securityContext: + readOnlyRootFilesystem: true runAsNonRoot: true + seccompProfile: + type: RuntimeDefault + serviceAccountName: account-operator + startupProbe: + failureThreshold: 30 + httpGet: + path: /healthz + port: 8081 + periodSeconds: 10 volumeMounts: - mountPath: /certs name: cert readOnly: true - serviceAccountName: RELEASE-NAME-account-operator + serviceAccountName: account-operator terminationGracePeriodSeconds: 10 volumes: - name: cert secret: defaultMode: 420 - secretName: RELEASE-NAME-account-operator-webhook-server-cert + secretName: account-operator-webhook-server-cert 5: | apiVersion: v1 imagePullSecrets: - name: github kind: ServiceAccount metadata: - name: RELEASE-NAME-account-operator - namespace: NAMESPACE + name: account-operator 6: | apiVersion: admissionregistration.k8s.io/v1 kind: MutatingWebhookConfiguration metadata: annotations: - cert-manager.io/inject-ca-from: NAMESPACE/RELEASE-NAME-account-operator-serving-cert - name: RELEASE-NAME-account-operator-mutating-webhook-configuration + cert-manager.io/inject-ca-from: NAMESPACE/account-operator-serving-cert + name: account-operator-mutating-webhook-configuration webhooks: - admissionReviewVersions: - v1 clientConfig: service: - name: RELEASE-NAME-account-operator-webhook + name: account-operator-webhook namespace: NAMESPACE path: /mutate-core-openmfp-io-v1alpha1-account failurePolicy: Fail @@ -1156,30 +1183,27 @@ operator match the snapshot with webhook enabled: apiVersion: cert-manager.io/v1 kind: Issuer metadata: - name: RELEASE-NAME-account-operator-selfsigned-issuer - namespace: null + name: account-operator-selfsigned-issuer spec: selfSigned: {} 8: | apiVersion: cert-manager.io/v1 kind: Certificate metadata: - name: RELEASE-NAME-account-operator-serving-cert - namespace: null + name: account-operator-serving-cert spec: dnsNames: - - RELEASE-NAME-account-operator-webhook.NAMESPACE.svc - - RELEASE-NAME-account-operator-webhook.NAMESPACE.svc.cluster.local + - account-operator-webhook.NAMESPACE.svc + - account-operator-webhook.NAMESPACE.svc.cluster.local issuerRef: kind: Issuer - name: RELEASE-NAME-account-operator-selfsigned-issuer - secretName: RELEASE-NAME-account-operator-webhook-server-cert + name: account-operator-selfsigned-issuer + secretName: account-operator-webhook-server-cert 9: | apiVersion: v1 kind: Service metadata: - name: RELEASE-NAME-account-operator-webhook - namespace: NAMESPACE + name: account-operator-webhook spec: ports: - port: 443 @@ -1187,4 +1211,4 @@ operator match the snapshot with webhook enabled: targetPort: 9443 selector: control-plane: controller-manager - service: RELEASE-NAME-account-operator + service: account-operator diff --git a/charts/account-operator/tests/deployment_test.yaml b/charts/account-operator/tests/deployment_test.yaml index 0ab28c0f8..0f5acf693 100644 --- a/charts/account-operator/tests/deployment_test.yaml +++ b/charts/account-operator/tests/deployment_test.yaml @@ -1,8 +1,21 @@ suite: operator chart: appVersion: 0.0.0 +release: + name: account-operator tests: - it: operator match the snapshot + set: + # health: + # portOverride: 8080 + deployment: + resources: + limits: + cpuOverride: 260m + memoryOverride: 512Mi + requests: + cpuOverride: 150m + memoryOverride: 128Mi asserts: - matchSnapshot: {} - it: operator match the snapshot (with kubeconfigSecret) @@ -12,7 +25,44 @@ tests: - matchSnapshot: {} - it: operator match the snapshot with webhook enabled set: + health: + # portOverride: 8081 + liveness: + pathOverride: "/healthz" + # failureThreshold: 1 + startup: + pathOverride: "/healthz" + readiness: + initialDelaySecondsOverride: 45 webhooks: enabled: true + certDir: /certs + deployment: + resources: + limits: + cpuOverride: 260m + memoryOverride: 512Mi + requests: + cpuOverride: 150m + memoryOverride: 128Mi + asserts: + - matchSnapshot: {} + - it: deployment with security context + template: deployment.yaml + set: + security: + mountServiceAccountToken: true asserts: - - matchSnapshot: {} \ No newline at end of file + - equal: + path: spec.template.spec.containers[0].securityContext + value: + runAsNonRoot: true + readOnlyRootFilesystem: true + seccompProfile: + type: RuntimeDefault + - equal: + path: spec.template.spec.containers[0].serviceAccountName + value: account-operator + - equal: + path: spec.template.spec.containers[0].automountServiceAccountToken + value: true diff --git a/charts/account-operator/values.yaml b/charts/account-operator/values.yaml index 6ba72de92..29c70e9b6 100644 --- a/charts/account-operator/values.yaml +++ b/charts/account-operator/values.yaml @@ -1,53 +1,62 @@ image: + # -- The image repository name: ghcr.io/openmfp/account-operator + # -- The image tag tag: latest -imagePullSecret: "github" - crds: + # -- Enable CRDs enabled: true webhooks: + # -- Enable webhooks enabled: false + # -- The directory for webhook certificates certDir: /certs -health: - port: 8081 - -metrics: - port: 8080 - -deployment: - specTemplate: - annotations: {} - labels: {} - revisionHistoryLimit: 3 - resources: - limits: - cpu: 260m - memory: 512Mi - requests: - cpu: 150m - memory: 128Mi - +# -- The KCP configuration kcp: + # -- Enable KCP enabled: false + # -- The URL for the virtual workspace virtualWorkspaceUrl: "" subroutines: namespace: + # -- Enable namespace subroutines enabled: true fga: + # -- Enable FGA subroutines enabled: true + # -- The gRPC address for FGA grpcAddr: "" + # -- The root namespace for FGA rootNamespace: openmfp-root + # -- The object type for FGA objectType: account + # -- The parent relation for FGA parentRelation: parent + # -- The creator relation for FGA creatorRelation: owner extension: + # -- Enable extension subroutines enabled: true extensionReady: + # -- Enable extension ready subroutines enabled: true +# -- The secret for kubeconfig kubeconfigSecret: "" +# -- The log level logLevel: warn + +security: + # -- Mount the service account token + mountServiceAccountToken: false + +deployment: + specTemplate: + # -- The annotations for the deployment + annotations: {} + # -- The labels for the deployment + labels: {} diff --git a/charts/common/.helmignore b/charts/common/.helmignore new file mode 100644 index 000000000..0d5e3a46b --- /dev/null +++ b/charts/common/.helmignore @@ -0,0 +1 @@ +test-chart \ No newline at end of file diff --git a/charts/common/Chart.yaml b/charts/common/Chart.yaml index 72d57d310..ac360c91d 100644 --- a/charts/common/Chart.yaml +++ b/charts/common/Chart.yaml @@ -4,4 +4,4 @@ description: A Helm chart for Kubernetes type: library -version: 0.1.4 +version: 0.1.5 diff --git a/charts/common/README.md b/charts/common/README.md new file mode 100644 index 000000000..1530d9276 --- /dev/null +++ b/charts/common/README.md @@ -0,0 +1,54 @@ +# common + +A Helm chart for Kubernetes + +![Version: 0.1.5](https://img.shields.io/badge/Version-0.1.5-informational?style=flat-square) ![Type: library](https://img.shields.io/badge/Type-library-informational?style=flat-square) + +## Additional Information + +The `common` chart is a library of common resources that are shared across all other charts in the repository. It has no templates, but provides helm template functions and default values that can be used by other charts. + +## Values + +The values in the `defaults:` section can be reused from other charts by using the lookup function "common.getKeyValue". It implements lookup on three levels: + +1. Looks for `keyOverride` in the chart's values.yaml +2. Looks for `global.key` in the chart's or parent chart's values.yaml +3. Uses the `key` in the chart's values.yaml +4. Uses the `common.defaults.key` value from the table below. + +1 has precendence over 2 over 3 over 4 respectively. This approach allows for individual charts to have minimal configuration, while still being able to override parameters locally. + +Example +``` +1) .Values.deployment.resources.limits.memoryOveride = 4096MB +2) .Values.global.deployment.resources.limits.memory = 2048MB +3) .Values.deployment.resources.limits.memory = 1024MB +4) .Values.common.defaults.deployment.resources.limits.memory = default 512MB +``` + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| defaults.certManager.enabled | bool | `false` | toggle to enable/disable cert-manager | +| defaults.deployment.maxSurge | int | `5` | maxSurge | +| defaults.deployment.maxUnavailable | int | `0` | maxUnavailable | +| defaults.deployment.resources.limits | object | `{"cpu":"100m","memory":"512Mi"}` | cpu and memory limits for the deployment | +| defaults.deployment.resources.requests | object | `{"cpu":"40m","memory":"50Mi"}` | cpu and memory requests for the deployment | +| defaults.deployment.revisionHistoryLimit | int | `3` | deployment revision history limit | +| defaults.deployment.strategy | string | `"RollingUpdate"` | deployment strategy | +| defaults.externalSecrets.enabled | bool | `true` | toggle to enable/disable external-secrets | +| defaults.health.liveness | object | `{"failureThreshold":1,"path":"/healthz"}` | liveness probe parameters | +| defaults.health.periodSeconds | int | `10` | health period | +| defaults.health.port | int | `8081` | health port | +| defaults.health.readiness | object | `{"initialDelaySeconds":5,"path":"/readyz","periodSeconds":10}` | readiness probe parameters | +| defaults.health.startup | object | `{"failureThreshold":30,"path":"/readyz"}` | startup probe parameters | +| defaults.imagePullPolicy | string | `"Always"` | imagePullPolicy is the policy to use when pulling images for all charts | +| defaults.imagePullSecret | string | `"github"` | imagePullSecret is the name of the secret that holds the docker registry credentials | +| defaults.istio.enabled | bool | `false` | toggle to enable/disable istio | +| defaults.istio.gateway.name | string | `"gateway"` | name of the gateway | +| defaults.metrics.port | int | `8080` | metrics port | +| defaults.port | int | `8080` | service port | +| defaults.securityContext.fsGroup | int | `2000` | fsGroup id to run the container | +| defaults.securityContext.runAsGroup | int | `3000` | group id to run the container | +| defaults.securityContext.runAsUser | int | `1000` | user id to run the container | + diff --git a/charts/common/README.md.gotmpl b/charts/common/README.md.gotmpl new file mode 100644 index 000000000..94146d84e --- /dev/null +++ b/charts/common/README.md.gotmpl @@ -0,0 +1,33 @@ +{{ template "chart.header" . }} +{{ template "chart.description" . }} + +{{ template "chart.versionBadge" . }}{{ template "chart.typeBadge" . }}{{ template "chart.appVersionBadge" . }} + +## Additional Information + +The `common` chart is a library of common resources that are shared across all other charts in the repository. It has no templates, but provides helm template functions and default values that can be used by other charts. + +{{ template "chart.requirementsSection" . }} + +{{ template "chart.valuesHeader" . }} + +The values in the `defaults:` section can be reused from other charts by using the lookup function "common.getKeyValue". It implements lookup on three levels: + +1. Looks for `keyOverride` in the chart's values.yaml +2. Looks for `global.key` in the chart's or parent chart's values.yaml +3. Uses the `key` in the chart's values.yaml +4. Uses the `common.defaults.key` value from the table below. + +1 has precendence over 2 over 3 over 4 respectively. This approach allows for individual charts to have minimal configuration, while still being able to override parameters locally. + +Example +``` +1) .Values.deployment.resources.limits.memoryOveride = 4096MB +2) .Values.global.deployment.resources.limits.memory = 2048MB +3) .Values.deployment.resources.limits.memory = 1024MB +4) .Values.common.defaults.deployment.resources.limits.memory = default 512MB +``` + +{{ template "chart.valuesTable" . }} + +{{ template "helm-docs.versionFooter" . }} diff --git a/charts/common/templates/_certManagerEnabled.tpl b/charts/common/templates/_certManagerEnabled.tpl deleted file mode 100644 index f46f4dee1..000000000 --- a/charts/common/templates/_certManagerEnabled.tpl +++ /dev/null @@ -1,3 +0,0 @@ -{{- define "common.certManagerEnabled" -}} -{{- default (.Values.certManager).enabled (((.Values.global).certManager).enabled) -}} -{{- end -}} \ No newline at end of file diff --git a/charts/common/templates/_deploymentHelpers.tpl b/charts/common/templates/_deploymentHelpers.tpl new file mode 100644 index 000000000..3c42259c7 --- /dev/null +++ b/charts/common/templates/_deploymentHelpers.tpl @@ -0,0 +1,140 @@ +{{- define "common.deploymentBasics" }} +strategy: + rollingUpdate: + maxSurge: {{ include "common.getKeyValue" (dict "Values" .Values "key" "deployment.maxSurge") }} + maxUnavailable: {{ include "common.getKeyValue" (dict "Values" .Values "key" "deployment.maxUnavailable") }} + type: {{ include "common.getKeyValue" (dict "Values" .Values "key" "deployment.strategy") }} +revisionHistoryLimit: {{ include "common.getKeyValue" (dict "Values" .Values "key" "deployment.revisionHistoryLimit") }} +selector: + matchLabels: + app: {{ .Release.Name }} +{{- end }} +{{- define "common.podBasics" }} +name: {{ .Release.Name }} +image: "{{ .Values.image.name }}:{{ .Values.image.tag }}" +{{ include "common.resources" . }} +{{ include "common.ports" . }} +{{- end }} +{{- define "common.resources" }} +resources: + limits: + cpu: {{ include "common.getKeyValue" (dict "Values" .Values "key" "deployment.resources.limits.cpu") }} + memory: {{ include "common.getKeyValue" (dict "Values" .Values "key" "deployment.resources.limits.memory") }} + requests: + cpu: {{ include "common.getKeyValue" (dict "Values" .Values "key" "deployment.resources.requests.cpu") }} + memory: {{ include "common.getKeyValue" (dict "Values" .Values "key" "deployment.resources.requests.memory") }} +{{- end }} +{{- define "common.ports" }} +ports: + - name: http + containerPort: {{ include "common.getKeyValue" (dict "Values" .Values "key" "port") }} + protocol: TCP + {{ include "common.PortsMetricsHealth" (dict "Values" .Values) | nindent 2 }} +{{- end}} + +{{- define "common.technicalIssuers" }} +{{- $technicalIssuers := list }} +{{- range $issuer, $config := .Values.trustedIssuers }} +{{- if $config.isTechnicalIssuer }} +{{- $technicalIssuers = append $technicalIssuers $config.url}} +{{- end}} +{{- end}} +{{- join "," $technicalIssuers }} +{{- end}} + +{{- define "common.basicEnvironment" }} +- name: LOG_LEVEL + value: {{ (.Values.log).level | default "info" }} +- name: REGION + value: {{ .Values.region }} +- name: ENVIRONMENT + value: {{ .Values.environment }} +- name: SENTRY_ENVIRONMENT + value: {{ .Values.sentry.environment | default .Values.environment }} +- name: IMAGE_TAG + value: "{{ .Values.image.tag }}" +- name: IMAGE_NAME + value: "{{ .Values.image.name }}" +{{- $technicalIssuers := include "common.technicalIssuers" . }} +{{- if $technicalIssuers }} +- name: TECHNICAL_ISSUERS + value: {{ $technicalIssuers }} +{{- end }} +{{- include "common.sentry-env" . }} +- name: DIRECTIVES_AUTHORIZATION_ENABLED + value: "{{ ((.Values.directives).authorization).enabled | default false }}" +{{- end }} +{{- define "common.basicService" }} +- name: PORT + value: "{{ .Values.port }}" +{{- end }} +{{- define "common.basicJob" }} +- name: ISTIO_QUIT_API + value: http://127.0.0.1:15020 +{{- end }} +{{- define "common.collectorEnvironment" }} +- name: COLLECTOR_SERVICE_NAME + value: {{ .Release.Name }}.{{ .Release.Namespace }} +- name: COLLECTOR_SERVICE_VERSION + value: {{ .Release.Revision | quote }} +- name: COLLECTOR_ENDPOINT + value: {{ (and .Values.otel .Values.otel.collectorEndpoint) | default "localhost:4317" }} +{{- end }} +{{- define "common.healthEnvironment" }} +- name: HEALTH_PORT + value: "{{ (.Values.health).port | default 3389 }}" +{{- end }} +{{- define "common.healthAndReadiness" }} +{{ include "common.operatorHealthAndReadyness" . }} +{{- end }} +{{- define "common.operatorHealthAndReadyness" }} +livenessProbe: + httpGet: + path: {{ include "common.getKeyValue" (dict "Values" .Values "key" "health.liveness.path") }} + port: {{ include "common.getKeyValue" (dict "Values" .Values "key" "health.port") }} + failureThreshold: {{ include "common.getKeyValue" (dict "Values" .Values "key" "health.liveness.failureThreshold") }} + periodSeconds: {{ include "common.getKeyValue" (dict "Values" .Values "key" "health.periodSeconds") }} +startupProbe: + httpGet: + path: {{ include "common.getKeyValue" (dict "Values" .Values "key" "health.startup.path") }} + port: {{ include "common.getKeyValue" (dict "Values" .Values "key" "health.port") }} + failureThreshold: {{ include "common.getKeyValue" (dict "Values" .Values "key" "health.startup.failureThreshold") }} + periodSeconds: {{ include "common.getKeyValue" (dict "Values" .Values "key" "health.periodSeconds") }} +readinessProbe: + httpGet: + path: {{ include "common.getKeyValue" (dict "Values" .Values "key" "health.readiness.path") }} + port: {{ include "common.getKeyValue" (dict "Values" .Values "key" "health.port") }} + initialDelaySeconds: {{ include "common.getKeyValue" (dict "Values" .Values "key" "health.readiness.initialDelaySeconds") }} + periodSeconds: {{ include "common.getKeyValue" (dict "Values" .Values "key" "health.periodSeconds") }} +{{- end }} +{{- define "common.terminationGracePeriodSeconds" -}} +{{ .Values.terminationGracePeriodSeconds | default 10 }} +{{- end }} +{{- define "common.imagePullPolicy" -}} +{{ include "common.getKeyValue" (dict "Values" .Values "key" "imagePullPolicy") }} +{{- end }} +{{- define "common.PortsMetricsHealth" -}} +- name: metrics + containerPort: {{ include "common.getKeyValue" (dict "Values" .Values "key" "metrics.port") }} + protocol: TCP +- name: health-port + containerPort: {{ include "common.getKeyValue" (dict "Values" .Values "key" "health.port") }} + protocol: TCP +{{- end -}} + +{{- define "common.container.securityContext" -}} +securityContext: + runAsNonRoot: true + readOnlyRootFilesystem: true + seccompProfile: + type: RuntimeDefault +serviceAccountName: {{ .Release.Name }} +automountServiceAccountToken: {{ not (eq (.Values.security).mountServiceAccountToken false) }} +{{- end }} + +{{- define "common.spec.securityContext" -}} +securityContext: + runAsUser: {{ include "common.getKeyValue" (dict "Values" .Values "key" "securityContext.runAsUser") }} + runAsGroup: {{ include "common.getKeyValue" (dict "Values" .Values "key" "securityContext.runAsGroup") }} + fsGroup: {{ include "common.getKeyValue" (dict "Values" .Values "key" "securityContext.fsGroup") }} +{{- end }} diff --git a/charts/common/templates/_getKeyLookup.tpl b/charts/common/templates/_getKeyLookup.tpl new file mode 100644 index 000000000..e73ec45ac --- /dev/null +++ b/charts/common/templates/_getKeyLookup.tpl @@ -0,0 +1,92 @@ +{{/* + Function: common.getKeyValue + Description: + Retrieves a value from values.yaml by checking keys in this order: + 1. Override key, 2. Global key, 3. Chart key ,4. Default key. Returns an empty string if none exist. + + Parameters: + - .key: Key path to lookup. + - .Values: Values object. +*/}} +{{- define "common.getKeyValue" -}} + {{- $keyPath := .key -}} + {{- $values := .Values -}} + + {{- $overrideKey := printf "%sOverride" $keyPath -}} + {{- $globalKey := printf "global.%s" $keyPath -}} + {{- $defaultKey := printf "common.defaults.%s" $keyPath -}} + + {{- $value := "" -}} + {{- if eq (include "common.hasNestedKey" (dict "Values" $values "key" $overrideKey)) "true" }} + {{- $value = include "common.getNestedValue" (dict "Values" $values "key" $overrideKey) }} + {{- else if eq (include "common.hasNestedKey" (dict "Values" $values "key" $globalKey)) "true" }} + {{- $value = include "common.getNestedValue" (dict "Values" $values "key" $globalKey) }} + {{- else if eq (include "common.hasNestedKey" (dict "Values" $values "key" $keyPath)) "true" }} + {{- $value = include "common.getNestedValue" (dict "Values" $values "key" $keyPath) }} + {{- else if eq (include "common.hasNestedKey" (dict "Values" $values "key" $defaultKey)) "true" }} + {{- $value = include "common.getNestedValue" (dict "Values" $values "key" $defaultKey) }} + {{- else -}} + {{- $value = "" -}} + {{- end -}} + {{- $value -}} +{{- end }} + + +{{- define "common.hasNestedKey" -}} +{{- /* +This function checks recursively if a nested key exists within a map. +Usage: {{ include "common.hasNestedKey" (dict "Values" .Values "key" "key1.key2.key3") }} +Returns: true or false (boolean). +*/ -}} + {{- $map := .Values -}} + {{- $keyPath := splitList "." .key -}} + {{- $output := false -}} + + {{- if not (kindIs "map" $map) }} + {{- $output = false -}} + {{- else if eq (len $keyPath) 1 }} + {{- $output = hasKey $map (first $keyPath) -}} + {{- else }} + {{- $currentKey := first $keyPath -}} + {{- $remainingKeys := rest $keyPath | join "." -}} + {{- $nextMap := get $map $currentKey -}} + {{- if kindIs "map" $nextMap }} + {{- $output = include "common.hasNestedKey" (dict "Values" $nextMap "key" $remainingKeys) -}} + {{- else }} + {{- $output = false -}} + {{- end }} + {{- end }} + {{- $output -}} +{{- end }} + + + +{{- define "common.getNestedValue" -}} +{{- /* +This function retrieves the value at a nested key within a map. +Usage: {{ include "common.getNestedValue" (dict "Values" .Values "key" "key1.key2.key3") }} +Returns: The value at the nested key path or "null" if the path does not exist. +*/ -}} + {{- $map := .Values -}} + {{- $keyPath := splitList "." .key -}} + + {{- if not (kindIs "map" $map) }} + {{- fail "common.getNestedValue: Values must be a map" -}} + {{- else if eq (len $keyPath) 1 }} + {{- if hasKey $map (first $keyPath) }} + {{- get $map (first $keyPath) -}} + {{- else }} + {{- "null" -}} + {{- end }} + {{- else }} + {{- $currentKey := first $keyPath -}} + {{- $remainingKeys := rest $keyPath | join "." -}} + {{- if hasKey $map $currentKey }} + {{- include "common.getNestedValue" (dict "Values" (get $map $currentKey) "key" $remainingKeys) -}} + {{- else }} + {{- "null" -}} + {{- end }} + {{- end }} +{{- end }} + + diff --git a/charts/common/templates/_imagePullSecret.tpl b/charts/common/templates/_imagePullSecret.tpl index 6accdd07c..75b879e7f 100644 --- a/charts/common/templates/_imagePullSecret.tpl +++ b/charts/common/templates/_imagePullSecret.tpl @@ -1,4 +1,4 @@ {{- define "common.imagePullSecret" }} imagePullSecrets: - - name: {{ default .Values.imagePullSecret (.Values.global).imagePullSecret }} + - name: {{ include "common.getKeyValue" (dict "Values" .Values "key" "imagePullSecret") }} {{- end -}} \ No newline at end of file diff --git a/charts/common/templates/_istioEnabled.tpl b/charts/common/templates/_istioEnabled.tpl index 778182c2f..218f1affc 100644 --- a/charts/common/templates/_istioEnabled.tpl +++ b/charts/common/templates/_istioEnabled.tpl @@ -1,3 +1,3 @@ {{- define "common.istioEnabled" -}} -{{- default (.Values.istio).enabled (((.Values.global).istio).enabled) -}} +{{ include "common.getKeyValue" (dict "Values" .Values "key" "istio.enabled") }} {{- end -}} \ No newline at end of file diff --git a/charts/common/templates/_tplvalues.tpl b/charts/common/templates/_tplvalues.tpl new file mode 100644 index 000000000..b7fb8bd5a --- /dev/null +++ b/charts/common/templates/_tplvalues.tpl @@ -0,0 +1,19 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Renders a value that contains template perhaps with scope if the scope is present. +Usage: +{{ include "common.tplvalues.render" ( dict "value" .Values.path.to.the.Value "context" $ ) }} +{{ include "common.tplvalues.render" ( dict "value" .Values.path.to.the.Value "context" $ "scope" $app ) }} +*/}} +{{- define "common.tplvalues.render" -}} +{{- $value := typeIs "string" .value | ternary .value (.value | toYaml) }} +{{- if contains "{{" (toJson .value) }} + {{- if .scope }} + {{- tpl (cat "{{- with $.RelativeScope -}}" $value "{{- end }}") (merge (dict "RelativeScope" .scope) .context) }} + {{- else }} + {{- tpl $value .context }} + {{- end }} +{{- else }} + {{- $value }} +{{- end }} +{{- end -}} \ No newline at end of file diff --git a/charts/common/test-chart/Chart.lock b/charts/common/test-chart/Chart.lock index 0e52e7a74..a6d4a2f8d 100644 --- a/charts/common/test-chart/Chart.lock +++ b/charts/common/test-chart/Chart.lock @@ -1,6 +1,6 @@ dependencies: - name: common repository: file://.. - version: 0.1.4 -digest: sha256:03b950f56aee5eb8a4a6fb02669d74e1f7858f0c69d3162ae63b2e633f7c2686 -generated: "2024-11-20T13:25:22.886154+01:00" + version: 0.1.5 +digest: sha256:4922b07dc901a2efda0b3d40954a68fa4dc360421bffdcaf96889b31a972f9b4 +generated: "2024-11-26T14:45:17.586883648+02:00" diff --git a/charts/common/test-chart/Chart.yaml b/charts/common/test-chart/Chart.yaml index 52f1bbebc..079b84532 100644 --- a/charts/common/test-chart/Chart.yaml +++ b/charts/common/test-chart/Chart.yaml @@ -25,5 +25,5 @@ appVersion: "1.16.0" dependencies: - name: common - version: 0.1.4 - repository: file://.. \ No newline at end of file + version: 0.1.5 + repository: file://.. diff --git a/charts/common/test-chart/charts/common-0.1.4.tgz b/charts/common/test-chart/charts/common-0.1.4.tgz deleted file mode 100644 index e0e259d2d69387277545ccd2e49b96146bbd671e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19341 zcmV(&K;ge1iwG0|00000|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc zVQyr3R8em|NM&qo0POj7R9suuE)L@m+=2%R2~Oee79c=K@Zbd$P&ieEyGxJ&!8Ldw zNN{(DK!UqF1b0ICMo#*4pFVx>+jorHx8Ls_zn*_oZJB%8n$KF#+S|;*&d$M}Q`QOu zg#+C|cD4xrdg0>Y;u7HF`|Y2Li|fz-T-3V^w{vNLBG}drVD_^& z02U5VfU>hG7-|oOgJGEVAUm)K;8*ux!rdLgA^=;6DHH^C$8`DK9v6@s$cOpgo#B7v zzmmV;-vwmr42JzbngIS8{(m0-3IBpTJpaM}zeD~q{&29Jqb&#yhH)B$?cor(`wNgA z7zlU#mvqBF8-G6jKhOXC{CxcX8UKHWczSXG%)u5AdoY0R*T@5ZPVIC64sUPFpEn^E z05b=BI0#}70|0-~grB_u0IGv+!5|p;*V$i`9ib3=xCMajDU9y#l)V6OsI$EpK!Epm zO|UKOfAJK@Zx8;R<$q$v-u$nT{(g-4$DE*lvGw;!{au`Y=k9;+;=g;O{@=(y;vZrM zvIM_$wzbs&n?b?wf59a1&+yN~!~ZAz3-ELQhyVRs<9&0K-|FQ09Ody3P8&O1gP2Dx&s{Se|z$0NB~DL6krRn2LmyIavH`Oa0e(DlO7=Z zTgw8pWi_V>VruS&;~&v4$d%ulAJsY6X*zaum+pK zF@X?sFo^S)I@G}$6X*gnb1(;U{!iF4{3HHd0dAa!hjDLP!!T;d@ z-y!B;N3gv)*xn2RhKXSQPU-*hUKap>f*l=T5V!->UF0`_h;VWOftUcmpWgABLoC5C zxCj7d1>)fs5aHrA73Sx%;1>Xa!TexTArK!(z`~S^M?gT>T#ygUZ6PScFJ!@GCLnCi z%PqhI0t@h(@_+?+c`XFZcm#w5FfGCMU?>O8|b?Ei1&e~15n<(uGtf`1-fE`fi*KmUK;|NUF!Pv3uj!T)dF z@PGb62$LQl{g*ptAbWr*7yyRAt-w$K$R5B1a&)wXnEkf!GXWf+01$xbFJFt8emw)k zr2lE)Z)(3T!vG*C7yts8IoR5Q&3?P?U;+5+W)%Rp0{zw9UucRs0Ade!_d)qNAPbv>Cf4iI{@q* z;J3{#|)~eb)O!u$aFyKnUy)>HnqFz+boiat5$> zwlf7o0Wd2EXIt~1b|Lm=P_P}?9u77KfI((f064@B3~+aF2H1gYezRq7`THpS&G^qK zAwTQ$d)(}QsqIf@`cn<$==j$NeloOQhrb#J?B)nI`{@tv0I+bdwRLa>Xn^fN_Hc;V z?}|UoFk8XljxZ5UP8itE1q=l`KrK00{{Ay2*Pm1WQ<^`!@>ei_9avNFPuqX3=6_us zO#1)B`utvAKw4*3kv*a z{r`6e%^M8j-wqyF5ZFM9>Re`ussbwR!u+PZ+Fa%u{1812VF5L5Z2?ssTWgTLxx3~o z2l1aQ0O8=?RhM|SRuUIEz+6ra1rZ_@fT0=>dq(g!(oc@kD*Msmm&J{uI9|HAT)BZb z7}@~&J1P{0ZR}HtB3{d0;j7^*iK_+SBX6IoA4O$zo|BlK<)dXN0s5~yKnLm; zCMcLY7`2shcUMFhC`czznC~5`zm()dfKa{gSE2eFq3e1#X@EU7A3i#hASWIL!g-s? z5KTWxI1>FAsRuJdNzp6cp!TVkI2cHeg1b-aCH)l9+J8P0O)Tik0igXE}xh0 zp#S*Ro>+^&@i2yTYUY<}4;a_qBe&D}06~M3j(#9ID41+W3IM z+hsx=Ux9}OG0E}=F);%#-_ZwS>5&mz1hcS5#At|LytCX_HpgC|o4}lVnht_e5h7Q( zh{-Tzk^Gj&gN9}h5VU9$@wo_3?|0Cv_>nMWQxJB@-oo3=ToAMIYq{tVIHx(&@s&3u zh2MOe4{wYA&SYxR+opFrB(db+E%W{Dg=e9U<@V9U{WR;3ao&qIS>JBS2~1neSG6_O znt^1rfFj>6x?{`h?Tw9_M-R5IR;e6wsU^ML)(_Q=oIfXCPWy8PvjUKc!!n-L5Xiy!p;zI{$d+gKOA za~Ey9b=L|xGp&m|Rmh(KiP|qU$fyu+1b44_zn?kYd);qut*_owKKP=3MSj=8OpJmk zi}cd5{R)CUlO}C~Agf=L&rNKBS%F6R+E0~M5kM_2wTK;o0vy_{}7ln_3(JjT<#L+mXy~mI9I6UqmVr@$%(6 za=%Mz{A`peI7&Ncd8C=|kqM480{eR|417H1Qj6@60D6GiIl>1ATC6W`)se|$2^7V$ zS%`an*xfC9iDkbh3b>!YOhV(;xE%V-8LB8sb|;BK9uUQDTZ+i|QW=9V1~sg@uGb8a zB7oyq*N?em$Xf`>I-+kaL;>#$0)4ilK7*9@Eg~VFRg_le6PAzeqRK$Oa)d;SPKwpzI3_PST`D zSp-a+lAM_=C}`4tukg*J5uPxG#ivCD21XI(jdVQiAE56ac(k#-y}7d5inoT3;=l8Q zv;E+~VYjXGq3ulRIBO*<9;^Ef{X6X8{`(Q<`>dr0uh0j{oYjZ>V0>zEsWpWd0x~qN zAOyh6cjPFD2wey&CN?(8MPKW%B#98B5&RHUB$r6Iy(Q7Z6nt4$Xl$3$ViCBIkPwg~ zR}vHPa~-}p61A5LmLR+%zt(Y<93wVEAPxz5sFae9L^KJCC7-|z=+12$cEqMdFbk`B zxC<)+)S952Z2XP^evRbav5ycDr9jUTYkQOCI4=Sa+kjQkNw|IwJKNw>)TUuZ1ZG|#!c)o~ zljIWzK3~|OI{%tFH4-LoPcFKyY$@&XXOmn@RGzL+_#b;U}+j(Kl%j{6V%#kMl6flA@+OO>->Z-Lnk*q_ER)wo+&9tmHwrrzBMa6 zvUja_;*J2^Dg0bzZ)Tx(6nn^{I`ksxkL_H<6Fa26%G|>i%EK9`sgC^K}Nqusga{W(B9g1199{a`*HN=tnP6a;y1wLLrA z)uN$0w2GRG@;BH|(BB4JekQ^1;z8NgYHsSf?Ve)w7wcpLW z^6Pu6jBNg~7kN^fXhm!6%Zk>QYCiO?$S0FpD|AV(5$5#xYegWIA9MjDSoC}fM zqP&%j>4Vl#4_k%sx-4G5JbIyNn}<7RWV%c8T@Ds=+!3(hbO}B(O5Vptfo_UE z9DVZ=_*)p0RhFgMRTiYFx5Op;yVTvJml4C7P16EfFVeRXj0_ct_{tJmoQS$41e=@) z)8fhCagR9@og2GPo!|Pjy%=nH{c*pR_SVr~M?(qPNPgDAhjA6TwtqrU;3;d!ykd1` z6)&Dr@CDzH@tK!JPBcyFuE?kP7RKdmE9&d-a%3kbw5~lImNjB86l{xXPlEUGthcK5 z=(?pW{hyK+Me=g*VpU^7wFB7kVv26fgD9p?Hg+F^1#%`%xTN~Edd3^SR;*Ch| zb%gUlnXCV1xU<(+4-kN0$LTR|JKLs+upWX%1)j5X3e%H0oF}J`kdBb}z@{~Kt-5)t zK_SV^+FZh^ulyM7+DQBr-dnEQ-d{X|W2MK^5*`JR4@-c3RKDjVkqryci%MXmKMSy+ zk|HGMX7i_+Qvg?~_ygf*B{XT6OW7IALE##?^JXEpTl34S9gmZC6mm~5rJC7|nIEwN zy}DKBBF{P|FL#I2gqAFI@*}&M`lUX$2gTHz_N++(}La} zLb!L*$&G*e1FE48VKjv>%l%}$DDvUR&9#-qu$#|l2grga_{M5_+tQM>JZHMfK?E*I zufg~QP&6GU)_HDSCTXVPeuB*+{YG{$pbK^{99?gjB-8RH&pbkjKBQ8D(93X5q!Pf! z7caw}m5dgjPrel94YLnFB01{BiQ6Yr>nUf0nXR2I)XVs29tFJDH!R&hjnrF?lGO~5 z)g*Sg7b$H;5g}mCN^iCqda}5Y1N^*r*XhmT^6aB@AQR`O+-Gz`yUqYZL7cU{a<9Wu29M;Qql(mcG2Y+LyIpkePKn5$@AJHx3Be<8!!p^c5%7Q+RJA9?_76}!d71UNo_`1P+8>SoA@s4XO7Y^@8d?y zl&wvYRx3@Qe2Nu1Qq5LkXzHPe7u6Km?(+K(_Fh32oNuI}vc^UTsw<0u_+lI(TA~HIKRpV#o^H#gRI< zUO-JnH0`M)8g;oayGW{Suy!}g#wBrRdU8@~=CFHhoM4wo%3+GRri_$sP6?~%m##Xq z7kt9^8eG^x_pv{zDa*Wu4?ZM^8muLj%WZJ7jDJ{892J5jiPo6o$R|W)3vxRkfJ@ob z7T*rc#>Zj1Zq&MepV66QmTz8)S|(glZ>CjPQ4%ovfM=6N`iR>D6;Iu)z_YcBjiEvn z38Bq8snMRKQNeSX(<@r+r1u+-7vgez{Y;ECL?*)?9yM~{5%ziZ_0If7Vve`oi%bm6 zg34T*_dOEFO1oj>*~mGGiefocC`=>nKiI~Yj*MM#F1(p5z>B3vACig1N-T?= zzJHmr$chxIILxv=BhNl8eTV5(v0*x@5QSO(6AnOGINl*f|!oTMexkChq_bDF>#(?K3f0t%;W!t(^7r=EJnVpS;yDQ-_d za_U>{YSb)J=5>#Vb?4$=CJwV#>W;Ye5x$ZQ@H$_86BU|zfpxHEO6i>2S5QgxTDYY0 z!*&GIUb^a8>vT}n5xYaH#(DwCWC5i{j}Q1mO^KNKo=38*MC@f;*zR0Y_&Zi~x||60 zF?mC6AQyt9E=m0009{^cWH zuTm`dT5zg^s3J(D!#n5C88!PdqIFyaReDwhj9w*2^mPR}3E@2fhp(v`KdqaMcwbWc zg`%WbCrfGlHVDmo;X>1>%+0mSO9A3#9NpP#tG9mrLEvP5PeJTz(^H}0c554MI0f#r zqP*AMfjCI6VFxcPc{9Gj_qxMB2F%|}#vf&+3L`t;HVw`U6XMUnevw>SGJ zjh)(YA;hBPrE1$1H*`$(*Wpt~x3Gd!LVo*1EMKvvQ{mOyX0YpWqCKM7&9F5Fp=_kQ z8>cuSZ2`S={9t-g5g>DrUBiFw{t<7%vr@KvvcOh!keRGPd^y*>mG~=GOFo6LuFnG(BSpR=6HqXn^Q8jnZTD&;)I1;$i;H=Co?mmQZgoWb`GiYy`n(W z7l>SEl}e?@d}~uRY}1V6+j<)Fhb7*AuL;W~bw>+9`9su+Dc!tJ=O$_~i<=Ks#02wF zqU|@%8O(;r&c2ew=ae5VBCqKieCe{UvmDbCvyV&G69KzvkH44IZ-6#!l!?&fecyeG zeBEqZR$S`P9l=F=z%jJ6BmS{;BS^jy|8$&?QzvRXD`K4oVket%q~DgkNad(Vyw{;e z$(a{rpF|}gAtAo-+0oD&9~k_?>Eb0%OIW;A?JbV~?K($38|YRQQ>A(l9Yu*>jp$gi zSZn-7P?;v>l%d*)CY|kdhBKV;c>)niGCnTx$D&nc`HA|7g+7E&p zqqbOhwGdq1!o@dDvAY)#-6d5d(sSg@yG8`m8dW(w!PyNND=yilmsdTYc9Ag#vn|Qb z1?APmoK(8>Gc1p>*BQN?9ID?UHu4rnzm9+iVls`7jwUHkkZltKox~q^GjnF1ttGZ; zZV`OIb3=ng%t+dx@&>~s9cQ|M{PTy>CJMtR9XF<~S!J_OiiSc_y!V|l+K<2AWI9G|K`2oYpvkE=Cx{#bSWj5Kz=?cl}N{>|1XkH9k4gYm=-Z|l_Au=rzv zPsN_sq}p@qp*q^ZVixr=j0l>y{1Vxf)n5b<?N@PDjGPZED6%{dU$B99?YE2<3R2y|0*E!9k}Kp5NweKh-Z)u(|+zj_fR- zUCx1V#62z2801uWh;apls0NaYW5e6U@@i&^JNamF`DZQScKfN%IGb)!DpUJlivvHT zJ#FgvU6Xt^@!Q0zWgT?1F4uARhvvzBnkdCc8s1crWez)cTpiWWPBT#VFN$1}XQ<~C z{oKSn%rCNfozW1C#32;P#%U>{8nNq#0;xRY6#105&c*+ zbQw;D9ZoT;t_=Mk5&f?za zUCno~9k^x^`po#UGKURs%w;<3cv(^F*o`aT&_0Xfvwf;yb=WM@9rwXh&1>eeOzjgR zxyFV;J!=hn?^B)Vv3zc(Nm^bTL?!$d;p0d1pIWSYImdlELE!#Ty@e)?q#UslBb41y z(TZ2MR_*k?1FTmc=RiAJSB4Zj@dTMn_3N^9R{@2U)mF_m5gvk5)QlubuANQxQF~M5 zHrfgAN((KdkLEUn54OfcuF7iXOWVR}Z6dunXMIvXfi?@Q2I$o3%d)7Glu@5^({B!R z9)-6h@lqu=aVxCd7G>&^+ zQ)X42AWL!ao&&?k*X;30|kSv9O0$ zw%s>N|9JyF5B=$)nS6&mnTc>qz=ITZgX`i9t?k#e+*Dl&&uJj(Co0eE*tQ~r2 z&c;e!ssGq}n`E6-8qA?^D)Mr}UetABTafV1D2L?>U|i+ z)&yL*rKu(o8Lb&)Hx*m&s5@Vl zM==^&1+v?k&_Fl1R=+M(seIKZXXl_GUXSYuUPscI-XhbLE3@BX%a3uRq6B6W6OG&-;?v4pUPLK2RM#p2vVeN88XFN4>QbqYyAChM1J z3%z8FvsXc*wPMmy&uFwm1bN!MAFs{I8X&SBVe*@y)Gp~lBGGjJR2`b*PB+SiK50W4vxk<(d3X>n`&EO~r8Npo@&&clz?8R9>h4vE z)1~x9F3Fl{>$7aJ(tWq;H1K17@w(?p90gjPjA^%gc!XL+@1^!2;!dGnLq&&^(wPo( z==mo3uMz6Xdlvhi4(r}%PkjZKcC5b8xBUdCFLeJrL?nhD{msJ;5wRgtJD)7%P}>u;MkLWSW_ts&)j-II)5jfcDp9@;NsCIAub%q?{AEhD z=C!^vX=GI6hW2qTmM$T<4~)urY;^C%81JxN1%0;$BSxi7ZET67*FbC`4X9IkuQ-K< zm~KQ#?=4+A)~WmbaV>SRPgz^c%65>a`dGx5uwI-nSUx8%mhBVslIzLhXDKNUk9188 zF}q4gm@l8REhHI&QxBiYTe{j$uC~+Z@rft(+Di` zM{&^zRi;5TU%n%b!`zU5GF#C-xz>1#=I}NylTOa#Kq}OqeTAc#n#jX*?*7>{N!@V? z>c}NA8h6zsPVcC4VciSU_C^jXJSxgQ=ZQwY+9v`Nf)-sl#zGmI-6aez#F9NeE`y>Y zW#nuEj>cLkJG3A2Lp}kN(BLw_AZ-oeCi4iEMC<(E3{ZdKo+09)9p&0~}SBx@?&)2`s?5*M)N`<(ifXf!EFol?K_b z-Xx6q8KH{5DZ!k7GsZukoBBwQsmb<|2{pYhUUZANlUjU0+^CwP)9w(xcMmB(-jch0K__keNR5v~dtA<}34#uz#Jyqkc70K6 ze#Hr zchf*N+f(H8s|Bip$c^Y~)dsh&OS1QDv57{b4wg0=V+l+x=O5!+5_71YQ*INGR-D}? zkdk~02KgV5-6zA_Kk6g&nRbw};5uUHR73SE8NG&|-(p&fMw7j;U|92u^m`S{|7^;q zYz~-;9~`8ZZ&};=WnFiyzhKCX=6u1ZQhRoD^YZ4cE6>r6wRgoc71-wn8X~-*{tR_# z-dp5ik|VrOD3bTri=`HIfp9#E{~JxZB2cTZPlxJjQgx&qzdP zLuOcw`1(=;fqv8vJf0SOu6D>;$V~4~d8Q}%l~TW+$@*_1km~C&n}BR78B#RpE>@5S z$On&1Y^Gd>ifR+})QcDC56)=gUa;Kfb3DaKp##yJ5asyv1n&9GQmBqwijujP1Z?Bv zu6+Qe>~zr-5=K-Om5hBAtqaJUHoqDbyjVDjEPB%ra+RkSe&lE$U~IZ|`RwZMj#D+@ zs2_~S|X1F3PAFld?pCZ;`JLnVxDtf zaTo#QhBo~<%8ualpca4qRPdIhMD@qbrG%brfv(}!@XQ)BCf;{kddIbj z<**_3tw51mRr2CjGG|~PBVbG4$ei4a$Ne@Q?+yZ3L5zl!K7{8Hx=L}7_+^2gmLF>m zmD&Ex{u?!mC+iMu0Q0Q=bOq}9S%U5oYLOJ(^2Bf+^@E-IQ7@+L;exSxd_ zSQ1{YCD1`TQMKM}5t_4IRhNi-av5wV->P{(^#e%;dxN=vUyY^AQ}~f*A!AII#E3Pg z`auy!kLt&LpS=+75U|xIMWJOsXr7jWG^R*u{l4;W_!!F6*BL--XV}(pW83nXEWH4y zoh$dXg>F@v{_+*GzU4GwQYJos?1*C1gYE{R@qMwy=A9rWx6Xk)cO&eG!^}9%6&oO^ zWgRs#GWxbEQlE7Wv%N)IzK=0YfD3hBBm0@<+OuB0k7NZZLTr{yOfL^@6`IMjDD5R9 zk<*g!5HD>Rg0$)U%e$FgUBKz>{ZK@!oJ#m&e~kJ>7^BAiZ?@4G5$t>C=0*!xHW z|5!xPfju$U@m+U5gOIxvO2GqrosY_6vaMMw{wfN^S9PxPex?X7gmkmqJBUVh{4wo| zM(Lh6hXfR4`B_F!WLORr-n`n7Y@u+DQ%fn&DTeH=x$H5sKyk^~uki=kG~v9;Fu}rCrkF5#}Z0 zV8x(L8W?M}Cs*75GBNsi*i=m0Tv(I?IqHej$yO)M9weO7Rlf2Dk-CI`2&PSLj(b|@ z+2?KaGXFeu!Orq1a%p?wod)TVLy77pN`a4dGKWZS#C=4*i}z#2QdfM{X({^+^f;jh zF?rkxpIpKUkNFp@&qf&=kJ;I1*|`_?I+Dzq)C7fzc(3Ig&L?cmJ)#!{s?Z8;ycZgt zwSB7jkr+9a9>4JABWuDpfe+0L4*q`UDdjmlxANTD&uTkFq^w-~zg`vTBbRX9BHIb} z#ILko3&>(qPHNn+!N^%|rw54@hfQ~{nBPcEC(W}NUYmw6U+QTT_0HIA#f`RAOeb2~ zkyiS$LZ>)6l?jCvkHUApuT0LNS>iZ)#9?P{w0GKH zgS4{Gncp=-`Q5)Ffp-7eR9MFQ(^vmca!xDk?BVppnM&d2pj!~R_ncXA^x)gYvW7w= z6$i8ETe{mDqsfss3~@E&HUwO?metLsix_?TBNwjsktRyIIFEM7DT2sL=G(?y_@DPW zK2NA4@5eip+#jB_+jY}?cg5fV=hMmhK(f1MB$D$%tqyFCds z?p0b$h2MjfRC#jvKp)@sJyqhiNW72mzrD6?TTfuZMif!6+A|_clyz~t`)VA;R&F7Z z1HUYqH5V6`$hU~hG|h5mA37m(G4AVW8L~wG_QlQm)h^jxe|CDiIC%0!ZUO%_yE8?c zcw-0@Z)%r7Uqu^JDbmlU+eu6&{)u8t+4^gT&(*2~f#W(S6bB816Pn zbrH=7D=Mmuuk1^_4)u5sosypuGL^*5m4z6yjI77`4UA2t8HVvJv5JsN-sQGJnO{jtj4qZM3ds)$Gg zX3MXHFMO7ERa5in=Af*|B|#_&rv-w75(7)13e}kWo;eGtx(8~fdrZ0UV;s!bsj8Xd zdn~M};YR~i#6Fr0&hy(UMK6m$l`MA@QEII*NaO0x<$O1SD@2AgJsSmoHhud+j;0`^;e26p9 zFwUsNm@`cnMBMI!ueJm=%Gn`P5osI;ef)ZL*o?ILG(DbCYhw|;vmqAIlW3DokLrV& z-^^mi-E~=7N*SYT)zrDC2B|u>b97$0ig;^#*`vI$mDVPFvqf)Tp|as0B+laZe)fBX zcy&TdUgEh|h1S^apUSMTtuRdtzV&4u=`Ru+0d_OIGLW2jgB1hqkurYk24RPUE~z6Mt4XoThos!Xr#re)PgQRtB#TPXT#``JIE6 zPLFyzX>Y1(TAo=#+8EUdT;p)?N$#Xwt9DJ!OVmI0T{{BC$VZo|?k~W5T$8`^3LC@X2u)wj6PPRHhqkweMwap7} z+kjDUp)#^<0Q<@Ipxy)g$U0D|?0;`~=2F{agz4q``R=byL6Rk?vxbROK+8(gRck`EwOQ2#=8yj z>A_wsFTJi@I^sE0FC(6U$rS?IMP6-t+31`ftC+TKI{_5}28oQ_dP!Y$jloJ~?@N1$ zzU(A`!>J~lS#p$4>B15dIicU*t%09cHFGuOwXw8%UcA$nqMeX2$tca-2@WdNu`e$N z`hVf6n2EFW5TZA<8W@xcz~5qpA5Um;(y-aHII9$|0B>sZI(l^vu$P7=8zK+ol9-(IUeWQW>6n(F8|kGf5Oeh{IoAr@BT?C`R_=W_$fW==w=IU+(jrY+qb%d^ zeNv-W9w!rylPv?6hBmFl#wHnbg>9;%vT|{UKV5{RS#k@)S$&fuF2<(NE(Frc8TNU} zQ9qgtbKP9WelJXpeO~_fm};!v7Ki!VUDZ7K1L>cuKXz&rndqq@AF(mY3UP&GNxX znyX^CY6{({S5KX*cRI2Wqb)^V6xCi`15GK}nAnrNBZtgzFJm&V)7Up4*LXF)NaZAS zYD(0}*wID4H?1EKnVF&$p5vTXWq7vn*DOdj=1OHwe|)dIjxmeVFZQ&4ER(jzD^S`C zF3TaKy{sF9TE{j_*V$k(;bj*Oy_YDo3a~4adA$e6Vi=~k&McijTJl$PhFQI+`oeyD z`JROLR9OLgTW&cpQ|Y|?x@7{531u3i{$(*5W@!t|DdGs%n~a5;dZ(1ReN$@*Ph7+C zKqML>nxE@+sSQ?Yz3DydeJeHWa$IEn%-+ZJa^j2n;js6vCx@rEiWkWZvhzOFN!|B}I z6tfI^Tz7r~gacHtry6BUgW6*3V2GIL7%S>*CBKbGqbQK{xef)!^3i9)9U+bSl=1@O zT^xf3L#n0OS3;pN;{2Dr3Mr)p)9xzo?q4kDv`BA!mckHDdi|i7lorr=J)fM!yQ}4D zot8=E)3Tbaf5!K&Y?P0lCsnv7SJ6sr!uSpKkH*q*s?as}sQBIxKbKXa$%%QA1r#(^ zy;m%Wo|OYm*o|}40nzLu_0tC|jk@al60O`DEcR~d1l5~a!A#6CE0UL1oO}ic=Y0A) zG~KPvxH&C?TyFg+@TPCI6$dr|yVW8BYA9>I{-HUjStQ5-;^ti!0fmi!qaP5z^H-f{ zYEHjuoQ5$*!6k2_Nmvpl32djT(hGzOjMw?zY#uugfGDR+80wBAH(wMeI{;nz_&eHg zJw67WOijtx#8f%`xafGTqes)tT&C?dC-GAI(+9!yHuP+pyCT%P`fD!!FBS!6NOho9 zik7cSVdq$fCH;jqXh;2;lmWvA8R?I<#MUleyTOJrcMz^NGe;yXM~gDEqc2epT>M(jCP@G`N! zFrTxRq0rsVIX5wPEAwod+Z=6K;1hQt9XgggC9_6|%#bIkBEB^>)jCX@Mo6*xv=}yOVomK{YOUrYpl%Tn49Uywdb2fA|tA5zZ z#1N}(P;;fEY8kBOo#XmJlte6wrXLe0^&l}q^w^tj&O(y7fufB|jnHE3u2Mi#?XboN z=?U#p(i#D)R*;SQMEcR3#Qh@Ko;A!Y;&fUeaYjJoliI74eVyIr$0fGQM{ob{Y``=ABa+ywI}=+=7k z#oCjrwF@-}beR$=&7?TCSs+8eF~whg5SK`6Q`DDNSU*hO&2V;(zZdP%tb_BN@;6Oi zdc%kV+H)Eke&9|^C}p|lJ>>||`C_Dn%V0{SLk(v?^U`=ik~Q6bN~_9CAG6{_?$Gx9 zV+(6i<|Q$O$r(WWS}JQAQs=#PFLQpHL5ZWYlyxed`QA%XZ4+ozJ0Eqw`w?K7shBCY{rl=&OOlYD1DA0(c7g&t%o35-ARlHJ0gw zk)24%&Wtpvn5@nkotvA7+iN@j&dGS9i6oAWwFJCpN74yp1UFN4=8VvxbEfRfR z7m;uY1}tbS@HO<>g3|?LS($T5frEQ*eL$aEZ*0Zb#LIOH6`dV*ci0z(oQk59PRv9K z5$z_u{cCvPYI|vFP~y|n$BkHlLZ&M--mP}~^G$CS?$u_$>O6a7EPS#VLphOggVs#$ zlK5OhlnwYr$suQ6LmP`UxSU2Tg0Fv?$aEHVvvz>d8k5f-cTUVMHafm)?DCW$LlVnc z*>H$;kRWB$fSlJFy}==BdripS=7uEJ!N-^s&ewmR!hCkQ%yOU~zvGV~#v2(GAP%#mcEZ_qf73$t4!x z5Pnpxi^&mea-jNxL;Y3=Momr4FJVow+^A`IrtRIo#@u6XFF~H)wtj!U10SX9y3rxlv=-0agal5#Kk?+5fpC{_yNIK4wE;7nE=gwiNZ4mXA9l%&}F=J zIKiLUi8=Rq*6JwV;e?B752g>7+@#N*swcG>(~xWKa*{?#MKH{2ODbgLFexTa>it^{}_Sjr* zWc7z+@EYPR5oQsqzj~&+5UcJ7hV3z-q!HW|X0V;c`VXg$pN270;jk64XODj@6wldf znHTzeFg6?&;c43tH>VB3Yty@>(q&TC$`6t;>NGP@fxI8<2^=pN8qlP@JU+{;x-1?Q z!(_P%A@oOfDWdjIdGUCTtsrOiTYjE_#=&Xl*{OGl_fw!?x8~cESF3dz#tDn`(7cur zG$p-kJ~5HiN)3dHM3*y!#s2 znasLsy~FR^g7j(q;+kxc#P!niK{*D({KR>A zB-kveio#|(e3z3&lq_1q{voB#cPz2#eoO34d`0yQ&r2x>%c80i7T$)HHM(Yt?ieQ9 zIM8xvynAW3smN)(U*EY!(P_p84f6l++%=RD9hmy=<^uJS{jfdE#nQN~a@-sWys%ic zx&2`q7n)fd`IGzenN<;|1$6 zJaQ71h&^#$Lq(NXzd5Wtn)JKOs>$uDlgTFY{lE*UX%Y?ot4KGma{+G)ko3BX)UZLW z0xB2ND~#yfCp1~@2sdoK!P@s|bLD8G&6kDWPCePU?n@exi`+Ne zyjIbIB9BrQ;3smY+h^apQyt@KRYq4~qCjrP#0J_Y+>mb#;pSyn7VyuyQ%?|JEtVz+ z=oY8SD(_rlu)#wSd>6!@8jNackb6+hs3$`!;jx3op_jr-AIgvpE~mC;{$f}nN`kA~=9xn5;q(ffQ4wq9#y4TNwis2!#7q24%AK z`RcN3y~Y0ni=4A_&b@1&-_H5;-1)4PsG)RpI?F?X~lR++8*G`LN#vi01N=Fg}}J1-RXK3#Li3+a*w_%@ilb5&0b)VRPXxSf7FcW=`V(3PH)|e-m0J6suOJF@Qd#SNYJ*~ zNBPtf-JUxtA|nRZ-WYb*?&$lzcRW&S_3eKnp{NWUt#|(AR8DLPq+t+d2(?cbtE^XZ z!ZD}poD2(yf*eXMX?vPWx7^!M#3VUedwyMe9-*YuBu16*u+>`PRvNJxe;^vv_Ogh1ex3x6)UM0q| zn>=V~V4fcw-7(#fc`-%QOB?P)4s_LPl}~(wY#GW#Wv^KtjDiHnYx{~ruC&YN=YP?0 zFtv>-s4iJ+v})q}BEGu|D?e}LW)7{`Y){S7xb3CCJ15u2XZC-+TCK=2LhgF>-F->+ zr9wWre@${;e0Mi?IMFF~q(}>2^UIMU=WE}_$J^HUgbpFWK;DFVkz&y3H# zeAGuJwVNLzk4QynIO-oe85vp_7x&3t^?iB)8K0`&KlR;dpO1aV<1zIi86|ABooZLT z)y(R=zZz-Otb15`wIl3g_^tcuoirPZk6Vfpd}7`{R@LKhWGrTxYs-|#!qNxtJe@z} zd}5<+SCwV8a#rE$%SJ!8a8P5%mNx9>v!*J&I;4+>PLAS;fY+)jkFOY4%*PuK`zvK3`Pa%oyFGg8nbs=_f}I_ zMDSLVo*k#FirJ#JLj#A{7WYFwse&|xSZf^O}fBym9y>WjnF!*x*`?DL83Rl zD<5S2HfDE0_G)>OqH!Gm6B{=_vLRYOL2;a*beC8NUq&0K@_!e8u1rxe5jF_fNAq~; zxRS4$RnI#gx!||rj&|>OUkV)&+gD-vnMiT1Ho|WSAv30%@IxM8O)geng=Y8Kp1V{r zhA3~jD(vPbH@zz-`mtlZjaKD0%&jx_pWcr&W&QlqWaHu3_DrBcJ#d*#=Gg)&uMPI? z&1PC<`Swp==B!S#7G-D-p1&Cj#OmBxE=)NZ1uuggS0q2IL@1$ludU}}P^dqs+`Y86 zp->xyZ-mIyzt?q$Q#BSf#h}w+A9y1F+&w3SXhlo@?zhM9d3UPH7e^~!guPOUf@zOj z*5~z9{`7MF+^zektZn<`PG-jcfGXmxI5nZjSzbvr%H81XxMjR~RJj)S+n6JqbdFfU zLJbgs5sPXo|B)MRFsc>a@Bmie!<)Ncgpj2)$x@kOy(KzR3Fi#M#18oV8u+;QiIxjX zra#n4csd~Du#|K|&tVb(emnH5C|$_J{U}%q-=3U)tjcSTt>jI6$v?W`H}MGNz{F{d zvYWalKZvupRfVl}+9N|Qii*pZB2W2L*l7xaH^C;TiR_q50N+S7UiN`=aU<-;Wf2rA zR~?r&yk;%*|Cq4?j(ANCAztSHXKK8_{~K>?xaj}! zCM2`?2loLOnP=6X_yA)!0PjKcaG8nzY}>Ff5Q?PIgDGKw(yw4CR9pn!AB0GFbTB0> zz#P~`p+n)M5D$UbdF=cWLO-< zpn+uZih(2uj3gb9SPB7v!JmEsCksRaKoFGyJ&$KlLqTi+HIzgN6Hh@9O*#Wey-c5d z5Qm1-DKj6%0{4^1komkN#FDjvQ@?Z&Y7c8 z>CoJ0K;|xG4wxC58NS4E`9=IQAO?;|WQ37uj36pRB;q7#C5k5`1pzCbdWAFg68`Zf zrt|nWGTO9h(f{*}NSstaYS;}(ngEH<65bq$mK>@77ISgz3sIL~GYj__7Ir$gIM{eN z80@h5$iZNi;owY+40v&XhntO^gJkL%a{Qv*} diff --git a/charts/common/test-chart/charts/common-0.1.5.tgz b/charts/common/test-chart/charts/common-0.1.5.tgz new file mode 100644 index 0000000000000000000000000000000000000000..689530f883f13d1794e6623fd143b09f1293a901 GIT binary patch literal 4514 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 AN&o-= literal 0 HcmV?d00001 diff --git a/charts/common/test-chart/templates/testHasNestedKey.yaml b/charts/common/test-chart/templates/testHasNestedKey.yaml new file mode 100644 index 000000000..ab31071ff --- /dev/null +++ b/charts/common/test-chart/templates/testHasNestedKey.yaml @@ -0,0 +1,6 @@ +kind: Test +apiVersion: v1 +metadata: + name: testKeyFunctions +spec: + check: {{ include "common.hasNestedKey" (dict "Values" .Values "key" "testkey.enabled") }} diff --git a/charts/common/test-chart/templates/valueLookup.yaml b/charts/common/test-chart/templates/valueLookup.yaml new file mode 100644 index 000000000..2bcab1d40 --- /dev/null +++ b/charts/common/test-chart/templates/valueLookup.yaml @@ -0,0 +1,7 @@ +kind: Test +apiVersion: v1 +metadata: + name: test +spec: + certManager: + enabled: {{ include "common.getKeyValue" (dict "Values" .Values "key" "testkey.enabled") }} diff --git a/charts/common/test-chart/templates/vs.yaml b/charts/common/test-chart/templates/vs.yaml index 0f38c84b5..8dc8380f6 100644 --- a/charts/common/test-chart/templates/vs.yaml +++ b/charts/common/test-chart/templates/vs.yaml @@ -3,7 +3,6 @@ apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: {{ include "common.entity.name" . }} - namespace: {{ .Release.Namespace }} spec: gateways: - {{ .Release.Namespace }}/gateway diff --git a/charts/common/test-chart/tests/__snapshot__/istio_test.yaml.snap b/charts/common/test-chart/tests/__snapshot__/istio_test.yaml.snap index 5fdbf1740..ebb28bc07 100644 --- a/charts/common/test-chart/tests/__snapshot__/istio_test.yaml.snap +++ b/charts/common/test-chart/tests/__snapshot__/istio_test.yaml.snap @@ -4,7 +4,6 @@ test global value: kind: VirtualService metadata: name: RELEASE-NAME-test-chart - namespace: NAMESPACE spec: gateways: - NAMESPACE/gateway @@ -26,7 +25,6 @@ test local value: kind: VirtualService metadata: name: RELEASE-NAME-test-chart - namespace: NAMESPACE spec: gateways: - NAMESPACE/gateway diff --git a/charts/common/test-chart/tests/hasNestedKey_test.yaml b/charts/common/test-chart/tests/hasNestedKey_test.yaml new file mode 100644 index 000000000..bdc3b48c4 --- /dev/null +++ b/charts/common/test-chart/tests/hasNestedKey_test.yaml @@ -0,0 +1,42 @@ +suite: hasNestedKey +templates: + - testHasNestedKey.yaml +tests: + - it: nested key not found due to missing values + asserts: + - equal: + path: spec.check + value: false + - it: key configured - string + set: + testkey: + enabled: foo + asserts: + - equal: + path: spec.check + value: true + - it: key configured - bool + set: + testkey: + enabled: true + asserts: + - equal: + path: spec.check + value: true + - it: key configured - object + set: + testkey: + enabled: + some: object + asserts: + - equal: + path: spec.check + value: true + - it: key multilevel - wrong type + set: + level1: + testkey: "foo" + asserts: + - equal: + path: spec.check + value: false diff --git a/charts/common/test-chart/tests/istio_test.yaml b/charts/common/test-chart/tests/istio_test.yaml index 5ce68dd65..8ff6ffdb8 100644 --- a/charts/common/test-chart/tests/istio_test.yaml +++ b/charts/common/test-chart/tests/istio_test.yaml @@ -3,6 +3,8 @@ templates: - vs.yaml values: - ../values.yaml +chart: + namespace: default tests: - it: test global value asserts: diff --git a/charts/common/test-chart/tests/valueLookup_test.yaml b/charts/common/test-chart/tests/valueLookup_test.yaml new file mode 100644 index 000000000..bdc39ba4f --- /dev/null +++ b/charts/common/test-chart/tests/valueLookup_test.yaml @@ -0,0 +1,87 @@ +suite: valueLookup +templates: + - valueLookup.yaml +tests: + - it: unknown key not found neither in 'defaults' nor in 'Override' neither in 'global' + asserts: + - equal: + path: spec.certManager.enabled + value: null + - it: override - overwrite value is taken, without defaults + set: + testkey: + enabledOverride: true + asserts: + - equal: + path: spec.certManager.enabled + value: true + - it: override - overwrites all other defaults + set: + testkey: + enabledOverride: true + enabled: false + global: + testkey: + enabled: false + common: + defaults: + testkey: + enabled: false + asserts: + - equal: + path: spec.certManager.enabled + value: true + - it: global - value is taken, without defaults + set: + global: + testkey: + enabled: true + asserts: + - equal: + path: spec.certManager.enabled + value: true + - it: global - global precedence over locals and defaults + set: + testkey: + enabled: false + global: + testkey: + enabled: true + common: + defaults: + testkey: + enabled: false + asserts: + - equal: + path: spec.certManager.enabled + value: true + - it: local - value is taken, without defaults + set: + testkey: + enabled: true + asserts: + - equal: + path: spec.certManager.enabled + value: true + - it: local - precedence over defaults + set: + testkey: + enabled: true + common: + defaults: + testkey: + enabled: false + asserts: + - equal: + path: spec.certManager.enabled + value: true + - it: default - value is taken + set: + common: + defaults: + testkey: + enabled: true + asserts: + - equal: + path: spec.certManager.enabled + value: true diff --git a/charts/common/test-chart/values.yaml b/charts/common/test-chart/values.yaml index f39056bb1..e69de29bb 100644 --- a/charts/common/test-chart/values.yaml +++ b/charts/common/test-chart/values.yaml @@ -1 +0,0 @@ -a: b \ No newline at end of file diff --git a/charts/common/values.yaml b/charts/common/values.yaml index e69de29bb..5f22953ba 100644 --- a/charts/common/values.yaml +++ b/charts/common/values.yaml @@ -0,0 +1,75 @@ +defaults: + + # -- service port + port: 8080 + + certManager: + # -- toggle to enable/disable cert-manager + enabled: false + + # -- imagePullSecret is the name of the secret that holds the docker registry credentials + imagePullSecret: "github" + + # -- imagePullPolicy is the policy to use when pulling images for all charts + imagePullPolicy: Always + + deployment: + resources: + # -- cpu and memory limits for the deployment + limits: + cpu: "100m" + memory: "512Mi" + # -- cpu and memory requests for the deployment + requests: + cpu: "40m" + memory: "50Mi" + # -- maxSurge + maxSurge: 5 + # -- maxUnavailable + maxUnavailable: 0 + # -- deployment strategy + strategy: RollingUpdate + # -- deployment revision history limit + revisionHistoryLimit: 3 + + health: + # -- health port + port: 8081 + # -- health period + periodSeconds: 10 + # -- readiness probe parameters + readiness: + path: "/readyz" + initialDelaySeconds: 5 + periodSeconds: 10 + # -- liveness probe parameters + liveness: + path: "/healthz" + failureThreshold: 1 + # -- startup probe parameters + startup: + path: "/readyz" + failureThreshold: 30 + + metrics: + # -- metrics port + port: 8080 + + istio: + # -- toggle to enable/disable istio + enabled: false + gateway: + # -- name of the gateway + name: gateway + + securityContext: + # -- user id to run the container + runAsUser: 1000 + # -- group id to run the container + runAsGroup: 3000 + # -- fsGroup id to run the container + fsGroup: 2000 + + externalSecrets: + # -- toggle to enable/disable external-secrets + enabled: true diff --git a/charts/example-content/Chart.lock b/charts/example-content/Chart.lock index 38e77fea3..a35e3fded 100644 --- a/charts/example-content/Chart.lock +++ b/charts/example-content/Chart.lock @@ -1,6 +1,6 @@ dependencies: - name: common - repository: oci://ghcr.io/openmfp/helm-charts - version: 0.1.4 -digest: sha256:c551412b9fb78781c0b5f50d75927891fe1b124db6e7f75662494cb2af5124a6 -generated: "2024-11-21T15:21:18.817499816+02:00" + repository: file://../common + version: 0.1.5 +digest: sha256:22600e7bfcab429b2e013cb3ff4ad21252274de627cccb908c95cc025ef150ce +generated: "2024-11-27T19:50:11.199614661+02:00" diff --git a/charts/example-content/Chart.yaml b/charts/example-content/Chart.yaml index 19a2b4c69..31fe2e0d8 100644 --- a/charts/example-content/Chart.yaml +++ b/charts/example-content/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 appVersion: "0.126.0" description: Helm Chart for the openmfp Portal name: example-content -version: 0.110.7 +version: 0.110.8 dependencies: - name: common - version: 0.1.4 - repository: oci://ghcr.io/openmfp/helm-charts + version: 0.1.5 + repository: file://../common diff --git a/charts/example-content/README.MD b/charts/example-content/README.MD index 0de306dd9..b0913446c 100644 --- a/charts/example-content/README.MD +++ b/charts/example-content/README.MD @@ -1,12 +1,21 @@ -# Helm chart of the jukebox +# example-content -## Execute the linting in the pipeline +![Version: 0.110.6](https://img.shields.io/badge/Version-0.110.6-informational?style=flat-square) ![AppVersion: 0.124.0](https://img.shields.io/badge/AppVersion-0.124.0-informational?style=flat-square) -```shell -helm lint -f test-values.yaml -``` +Helm Chart for the openmfp Portal + +## Requirements + +| Repository | Name | Version | +|------------|------|---------| +| file://../common | common | 0.1.5 | + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| image.name | string | `"ghcr.io/openmfp/example-content"` | The image name | +| istio.virtualService.hosts[0] | string | `"your-host.com"` | | +| istio.virtualService.matchers[0].match[0].uri.exact | string | `"/ui/example-content"` | | +| istio.virtualService.matchers[0].match[1].uri.prefix | string | `"/ui/example-content/"` | | -## Debug the chart output -```shell -helm template --debug . -f test-values.yaml -``` diff --git a/charts/example-content/README.md b/charts/example-content/README.md new file mode 100644 index 000000000..8660f5348 --- /dev/null +++ b/charts/example-content/README.md @@ -0,0 +1,21 @@ +# example-content + +![Version: 0.110.7](https://img.shields.io/badge/Version-0.110.7-informational?style=flat-square) ![AppVersion: 0.126.0](https://img.shields.io/badge/AppVersion-0.126.0-informational?style=flat-square) + +Helm Chart for the openmfp Portal + +## Requirements + +| Repository | Name | Version | +|------------|------|---------| +| file://../common | common | 0.1.5 | + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| image.name | string | `"ghcr.io/openmfp/example-content"` | The image name | +| istio.virtualService.hosts[0] | string | `"your-host.com"` | | +| istio.virtualService.matchers[0].match[0].uri.exact | string | `"/ui/example-content"` | | +| istio.virtualService.matchers[0].match[1].uri.prefix | string | `"/ui/example-content/"` | | + diff --git a/charts/example-content/charts/common-0.1.4.tgz b/charts/example-content/charts/common-0.1.4.tgz deleted file mode 100644 index 9b8721b64cf5eb6a6ac3e41ed3c182a2a99e2569..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22092 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�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 H0Ez$r5Bj-R diff --git a/charts/example-content/charts/common-0.1.5.tgz b/charts/example-content/charts/common-0.1.5.tgz new file mode 100644 index 0000000000000000000000000000000000000000..da1b3a71bf3a0d37d3c71f104ff92f25ba27d4a8 GIT binary patch literal 4513 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 literal 0 HcmV?d00001 diff --git a/charts/extension-manager-operator/charts/extension-manager-operator-crds-0.1.3.tgz b/charts/extension-manager-operator/charts/extension-manager-operator-crds-0.1.3.tgz new file mode 100644 index 0000000000000000000000000000000000000000..f9db5e92a4cc39a3de98b287fa97c097fe39e468 GIT binary patch literal 3513 zcmV;q4My@GiwG0|00000|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc zVQyr3R8em|NM&qo0PI|AQ{*<6p3nXjC$Lou6n0-2n53&xvlKJgr7}qB-w3uw{Hy$%vAdM0JJ3?$wx=$Vm~zAD`b*#=Ej7P5QWPV6hv|1 z`XZ3MlPM9(n~^wr^-(UXS9}b7F2Cv@?4-O9x2E)Ot{@~5Qo1<6I zfB2N$kxE6xtNx?sTE4lj1SFv!QD_4g!R^o?NizR9@CHX--w9Cqf+osbJBI(kC-kksEz&4yk#7D6E3{w=iIf4Hmw4Hy2aS{=QvgdPw9#4?PlfcI|x^tn!t%-DqZ7&ri#f{ZK|NDvs6 zljuxPrcj*lD2>^Crr#uIXGBd$;7LVPsx`*!5c%ot&VPA20sH>@t#c&7Y-{%_>t#mg znm29P6`QX~B`6EmoZ=&iXizhSX{(#UcDWspD4CLh)to=Yn2fR!dV`P8PCp)8EL;Xy zNLH(M5vT+;MX&=+3adZX@1@1@+3EaKBD9NCG~Zo|(jh8cU0Ts!?n0Z9n~j1%pC+`c z%eEYY?7o3dKuxIxfr&tg%$_fOnK0nv-_TdylIRN*T8uWvGz#<`-l9+-(B~nef6Qe| zP~1#v+`Ix~RE$J6CD;eTf+fi@nSnq(C#0+-FUu8|djG@)0%a3Ef~iu89QAr3Rk>^N zc^s#Vs#(u?2|7*{7qS=NEk->_Lzf7DN)`Gl71$#QbkQ&xTV&2iE=;>(QWnMm ztg$`X8)%CmnJ9aU#V+VeT6O2|FD@ZpiQOr?DMi;6z2y6&wMp3og&j8$JT@|s1qr82 zS^JDAG6gan$5d%E_&r6b^wuqlJu&VV#t3N=5QV{Vhf@Y8B*y53NPOnK(z_yEy$PLm zs~l98J6rXZ8uB<$v$a*e;37eP;n)Qzsn7>Q5rz72)rN{3)xJQ3vWPNV7`fb~X*gtY z6Pc=Ns@2)j*h}53ay+s$u5NKbCvi1R+V`)&o|-+=5EygyI6aY6O|_NzHKW@lXh`%0 zs&kywb!c-IWqja1iGDHndyW$n$b1`Q2xStG@id&8gC=6@$rXnP70h@F5%;zEsVO#0 zAabce?rA8KG%&+Jk{E5?qjQMmL%xnuAdkik?OHDrl16F-TU#yty6R6uCqXvwVSc+S zL2enB#)VRhjN8V^1bszsF`5~dsSo!)j8g?cidyAk;@{j65lHZPoDfCFG@@z-RJP1R zqKMyNU}PX*oT!-xr%Wose3bKWt?eG}sG909ZF*%9MAz9sMAHu2X<{xF_$ajDL^HS( zoP}*lsPN)9^T%}Bkq6w@^&ImtQL@KxQQT6z>)mm2Ls{tR1-sU&WY3sUZ`=H8oVUdx zl{-~Bf&%w$v0OJMiJLt$R6M4B%_vpt=sK;fWnEvEHw8#V^nj>Pdy{n`)uip~230d? zA*}MT)VWR(SC>@L1JHySF+0`QrWgB^0-g1{T4Ix{Y;uM%N=d>;?@=bk)=$$kCJY3UK;J^q#sZVJ zv2bpzWXw}r^b}jxvMaiT8e?DfbHhZI5+r>e*dm zs}f7~qfv>M*F;`e^fC6eXzh1IfZ35ptX4doP`~U?buDjBUKS+rUhmHQF%S?IK#YV@7RqcXd2YU6 zJF6aaH%0AIr?T*^?EU z@3*^`L4Vj_WbMWdSyi4_ zV8L3mc$sGqxi##YV9F;2|pTFfOhp53(t9|TzvQ}`l^U2Nr z+RHEPzTNphud#i1uebYlr(|1KpWMQ*ysN$4x23k-2bx)4e^+VMt;pvpyJcxZWt(++ zl}!up9~PVRsw)~A>%puX6@tuG%aNjlIY*gB6;JOP6vgmfoujVIX@u2za(kB7Aiqn> z(i|e|V_&7pRxaB4N1#M%S1uJ7I@v5;Nyqbt`uXxQ7X^R*yJ8Zs{M z!E?0ne+~~0SNK1J;pYASb6^|JY#1>`u-#}|iJDjRI-^X8e?vl)p0k}5!D*6kp>#Ej zQ3PSc#}E_cPbmxcL107_y+s|LrlsqI1AlL(y9dkk!H|IMxkzp!X#5{WFb zL4pDz%FuJXcNfX8$&It;saXHb1r43Oe>vOmkqF9D38(MgOUFwDH-62d z0g|5WF8FVbcPo7!VDD>iRc+`0{QdE}pWb_M@Q68D&;Q|I>HHtPIXK*$|L4GVD`D69 z=F`UohVIo){#Jp;p(m%hIx?>n#v}-_mvwecU$^v*i$rgwnnn2iBqGX{zo$gtE`0Op za+wj_GJ)>zmb!PD<9LPF+%icqz_tBbXK|b+a`cz#3)=aAQn`;L0k6&f9rlj~gU$JW z4s7_p|7>(Q|FU;|Eg4DVl&kCOUVur&XE8E$ty_&-@N|3K9L?u{*dGp#md^jt!C>?M zKhJ`Ew{4)LxTg1<}&-i0F!1;w_GCkz#|t`)v8JcKh0upVz1mN;Xz{NY@1 zX>lz)V(88#hE9B9sNfV^%$dc|gsZSbE30`?^%)t=7N3vDY_T4j z+2Tbw%@&Q1*;o0^-8b@ca-A1<@`)MG7OlKzizfE-v+Qjh2fD-VR`a3D18ZJbta76* zo`WH6(Z&$!#Fp+R3fh>{WrelS6Ox1Wm|Mr8Fb=kTXbb==e^g{F+7m9ZSh>(ZHs4OaOaafgvV|1 zGHh;(PENAiwT0Pj@eqD@X_8J0XJZfyTwy6-z_@2&Sn<8 z#b@KfTeQ~^t<3mRw?>A1(XW{)Z?R5I)m?#~hdXc4i9v7ih4JXu(0CK4K1WAxebK$1 zV_)>C<=PirYB~2smm2Q9MTh#lo`-MIiH%KIz=sQ5lR%O=)|V8xdX8?&>rs4A9M!BR4=gh+`( n&HajN`(5NjCiwI3m)7$J8*H$_mxg}_009607e{L@0AK(BCIQ?) literal 0 HcmV?d00001 diff --git a/charts/extension-manager-operator/templates/cluster-role.yaml b/charts/extension-manager-operator/templates/cluster-role.yaml new file mode 100644 index 000000000..37b4e52c0 --- /dev/null +++ b/charts/extension-manager-operator/templates/cluster-role.yaml @@ -0,0 +1,50 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: {{ include "common.entity.name" . }} +rules: +- apiGroups: + - core.openmfp.io + resources: + - contentconfigurations + - contentconfigurations/status + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - "" + resources: + - events + verbs: + - get + - list + - watch + - create + - update + - patch + - delete +- apiGroups: + - "" + resources: + - namespaces + verbs: + - get + - list + - watch diff --git a/charts/extension-manager-operator/templates/cluster-rolebinding.yaml b/charts/extension-manager-operator/templates/cluster-rolebinding.yaml new file mode 100644 index 000000000..45876e6f2 --- /dev/null +++ b/charts/extension-manager-operator/templates/cluster-rolebinding.yaml @@ -0,0 +1,12 @@ +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: {{ include "common.entity.name" . }} +subjects: +- kind: ServiceAccount + name: {{ include "common.entity.name" . }} + namespace: {{ .Release.Namespace }} +roleRef: + kind: ClusterRole + name: {{ include "common.entity.name" . }} + apiGroup: rbac.authorization.k8s.io diff --git a/charts/extension-manager-operator/templates/deployment.yaml b/charts/extension-manager-operator/templates/deployment.yaml new file mode 100644 index 000000000..eef43b3dd --- /dev/null +++ b/charts/extension-manager-operator/templates/deployment.yaml @@ -0,0 +1,41 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "common.entity.name" . }} + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +spec: + revisionHistoryLimit: {{ include "common.getKeyValue" (dict "Values" .Values "key" "deployment.revisionHistoryLimit") }} + selector: + matchLabels: + service: {{ include "common.entity.name" . }} + template: + metadata: + labels: + service: {{ include "common.entity.name" . }} + {{- if ((.Values.deployment).template).labels }} + {{ .Values.deployment.template.labels | toYaml | nindent 8 }} + {{- end }} + annotations: + sidecar.istio.io/inject: "{{ (include "common.istioEnabled" .) }}" + {{- if ((.Values.deployment).template).annotations }} + {{ .Values.deployment.template.annotations | toYaml | nindent 8 }} + {{- end }} + spec: + serviceAccountName: {{ include "common.entity.name" . }} + containers: + - args: + - operator + - --leader-elect + - --log-level={{ .Values.logLevel }} + - '--health-probe-bind-address=:{{ include "common.getKeyValue" (dict "Values" .Values "key" "health.port") }}' + image: {{ .Values.image.name }}:{{ .Chart.AppVersion }} + imagePullPolicy: {{ include "common.imagePullPolicy" . }} + name: manager + {{ include "common.container.securityContext" . | nindent 10 }} + ports: + {{ include "common.PortsMetricsHealth" . | nindent 10 }} + {{ include "common.operatorHealthAndReadyness" . | nindent 10 }} + {{ include "common.resources" . | nindent 10 }} + terminationGracePeriodSeconds: {{ include "common.terminationGracePeriodSeconds" .}} diff --git a/charts/extension-manager-operator/templates/service-account.yaml b/charts/extension-manager-operator/templates/service-account.yaml new file mode 100644 index 000000000..490c917a9 --- /dev/null +++ b/charts/extension-manager-operator/templates/service-account.yaml @@ -0,0 +1,5 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "common.entity.name" . }} +{{- include "common.imagePullSecret" . }} diff --git a/charts/extension-manager-operator/test-values.yaml b/charts/extension-manager-operator/test-values.yaml new file mode 100644 index 000000000..6cfd56954 --- /dev/null +++ b/charts/extension-manager-operator/test-values.yaml @@ -0,0 +1,2 @@ +# Test Override Values for helm unit tests +a: b diff --git a/charts/extension-manager-operator/tests/__snapshot__/deployment_test.yaml.snap b/charts/extension-manager-operator/tests/__snapshot__/deployment_test.yaml.snap new file mode 100644 index 000000000..158879b53 --- /dev/null +++ b/charts/extension-manager-operator/tests/__snapshot__/deployment_test.yaml.snap @@ -0,0 +1,139 @@ +operator match the snapshot: + 1: | + apiVersion: rbac.authorization.k8s.io/v1 + kind: ClusterRole + metadata: + name: extension-manager-operator + rules: + - apiGroups: + - core.openmfp.io + resources: + - contentconfigurations + - contentconfigurations/status + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - "" + resources: + - events + verbs: + - get + - list + - watch + - create + - update + - patch + - delete + - apiGroups: + - "" + resources: + - namespaces + verbs: + - get + - list + - watch + 2: | + apiVersion: rbac.authorization.k8s.io/v1 + kind: ClusterRoleBinding + metadata: + name: extension-manager-operator + roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: extension-manager-operator + subjects: + - kind: ServiceAccount + name: extension-manager-operator + namespace: NAMESPACE + 3: | + apiVersion: apps/v1 + kind: Deployment + metadata: + name: extension-manager-operator + spec: + revisionHistoryLimit: 3 + selector: + matchLabels: + service: extension-manager-operator + template: + metadata: + annotations: + sidecar.istio.io/inject: "true" + labels: + service: extension-manager-operator + spec: + containers: + - args: + - operator + - --leader-elect + - --log-level= + - --health-probe-bind-address=:8081 + automountServiceAccountToken: true + image: ghcr.io/openmfp/extension-content-operator:1.0.0 + imagePullPolicy: Always + livenessProbe: + failureThreshold: 1 + httpGet: + path: /readyz + port: 8081 + periodSeconds: 10 + name: manager + ports: + - containerPort: 8080 + name: metrics + protocol: TCP + - containerPort: 8081 + name: health-port + protocol: TCP + readinessProbe: + httpGet: + path: /readyz + port: 8081 + initialDelaySeconds: 5 + periodSeconds: 10 + resources: + limits: + cpu: 260m + memory: 512Mi + requests: + cpu: 40m + memory: 50Mi + securityContext: + readOnlyRootFilesystem: true + runAsNonRoot: true + seccompProfile: + type: RuntimeDefault + serviceAccountName: extension-manager-operator + startupProbe: + failureThreshold: 30 + httpGet: + path: /readyz + port: 8081 + periodSeconds: 10 + serviceAccountName: extension-manager-operator + terminationGracePeriodSeconds: 10 + 4: | + apiVersion: v1 + imagePullSecrets: + - name: github + kind: ServiceAccount + metadata: + name: extension-manager-operator diff --git a/charts/extension-manager-operator/tests/deployment_test.yaml b/charts/extension-manager-operator/tests/deployment_test.yaml new file mode 100644 index 000000000..f8a5af02e --- /dev/null +++ b/charts/extension-manager-operator/tests/deployment_test.yaml @@ -0,0 +1,100 @@ +suite: operator +templates: + - deployment.yaml + - service-account.yaml + - cluster-role.yaml + - cluster-rolebinding.yaml +values: + - ../test-values.yaml +chart: + version: 1.0.0 + appVersion: 1.0.0 +release: + name: extension-manager-operator +tests: + - it: operator match the snapshot + asserts: + - matchSnapshot: {} + set: + istio: + enabledOverride: true + health: + portOverride: 8081 + liveness: + pathOverride: /readyz + metrics: + port: 8080 + deployment: + resources: + limits: + cpuOverride: 260m + memoryOverride: 512Mi + requests: + cpuOverride: 40m + memoryOverride: 50Mi + - it: deployment with metrics probes + template: deployment.yaml + set: + health: + port: 8081 + liveness: + path: /healthz + metrics: + port: 8082 + asserts: + - equal: + path: spec.template.spec.containers[0].livenessProbe + value: + failureThreshold: 1 + httpGet: + path: /healthz + port: 8081 + periodSeconds: 10 + - it: check deployment template labels + template: deployment.yaml + set: + deployment: + template: + labels: + control-plane: controller-manager + asserts: + - equal: + path: spec.template.metadata.labels.control-plane + value: controller-manager + - it: check deployment without custom labels + template: deployment.yaml + set: + deployment: + template: {} + asserts: + - equal: + path: spec.template.metadata.labels + value: + service: extension-manager-operator + - it: test imagePullPolicy override + template: deployment.yaml + set: + imagePullPolicyOverride: IfNotPresent + asserts: + - equal: + path: spec.template.spec.containers[0].imagePullPolicy + value: IfNotPresent + - it: override imagePullSecret + template: service-account.yaml + set: + imagePullSecretOverride: my-secret + asserts: + - equal: + path: imagePullSecrets + value: + - name: my-secret + - it: configure global imagePullSecret + template: service-account.yaml + set: + global: + imagePullSecret: my-secret + asserts: + - equal: + path: imagePullSecrets + value: + - name: my-secret \ No newline at end of file diff --git a/charts/extension-manager-operator/values.yaml b/charts/extension-manager-operator/values.yaml new file mode 100644 index 000000000..dc6b3b28d --- /dev/null +++ b/charts/extension-manager-operator/values.yaml @@ -0,0 +1,15 @@ +# The image configuration for the Extension Manager Operator +## @param image.name The image repository +## @param image.tag The image tag +image: + name: ghcr.io/openmfp/extension-content-operator + tag: 0.16.0 + +# The Custom Resource Definitions (CRDs) configuration +## @param crds.enabled Enable or disable the CRDs +crds: + enabled: true + +## @param commonAnnotations Annotations to add to all deployed objects +## +commonAnnotations: {} diff --git a/charts/openmfp-crds/Chart.yaml b/charts/openmfp-crds/Chart.yaml index 0955421f9..72ac8ff0f 100644 --- a/charts/openmfp-crds/Chart.yaml +++ b/charts/openmfp-crds/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: openmfp-crds description: A chart containing CRD Definitions for OpenMFP type: application -version: 0.0.1 +version: 0.0.2 appVersion: "0.0.0" dependencies: diff --git a/charts/openmfp-crds/README.md b/charts/openmfp-crds/README.md new file mode 100644 index 000000000..2e00052ba --- /dev/null +++ b/charts/openmfp-crds/README.md @@ -0,0 +1,19 @@ +# openmfp-crds + +![Version: 0.0.2](https://img.shields.io/badge/Version-0.0.2-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 0.0.0](https://img.shields.io/badge/AppVersion-0.0.0-informational?style=flat-square) + +A chart containing CRD Definitions for OpenMFP + +## Requirements + +| Repository | Name | Version | +|------------|------|---------| +| oci://ghcr.io/openmfp/helm-charts | account-operator-crds | 0.1.5 | + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| account-operator-crds.enabled | bool | `true` | | +| extension-content-operator-crds.enabled | bool | `true` | | + diff --git a/charts/openmfp/Chart.yaml b/charts/openmfp/Chart.yaml index 6ab28b610..b30ba5e19 100644 --- a/charts/openmfp/Chart.yaml +++ b/charts/openmfp/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: openmfp description: The OpenMFP chart for Kubernetes type: application -version: 0.0.35 +version: 0.0.36 appVersion: "0.0.0" dependencies: diff --git a/charts/openmfp/README.md b/charts/openmfp/README.md new file mode 100644 index 000000000..a3b8ccc1c --- /dev/null +++ b/charts/openmfp/README.md @@ -0,0 +1,20 @@ +# openmfp + +![Version: 0.0.34](https://img.shields.io/badge/Version-0.0.34-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 0.0.0](https://img.shields.io/badge/AppVersion-0.0.0-informational?style=flat-square) + +The OpenMFP chart for Kubernetes + +## Requirements + +| Repository | Name | Version | +|------------|------|---------| +| oci://ghcr.io/openmfp/helm-charts | example-content | 0.110.7 | +| oci://ghcr.io/openmfp/helm-charts | portal | 0.69.141 | + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| components.example-content.enabled | bool | `false` | | +| components.portal.enabled | bool | `true` | | + diff --git a/charts/portal/Chart.lock b/charts/portal/Chart.lock index fa76da0ce..5479e0227 100644 --- a/charts/portal/Chart.lock +++ b/charts/portal/Chart.lock @@ -1,6 +1,6 @@ dependencies: - name: common repository: file://../common - version: 0.1.4 -digest: sha256:05e31c3eb487f942d4ac07ce0dfe4e0620779b589ef481cdd6534c73a7f0ca27 -generated: "2024-11-20T11:36:34.0773803+02:00" + version: 0.1.5 +digest: sha256:22600e7bfcab429b2e013cb3ff4ad21252274de627cccb908c95cc025ef150ce +generated: "2024-11-22T16:16:28.923712048+02:00" diff --git a/charts/portal/Chart.yaml b/charts/portal/Chart.yaml index 67eb260ea..ae9579a63 100644 --- a/charts/portal/Chart.yaml +++ b/charts/portal/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 appVersion: "0.220.0" description: Helm Chart for the openmfp Portal name: portal -version: 0.69.142 +version: 0.69.143 dependencies: - name: common repository: file://../common - version: 0.1.4 + version: 0.1.5 diff --git a/charts/portal/README.MD b/charts/portal/README.MD index 0de306dd9..d82e0d065 100644 --- a/charts/portal/README.MD +++ b/charts/portal/README.MD @@ -1,12 +1,23 @@ -# Helm chart of the jukebox +# portal -## Execute the linting in the pipeline +![Version: 0.69.127](https://img.shields.io/badge/Version-0.69.127-informational?style=flat-square) ![AppVersion: 0.204.0](https://img.shields.io/badge/AppVersion-0.204.0-informational?style=flat-square) -```shell -helm lint -f test-values.yaml -``` +Helm Chart for the openmfp Portal + +## Requirements + +| Repository | Name | Version | +|------------|------|---------| +| file://../common | common | 0.1.5 | + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| featureToggles | string | `"enableSessionAutoRefresh=true"` | | +| http.protocol | string | `"https"` | | +| image.name | string | `"ghcr.io/openmfp/portal"` | | +| image.pullPolicyOverride | string | `"IfNotPresent"` | | +| importContent | bool | `true` | | +| validWebcomponentUrls | string | `".?"` | | -## Debug the chart output -```shell -helm template --debug . -f test-values.yaml -``` diff --git a/charts/portal/README.md b/charts/portal/README.md new file mode 100644 index 000000000..588165737 --- /dev/null +++ b/charts/portal/README.md @@ -0,0 +1,23 @@ +# portal + +![Version: 0.69.142](https://img.shields.io/badge/Version-0.69.142-informational?style=flat-square) ![AppVersion: 0.220.0](https://img.shields.io/badge/AppVersion-0.220.0-informational?style=flat-square) + +Helm Chart for the openmfp Portal + +## Requirements + +| Repository | Name | Version | +|------------|------|---------| +| file://../common | common | 0.1.5 | + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| featureToggles | string | `"enableSessionAutoRefresh=true"` | | +| http.protocol | string | `"https"` | | +| image.name | string | `"ghcr.io/openmfp/portal"` | | +| image.pullPolicyOverride | string | `"IfNotPresent"` | | +| importContent | bool | `true` | | +| validWebcomponentUrls | string | `".?"` | | + diff --git a/charts/portal/charts/common-0.1.4.tgz b/charts/portal/charts/common-0.1.4.tgz deleted file mode 100644 index bb03e0aab8d07c2cca1afa4b0b502f5e1cc0104b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22092 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�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 H0Ez$rI?LLJ diff --git a/charts/portal/charts/common-0.1.5.tgz b/charts/portal/charts/common-0.1.5.tgz new file mode 100644 index 0000000000000000000000000000000000000000..5bab432c099e51208a9df18afee01bc715199e15 GIT binary patch literal 4511 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