Last active
August 2, 2022 08:34
-
-
Save vrabbi/1f6ae2ef934997fa2adb01bef0a28202 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #@data/values | |
| --- | |
| workload: | |
| metadata: | |
| name: test-workload | |
| namespace: default | |
| params: | |
| chart_name: tanzu-java-web-app | |
| chart_repo: | |
| name: demo-repo | |
| kind: HelmRepository | |
| image_key_path: image.repository | |
| chart_values: | |
| service: | |
| type: LoadBalancer | |
| image: | |
| pullPolicy: IfNotPresent | |
| images: | |
| image: | |
| image: test-image@sha256:1234546 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #@ load("@ytt:data", "data") | |
| #@ load("@ytt:assert", "assert") | |
| #@ load("@ytt:yaml", "yaml") | |
| #@ load("@ytt:struct", "struct") | |
| #@ load("@ytt:overlay", "overlay") | |
| #@ load("@ytt:regexp", "regexp") | |
| #@ def merge_labels(fixed_values): | |
| #@ labels = {} | |
| #@ if hasattr(data.values.workload.metadata, "labels"): | |
| #@ labels.update(data.values.workload.metadata.labels) | |
| #@ end | |
| #@ labels.update(fixed_values) | |
| #@ return labels | |
| #@ end | |
| #@ def is_monorepo_approach(): | |
| #@ if 'gitops_server_address' in data.values.params and 'gitops_repository_owner' in data.values.params and 'gitops_repository_name' in data.values.params: | |
| #@ return True | |
| #@ end | |
| #@ if 'gitops_server_address' in data.values.params or 'gitops_repository_owner' in data.values.params or 'gitops_repository_name' in data.values.params: | |
| #@ 'gitops_server_address' in data.values.params or assert.fail("missing param: gitops_server_address") | |
| #@ 'gitops_repository_owner' in data.values.params or assert.fail("missing param: gitops_repository_owner") | |
| #@ 'gitops_repository_name' in data.values.params or assert.fail("missing param: gitops_repository_name") | |
| #@ end | |
| #@ return False | |
| #@ end | |
| #@ def has_git_params(): | |
| #@ if 'gitops_repository_prefix' in data.values.params: | |
| #@ return True | |
| #@ end | |
| #@ | |
| #@ if 'gitops_repository' in data.values.params: | |
| #@ return True | |
| #@ end | |
| #@ | |
| #@ return False | |
| #@ end | |
| #@ def is_gitops(): | |
| #@ return is_monorepo_approach() or has_git_params() | |
| #@ end | |
| #@ def param(key): | |
| #@ if not key in data.values.params: | |
| #@ return None | |
| #@ end | |
| #@ return data.values.params[key] | |
| #@ end | |
| #@ def strip_trailing_slash(some_string): | |
| #@ if some_string[-1] == "/": | |
| #@ return some_string[:-1] | |
| #@ end | |
| #@ return some_string | |
| #@ end | |
| #@ def mono_repository(): | |
| #@ strip_trailing_slash(data.values.params.gitops_server_address) | |
| #@ return "/".join([ | |
| #@ strip_trailing_slash(data.values.params.gitops_server_address), | |
| #@ strip_trailing_slash(data.values.params.gitops_repository_owner), | |
| #@ data.values.params.gitops_repository_name, | |
| #@ ]) + ".git" | |
| #@ end | |
| #@ def git_repository(): | |
| #@ if is_monorepo_approach(): | |
| #@ return mono_repository() | |
| #@ end | |
| #@ | |
| #@ if 'gitops_repository' in data.values.params: | |
| #@ return param("gitops_repository") | |
| #@ end | |
| #@ | |
| #@ prefix = param("gitops_repository_prefix") | |
| #@ return prefix + data.values.workload.metadata.name + ".git" | |
| #@ end | |
| #@ def image(): | |
| #@ return "/".join([ | |
| #@ data.values.params.registry.server, | |
| #@ data.values.params.registry.repository, | |
| #@ "-".join([ | |
| #@ data.values.workload.metadata.name, | |
| #@ data.values.workload.metadata.namespace, | |
| #@ "bundle", | |
| #@ ]) | |
| #@ ]) + ":" + data.values.workload.metadata.uid | |
| #@ end | |
| #@ def as_dict(parts, leaf): | |
| #@ if len(parts) == 0: | |
| #@ return leaf | |
| #@ end | |
| #@ return {parts[0]: as_dict(parts[1:], leaf)} | |
| #@ end | |
| #@ def split_dot_path(path): | |
| #@ # "replace any dot that does NOT have a leading slash with ':::' | |
| #@ path = regexp.replace("([^\\\])\.", path, "$1:::") | |
| #@ path = path.replace("\.", ".") # consume escaping of '.' | |
| #@ return path.split(":::") | |
| #@ end | |
| #@ def image_path(): | |
| #@ if hasattr(data.values.params, "image_key_path"): | |
| #@ return data.values.params.image_key_path | |
| #@ else: | |
| #@ return "image.repository" | |
| #@ end | |
| #@ end | |
| #@ chart_config = as_dict(split_dot_path(image_path()), data.values.images.image.image) | |
| #@ config_source = data.values.params | |
| #@ def chart_overrides(): | |
| #@ return data.values.params | |
| #@ end | |
| #@ def image_override(): | |
| #@overlay/match-child-defaults missing_ok=True | |
| chart_values: #@ chart_config | |
| #@ end | |
| #@ def chart_values(): | |
| #@ if hasattr(data.values.params, "chart_values"): | |
| #@ return struct.encode(yaml.decode(yaml.encode(overlay.apply(chart_overrides(), image_override())))).chart_values | |
| #@ else: | |
| #@ return struct.encode(yaml.decode(yaml.encode(image_override()))).chart_values | |
| #@ end | |
| #@ end | |
| #@ def helm_release(): | |
| --- | |
| apiVersion: helm.toolkit.fluxcd.io/v2beta1 | |
| kind: HelmRelease | |
| metadata: | |
| name: #@ data.values.workload.metadata.name | |
| namespace: #@ data.values.workload.metadata.namespace | |
| labels: #@ merge_labels({ "app.kubernetes.io/component": "helm-release", "app.tanzu.vmware.com/release-type": "helm" }) | |
| spec: | |
| interval: 5m | |
| chart: | |
| spec: | |
| chart: #@ data.values.params.chart_name | |
| #@ if/end hasattr(data.values.params, "chart_version"): | |
| version: #@ data.values.params.chart_version | |
| sourceRef: | |
| kind: #@ data.values.params.chart_repo.kind | |
| name: #@ data.values.params.chart_repo.name | |
| #@ if/end hasattr(data.values.params.chart_repo, "namespace"): | |
| namespace: #@ data.values.params.chart_repo.namespace | |
| interval: 1m | |
| upgrade: | |
| remediation: | |
| remediateLastFailure: true | |
| values: #@ chart_values() | |
| #@ end | |
| --- | |
| apiVersion: v1 | |
| kind: ConfigMap | |
| metadata: | |
| name: #@ "{}-helm-release".format(data.values.workload.metadata.name) | |
| labels: #@ merge_labels({ "app.kubernetes.io/component": "config" }) | |
| data: | |
| helm-release.yaml: #@ yaml.encode(helm_release()) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment