From 6d36dc23d7eb8d82fe2bfe40651fdd1a948b9285 Mon Sep 17 00:00:00 2001 From: Nefi Munoz Date: Tue, 18 Jul 2023 13:26:06 -0600 Subject: [PATCH] Removing BTP Chronicle to fix missing deps, will re-add later --- assets/btp/chronicle-0.1.13.tgz | Bin 51001 -> 0 bytes assets/btp/chronicle-0.1.14.tgz | Bin 51678 -> 0 bytes assets/btp/chronicle-0.1.15.tgz | Bin 55301 -> 0 bytes assets/btp/chronicle-0.1.16.tgz | Bin 55741 -> 0 bytes assets/btp/chronicle-0.1.18.tgz | Bin 55750 -> 0 bytes assets/btp/chronicle-0.1.6.tgz | Bin 51216 -> 0 bytes assets/btp/chronicle-0.1.7.tgz | Bin 50873 -> 0 bytes charts/btp/chronicle/.helmignore | 23 - charts/btp/chronicle/Chart.lock | 9 - charts/btp/chronicle/Chart.yaml | 25 - charts/btp/chronicle/README.md | 60 --- charts/btp/chronicle/app-readme.md | 12 - .../btp/chronicle/charts/sawtooth/.helmignore | 25 - .../btp/chronicle/charts/sawtooth/Chart.lock | 6 - .../btp/chronicle/charts/sawtooth/Chart.yaml | 10 - .../btp/chronicle/charts/sawtooth/README.md | 96 ---- .../sawtooth/charts/standard-defs/Chart.lock | 6 - .../sawtooth/charts/standard-defs/Chart.yaml | 10 - .../sawtooth/charts/standard-defs/README.md | 0 .../standard-defs/charts/common/.helmignore | 22 - .../standard-defs/charts/common/Chart.yaml | 23 - .../standard-defs/charts/common/README.md | 327 ------------ .../charts/common/templates/_affinities.tpl | 102 ---- .../charts/common/templates/_capabilities.tpl | 117 ----- .../charts/common/templates/_errors.tpl | 23 - .../charts/common/templates/_images.tpl | 75 --- .../charts/common/templates/_ingress.tpl | 55 -- .../charts/common/templates/_labels.tpl | 18 - .../charts/common/templates/_names.tpl | 32 -- .../charts/common/templates/_secrets.tpl | 129 ----- .../charts/common/templates/_storage.tpl | 23 - .../charts/common/templates/_tplvalues.tpl | 13 - .../charts/common/templates/_utils.tpl | 62 --- .../charts/common/templates/_warnings.tpl | 14 - .../templates/validations/_cassandra.tpl | 72 --- .../common/templates/validations/_mariadb.tpl | 103 ---- .../common/templates/validations/_mongodb.tpl | 108 ---- .../templates/validations/_postgresql.tpl | 131 ----- .../common/templates/validations/_redis.tpl | 76 --- .../templates/validations/_validations.tpl | 46 -- .../standard-defs/charts/common/values.yaml | 5 - .../standard-defs/templates/_ingress.tpl | 101 ---- .../charts/standard-defs/templates/_lib.tpl | 51 -- .../standard-defs/templates/_lib_image.tpl | 46 -- .../standard-defs/templates/_lib_volumes.tpl | 34 -- .../sawtooth/charts/standard-defs/values.yaml | 1 - .../charts/sawtooth/sextant/details.yaml | 27 - .../chronicle/charts/sawtooth/sextant/form.js | 330 ------------ .../charts/sawtooth/sextant/options.js | 48 -- .../charts/sawtooth/sextant/summary.js | 43 -- .../charts/sawtooth/templates/NOTES.txt | 0 .../charts/sawtooth/templates/_sawtooth.tpl | 352 ------------- .../templates/_sawtooth_containers.tpl | 441 ---------------- .../charts/sawtooth/templates/_utils.tpl | 8 - .../charts/sawtooth/templates/ingress.yaml | 6 - .../sawtooth/templates/pernode-services.yaml | 38 -- .../sawtooth/templates/serviceaccount.yaml | 13 - .../templates/validator-clusterroles.yaml | 24 - .../templates/validator-env-configmap.yaml | 98 ---- .../sawtooth/templates/validator-roles.yaml | 30 -- .../sawtooth/templates/validator-set.yaml | 67 --- .../sawtooth/templates/validators-svcs.yaml | 27 - .../btp/chronicle/charts/sawtooth/values.yaml | 480 ------------------ .../chronicle/charts/standard-defs/Chart.lock | 6 - .../chronicle/charts/standard-defs/Chart.yaml | 10 - .../chronicle/charts/standard-defs/README.md | 0 .../standard-defs/charts/common/.helmignore | 22 - .../standard-defs/charts/common/Chart.yaml | 23 - .../standard-defs/charts/common/README.md | 327 ------------ .../charts/common/templates/_affinities.tpl | 102 ---- .../charts/common/templates/_capabilities.tpl | 117 ----- .../charts/common/templates/_errors.tpl | 23 - .../charts/common/templates/_images.tpl | 75 --- .../charts/common/templates/_ingress.tpl | 55 -- .../charts/common/templates/_labels.tpl | 18 - .../charts/common/templates/_names.tpl | 32 -- .../charts/common/templates/_secrets.tpl | 129 ----- .../charts/common/templates/_storage.tpl | 23 - .../charts/common/templates/_tplvalues.tpl | 13 - .../charts/common/templates/_utils.tpl | 62 --- .../charts/common/templates/_warnings.tpl | 14 - .../templates/validations/_cassandra.tpl | 72 --- .../common/templates/validations/_mariadb.tpl | 103 ---- .../common/templates/validations/_mongodb.tpl | 108 ---- .../templates/validations/_postgresql.tpl | 131 ----- .../common/templates/validations/_redis.tpl | 76 --- .../templates/validations/_validations.tpl | 46 -- .../standard-defs/charts/common/values.yaml | 5 - .../standard-defs/templates/_ingress.tpl | 101 ---- .../charts/standard-defs/templates/_lib.tpl | 51 -- .../standard-defs/templates/_lib_image.tpl | 50 -- .../standard-defs/templates/_lib_volumes.tpl | 34 -- .../charts/standard-defs/values.yaml | 1 - charts/btp/chronicle/questions.yaml | 130 ----- charts/btp/chronicle/templates/_chronicle.tpl | 130 ----- charts/btp/chronicle/templates/_utils.tpl | 44 -- .../chronicle/templates/chronicle-config.yaml | 17 - .../chronicle/templates/chronicle-init.yaml | 228 --------- .../templates/chronicle-secret-volume.yaml | 12 - .../templates/id-provider-service.yaml | 20 - .../templates/id-provider-statefulset.yaml | 28 - charts/btp/chronicle/templates/ingress.yaml | 4 - .../templates/pernode-opa-tp-service.yaml | 20 - .../templates/pernode-tp-service.yaml | 18 - .../chronicle/templates/secrets-roles.yaml | 28 - charts/btp/chronicle/templates/service.yaml | 17 - .../chronicle/templates/serviceaccount.yaml | 12 - .../btp/chronicle/templates/statefulset.yaml | 189 ------- .../templates/test-token-getter-roles.yaml | 35 -- .../chronicle/templates/tests/api-test.yaml | 116 ----- .../btp/chronicle/templates/tp-service.yaml | 13 - .../chronicle/templates/tp-statefulset.yaml | 77 --- charts/btp/chronicle/values.yaml | 235 --------- index.yaml | 206 +------- packages/btp/chronicle/upstream.yaml | 4 - 115 files changed, 1 insertion(+), 7534 deletions(-) delete mode 100644 assets/btp/chronicle-0.1.13.tgz delete mode 100644 assets/btp/chronicle-0.1.14.tgz delete mode 100644 assets/btp/chronicle-0.1.15.tgz delete mode 100644 assets/btp/chronicle-0.1.16.tgz delete mode 100644 assets/btp/chronicle-0.1.18.tgz delete mode 100644 assets/btp/chronicle-0.1.6.tgz delete mode 100644 assets/btp/chronicle-0.1.7.tgz delete mode 100644 charts/btp/chronicle/.helmignore delete mode 100644 charts/btp/chronicle/Chart.lock delete mode 100644 charts/btp/chronicle/Chart.yaml delete mode 100644 charts/btp/chronicle/README.md delete mode 100644 charts/btp/chronicle/app-readme.md delete mode 100644 charts/btp/chronicle/charts/sawtooth/.helmignore delete mode 100644 charts/btp/chronicle/charts/sawtooth/Chart.lock delete mode 100644 charts/btp/chronicle/charts/sawtooth/Chart.yaml delete mode 100644 charts/btp/chronicle/charts/sawtooth/README.md delete mode 100644 charts/btp/chronicle/charts/sawtooth/charts/standard-defs/Chart.lock delete mode 100644 charts/btp/chronicle/charts/sawtooth/charts/standard-defs/Chart.yaml delete mode 100644 charts/btp/chronicle/charts/sawtooth/charts/standard-defs/README.md delete mode 100644 charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/.helmignore delete mode 100644 charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/Chart.yaml delete mode 100644 charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/README.md delete mode 100644 charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_affinities.tpl delete mode 100644 charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_capabilities.tpl delete mode 100644 charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_errors.tpl delete mode 100644 charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_images.tpl delete mode 100644 charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_ingress.tpl delete mode 100644 charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_labels.tpl delete mode 100644 charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_names.tpl delete mode 100644 charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_secrets.tpl delete mode 100644 charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_storage.tpl delete mode 100644 charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_tplvalues.tpl delete mode 100644 charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_utils.tpl delete mode 100644 charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_warnings.tpl delete mode 100644 charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/validations/_cassandra.tpl delete mode 100644 charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/validations/_mariadb.tpl delete mode 100644 charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/validations/_mongodb.tpl delete mode 100644 charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/validations/_postgresql.tpl delete mode 100644 charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/validations/_redis.tpl delete mode 100644 charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/validations/_validations.tpl delete mode 100644 charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/values.yaml delete mode 100644 charts/btp/chronicle/charts/sawtooth/charts/standard-defs/templates/_ingress.tpl delete mode 100644 charts/btp/chronicle/charts/sawtooth/charts/standard-defs/templates/_lib.tpl delete mode 100644 charts/btp/chronicle/charts/sawtooth/charts/standard-defs/templates/_lib_image.tpl delete mode 100644 charts/btp/chronicle/charts/sawtooth/charts/standard-defs/templates/_lib_volumes.tpl delete mode 100644 charts/btp/chronicle/charts/sawtooth/charts/standard-defs/values.yaml delete mode 100644 charts/btp/chronicle/charts/sawtooth/sextant/details.yaml delete mode 100644 charts/btp/chronicle/charts/sawtooth/sextant/form.js delete mode 100644 charts/btp/chronicle/charts/sawtooth/sextant/options.js delete mode 100644 charts/btp/chronicle/charts/sawtooth/sextant/summary.js delete mode 100644 charts/btp/chronicle/charts/sawtooth/templates/NOTES.txt delete mode 100644 charts/btp/chronicle/charts/sawtooth/templates/_sawtooth.tpl delete mode 100644 charts/btp/chronicle/charts/sawtooth/templates/_sawtooth_containers.tpl delete mode 100644 charts/btp/chronicle/charts/sawtooth/templates/_utils.tpl delete mode 100644 charts/btp/chronicle/charts/sawtooth/templates/ingress.yaml delete mode 100644 charts/btp/chronicle/charts/sawtooth/templates/pernode-services.yaml delete mode 100644 charts/btp/chronicle/charts/sawtooth/templates/serviceaccount.yaml delete mode 100644 charts/btp/chronicle/charts/sawtooth/templates/validator-clusterroles.yaml delete mode 100644 charts/btp/chronicle/charts/sawtooth/templates/validator-env-configmap.yaml delete mode 100644 charts/btp/chronicle/charts/sawtooth/templates/validator-roles.yaml delete mode 100644 charts/btp/chronicle/charts/sawtooth/templates/validator-set.yaml delete mode 100644 charts/btp/chronicle/charts/sawtooth/templates/validators-svcs.yaml delete mode 100644 charts/btp/chronicle/charts/sawtooth/values.yaml delete mode 100644 charts/btp/chronicle/charts/standard-defs/Chart.lock delete mode 100644 charts/btp/chronicle/charts/standard-defs/Chart.yaml delete mode 100644 charts/btp/chronicle/charts/standard-defs/README.md delete mode 100644 charts/btp/chronicle/charts/standard-defs/charts/common/.helmignore delete mode 100644 charts/btp/chronicle/charts/standard-defs/charts/common/Chart.yaml delete mode 100644 charts/btp/chronicle/charts/standard-defs/charts/common/README.md delete mode 100644 charts/btp/chronicle/charts/standard-defs/charts/common/templates/_affinities.tpl delete mode 100644 charts/btp/chronicle/charts/standard-defs/charts/common/templates/_capabilities.tpl delete mode 100644 charts/btp/chronicle/charts/standard-defs/charts/common/templates/_errors.tpl delete mode 100644 charts/btp/chronicle/charts/standard-defs/charts/common/templates/_images.tpl delete mode 100644 charts/btp/chronicle/charts/standard-defs/charts/common/templates/_ingress.tpl delete mode 100644 charts/btp/chronicle/charts/standard-defs/charts/common/templates/_labels.tpl delete mode 100644 charts/btp/chronicle/charts/standard-defs/charts/common/templates/_names.tpl delete mode 100644 charts/btp/chronicle/charts/standard-defs/charts/common/templates/_secrets.tpl delete mode 100644 charts/btp/chronicle/charts/standard-defs/charts/common/templates/_storage.tpl delete mode 100644 charts/btp/chronicle/charts/standard-defs/charts/common/templates/_tplvalues.tpl delete mode 100644 charts/btp/chronicle/charts/standard-defs/charts/common/templates/_utils.tpl delete mode 100644 charts/btp/chronicle/charts/standard-defs/charts/common/templates/_warnings.tpl delete mode 100644 charts/btp/chronicle/charts/standard-defs/charts/common/templates/validations/_cassandra.tpl delete mode 100644 charts/btp/chronicle/charts/standard-defs/charts/common/templates/validations/_mariadb.tpl delete mode 100644 charts/btp/chronicle/charts/standard-defs/charts/common/templates/validations/_mongodb.tpl delete mode 100644 charts/btp/chronicle/charts/standard-defs/charts/common/templates/validations/_postgresql.tpl delete mode 100644 charts/btp/chronicle/charts/standard-defs/charts/common/templates/validations/_redis.tpl delete mode 100644 charts/btp/chronicle/charts/standard-defs/charts/common/templates/validations/_validations.tpl delete mode 100644 charts/btp/chronicle/charts/standard-defs/charts/common/values.yaml delete mode 100644 charts/btp/chronicle/charts/standard-defs/templates/_ingress.tpl delete mode 100644 charts/btp/chronicle/charts/standard-defs/templates/_lib.tpl delete mode 100644 charts/btp/chronicle/charts/standard-defs/templates/_lib_image.tpl delete mode 100644 charts/btp/chronicle/charts/standard-defs/templates/_lib_volumes.tpl delete mode 100644 charts/btp/chronicle/charts/standard-defs/values.yaml delete mode 100644 charts/btp/chronicle/questions.yaml delete mode 100644 charts/btp/chronicle/templates/_chronicle.tpl delete mode 100644 charts/btp/chronicle/templates/_utils.tpl delete mode 100644 charts/btp/chronicle/templates/chronicle-config.yaml delete mode 100644 charts/btp/chronicle/templates/chronicle-init.yaml delete mode 100644 charts/btp/chronicle/templates/chronicle-secret-volume.yaml delete mode 100644 charts/btp/chronicle/templates/id-provider-service.yaml delete mode 100644 charts/btp/chronicle/templates/id-provider-statefulset.yaml delete mode 100644 charts/btp/chronicle/templates/ingress.yaml delete mode 100644 charts/btp/chronicle/templates/pernode-opa-tp-service.yaml delete mode 100644 charts/btp/chronicle/templates/pernode-tp-service.yaml delete mode 100644 charts/btp/chronicle/templates/secrets-roles.yaml delete mode 100644 charts/btp/chronicle/templates/service.yaml delete mode 100644 charts/btp/chronicle/templates/serviceaccount.yaml delete mode 100644 charts/btp/chronicle/templates/statefulset.yaml delete mode 100644 charts/btp/chronicle/templates/test-token-getter-roles.yaml delete mode 100644 charts/btp/chronicle/templates/tests/api-test.yaml delete mode 100644 charts/btp/chronicle/templates/tp-service.yaml delete mode 100644 charts/btp/chronicle/templates/tp-statefulset.yaml delete mode 100644 charts/btp/chronicle/values.yaml delete mode 100644 packages/btp/chronicle/upstream.yaml diff --git a/assets/btp/chronicle-0.1.13.tgz b/assets/btp/chronicle-0.1.13.tgz deleted file mode 100644 index 2129837c4708aef28600e56013c6aac864723458..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51001 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 P00960RZW{S03-zfW@U># diff --git a/assets/btp/chronicle-0.1.15.tgz b/assets/btp/chronicle-0.1.15.tgz deleted file mode 100644 index 49f626a3e7090083b3278fc6841c08b4c2ea0bc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55301 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 EU!-kycCt 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 CS!|sE diff --git a/assets/btp/chronicle-0.1.18.tgz b/assets/btp/chronicle-0.1.18.tgz deleted file mode 100644 index b1c69bee577bb645fd3dfa21cb3c99bf4aa72a97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55750 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≥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 ae0jb+U!KSP{BHmN0RR7-yB&G}m<0g))MiTn diff --git a/assets/btp/chronicle-0.1.6.tgz b/assets/btp/chronicle-0.1.6.tgz deleted file mode 100644 index d6c0e636fb0ab3565484ca033b25a7d4b967233e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51216 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

X=h(9!e7j!O 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 diff --git a/charts/btp/chronicle/.helmignore b/charts/btp/chronicle/.helmignore deleted file mode 100644 index 0e8a0eb36..000000000 --- a/charts/btp/chronicle/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/charts/btp/chronicle/Chart.lock b/charts/btp/chronicle/Chart.lock deleted file mode 100644 index e5903bf68..000000000 --- a/charts/btp/chronicle/Chart.lock +++ /dev/null @@ -1,9 +0,0 @@ -dependencies: -- name: standard-defs - repository: https://btp-charts-stable.s3.amazonaws.com/charts/ - version: 0.1.3 -- name: sawtooth - repository: https://btp-charts-unstable.s3.amazonaws.com/charts/ - version: 0.2.12 -digest: sha256:780720dfac6408ac363acd252c6232b5a405368dda73dcbe3d2e208bbe0d75e8 -generated: "2023-06-01T16:05:51.598742033-04:00" diff --git a/charts/btp/chronicle/Chart.yaml b/charts/btp/chronicle/Chart.yaml deleted file mode 100644 index 6c3a6ba15..000000000 --- a/charts/btp/chronicle/Chart.yaml +++ /dev/null @@ -1,25 +0,0 @@ -annotations: - catalog.cattle.io/certified: partner - catalog.cattle.io/display-name: Chronicle - catalog.cattle.io/release-name: chronicle -apiVersion: v2 -appVersion: 0.7.3 -dependencies: -- name: standard-defs - repository: https://btp-charts-stable.s3.amazonaws.com/charts/ - version: ~0.1.0 -- name: sawtooth - repository: https://btp-charts-unstable.s3.amazonaws.com/charts/ - version: ~0.2.0 -description: 'Chronicle is an open-source, blockchain-backed, domain-agnostic provenance - product. Chronicle makes it easy for users to record and query immutable provenance - information on a distributed ledger - about any asset, in any domain, and across - multiple parties. ' -home: https://docs.btp.works/chronicle -icon: https://chronicle-resources.s3.amazonaws.com/icons/chronicle-transparent-bg-dark.png -keywords: -- provenance -- blockchain -name: chronicle -type: application -version: 0.1.18 diff --git a/charts/btp/chronicle/README.md b/charts/btp/chronicle/README.md deleted file mode 100644 index 9cb942032..000000000 --- a/charts/btp/chronicle/README.md +++ /dev/null @@ -1,60 +0,0 @@ -# Chronicle - -| field | description | default | -|-|-|-| -| `imagePullSecrets.enabled`| if true use the list of named imagePullSecrets | false | -| `imagePullSecrets.value`| a list if named secret references of the form `- name: secretName`| [] | -| `image.repository` | the repository of the image | blockchaintp/chronicle | -| `image.tag`| the tag of the image to use | latest | -| `image.pullPolicy` | the image pull policy to use | IfNotPresent | -| `logLevel` | log level for chronicle | info | -| `webUi` | If true serve the graphql playground interface | false | -| `replicas` | number of Chronicle replicas to run | 1 | -| `affinity`| custom affinity rules for the chronicle pod | {} | -| `extraVolumes` | a list of additional volumes to add to chronicle | [] | -| `extraVolumeMounts` | a list of additional volume mounts to add to chronicle | [] | -| `port` | the port on which the chronicle service listens | 9982 | -| `serviceAccount.create` | true to create a service account | false | -| `serviceAccount.name` | name of the service account | nil (defaults to based on release name) | -| `ingress.apiVersion` | if necessary the apiVersion of the ingress may be overridden | "" | -| `ingress.enabled` | true to enable the ingress to the main service rest-api | false | -| `ingress.certManager` | true to enable the acme certmanager for this ingress | false | -| `ingress.hostname` | primary hostname for the ingress | false | -| `ingress.path` | path for the ingress's primary hostname | / | -| `ingress.pathType` | pathType for the ingress's primary hostname | nil | -| `ingress.annotations` | annotations for the ingress | {} | -| `ingress.tls` | true to enable tls on the ingress with a secrete at hostname-tls | false | -| `ingress.extraHosts` | list of extra hosts to add to the ingress | [] | -| `ingress.extraPaths` | list of extra paths to add to the primary host of the ingress | [] | -| `ingress.extraTls` | list of extra tls entries | [] | -| `ingress.hosts`| list of ingress host and path declarations for the chronicle ingress| [] | -| `sawtooth` | sawtooth options may be configured | see [Sawtooth](../sawtooth/README.md) | -| `tp.args` | a string of arguments to pass to the tp container| nil | -| `tp.image.pullPolicy` | the image pull policy | IfNotPresent | -| `tp.image.repository` | the image repository | blockchaintp/chronicle-tp | -| `tp.image.tag` | the image tag | BTP2.1.0 | -| `tp.extraVolumes` | extra volumes declarations for the chronicle-tp deployment | list | nil -| `tp.extraVolumeMounts` | extra volume mounts for chronicle-tp deployment | list | nil -| `tp.resources` | resources | map | nil | -| `tp.maxUnavailable` | maximum unavailable nodes during a rolling upgrade | -| `tp.minReadySeconds` | minimum time before node becomes available | -| `postgres.enabled` | if true create an internal postgres instance | boolean | true | -| `postgres.env` | postgres environment variables | map | N/A | -| `postgres.image.repository` | postgres image repository | string | "postgres" | -| `postgres.image.tag` | postgres image tag | string | "11" | -| `postgres.user` | user for the postgres database | string | "postgres" | -| `postgres.host` | host for the postgres database | string | "localhost" | -| `postgres.database` | database for the postgres database | string | "postgres" | -| `postgres.port` | port for the postgres database | int | 5432 | -| `postgres.password` | password for the postgres database | string | "postgres" | -| `postgres.existingPasswordSecret` | name of a secret containing the postgres password | string | nil | -| `postgres.existingPasswordSecret` | name of the key in a secret containing the postgres password | string | nil | -| `postgres.tls` | postgres TLS configuration | string | nil | -| `postgres.persistence` | postgres persistence settings | map | N/A | -| `postgres.persistence.enabled` | if true allocate a PVC for the postgres instance | boolean | false | -| `postgres.persistence.annotations` | any custom annotations to the postgres PVC's | map | {} | -| `postgres.persistence.accessModes` | postgres PVC access modes | list | [ "ReadWriteOnce" ] | -| `postgres.persistence.storageClass` | postgres PVC storageClass | string | nil | -| `postgres.persistence.size` | postgres PVC volume size | string | "40Gi" | -| `postgres.resources` | resources | map | nil | -| `resources` | resources | map | nil | diff --git a/charts/btp/chronicle/app-readme.md b/charts/btp/chronicle/app-readme.md deleted file mode 100644 index eb862a2fa..000000000 --- a/charts/btp/chronicle/app-readme.md +++ /dev/null @@ -1,12 +0,0 @@ -Chronicle records provenance information of any physical or digital asset on a distributed ledger. - -- Chronicle is available with Hyperledger Sawtooth as its default backing ledger. -- Chronicle is built on the established W3C PROV Ontology standard; it uses the lightweight JSON-LD linked data format, and the data query language GraphQL. -- Chronicle is easily adaptable to enable users to model, capture, and query provenance information pertinent to their industry, application and use case. - -You can find example domains and further instructions at https://examples.btp.works - -## *Important* - -*As Chronicle uses Sawtooth as its backing ledger, a minimum of 4 nodes is required for deployment.* -*This helm chart will deploy and configure a 4 node Sawtooth network on your target cluster, so less than 4 nodes will result in the deployment failing.* diff --git a/charts/btp/chronicle/charts/sawtooth/.helmignore b/charts/btp/chronicle/charts/sawtooth/.helmignore deleted file mode 100644 index 98229532e..000000000 --- a/charts/btp/chronicle/charts/sawtooth/.helmignore +++ /dev/null @@ -1,25 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ - -tests/ diff --git a/charts/btp/chronicle/charts/sawtooth/Chart.lock b/charts/btp/chronicle/charts/sawtooth/Chart.lock deleted file mode 100644 index 9e49e2c92..000000000 --- a/charts/btp/chronicle/charts/sawtooth/Chart.lock +++ /dev/null @@ -1,6 +0,0 @@ -dependencies: -- name: standard-defs - repository: https://btp-charts-stable.s3.amazonaws.com/charts/ - version: 0.1.2 -digest: sha256:b072a3f7726bb97088f486103c12d3c8c01d81b31e72bd972b93fbd61f4adb85 -generated: "2021-10-09T05:31:04.138943048Z" diff --git a/charts/btp/chronicle/charts/sawtooth/Chart.yaml b/charts/btp/chronicle/charts/sawtooth/Chart.yaml deleted file mode 100644 index 11b905803..000000000 --- a/charts/btp/chronicle/charts/sawtooth/Chart.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: v2 -appVersion: 1.2.5p4 -dependencies: -- name: standard-defs - repository: https://btp-charts-stable.s3.amazonaws.com/charts/ - version: ~0.1.0 -description: BTP's Sawtooth distribution based on Hyperledger Sawtooth 1.2 -name: sawtooth -type: application -version: 0.2.12 diff --git a/charts/btp/chronicle/charts/sawtooth/README.md b/charts/btp/chronicle/charts/sawtooth/README.md deleted file mode 100644 index 124e1ea70..000000000 --- a/charts/btp/chronicle/charts/sawtooth/README.md +++ /dev/null @@ -1,96 +0,0 @@ -# Sawtoooth - -| field | description | default | -|-|-|-| -| `affinity.enabled` | false: no effect true: then validators will be deployed only to k8s nodes with the label `app={{ .sawtooth.networkName }}-validator` | false | -| `commonLabels` | -| `imagePullSecrets.enabled` | if true use the list of named imagePullSecrets | false | -| `imagePullSecrets.value` | a list if named secret references of the form ```- name: secretName```| [] | -| `ingress.apiVersion` | if necessary the apiVersion of the ingress may be overridden | "" | -| `ingress.enabled` | true to enable the ingress to the main service rest-api | false | -| `ingress.certManager` | true to enable the acme certmanager for this ingress | false | -| `ingress.hostname` | primary hostname for the ingress | false | -| `ingress.path` | path for the ingress's primary hostname | / | -| `ingress.pathType` | pathType for the ingress's primary hostname | nil | -| `ingress.annotations` | annotations for the ingress | {} | -| `ingress.tls` | true to enable tls on the ingress with a secrete at hostname-tls | false | -| `ingress.extraHosts` | list of extra hosts to add to the ingress | [] | -| `ingress.extraPaths` | list of extra paths to add to the primary host of the ingress | [] | -| `ingress.extraTls` | list of extra tls entries | [] | -| `pagerduty.enabled` | if true send pagerduty alerts | false | -| `pagerduty.token` | pagerduty user token | nil | -| `pagerduty.serviceid` | pagerduty serviceid | nil | -| `sawtooth.opentsdb.db` | name of the opentsdb database to be used | metrics | -| `sawtooth.opentsdb.url` | url of the opentsdb database to be used | nil | -| `sawtooth.opentsdb.enabled` | whether to enable the opentsdb metrics | false | -| `sawtooth.minReadySeconds` | the minimum time a pod must be Running before proceeding on a rolling update | 120 | -| `sawtooth.maxUnavailable` | maximum number of pods allowed down on a rollout or update | 1 | -| `sawtooth.containers.block_info.args` | extra args for block-info-tp | nil | -| `sawtooth.containers.identity_tp.args` | extra args for identity-tp | nil | -| `sawtooth.containers.rest_api.args` | extra args for rest-api | nil | -| `sawtooth.containers.settings_tp.args` | extra args for settings-tp | nil | -| `sawtooth.containers.validator.args` | extra args for validator | nil | -| `sawtooth.containers.validator.env` | list of environment name/value dicts | nil | -| `sawtooth.ports.sawnet` | port for the sawtooth validator network | 8800 | -| `sawtooth.ports.consensus` | port for the sawtooth consensus network | 5050 | -| `sawtooth.ports.sawcomp` | port for the sawtooth component network | 4004 | -| `sawtooth.ports.rest` | port for the sawtooth rest-api | 8008 | -| `sawtooth.livenessProbe.enabled` | whether to run the livenessProbe on the validator | false | -| `sawtooth.livenessProbe.initialDelaySeconds` | seconds to wait before running the liveness probe the first time | 300 | -| `sawtooth.livenessProbe.periodSeconds` | interval in seconds to re-run the liveness probe | 120 | -| `sawtooth.livenessProbe.active` | if false, the liveness probe will run and evaluate the the situation, but always return successfully | string | "false" -| `sawtooth.livenessProbe.exitSignals` | when restarting due to a livenessProbe failure, the validator pod has a "signal" system which will cause it to restart the named containers in this var | "block-info-tp" | -| `sawtooth.heartbeat.interval` | interval in seconds to issue a heartbeat | 300 | -| `sawtooth.permissioned` | Whether to run this chain as a permissioned chain or not | false | -| `sawtooth.namespace` | namespace to render these templates into (deprecated) | "prod" | -| `sawtooth.networkName` | name of this sawtooth network (deprecated) | "mynetwork" | -| `sawtooth.scheduler` | name of the sawtooth transaction scheduler to use | string | "serial" -| `sawtooth.consensus` | id of the the consensus algorithm to use< valid values: 100:DevMode, 200, PoET, 300 - Raft, 400, PBFT | int | 200 -| `sawtooth.genesis.enabled` | If true, and the cluster is starting for the first time, then a node will be selected to create and submit the genesis block | true | -| `sawtooth.genesis.seed` | The seed is an arbitrary string which identifies a given genesis If the data of a given set of nodes is to be wiped out, change this value. | "9a2de774-90b5-11e9-9df0-87e889b0f1c9" | -| `sawtooth.dynamicPeering` | Dynamic Peering should default to false, since it is a bit unreliable | false | -| `sawtooth.externalSeeds` | a list of maps defining validator endpoints external to this deployment | [] | -| `sawtooth.seth.enabled` | enabled sawtooth-seth | false | -| `sawtooth.xo.enabled` | enabled sawtooth-xo-tp | false | -| `sawtooth.smallbank.enabled` | enabled sawtooth-smallbank-tp | false | -| `sawtooth.hostPathBaseDir` | all sawtooth hostPath directories will be based here | string | /var/lib/btp -| `sawtooth.client_wait` | arbitrary delay to validator client startup, such as the rest-api | 90 | -| `sawtooth.customTPs` | a list of [custom tp definitions](#custom-tp-definitions) | nil | -| `sawtooth.affinity` | custom affinity rules for the sawtooth validator deamonset | nil | -| `images` | a map containing all of the image urls used by this template| N/A | - -## Images - -| field | default | -|- |- | -| `images.devmode_engine` | blockchaintp/sawtooth-devmode-engine-rust:BTP2.1.0 -| `images.pbft_engine` | blockchaintp/sawtooth-pbft-engine:BTP2.1.0 -| `images.poet_cli` | blockchaintp/sawtooth-poet-cli:BTP2.1.0 -| `images.poet_engine` | blockchaintp/sawtooth-poet-engine:BTP2.1.0 -| `images.poet_validator_registry_tp` | blockchaintp/sawtooth-poet-validator-registry-tp:BTP2.1.0 -| `images.raft_engine` | blockchaintp/sawtooth-raft-engine:BTP2.1.0 -| `images.block_info_tp` | blockchaintp/sawtooth-block-info-tp:BTP2.1.0 -| `images.identity_tp` | blockchaintp/sawtooth-identity-tp:BTP2.1.0 -| `images.intkey_tp` | blockchaintp/sawtooth-intkey-tp-go:BTP2.1.0 -| `images.settings_tp` | blockchaintp/sawtooth-settings-tp:BTP2.1.0 -| `images.shell` | blockchaintp/sawtooth-shell:BTP2.1.0 -| `images.smallbank_tp` | blockchaintp/sawtooth-smallbank-tp-go:BTP2.1.0 -| `images.validator` | blockchaintp/sawtooth-validator:BTP2.1.0 -| `images.xo_tp` | blockchaintp/sawtooth-xo-tp-go:BTP2.1.0 -| `images.rest_api` | blockchaintp/sawtooth-rest-api:BTP2.1.0 -| `images.seth_rpc` | blockchaintp/sawtooth-seth-rpc:BTP2.1.0 -| `images.seth_tp` | blockchaintp/sawtooth-seth-tp:BTP2.1.0 -| `images.xo_demo` | blockchaintp/xo-demo:BTP2.1.0 - -## Custom TP Definitions - -Custom TP definitions are describe using maps with the following fields - -| field | description | default | -|-|-|-| -| `name` | name of the custom tp container(must be unique within the pod) | nil | -| `image` | url of the image for this tp | nil | -| `command` | list of command tokens for this tp | list | nil -| `arg` | list of arguments to the command | nil] | -| `extraVolumes` | a list of additional volumes to add to all StatefulSets, Deployments, and DaemonSets | `[]` | -| `extraVolumeMounts` | a list of additional volume mounts to add to all StatefulSet, Deployment, and DaemonSet containers | `[]` | diff --git a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/Chart.lock b/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/Chart.lock deleted file mode 100644 index 3c1618aee..000000000 --- a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/Chart.lock +++ /dev/null @@ -1,6 +0,0 @@ -dependencies: -- name: common - repository: https://charts.bitnami.com/bitnami - version: 1.8.0 -digest: sha256:4b6f60ea1981a1b98332e0149289002fe0f9ebf401de1ec19c8baaaf6b0d4b88 -generated: "2021-09-02T01:05:15.012803203Z" diff --git a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/Chart.yaml b/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/Chart.yaml deleted file mode 100644 index 38a35afb0..000000000 --- a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/Chart.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: v2 -appVersion: 0.1.0 -dependencies: -- name: common - repository: https://charts.bitnami.com/bitnami - version: ~1.8.0 -description: BTP Standard Template definitions and dependencies -name: standard-defs -type: library -version: 0.1.2 diff --git a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/README.md b/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/README.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/.helmignore b/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/.helmignore deleted file mode 100644 index 50af03172..000000000 --- a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/.helmignore +++ /dev/null @@ -1,22 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/Chart.yaml b/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/Chart.yaml deleted file mode 100644 index 344c40384..000000000 --- a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/Chart.yaml +++ /dev/null @@ -1,23 +0,0 @@ -annotations: - category: Infrastructure -apiVersion: v2 -appVersion: 1.8.0 -description: A Library Helm Chart for grouping common logic between bitnami charts. - This chart is not deployable by itself. -home: https://github.com/bitnami/charts/tree/master/bitnami/common -icon: https://bitnami.com/downloads/logos/bitnami-mark.png -keywords: -- common -- helper -- template -- function -- bitnami -maintainers: -- email: containers@bitnami.com - name: Bitnami -name: common -sources: -- https://github.com/bitnami/charts -- http://www.bitnami.com/ -type: library -version: 1.8.0 diff --git a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/README.md b/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/README.md deleted file mode 100644 index 054e51f96..000000000 --- a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/README.md +++ /dev/null @@ -1,327 +0,0 @@ -# Bitnami Common Library Chart - -A [Helm Library Chart](https://helm.sh/docs/topics/library_charts/#helm) for grouping common logic between bitnami charts. - -## TL;DR - -```yaml -dependencies: - - name: common - version: 0.x.x - repository: https://charts.bitnami.com/bitnami -``` - -```bash -$ helm dependency update -``` - -```yaml -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "common.names.fullname" . }} -data: - myvalue: "Hello World" -``` - -## Introduction - -This chart provides a common template helpers which can be used to develop new charts using [Helm](https://helm.sh) package manager. - -Bitnami charts can be used with [Kubeapps](https://kubeapps.com/) for deployment and management of Helm Charts in clusters. This Helm chart has been tested on top of [Bitnami Kubernetes Production Runtime](https://kubeprod.io/) (BKPR). Deploy BKPR to get automated TLS certificates, logging and monitoring for your applications. - -## Prerequisites - -- Kubernetes 1.12+ -- Helm 3.1.0 - -## Parameters - -The following table lists the helpers available in the library which are scoped in different sections. - -### Affinities - -| Helper identifier | Description | Expected Input | -|-------------------------------|------------------------------------------------------|------------------------------------------------| -| `common.affinities.node.soft` | Return a soft nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` | -| `common.affinities.node.hard` | Return a hard nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` | -| `common.affinities.pod.soft` | Return a soft podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` | -| `common.affinities.pod.hard` | Return a hard podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` | - -### Capabilities - -| Helper identifier | Description | Expected Input | -|----------------------------------------------|------------------------------------------------------------------------------------------------|-------------------| -| `common.capabilities.kubeVersion` | Return the target Kubernetes version (using client default if .Values.kubeVersion is not set). | `.` Chart context | -| `common.capabilities.cronjob.apiVersion` | Return the appropriate apiVersion for cronjob. | `.` Chart context | -| `common.capabilities.deployment.apiVersion` | Return the appropriate apiVersion for deployment. | `.` Chart context | -| `common.capabilities.statefulset.apiVersion` | Return the appropriate apiVersion for statefulset. | `.` Chart context | -| `common.capabilities.ingress.apiVersion` | Return the appropriate apiVersion for ingress. | `.` Chart context | -| `common.capabilities.rbac.apiVersion` | Return the appropriate apiVersion for RBAC resources. | `.` Chart context | -| `common.capabilities.crd.apiVersion` | Return the appropriate apiVersion for CRDs. | `.` Chart context | -| `common.capabilities.policy.apiVersion` | Return the appropriate apiVersion for policy | `.` Chart context | -| `common.capabilities.supportsHelmVersion` | Returns true if the used Helm version is 3.3+ | `.` Chart context | - -### Errors - -| Helper identifier | Description | Expected Input | -|-----------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------| -| `common.errors.upgrade.passwords.empty` | It will ensure required passwords are given when we are upgrading a chart. If `validationErrors` is not empty it will throw an error and will stop the upgrade action. | `dict "validationErrors" (list $validationError00 $validationError01) "context" $` | - -### Images - -| Helper identifier | Description | Expected Input | -|-----------------------------|------------------------------------------------------|---------------------------------------------------------------------------------------------------------| -| `common.images.image` | Return the proper and full image name | `dict "imageRoot" .Values.path.to.the.image "global" $`, see [ImageRoot](#imageroot) for the structure. | -| `common.images.pullSecrets` | Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global` | -| `common.images.renderPullSecrets` | Return the proper Docker Image Registry Secret Names (evaluates values as templates) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $` | - -### Ingress - -| Helper identifier | Description | Expected Input | -|-------------------------------------------|----------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `common.ingress.backend` | Generate a proper Ingress backend entry depending on the API version | `dict "serviceName" "foo" "servicePort" "bar"`, see the [Ingress deprecation notice](https://kubernetes.io/blog/2019/07/18/api-deprecations-in-1-16/) for the syntax differences | -| `common.ingress.supportsPathType` | Prints "true" if the pathType field is supported | `.` Chart context | -| `common.ingress.supportsIngressClassname` | Prints "true" if the ingressClassname field is supported | `.` Chart context | - -### Labels - -| Helper identifier | Description | Expected Input | -|-----------------------------|------------------------------------------------------|-------------------| -| `common.labels.standard` | Return Kubernetes standard labels | `.` Chart context | -| `common.labels.matchLabels` | Return the proper Docker Image Registry Secret Names | `.` Chart context | - -### Names - -| Helper identifier | Description | Expected Inpput | -|-------------------------|------------------------------------------------------------|-------------------| -| `common.names.name` | Expand the name of the chart or use `.Values.nameOverride` | `.` Chart context | -| `common.names.fullname` | Create a default fully qualified app name. | `.` Chart context | -| `common.names.chart` | Chart name plus version | `.` Chart context | - -### Secrets - -| Helper identifier | Description | Expected Input | -|---------------------------|--------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `common.secrets.name` | Generate the name of the secret. | `dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $` see [ExistingSecret](#existingsecret) for the structure. | -| `common.secrets.key` | Generate secret key. | `dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName"` see [ExistingSecret](#existingsecret) for the structure. | -| `common.passwords.manage` | Generate secret password or retrieve one if already created. | `dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $`, length, strong and chartNAme fields are optional. | -| `common.secrets.exists` | Returns whether a previous generated secret already exists. | `dict "secret" "secret-name" "context" $` | - -### Storage - -| Helper identifier | Description | Expected Input | -|-------------------------------|---------------------------------------|---------------------------------------------------------------------------------------------------------------------| -| `common.affinities.node.soft` | Return a soft nodeAffinity definition | `dict "persistence" .Values.path.to.the.persistence "global" $`, see [Persistence](#persistence) for the structure. | - -### TplValues - -| Helper identifier | Description | Expected Input | -|---------------------------|----------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------| -| `common.tplvalues.render` | Renders a value that contains template | `dict "value" .Values.path.to.the.Value "context" $`, value is the value should rendered as template, context frequently is the chart context `$` or `.` | - -### Utils - -| Helper identifier | Description | Expected Input | -|--------------------------------|------------------------------------------------------------------------------------------|------------------------------------------------------------------------| -| `common.utils.fieldToEnvVar` | Build environment variable name given a field. | `dict "field" "my-password"` | -| `common.utils.secret.getvalue` | Print instructions to get a secret value. | `dict "secret" "secret-name" "field" "secret-value-field" "context" $` | -| `common.utils.getValueFromKey` | Gets a value from `.Values` object given its key path | `dict "key" "path.to.key" "context" $` | -| `common.utils.getKeyFromList` | Returns first `.Values` key with a defined value or first of the list if all non-defined | `dict "keys" (list "path.to.key1" "path.to.key2") "context" $` | - -### Validations - -| Helper identifier | Description | Expected Input | -|--------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `common.validations.values.single.empty` | Validate a value must not be empty. | `dict "valueKey" "path.to.value" "secret" "secret.name" "field" "my-password" "subchart" "subchart" "context" $` secret, field and subchart are optional. In case they are given, the helper will generate a how to get instruction. See [ValidateValue](#validatevalue) | -| `common.validations.values.multiple.empty` | Validate a multiple values must not be empty. It returns a shared error for all the values. | `dict "required" (list $validateValueConf00 $validateValueConf01) "context" $`. See [ValidateValue](#validatevalue) | -| `common.validations.values.mariadb.passwords` | This helper will ensure required password for MariaDB are not empty. It returns a shared error for all the values. | `dict "secret" "mariadb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mariadb chart and the helper. | -| `common.validations.values.postgresql.passwords` | This helper will ensure required password for PostgreSQL are not empty. It returns a shared error for all the values. | `dict "secret" "postgresql-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use postgresql chart and the helper. | -| `common.validations.values.redis.passwords` | This helper will ensure required password for Redis™ are not empty. It returns a shared error for all the values. | `dict "secret" "redis-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use redis chart and the helper. | -| `common.validations.values.cassandra.passwords` | This helper will ensure required password for Cassandra are not empty. It returns a shared error for all the values. | `dict "secret" "cassandra-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use cassandra chart and the helper. | -| `common.validations.values.mongodb.passwords` | This helper will ensure required password for MongoDB® are not empty. It returns a shared error for all the values. | `dict "secret" "mongodb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mongodb chart and the helper. | - -### Warnings - -| Helper identifier | Description | Expected Input | -|------------------------------|----------------------------------|------------------------------------------------------------| -| `common.warnings.rollingTag` | Warning about using rolling tag. | `ImageRoot` see [ImageRoot](#imageroot) for the structure. | - -## Special input schemas - -### ImageRoot - -```yaml -registry: - type: string - description: Docker registry where the image is located - example: docker.io - -repository: - type: string - description: Repository and image name - example: bitnami/nginx - -tag: - type: string - description: image tag - example: 1.16.1-debian-10-r63 - -pullPolicy: - type: string - description: Specify a imagePullPolicy. Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' - -pullSecrets: - type: array - items: - type: string - description: Optionally specify an array of imagePullSecrets (evaluated as templates). - -debug: - type: boolean - description: Set to true if you would like to see extra information on logs - example: false - -## An instance would be: -# registry: docker.io -# repository: bitnami/nginx -# tag: 1.16.1-debian-10-r63 -# pullPolicy: IfNotPresent -# debug: false -``` - -### Persistence - -```yaml -enabled: - type: boolean - description: Whether enable persistence. - example: true - -storageClass: - type: string - description: Ghost data Persistent Volume Storage Class, If set to "-", storageClassName: "" which disables dynamic provisioning. - example: "-" - -accessMode: - type: string - description: Access mode for the Persistent Volume Storage. - example: ReadWriteOnce - -size: - type: string - description: Size the Persistent Volume Storage. - example: 8Gi - -path: - type: string - description: Path to be persisted. - example: /bitnami - -## An instance would be: -# enabled: true -# storageClass: "-" -# accessMode: ReadWriteOnce -# size: 8Gi -# path: /bitnami -``` - -### ExistingSecret - -```yaml -name: - type: string - description: Name of the existing secret. - example: mySecret -keyMapping: - description: Mapping between the expected key name and the name of the key in the existing secret. - type: object - -## An instance would be: -# name: mySecret -# keyMapping: -# password: myPasswordKey -``` - -#### Example of use - -When we store sensitive data for a deployment in a secret, some times we want to give to users the possibility of using theirs existing secrets. - -```yaml -# templates/secret.yaml ---- -apiVersion: v1 -kind: Secret -metadata: - name: {{ include "common.names.fullname" . }} - labels: - app: {{ include "common.names.fullname" . }} -type: Opaque -data: - password: {{ .Values.password | b64enc | quote }} - -# templates/dpl.yaml ---- -... - env: - - name: PASSWORD - valueFrom: - secretKeyRef: - name: {{ include "common.secrets.name" (dict "existingSecret" .Values.existingSecret "context" $) }} - key: {{ include "common.secrets.key" (dict "existingSecret" .Values.existingSecret "key" "password") }} -... - -# values.yaml ---- -name: mySecret -keyMapping: - password: myPasswordKey -``` - -### ValidateValue - -#### NOTES.txt - -```console -{{- $validateValueConf00 := (dict "valueKey" "path.to.value00" "secret" "secretName" "field" "password-00") -}} -{{- $validateValueConf01 := (dict "valueKey" "path.to.value01" "secret" "secretName" "field" "password-01") -}} - -{{ include "common.validations.values.multiple.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} -``` - -If we force those values to be empty we will see some alerts - -```console -$ helm install test mychart --set path.to.value00="",path.to.value01="" - 'path.to.value00' must not be empty, please add '--set path.to.value00=$PASSWORD_00' to the command. To get the current value: - - export PASSWORD_00=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-00}" | base64 --decode) - - 'path.to.value01' must not be empty, please add '--set path.to.value01=$PASSWORD_01' to the command. To get the current value: - - export PASSWORD_01=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-01}" | base64 --decode) -``` - -## Upgrading - -### To 1.0.0 - -[On November 13, 2020, Helm v2 support was formally finished](https://github.com/helm/charts#status-of-the-project), this major version is the result of the required changes applied to the Helm Chart to be able to incorporate the different features added in Helm v3 and to be consistent with the Helm project itself regarding the Helm v2 EOL. - -**What changes were introduced in this major version?** - -- Previous versions of this Helm Chart use `apiVersion: v1` (installable by both Helm 2 and 3), this Helm Chart was updated to `apiVersion: v2` (installable by Helm 3 only). [Here](https://helm.sh/docs/topics/charts/#the-apiversion-field) you can find more information about the `apiVersion` field. -- Use `type: library`. [Here](https://v3.helm.sh/docs/faq/#library-chart-support) you can find more information. -- The different fields present in the *Chart.yaml* file has been ordered alphabetically in a homogeneous way for all the Bitnami Helm Charts - -**Considerations when upgrading to this version** - -- If you want to upgrade to this version from a previous one installed with Helm v3, you shouldn't face any issues -- If you want to upgrade to this version using Helm v2, this scenario is not supported as this version doesn't support Helm v2 anymore -- If you installed the previous version with Helm v2 and wants to upgrade to this version with Helm v3, please refer to the [official Helm documentation](https://helm.sh/docs/topics/v2_v3_migration/#migration-use-cases) about migrating from Helm v2 to v3 - -**Useful links** - -- https://docs.bitnami.com/tutorials/resolve-helm2-helm3-post-migration-issues/ -- https://helm.sh/docs/topics/v2_v3_migration/ -- https://helm.sh/blog/migrate-from-helm-v2-to-helm-v3/ diff --git a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_affinities.tpl b/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_affinities.tpl deleted file mode 100644 index 189ea403d..000000000 --- a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_affinities.tpl +++ /dev/null @@ -1,102 +0,0 @@ -{{/* vim: set filetype=mustache: */}} - -{{/* -Return a soft nodeAffinity definition -{{ include "common.affinities.nodes.soft" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.nodes.soft" -}} -preferredDuringSchedulingIgnoredDuringExecution: - - preference: - matchExpressions: - - key: {{ .key }} - operator: In - values: - {{- range .values }} - - {{ . | quote }} - {{- end }} - weight: 1 -{{- end -}} - -{{/* -Return a hard nodeAffinity definition -{{ include "common.affinities.nodes.hard" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.nodes.hard" -}} -requiredDuringSchedulingIgnoredDuringExecution: - nodeSelectorTerms: - - matchExpressions: - - key: {{ .key }} - operator: In - values: - {{- range .values }} - - {{ . | quote }} - {{- end }} -{{- end -}} - -{{/* -Return a nodeAffinity definition -{{ include "common.affinities.nodes" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.nodes" -}} - {{- if eq .type "soft" }} - {{- include "common.affinities.nodes.soft" . -}} - {{- else if eq .type "hard" }} - {{- include "common.affinities.nodes.hard" . -}} - {{- end -}} -{{- end -}} - -{{/* -Return a soft podAffinity/podAntiAffinity definition -{{ include "common.affinities.pods.soft" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}} -*/}} -{{- define "common.affinities.pods.soft" -}} -{{- $component := default "" .component -}} -{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} -preferredDuringSchedulingIgnoredDuringExecution: - - podAffinityTerm: - labelSelector: - matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 10 }} - {{- if not (empty $component) }} - {{ printf "app.kubernetes.io/component: %s" $component }} - {{- end }} - {{- range $key, $value := $extraMatchLabels }} - {{ $key }}: {{ $value | quote }} - {{- end }} - namespaces: - - {{ .context.Release.Namespace | quote }} - topologyKey: kubernetes.io/hostname - weight: 1 -{{- end -}} - -{{/* -Return a hard podAffinity/podAntiAffinity definition -{{ include "common.affinities.pods.hard" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}} -*/}} -{{- define "common.affinities.pods.hard" -}} -{{- $component := default "" .component -}} -{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} -requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 8 }} - {{- if not (empty $component) }} - {{ printf "app.kubernetes.io/component: %s" $component }} - {{- end }} - {{- range $key, $value := $extraMatchLabels }} - {{ $key }}: {{ $value | quote }} - {{- end }} - namespaces: - - {{ .context.Release.Namespace | quote }} - topologyKey: kubernetes.io/hostname -{{- end -}} - -{{/* -Return a podAffinity/podAntiAffinity definition -{{ include "common.affinities.pods" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.pods" -}} - {{- if eq .type "soft" }} - {{- include "common.affinities.pods.soft" . -}} - {{- else if eq .type "hard" }} - {{- include "common.affinities.pods.hard" . -}} - {{- end -}} -{{- end -}} diff --git a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_capabilities.tpl b/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_capabilities.tpl deleted file mode 100644 index ae45d5e35..000000000 --- a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_capabilities.tpl +++ /dev/null @@ -1,117 +0,0 @@ -{{/* vim: set filetype=mustache: */}} - -{{/* -Return the target Kubernetes version -*/}} -{{- define "common.capabilities.kubeVersion" -}} -{{- if .Values.global }} - {{- if .Values.global.kubeVersion }} - {{- .Values.global.kubeVersion -}} - {{- else }} - {{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} - {{- end -}} -{{- else }} -{{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for policy. -*/}} -{{- define "common.capabilities.policy.apiVersion" -}} -{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "policy/v1beta1" -}} -{{- else -}} -{{- print "policy/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for cronjob. -*/}} -{{- define "common.capabilities.cronjob.apiVersion" -}} -{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "batch/v1beta1" -}} -{{- else -}} -{{- print "batch/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for deployment. -*/}} -{{- define "common.capabilities.deployment.apiVersion" -}} -{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else -}} -{{- print "apps/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for statefulset. -*/}} -{{- define "common.capabilities.statefulset.apiVersion" -}} -{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "apps/v1beta1" -}} -{{- else -}} -{{- print "apps/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for ingress. -*/}} -{{- define "common.capabilities.ingress.apiVersion" -}} -{{- if .Values.ingress -}} -{{- if .Values.ingress.apiVersion -}} -{{- .Values.ingress.apiVersion -}} -{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "networking.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "networking.k8s.io/v1" -}} -{{- end }} -{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "networking.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "networking.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for RBAC resources. -*/}} -{{- define "common.capabilities.rbac.apiVersion" -}} -{{- if semverCompare "<1.17-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "rbac.authorization.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "rbac.authorization.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for CRDs. -*/}} -{{- define "common.capabilities.crd.apiVersion" -}} -{{- if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "apiextensions.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "apiextensions.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Returns true if the used Helm version is 3.3+. -A way to check the used Helm version was not introduced until version 3.3.0 with .Capabilities.HelmVersion, which contains an additional "{}}" structure. -This check is introduced as a regexMatch instead of {{ if .Capabilities.HelmVersion }} because checking for the key HelmVersion in <3.3 results in a "interface not found" error. -**To be removed when the catalog's minimun Helm version is 3.3** -*/}} -{{- define "common.capabilities.supportsHelmVersion" -}} -{{- if regexMatch "{(v[0-9])*[^}]*}}$" (.Capabilities | toString ) }} - {{- true -}} -{{- end -}} -{{- end -}} diff --git a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_errors.tpl b/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_errors.tpl deleted file mode 100644 index a79cc2e32..000000000 --- a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_errors.tpl +++ /dev/null @@ -1,23 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Through error when upgrading using empty passwords values that must not be empty. - -Usage: -{{- $validationError00 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password00" "secret" "secretName" "field" "password-00") -}} -{{- $validationError01 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password01" "secret" "secretName" "field" "password-01") -}} -{{ include "common.errors.upgrade.passwords.empty" (dict "validationErrors" (list $validationError00 $validationError01) "context" $) }} - -Required password params: - - validationErrors - String - Required. List of validation strings to be return, if it is empty it won't throw error. - - context - Context - Required. Parent context. -*/}} -{{- define "common.errors.upgrade.passwords.empty" -}} - {{- $validationErrors := join "" .validationErrors -}} - {{- if and $validationErrors .context.Release.IsUpgrade -}} - {{- $errorString := "\nPASSWORDS ERROR: You must provide your current passwords when upgrading the release." -}} - {{- $errorString = print $errorString "\n Note that even after reinstallation, old credentials may be needed as they may be kept in persistent volume claims." -}} - {{- $errorString = print $errorString "\n Further information can be obtained at https://docs.bitnami.com/general/how-to/troubleshoot-helm-chart-issues/#credential-errors-while-upgrading-chart-releases" -}} - {{- $errorString = print $errorString "\n%s" -}} - {{- printf $errorString $validationErrors | fail -}} - {{- end -}} -{{- end -}} diff --git a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_images.tpl b/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_images.tpl deleted file mode 100644 index 42ffbc722..000000000 --- a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_images.tpl +++ /dev/null @@ -1,75 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Return the proper image name -{{ include "common.images.image" ( dict "imageRoot" .Values.path.to.the.image "global" $) }} -*/}} -{{- define "common.images.image" -}} -{{- $registryName := .imageRoot.registry -}} -{{- $repositoryName := .imageRoot.repository -}} -{{- $tag := .imageRoot.tag | toString -}} -{{- if .global }} - {{- if .global.imageRegistry }} - {{- $registryName = .global.imageRegistry -}} - {{- end -}} -{{- end -}} -{{- if $registryName }} -{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}} -{{- else -}} -{{- printf "%s:%s" $repositoryName $tag -}} -{{- end -}} -{{- end -}} - -{{/* -Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) -{{ include "common.images.pullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global) }} -*/}} -{{- define "common.images.pullSecrets" -}} - {{- $pullSecrets := list }} - - {{- if .global }} - {{- range .global.imagePullSecrets -}} - {{- $pullSecrets = append $pullSecrets . -}} - {{- end -}} - {{- end -}} - - {{- range .images -}} - {{- range .pullSecrets -}} - {{- $pullSecrets = append $pullSecrets . -}} - {{- end -}} - {{- end -}} - - {{- if (not (empty $pullSecrets)) }} -imagePullSecrets: - {{- range $pullSecrets }} - - name: {{ . }} - {{- end }} - {{- end }} -{{- end -}} - -{{/* -Return the proper Docker Image Registry Secret Names evaluating values as templates -{{ include "common.images.renderPullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $) }} -*/}} -{{- define "common.images.renderPullSecrets" -}} - {{- $pullSecrets := list }} - {{- $context := .context }} - - {{- if $context.Values.global }} - {{- range $context.Values.global.imagePullSecrets -}} - {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} - {{- end -}} - {{- end -}} - - {{- range .images -}} - {{- range .pullSecrets -}} - {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} - {{- end -}} - {{- end -}} - - {{- if (not (empty $pullSecrets)) }} -imagePullSecrets: - {{- range $pullSecrets }} - - name: {{ . }} - {{- end }} - {{- end }} -{{- end -}} diff --git a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_ingress.tpl b/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_ingress.tpl deleted file mode 100644 index f905f2005..000000000 --- a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_ingress.tpl +++ /dev/null @@ -1,55 +0,0 @@ -{{/* vim: set filetype=mustache: */}} - -{{/* -Generate backend entry that is compatible with all Kubernetes API versions. - -Usage: -{{ include "common.ingress.backend" (dict "serviceName" "backendName" "servicePort" "backendPort" "context" $) }} - -Params: - - serviceName - String. Name of an existing service backend - - servicePort - String/Int. Port name (or number) of the service. It will be translated to different yaml depending if it is a string or an integer. - - context - Dict - Required. The context for the template evaluation. -*/}} -{{- define "common.ingress.backend" -}} -{{- $apiVersion := (include "common.capabilities.ingress.apiVersion" .context) -}} -{{- if or (eq $apiVersion "extensions/v1beta1") (eq $apiVersion "networking.k8s.io/v1beta1") -}} -serviceName: {{ .serviceName }} -servicePort: {{ .servicePort }} -{{- else -}} -service: - name: {{ .serviceName }} - port: - {{- if typeIs "string" .servicePort }} - name: {{ .servicePort }} - {{- else if or (typeIs "int" .servicePort) (typeIs "float64" .servicePort) }} - number: {{ .servicePort | int }} - {{- end }} -{{- end -}} -{{- end -}} - -{{/* -Print "true" if the API pathType field is supported -Usage: -{{ include "common.ingress.supportsPathType" . }} -*/}} -{{- define "common.ingress.supportsPathType" -}} -{{- if (semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .)) -}} -{{- print "false" -}} -{{- else -}} -{{- print "true" -}} -{{- end -}} -{{- end -}} - -{{/* -Returns true if the ingressClassname field is supported -Usage: -{{ include "common.ingress.supportsIngressClassname" . }} -*/}} -{{- define "common.ingress.supportsIngressClassname" -}} -{{- if semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "false" -}} -{{- else -}} -{{- print "true" -}} -{{- end -}} -{{- end -}} diff --git a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_labels.tpl b/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_labels.tpl deleted file mode 100644 index 252066c7e..000000000 --- a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_labels.tpl +++ /dev/null @@ -1,18 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Kubernetes standard labels -*/}} -{{- define "common.labels.standard" -}} -app.kubernetes.io/name: {{ include "common.names.name" . }} -helm.sh/chart: {{ include "common.names.chart" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end -}} - -{{/* -Labels to use on deploy.spec.selector.matchLabels and svc.spec.selector -*/}} -{{- define "common.labels.matchLabels" -}} -app.kubernetes.io/name: {{ include "common.names.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end -}} diff --git a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_names.tpl b/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_names.tpl deleted file mode 100644 index adf2a74f4..000000000 --- a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_names.tpl +++ /dev/null @@ -1,32 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Expand the name of the chart. -*/}} -{{- define "common.names.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "common.names.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "common.names.fullname" -}} -{{- if .Values.fullnameOverride -}} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_secrets.tpl b/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_secrets.tpl deleted file mode 100644 index 60b84a701..000000000 --- a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_secrets.tpl +++ /dev/null @@ -1,129 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Generate secret name. - -Usage: -{{ include "common.secrets.name" (dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $) }} - -Params: - - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user - to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. - +info: https://github.com/bitnami/charts/tree/master/bitnami/common#existingsecret - - defaultNameSuffix - String - Optional. It is used only if we have several secrets in the same deployment. - - context - Dict - Required. The context for the template evaluation. -*/}} -{{- define "common.secrets.name" -}} -{{- $name := (include "common.names.fullname" .context) -}} - -{{- if .defaultNameSuffix -}} -{{- $name = printf "%s-%s" $name .defaultNameSuffix | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{- with .existingSecret -}} -{{- if not (typeIs "string" .) -}} -{{- with .name -}} -{{- $name = . -}} -{{- end -}} -{{- else -}} -{{- $name = . -}} -{{- end -}} -{{- end -}} - -{{- printf "%s" $name -}} -{{- end -}} - -{{/* -Generate secret key. - -Usage: -{{ include "common.secrets.key" (dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName") }} - -Params: - - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user - to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. - +info: https://github.com/bitnami/charts/tree/master/bitnami/common#existingsecret - - key - String - Required. Name of the key in the secret. -*/}} -{{- define "common.secrets.key" -}} -{{- $key := .key -}} - -{{- if .existingSecret -}} - {{- if not (typeIs "string" .existingSecret) -}} - {{- if .existingSecret.keyMapping -}} - {{- $key = index .existingSecret.keyMapping $.key -}} - {{- end -}} - {{- end }} -{{- end -}} - -{{- printf "%s" $key -}} -{{- end -}} - -{{/* -Generate secret password or retrieve one if already created. - -Usage: -{{ include "common.secrets.passwords.manage" (dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $) }} - -Params: - - secret - String - Required - Name of the 'Secret' resource where the password is stored. - - key - String - Required - Name of the key in the secret. - - providedValues - List - Required - The path to the validating value in the values.yaml, e.g: "mysql.password". Will pick first parameter with a defined value. - - length - int - Optional - Length of the generated random password. - - strong - Boolean - Optional - Whether to add symbols to the generated random password. - - chartName - String - Optional - Name of the chart used when said chart is deployed as a subchart. - - context - Context - Required - Parent context. -*/}} -{{- define "common.secrets.passwords.manage" -}} - -{{- $password := "" }} -{{- $subchart := "" }} -{{- $chartName := default "" .chartName }} -{{- $passwordLength := default 10 .length }} -{{- $providedPasswordKey := include "common.utils.getKeyFromList" (dict "keys" .providedValues "context" $.context) }} -{{- $providedPasswordValue := include "common.utils.getValueFromKey" (dict "key" $providedPasswordKey "context" $.context) }} -{{- $secret := (lookup "v1" "Secret" $.context.Release.Namespace .secret) }} -{{- if $secret }} - {{- if index $secret.data .key }} - {{- $password = index $secret.data .key }} - {{- end -}} -{{- else if $providedPasswordValue }} - {{- $password = $providedPasswordValue | toString | b64enc | quote }} -{{- else }} - - {{- if .context.Values.enabled }} - {{- $subchart = $chartName }} - {{- end -}} - - {{- $requiredPassword := dict "valueKey" $providedPasswordKey "secret" .secret "field" .key "subchart" $subchart "context" $.context -}} - {{- $requiredPasswordError := include "common.validations.values.single.empty" $requiredPassword -}} - {{- $passwordValidationErrors := list $requiredPasswordError -}} - {{- include "common.errors.upgrade.passwords.empty" (dict "validationErrors" $passwordValidationErrors "context" $.context) -}} - - {{- if .strong }} - {{- $subStr := list (lower (randAlpha 1)) (randNumeric 1) (upper (randAlpha 1)) | join "_" }} - {{- $password = randAscii $passwordLength }} - {{- $password = regexReplaceAllLiteral "\\W" $password "@" | substr 5 $passwordLength }} - {{- $password = printf "%s%s" $subStr $password | toString | shuffle | b64enc | quote }} - {{- else }} - {{- $password = randAlphaNum $passwordLength | b64enc | quote }} - {{- end }} -{{- end -}} -{{- printf "%s" $password -}} -{{- end -}} - -{{/* -Returns whether a previous generated secret already exists - -Usage: -{{ include "common.secrets.exists" (dict "secret" "secret-name" "context" $) }} - -Params: - - secret - String - Required - Name of the 'Secret' resource where the password is stored. - - context - Context - Required - Parent context. -*/}} -{{- define "common.secrets.exists" -}} -{{- $secret := (lookup "v1" "Secret" $.context.Release.Namespace .secret) }} -{{- if $secret }} - {{- true -}} -{{- end -}} -{{- end -}} diff --git a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_storage.tpl b/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_storage.tpl deleted file mode 100644 index 60e2a844f..000000000 --- a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_storage.tpl +++ /dev/null @@ -1,23 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Return the proper Storage Class -{{ include "common.storage.class" ( dict "persistence" .Values.path.to.the.persistence "global" $) }} -*/}} -{{- define "common.storage.class" -}} - -{{- $storageClass := .persistence.storageClass -}} -{{- if .global -}} - {{- if .global.storageClass -}} - {{- $storageClass = .global.storageClass -}} - {{- end -}} -{{- end -}} - -{{- if $storageClass -}} - {{- if (eq "-" $storageClass) -}} - {{- printf "storageClassName: \"\"" -}} - {{- else }} - {{- printf "storageClassName: %s" $storageClass -}} - {{- end -}} -{{- end -}} - -{{- end -}} diff --git a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_tplvalues.tpl b/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_tplvalues.tpl deleted file mode 100644 index 2db166851..000000000 --- a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_tplvalues.tpl +++ /dev/null @@ -1,13 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Renders a value that contains template. -Usage: -{{ include "common.tplvalues.render" ( dict "value" .Values.path.to.the.Value "context" $) }} -*/}} -{{- define "common.tplvalues.render" -}} - {{- if typeIs "string" .value }} - {{- tpl .value .context }} - {{- else }} - {{- tpl (.value | toYaml) .context }} - {{- end }} -{{- end -}} diff --git a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_utils.tpl b/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_utils.tpl deleted file mode 100644 index ea083a249..000000000 --- a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_utils.tpl +++ /dev/null @@ -1,62 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Print instructions to get a secret value. -Usage: -{{ include "common.utils.secret.getvalue" (dict "secret" "secret-name" "field" "secret-value-field" "context" $) }} -*/}} -{{- define "common.utils.secret.getvalue" -}} -{{- $varname := include "common.utils.fieldToEnvVar" . -}} -export {{ $varname }}=$(kubectl get secret --namespace {{ .context.Release.Namespace | quote }} {{ .secret }} -o jsonpath="{.data.{{ .field }}}" | base64 --decode) -{{- end -}} - -{{/* -Build env var name given a field -Usage: -{{ include "common.utils.fieldToEnvVar" dict "field" "my-password" }} -*/}} -{{- define "common.utils.fieldToEnvVar" -}} - {{- $fieldNameSplit := splitList "-" .field -}} - {{- $upperCaseFieldNameSplit := list -}} - - {{- range $fieldNameSplit -}} - {{- $upperCaseFieldNameSplit = append $upperCaseFieldNameSplit ( upper . ) -}} - {{- end -}} - - {{ join "_" $upperCaseFieldNameSplit }} -{{- end -}} - -{{/* -Gets a value from .Values given -Usage: -{{ include "common.utils.getValueFromKey" (dict "key" "path.to.key" "context" $) }} -*/}} -{{- define "common.utils.getValueFromKey" -}} -{{- $splitKey := splitList "." .key -}} -{{- $value := "" -}} -{{- $latestObj := $.context.Values -}} -{{- range $splitKey -}} - {{- if not $latestObj -}} - {{- printf "please review the entire path of '%s' exists in values" $.key | fail -}} - {{- end -}} - {{- $value = ( index $latestObj . ) -}} - {{- $latestObj = $value -}} -{{- end -}} -{{- printf "%v" (default "" $value) -}} -{{- end -}} - -{{/* -Returns first .Values key with a defined value or first of the list if all non-defined -Usage: -{{ include "common.utils.getKeyFromList" (dict "keys" (list "path.to.key1" "path.to.key2") "context" $) }} -*/}} -{{- define "common.utils.getKeyFromList" -}} -{{- $key := first .keys -}} -{{- $reverseKeys := reverse .keys }} -{{- range $reverseKeys }} - {{- $value := include "common.utils.getValueFromKey" (dict "key" . "context" $.context ) }} - {{- if $value -}} - {{- $key = . }} - {{- end -}} -{{- end -}} -{{- printf "%s" $key -}} -{{- end -}} diff --git a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_warnings.tpl b/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_warnings.tpl deleted file mode 100644 index ae10fa41e..000000000 --- a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/_warnings.tpl +++ /dev/null @@ -1,14 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Warning about using rolling tag. -Usage: -{{ include "common.warnings.rollingTag" .Values.path.to.the.imageRoot }} -*/}} -{{- define "common.warnings.rollingTag" -}} - -{{- if and (contains "bitnami/" .repository) (not (.tag | toString | regexFind "-r\\d+$|sha256:")) }} -WARNING: Rolling tag detected ({{ .repository }}:{{ .tag }}), please note that it is strongly recommended to avoid using rolling tags in a production environment. -+info https://docs.bitnami.com/containers/how-to/understand-rolling-tags-containers/ -{{- end }} - -{{- end -}} diff --git a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/validations/_cassandra.tpl b/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/validations/_cassandra.tpl deleted file mode 100644 index 8679ddffb..000000000 --- a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/validations/_cassandra.tpl +++ /dev/null @@ -1,72 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate Cassandra required passwords are not empty. - -Usage: -{{ include "common.validations.values.cassandra.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where Cassandra values are stored, e.g: "cassandra-passwords-secret" - - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.cassandra.passwords" -}} - {{- $existingSecret := include "common.cassandra.values.existingSecret" . -}} - {{- $enabled := include "common.cassandra.values.enabled" . -}} - {{- $dbUserPrefix := include "common.cassandra.values.key.dbUser" . -}} - {{- $valueKeyPassword := printf "%s.password" $dbUserPrefix -}} - - {{- if and (not $existingSecret) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "cassandra-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.cassandra.values.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false -*/}} -{{- define "common.cassandra.values.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.cassandra.dbUser.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.dbUser.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled cassandra. - -Usage: -{{ include "common.cassandra.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.cassandra.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.cassandra.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key dbUser - -Usage: -{{ include "common.cassandra.values.key.dbUser" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false -*/}} -{{- define "common.cassandra.values.key.dbUser" -}} - {{- if .subchart -}} - cassandra.dbUser - {{- else -}} - dbUser - {{- end -}} -{{- end -}} diff --git a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/validations/_mariadb.tpl b/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/validations/_mariadb.tpl deleted file mode 100644 index bb5ed7253..000000000 --- a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/validations/_mariadb.tpl +++ /dev/null @@ -1,103 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate MariaDB required passwords are not empty. - -Usage: -{{ include "common.validations.values.mariadb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where MariaDB values are stored, e.g: "mysql-passwords-secret" - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.mariadb.passwords" -}} - {{- $existingSecret := include "common.mariadb.values.auth.existingSecret" . -}} - {{- $enabled := include "common.mariadb.values.enabled" . -}} - {{- $architecture := include "common.mariadb.values.architecture" . -}} - {{- $authPrefix := include "common.mariadb.values.key.auth" . -}} - {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} - {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} - {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} - {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} - - {{- if and (not $existingSecret) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mariadb-root-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} - - {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} - {{- if not (empty $valueUsername) -}} - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mariadb-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - {{- end -}} - - {{- if (eq $architecture "replication") -}} - {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mariadb-replication-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.mariadb.values.auth.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.mariadb.values.auth.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.mariadb.auth.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.auth.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled mariadb. - -Usage: -{{ include "common.mariadb.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.mariadb.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.mariadb.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for architecture - -Usage: -{{ include "common.mariadb.values.architecture" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.mariadb.values.architecture" -}} - {{- if .subchart -}} - {{- .context.Values.mariadb.architecture -}} - {{- else -}} - {{- .context.Values.architecture -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key auth - -Usage: -{{ include "common.mariadb.values.key.auth" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.mariadb.values.key.auth" -}} - {{- if .subchart -}} - mariadb.auth - {{- else -}} - auth - {{- end -}} -{{- end -}} diff --git a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/validations/_mongodb.tpl b/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/validations/_mongodb.tpl deleted file mode 100644 index 1e5bba981..000000000 --- a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/validations/_mongodb.tpl +++ /dev/null @@ -1,108 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate MongoDB® required passwords are not empty. - -Usage: -{{ include "common.validations.values.mongodb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where MongoDB® values are stored, e.g: "mongodb-passwords-secret" - - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.mongodb.passwords" -}} - {{- $existingSecret := include "common.mongodb.values.auth.existingSecret" . -}} - {{- $enabled := include "common.mongodb.values.enabled" . -}} - {{- $authPrefix := include "common.mongodb.values.key.auth" . -}} - {{- $architecture := include "common.mongodb.values.architecture" . -}} - {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} - {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} - {{- $valueKeyDatabase := printf "%s.database" $authPrefix -}} - {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} - {{- $valueKeyReplicaSetKey := printf "%s.replicaSetKey" $authPrefix -}} - {{- $valueKeyAuthEnabled := printf "%s.enabled" $authPrefix -}} - - {{- $authEnabled := include "common.utils.getValueFromKey" (dict "key" $valueKeyAuthEnabled "context" .context) -}} - - {{- if and (not $existingSecret) (eq $enabled "true") (eq $authEnabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mongodb-root-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} - - {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} - {{- $valueDatabase := include "common.utils.getValueFromKey" (dict "key" $valueKeyDatabase "context" .context) }} - {{- if and $valueUsername $valueDatabase -}} - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mongodb-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - {{- end -}} - - {{- if (eq $architecture "replicaset") -}} - {{- $requiredReplicaSetKey := dict "valueKey" $valueKeyReplicaSetKey "secret" .secret "field" "mongodb-replica-set-key" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredReplicaSetKey -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.mongodb.values.auth.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MongoDb is used as subchart or not. Default: false -*/}} -{{- define "common.mongodb.values.auth.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.mongodb.auth.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.auth.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled mongodb. - -Usage: -{{ include "common.mongodb.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.mongodb.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.mongodb.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key auth - -Usage: -{{ include "common.mongodb.values.key.auth" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false -*/}} -{{- define "common.mongodb.values.key.auth" -}} - {{- if .subchart -}} - mongodb.auth - {{- else -}} - auth - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for architecture - -Usage: -{{ include "common.mongodb.values.architecture" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.mongodb.values.architecture" -}} - {{- if .subchart -}} - {{- .context.Values.mongodb.architecture -}} - {{- else -}} - {{- .context.Values.architecture -}} - {{- end -}} -{{- end -}} diff --git a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/validations/_postgresql.tpl b/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/validations/_postgresql.tpl deleted file mode 100644 index 992bcd390..000000000 --- a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/validations/_postgresql.tpl +++ /dev/null @@ -1,131 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate PostgreSQL required passwords are not empty. - -Usage: -{{ include "common.validations.values.postgresql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where postgresql values are stored, e.g: "postgresql-passwords-secret" - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.postgresql.passwords" -}} - {{- $existingSecret := include "common.postgresql.values.existingSecret" . -}} - {{- $enabled := include "common.postgresql.values.enabled" . -}} - {{- $valueKeyPostgresqlPassword := include "common.postgresql.values.key.postgressPassword" . -}} - {{- $valueKeyPostgresqlReplicationEnabled := include "common.postgresql.values.key.replicationPassword" . -}} - - {{- if and (not $existingSecret) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredPostgresqlPassword := dict "valueKey" $valueKeyPostgresqlPassword "secret" .secret "field" "postgresql-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlPassword -}} - - {{- $enabledReplication := include "common.postgresql.values.enabled.replication" . -}} - {{- if (eq $enabledReplication "true") -}} - {{- $requiredPostgresqlReplicationPassword := dict "valueKey" $valueKeyPostgresqlReplicationEnabled "secret" .secret "field" "postgresql-replication-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlReplicationPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to decide whether evaluate global values. - -Usage: -{{ include "common.postgresql.values.use.global" (dict "key" "key-of-global" "context" $) }} -Params: - - key - String - Required. Field to be evaluated within global, e.g: "existingSecret" -*/}} -{{- define "common.postgresql.values.use.global" -}} - {{- if .context.Values.global -}} - {{- if .context.Values.global.postgresql -}} - {{- index .context.Values.global.postgresql .key | quote -}} - {{- end -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.postgresql.values.existingSecret" (dict "context" $) }} -*/}} -{{- define "common.postgresql.values.existingSecret" -}} - {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "existingSecret" "context" .context) -}} - - {{- if .subchart -}} - {{- default (.context.Values.postgresql.existingSecret | quote) $globalValue -}} - {{- else -}} - {{- default (.context.Values.existingSecret | quote) $globalValue -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled postgresql. - -Usage: -{{ include "common.postgresql.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.postgresql.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.postgresql.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key postgressPassword. - -Usage: -{{ include "common.postgresql.values.key.postgressPassword" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.postgresql.values.key.postgressPassword" -}} - {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "postgresqlUsername" "context" .context) -}} - - {{- if not $globalValue -}} - {{- if .subchart -}} - postgresql.postgresqlPassword - {{- else -}} - postgresqlPassword - {{- end -}} - {{- else -}} - global.postgresql.postgresqlPassword - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled.replication. - -Usage: -{{ include "common.postgresql.values.enabled.replication" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.postgresql.values.enabled.replication" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.postgresql.replication.enabled -}} - {{- else -}} - {{- printf "%v" .context.Values.replication.enabled -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key replication.password. - -Usage: -{{ include "common.postgresql.values.key.replicationPassword" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.postgresql.values.key.replicationPassword" -}} - {{- if .subchart -}} - postgresql.replication.password - {{- else -}} - replication.password - {{- end -}} -{{- end -}} diff --git a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/validations/_redis.tpl b/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/validations/_redis.tpl deleted file mode 100644 index 18d9813c5..000000000 --- a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/validations/_redis.tpl +++ /dev/null @@ -1,76 +0,0 @@ - -{{/* vim: set filetype=mustache: */}} -{{/* -Validate Redis™ required passwords are not empty. - -Usage: -{{ include "common.validations.values.redis.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where redis values are stored, e.g: "redis-passwords-secret" - - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.redis.passwords" -}} - {{- $enabled := include "common.redis.values.enabled" . -}} - {{- $valueKeyPrefix := include "common.redis.values.keys.prefix" . -}} - {{- $standarizedVersion := include "common.redis.values.standarized.version" . }} - - {{- $existingSecret := ternary (printf "%s%s" $valueKeyPrefix "auth.existingSecret") (printf "%s%s" $valueKeyPrefix "existingSecret") (eq $standarizedVersion "true") }} - {{- $existingSecretValue := include "common.utils.getValueFromKey" (dict "key" $existingSecret "context" .context) }} - - {{- $valueKeyRedisPassword := ternary (printf "%s%s" $valueKeyPrefix "auth.password") (printf "%s%s" $valueKeyPrefix "password") (eq $standarizedVersion "true") }} - {{- $valueKeyRedisUseAuth := ternary (printf "%s%s" $valueKeyPrefix "auth.enabled") (printf "%s%s" $valueKeyPrefix "usePassword") (eq $standarizedVersion "true") }} - - {{- if and (not $existingSecretValue) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $useAuth := include "common.utils.getValueFromKey" (dict "key" $valueKeyRedisUseAuth "context" .context) -}} - {{- if eq $useAuth "true" -}} - {{- $requiredRedisPassword := dict "valueKey" $valueKeyRedisPassword "secret" .secret "field" "redis-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRedisPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled redis. - -Usage: -{{ include "common.redis.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.redis.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.redis.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right prefix path for the values - -Usage: -{{ include "common.redis.values.key.prefix" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false -*/}} -{{- define "common.redis.values.keys.prefix" -}} - {{- if .subchart -}}redis.{{- else -}}{{- end -}} -{{- end -}} - -{{/* -Checks whether the redis chart's includes the standarizations (version >= 14) - -Usage: -{{ include "common.redis.values.standarized.version" (dict "context" $) }} -*/}} -{{- define "common.redis.values.standarized.version" -}} - - {{- $standarizedAuth := printf "%s%s" (include "common.redis.values.keys.prefix" .) "auth" -}} - {{- $standarizedAuthValues := include "common.utils.getValueFromKey" (dict "key" $standarizedAuth "context" .context) }} - - {{- if $standarizedAuthValues -}} - {{- true -}} - {{- end -}} -{{- end -}} diff --git a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/validations/_validations.tpl b/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/validations/_validations.tpl deleted file mode 100644 index 9a814cf40..000000000 --- a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/templates/validations/_validations.tpl +++ /dev/null @@ -1,46 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate values must not be empty. - -Usage: -{{- $validateValueConf00 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-00") -}} -{{- $validateValueConf01 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-01") -}} -{{ include "common.validations.values.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} - -Validate value params: - - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" - - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" - - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" -*/}} -{{- define "common.validations.values.multiple.empty" -}} - {{- range .required -}} - {{- include "common.validations.values.single.empty" (dict "valueKey" .valueKey "secret" .secret "field" .field "context" $.context) -}} - {{- end -}} -{{- end -}} - -{{/* -Validate a value must not be empty. - -Usage: -{{ include "common.validations.value.empty" (dict "valueKey" "mariadb.password" "secret" "secretName" "field" "my-password" "subchart" "subchart" "context" $) }} - -Validate value params: - - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" - - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" - - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" - - subchart - String - Optional - Name of the subchart that the validated password is part of. -*/}} -{{- define "common.validations.values.single.empty" -}} - {{- $value := include "common.utils.getValueFromKey" (dict "key" .valueKey "context" .context) }} - {{- $subchart := ternary "" (printf "%s." .subchart) (empty .subchart) }} - - {{- if not $value -}} - {{- $varname := "my-value" -}} - {{- $getCurrentValue := "" -}} - {{- if and .secret .field -}} - {{- $varname = include "common.utils.fieldToEnvVar" . -}} - {{- $getCurrentValue = printf " To get the current value:\n\n %s\n" (include "common.utils.secret.getvalue" .) -}} - {{- end -}} - {{- printf "\n '%s' must not be empty, please add '--set %s%s=$%s' to the command.%s" .valueKey $subchart .valueKey $varname $getCurrentValue -}} - {{- end -}} -{{- end -}} diff --git a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/values.yaml b/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/values.yaml deleted file mode 100644 index f2df68e5e..000000000 --- a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/charts/common/values.yaml +++ /dev/null @@ -1,5 +0,0 @@ -## bitnami/common -## It is required by CI/CD tools and processes. -## @skip exampleValue -## -exampleValue: common-chart diff --git a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/templates/_ingress.tpl b/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/templates/_ingress.tpl deleted file mode 100644 index e1b16d928..000000000 --- a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/templates/_ingress.tpl +++ /dev/null @@ -1,101 +0,0 @@ -{{/* -include "ingress" (dict "ingressName" "myingress" "ingress" path.to.ingress "serviceName" "the-service" "servicePort" 9090 "context" $) - -ingress: - enabled: true - certManager: false - pathType: ImplementationSpecific - apiVersion: "" - hostname: theservice.local - path: / - annotations: {} - tls: false - extraHosts: [] - extraPaths: [] - extraTls: [] - secrets: [] -*/}} -{{- define "lib.ingress" -}} -{{- $ctx := .context -}} -{{- $ingressName := .ingressName -}} -{{- $serviceName := .serviceName -}} -{{- $servicePort := .servicePort -}} -{{- $extraPaths := .ingress.extraPaths -}} -{{- if .ingress.enabled -}} -apiVersion: {{ include "common.capabilities.ingress.apiVersion" $ctx }} -kind: Ingress -metadata: - name: {{ $ingressName }} - namespace: {{ $ctx.Release.Namespace | quote }} - labels: {{- include "common.labels.standard" $ctx | nindent 4 }} - {{- if $ctx.Values.commonLabels }} - {{- include "common.tplvalues.render" ( dict "value" $ctx.Values.commonLabels "context" $ctx ) | nindent 4 }} - {{- end }} - annotations: - {{- if .ingress.certManager }} - kubernetes.io/tls-acme: "true" - {{- end }} - {{- if .ingress.annotations }} - {{- include "common.tplvalues.render" ( dict "value" .ingress.annotations "context" $ctx ) | nindent 4 }} - {{- end }} - {{- if $ctx.Values.commonAnnotations }} - {{- include "common.tplvalues.render" ( dict "value" $ctx.Values.commonAnnotations "context" $ctx ) | nindent 4 }} - {{- end }} -spec: - rules: - {{- if .ingress.hostname }} - - host: {{ .ingress.hostname }} - http: - paths: - - path: {{ .ingress.path }} - {{- if eq "true" (include "common.ingress.supportsPathType" $ctx) }} - pathType: {{ default "ImplementationSpecific" .ingress.pathType }} - {{- end }} - backend: {{- include "common.ingress.backend" (dict "serviceName" $serviceName "servicePort" $servicePort "context" $ctx) | nindent 14 }} - {{- include "lib.safeToYaml" $extraPaths | nindent 10 }} - {{- end }} - {{- range .ingress.extraHosts }} - - host: {{ .name | quote }} - http: - paths: - - path: {{ default "/" .path }} - {{- if eq "true" (include "common.ingress.supportsPathType" $ctx) }} - pathType: {{ default "ImplementationSpecific" .pathType }} - {{- end }} - backend: {{- include "common.ingress.backend" (dict "serviceName" $serviceName "servicePort" $servicePort "context" $ctx) | nindent 14 }} - {{- include "lib.safeToYaml" $extraPaths | nindent 10 }} - {{- end }} - {{/* .ingress.hosts is deprecated */}} - {{- range .ingress.hosts }} - - host: {{ .host | quote }} - http: - paths: - {{- if .path }} - - path: {{ default "/" .path }} - {{- if eq "true" (include "common.ingress.supportsPathType" $ctx) }} - pathType: {{ default "ImplementationSpecific" .pathType }} - {{- end }} - backend: {{- include "common.ingress.backend" (dict "serviceName" $serviceName "servicePort" $servicePort "context" $ctx) | nindent 14 }} - {{- end }} - {{- range .paths }} - - path: {{ . | quote }} - {{- if eq "true" (include "common.ingress.supportsPathType" $ctx) }} - pathType: ImplementationSpecific - {{- end }} - backend: {{- include "common.ingress.backend" (dict "serviceName" $serviceName "servicePort" $servicePort "context" $ctx) | nindent 14 }} - {{- end }} - {{- end }} - {{/* .ingress.hosts is deprecated */}} - {{- if or .ingress.tls .ingress.extraTls }} - tls: - {{- if .ingress.tls }} - - hosts: - - {{ .ingress.hostname }} - secretName: {{ printf "%s-tls" .ingress.hostname }} - {{- end }} - {{- if .ingress.extraTls }} - {{- include "common.tplvalues.render" ( dict "value" .ingress.extraTls "context" $ctx ) | nindent 4 }} - {{- end }} - {{- end }} -{{- end }} -{{- end -}} diff --git a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/templates/_lib.tpl b/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/templates/_lib.tpl deleted file mode 100644 index deaa325c4..000000000 --- a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/templates/_lib.tpl +++ /dev/null @@ -1,51 +0,0 @@ - -{{/* -Call a template function in the context of a sub-chart, as opposed to the -current context of the caller -{{ include "lib.call-nested" (list . "subchart" "template_name") }} -*/}} -{{- define "lib.call-nested" }} -{{- $dot := index . 0 }} -{{- $subchart := index . 1 | splitList "." }} -{{- $template := index . 2 }} -{{- $values := $dot.Values }} -{{- range $subchart }} -{{- $values = index $values . }} -{{- end }} -{{- include $template (dict "Chart" (dict "Name" (last $subchart)) "Values" $values "Release" $dot.Release "Capabilities" $dot.Capabilities) }} -{{- end }} - -{{/* -Common labels -*/}} -{{- define "lib.labels" -}} -helm.sh/chart: {{ include "common.names.chart" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{ include "common.labels.matchLabels" . }} -{{- end -}} - -{{/* -Create the name of the service account to use -*/}} -{{- define "lib.serviceAccountName" -}} -{{- if .Values.serviceAccount.create -}} - {{ default (include "common.names.fullname" .) .Values.serviceAccount.name }} -{{- else -}} - {{ default "default" .Values.serviceAccount.name }} -{{- end -}} -{{- end -}} - - -{{/* -Given a variable, if it is not false, output as Yaml - -include "lib.safeToYaml" .Values.something -*/}} -{{- define "lib.safeToYaml" -}} -{{- if . -}} -{{ toYaml . }} -{{- end -}} -{{- end -}} diff --git a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/templates/_lib_image.tpl b/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/templates/_lib_image.tpl deleted file mode 100644 index 77ed723b4..000000000 --- a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/templates/_lib_image.tpl +++ /dev/null @@ -1,46 +0,0 @@ -{{/* -Given a setup like the following: - -# global and on down are optional -global: - image: - registry: my-registry.com - tag: latest - -# This is the imageRoot -somecomponent: - image: - registry: my-other-registry.com - tag: 1.0.0 - repository: bobs/coolthing - -*/}} -{{/* -{{ include "utils.image.url" (dict "imageRoot" .Values.sawtooth.containers.validator.image "global" .Values.global)}} -*/}} -{{- define "lib.image.url" -}} -{{- $globalRegistryName := "index.docker.io" -}} -{{- $globalTag := "latest" -}} -{{- if .global -}} - {{- if .global.image -}} - {{- if .global.image.registry -}} - {{- $globalRegistryName = .global.image.registry -}} - {{- end -}} - {{- if .global.image.tag -}} - {{- $globalTag = .global.image.tag -}} - {{- end -}} - {{- end -}} -{{- end -}} -{{- $repository := .imageRoot.repository -}} -{{- $registry := default $globalRegistryName .imageRoot.registry -}} -{{- $tag := default $globalTag .imageRoot.tag -}} -{{- printf "%s/%s:%s" $registry $repository $tag -}} -{{- end -}} - -{{/* -{{ include "utils.image" (dict "imageRoot" .Values.sawtooth.containers.validator.image "global" .Values.global)}} -*/}} -{{- define "lib.image" -}} -image: {{ include "lib.image.url" . }} -imagePullPolicy: {{ default "IfNotPresent" .imageRoot.pullPolicy }} -{{- end -}} diff --git a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/templates/_lib_volumes.tpl b/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/templates/_lib_volumes.tpl deleted file mode 100644 index 93f1139b1..000000000 --- a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/templates/_lib_volumes.tpl +++ /dev/null @@ -1,34 +0,0 @@ - - -{{/* -given a variable list, create a list of volumes - -extraVolumes: - - name: pv-data - persistentVolumeClaim: - claimName: pvc-persistent-cfg - - name: scratch - emptyDir: {} - -include "lib.volumes" .Values.extraVolumes - -*/}} -{{- define "lib.volumes" -}} -{{ include "lib.safeToYaml" . }} -{{- end -}} - -{{/* -given a variable list, create a list of volumeMounts - -extraVolumeMounts: - - name: pv-data - mountPath: /data - - name: scratch - mountPath: /scratch - -include "lib.volumeMounts" .Values.extraVolumeMounts - -*/}} -{{- define "lib.volumeMounts" -}} -{{ include "lib.safeToYaml" . }} -{{- end -}} diff --git a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/values.yaml b/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/values.yaml deleted file mode 100644 index 1ff659769..000000000 --- a/charts/btp/chronicle/charts/sawtooth/charts/standard-defs/values.yaml +++ /dev/null @@ -1 +0,0 @@ -exampleValue: example diff --git a/charts/btp/chronicle/charts/sawtooth/sextant/details.yaml b/charts/btp/chronicle/charts/sawtooth/sextant/details.yaml deleted file mode 100644 index 83bb5c290..000000000 --- a/charts/btp/chronicle/charts/sawtooth/sextant/details.yaml +++ /dev/null @@ -1,27 +0,0 @@ -apiVersion: v2 -name: sawtooth -description: Uses BTP Paralos open source distribution of Hyperledger Sawtooth - -# Replaces the index.js in the deployment templates directory, sawtooth/index -# The deploymentType and deploymentVersion help build the object structure -deploymentType: sawtooth -deploymentVersion: 1.1 - -# absolute path to form.js -form: sawtooth/sextant/form.js - -# absolute path to summary.jst -summary: sawtooth/sextant/summary.js - -# paths to be used in the getField function -namePath: sawtooth.networkName -namespacePath: sawtooth.namespace - -# additional fields for the button -# form: -title: Hyperledger Sawtooth -sextantVersion: sawtooth 1.2, paralos 2.1 -buttonIcon: /thirdParty/hyperledger-sawtooth.png -features: [] - -# documentation pull down mark down diff --git a/charts/btp/chronicle/charts/sawtooth/sextant/form.js b/charts/btp/chronicle/charts/sawtooth/sextant/form.js deleted file mode 100644 index 293e50f6a..000000000 --- a/charts/btp/chronicle/charts/sawtooth/sextant/form.js +++ /dev/null @@ -1,330 +0,0 @@ -const randomString = require('randomstring') -const options = require('./options') - -const form = [ - - 'Hyperledger Sawtooth Deployment', - - [ - { - id: 'sawtooth.networkName', - title: 'Deployment Name', - helperText: 'The name of the deployment', - component: 'text', - editable: { - new: true, - }, - validate: { - type: 'string', - methods: [ - ['required', 'Required'], - ['matches', ['^[a-z]([-a-z0-9]*[a-z0-9])*$'], "a DNS-1123 label must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character"], - ], - }, - }, - { - id: 'sawtooth.namespace', - title: 'Kubernetes Namespace', - helperText: 'The Kubernetes namespace', - component: 'text', - editable: { - new: true, - }, - validate: { - type: 'string', - methods: [ - ['required', 'Required'], - ['matches', ['^[a-z]([-a-z0-9]*[a-z0-9])*$'], "a DNS-1123 label must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character"], - ], - }, - }, - - ], - - [ - { - id: 'sawtooth.dynamicPeering', - title: 'Peering Type', - helperText: 'Peering type for the validator', - component: 'radio', - default: true, - dataType: 'boolean', - row: true, - options: options.peering, - validate: { - type: 'string', - methods: [ - ['required', 'Required'], - ], - }, - }, - { - id: 'sawtooth.genesis.enabled', - title: 'Genesis Block', - helperText: 'Should this network create the genesis block?', - component: 'radio', - default: true, - dataType: 'boolean', - row: true, - options: options.activated, - validate: { - type: 'string', - methods: [ - ['required', 'Required'], - ], - }, - }, - ], - [ - { - id: 'sawtooth.permissioned', - title: 'Permissioned Network', - helperText: 'Should this network be permissioned?', - component: 'radio', - default: false, - dataType: 'boolean', - row: true, - options: options.activated, - validate: { - type: 'string', - methods: [ - ['required', 'Required'], - ], - }, - }, - { - id: 'sawtooth.consensus', - title: 'Consensus Algorithm', - helperText: 'Which consensus algorithm should this network use?', - component: 'select', - alternateText: true, - default: 400, - dataType: 'number', - options: options.consensus, - validate: { - type: 'number', - methods: [ - ['required', 'Required'], - ], - }, - }, - ], - - { - id: 'affinity.enabled', - title: 'Affinity', - helperText: 'If enabled - pods will only deploy to nodes that have the label: app={{ .Release.Name }}-validator', - component: 'radio', - default: false, - dataType: 'boolean', - row: true, - options: options.activated, - validate: { - type: 'string', - methods: [ - ['required', 'Required'], - ], - }, - }, - - // hostname, IP, port - { - id: 'sawtooth.externalSeeds', - title: 'External Seeds', - helperText: 'The list of external addresses to connect to', - list: { - mainField: 'hostname', - schema: [{ - id: 'hostname', - title: 'Hostname', - helperText: 'Type the hostname of a new external seed.', - component: 'text', - validate: { - type: 'string', - methods: [ - ['required', 'Required'], - ['matches', ['^[a-z]([.]*[-a-z0-9]*[a-z0-9])*$'], 'Must use a DNS-1123 safe label.'], - ], - }, - }, - { - id: 'ip', - title: 'IP Address', - helperText: 'Type the IP address of a new external seed.', - component: 'text', - validate: { - type: 'string', - methods: [ - ['required', 'Required'], - ['matches', ['^[0-9]+[.0-9]*[0-9]$'], 'Must be an IPv4 compatible address.'], - ], - }, - }, { - id: 'port', - title: 'Port', - helperText: 'Type the port of a new external seed.', - component: 'text', - validate: { - type: 'string', - methods: [ - ['required', 'Required'], - ['matches', ['^[0-9]+$'], 'Must be a number.'], - ], - }, - }, - ], - table: [{ - title: 'Hostname', - name: 'hostname', - }, { - title: 'IP Address', - name: 'ip', - }, { - title: 'Port', - name: 'port', - }], - }, - }, - - 'Custom Containers', - - { - id: 'sawtooth.customTPs', - title: 'Custom Containers', - skip: true, - helperText: 'Custom containers can connect to the validator on tcp://localhost:4004', - list: { - mainField: 'name', - schema: [{ - id: 'name', - title: 'Name', - helperText: 'The name of your custom container', - component: 'text', - validate: { - type: 'string', - methods: [ - ['required', 'Required'], - ], - }, - }, { - id: 'image', - title: 'Image', - helperText: 'The docker image for your container', - component: 'text', - validate: { - type: 'string', - methods: [ - ['required', 'Required'], - ], - }, - }, { - id: 'command', - title: 'Command', - helperText: 'The command for your container', - component: 'text', - validate: { - type: 'string', - methods: [ - - ], - }, - }, { - id: 'args', - title: 'Arguments', - helperText: 'The arguments for your container', - component: 'text', - validate: { - type: 'string', - methods: [ - - ], - }, - }], - table: [{ - title: 'Name', - name: 'name', - }, { - title: 'Image', - name: 'image', - }, { - title: 'Command', - name: 'command', - }, { - title: 'Arguments', - name: 'args', - }], - }, - }, - - 'Image Pull Secrets', - - { - id: 'imagePullSecrets.enabled', - title: 'Do you need to enable image pull secrets?', - helperText: 'Provide secrets to be injected into the namespace and used to pull images from your secure registry', - component: 'radio', - default: false, - dataType: 'boolean', - row: true, - options: options.yesNo, - validate: { - type: 'string', - methods: [ - ['required', 'Required'], - ], - }, - }, { - id: 'imagePullSecrets.value', - title: 'Image Pull Secrets', - helperText: null, - default: null, - linked: { - linkedId: 'imagePullSecrets.enabled', - visibilityParameter: 'true', // for what value of linkedId, will this component be visible - }, - list: { - mainField: 'name', - schema: [{ - id: 'name', - title: 'Name', - helperText: 'The name of the secret', - component: 'text', - validate: { - type: 'string', - methods: [ - ['required', 'Required'], - ['matches', ['^[a-z]([-a-z0-9]*[a-z0-9])*$'], "a DNS-1123 label must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character"], - ], - }, - }], - table: [{ - title: 'Name', - name: 'name', - }], - }, - }, - - 'Advanced Options', - - [ - { - id: 'sawtooth.genesis.seed', - title: 'Genesis Seed', - hidden: true, - default: randomString.generate(24), - warning: true, - helperText: 'WARNING: Changing the Genesis Seed will cause any exisiting data on the deployment to be deleted.', - component: 'text', - validate: { - type: 'string', - methods: [ - ['required', 'Required'], - ], - }, - }, - '', // emptry string acts as space in UI - ], - -] - -module.exports = form diff --git a/charts/btp/chronicle/charts/sawtooth/sextant/options.js b/charts/btp/chronicle/charts/sawtooth/sextant/options.js deleted file mode 100644 index c1ecf9f7f..000000000 --- a/charts/btp/chronicle/charts/sawtooth/sextant/options.js +++ /dev/null @@ -1,48 +0,0 @@ -const activated = [{ - value: true, - title: 'Enabled', -}, { - value: false, - title: 'Disabled', -}] - -const yesNo = [{ - value: true, - title: 'Yes', -}, { - value: false, - title: 'No', -}] - -const consensus = [{ - value: 100, - title: 'DevMode', - blurb: 'DevMode is useful for development purposes only. This mechanism useful only on single node networks which provide no real consensus guarantees.', -}, { - value: 400, - title: 'PBFT', - blurb: 'PBFT is a byzantine fault tolerant consensus mechanism offering good scale, and performance. It is tolerant of up to f=(n-1)/3 byzantine or other faults on the network. PBFT is a non-forking algorithm.', -}, { - value: 200, - title: 'PoET-CFT', - blurb: 'PoET-CFT is a time based consensus mechanism based on a fair lottery system. It has low resource utilization, is crash fault tolerant and can support very large scale networks. PoET-CFT is a forking consensus algorithm.', -}, { - value: 300, - title: 'Raft', - blurb: 'Raft is a consensus mechanism based on an elected leader. It offers good performance, but is not tolerant of Byzantine failures. It works best with low latency networks, and is tolerant of f=(n-1)/2 non-byzantine failures. Raft is a non-forking algorithm.', -}] - -const peering = [{ - value: true, - title: 'Dynamic', -}, { - value: false, - title: 'Static', -}] - -module.exports = { - activated, - consensus, - peering, - yesNo, -} diff --git a/charts/btp/chronicle/charts/sawtooth/sextant/summary.js b/charts/btp/chronicle/charts/sawtooth/sextant/summary.js deleted file mode 100644 index 438003fd8..000000000 --- a/charts/btp/chronicle/charts/sawtooth/sextant/summary.js +++ /dev/null @@ -1,43 +0,0 @@ -const options = require('./options') - -const getConsensusTitle = (value) => { - const option = options.consensus.find((o) => o.value === value) - return option ? option.title : 'unknown' -} - -const summary = (values) => { - const { - sawtooth, - } = values - - return [{ - title: 'Deployment Name', - value: sawtooth.networkName, - }, { - title: 'Namespace', - value: sawtooth.namespace, - }, { - title: 'Peering Type', - value: sawtooth.dynamicPeering ? 'Dynamic' : 'Static', - }, { - title: 'Genesis Block', - value: sawtooth.genesis.enabled ? 'Yes' : 'No', - }, { - title: 'Permissioned', - value: sawtooth.permissioned ? 'Yes' : 'No', - }, { - title: 'Consensus Algorithm', - value: getConsensusTitle(sawtooth.consensus), - }, { - title: 'External Seeds', - value: (sawtooth.externalSeeds || []).map((seed) => seed.ip), - }, { - title: 'Sawtooth Validator Port', - value: '8800', - }, { - title: 'Custom Transaction Processors', - value: (sawtooth.customTPs || []).map((tp) => `${tp.name} (${tp.image})`), - }] -} - -module.exports = summary diff --git a/charts/btp/chronicle/charts/sawtooth/templates/NOTES.txt b/charts/btp/chronicle/charts/sawtooth/templates/NOTES.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/charts/btp/chronicle/charts/sawtooth/templates/_sawtooth.tpl b/charts/btp/chronicle/charts/sawtooth/templates/_sawtooth.tpl deleted file mode 100644 index 28744498f..000000000 --- a/charts/btp/chronicle/charts/sawtooth/templates/_sawtooth.tpl +++ /dev/null @@ -1,352 +0,0 @@ - -{{/* -Sawtooth Selector labels -*/}} -{{- define "sawtooth.labels" -}} -{{ include "lib.labels" . }} -app: {{ include "common.names.fullname" . }} -{{- end -}} - -{{- define "sawtooth.kind" -}} -{{ $consensus := .Values.sawtooth.consensus | int }} -{{- if or .Values.sawtooth.statefulset.enabled (eq $consensus 100) -}} -StatefulSet -{{- else -}} -DaemonSet -{{- end -}} -{{- end -}} - -{{/* -Sawtooth Selector labels -*/}} -{{- define "sawtooth.labels.matchLabels" -}} -{{ include "common.labels.matchLabels" . }} -app: {{ include "common.names.fullname" . }} -component: sawtooth -{{- end -}} - -{{/* if the consensus type is devmode replicas is always 1 */}} -{{- define "sawtooth.replicas" -}} -{{- $consensus := .Values.sawtooth.consensus | int -}} -{{- if eq $consensus 100 -}} -{{- 1 | int -}} -{{- else -}} -{{- default 4 .Values.sawtooth.statefulset.replicas | int -}} -{{- end -}} -{{- end -}} - -{{/* -Sawtooth networking specifications -*/}} -{{- define "sawtooth.bind.component" -}} -component:tcp://0.0.0.0:{{ include "sawtooth.ports.sawcomp" . }} -{{- end -}} - -{{/* -Consensus binding should always be local under normal circumstances -*/}} -{{- define "sawtooth.bind.consensus" -}} -{{- if .Values.sawtooth.ports.consensus_local -}} -consensus:tcp://127.0.0.1:{{ include "sawtooth.ports.consensus" . }} -{{- else -}} -consensus:tcp://0.0.0.0:{{ include "sawtooth.ports.consensus" . }} -{{- end -}} -{{- end -}} - -{{- define "sawtooth.bind.network" -}} -network:tcp://0.0.0.0:{{ include "sawtooth.ports.sawnet" . }} -{{- end -}} - -{{- define "sawtooth.binds" -}} ---bind {{ include "sawtooth.bind.component" . }} \ ---bind {{ include "sawtooth.bind.consensus" . }} \ ---bind {{ include "sawtooth.bind.network" . }} -{{- end -}} - -{{- define "sawtooth.opentsdb" -}} -{{- if .Values.sawtooth.opentsdb.enabled -}} ---opentsdb-db {{ .Values.sawtooth.opentsdb.db }} \ ---opentsdb-url {{ .Values.sawtooth.opentsdb.url }} -{{- end -}} -{{- end -}} - -{{- define "sawtooth.peering" -}} -{{- $peering:= .Values.sawtooth.dynamicPeering -}} ---peering {{ if ($peering)}}dynamic{{ else }}static{{end }} \ -{{ range .Values.sawtooth.externalSeeds }}{{ if ($peering) }}--seeds{{ else }}--peers{{ end }} tcp://{{ .hostname }}:{{ .port }} {{end }} \ -{{ if ($peering)}}${SEEDS}{{ else }}${PEERS}{{end }} \ ---maximum-peer-connectivity 255 -{{- end -}} - -{{- define "sawtooth.network" -}} -{{ include "sawtooth.binds" . }} \ -{{ include "sawtooth.peering" . }} \ -{{ include "sawtooth.opentsdb" . }} -{{- end -}} - -{{/* -Genesis Templates -*/}} -{{- define "sawtooth.genesis.create" -}} -{{- $consensus := .Values.sawtooth.consensus | int -}} -if [ ! -r /etc/sawtooth/initialized ]; then - if [ $RUN_GENESIS -eq 1 ]; then - {{- if eq $consensus 400 }} - bash -x /usr/local/bin/pbft_genesis_config.sh {{ .Release.Namespace }} - {{- else if eq $consensus 300 }} - bash -x /usr/local/bin/raft_genesis_config.sh {{ .Release.Namespace }} - {{- else if eq $consensus 200 }} - bash -x /usr/local/bin/poet_genesis_config.sh {{ .Release.Namespace }} - {{- else }} - bash -x /usr/local/bin/devmode_genesis_config.sh {{ .Release.Namespace }} - {{- end }} - {{ if .Values.sawtooth.permissioned -}} - /usr/local/bin/identity_genesis_config.sh {{ .Release.Namespace }} - {{- end -}} - sawset genesis -k /etc/sawtooth/keys/validator.priv \ - -o /etc/sawtooth/genesis/000-genesis.batch - cd /etc/sawtooth/genesis - sawadm genesis `ls |sort` - cd - - fi - touch /etc/sawtooth/initialized; -fi -{{- end -}} - -{{- define "sawtooth.genesis.reset" -}} -if [ -r /etc/sawtooth/genesis.seed ]; then - OLD_SEED=`cat /etc/sawtooth/genesis.seed` - if [ "$OLD_SEED" != "{{ .Values.sawtooth.genesis.seed }}" ]; then - echo "${OLD_SEED} != {{ .Values.sawtooth.genesis.seed }} -- resetting environment" - rm -rf /var/lib/sawtooth/* - rm -f /etc/sawtooth/genesis/* - rm -f /etc/sawtooth/initialized - echo {{ .Values.sawtooth.genesis.seed }} > /etc/sawtooth/genesis.seed - fi -else - echo "No genesis seed. Resetting environment and setting Seed to {{ .Values.sawtooth.genesis.seed }}" - rm -rf /var/lib/sawtooth/* - rm -f /etc/sawtooth/genesis/* - rm -f /etc/sawtooth/initialized - echo {{ .Values.sawtooth.genesis.seed }} > /etc/sawtooth/genesis.seed -fi -{{- end -}} -{{/* -END Genesis Templates -*/}} - -{{- define "sawtooth.hostpath" -}} -{{ .Values.sawtooth.volumes.hostPathBaseDir | trimSuffix "/" }}/{{.Release.Namespace}}/{{.Release.Name }} -{{- end -}} - -{{- define "sawtooth.etc.volume.name" -}} -sawtooth-etc -{{- end -}} - -{{- define "sawtooth.etc.volume" -}} -- name: {{ include "sawtooth.etc.volume.name" . }} - hostPath: - type: DirectoryOrCreate - path: {{ include "sawtooth.hostpath" . }}/{{ include "sawtooth.data.volume.name" . }} -{{- end -}} - -{{- define "sawtooth.etc.volume.vct" -}} -- metadata: - name: {{ include "sawtooth.etc.volume.name" . }} - {{- if .Values.sawtooth.persistence.annotations }} - annotations: {{- toYaml .Values.sawtooth.persistence.annotations | nindent 10 }} - {{- end }} - spec: - accessModes: {{- toYaml .Values.sawtooth.persistence.accessModes | nindent 10 }} - {{ if .Values.sawtooth.persistence.storageClass }} - storageClassName: {{ .Values.sawtooth.persistence.storageClass | quote }} - {{ end }} - resources: - requests: - storage: 1Gi -{{- end -}} - -{{- define "sawtooth.etc.mount" -}} -- mountPath: /etc/sawtooth - name: {{ include "sawtooth.etc.volume.name" . }} -{{- end -}} - -{{- define "sawtooth.scripts.volume" -}} -- name: {{ include "sawtooth.scripts.volume.name" . }} - configMap: - name: {{ include "common.names.fullname" . }}-scripts -{{- end -}} - -{{- define "sawtooth.scripts.volume.name" -}} -chart-scripts -{{- end -}} - -{{- define "sawtooth.scripts.mount" -}} -- mountPath: /opt/chart/scripts - name: {{ include "sawtooth.scripts.volume.name" . }} -{{- end -}} - -{{- define "sawtooth.data.volume.name" -}} -sawtooth-data -{{- end -}} - -{{- define "sawtooth.data.volume" -}} -- name: {{ include "sawtooth.data.volume.name" . }} - hostPath: - type: DirectoryOrCreate - path: {{ include "sawtooth.hostpath" . }}/{{ include "sawtooth.data.volume.name" . }} -{{- end -}} - -{{- define "sawtooth.data.volume.vct" -}} -- metadata: - name: {{ include "sawtooth.data.volume.name" . }} - {{- if .Values.sawtooth.persistence.annotations }} - annotations: {{- toYaml .Values.sawtooth.persistence.annotations | nindent 8 }} - {{- end }} - spec: - accessModes: {{- toYaml .Values.sawtooth.persistence.accessModes | nindent 6 }} - {{ if .Values.sawtooth.persistence.storageClass }} - storageClassName: {{ .Values.sawtooth.persistence.storageClass | quote }} - {{ end }} - resources: - requests: - storage: {{ .Values.sawtooth.persistence.size | quote }} -{{- end -}} - -{{- define "sawtooth.data.mount" -}} -- mountPath: /var/lib/sawtooth - name: {{ include "sawtooth.data.volume.name" . }} -{{- end -}} - -{{/* -Sawtooth Signals Templates -*/}} -{{/* -Use as in -{{ include "sawtooth.signal.postStart" "pbft-engine" } -*/}} -{{- define "sawtooth.signal.postStart" -}} -postStart: - exec: - command: - - sh - - -c - - | - rm -f {{ include "sawtooth.signals.dir" . }}/{{ . }} -{{- end -}} - -{{- define "sawtooth.signal.livenessProbe" -}} -livenessProbe: - exec: - command: - - sh - - -c - - | - if [ -r {{ include "sawtooth.signals.dir" . }}/{{ . }} ]; then - exit 1 - else - exit 0 - fi -{{- end -}} - -{{- define "sawtooth.signal.fire" -}} -exit_code=$? -export EXIT_SIGNALS="{{ .Values.sawtooth.livenessProbe.exitSignals }}" -for signal in ${EXIT_SIGNALS}; do - touch "{{ include "sawtooth.signals.dir" . }}/$signal" -done -exit $exit_code -{{- end -}} - -{{- define "sawtooth.signals.volume.name" -}} -sawtooth-signals -{{- end -}} - -{{- define "sawtooth.signals.dir" -}} -/var/run/sawtooth -{{- end -}} - -{{- define "sawtooth.signals.mount" -}} -- mountPath: {{ include "sawtooth.signals.dir" . }} - name: {{ include "sawtooth.signals.volume.name" . }} -{{- end -}} - -{{- define "sawtooth.signals.volume" -}} -- name: {{ include "sawtooth.signals.volume.name" . }} - emptyDir: {} -{{- end -}} -{{/* -END Sawtooth Signals Templates -*/}} - -{{- define "sawtooth.affinity" -}} -{{- if .Values.affinity.enabled -}} -nodeAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - nodeSelectorTerms: - - matchExpressions: - - key: app - operator: In - values: - - {{- include "common.names.fullname" . -}} -{{- else -}} -{{- if .Values.sawtooth.affinity -}} -{{- toYaml .Values.sawtooth.affinity }} -{{- end -}} -{{- end -}} -{{- end -}} - -{{- define "sawtooth.hostaliases" -}} -{{ range .Values.sawtooth.externalSeeds }} -- ip: {{ .ip }} - hostnames: - - {{ .hostname }} -{{ end }} -{{ include "utils.hostaliases" . }} -{{- end -}} - -{{- define "sawtooth.containers" -}} -{{- $consensus := .Values.sawtooth.consensus | int -}} -{{- if eq $consensus 400 -}} -{{- include "sawtooth.container.pbft-engine" . | nindent 0 }} -{{- else if eq $consensus 300 -}} -{{- include "sawtooth.container.raft-engine" . | nindent 0 }} -{{- else if eq $consensus 200 -}} -{{- include "sawtooth.container.poet-engine" . | nindent 0 }} -{{- else -}} -{{- include "sawtooth.container.devmode-engine" . | nindent 0 }} -{{- end -}} -{{- include "sawtooth.container.settings-tp" . | nindent 0 }} -{{- include "sawtooth.container.block-info-tp" . | nindent 0 }} -{{- include "sawtooth.container.intkey-tp" . | nindent 0 }} -{{- include "sawtooth.container.identity-tp" . | nindent 0 }} -{{- include "sawtooth.container.seth-tp" . | nindent 0 }} -{{- include "sawtooth.container.seth-rpc" . | nindent 0 }} -{{- include "sawtooth.container.smallbank-tp" . | nindent 0 }} -{{- include "sawtooth.container.xo-tp" . | nindent 0 }} -{{- $ctx := .Values -}} -{{- range .Values.sawtooth.customTPs -}} -{{- include "sawtooth.container.customtp" (dict "tp" . "values" $ctx) | nindent 0 }} -{{- end -}} -{{- include "sawtooth.container.rest-api" . | nindent 0 }} -{{- include "sawtooth.container.monitor" . | nindent 0 }} -{{- include "sawtooth.container.validator" . | nindent 0 }} -{{- end -}} - -{{/* -{{ include "sawtooth.loglevel" "container" .Values.sawtooth.containers.validator "global" .Values.global }} -*/}} -{{- define "sawtooth.logLevel" -}} -{{- $defaultLevel := "WARN" -}} -{{- if .global.logLevel -}} -{{- $defaultLevel = (default $defaultLevel .global.logLevel) | upper -}} -{{- end -}} -{{- $level := (default $defaultLevel .container.logLevel) | upper -}} -{{- if eq $level "INFO" -}} --v -{{- else if eq $level "DEBUG" -}} --vv -{{- else if eq $level "TRACE" -}} --vvv -{{- end -}} -{{- end -}} diff --git a/charts/btp/chronicle/charts/sawtooth/templates/_sawtooth_containers.tpl b/charts/btp/chronicle/charts/sawtooth/templates/_sawtooth_containers.tpl deleted file mode 100644 index 33ee21181..000000000 --- a/charts/btp/chronicle/charts/sawtooth/templates/_sawtooth_containers.tpl +++ /dev/null @@ -1,441 +0,0 @@ - -{{- define "sawtooth.ports.sawcomp" -}} -{{ .Values.sawtooth.ports.sawcomp }} -{{- end -}} - -{{- define "sawtooth.ports.consensus" -}} -{{ .Values.sawtooth.ports.consensus }} -{{- end -}} - -{{- define "sawtooth.ports.rest" -}} -{{ .Values.sawtooth.ports.rest }} -{{- end -}} - -{{- define "sawtooth.ports.sawnet" -}} -{{ .Values.sawtooth.ports.sawnet }} -{{- end -}} - - -{{- define "sawtooth.container.env.nodename" -}} -{{- $consensus := .values.sawtooth.consensus | int -}} -- name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name -- name: POD_IP - valueFrom: - fieldRef: - fieldPath: status.podIP -- name: NODE_NAME - # Since this a stateful set we use the pod name as the node name - valueFrom: - fieldRef: -{{- if or .values.sawtooth.statefulset.enabled (eq $consensus 100) }} - fieldPath: metadata.name -{{- else }} - fieldPath: spec.nodeName -{{- end }} -{{- end -}} - -{{/* -{{ include "sawtooth.container.env" (dict "container" .Values.sawtooth.containers.validator "values" .Values)}} -*/}} -{{- define "sawtooth.container.env" -}} -env: - {{- include "sawtooth.container.env.nodename" . | nindent 2 -}} - {{- if .values.pagerduty.enabled }} - - name: ALERT_TOKEN - value: {{ .values.pagerduty.token | quote }} - - name: SERVICE_ID - value: {{ .values.pagerduty.serviceid | quote }} - {{ end -}} -{{- if .container.env -}} - {{- toYaml .container.env | nindent 2 }} -{{- end -}} -{{- end -}} - -{{- define "sawtooth.container.resources" -}} -{{- if .container.resources -}} -resources: {{- toYaml .container.resources | nindent 2 }} -{{- end -}} -{{- end -}} - -{{/* -{{ include "sawtooth.container" (dict "container" .Values.sawtooth.containers.validator "values" .Values "global" .Values.global)}} -*/}} -{{- define "sawtooth.container" -}} -{{- include "lib.image" (dict "imageRoot" .container.image "values" .values "global" .global ) |nindent 0 }} -{{- include "sawtooth.container.command" . | nindent 0 }} -{{- include "sawtooth.container.env" . | nindent 0 }} -{{- include "sawtooth.container.resources" . | nindent 0 }} -{{- end -}} - -{{- define "sawtooth.container.command" -}} -command: [ "bash", "-xc"] -{{- end -}} - -{{- define "sawtooth.container.pbft-engine" -}} -{{ $ctx := dict "container" .Values.sawtooth.containers.pbft_engine "values" .Values "global" .Values.global }} -{{- $signal := "pbft-engine" -}} -- name: pbft-engine - {{- include "sawtooth.container" $ctx | nindent 2 }} - args: - - | - rm -f /var/lib/sawtooth/pbft.log - pbft-engine {{ include "sawtooth.logLevel" $ctx }} \ - -C tcp://127.0.0.1:{{ include "sawtooth.ports.consensus" . }} \ - --storage-location disk+/var/lib/sawtooth/pbft.log - lifecycle: - {{- include "sawtooth.signal.postStart" "pbft-engine" | nindent 4 }} - {{- include "sawtooth.signal.livenessProbe" "pbft-engine" | nindent 2 }} - volumeMounts: - {{- include "sawtooth.signals.mount" . | nindent 4 }} - {{- include "sawtooth.data.mount" . | nindent 4 }} - {{- include "lib.volumeMounts" .Values.extraVolumeMounts | nindent 4 }} -{{- end -}} - -{{- define "sawtooth.container.raft-engine" -}} -{{- $ctx := dict "container" .Values.sawtooth.containers.raft_engine "values" .Values "global" .Values.global -}} -- name: raft-engine - {{- include "sawtooth.container" $ctx | nindent 2 }} - args: - - | - raft-engine {{ include "sawtooth.logLevel" $ctx }} \ - -C tcp://127.0.0.1:{{ include "sawtooth.ports.consensus" . }} - volumeMounts: - {{- include "sawtooth.signals.mount" . | nindent 4 }} - {{- include "sawtooth.etc.mount" . | nindent 4 }} - {{- include "sawtooth.data.mount" . | nindent 4 }} - {{- include "lib.volumeMounts" .Values.extraVolumeMounts | nindent 4 }} -{{- end -}} - -{{- define "sawtooth.container.poet-engine" -}} -{{- $ctx := dict "container" .Values.sawtooth.containers.poet_engine "values" .Values "global" .Values.global -}} -- name: poet-engine - {{- include "sawtooth.container" $ctx | nindent 2 }} - args: - - | - poet-engine {{ include "sawtooth.logLevel" $ctx }} \ - --connect tcp://127.0.0.1:{{ include "sawtooth.ports.consensus" . }} \ - --component tcp://127.0.0.1:{{ include "sawtooth.ports.sawcomp" . }} - volumeMounts: - {{- include "sawtooth.signals.mount" . | nindent 4 }} - {{- include "sawtooth.etc.mount" . | nindent 4 }} - {{- include "sawtooth.data.mount" . | nindent 4 }} - {{- include "lib.volumeMounts" .Values.extraVolumeMounts | nindent 4 }} -- name: poet-validator-registry-tp - {{- include "sawtooth.container" $ctx | nindent 2 }} - args: - - | - poet-validator-registry-tp {{ include "sawtooth.logLevel" $ctx }} \ - -C tcp://127.0.0.1:{{ include "sawtooth.ports.sawcomp" . }} - volumeMounts: - {{- include "sawtooth.signals.mount" . | nindent 4 }} - {{- include "sawtooth.etc.mount" . | nindent 4 }} - {{- include "sawtooth.data.mount" .| nindent 4 }} - {{- include "lib.volumeMounts" .Values.extraVolumeMounts | nindent 4 }} -{{- end -}} - -{{- define "sawtooth.container.devmode-engine" -}} -{{- $ctx := dict "container" .Values.sawtooth.containers.devmode_engine "values" .Values "global" .Values.global -}} -- name: devmode-engine - {{- include "sawtooth.container" $ctx | nindent 2 }} - args: - - | - devmode-engine-rust {{ include "sawtooth.logLevel" $ctx }} \ - -C tcp://127.0.0.1:{{ include "sawtooth.ports.consensus" . }} - volumeMounts: - {{- include "sawtooth.signals.mount" . | nindent 4 }} - {{- include "lib.volumeMounts" .Values.extraVolumeMounts | nindent 4 }} -{{- end -}} - -{{- define "sawtooth.container.settings-tp" -}} -{{- $ctx := dict "container" .Values.sawtooth.containers.settings_tp "values" .Values "global" .Values.global -}} -- name: settings-tp - {{- include "sawtooth.container" $ctx | nindent 2 }} - args: - - | - settings-tp {{ include "sawtooth.logLevel" $ctx }} \ - {{ .Values.sawtooth.containers.settings_tp.args }} \ - --connect tcp://127.0.0.1:{{ include "sawtooth.ports.sawcomp" . }} - volumeMounts: - {{- include "sawtooth.signals.mount" . | nindent 4 }} - {{- include "lib.volumeMounts" .Values.extraVolumeMounts | nindent 4 }} -{{- end -}} - -{{- define "sawtooth.container.intkey-tp" -}} -{{- $ctx := dict "container" .Values.sawtooth.containers.intkey_tp "values" .Values "global" .Values.global -}} -- name: intkey-tp - {{- include "sawtooth.container" $ctx | nindent 2 }} - args: - - | - intkey-tp-go {{ include "sawtooth.logLevel" $ctx }} \ - --connect tcp://127.0.0.1:{{ include "sawtooth.ports.sawcomp" . }} - volumeMounts: - {{- include "sawtooth.signals.mount" . | nindent 4 }} - {{- include "lib.volumeMounts" .Values.extraVolumeMounts | nindent 4 }} -{{- end -}} - -{{- define "sawtooth.container.identity-tp" -}} -{{- $ctx := dict "container" .Values.sawtooth.containers.identity_tp "values" .Values "global" .Values.global -}} -{{- if .Values.sawtooth.permissioned -}} -- name: identity-tp - {{- include "sawtooth.container" $ctx | nindent 2 }} - args: - - | - identity-tp {{ include "sawtooth.logLevel" $ctx }} \ - {{ .Values.sawtooth.containers.identity_tp.args }} \ - -C tcp://127.0.0.1:{{ include "sawtooth.ports.sawcomp" . }} - volumeMounts: - {{- include "sawtooth.signals.mount" . | nindent 4 }} - {{- include "lib.volumeMounts" .Values.extraVolumeMounts | nindent 4 }} -{{- else -}} -# no identity-tp -{{- end -}} -{{- end -}} - -{{- define "sawtooth.container.block-info-tp" -}} -{{- $ctx := dict "container" .Values.sawtooth.containers.block_info "values" .Values "global" .Values.global -}} -- name: block-info-tp - {{- include "sawtooth.container" $ctx | nindent 2 }} - args: - - | - block-info-tp {{ include "sawtooth.logLevel" $ctx }} \ - {{ .Values.sawtooth.containers.block_info.args }} \ - -C tcp://127.0.0.1:{{ include "sawtooth.ports.sawcomp" . }} - lifecycle: - {{- include "sawtooth.signal.postStart" "block-info-tp" | nindent 4 }} - {{- include "sawtooth.signal.livenessProbe" "block-info-tp" | nindent 2 }} - volumeMounts: - {{- include "sawtooth.signals.mount" . | nindent 4 }} - {{- include "lib.volumeMounts" .Values.extraVolumeMounts | nindent 4 }} -{{- end -}} - -{{- define "sawtooth.container.monitor" -}} -{{- $ctx := dict "container" .Values.sawtooth.containers.monitor "values" .Values "global" .Values.global -}} -- name: monitor - {{- include "sawtooth.container" $ctx | nindent 2 }} - args: - - | - sawtooth keygen && \ - sleep {{ .Values.sawtooth.client_wait }} && \ - /usr/local/bin/heartbeat_loop.sh \ - http://127.0.0.1:{{ include "sawtooth.ports.rest" . }} \ - test-$RANDOM {{ .Values.sawtooth.heartbeat.interval }} - volumeMounts: - {{- include "sawtooth.signals.mount" . | nindent 4 }} - {{- include "sawtooth.etc.mount" . | nindent 4 }} - {{- include "lib.volumeMounts" .Values.extraVolumeMounts | nindent 4 }} -{{- end -}} - -{{- define "sawtooth.container.xo-tp" -}} -{{- $ctx := dict "container" .Values.sawtooth.containers.xo_tp "values" .Values "global" .Values.global -}} -{{- if .Values.sawtooth.xo.enabled -}} -- name: xo-tp - {{- include "sawtooth.container" $ctx | nindent 2 }} - args: - - | - xo-tp-go {{ include "sawtooth.logLevel" $ctx }} \ - --connect tcp://127.0.0.1:{{ include "sawtooth.ports.sawcomp" . }} - volumeMounts: - {{- include "sawtooth.signals.mount" . | nindent 4 }} - {{- include "lib.volumeMounts" .Values.extraVolumeMounts | nindent 4 }} -{{- else -}} -# no xo-tp -{{- end -}} -{{- end -}} - -{{- define "sawtooth.container.smallbank-tp" -}} -{{- $ctx := dict "container" .Values.sawtooth.containers.smallbank_tp "values" .Values "global" .Values.global -}} -{{- if .Values.sawtooth.smallbank.enabled -}} -- name: smallbank-tp - {{- include "sawtooth.container" $ctx | nindent 2 }} - args: - - | - smallbank-tp-go {{ include "sawtooth.logLevel" $ctx }} \ - --connect tcp://127.0.0.1:{{ include "sawtooth.ports.sawcomp" . }} - volumeMounts: - {{- include "sawtooth.signals.mount" . | nindent 4 }} - {{- include "lib.volumeMounts" .Values.extraVolumeMounts | nindent 4 }} -{{- else -}} -# no smallbank-tp -{{- end -}} -{{- end -}} - -{{- define "sawtooth.container.rest-api" -}} -{{- $ctx := dict "container" .Values.sawtooth.containers.rest_api "values" .Values "global" .Values.global -}} -- name: rest-api - {{- include "sawtooth.container" $ctx | nindent 2 }} - args: - - | - sleep {{ .Values.sawtooth.client_wait }} - sawtooth-rest-api {{ include "sawtooth.logLevel" $ctx }} \ - {{ .Values.sawtooth.containers.rest_api.args }} \ - --bind 0.0.0.0:{{ include "sawtooth.ports.rest" . }} \ - --connect tcp://127.0.0.1:{{ include "sawtooth.ports.sawcomp" . }} \ - {{ include "sawtooth.opentsdb" . | indent 8 }} - ports: - - containerPort: {{ include "sawtooth.ports.rest" . }} - name: sawrest - volumeMounts: - {{- include "sawtooth.signals.mount" . | nindent 4 }} - {{- include "lib.volumeMounts" .Values.extraVolumeMounts | nindent 4 }} -{{- end -}} - -{{- define "sawtooth.container.customtp" -}} -- name: {{ .tp.name }} - image: {{ .tp.image }} - {{ if .tp.command }}command: [ {{ range .tp.command }}"{{ . }}",{{ end }} ]{{end }} - {{ if .tp.args }}args: [ {{ range .tp.args }}"{{ . }}", {{ end }} ]{{end }} - env: - {{- include "sawtooth.container.env.nodename" (dict "values" .values) | nindent 4 }} - lifecycle: {{- include "sawtooth.signal.postStart" .tp.name | nindent 4 }} - {{- include "sawtooth.signal.livenessProbe" .tp.name | nindent 2 }} - volumeMounts: - {{- include "sawtooth.signals.mount" . | nindent 4 }} - {{- include "lib.volumeMounts" .values.extraVolumeMounts | nindent 4 }} - resources: {{- default (dict) .tp.resources | toYaml | nindent 4 }} -{{- end -}} - -{{- define "sawtooth.container.poet-registration" -}} -{{- $consensus := .Values.sawtooth.consensus | int -}} -{{- $ctx := dict "container" .Values.sawtooth.containers.poet_registration "values" .Values "global" .Values.global -}} -{{ if eq $consensus 200 }} -- name: poet-registration - {{- include "sawtooth.container" $ctx | nindent 2 }} - args: - - | - mkdir -p /etc/sawtooth/poet - cp /etc/sawtooth/simulator_rk_pub.pem /etc/sawtooth/; - if [ ! -f /etc/sawtooth/poet/poet-enclave-measurement ]; then - poet enclave measurement > /etc/sawtooth/poet/poet-enclave-measurement; - fi - if [ ! -f /etc/sawtooth/poet/poet-enclave-basename ]; then - poet enclave basename > /etc/sawtoothetc/poet/poet-enclave-basename; - fi - if [ ! -f /etc/sawtooth/initialized ]; then - poet registration create --enclave-module simulator \ - -k /etc/sawtooth/keys/validator.priv \ - -o /etc/sawtooth/genesis/200.poet.batch - fi - volumeMounts: - {{- include "sawtooth.etc.mount" . | nindent 4 }} - {{- include "sawtooth.data.mount" . | nindent 4 }} - {{- include "lib.volumeMounts" .Values.extraVolumeMounts | nindent 4 }} -{{- end -}} -{{- end -}} - -{{- define "sawtooth.container.seth-tp" -}} -{{- $ctx := dict "container" .Values.sawtooth.containers.seth_tp "values" .Values "global" .Values.global -}} -{{- if .Values.sawtooth.seth.enabled -}} -- name: seth-tp - {{- include "sawtooth.container" $ctx | nindent 2 }} - args: - - | - seth-tp {{ include "sawtooth.logLevel" $ctx }} \ - --connect tcp://127.0.0.1:{{ include "sawtooth.ports.sawcomp" . }} - volumeMounts: - {{- include "sawtooth.signals.mount" . | nindent 4 }} - {{- include "lib.volumeMounts" .Values.extraVolumeMounts | nindent 4 }} -{{- else -}} -# no seth-tp -{{- end -}} -{{- end -}} - -{{- define "sawtooth.container.seth-rpc" -}} -{{- $ctx := dict "container" .Values.sawtooth.containers.seth_rpc "values" .Values "global" .Values.global -}} -{{- if .Values.sawtooth.seth.enabled -}} -- name: seth-rpc - {{- include "sawtooth.container" $ctx | nindent 2 }} - args: - - | - sleep {{ .Values.sawtooth.client_wait }} && \ - seth-rpc {{ include "sawtooth.logLevel" $ctx }} \ - --bind 0.0.0.0:3030 \ - --connect tcp://127.0.0.1:{{ include "sawtooth.ports.sawcomp" . }} - volumeMounts: - {{- include "sawtooth.signals.mount" . | nindent 4 }} - {{- include "lib.volumeMounts" .Values.extraVolumeMounts | nindent 4 }} - ports: - - containerPort: 3030 - name: seth-rpc -{{- else -}} -# no seth-rpc -{{- end -}} -{{- end -}} - -{{- define "sawtooth.container.validator.livenessProbe" -}} -{{if .Values.sawtooth.livenessProbe.enabled }} -exec: - command: - - /bin/bash - - -c - - | - export SIGNALS_DIR={{ include "sawtooth.signals.dir" . }} - export EXIT_SIGNALS="{{ .Values.sawtooth.livenessProbe.exitSignals }}" - export LIVENESS_PROBE_ACTIVE="{{ .Values.sawtooth.livenessProbe.active }}" - /usr/local/bin/liveness_probe.sh -initialDelaySeconds: {{ .Values.sawtooth.livenessProbe.initialDelaySeconds }} -periodSeconds: {{ .Values.sawtooth.livenessProbe.periodSeconds }} -{{- end -}} -{{- end -}} - -{{- define "sawtooth.container.validator.lifecycle" -}} -preStop: - exec: - command: - - bash - - -c - - | - export EXIT_SIGNALS="{{ .Values.sawtooth.livenessProbe.exitSignals }}" - for signal in ${EXIT_SIGNALS}; do - touch "{{ include "sawtooth.signals.dir" . }}/$signal" - done -postStart: - exec: - command: - - bash - - -c - - | - RUN_DIR=/var/run/sawtooth - rm -f $RUN_DIR/probe.* - rm -f $RUN_DIR/catchup.started - rm -f $RUN_DIR/last* - rm -f $RUN_DIR/pbft_seq* -{{- end -}} - -{{- define "sawtooth.container.validator" -}} -{{- $ctx := dict "container" .Values.sawtooth.containers.validator "values" .Values "global" .Values.global -}} -- name: validator - {{- include "sawtooth.container" $ctx | nindent 2 }} - lifecycle: - {{- include "sawtooth.container.validator.lifecycle" . | nindent 4 }} - args: - - | - source /opt/chart/scripts/validator-env - {{- include "sawtooth.genesis.create" . | nindent 6 }} - sawtooth-validator {{ include "sawtooth.logLevel" $ctx }} \ - {{ .Values.sawtooth.containers.validator.args}} --scheduler {{ .Values.sawtooth.scheduler }} \ - --endpoint tcp://${NODE_NAME}:{{ include "sawtooth.ports.sawnet" . }} \ - {{- include "sawtooth.network" . | nindent 8 -}} \ - ; - {{- include "sawtooth.signal.fire" . | nindent 6 }} - volumeMounts: - {{- include "sawtooth.signals.mount" . | nindent 4 }} - {{- include "sawtooth.etc.mount" . | nindent 4 }} - {{- include "sawtooth.data.mount" . | nindent 4 }} - {{- include "sawtooth.scripts.mount" . | nindent 4 }} - {{- include "lib.volumeMounts" .Values.extraVolumeMounts | nindent 4 }} - livenessProbe: - {{- include "sawtooth.container.validator.livenessProbe" . | nindent 4 }} - ports: - - containerPort: {{ include "sawtooth.ports.sawcomp" . }} - name: sawcomp - - containerPort: {{ include "sawtooth.ports.sawnet" . }} - {{- if not .Values.sawtooth.statefulset.enabled }} - hostPort: {{ include "sawtooth.ports.sawnet" . }} - {{- end }} - name: sawnet - - containerPort: {{ include "sawtooth.ports.consensus" . }} - name: consensus -{{- end -}} diff --git a/charts/btp/chronicle/charts/sawtooth/templates/_utils.tpl b/charts/btp/chronicle/charts/sawtooth/templates/_utils.tpl deleted file mode 100644 index 19ba4bcd9..000000000 --- a/charts/btp/chronicle/charts/sawtooth/templates/_utils.tpl +++ /dev/null @@ -1,8 +0,0 @@ - - -{{/* */}} -{{- define "utils.hostaliases" -}} -{{- if .Values.hostAliases -}} -{{ toYaml .Values.hostAliases }} -{{- end -}} -{{- end -}} diff --git a/charts/btp/chronicle/charts/sawtooth/templates/ingress.yaml b/charts/btp/chronicle/charts/sawtooth/templates/ingress.yaml deleted file mode 100644 index c21fa1b8c..000000000 --- a/charts/btp/chronicle/charts/sawtooth/templates/ingress.yaml +++ /dev/null @@ -1,6 +0,0 @@ -{{- if .Values.ingress.enabled -}} -{{- $serviceName := include "common.names.fullname" . -}} -{{- $ingressName := printf "%s-rest" $serviceName -}} -{{- $servicePort := include "sawtooth.ports.rest" . | int -}} -{{ include "lib.ingress" (dict "ingressName" $ingressName "ingress" .Values.ingress "serviceName" $serviceName "servicePort" $servicePort "context" $) }} -{{- end -}} diff --git a/charts/btp/chronicle/charts/sawtooth/templates/pernode-services.yaml b/charts/btp/chronicle/charts/sawtooth/templates/pernode-services.yaml deleted file mode 100644 index fa9c80820..000000000 --- a/charts/btp/chronicle/charts/sawtooth/templates/pernode-services.yaml +++ /dev/null @@ -1,38 +0,0 @@ - -{{- $consensus := .Values.sawtooth.consensus | int -}} -{{- if or .Values.sawtooth.statefulset.enabled (eq $consensus 100) -}} -{{- $ctx := . -}} -# {{ include "sawtooth.replicas" $ctx }} enodes -{{ range untilStep 0 ((include "sawtooth.replicas" $ctx) | int) 1 }} ---- -apiVersion: v1 -kind: Service -metadata: - labels: {{ include "sawtooth.labels" $ctx | nindent 4}} - per-node: {{ include "common.names.fullname" $ctx }}-{{ . }} - component: sawtooth - name: {{ include "common.names.fullname" $ctx }}-{{ . }} - namespace: {{ $ctx.Release.Namespace }} -spec: - type: {{ $ctx.Values.sawtooth.perNodeServiceType }} - sessionAffinity: ClientIP - ports: - - port: {{ include "sawtooth.ports.rest" $ctx }} - protocol: TCP - targetPort: {{ include "sawtooth.ports.rest" $ctx }} - name: rest-api - - port: {{ include "sawtooth.ports.sawnet" $ctx }} - protocol: TCP - targetPort: {{ include "sawtooth.ports.sawnet" $ctx }} - name: sawnet - - port: {{ include "sawtooth.ports.sawcomp" $ctx }} - protocol: TCP - targetPort: {{ include "sawtooth.ports.sawcomp" $ctx }} - name: sawcomp - selector: {{- include "sawtooth.labels.matchLabels" $ctx | nindent 4 }} - statefulset.kubernetes.io/pod-name: {{ include "common.names.fullname" $ctx }}-{{ . }} -{{- end -}} -{{- else -}} ---- -# no enodes -{{- end -}} diff --git a/charts/btp/chronicle/charts/sawtooth/templates/serviceaccount.yaml b/charts/btp/chronicle/charts/sawtooth/templates/serviceaccount.yaml deleted file mode 100644 index 65c669296..000000000 --- a/charts/btp/chronicle/charts/sawtooth/templates/serviceaccount.yaml +++ /dev/null @@ -1,13 +0,0 @@ ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ include "lib.serviceAccountName" . }} - namespace: {{ .Release.Namespace }} -automountServiceAccountToken: false -{{ if .Values.imagePullSecrets.enabled }} -imagePullSecrets: -{{range .Values.imagePullSecrets.value }} - - name: {{ .name }} -{{ end }} -{{ end }} diff --git a/charts/btp/chronicle/charts/sawtooth/templates/validator-clusterroles.yaml b/charts/btp/chronicle/charts/sawtooth/templates/validator-clusterroles.yaml deleted file mode 100644 index c161b1b90..000000000 --- a/charts/btp/chronicle/charts/sawtooth/templates/validator-clusterroles.yaml +++ /dev/null @@ -1,24 +0,0 @@ ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ .Release.Namespace}}-{{include "common.names.fullname" .}} - labels: {{ include "sawtooth.labels" . | nindent 4 }} -rules: - - apiGroups: ["","apps/v1"] # "" refers to the core API group - resources: ["nodes"] - verbs: ["get", "list", "watch"] ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ .Release.Namespace}}-{{include "common.names.fullname" .}} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ .Release.Namespace}}-{{include "common.names.fullname" .}} -subjects: -- kind: ServiceAccount - name: {{ include "lib.serviceAccountName" . }} - namespace: {{ .Release.Namespace }} ---- diff --git a/charts/btp/chronicle/charts/sawtooth/templates/validator-env-configmap.yaml b/charts/btp/chronicle/charts/sawtooth/templates/validator-env-configmap.yaml deleted file mode 100644 index 37881defc..000000000 --- a/charts/btp/chronicle/charts/sawtooth/templates/validator-env-configmap.yaml +++ /dev/null @@ -1,98 +0,0 @@ -{{- $consensus := .Values.sawtooth.consensus | int -}} - ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "common.names.fullname" . }}-scripts - namespace: {{ .Release.Namespace }} - labels: {{ include "sawtooth.labels" . | nindent 4}} -data: - validator-env: |- - #!/bin/bash - - BIN_DIR=/usr/local/bin - - function get_local_pods() { - kubectl get pod -l "app={{ include "common.names.fullname" . }}" \ - --no-headers=true -o name | sed -e 's/pod\///g' - } - - function get_all_nodes() { - for pod in $(get_local_pods); do - get_node_for_pod $pod - done | sort - } - - function get_genesis_node() { - kubectl get configmap {{ include "common.names.fullname" . }}-genesis -o jsonpath='{.data.node}' - } - - function get_node_for_pod() { - local pod=${1:?} - {{ if or .Values.sawtooth.statefulset.enabled (eq $consensus 100) -}} - echo "$pod" - {{- else -}} - kubectl get pod "$pod" -o jsonpath='{ $.spec.nodeName }' - {{- end }} - } - - declare -a host_list - for node in $(get_all_nodes); do - host_list+=("$node") - done - - export SEEDS= - export PEERS= - MY_NODE_NAME=$(get_node_for_pod $POD_NAME) - MY_PEERS=() - export DELAY=0 - - echo "Local Hosts Visible ${host_list[@]}" - this_list=("${host_list[@]}") - for host in "${host_list[@]}"; do - this_list=("${this_list[@]:1}") - if [ "$host" == "$MY_NODE_NAME" ]; then - while [ -n "${this_list[0]}" ]; do - MY_PEERS+=("${this_list[0]}") - this_list=("${this_list[@]:1}") - done - else - ((DELAY += 1)) - fi - done - - for peer in "${MY_PEERS[@]}"; do - export SEEDS="--seeds tcp://$peer:{{ include "sawtooth.ports.sawnet" . }} $SEEDS" - export PEERS="--peers tcp://$peer:{{ include "sawtooth.ports.sawnet" . }} $PEERS" - done - - SET_GENESIS_NODE=${host_list[0]} - - GENESIS_NODE=$(get_genesis_node) - while [ -z "$GENESIS_NODE" ]; do - sleep "$(echo $RANDOM | cut -c1-2)" - GENESIS_NODE=$(get_genesis_node) - if [ -z "$GENESIS_NODE" ]; then - "${BIN_DIR}/upsert_cm.sh" {{ include "common.names.fullname" . }}-genesis node "$SET_GENESIS_NODE" - fi - done - GENESIS_NODE=$(get_genesis_node) - - "${BIN_DIR}/upsert_cm.sh" validator-public "$NODE_NAME" "$(cat /etc/sawtooth/keys/validator.pub)" - "${BIN_DIR}/upsert_cm.sh" validator-secret "$NODE_NAME" "$(cat /etc/sawtooth/keys/validator.priv)" - - if [ "$GENESIS_NODE" = "$NODE_NAME" ]; then - export RUN_GENESIS=1 - if [ ! -r /etc/sawtooth/initialized ]; then - PODCOUNT=$(get_local_pods | wc -l) - KEYCOUNT=$("${BIN_DIR}/get_local_public_keys.sh" "{{ .Release.Namespace }}" | wc -l) - while [ "$PODCOUNT" != "$KEYCOUNT" ]; do - sleep "$DELAY" - PODCOUNT=$(get_local_pods | wc -l) - KEYCOUNT=$("${BIN_DIR}/get_local_public_keys.sh" "{{ .Release.Namespace }}" | wc -l) - done - fi - else - export RUN_GENESIS=0 - fi diff --git a/charts/btp/chronicle/charts/sawtooth/templates/validator-roles.yaml b/charts/btp/chronicle/charts/sawtooth/templates/validator-roles.yaml deleted file mode 100644 index 305b01809..000000000 --- a/charts/btp/chronicle/charts/sawtooth/templates/validator-roles.yaml +++ /dev/null @@ -1,30 +0,0 @@ ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: {{include "common.names.fullname" .}} - namespace: {{ .Release.Namespace }} - labels: {{ include "sawtooth.labels" . | nindent 4 }} -rules: - - apiGroups: ["","apps/v1"] # "" refers to the core API group - resources: ["services", "pods"] - verbs: ["get", "list", "watch"] - - apiGroups: ["","apps/v1"] # "" refers to the core API group - resources: ["configmaps"] - verbs: ["get", "create", "list", "watch", "patch"] ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: {{include "common.names.fullname" .}} - namespace: {{ .Release.Namespace }} - labels: {{ include "sawtooth.labels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: {{include "common.names.fullname" .}} -subjects: -- kind: ServiceAccount - name: {{ include "lib.serviceAccountName" . }} - namespace: {{ .Release.Namespace }} ---- diff --git a/charts/btp/chronicle/charts/sawtooth/templates/validator-set.yaml b/charts/btp/chronicle/charts/sawtooth/templates/validator-set.yaml deleted file mode 100644 index 806016ba9..000000000 --- a/charts/btp/chronicle/charts/sawtooth/templates/validator-set.yaml +++ /dev/null @@ -1,67 +0,0 @@ -{{ $consensus := .Values.sawtooth.consensus | int }} ---- -apiVersion: apps/v1 -kind: {{ include "sawtooth.kind" . }} -metadata: - name: {{ include "common.names.fullname" . }} - namespace: {{ .Release.Namespace }} - labels: {{ include "sawtooth.labels" . | nindent 4}} -spec: - {{ if or .Values.sawtooth.statefulset.enabled (eq $consensus 100) -}} - replicas: {{ include "sawtooth.replicas" . | int }} - serviceName: {{ include "common.names.fullname" . | quote }} - podManagementPolicy: Parallel - {{- end }} - updateStrategy: - type: RollingUpdate - {{ if not (or .Values.sawtooth.statefulset.enabled (eq $consensus 100)) }} - rollingUpdate: - maxUnavailable: {{ .Values.sawtooth.maxUnavailable | int }} - {{- end }} - {{ if (semverCompare "^1.22" .Capabilities.KubeVersion.Version) -}} - minReadySeconds: {{ .Values.sawtooth.minReadySeconds | int }} - {{- end }} - selector: - matchLabels: {{- include "sawtooth.labels.matchLabels" . | nindent 6 }} - template: - metadata: - labels: {{- include "sawtooth.labels.matchLabels" . | nindent 8 }} - annotations: {{- toYaml .Values.sawtooth.statefulset.podAnnotations | nindent 8 }} - spec: - serviceAccountName: {{ include "lib.serviceAccountName" . }} - automountServiceAccountToken: true - affinity: {{- include "sawtooth.affinity" . | nindent 8 }} - hostAliases: {{- include "sawtooth.hostaliases" . | nindent 8 }} - containers: {{- include "sawtooth.containers" . | nindent 8 }} - initContainers: - - name: setup - {{- include "lib.image" (dict "imageRoot" .Values.sawtooth.containers.validator.image "global" .Values.global ) |nindent 10 }} - volumeMounts: - {{- include "sawtooth.etc.mount" . | nindent 12 }} - {{- include "sawtooth.data.mount" . | nindent 12 }} - {{- include "lib.volumeMounts" .Values.extraVolumeMounts | nindent 12 }} - {{- include "sawtooth.container.command" . | nindent 10 }} - {{- include "sawtooth.container.env" (dict "container" .Values.sawtooth.containers.validator "values" .Values "global" .Values.global) | nindent 10 }} - args: - - | - {{- include "sawtooth.genesis.reset" . | nindent 14 }} - mkdir -p /etc/sawtooth/genesis - mkdir -p /etc/sawtooth/keys - if [ ! -r /etc/sawtooth/keys/validator.priv ]; then - sawadm keygen --force - fi - {{ if .Values.sawtooth.genesis.enabled }} - {{- include "sawtooth.container.poet-registration" . | nindent 8 }} - {{ end }} - volumes: - {{- include "sawtooth.signals.volume" . | nindent 8 }} - {{- include "sawtooth.scripts.volume" . | nindent 8 }} - {{- include "lib.volumes" .Values.extraVolumes | nindent 8 }} -{{ if or .Values.sawtooth.statefulset.enabled (eq $consensus 100) }} - volumeClaimTemplates: - {{- include "sawtooth.data.volume.vct" . | nindent 4 }} - {{- include "sawtooth.etc.volume.vct" . | nindent 4 }} -{{ else }} - {{- include "sawtooth.etc.volume" . | nindent 8 }} - {{- include "sawtooth.data.volume" . | nindent 8 }} -{{ end }} diff --git a/charts/btp/chronicle/charts/sawtooth/templates/validators-svcs.yaml b/charts/btp/chronicle/charts/sawtooth/templates/validators-svcs.yaml deleted file mode 100644 index a6efa8b33..000000000 --- a/charts/btp/chronicle/charts/sawtooth/templates/validators-svcs.yaml +++ /dev/null @@ -1,27 +0,0 @@ -{{$peering:= .Values.sawtooth.dynamicPeering }} ---- - -apiVersion: v1 -kind: Service -metadata: - name: {{ include "common.names.fullname" . }} - namespace: {{ .Release.Namespace }} - labels: {{ include "sawtooth.labels" . | nindent 4}} - component: sawtooth -spec: - type: ClusterIP - clusterIP: None - ports: - - port: {{ include "sawtooth.ports.rest" . }} - protocol: TCP - targetPort: {{ include "sawtooth.ports.rest" . }} - name: rest-api - - port: {{ include "sawtooth.ports.sawnet" . }} - protocol: TCP - targetPort: {{ include "sawtooth.ports.sawnet" . }} - name: sawnet - - port: {{ include "sawtooth.ports.sawcomp" . }} - protocol: TCP - targetPort: {{ include "sawtooth.ports.sawcomp" . }} - name: sawcomp - selector: {{- include "sawtooth.labels.matchLabels" . | nindent 4 }} diff --git a/charts/btp/chronicle/charts/sawtooth/values.yaml b/charts/btp/chronicle/charts/sawtooth/values.yaml deleted file mode 100644 index 1727e5a0a..000000000 --- a/charts/btp/chronicle/charts/sawtooth/values.yaml +++ /dev/null @@ -1,480 +0,0 @@ ---- -## @md # Sawtoooth -## @md -## @md | field | description | default | -## @md |-|-|-| - -affinity: - ## @md | `affinity.enabled` | false: no effect true: then validators will be deployed only to k8s nodes with the label `app={{ .sawtooth.networkName }}-validator` | false | - # Normally set this as disabled. - # If false - no effect, validators are run on every ( or in the case of devmode any one) - # node in the cluster. - # If True, then validators will be deployed only to k8s nodes with the label - # app={{ .sawtooth.networkName }}-validator - enabled: false - -global: - logLevel: warn - image: - registry: - tag: - - -## @md | `commonLabels` | -commonLabels: {} -commonAnnotations: {} -# This is optional, -# if false the values are ignored, -# if true then there should exist a secret within the namespace -# of the given names, multiple values are acceptable -hostAliases: -imagePullSecrets: - ## @md | `imagePullSecrets.enabled` | if true use the list of named imagePullSecrets | false | - enabled: false - ## @md | `imagePullSecrets.value` | a list if named secret references of the form ```- name: secretName```| [] | - value: [] -ingress: - ## @md | `ingress.apiVersion` | if necessary the apiVersion of the ingress may be overridden | "" | - apiVersion: "" - ## @md | `ingress.enabled` | true to enable the ingress to the main service rest-api | false | - enabled: false - ## @md | `ingress.certManager` | true to enable the acme certmanager for this ingress | false | - certManager: false - ## @md | `ingress.hostname` | primary hostname for the ingress | false | - hostname: "sawtooth.local" - ## @md | `ingress.path` | path for the ingress's primary hostname | / | - path: / - ## @md | `ingress.pathType` | pathType for the ingress's primary hostname | nil | - pathType: - ## @md | `ingress.annotations` | annotations for the ingress | {} | - annotations: {} - ## @md | `ingress.tls` | true to enable tls on the ingress with a secrete at hostname-tls | false | - tls: false - ## @md | `ingress.extraHosts` | list of extra hosts to add to the ingress | [] | - extraHosts: [] - ## @md | `ingress.extraPaths` | list of extra paths to add to the primary host of the ingress | [] | - extraPaths: [] - ## @md | `ingress.extraTls` | list of extra tls entries | [] | - extraTls: [] -pagerduty: - ## @md | `pagerduty.enabled` | if true send pagerduty alerts | false | - enabled: false - ## @md | `pagerduty.token` | pagerduty user token | nil | - token: - ## @md | `pagerduty.serviceid` | pagerduty serviceid | nil | - serviceid: -sawtooth: - opentsdb: - ## @md | `sawtooth.opentsdb.db` | name of the opentsdb database to be used | metrics | - db: metrics - ## @md | `sawtooth.opentsdb.url` | url of the opentsdb database to be used | nil | - url: - ## @md | `sawtooth.opentsdb.enabled` | whether to enable the opentsdb metrics | false | - enabled: false - statefulset: - enabled: true - replicas: - podAnnotations: - ## @md | `sawtooth.minReadySeconds` | the minimum time a pod must be Running before proceeding on a rolling update | 120 | - minReadySeconds: 120 - ## @md | `sawtooth.maxUnavailable` | maximum number of pods allowed down on a rollout or update | 1 | - maxUnavailable: 1 - containers: - block_info: - ## @md | `sawtooth.containers.block_info.args` | extra args for block-info-tp | nil | - args: - env: - image: - pullPolicy: - registry: - repository: blockchaintp/sawtooth-block-info-tp - tag: BTP2.1.0 - logLevel: - resources: - limits: - cpu: "250m" - requests: - cpu: "50m" - devmode_engine: - args: - env: - image: - pullPolicy: - registry: - repository: blockchaintp/sawtooth-devmode-engine-rust - tag: BTP2.1.0 - logLevel: - resources: - limits: - cpu: "250m" - requests: - cpu: "50m" - identity_tp: - ## @md | `sawtooth.containers.identity_tp.args` | extra args for identity-tp | nil | - args: - env: - image: - pullPolicy: - registry: - repository: blockchaintp/sawtooth-identity-tp - tag: BTP2.1.0 - logLevel: - resources: - limits: - cpu: "250m" - requests: - cpu: "50m" - intkey_tp: - args: - env: - image: - pullPolicy: - registry: - repository: blockchaintp/sawtooth-intkey-tp-go - tag: BTP2.1.0 - logLevel: - resources: - limits: - cpu: "250m" - requests: - cpu: "50m" - monitor: - args: - env: - image: - pullPolicy: - registry: - repository: blockchaintp/sawtooth-shell - tag: BTP2.1.0 - logLevel: - resources: - limits: - cpu: "100m" - requests: - cpu: "100m" - pbft_engine: - args: - env: - image: - pullPolicy: - registry: - repository: blockchaintp/sawtooth-pbft-engine - tag: BTP2.1.0 - logLevel: - resources: - limits: - cpu: "250m" - requests: - cpu: "50m" - poet_engine: - args: - env: - image: - pullPolicy: - registry: - repository: blockchaintp/sawtooth-poet-engine - tag: BTP2.1.0 - logLevel: - resources: - limits: - cpu: "250m" - requests: - cpu: "50m" - poet_validator_registry_tp: - args: - env: - image: - pullPolicy: - registry: - repository: blockchaintp/sawtooth-poet-validator-registry-tp - tag: BTP2.1.0 - logLevel: - resources: - limits: - cpu: "250m" - requests: - cpu: "50m" - poet_registration: - args: - env: - image: - pullPolicy: - registry: - repository: blockchaintp/sawtooth-poet-cli - tag: BTP2.1.0 - logLevel: - resources: - limits: - cpu: "250m" - requests: - cpu: "50m" - raft_engine: - args: - env: - image: - pullPolicy: - registry: - repository: blockchaintp/sawtooth-raft-engine - tag: BTP2.1.0 - logLevel: - resources: - limits: - cpu: "250m" - requests: - cpu: "50m" - rest_api: - ## @md | `sawtooth.containers.rest_api.args` | extra args for rest-api | nil | - args: - env: - image: - pullPolicy: - registry: - repository: blockchaintp/sawtooth-rest-api - tag: BTP2.1.0 - logLevel: - resources: - limits: - cpu: "250m" - requests: - cpu: "50m" - seth_rpc: - args: - env: - image: - pullPolicy: - registry: - repository: blockchaintp/sawtooth-seth-rpc - tag: BTP2.1.0 - logLevel: - resources: - limits: - cpu: "250m" - requests: - cpu: "50m" - seth_tp: - args: - env: - image: - pullPolicy: - registry: - repository: blockchaintp/sawtooth-seth-tp - tag: BTP2.1.0 - logLevel: - resources: - limits: - cpu: "250m" - requests: - cpu: "50m" - settings_tp: - ## @md | `sawtooth.containers.settings_tp.args` | extra args for settings-tp | nil | - args: - env: - image: - pullPolicy: - registry: - repository: blockchaintp/sawtooth-settings-tp - tag: BTP2.1.0 - logLevel: - resources: - limits: - cpu: "250m" - requests: - cpu: "50m" - smallbank_tp: - args: - env: - image: - pullPolicy: - registry: - repository: blockchaintp/sawtooth-smallbank-tp-go - tag: BTP2.1.0 - logLevel: - resources: - limits: - cpu: "250m" - requests: - cpu: "50m" - validator: - ## @md | `sawtooth.containers.validator.args` | extra args for validator | nil | - args: - ## @md | `sawtooth.containers.validator.env` | list of environment name/value dicts | nil | - env: - - name: RUST_BACKTRACE - value: "1" - image: - pullPolicy: - registry: - repository: blockchaintp/sawtooth-validator - tag: BTP2.1.0 - logLevel: - resources: {} - xo_tp: - args: - env: - image: - pullPolicy: - registry: - repository: blockchaintp/sawtooth-xo-tp-go - tag: BTP2.1.0 - logLevel: - resources: - limits: - cpu: "250m" - requests: - cpu: "50m" - perNodeServiceType: ClusterIP - persistence: - enabled: true - annotations: - accessModes: - - "ReadWriteOnce" - storageClass: - size: 40Gi - ports: - ## @md | `sawtooth.ports.sawnet` | port for the sawtooth validator network | 8800 | - sawnet: 8800 - ## @md | `sawtooth.ports.consensus` | port for the sawtooth consensus network | 5050 | - consensus: 5050 - ## @md | `sawtooth.ports.sawcomp` | port for the sawtooth component network | 4004 | - sawcomp: 4004 - ## @md | `sawtooth.ports.rest` | port for the sawtooth rest-api | 8008 | - rest: 8008 - livenessProbe: - ## @md | `sawtooth.livenessProbe.enabled` | whether to run the livenessProbe on the validator | false | - enabled: false - ## @md | `sawtooth.livenessProbe.initialDelaySeconds` | seconds to wait before running the liveness probe the first time | 300 | - initialDelaySeconds: 300 - ## @md | `sawtooth.livenessProbe.periodSeconds` | interval in seconds to re-run the liveness probe | 120 | - periodSeconds: 120 - ## @md | `sawtooth.livenessProbe.active` | if false, the liveness probe will run and evaluate the the situation, but always return successfully | string | "false" - active: "false" - ## @md | `sawtooth.livenessProbe.exitSignals` | when restarting due to a livenessProbe failure, the validator pod has a "signal" system which will cause it to restart the named containers in this var | "block-info-tp" | - exitSignals: "block-info-tp pbft-engine" - heartbeat: - ## @md | `sawtooth.heartbeat.interval` | interval in seconds to issue a heartbeat | 300 | - interval: 300 - - ## @md | `sawtooth.permissioned` | Whether to run this chain as a permissioned chain or not | false | - permissioned: false - # This MUST be chosen by the user - # Follows DNS naming rules - ## @md | `sawtooth.namespace` | namespace to render these templates into (deprecated) | "prod" | - namespace: prod - # This MUST be chosen by the user. - # Follows DNS naming rules - ## @md | `sawtooth.networkName` | name of this sawtooth network (deprecated) | "mynetwork" | - networkName: mynetwork - # serial or parallel - ## @md | `sawtooth.scheduler` | name of the sawtooth transaction scheduler to use | string | "serial" - scheduler: serial - # 100 - DevMode, 200 - PoET,300 - Raft, 400 - pbft - # Engines can be enabled, but they aren't active unless they are selected - # as the consensus algorithm. - ## @md | `sawtooth.consensus` | id of the the consensus algorithm to use< valid values: 100:DevMode, 200, PoET, 300 - Raft, 400, PBFT | int | 200 - consensus: 200 - genesis: - ## @md | `sawtooth.genesis.enabled` | If true, and the cluster is starting for the first time, then a node will be selected to create and submit the genesis block | true | - enabled: true - ## @md | `sawtooth.genesis.seed` | The seed is an arbitrary string which identifies a given genesis If the data of a given set of nodes is to be wiped out, change this value. | "9a2de774-90b5-11e9-9df0-87e889b0f1c9" | - seed: "9a2de774-90b5-11e9-9df0-87e889b0f1c9" - ## @md | `sawtooth.dynamicPeering` | Dynamic Peering should default to false, since it is a bit unreliable | false | - dynamicPeering: false - ## @md | `sawtooth.externalSeeds` | a list of maps defining validator endpoints external to this deployment | [] | - externalSeeds: [] - seth: - # This should default to false, there appear to be problems with the required - # block_info block injector that this depends upon - ## @md | `sawtooth.seth.enabled` | enabled sawtooth-seth | false | - enabled: false - xo: - # default this to false since you probably don't want it in real life - ## @md | `sawtooth.xo.enabled` | enabled sawtooth-xo-tp | false | - enabled: false - smallbank: - # default this to false since you probably don't want it in real life - ## @md | `sawtooth.smallbank.enabled` | enabled sawtooth-smallbank-tp | false | - enabled: false - volumes: - # This MUST be set, and SHOULD be presented to the user as an option, as it is a likely area - # of customization - ## @md | `sawtooth.hostPathBaseDir` | all sawtooth hostPath directories will be based here | string | /var/lib/btp - hostPathBaseDir: /var/lib/btp/ - # This is an arbitrary cool down period to wait for validators to initialize - # before starting any client operations - ## @md | `sawtooth.client_wait` | arbitrary delay to validator client startup, such as the rest-api | 90 | - client_wait: 90 - ## @md | `sawtooth.customTPs` | a list of [custom tp definitions](#custom-tp-definitions) | nil | - customTPs: - # A list of basic container definitions - # - name: intkey-tp - # image: "blockchaintp/sawtooth-intkey-tp-go:1.0.5" - # command: [ "bash", "-c" ] - # args: [ "intkey-tp-go -v --connect tcp://localhost:4004" ] - ## @md | `sawtooth.affinity` | custom affinity rules for the sawtooth validator deamonset | nil | - affinity: {} - -serviceAccount: - create: true - name: -# The below are mostly controlled by BTP, although an "advanced" option to customize them may be -# presented -## @md | `images` | a map containing all of the image urls used by this template| N/A | -images: - ## @md - ## @md ## Images - ## @md - ## @md | field | default | - ## @md |- |- | - ## @md | `images.devmode_engine` | blockchaintp/sawtooth-devmode-engine-rust:BTP2.1.0 - devmode_engine: - ## @md | `images.pbft_engine` | blockchaintp/sawtooth-pbft-engine:BTP2.1.0 - pbft_engine: - ## @md | `images.poet_cli` | blockchaintp/sawtooth-poet-cli:BTP2.1.0 - poet_cli: - ## @md | `images.poet_engine` | blockchaintp/sawtooth-poet-engine:BTP2.1.0 - poet_engine: - ## @md | `images.poet_validator_registry_tp` | blockchaintp/sawtooth-poet-validator-registry-tp:BTP2.1.0 - poet_validator_registry_tp: - ## @md | `images.raft_engine` | blockchaintp/sawtooth-raft-engine:BTP2.1.0 - raft_engine: - ## @md | `images.block_info_tp` | blockchaintp/sawtooth-block-info-tp:BTP2.1.0 - block_info_tp: - ## @md | `images.identity_tp` | blockchaintp/sawtooth-identity-tp:BTP2.1.0 - identity_tp: - ## @md | `images.intkey_tp` | blockchaintp/sawtooth-intkey-tp-go:BTP2.1.0 - intkey_tp: - ## @md | `images.settings_tp` | blockchaintp/sawtooth-settings-tp:BTP2.1.0 - settings_tp: - ## @md | `images.shell` | blockchaintp/sawtooth-shell:BTP2.1.0 - shell: - ## @md | `images.smallbank_tp` | blockchaintp/sawtooth-smallbank-tp-go:BTP2.1.0 - smallbank_tp: - ## @md | `images.validator` | blockchaintp/sawtooth-validator:BTP2.1.0 - validator: - ## @md | `images.xo_tp` | blockchaintp/sawtooth-xo-tp-go:BTP2.1.0 - xo_tp: - ## @md | `images.rest_api` | blockchaintp/sawtooth-rest-api:BTP2.1.0 - rest_api: - ## @md | `images.seth_rpc` | blockchaintp/sawtooth-seth-rpc:BTP2.1.0 - seth_rpc: - ## @md | `images.seth_tp` | blockchaintp/sawtooth-seth-tp:BTP2.1.0 - seth_tp: - ## @md | `images.xo_demo` | blockchaintp/xo-demo:BTP2.1.0 - xo_demo: - -## @md -## @md ## Custom TP Definitions -## @md -## @md Custom TP definitions are describe using maps with the following fields -## @md -## @md | field | description | default | -## @md |-|-|-| -## @md | `name` | name of the custom tp container(must be unique within the pod) | nil | -## @md | `image` | url of the image for this tp | nil | -## @md | `command` | list of command tokens for this tp | list | nil -## @md | `arg` | list of arguments to the command | nil] | - -## @md | `extraVolumes` | a list of additional volumes to add to all StatefulSets, Deployments, and DaemonSets | `[]` | -extraVolumes: [] -## @md | `extraVolumeMounts` | a list of additional volume mounts to add to all StatefulSet, Deployment, and DaemonSet containers | `[]` | -extraVolumeMounts: [] diff --git a/charts/btp/chronicle/charts/standard-defs/Chart.lock b/charts/btp/chronicle/charts/standard-defs/Chart.lock deleted file mode 100644 index 1527b8ebd..000000000 --- a/charts/btp/chronicle/charts/standard-defs/Chart.lock +++ /dev/null @@ -1,6 +0,0 @@ -dependencies: -- name: common - repository: https://raw.githubusercontent.com/bitnami/charts/pre-2022/bitnami - version: 1.8.0 -digest: sha256:bdd898d81e711e825f3bfc9e0b0e0668382ff1ff02d74874b6b6997ae0bbc9ce -generated: "2022-06-17T20:57:49.357553367Z" diff --git a/charts/btp/chronicle/charts/standard-defs/Chart.yaml b/charts/btp/chronicle/charts/standard-defs/Chart.yaml deleted file mode 100644 index 459af8bc2..000000000 --- a/charts/btp/chronicle/charts/standard-defs/Chart.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: v2 -appVersion: 0.1.0 -dependencies: -- name: common - repository: https://raw.githubusercontent.com/bitnami/charts/pre-2022/bitnami - version: ~1.8.0 -description: BTP Standard Template definitions and dependencies -name: standard-defs -type: library -version: 0.1.3 diff --git a/charts/btp/chronicle/charts/standard-defs/README.md b/charts/btp/chronicle/charts/standard-defs/README.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/charts/btp/chronicle/charts/standard-defs/charts/common/.helmignore b/charts/btp/chronicle/charts/standard-defs/charts/common/.helmignore deleted file mode 100644 index 50af03172..000000000 --- a/charts/btp/chronicle/charts/standard-defs/charts/common/.helmignore +++ /dev/null @@ -1,22 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/charts/btp/chronicle/charts/standard-defs/charts/common/Chart.yaml b/charts/btp/chronicle/charts/standard-defs/charts/common/Chart.yaml deleted file mode 100644 index 344c40384..000000000 --- a/charts/btp/chronicle/charts/standard-defs/charts/common/Chart.yaml +++ /dev/null @@ -1,23 +0,0 @@ -annotations: - category: Infrastructure -apiVersion: v2 -appVersion: 1.8.0 -description: A Library Helm Chart for grouping common logic between bitnami charts. - This chart is not deployable by itself. -home: https://github.com/bitnami/charts/tree/master/bitnami/common -icon: https://bitnami.com/downloads/logos/bitnami-mark.png -keywords: -- common -- helper -- template -- function -- bitnami -maintainers: -- email: containers@bitnami.com - name: Bitnami -name: common -sources: -- https://github.com/bitnami/charts -- http://www.bitnami.com/ -type: library -version: 1.8.0 diff --git a/charts/btp/chronicle/charts/standard-defs/charts/common/README.md b/charts/btp/chronicle/charts/standard-defs/charts/common/README.md deleted file mode 100644 index 054e51f96..000000000 --- a/charts/btp/chronicle/charts/standard-defs/charts/common/README.md +++ /dev/null @@ -1,327 +0,0 @@ -# Bitnami Common Library Chart - -A [Helm Library Chart](https://helm.sh/docs/topics/library_charts/#helm) for grouping common logic between bitnami charts. - -## TL;DR - -```yaml -dependencies: - - name: common - version: 0.x.x - repository: https://charts.bitnami.com/bitnami -``` - -```bash -$ helm dependency update -``` - -```yaml -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "common.names.fullname" . }} -data: - myvalue: "Hello World" -``` - -## Introduction - -This chart provides a common template helpers which can be used to develop new charts using [Helm](https://helm.sh) package manager. - -Bitnami charts can be used with [Kubeapps](https://kubeapps.com/) for deployment and management of Helm Charts in clusters. This Helm chart has been tested on top of [Bitnami Kubernetes Production Runtime](https://kubeprod.io/) (BKPR). Deploy BKPR to get automated TLS certificates, logging and monitoring for your applications. - -## Prerequisites - -- Kubernetes 1.12+ -- Helm 3.1.0 - -## Parameters - -The following table lists the helpers available in the library which are scoped in different sections. - -### Affinities - -| Helper identifier | Description | Expected Input | -|-------------------------------|------------------------------------------------------|------------------------------------------------| -| `common.affinities.node.soft` | Return a soft nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` | -| `common.affinities.node.hard` | Return a hard nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` | -| `common.affinities.pod.soft` | Return a soft podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` | -| `common.affinities.pod.hard` | Return a hard podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` | - -### Capabilities - -| Helper identifier | Description | Expected Input | -|----------------------------------------------|------------------------------------------------------------------------------------------------|-------------------| -| `common.capabilities.kubeVersion` | Return the target Kubernetes version (using client default if .Values.kubeVersion is not set). | `.` Chart context | -| `common.capabilities.cronjob.apiVersion` | Return the appropriate apiVersion for cronjob. | `.` Chart context | -| `common.capabilities.deployment.apiVersion` | Return the appropriate apiVersion for deployment. | `.` Chart context | -| `common.capabilities.statefulset.apiVersion` | Return the appropriate apiVersion for statefulset. | `.` Chart context | -| `common.capabilities.ingress.apiVersion` | Return the appropriate apiVersion for ingress. | `.` Chart context | -| `common.capabilities.rbac.apiVersion` | Return the appropriate apiVersion for RBAC resources. | `.` Chart context | -| `common.capabilities.crd.apiVersion` | Return the appropriate apiVersion for CRDs. | `.` Chart context | -| `common.capabilities.policy.apiVersion` | Return the appropriate apiVersion for policy | `.` Chart context | -| `common.capabilities.supportsHelmVersion` | Returns true if the used Helm version is 3.3+ | `.` Chart context | - -### Errors - -| Helper identifier | Description | Expected Input | -|-----------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------| -| `common.errors.upgrade.passwords.empty` | It will ensure required passwords are given when we are upgrading a chart. If `validationErrors` is not empty it will throw an error and will stop the upgrade action. | `dict "validationErrors" (list $validationError00 $validationError01) "context" $` | - -### Images - -| Helper identifier | Description | Expected Input | -|-----------------------------|------------------------------------------------------|---------------------------------------------------------------------------------------------------------| -| `common.images.image` | Return the proper and full image name | `dict "imageRoot" .Values.path.to.the.image "global" $`, see [ImageRoot](#imageroot) for the structure. | -| `common.images.pullSecrets` | Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global` | -| `common.images.renderPullSecrets` | Return the proper Docker Image Registry Secret Names (evaluates values as templates) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $` | - -### Ingress - -| Helper identifier | Description | Expected Input | -|-------------------------------------------|----------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `common.ingress.backend` | Generate a proper Ingress backend entry depending on the API version | `dict "serviceName" "foo" "servicePort" "bar"`, see the [Ingress deprecation notice](https://kubernetes.io/blog/2019/07/18/api-deprecations-in-1-16/) for the syntax differences | -| `common.ingress.supportsPathType` | Prints "true" if the pathType field is supported | `.` Chart context | -| `common.ingress.supportsIngressClassname` | Prints "true" if the ingressClassname field is supported | `.` Chart context | - -### Labels - -| Helper identifier | Description | Expected Input | -|-----------------------------|------------------------------------------------------|-------------------| -| `common.labels.standard` | Return Kubernetes standard labels | `.` Chart context | -| `common.labels.matchLabels` | Return the proper Docker Image Registry Secret Names | `.` Chart context | - -### Names - -| Helper identifier | Description | Expected Inpput | -|-------------------------|------------------------------------------------------------|-------------------| -| `common.names.name` | Expand the name of the chart or use `.Values.nameOverride` | `.` Chart context | -| `common.names.fullname` | Create a default fully qualified app name. | `.` Chart context | -| `common.names.chart` | Chart name plus version | `.` Chart context | - -### Secrets - -| Helper identifier | Description | Expected Input | -|---------------------------|--------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `common.secrets.name` | Generate the name of the secret. | `dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $` see [ExistingSecret](#existingsecret) for the structure. | -| `common.secrets.key` | Generate secret key. | `dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName"` see [ExistingSecret](#existingsecret) for the structure. | -| `common.passwords.manage` | Generate secret password or retrieve one if already created. | `dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $`, length, strong and chartNAme fields are optional. | -| `common.secrets.exists` | Returns whether a previous generated secret already exists. | `dict "secret" "secret-name" "context" $` | - -### Storage - -| Helper identifier | Description | Expected Input | -|-------------------------------|---------------------------------------|---------------------------------------------------------------------------------------------------------------------| -| `common.affinities.node.soft` | Return a soft nodeAffinity definition | `dict "persistence" .Values.path.to.the.persistence "global" $`, see [Persistence](#persistence) for the structure. | - -### TplValues - -| Helper identifier | Description | Expected Input | -|---------------------------|----------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------| -| `common.tplvalues.render` | Renders a value that contains template | `dict "value" .Values.path.to.the.Value "context" $`, value is the value should rendered as template, context frequently is the chart context `$` or `.` | - -### Utils - -| Helper identifier | Description | Expected Input | -|--------------------------------|------------------------------------------------------------------------------------------|------------------------------------------------------------------------| -| `common.utils.fieldToEnvVar` | Build environment variable name given a field. | `dict "field" "my-password"` | -| `common.utils.secret.getvalue` | Print instructions to get a secret value. | `dict "secret" "secret-name" "field" "secret-value-field" "context" $` | -| `common.utils.getValueFromKey` | Gets a value from `.Values` object given its key path | `dict "key" "path.to.key" "context" $` | -| `common.utils.getKeyFromList` | Returns first `.Values` key with a defined value or first of the list if all non-defined | `dict "keys" (list "path.to.key1" "path.to.key2") "context" $` | - -### Validations - -| Helper identifier | Description | Expected Input | -|--------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `common.validations.values.single.empty` | Validate a value must not be empty. | `dict "valueKey" "path.to.value" "secret" "secret.name" "field" "my-password" "subchart" "subchart" "context" $` secret, field and subchart are optional. In case they are given, the helper will generate a how to get instruction. See [ValidateValue](#validatevalue) | -| `common.validations.values.multiple.empty` | Validate a multiple values must not be empty. It returns a shared error for all the values. | `dict "required" (list $validateValueConf00 $validateValueConf01) "context" $`. See [ValidateValue](#validatevalue) | -| `common.validations.values.mariadb.passwords` | This helper will ensure required password for MariaDB are not empty. It returns a shared error for all the values. | `dict "secret" "mariadb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mariadb chart and the helper. | -| `common.validations.values.postgresql.passwords` | This helper will ensure required password for PostgreSQL are not empty. It returns a shared error for all the values. | `dict "secret" "postgresql-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use postgresql chart and the helper. | -| `common.validations.values.redis.passwords` | This helper will ensure required password for Redis™ are not empty. It returns a shared error for all the values. | `dict "secret" "redis-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use redis chart and the helper. | -| `common.validations.values.cassandra.passwords` | This helper will ensure required password for Cassandra are not empty. It returns a shared error for all the values. | `dict "secret" "cassandra-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use cassandra chart and the helper. | -| `common.validations.values.mongodb.passwords` | This helper will ensure required password for MongoDB® are not empty. It returns a shared error for all the values. | `dict "secret" "mongodb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mongodb chart and the helper. | - -### Warnings - -| Helper identifier | Description | Expected Input | -|------------------------------|----------------------------------|------------------------------------------------------------| -| `common.warnings.rollingTag` | Warning about using rolling tag. | `ImageRoot` see [ImageRoot](#imageroot) for the structure. | - -## Special input schemas - -### ImageRoot - -```yaml -registry: - type: string - description: Docker registry where the image is located - example: docker.io - -repository: - type: string - description: Repository and image name - example: bitnami/nginx - -tag: - type: string - description: image tag - example: 1.16.1-debian-10-r63 - -pullPolicy: - type: string - description: Specify a imagePullPolicy. Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' - -pullSecrets: - type: array - items: - type: string - description: Optionally specify an array of imagePullSecrets (evaluated as templates). - -debug: - type: boolean - description: Set to true if you would like to see extra information on logs - example: false - -## An instance would be: -# registry: docker.io -# repository: bitnami/nginx -# tag: 1.16.1-debian-10-r63 -# pullPolicy: IfNotPresent -# debug: false -``` - -### Persistence - -```yaml -enabled: - type: boolean - description: Whether enable persistence. - example: true - -storageClass: - type: string - description: Ghost data Persistent Volume Storage Class, If set to "-", storageClassName: "" which disables dynamic provisioning. - example: "-" - -accessMode: - type: string - description: Access mode for the Persistent Volume Storage. - example: ReadWriteOnce - -size: - type: string - description: Size the Persistent Volume Storage. - example: 8Gi - -path: - type: string - description: Path to be persisted. - example: /bitnami - -## An instance would be: -# enabled: true -# storageClass: "-" -# accessMode: ReadWriteOnce -# size: 8Gi -# path: /bitnami -``` - -### ExistingSecret - -```yaml -name: - type: string - description: Name of the existing secret. - example: mySecret -keyMapping: - description: Mapping between the expected key name and the name of the key in the existing secret. - type: object - -## An instance would be: -# name: mySecret -# keyMapping: -# password: myPasswordKey -``` - -#### Example of use - -When we store sensitive data for a deployment in a secret, some times we want to give to users the possibility of using theirs existing secrets. - -```yaml -# templates/secret.yaml ---- -apiVersion: v1 -kind: Secret -metadata: - name: {{ include "common.names.fullname" . }} - labels: - app: {{ include "common.names.fullname" . }} -type: Opaque -data: - password: {{ .Values.password | b64enc | quote }} - -# templates/dpl.yaml ---- -... - env: - - name: PASSWORD - valueFrom: - secretKeyRef: - name: {{ include "common.secrets.name" (dict "existingSecret" .Values.existingSecret "context" $) }} - key: {{ include "common.secrets.key" (dict "existingSecret" .Values.existingSecret "key" "password") }} -... - -# values.yaml ---- -name: mySecret -keyMapping: - password: myPasswordKey -``` - -### ValidateValue - -#### NOTES.txt - -```console -{{- $validateValueConf00 := (dict "valueKey" "path.to.value00" "secret" "secretName" "field" "password-00") -}} -{{- $validateValueConf01 := (dict "valueKey" "path.to.value01" "secret" "secretName" "field" "password-01") -}} - -{{ include "common.validations.values.multiple.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} -``` - -If we force those values to be empty we will see some alerts - -```console -$ helm install test mychart --set path.to.value00="",path.to.value01="" - 'path.to.value00' must not be empty, please add '--set path.to.value00=$PASSWORD_00' to the command. To get the current value: - - export PASSWORD_00=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-00}" | base64 --decode) - - 'path.to.value01' must not be empty, please add '--set path.to.value01=$PASSWORD_01' to the command. To get the current value: - - export PASSWORD_01=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-01}" | base64 --decode) -``` - -## Upgrading - -### To 1.0.0 - -[On November 13, 2020, Helm v2 support was formally finished](https://github.com/helm/charts#status-of-the-project), this major version is the result of the required changes applied to the Helm Chart to be able to incorporate the different features added in Helm v3 and to be consistent with the Helm project itself regarding the Helm v2 EOL. - -**What changes were introduced in this major version?** - -- Previous versions of this Helm Chart use `apiVersion: v1` (installable by both Helm 2 and 3), this Helm Chart was updated to `apiVersion: v2` (installable by Helm 3 only). [Here](https://helm.sh/docs/topics/charts/#the-apiversion-field) you can find more information about the `apiVersion` field. -- Use `type: library`. [Here](https://v3.helm.sh/docs/faq/#library-chart-support) you can find more information. -- The different fields present in the *Chart.yaml* file has been ordered alphabetically in a homogeneous way for all the Bitnami Helm Charts - -**Considerations when upgrading to this version** - -- If you want to upgrade to this version from a previous one installed with Helm v3, you shouldn't face any issues -- If you want to upgrade to this version using Helm v2, this scenario is not supported as this version doesn't support Helm v2 anymore -- If you installed the previous version with Helm v2 and wants to upgrade to this version with Helm v3, please refer to the [official Helm documentation](https://helm.sh/docs/topics/v2_v3_migration/#migration-use-cases) about migrating from Helm v2 to v3 - -**Useful links** - -- https://docs.bitnami.com/tutorials/resolve-helm2-helm3-post-migration-issues/ -- https://helm.sh/docs/topics/v2_v3_migration/ -- https://helm.sh/blog/migrate-from-helm-v2-to-helm-v3/ diff --git a/charts/btp/chronicle/charts/standard-defs/charts/common/templates/_affinities.tpl b/charts/btp/chronicle/charts/standard-defs/charts/common/templates/_affinities.tpl deleted file mode 100644 index 189ea403d..000000000 --- a/charts/btp/chronicle/charts/standard-defs/charts/common/templates/_affinities.tpl +++ /dev/null @@ -1,102 +0,0 @@ -{{/* vim: set filetype=mustache: */}} - -{{/* -Return a soft nodeAffinity definition -{{ include "common.affinities.nodes.soft" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.nodes.soft" -}} -preferredDuringSchedulingIgnoredDuringExecution: - - preference: - matchExpressions: - - key: {{ .key }} - operator: In - values: - {{- range .values }} - - {{ . | quote }} - {{- end }} - weight: 1 -{{- end -}} - -{{/* -Return a hard nodeAffinity definition -{{ include "common.affinities.nodes.hard" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.nodes.hard" -}} -requiredDuringSchedulingIgnoredDuringExecution: - nodeSelectorTerms: - - matchExpressions: - - key: {{ .key }} - operator: In - values: - {{- range .values }} - - {{ . | quote }} - {{- end }} -{{- end -}} - -{{/* -Return a nodeAffinity definition -{{ include "common.affinities.nodes" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.nodes" -}} - {{- if eq .type "soft" }} - {{- include "common.affinities.nodes.soft" . -}} - {{- else if eq .type "hard" }} - {{- include "common.affinities.nodes.hard" . -}} - {{- end -}} -{{- end -}} - -{{/* -Return a soft podAffinity/podAntiAffinity definition -{{ include "common.affinities.pods.soft" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}} -*/}} -{{- define "common.affinities.pods.soft" -}} -{{- $component := default "" .component -}} -{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} -preferredDuringSchedulingIgnoredDuringExecution: - - podAffinityTerm: - labelSelector: - matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 10 }} - {{- if not (empty $component) }} - {{ printf "app.kubernetes.io/component: %s" $component }} - {{- end }} - {{- range $key, $value := $extraMatchLabels }} - {{ $key }}: {{ $value | quote }} - {{- end }} - namespaces: - - {{ .context.Release.Namespace | quote }} - topologyKey: kubernetes.io/hostname - weight: 1 -{{- end -}} - -{{/* -Return a hard podAffinity/podAntiAffinity definition -{{ include "common.affinities.pods.hard" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}} -*/}} -{{- define "common.affinities.pods.hard" -}} -{{- $component := default "" .component -}} -{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} -requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 8 }} - {{- if not (empty $component) }} - {{ printf "app.kubernetes.io/component: %s" $component }} - {{- end }} - {{- range $key, $value := $extraMatchLabels }} - {{ $key }}: {{ $value | quote }} - {{- end }} - namespaces: - - {{ .context.Release.Namespace | quote }} - topologyKey: kubernetes.io/hostname -{{- end -}} - -{{/* -Return a podAffinity/podAntiAffinity definition -{{ include "common.affinities.pods" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.pods" -}} - {{- if eq .type "soft" }} - {{- include "common.affinities.pods.soft" . -}} - {{- else if eq .type "hard" }} - {{- include "common.affinities.pods.hard" . -}} - {{- end -}} -{{- end -}} diff --git a/charts/btp/chronicle/charts/standard-defs/charts/common/templates/_capabilities.tpl b/charts/btp/chronicle/charts/standard-defs/charts/common/templates/_capabilities.tpl deleted file mode 100644 index ae45d5e35..000000000 --- a/charts/btp/chronicle/charts/standard-defs/charts/common/templates/_capabilities.tpl +++ /dev/null @@ -1,117 +0,0 @@ -{{/* vim: set filetype=mustache: */}} - -{{/* -Return the target Kubernetes version -*/}} -{{- define "common.capabilities.kubeVersion" -}} -{{- if .Values.global }} - {{- if .Values.global.kubeVersion }} - {{- .Values.global.kubeVersion -}} - {{- else }} - {{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} - {{- end -}} -{{- else }} -{{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for policy. -*/}} -{{- define "common.capabilities.policy.apiVersion" -}} -{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "policy/v1beta1" -}} -{{- else -}} -{{- print "policy/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for cronjob. -*/}} -{{- define "common.capabilities.cronjob.apiVersion" -}} -{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "batch/v1beta1" -}} -{{- else -}} -{{- print "batch/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for deployment. -*/}} -{{- define "common.capabilities.deployment.apiVersion" -}} -{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else -}} -{{- print "apps/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for statefulset. -*/}} -{{- define "common.capabilities.statefulset.apiVersion" -}} -{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "apps/v1beta1" -}} -{{- else -}} -{{- print "apps/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for ingress. -*/}} -{{- define "common.capabilities.ingress.apiVersion" -}} -{{- if .Values.ingress -}} -{{- if .Values.ingress.apiVersion -}} -{{- .Values.ingress.apiVersion -}} -{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "networking.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "networking.k8s.io/v1" -}} -{{- end }} -{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "networking.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "networking.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for RBAC resources. -*/}} -{{- define "common.capabilities.rbac.apiVersion" -}} -{{- if semverCompare "<1.17-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "rbac.authorization.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "rbac.authorization.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for CRDs. -*/}} -{{- define "common.capabilities.crd.apiVersion" -}} -{{- if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "apiextensions.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "apiextensions.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Returns true if the used Helm version is 3.3+. -A way to check the used Helm version was not introduced until version 3.3.0 with .Capabilities.HelmVersion, which contains an additional "{}}" structure. -This check is introduced as a regexMatch instead of {{ if .Capabilities.HelmVersion }} because checking for the key HelmVersion in <3.3 results in a "interface not found" error. -**To be removed when the catalog's minimun Helm version is 3.3** -*/}} -{{- define "common.capabilities.supportsHelmVersion" -}} -{{- if regexMatch "{(v[0-9])*[^}]*}}$" (.Capabilities | toString ) }} - {{- true -}} -{{- end -}} -{{- end -}} diff --git a/charts/btp/chronicle/charts/standard-defs/charts/common/templates/_errors.tpl b/charts/btp/chronicle/charts/standard-defs/charts/common/templates/_errors.tpl deleted file mode 100644 index a79cc2e32..000000000 --- a/charts/btp/chronicle/charts/standard-defs/charts/common/templates/_errors.tpl +++ /dev/null @@ -1,23 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Through error when upgrading using empty passwords values that must not be empty. - -Usage: -{{- $validationError00 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password00" "secret" "secretName" "field" "password-00") -}} -{{- $validationError01 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password01" "secret" "secretName" "field" "password-01") -}} -{{ include "common.errors.upgrade.passwords.empty" (dict "validationErrors" (list $validationError00 $validationError01) "context" $) }} - -Required password params: - - validationErrors - String - Required. List of validation strings to be return, if it is empty it won't throw error. - - context - Context - Required. Parent context. -*/}} -{{- define "common.errors.upgrade.passwords.empty" -}} - {{- $validationErrors := join "" .validationErrors -}} - {{- if and $validationErrors .context.Release.IsUpgrade -}} - {{- $errorString := "\nPASSWORDS ERROR: You must provide your current passwords when upgrading the release." -}} - {{- $errorString = print $errorString "\n Note that even after reinstallation, old credentials may be needed as they may be kept in persistent volume claims." -}} - {{- $errorString = print $errorString "\n Further information can be obtained at https://docs.bitnami.com/general/how-to/troubleshoot-helm-chart-issues/#credential-errors-while-upgrading-chart-releases" -}} - {{- $errorString = print $errorString "\n%s" -}} - {{- printf $errorString $validationErrors | fail -}} - {{- end -}} -{{- end -}} diff --git a/charts/btp/chronicle/charts/standard-defs/charts/common/templates/_images.tpl b/charts/btp/chronicle/charts/standard-defs/charts/common/templates/_images.tpl deleted file mode 100644 index 42ffbc722..000000000 --- a/charts/btp/chronicle/charts/standard-defs/charts/common/templates/_images.tpl +++ /dev/null @@ -1,75 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Return the proper image name -{{ include "common.images.image" ( dict "imageRoot" .Values.path.to.the.image "global" $) }} -*/}} -{{- define "common.images.image" -}} -{{- $registryName := .imageRoot.registry -}} -{{- $repositoryName := .imageRoot.repository -}} -{{- $tag := .imageRoot.tag | toString -}} -{{- if .global }} - {{- if .global.imageRegistry }} - {{- $registryName = .global.imageRegistry -}} - {{- end -}} -{{- end -}} -{{- if $registryName }} -{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}} -{{- else -}} -{{- printf "%s:%s" $repositoryName $tag -}} -{{- end -}} -{{- end -}} - -{{/* -Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) -{{ include "common.images.pullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global) }} -*/}} -{{- define "common.images.pullSecrets" -}} - {{- $pullSecrets := list }} - - {{- if .global }} - {{- range .global.imagePullSecrets -}} - {{- $pullSecrets = append $pullSecrets . -}} - {{- end -}} - {{- end -}} - - {{- range .images -}} - {{- range .pullSecrets -}} - {{- $pullSecrets = append $pullSecrets . -}} - {{- end -}} - {{- end -}} - - {{- if (not (empty $pullSecrets)) }} -imagePullSecrets: - {{- range $pullSecrets }} - - name: {{ . }} - {{- end }} - {{- end }} -{{- end -}} - -{{/* -Return the proper Docker Image Registry Secret Names evaluating values as templates -{{ include "common.images.renderPullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $) }} -*/}} -{{- define "common.images.renderPullSecrets" -}} - {{- $pullSecrets := list }} - {{- $context := .context }} - - {{- if $context.Values.global }} - {{- range $context.Values.global.imagePullSecrets -}} - {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} - {{- end -}} - {{- end -}} - - {{- range .images -}} - {{- range .pullSecrets -}} - {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} - {{- end -}} - {{- end -}} - - {{- if (not (empty $pullSecrets)) }} -imagePullSecrets: - {{- range $pullSecrets }} - - name: {{ . }} - {{- end }} - {{- end }} -{{- end -}} diff --git a/charts/btp/chronicle/charts/standard-defs/charts/common/templates/_ingress.tpl b/charts/btp/chronicle/charts/standard-defs/charts/common/templates/_ingress.tpl deleted file mode 100644 index f905f2005..000000000 --- a/charts/btp/chronicle/charts/standard-defs/charts/common/templates/_ingress.tpl +++ /dev/null @@ -1,55 +0,0 @@ -{{/* vim: set filetype=mustache: */}} - -{{/* -Generate backend entry that is compatible with all Kubernetes API versions. - -Usage: -{{ include "common.ingress.backend" (dict "serviceName" "backendName" "servicePort" "backendPort" "context" $) }} - -Params: - - serviceName - String. Name of an existing service backend - - servicePort - String/Int. Port name (or number) of the service. It will be translated to different yaml depending if it is a string or an integer. - - context - Dict - Required. The context for the template evaluation. -*/}} -{{- define "common.ingress.backend" -}} -{{- $apiVersion := (include "common.capabilities.ingress.apiVersion" .context) -}} -{{- if or (eq $apiVersion "extensions/v1beta1") (eq $apiVersion "networking.k8s.io/v1beta1") -}} -serviceName: {{ .serviceName }} -servicePort: {{ .servicePort }} -{{- else -}} -service: - name: {{ .serviceName }} - port: - {{- if typeIs "string" .servicePort }} - name: {{ .servicePort }} - {{- else if or (typeIs "int" .servicePort) (typeIs "float64" .servicePort) }} - number: {{ .servicePort | int }} - {{- end }} -{{- end -}} -{{- end -}} - -{{/* -Print "true" if the API pathType field is supported -Usage: -{{ include "common.ingress.supportsPathType" . }} -*/}} -{{- define "common.ingress.supportsPathType" -}} -{{- if (semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .)) -}} -{{- print "false" -}} -{{- else -}} -{{- print "true" -}} -{{- end -}} -{{- end -}} - -{{/* -Returns true if the ingressClassname field is supported -Usage: -{{ include "common.ingress.supportsIngressClassname" . }} -*/}} -{{- define "common.ingress.supportsIngressClassname" -}} -{{- if semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "false" -}} -{{- else -}} -{{- print "true" -}} -{{- end -}} -{{- end -}} diff --git a/charts/btp/chronicle/charts/standard-defs/charts/common/templates/_labels.tpl b/charts/btp/chronicle/charts/standard-defs/charts/common/templates/_labels.tpl deleted file mode 100644 index 252066c7e..000000000 --- a/charts/btp/chronicle/charts/standard-defs/charts/common/templates/_labels.tpl +++ /dev/null @@ -1,18 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Kubernetes standard labels -*/}} -{{- define "common.labels.standard" -}} -app.kubernetes.io/name: {{ include "common.names.name" . }} -helm.sh/chart: {{ include "common.names.chart" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end -}} - -{{/* -Labels to use on deploy.spec.selector.matchLabels and svc.spec.selector -*/}} -{{- define "common.labels.matchLabels" -}} -app.kubernetes.io/name: {{ include "common.names.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end -}} diff --git a/charts/btp/chronicle/charts/standard-defs/charts/common/templates/_names.tpl b/charts/btp/chronicle/charts/standard-defs/charts/common/templates/_names.tpl deleted file mode 100644 index adf2a74f4..000000000 --- a/charts/btp/chronicle/charts/standard-defs/charts/common/templates/_names.tpl +++ /dev/null @@ -1,32 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Expand the name of the chart. -*/}} -{{- define "common.names.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "common.names.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "common.names.fullname" -}} -{{- if .Values.fullnameOverride -}} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/charts/btp/chronicle/charts/standard-defs/charts/common/templates/_secrets.tpl b/charts/btp/chronicle/charts/standard-defs/charts/common/templates/_secrets.tpl deleted file mode 100644 index 60b84a701..000000000 --- a/charts/btp/chronicle/charts/standard-defs/charts/common/templates/_secrets.tpl +++ /dev/null @@ -1,129 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Generate secret name. - -Usage: -{{ include "common.secrets.name" (dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $) }} - -Params: - - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user - to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. - +info: https://github.com/bitnami/charts/tree/master/bitnami/common#existingsecret - - defaultNameSuffix - String - Optional. It is used only if we have several secrets in the same deployment. - - context - Dict - Required. The context for the template evaluation. -*/}} -{{- define "common.secrets.name" -}} -{{- $name := (include "common.names.fullname" .context) -}} - -{{- if .defaultNameSuffix -}} -{{- $name = printf "%s-%s" $name .defaultNameSuffix | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{- with .existingSecret -}} -{{- if not (typeIs "string" .) -}} -{{- with .name -}} -{{- $name = . -}} -{{- end -}} -{{- else -}} -{{- $name = . -}} -{{- end -}} -{{- end -}} - -{{- printf "%s" $name -}} -{{- end -}} - -{{/* -Generate secret key. - -Usage: -{{ include "common.secrets.key" (dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName") }} - -Params: - - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user - to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. - +info: https://github.com/bitnami/charts/tree/master/bitnami/common#existingsecret - - key - String - Required. Name of the key in the secret. -*/}} -{{- define "common.secrets.key" -}} -{{- $key := .key -}} - -{{- if .existingSecret -}} - {{- if not (typeIs "string" .existingSecret) -}} - {{- if .existingSecret.keyMapping -}} - {{- $key = index .existingSecret.keyMapping $.key -}} - {{- end -}} - {{- end }} -{{- end -}} - -{{- printf "%s" $key -}} -{{- end -}} - -{{/* -Generate secret password or retrieve one if already created. - -Usage: -{{ include "common.secrets.passwords.manage" (dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $) }} - -Params: - - secret - String - Required - Name of the 'Secret' resource where the password is stored. - - key - String - Required - Name of the key in the secret. - - providedValues - List - Required - The path to the validating value in the values.yaml, e.g: "mysql.password". Will pick first parameter with a defined value. - - length - int - Optional - Length of the generated random password. - - strong - Boolean - Optional - Whether to add symbols to the generated random password. - - chartName - String - Optional - Name of the chart used when said chart is deployed as a subchart. - - context - Context - Required - Parent context. -*/}} -{{- define "common.secrets.passwords.manage" -}} - -{{- $password := "" }} -{{- $subchart := "" }} -{{- $chartName := default "" .chartName }} -{{- $passwordLength := default 10 .length }} -{{- $providedPasswordKey := include "common.utils.getKeyFromList" (dict "keys" .providedValues "context" $.context) }} -{{- $providedPasswordValue := include "common.utils.getValueFromKey" (dict "key" $providedPasswordKey "context" $.context) }} -{{- $secret := (lookup "v1" "Secret" $.context.Release.Namespace .secret) }} -{{- if $secret }} - {{- if index $secret.data .key }} - {{- $password = index $secret.data .key }} - {{- end -}} -{{- else if $providedPasswordValue }} - {{- $password = $providedPasswordValue | toString | b64enc | quote }} -{{- else }} - - {{- if .context.Values.enabled }} - {{- $subchart = $chartName }} - {{- end -}} - - {{- $requiredPassword := dict "valueKey" $providedPasswordKey "secret" .secret "field" .key "subchart" $subchart "context" $.context -}} - {{- $requiredPasswordError := include "common.validations.values.single.empty" $requiredPassword -}} - {{- $passwordValidationErrors := list $requiredPasswordError -}} - {{- include "common.errors.upgrade.passwords.empty" (dict "validationErrors" $passwordValidationErrors "context" $.context) -}} - - {{- if .strong }} - {{- $subStr := list (lower (randAlpha 1)) (randNumeric 1) (upper (randAlpha 1)) | join "_" }} - {{- $password = randAscii $passwordLength }} - {{- $password = regexReplaceAllLiteral "\\W" $password "@" | substr 5 $passwordLength }} - {{- $password = printf "%s%s" $subStr $password | toString | shuffle | b64enc | quote }} - {{- else }} - {{- $password = randAlphaNum $passwordLength | b64enc | quote }} - {{- end }} -{{- end -}} -{{- printf "%s" $password -}} -{{- end -}} - -{{/* -Returns whether a previous generated secret already exists - -Usage: -{{ include "common.secrets.exists" (dict "secret" "secret-name" "context" $) }} - -Params: - - secret - String - Required - Name of the 'Secret' resource where the password is stored. - - context - Context - Required - Parent context. -*/}} -{{- define "common.secrets.exists" -}} -{{- $secret := (lookup "v1" "Secret" $.context.Release.Namespace .secret) }} -{{- if $secret }} - {{- true -}} -{{- end -}} -{{- end -}} diff --git a/charts/btp/chronicle/charts/standard-defs/charts/common/templates/_storage.tpl b/charts/btp/chronicle/charts/standard-defs/charts/common/templates/_storage.tpl deleted file mode 100644 index 60e2a844f..000000000 --- a/charts/btp/chronicle/charts/standard-defs/charts/common/templates/_storage.tpl +++ /dev/null @@ -1,23 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Return the proper Storage Class -{{ include "common.storage.class" ( dict "persistence" .Values.path.to.the.persistence "global" $) }} -*/}} -{{- define "common.storage.class" -}} - -{{- $storageClass := .persistence.storageClass -}} -{{- if .global -}} - {{- if .global.storageClass -}} - {{- $storageClass = .global.storageClass -}} - {{- end -}} -{{- end -}} - -{{- if $storageClass -}} - {{- if (eq "-" $storageClass) -}} - {{- printf "storageClassName: \"\"" -}} - {{- else }} - {{- printf "storageClassName: %s" $storageClass -}} - {{- end -}} -{{- end -}} - -{{- end -}} diff --git a/charts/btp/chronicle/charts/standard-defs/charts/common/templates/_tplvalues.tpl b/charts/btp/chronicle/charts/standard-defs/charts/common/templates/_tplvalues.tpl deleted file mode 100644 index 2db166851..000000000 --- a/charts/btp/chronicle/charts/standard-defs/charts/common/templates/_tplvalues.tpl +++ /dev/null @@ -1,13 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Renders a value that contains template. -Usage: -{{ include "common.tplvalues.render" ( dict "value" .Values.path.to.the.Value "context" $) }} -*/}} -{{- define "common.tplvalues.render" -}} - {{- if typeIs "string" .value }} - {{- tpl .value .context }} - {{- else }} - {{- tpl (.value | toYaml) .context }} - {{- end }} -{{- end -}} diff --git a/charts/btp/chronicle/charts/standard-defs/charts/common/templates/_utils.tpl b/charts/btp/chronicle/charts/standard-defs/charts/common/templates/_utils.tpl deleted file mode 100644 index ea083a249..000000000 --- a/charts/btp/chronicle/charts/standard-defs/charts/common/templates/_utils.tpl +++ /dev/null @@ -1,62 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Print instructions to get a secret value. -Usage: -{{ include "common.utils.secret.getvalue" (dict "secret" "secret-name" "field" "secret-value-field" "context" $) }} -*/}} -{{- define "common.utils.secret.getvalue" -}} -{{- $varname := include "common.utils.fieldToEnvVar" . -}} -export {{ $varname }}=$(kubectl get secret --namespace {{ .context.Release.Namespace | quote }} {{ .secret }} -o jsonpath="{.data.{{ .field }}}" | base64 --decode) -{{- end -}} - -{{/* -Build env var name given a field -Usage: -{{ include "common.utils.fieldToEnvVar" dict "field" "my-password" }} -*/}} -{{- define "common.utils.fieldToEnvVar" -}} - {{- $fieldNameSplit := splitList "-" .field -}} - {{- $upperCaseFieldNameSplit := list -}} - - {{- range $fieldNameSplit -}} - {{- $upperCaseFieldNameSplit = append $upperCaseFieldNameSplit ( upper . ) -}} - {{- end -}} - - {{ join "_" $upperCaseFieldNameSplit }} -{{- end -}} - -{{/* -Gets a value from .Values given -Usage: -{{ include "common.utils.getValueFromKey" (dict "key" "path.to.key" "context" $) }} -*/}} -{{- define "common.utils.getValueFromKey" -}} -{{- $splitKey := splitList "." .key -}} -{{- $value := "" -}} -{{- $latestObj := $.context.Values -}} -{{- range $splitKey -}} - {{- if not $latestObj -}} - {{- printf "please review the entire path of '%s' exists in values" $.key | fail -}} - {{- end -}} - {{- $value = ( index $latestObj . ) -}} - {{- $latestObj = $value -}} -{{- end -}} -{{- printf "%v" (default "" $value) -}} -{{- end -}} - -{{/* -Returns first .Values key with a defined value or first of the list if all non-defined -Usage: -{{ include "common.utils.getKeyFromList" (dict "keys" (list "path.to.key1" "path.to.key2") "context" $) }} -*/}} -{{- define "common.utils.getKeyFromList" -}} -{{- $key := first .keys -}} -{{- $reverseKeys := reverse .keys }} -{{- range $reverseKeys }} - {{- $value := include "common.utils.getValueFromKey" (dict "key" . "context" $.context ) }} - {{- if $value -}} - {{- $key = . }} - {{- end -}} -{{- end -}} -{{- printf "%s" $key -}} -{{- end -}} diff --git a/charts/btp/chronicle/charts/standard-defs/charts/common/templates/_warnings.tpl b/charts/btp/chronicle/charts/standard-defs/charts/common/templates/_warnings.tpl deleted file mode 100644 index ae10fa41e..000000000 --- a/charts/btp/chronicle/charts/standard-defs/charts/common/templates/_warnings.tpl +++ /dev/null @@ -1,14 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Warning about using rolling tag. -Usage: -{{ include "common.warnings.rollingTag" .Values.path.to.the.imageRoot }} -*/}} -{{- define "common.warnings.rollingTag" -}} - -{{- if and (contains "bitnami/" .repository) (not (.tag | toString | regexFind "-r\\d+$|sha256:")) }} -WARNING: Rolling tag detected ({{ .repository }}:{{ .tag }}), please note that it is strongly recommended to avoid using rolling tags in a production environment. -+info https://docs.bitnami.com/containers/how-to/understand-rolling-tags-containers/ -{{- end }} - -{{- end -}} diff --git a/charts/btp/chronicle/charts/standard-defs/charts/common/templates/validations/_cassandra.tpl b/charts/btp/chronicle/charts/standard-defs/charts/common/templates/validations/_cassandra.tpl deleted file mode 100644 index 8679ddffb..000000000 --- a/charts/btp/chronicle/charts/standard-defs/charts/common/templates/validations/_cassandra.tpl +++ /dev/null @@ -1,72 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate Cassandra required passwords are not empty. - -Usage: -{{ include "common.validations.values.cassandra.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where Cassandra values are stored, e.g: "cassandra-passwords-secret" - - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.cassandra.passwords" -}} - {{- $existingSecret := include "common.cassandra.values.existingSecret" . -}} - {{- $enabled := include "common.cassandra.values.enabled" . -}} - {{- $dbUserPrefix := include "common.cassandra.values.key.dbUser" . -}} - {{- $valueKeyPassword := printf "%s.password" $dbUserPrefix -}} - - {{- if and (not $existingSecret) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "cassandra-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.cassandra.values.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false -*/}} -{{- define "common.cassandra.values.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.cassandra.dbUser.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.dbUser.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled cassandra. - -Usage: -{{ include "common.cassandra.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.cassandra.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.cassandra.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key dbUser - -Usage: -{{ include "common.cassandra.values.key.dbUser" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false -*/}} -{{- define "common.cassandra.values.key.dbUser" -}} - {{- if .subchart -}} - cassandra.dbUser - {{- else -}} - dbUser - {{- end -}} -{{- end -}} diff --git a/charts/btp/chronicle/charts/standard-defs/charts/common/templates/validations/_mariadb.tpl b/charts/btp/chronicle/charts/standard-defs/charts/common/templates/validations/_mariadb.tpl deleted file mode 100644 index bb5ed7253..000000000 --- a/charts/btp/chronicle/charts/standard-defs/charts/common/templates/validations/_mariadb.tpl +++ /dev/null @@ -1,103 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate MariaDB required passwords are not empty. - -Usage: -{{ include "common.validations.values.mariadb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where MariaDB values are stored, e.g: "mysql-passwords-secret" - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.mariadb.passwords" -}} - {{- $existingSecret := include "common.mariadb.values.auth.existingSecret" . -}} - {{- $enabled := include "common.mariadb.values.enabled" . -}} - {{- $architecture := include "common.mariadb.values.architecture" . -}} - {{- $authPrefix := include "common.mariadb.values.key.auth" . -}} - {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} - {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} - {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} - {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} - - {{- if and (not $existingSecret) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mariadb-root-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} - - {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} - {{- if not (empty $valueUsername) -}} - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mariadb-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - {{- end -}} - - {{- if (eq $architecture "replication") -}} - {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mariadb-replication-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.mariadb.values.auth.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.mariadb.values.auth.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.mariadb.auth.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.auth.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled mariadb. - -Usage: -{{ include "common.mariadb.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.mariadb.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.mariadb.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for architecture - -Usage: -{{ include "common.mariadb.values.architecture" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.mariadb.values.architecture" -}} - {{- if .subchart -}} - {{- .context.Values.mariadb.architecture -}} - {{- else -}} - {{- .context.Values.architecture -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key auth - -Usage: -{{ include "common.mariadb.values.key.auth" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.mariadb.values.key.auth" -}} - {{- if .subchart -}} - mariadb.auth - {{- else -}} - auth - {{- end -}} -{{- end -}} diff --git a/charts/btp/chronicle/charts/standard-defs/charts/common/templates/validations/_mongodb.tpl b/charts/btp/chronicle/charts/standard-defs/charts/common/templates/validations/_mongodb.tpl deleted file mode 100644 index 1e5bba981..000000000 --- a/charts/btp/chronicle/charts/standard-defs/charts/common/templates/validations/_mongodb.tpl +++ /dev/null @@ -1,108 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate MongoDB® required passwords are not empty. - -Usage: -{{ include "common.validations.values.mongodb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where MongoDB® values are stored, e.g: "mongodb-passwords-secret" - - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.mongodb.passwords" -}} - {{- $existingSecret := include "common.mongodb.values.auth.existingSecret" . -}} - {{- $enabled := include "common.mongodb.values.enabled" . -}} - {{- $authPrefix := include "common.mongodb.values.key.auth" . -}} - {{- $architecture := include "common.mongodb.values.architecture" . -}} - {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} - {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} - {{- $valueKeyDatabase := printf "%s.database" $authPrefix -}} - {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} - {{- $valueKeyReplicaSetKey := printf "%s.replicaSetKey" $authPrefix -}} - {{- $valueKeyAuthEnabled := printf "%s.enabled" $authPrefix -}} - - {{- $authEnabled := include "common.utils.getValueFromKey" (dict "key" $valueKeyAuthEnabled "context" .context) -}} - - {{- if and (not $existingSecret) (eq $enabled "true") (eq $authEnabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mongodb-root-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} - - {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} - {{- $valueDatabase := include "common.utils.getValueFromKey" (dict "key" $valueKeyDatabase "context" .context) }} - {{- if and $valueUsername $valueDatabase -}} - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mongodb-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - {{- end -}} - - {{- if (eq $architecture "replicaset") -}} - {{- $requiredReplicaSetKey := dict "valueKey" $valueKeyReplicaSetKey "secret" .secret "field" "mongodb-replica-set-key" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredReplicaSetKey -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.mongodb.values.auth.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MongoDb is used as subchart or not. Default: false -*/}} -{{- define "common.mongodb.values.auth.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.mongodb.auth.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.auth.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled mongodb. - -Usage: -{{ include "common.mongodb.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.mongodb.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.mongodb.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key auth - -Usage: -{{ include "common.mongodb.values.key.auth" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false -*/}} -{{- define "common.mongodb.values.key.auth" -}} - {{- if .subchart -}} - mongodb.auth - {{- else -}} - auth - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for architecture - -Usage: -{{ include "common.mongodb.values.architecture" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.mongodb.values.architecture" -}} - {{- if .subchart -}} - {{- .context.Values.mongodb.architecture -}} - {{- else -}} - {{- .context.Values.architecture -}} - {{- end -}} -{{- end -}} diff --git a/charts/btp/chronicle/charts/standard-defs/charts/common/templates/validations/_postgresql.tpl b/charts/btp/chronicle/charts/standard-defs/charts/common/templates/validations/_postgresql.tpl deleted file mode 100644 index 992bcd390..000000000 --- a/charts/btp/chronicle/charts/standard-defs/charts/common/templates/validations/_postgresql.tpl +++ /dev/null @@ -1,131 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate PostgreSQL required passwords are not empty. - -Usage: -{{ include "common.validations.values.postgresql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where postgresql values are stored, e.g: "postgresql-passwords-secret" - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.postgresql.passwords" -}} - {{- $existingSecret := include "common.postgresql.values.existingSecret" . -}} - {{- $enabled := include "common.postgresql.values.enabled" . -}} - {{- $valueKeyPostgresqlPassword := include "common.postgresql.values.key.postgressPassword" . -}} - {{- $valueKeyPostgresqlReplicationEnabled := include "common.postgresql.values.key.replicationPassword" . -}} - - {{- if and (not $existingSecret) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredPostgresqlPassword := dict "valueKey" $valueKeyPostgresqlPassword "secret" .secret "field" "postgresql-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlPassword -}} - - {{- $enabledReplication := include "common.postgresql.values.enabled.replication" . -}} - {{- if (eq $enabledReplication "true") -}} - {{- $requiredPostgresqlReplicationPassword := dict "valueKey" $valueKeyPostgresqlReplicationEnabled "secret" .secret "field" "postgresql-replication-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlReplicationPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to decide whether evaluate global values. - -Usage: -{{ include "common.postgresql.values.use.global" (dict "key" "key-of-global" "context" $) }} -Params: - - key - String - Required. Field to be evaluated within global, e.g: "existingSecret" -*/}} -{{- define "common.postgresql.values.use.global" -}} - {{- if .context.Values.global -}} - {{- if .context.Values.global.postgresql -}} - {{- index .context.Values.global.postgresql .key | quote -}} - {{- end -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.postgresql.values.existingSecret" (dict "context" $) }} -*/}} -{{- define "common.postgresql.values.existingSecret" -}} - {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "existingSecret" "context" .context) -}} - - {{- if .subchart -}} - {{- default (.context.Values.postgresql.existingSecret | quote) $globalValue -}} - {{- else -}} - {{- default (.context.Values.existingSecret | quote) $globalValue -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled postgresql. - -Usage: -{{ include "common.postgresql.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.postgresql.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.postgresql.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key postgressPassword. - -Usage: -{{ include "common.postgresql.values.key.postgressPassword" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.postgresql.values.key.postgressPassword" -}} - {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "postgresqlUsername" "context" .context) -}} - - {{- if not $globalValue -}} - {{- if .subchart -}} - postgresql.postgresqlPassword - {{- else -}} - postgresqlPassword - {{- end -}} - {{- else -}} - global.postgresql.postgresqlPassword - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled.replication. - -Usage: -{{ include "common.postgresql.values.enabled.replication" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.postgresql.values.enabled.replication" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.postgresql.replication.enabled -}} - {{- else -}} - {{- printf "%v" .context.Values.replication.enabled -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key replication.password. - -Usage: -{{ include "common.postgresql.values.key.replicationPassword" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.postgresql.values.key.replicationPassword" -}} - {{- if .subchart -}} - postgresql.replication.password - {{- else -}} - replication.password - {{- end -}} -{{- end -}} diff --git a/charts/btp/chronicle/charts/standard-defs/charts/common/templates/validations/_redis.tpl b/charts/btp/chronicle/charts/standard-defs/charts/common/templates/validations/_redis.tpl deleted file mode 100644 index 18d9813c5..000000000 --- a/charts/btp/chronicle/charts/standard-defs/charts/common/templates/validations/_redis.tpl +++ /dev/null @@ -1,76 +0,0 @@ - -{{/* vim: set filetype=mustache: */}} -{{/* -Validate Redis™ required passwords are not empty. - -Usage: -{{ include "common.validations.values.redis.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where redis values are stored, e.g: "redis-passwords-secret" - - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.redis.passwords" -}} - {{- $enabled := include "common.redis.values.enabled" . -}} - {{- $valueKeyPrefix := include "common.redis.values.keys.prefix" . -}} - {{- $standarizedVersion := include "common.redis.values.standarized.version" . }} - - {{- $existingSecret := ternary (printf "%s%s" $valueKeyPrefix "auth.existingSecret") (printf "%s%s" $valueKeyPrefix "existingSecret") (eq $standarizedVersion "true") }} - {{- $existingSecretValue := include "common.utils.getValueFromKey" (dict "key" $existingSecret "context" .context) }} - - {{- $valueKeyRedisPassword := ternary (printf "%s%s" $valueKeyPrefix "auth.password") (printf "%s%s" $valueKeyPrefix "password") (eq $standarizedVersion "true") }} - {{- $valueKeyRedisUseAuth := ternary (printf "%s%s" $valueKeyPrefix "auth.enabled") (printf "%s%s" $valueKeyPrefix "usePassword") (eq $standarizedVersion "true") }} - - {{- if and (not $existingSecretValue) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $useAuth := include "common.utils.getValueFromKey" (dict "key" $valueKeyRedisUseAuth "context" .context) -}} - {{- if eq $useAuth "true" -}} - {{- $requiredRedisPassword := dict "valueKey" $valueKeyRedisPassword "secret" .secret "field" "redis-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRedisPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled redis. - -Usage: -{{ include "common.redis.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.redis.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.redis.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right prefix path for the values - -Usage: -{{ include "common.redis.values.key.prefix" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false -*/}} -{{- define "common.redis.values.keys.prefix" -}} - {{- if .subchart -}}redis.{{- else -}}{{- end -}} -{{- end -}} - -{{/* -Checks whether the redis chart's includes the standarizations (version >= 14) - -Usage: -{{ include "common.redis.values.standarized.version" (dict "context" $) }} -*/}} -{{- define "common.redis.values.standarized.version" -}} - - {{- $standarizedAuth := printf "%s%s" (include "common.redis.values.keys.prefix" .) "auth" -}} - {{- $standarizedAuthValues := include "common.utils.getValueFromKey" (dict "key" $standarizedAuth "context" .context) }} - - {{- if $standarizedAuthValues -}} - {{- true -}} - {{- end -}} -{{- end -}} diff --git a/charts/btp/chronicle/charts/standard-defs/charts/common/templates/validations/_validations.tpl b/charts/btp/chronicle/charts/standard-defs/charts/common/templates/validations/_validations.tpl deleted file mode 100644 index 9a814cf40..000000000 --- a/charts/btp/chronicle/charts/standard-defs/charts/common/templates/validations/_validations.tpl +++ /dev/null @@ -1,46 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate values must not be empty. - -Usage: -{{- $validateValueConf00 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-00") -}} -{{- $validateValueConf01 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-01") -}} -{{ include "common.validations.values.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} - -Validate value params: - - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" - - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" - - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" -*/}} -{{- define "common.validations.values.multiple.empty" -}} - {{- range .required -}} - {{- include "common.validations.values.single.empty" (dict "valueKey" .valueKey "secret" .secret "field" .field "context" $.context) -}} - {{- end -}} -{{- end -}} - -{{/* -Validate a value must not be empty. - -Usage: -{{ include "common.validations.value.empty" (dict "valueKey" "mariadb.password" "secret" "secretName" "field" "my-password" "subchart" "subchart" "context" $) }} - -Validate value params: - - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" - - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" - - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" - - subchart - String - Optional - Name of the subchart that the validated password is part of. -*/}} -{{- define "common.validations.values.single.empty" -}} - {{- $value := include "common.utils.getValueFromKey" (dict "key" .valueKey "context" .context) }} - {{- $subchart := ternary "" (printf "%s." .subchart) (empty .subchart) }} - - {{- if not $value -}} - {{- $varname := "my-value" -}} - {{- $getCurrentValue := "" -}} - {{- if and .secret .field -}} - {{- $varname = include "common.utils.fieldToEnvVar" . -}} - {{- $getCurrentValue = printf " To get the current value:\n\n %s\n" (include "common.utils.secret.getvalue" .) -}} - {{- end -}} - {{- printf "\n '%s' must not be empty, please add '--set %s%s=$%s' to the command.%s" .valueKey $subchart .valueKey $varname $getCurrentValue -}} - {{- end -}} -{{- end -}} diff --git a/charts/btp/chronicle/charts/standard-defs/charts/common/values.yaml b/charts/btp/chronicle/charts/standard-defs/charts/common/values.yaml deleted file mode 100644 index f2df68e5e..000000000 --- a/charts/btp/chronicle/charts/standard-defs/charts/common/values.yaml +++ /dev/null @@ -1,5 +0,0 @@ -## bitnami/common -## It is required by CI/CD tools and processes. -## @skip exampleValue -## -exampleValue: common-chart diff --git a/charts/btp/chronicle/charts/standard-defs/templates/_ingress.tpl b/charts/btp/chronicle/charts/standard-defs/templates/_ingress.tpl deleted file mode 100644 index e1b16d928..000000000 --- a/charts/btp/chronicle/charts/standard-defs/templates/_ingress.tpl +++ /dev/null @@ -1,101 +0,0 @@ -{{/* -include "ingress" (dict "ingressName" "myingress" "ingress" path.to.ingress "serviceName" "the-service" "servicePort" 9090 "context" $) - -ingress: - enabled: true - certManager: false - pathType: ImplementationSpecific - apiVersion: "" - hostname: theservice.local - path: / - annotations: {} - tls: false - extraHosts: [] - extraPaths: [] - extraTls: [] - secrets: [] -*/}} -{{- define "lib.ingress" -}} -{{- $ctx := .context -}} -{{- $ingressName := .ingressName -}} -{{- $serviceName := .serviceName -}} -{{- $servicePort := .servicePort -}} -{{- $extraPaths := .ingress.extraPaths -}} -{{- if .ingress.enabled -}} -apiVersion: {{ include "common.capabilities.ingress.apiVersion" $ctx }} -kind: Ingress -metadata: - name: {{ $ingressName }} - namespace: {{ $ctx.Release.Namespace | quote }} - labels: {{- include "common.labels.standard" $ctx | nindent 4 }} - {{- if $ctx.Values.commonLabels }} - {{- include "common.tplvalues.render" ( dict "value" $ctx.Values.commonLabels "context" $ctx ) | nindent 4 }} - {{- end }} - annotations: - {{- if .ingress.certManager }} - kubernetes.io/tls-acme: "true" - {{- end }} - {{- if .ingress.annotations }} - {{- include "common.tplvalues.render" ( dict "value" .ingress.annotations "context" $ctx ) | nindent 4 }} - {{- end }} - {{- if $ctx.Values.commonAnnotations }} - {{- include "common.tplvalues.render" ( dict "value" $ctx.Values.commonAnnotations "context" $ctx ) | nindent 4 }} - {{- end }} -spec: - rules: - {{- if .ingress.hostname }} - - host: {{ .ingress.hostname }} - http: - paths: - - path: {{ .ingress.path }} - {{- if eq "true" (include "common.ingress.supportsPathType" $ctx) }} - pathType: {{ default "ImplementationSpecific" .ingress.pathType }} - {{- end }} - backend: {{- include "common.ingress.backend" (dict "serviceName" $serviceName "servicePort" $servicePort "context" $ctx) | nindent 14 }} - {{- include "lib.safeToYaml" $extraPaths | nindent 10 }} - {{- end }} - {{- range .ingress.extraHosts }} - - host: {{ .name | quote }} - http: - paths: - - path: {{ default "/" .path }} - {{- if eq "true" (include "common.ingress.supportsPathType" $ctx) }} - pathType: {{ default "ImplementationSpecific" .pathType }} - {{- end }} - backend: {{- include "common.ingress.backend" (dict "serviceName" $serviceName "servicePort" $servicePort "context" $ctx) | nindent 14 }} - {{- include "lib.safeToYaml" $extraPaths | nindent 10 }} - {{- end }} - {{/* .ingress.hosts is deprecated */}} - {{- range .ingress.hosts }} - - host: {{ .host | quote }} - http: - paths: - {{- if .path }} - - path: {{ default "/" .path }} - {{- if eq "true" (include "common.ingress.supportsPathType" $ctx) }} - pathType: {{ default "ImplementationSpecific" .pathType }} - {{- end }} - backend: {{- include "common.ingress.backend" (dict "serviceName" $serviceName "servicePort" $servicePort "context" $ctx) | nindent 14 }} - {{- end }} - {{- range .paths }} - - path: {{ . | quote }} - {{- if eq "true" (include "common.ingress.supportsPathType" $ctx) }} - pathType: ImplementationSpecific - {{- end }} - backend: {{- include "common.ingress.backend" (dict "serviceName" $serviceName "servicePort" $servicePort "context" $ctx) | nindent 14 }} - {{- end }} - {{- end }} - {{/* .ingress.hosts is deprecated */}} - {{- if or .ingress.tls .ingress.extraTls }} - tls: - {{- if .ingress.tls }} - - hosts: - - {{ .ingress.hostname }} - secretName: {{ printf "%s-tls" .ingress.hostname }} - {{- end }} - {{- if .ingress.extraTls }} - {{- include "common.tplvalues.render" ( dict "value" .ingress.extraTls "context" $ctx ) | nindent 4 }} - {{- end }} - {{- end }} -{{- end }} -{{- end -}} diff --git a/charts/btp/chronicle/charts/standard-defs/templates/_lib.tpl b/charts/btp/chronicle/charts/standard-defs/templates/_lib.tpl deleted file mode 100644 index deaa325c4..000000000 --- a/charts/btp/chronicle/charts/standard-defs/templates/_lib.tpl +++ /dev/null @@ -1,51 +0,0 @@ - -{{/* -Call a template function in the context of a sub-chart, as opposed to the -current context of the caller -{{ include "lib.call-nested" (list . "subchart" "template_name") }} -*/}} -{{- define "lib.call-nested" }} -{{- $dot := index . 0 }} -{{- $subchart := index . 1 | splitList "." }} -{{- $template := index . 2 }} -{{- $values := $dot.Values }} -{{- range $subchart }} -{{- $values = index $values . }} -{{- end }} -{{- include $template (dict "Chart" (dict "Name" (last $subchart)) "Values" $values "Release" $dot.Release "Capabilities" $dot.Capabilities) }} -{{- end }} - -{{/* -Common labels -*/}} -{{- define "lib.labels" -}} -helm.sh/chart: {{ include "common.names.chart" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{ include "common.labels.matchLabels" . }} -{{- end -}} - -{{/* -Create the name of the service account to use -*/}} -{{- define "lib.serviceAccountName" -}} -{{- if .Values.serviceAccount.create -}} - {{ default (include "common.names.fullname" .) .Values.serviceAccount.name }} -{{- else -}} - {{ default "default" .Values.serviceAccount.name }} -{{- end -}} -{{- end -}} - - -{{/* -Given a variable, if it is not false, output as Yaml - -include "lib.safeToYaml" .Values.something -*/}} -{{- define "lib.safeToYaml" -}} -{{- if . -}} -{{ toYaml . }} -{{- end -}} -{{- end -}} diff --git a/charts/btp/chronicle/charts/standard-defs/templates/_lib_image.tpl b/charts/btp/chronicle/charts/standard-defs/templates/_lib_image.tpl deleted file mode 100644 index 8f8e00231..000000000 --- a/charts/btp/chronicle/charts/standard-defs/templates/_lib_image.tpl +++ /dev/null @@ -1,50 +0,0 @@ -{{/* -Given a setup like the following: - -# global and on down are optional -global: - image: - registry: my-registry.com - tag: latest - -# This is the imageRoot -somecomponent: - image: - registry: my-other-registry.com - tag: 1.0.0 - repository: bobs/coolthing - -*/}} -{{/* -{{ include "lib.image.url" (dict "imageRoot" .Values.sawtooth.containers.validator.image "global" .Values.global)}} -*/}} -{{- define "lib.image.url" -}} - {{- $globalRegistryName := "" -}} - {{- $globalTag := "latest" -}} - {{- if .global -}} - {{- if .global.image -}} - {{- if .global.image.registry -}} - {{- $globalRegistryName = .global.image.registry -}} - {{- end -}} - {{- if .global.image.tag -}} - {{- $globalTag = .global.image.tag -}} - {{- end -}} - {{- end -}} - {{- end -}} - {{- $repository := .imageRoot.repository -}} - {{- $registry := default $globalRegistryName .imageRoot.registry -}} - {{- $tag := default $globalTag .imageRoot.tag -}} - {{- if $registry -}} - {{- printf "%s/%s:%s" $registry $repository $tag -}} - {{- else -}} - {{- printf "%s:%s" $repository $tag -}} - {{- end -}} -{{- end -}} - -{{/* -{{ include "utils.image" (dict "imageRoot" .Values.sawtooth.containers.validator.image "global" .Values.global)}} -*/}} -{{- define "lib.image" -}} -image: {{ include "lib.image.url" . }} -imagePullPolicy: {{ default "IfNotPresent" .imageRoot.pullPolicy }} -{{- end -}} diff --git a/charts/btp/chronicle/charts/standard-defs/templates/_lib_volumes.tpl b/charts/btp/chronicle/charts/standard-defs/templates/_lib_volumes.tpl deleted file mode 100644 index 93f1139b1..000000000 --- a/charts/btp/chronicle/charts/standard-defs/templates/_lib_volumes.tpl +++ /dev/null @@ -1,34 +0,0 @@ - - -{{/* -given a variable list, create a list of volumes - -extraVolumes: - - name: pv-data - persistentVolumeClaim: - claimName: pvc-persistent-cfg - - name: scratch - emptyDir: {} - -include "lib.volumes" .Values.extraVolumes - -*/}} -{{- define "lib.volumes" -}} -{{ include "lib.safeToYaml" . }} -{{- end -}} - -{{/* -given a variable list, create a list of volumeMounts - -extraVolumeMounts: - - name: pv-data - mountPath: /data - - name: scratch - mountPath: /scratch - -include "lib.volumeMounts" .Values.extraVolumeMounts - -*/}} -{{- define "lib.volumeMounts" -}} -{{ include "lib.safeToYaml" . }} -{{- end -}} diff --git a/charts/btp/chronicle/charts/standard-defs/values.yaml b/charts/btp/chronicle/charts/standard-defs/values.yaml deleted file mode 100644 index 1ff659769..000000000 --- a/charts/btp/chronicle/charts/standard-defs/values.yaml +++ /dev/null @@ -1 +0,0 @@ -exampleValue: example diff --git a/charts/btp/chronicle/questions.yaml b/charts/btp/chronicle/questions.yaml deleted file mode 100644 index cb151f091..000000000 --- a/charts/btp/chronicle/questions.yaml +++ /dev/null @@ -1,130 +0,0 @@ -questions: - -# Chronicle -- variable: image.repository - default: "" - required: false - type: string - label: Chronicle docker repository - description: The Chronicle docker repository to use. This may be domain specific, see https://docs.btp.works/chronicle - group: "Chronicle Settings" -- variable: image.tag - default: "" - required: false - type: string - label: Chronicle Image tag - description: The Chronicle docker image tag to use. - group: "Chronicle Settings" -- variable: webUi - default: false - required: false - type: boolean - label: Enable Web UI - description: Enables the graphql playground interface for development use. - group: "Chronicle Settings" - -# Ingress Settings -- variable: ingress.enabled - default: "false" - required: false - type: boolean - label: Enable Chronicle ingress - description: Enable an ingress for the Chronicle service. - group: "Ingress Settings" - show_subquestion_if: true - subquestions: - - variable: ingress.hostname - default: "" - required: false - type: string - label: Ingress hostname - description: Primary hostname for the ingress. - group: "Ingress Settings" - - variable: ingress.path - default: "" - required: false - type: string - label: Hostname Path - description: Path for the ingress's primary hostname. - group: "Ingress Settings" - - variable: ingress.pathType - default: "" - required: false - type: string - label: Hostname PathType - description: PathType for the ingress's primary hostname. - group: "Ingress Settings" - - variable: ingress.certManager - default: "false" - required: false - type: boolean - label: Enable the acme certmanager for this ingress - description: Enable the acme certmanager for this ingress. - group: "Ingress Settings" - - variable: ingress.annotations - default: "" - required: false - type: string - label: Ingress annotations - description: Annotations for the ingress. - group: "Ingress Settings" - - variable: ingress.tls - default: false - required: false - type: boolean - label: Ingress TLS - description: Enable tls on the ingress with a secrete at hostname-tls. - group: "Ingress Settings" - -# Chronicle database settings -- variable: postgres.persistence.enabled - default: "true" - type: boolean - required: true - label: Postgres persistance - description: Allocate a PVC for the internal Postgres instance - group: "Database settings" -- variable: postgres.enabled - default: "true" - required: true - type: boolean - label: Use internal postgres database - description: Create an internal Postgres instance for Chronicle, or if not supply details of an external Postgres. - group: "Database settings" - show_subquestion_if: false - subquestions: - - variable: postgres.user - default: "postgres" - required: true - type: string - label: Postgres user - description: User for the Postgres database - group: "Database settings" - - variable: postgres.host - default: "localhost" - required: true - type: string - label: Postgres host - description: Host for the Postgres database - group: "Database settings" - - variable: postgres.database - default: "postgres" - required: true - type: string - label: Database name - description: Database name for the Postgres database - group: "Database settings" - - variable: postgres.port - default: "5432" - required: true - type: int - label: Postgres port - description: Port for the Postgres database - group: "Database settings" - - variable: postgres.password - default: "postgres" - required: true - type: password - label: Postgres password - description: Password for the Postgres database - group: "Database settings" diff --git a/charts/btp/chronicle/templates/_chronicle.tpl b/charts/btp/chronicle/templates/_chronicle.tpl deleted file mode 100644 index 159800850..000000000 --- a/charts/btp/chronicle/templates/_chronicle.tpl +++ /dev/null @@ -1,130 +0,0 @@ -{{- define "chronicle.replicas" -}} -{{ .Values.replicas }} -{{- end -}} - -{{- define "tp.replicas" -}} -{{ include "lib.call-nested" (list . "sawtooth" "sawtooth.replicas") | int }} -{{- end -}} - -{{- define "chronicle.service.name" -}} -{{- $svc := include "common.names.fullname" . -}} -{{ printf "%s" $svc }} -{{- end -}} - -{{- define "chronicle.labels.matchLabels" -}} -{{ include "common.labels.matchLabels" . }} -{{ include "chronicle.labels.appLabels" . }} -{{- end -}} - -{{- define "chronicle.labels.appLabels" -}} -app: {{ include "common.names.fullname" . }} -chronicle: {{ include "common.names.fullname" . }} -{{- end -}} - -{{- define "chronicle.labels" -}} -{{ include "lib.labels" . }} -{{ include "chronicle.labels.appLabels" . }} -{{- end -}} - -{{- define "chronicle.sawtooth.sawcomp" -}} -{{ include "lib.call-nested" (list . "sawtooth" "sawtooth.ports.sawcomp") | int }} -{{- end -}} - -{{- define "chronicle.sawtooth.rest" -}} -{{ include "lib.call-nested" (list . "sawtooth" "sawtooth.ports.rest") | int }} -{{- end -}} - -{{- define "chronicle.sawtooth.service" -}} -{{- $svc := include "lib.call-nested" (list . "sawtooth" "common.names.fullname") -}} -{{- $ns := .Release.Namespace -}} -{{- $domain := "svc.cluster.local" -}} -{{ printf "%s.%s.%s" $svc $ns $domain }} -{{- end -}} - -{{- define "chronicle.affinity" -}} -{{- if .Values.affinity -}} -{{- toYaml .Values.affinity }} -{{- end -}} -{{- end -}} - -{{- define "chronicle.api.service" -}} -{{ include "chronicle.service.name" . }}-chronicle-api -{{- end -}} - -{{- define "chronicle.id-provider.service" -}} -{{ include "common.names.fullname" . }}-test-id-provider -{{- end -}} - -{{- define "chronicle.id-provider.service.jwks.url" -}} -http://{{ include "chronicle.id-provider.service" . }}:8090/jwks -{{- end -}} - -{{- define "chronicle.id-provider.service.userinfo.url" -}} -http://{{ include "chronicle.id-provider.service" . }}:8090/userinfo -{{- end -}} - -{{- define "chronicle.id-claims" -}} -{{- if .Values.auth.id.claims -}} ---id-claims {{ .Values.auth.id.claims }} \ -{{- else -}} -{{- /* Do nothing */ -}} -{{- end -}} -{{- end -}} - -{{/* The JWKS and userinfo URLs are connected. */}} -{{/* If either is provided Chronicle will use the user-provided options. */}} -{{/* If neither is provided Chronicle should fall back to using the 'devIdProvider'.*/}} -{{- define "chronicle.jwks-url.url" -}} -{{- if or (.Values.auth.jwks.url) (.Values.auth.userinfo.url) -}} -{{- if .Values.auth.jwks.url -}} -{{ .Values.auth.jwks.url }} -{{- end -}} -{{- else -}} -{{- if .Values.devIdProvider.enabled -}} -{{ include "chronicle.id-provider.service.jwks.url" . }} -{{- end -}} -{{- end -}} -{{- end -}} - -{{- define "chronicle.jwks-url.cli" -}} -{{- if or (.Values.auth.jwks.url) (.Values.auth.userinfo.url) -}} -{{- if .Values.auth.jwks.url -}} ---jwks-address {{ include "chronicle.jwks-url.url" . }} \ -{{- end -}} -{{- else -}} -{{- if .Values.devIdProvider.enabled -}} ---jwks-address {{ include "chronicle.jwks-url.url" . }} \ -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* The JWKS and userinfo URLs are connected. */}} -{{/* If either is provided Chronicle will use the user-provided options. */}} -{{/* If neither is provided Chronicle should fall back to using the 'devIdProvider'.*/}} -{{- define "chronicle.userinfo-url" -}} -{{- if or (.Values.auth.jwks.url) (.Values.auth.userinfo.url) -}} -{{- if .Values.auth.userinfo.url -}} -{{ .Values.auth.userinfo.url }} -{{- end -}} -{{- else -}} -{{- if .Values.devIdProvider.enabled -}} -{{ include "chronicle.id-provider.service.userinfo.url" . }} -{{- end -}} -{{- end -}} -{{- end -}} - -{{- define "chronicle.userinfo-url.cli" -}} -{{- if or (.Values.auth.jwks.url) (.Values.auth.userinfo.url) -}} -{{- if .Values.auth.userinfo.url -}} ---userinfo-address {{ include "chronicle.userinfo-url" . }} \ -{{- end -}} -{{- else -}} -{{- if .Values.devIdProvider.enabled -}} ---userinfo-address {{ include "chronicle.userinfo-url" . }} \ -{{- end -}} -{{- end -}} -{{- end -}} - -{{- define "chronicle.root-key.secret" -}} -{{ include "common.names.fullname" . }}-root-key -{{- end -}} diff --git a/charts/btp/chronicle/templates/_utils.tpl b/charts/btp/chronicle/templates/_utils.tpl deleted file mode 100644 index b8d2b5030..000000000 --- a/charts/btp/chronicle/templates/_utils.tpl +++ /dev/null @@ -1,44 +0,0 @@ - -{{/* -{{ include "utils.image.url" (dict "imageRoot" .Values.sawtooth.containers.validator.image "global" .Values.global)}} -*/}} -{{- define "utils.image.url" -}} -{{- $globalRegistryName := default "index.docker.io" .global.image.registry -}} -{{- $repository := .imageRoot.repository -}} -{{- $registryName := default $globalRegistryName .imageRoot.registry -}} -{{- $tag := default .global.image.tag .imageRoot.tag -}} -{{- printf "%s/%s:%s" $registryName $repository $tag -}} -{{- end -}} - -{{/* -{{ include "utils.image" (dict "imageRoot" .Values.sawtooth.containers.validator.image "global" .Values.global)}} -*/}} -{{- define "utils.image" -}} -image: {{ include "utils.image.url" . }} -imagePullPolicy: {{ default "IfNotPresent" .imageRoot.pullPolicy }} -{{- end -}} - -{{/* */}} -{{- define "utils.hostaliases" -}} -{{- if .Values.hostAliases -}} -{{ toYaml .Values.hostAliases }} -{{- end -}} -{{- end -}} - -{{- define "utils.k8s.image" -}} -{{- include "utils.image" (dict "imageRoot" .Values.utils.k8s.image "global" .Values.global) -}} -{{- end -}} - -{{/* -{{ include "utils.call-nested" (list . "subchart" "template_name") }} -*/}} -{{- define "utils.call-nested" }} -{{- $dot := index . 0 }} -{{- $subchart := index . 1 | splitList "." }} -{{- $template := index . 2 }} -{{- $values := $dot.Values }} -{{- range $subchart }} -{{- $values = index $values . }} -{{- end }} -{{- include $template (dict "Chart" (dict "Name" (last $subchart)) "Values" $values "Release" $dot.Release "Capabilities" $dot.Capabilities) }} -{{- end }} diff --git a/charts/btp/chronicle/templates/chronicle-config.yaml b/charts/btp/chronicle/templates/chronicle-config.yaml deleted file mode 100644 index f0f114b48..000000000 --- a/charts/btp/chronicle/templates/chronicle-config.yaml +++ /dev/null @@ -1,17 +0,0 @@ ---- -{{$stlServiceName := include "lib.call-nested" (list . "sawtooth" "common.names.fullname")}} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{.Release.Name}}-chronicle-config -data: - config.toml: | - [secrets] - path = "/var/lib/chronicle/secrets/" - [store] - path = "/var/lib/chronicle/store/" - address = "postgresql://{{ .Values.postgres.user }}@{{ .Values.postgres.host }}:5432/{{ .Values.postgres.database }}" - [validator] - address = "tcp://{{ include "chronicle.sawtooth.service" . }}:{{ include "chronicle.sawtooth.sawcomp" . }}" - [namespace_bindings] - default = "fd717fd6-70f1-44c1-81de-287d5e101089" diff --git a/charts/btp/chronicle/templates/chronicle-init.yaml b/charts/btp/chronicle/templates/chronicle-init.yaml deleted file mode 100644 index dd9a7a95b..000000000 --- a/charts/btp/chronicle/templates/chronicle-init.yaml +++ /dev/null @@ -1,228 +0,0 @@ -{{$stlServiceName := include "lib.call-nested" (list . "sawtooth" "common.names.fullname")}} ---- -apiVersion: batch/v1 -kind: Job -metadata: - annotations: - "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded - name: {{ include "common.names.fullname" . }}-init - labels: {{ include "chronicle.labels" . | nindent 4 }} - component: chronicle -spec: - template: - metadata: - labels: {{ include "chronicle.labels" . | nindent 8 }} - component: chronicle - spec: - restartPolicy: Never - serviceAccountName: {{ include "lib.serviceAccountName" . }} - automountServiceAccountToken: true - volumes: {{- include "lib.volumes" .Values.opa.tp.extraVolumes | nindent 8 }} - - name: shared-data - emptyDir: {} - initContainers: - - name: get-secret - image: alpine/k8s:1.24.13 - command: [ "sh", "-ec" ] - args: - - | - if kubectl get secret {{ include "chronicle.root-key.secret" . }} -n {{.Release.Namespace}} >/dev/null 2>&1; then - echo "Secret found." - kubectl get secret {{ include "chronicle.root-key.secret" . }} -n {{.Release.Namespace}} -o jsonpath='{.data.*}' | base64 -d > /shared-data/root.pem - touch /shared-data/secret-found - else - echo "Secret not found." - fi - volumeMounts: - - name: shared-data - mountPath: /shared-data - - name: generate-secret - {{- include "lib.image" (dict "imageRoot" .Values.opa.opaInit.image "global" .Values.global ) | nindent 10 }} - command: [ "bash", "-ec"] - args: - - | - if [[ ! -f "/shared-data/root.pem" ]]; then - echo "Generating new root key." - opactl generate --output /shared-data/root.pem - else - echo "Root key already exists." - fi - env: {{ include "lib.safeToYaml" .Values.env | nindent 12 }} - - name: RUST_LOG - value: {{ .Values.logLevel }} - - name: RUST_BACKTRACE - value: {{ .Values.backtraceLevel }} - volumeMounts: - - name: shared-data - mountPath: /shared-data - - name: create-secret - image: alpine/k8s:1.24.13 - command: [ "sh", "-ec" ] - args: - - | - if [ -f "/shared-data/secret-found" ]; then - echo "Secret already exists." - else - echo "Creating k8s secret from key." - kubectl create secret generic {{ include "chronicle.root-key.secret" . }} \ - -n {{ .Release.Namespace }} \ - --from-file=/shared-data/root.pem - fi - volumeMounts: - - name: shared-data - mountPath: /shared-data - {{ if .Values.opa.enabled }} - - name: opa-bootstrap-root - {{- include "lib.image" (dict "imageRoot" .Values.opa.opaInit.image "global" .Values.global ) | nindent 10 }} - command: [ "bash", "-ec"] - args: - - | - wait-for-it $HOST:$PORT --timeout=0 - echo "Waiting to ensure Sawtooth validator is ready ..." - sleep 100 - - if [[ -f "/shared-data/secret-found" ]]; then - echo "Skipping root key bootstrap." - else - opactl \ - --sawtooth-address tcp://$HOST:$PORT \ - bootstrap \ - --root-key /shared-data/root.pem - fi - env: {{ include "lib.safeToYaml" .Values.env | nindent 12 }} - - name: HOST - value: {{ $stlServiceName }}.{{ .Release.Namespace }}.svc.cluster.local - - name: PORT - value: "{{ include "chronicle.sawtooth.sawcomp" . }}" - - name: RUST_LOG - value: {{ .Values.logLevel }} - - name: RUST_BACKTRACE - value: {{ .Values.backtraceLevel }} - volumeMounts: - - name: shared-data - mountPath: /shared-data - {{ if .Values.opa.policy.url }} - - name: wait-for-sawtooth-rest-api - {{- include "lib.image" (dict "imageRoot" .Values.opa.opaInit.image "global" .Values.global ) | nindent 10 }} - command: [ "bash", "-ec"] - args: - - | - wait-for-it $HOST:$PORT --timeout=0 - echo "Sawtooth rest API is ready." - env: - - name: HOST - value: {{ $stlServiceName }}.{{ .Release.Namespace }}.svc.cluster.local - - name: PORT - value: "{{ include "chronicle.sawtooth.rest" . }}" - - name: RUST_LOG - value: {{ .Values.logLevel }} - - name: RUST_BACKTRACE - value: {{ .Values.backtraceLevel }} - volumeMounts: - - name: shared-data - mountPath: /shared-data - - name: opa-settings - {{- include "lib.image" (dict "imageRoot" .Values.sawset.image "global" .Values.global ) | nindent 10 }} - command: [ "bash", "-ec"] - args: - - | - if sawtooth settings list --url http://$HOST:$PORT | grep -q "chronicle.opa.policy_name"; then - echo "Skipping setting Sawtooth OPA settings." - exit 0 - else - echo "Creating Sawtooth settings batch." - sawset proposal create \ - -k /etc/sawtooth/keys/{{ $stlServiceName }}-0 \ - chronicle.opa.policy_name={{ required "opa.policy.id required!" .Values.opa.policy.id }} \ - chronicle.opa.entrypoint={{ required "opa.policy.entrypoint required!" .Values.opa.policy.entrypoint }} \ - -o /shared-data/opa-settings.batch - - echo "Submitting Sawtooth OPA settings batch." - sawtooth batch submit \ - -f /shared-data/opa-settings.batch \ - --url http://$HOST:$PORT \ - --wait 60 - fi - env: - - name: HOST - value: {{ $stlServiceName }}.{{ .Release.Namespace }}.svc.cluster.local - - name: PORT - value: "{{ include "chronicle.sawtooth.rest" . }}" - volumeMounts: - - name: shared-data - mountPath: /shared-data - - name: validator-secret - mountPath: /etc/sawtooth/keys - readOnly: true - - name: get-policy - {{- include "lib.image" (dict "imageRoot" .Values.opa.opaInit.image "global" .Values.global ) | nindent 10 }} - command: [ "bash", "-ec"] - args: - - | - if opactl \ - --sawtooth-address tcp://$HOST:$PORT \ - get-policy \ - --id {{ .Values.opa.policy.id }} \ - --output policy.bin >/dev/null 2>&1; then - echo "Policy already set." - touch /shared-data/policy-already-set - else - echo "Policy not found." - exit 0 - fi - env: {{ include "lib.safeToYaml" .Values.env | nindent 12 }} - - name: HOST - value: {{ $stlServiceName }}.{{ .Release.Namespace }}.svc.cluster.local - - name: PORT - value: "{{ include "chronicle.sawtooth.sawcomp" . }}" - - name: RUST_LOG - value: {{ .Values.logLevel }} - - name: RUST_BACKTRACE - value: {{ .Values.backtraceLevel }} - volumeMounts: - - name: shared-data - mountPath: /shared-data - - name: set-policy - {{- include "lib.image" (dict "imageRoot" .Values.opa.opaInit.image "global" .Values.global ) | nindent 10 }} - command: [ "bash", "-ec"] - args: - - | - if [[ -f "/shared-data/policy-already-set" ]]; then - echo "Skipping setting policy." - exit 0 - else - echo "Policy not found on chain. Setting policy." - opactl \ - --sawtooth-address tcp://$HOST:$PORT \ - set-policy \ - --id {{ .Values.opa.policy.id }} \ - -p {{ .Values.opa.policy.url }} \ - --root-key /shared-data/root.pem - fi - env: {{ include "lib.safeToYaml" .Values.env | nindent 12 }} - - name: HOST - value: {{ $stlServiceName }}.{{ .Release.Namespace }}.svc.cluster.local - - name: PORT - value: "{{ include "chronicle.sawtooth.sawcomp" . }}" - - name: RUST_LOG - value: {{ .Values.logLevel }} - - name: RUST_BACKTRACE - value: {{ .Values.backtraceLevel }} - volumeMounts: - - name: shared-data - mountPath: /shared-data - {{ end }} - {{ end }} - containers: - - name: chronicle-init - image: busybox:1.36 - command: [ "sh", "-c"] - args: - - | - echo "Chronicle bootstrap and OPA settings initialization complete." - volumes: - - name: shared-data - emptyDir: {} - - name: validator-secret - configMap: - name: validator-secret diff --git a/charts/btp/chronicle/templates/chronicle-secret-volume.yaml b/charts/btp/chronicle/templates/chronicle-secret-volume.yaml deleted file mode 100644 index 417380c01..000000000 --- a/charts/btp/chronicle/templates/chronicle-secret-volume.yaml +++ /dev/null @@ -1,12 +0,0 @@ -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: chronicle-secrets - annotations: - "helm.sh/resource-policy": keep -spec: - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 1Gi diff --git a/charts/btp/chronicle/templates/id-provider-service.yaml b/charts/btp/chronicle/templates/id-provider-service.yaml deleted file mode 100644 index eceaf7059..000000000 --- a/charts/btp/chronicle/templates/id-provider-service.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if .Values.devIdProvider.enabled }} ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ include "chronicle.id-provider.service" . }} - labels: {{ include "chronicle.labels" . | nindent 4 }} - component: test-id-provider -spec: - type: ClusterIP - clusterIP: None - sessionAffinity: ClientIP - ports: - - port: 8090 - protocol: TCP - targetPort: 8090 - name: {{ include "chronicle.id-provider.service" . }} - selector: {{ include "chronicle.labels.matchLabels" . | nindent 4 }} - component: test-id-provider -{{- end }} diff --git a/charts/btp/chronicle/templates/id-provider-statefulset.yaml b/charts/btp/chronicle/templates/id-provider-statefulset.yaml deleted file mode 100644 index d25eb3295..000000000 --- a/charts/btp/chronicle/templates/id-provider-statefulset.yaml +++ /dev/null @@ -1,28 +0,0 @@ -{{- if .Values.devIdProvider.enabled }} ---- -apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: {{ include "chronicle.id-provider.service" . }} - labels: {{ include "chronicle.labels" . | nindent 4 }} - component: test-id-provider -spec: - selector: - matchLabels: {{ include "chronicle.labels.matchLabels" . | nindent 6 }} - component: test-id-provider - serviceName: {{ include "chronicle.id-provider.service" . }} - template: - metadata: - labels: {{ include "chronicle.labels" . | nindent 8 }} - component: test-id-provider - spec: - serviceAccountName: {{ include "lib.serviceAccountName" . }} - affinity: {{ include "lib.safeToYaml" .Values.affinity | nindent 8 }} - containers: - - name: id-provider - {{- include "lib.image" (dict "imageRoot" .Values.devIdProvider.image "global" .Values.global ) | nindent 10 }} - ports: - - name: jwks - containerPort: 8090 - protocol: TCP -{{- end }} diff --git a/charts/btp/chronicle/templates/ingress.yaml b/charts/btp/chronicle/templates/ingress.yaml deleted file mode 100644 index 67a67d09e..000000000 --- a/charts/btp/chronicle/templates/ingress.yaml +++ /dev/null @@ -1,4 +0,0 @@ -{{- $serviceName := (include "chronicle.api.service" . ) -}} -{{- $ingressName := printf "%s" $serviceName -}} -{{- $servicePort := .Values.port | int -}} -{{ include "lib.ingress" (dict "ingressName" $ingressName "ingress" .Values.ingress "serviceName" $serviceName "servicePort" $servicePort "context" $) }} diff --git a/charts/btp/chronicle/templates/pernode-opa-tp-service.yaml b/charts/btp/chronicle/templates/pernode-opa-tp-service.yaml deleted file mode 100644 index c0a893188..000000000 --- a/charts/btp/chronicle/templates/pernode-opa-tp-service.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if .Values.opa.enabled }} -{{- $ctx := . -}} -{{ range untilStep 0 ((include "tp.replicas" $ctx) | int) 1 }} ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ include "common.names.fullname" $ctx }}-opa-tp-{{ . }} - labels: {{- include "lib.labels" $ctx | nindent 4 }} - per-node: {{ include "common.names.fullname" $ctx }}-{{ . }} - component: opa-tp -spec: - type: ClusterIP - clusterIP: None - sessionAffinity: ClientIP - selector: {{- include "common.labels.matchLabels" $ctx | nindent 4 }} - component: opa-tp - statefulset.kubernetes.io/pod-name: {{ include "common.names.fullname" $ctx }}-{{ . }} -{{- end -}} -{{- end }} diff --git a/charts/btp/chronicle/templates/pernode-tp-service.yaml b/charts/btp/chronicle/templates/pernode-tp-service.yaml deleted file mode 100644 index 2bdfcce24..000000000 --- a/charts/btp/chronicle/templates/pernode-tp-service.yaml +++ /dev/null @@ -1,18 +0,0 @@ -{{- $ctx := . -}} -{{ range untilStep 0 ((include "tp.replicas" $ctx) | int) 1 }} ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ include "common.names.fullname" $ctx }}-tp-{{ . }} - labels: {{- include "lib.labels" $ctx | nindent 4 }} - per-node: {{ include "common.names.fullname" $ctx }}-{{ . }} - component: chronicle-tp -spec: - type: ClusterIP - clusterIP: None - sessionAffinity: ClientIP - selector: {{- include "common.labels.matchLabels" $ctx | nindent 4 }} - component: chronicle-tp - statefulset.kubernetes.io/pod-name: {{ include "common.names.fullname" $ctx }}-{{ . }} -{{- end -}} diff --git a/charts/btp/chronicle/templates/secrets-roles.yaml b/charts/btp/chronicle/templates/secrets-roles.yaml deleted file mode 100644 index e56f3e083..000000000 --- a/charts/btp/chronicle/templates/secrets-roles.yaml +++ /dev/null @@ -1,28 +0,0 @@ ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: {{ include "common.names.fullname" . }}-secrets-role - namespace: {{.Release.Namespace}} -rules: - - apiGroups: - - "" # "" refers to the core API group - resources: - - secrets - verbs: - - create - - get ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: {{ include "common.names.fullname" . }}-secrets-role-rb - namespace: {{ .Release.Namespace }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: {{ include "common.names.fullname" . }}-secrets-role -subjects: -- kind: ServiceAccount - name: {{ include "lib.serviceAccountName" . }} - namespace: {{ .Release.Namespace }} diff --git a/charts/btp/chronicle/templates/service.yaml b/charts/btp/chronicle/templates/service.yaml deleted file mode 100644 index b7f9f06bd..000000000 --- a/charts/btp/chronicle/templates/service.yaml +++ /dev/null @@ -1,17 +0,0 @@ ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ include "chronicle.api.service" . }} - labels: {{ include "chronicle.labels" . | nindent 4 }} - component: chronicle -spec: - type: ClusterIP - sessionAffinity: ClientIP - ports: - - port: {{ .Values.port }} - protocol: TCP - targetPort: {{ .Values.port }} - name: chronicle - selector: {{ include "chronicle.labels.matchLabels" . | nindent 4 }} - component: chronicle diff --git a/charts/btp/chronicle/templates/serviceaccount.yaml b/charts/btp/chronicle/templates/serviceaccount.yaml deleted file mode 100644 index c67cc27fd..000000000 --- a/charts/btp/chronicle/templates/serviceaccount.yaml +++ /dev/null @@ -1,12 +0,0 @@ ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ include "lib.serviceAccountName" . }} - namespace: {{ .Release.Namespace }} -{{ if .Values.imagePullSecrets.enabled }} -imagePullSecrets: -{{range .Values.imagePullSecrets.value }} - - name: {{ .name }} -{{ end }} -{{ end }} diff --git a/charts/btp/chronicle/templates/statefulset.yaml b/charts/btp/chronicle/templates/statefulset.yaml deleted file mode 100644 index a684da350..000000000 --- a/charts/btp/chronicle/templates/statefulset.yaml +++ /dev/null @@ -1,189 +0,0 @@ -{{$stlServiceName := include "lib.call-nested" (list . "sawtooth" "common.names.fullname")}} ---- -apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: {{ include "common.names.fullname" . }}-chronicle - labels: {{ include "chronicle.labels" . | nindent 4 }} - component: chronicle -spec: - replicas: {{ include "chronicle.replicas" . }} - selector: - matchLabels: {{ include "chronicle.labels.matchLabels" . | nindent 6 }} - component: chronicle - serviceName: {{ include "common.names.fullname" . }} - template: - metadata: - labels: {{ include "chronicle.labels" . | nindent 8 }} - component: chronicle - spec: - serviceAccountName: {{ include "lib.serviceAccountName" . }} - affinity: {{ include "lib.safeToYaml" .Values.affinity | nindent 8 }} - initContainers: - - name: chronicle-permissions - image: busybox:1.36 - command: [ "sh", "-c"] - args: - - | - chown -R 999:999 /var/lib/chronicle || true - volumeMounts: - - name: chronicle-config - mountPath: /etc/chronicle/config/ - - name: chronicle-secrets - mountPath: /var/lib/chronicle/secrets/ - readOnly: false - - name: chronicle-keystore - {{- include "lib.image" (dict "imageRoot" .Values.image "global" .Values.global ) | nindent 10 }} - command: [ "bash", "-c"] - args: - - | - /usr/local/bin/chronicle \ - -c /etc/chronicle/config/config.toml \ - verify-keystore - env: {{ include "lib.safeToYaml" .Values.env | nindent 12 }} - - name: RUST_LOG - value: {{ .Values.logLevel }} - volumeMounts: - - name: chronicle-config - mountPath: /etc/chronicle/config/ - - name: chronicle-secrets - mountPath: /var/lib/chronicle/secrets/ - readOnly: false - {{- if and .Values.opa.enabled .Values.opa.policy.url }} - - name: wait-for-opa-settings - {{- include "lib.image" (dict "imageRoot" .Values.sawset.image "global" .Values.global ) | nindent 10 }} - command: [ "bash", "-exc"] - args: - - | - keepTrying=true - while [ $keepTrying = "true" ]; do - if sawtooth settings list --url http://$HOST:$PORT | grep -q "chronicle.opa.policy_name"; then - break - else - echo "Waiting for OPA policy id." - sleep 10 - fi - done - env: - - name: HOST - value: {{ $stlServiceName }}.{{ .Release.Namespace }}.svc.cluster.local - - name: PORT - value: "{{ include "chronicle.sawtooth.rest" . }}" - {{- end }} - containers: - {{- if .Values.postgres.enabled }} - - name: postgres - {{- include "lib.image" (dict "imageRoot" .Values.postgres.image "global" .Values.global ) | nindent 10 }} - ports: - - containerPort: {{.Values.postgres.port }} - resources: {{- include "lib.safeToYaml" .Values.postgres.resources | nindent 12 }} - env: - - name: PGDATA - value: /data/chronicle - - name: POSTGRES_PASSWORD - {{- if .Values.postgres.existingPasswordSecret }} - valueFrom: - secretKeyRef: - name: {{ .Values.postgres.existingPasswordSecret }} - key: {{ .Values.postgres.existingPasswordSecretKey }} - {{- else }} - value: {{ .Values.postgres.password }} - {{- end }} - {{- include "lib.safeToYaml" .Values.postgres.env | nindent 12 }} - volumeMounts: - - mountPath: /data - name: "pgdata" - {{- include "lib.volumeMounts" .Values.extraVolumeMounts | nindent 12 }} - {{- end }} - - name: chronicle - {{- include "lib.image" (dict "imageRoot" .Values.image "global" .Values.global ) | nindent 10 }} - ports: - - containerPort: {{ .Values.port }} - command: [ "bash", "-c"] - args: - - | - {{ if .Values.auth.required }} - {{ if and (not .Values.auth.jwks.url) (not .Values.auth.userinfo.url) (not .Values.devIdProvider.enabled) }} - {{ required "If 'auth.required' you need to provide at least 'auth.jwks.url' or 'auth.userinfo.url', or 'devIdProvider.enabled' must be 'true'!" .Values.auth.jwks.url }} - {{ end }} - {{ end }} - - echo "Waiting 20 seconds for postgres to start"; - sleep 20; - chronicle \ - -c /etc/chronicle/config/config.toml \ - --console-logging json \ - --sawtooth tcp://{{ include "chronicle.sawtooth.service" . }}:{{ include "chronicle.sawtooth.sawcomp" . }} \ - --remote-database \ - --database-name {{ .Values.postgres.database }} \ - --database-username {{ .Values.postgres.user }} \ - --database-host {{ .Values.postgres.host }} \ - {{- if not .Values.opa.enabled }} - --embedded-opa-policy \ - {{- end }} - serve-api \ - --interface 0.0.0.0:{{ .Values.port }} \ - {{- if .Values.auth.required }} - --require-auth \ - {{- end }} - {{ include "chronicle.jwks-url.cli" . }} - {{ include "chronicle.userinfo-url.cli" . }} - {{ include "chronicle.id-claims" . }} - ; - env: {{ include "lib.safeToYaml" .Values.env | nindent 12 }} - - name: RUST_LOG - value: {{ .Values.logLevel }} - - name: PGPASSWORD - {{- if .Values.postgres.existingPasswordSecret }} - valueFrom: - secretKeyRef: - name: {{ .Values.postgres.existingPasswordSecret }} - key: {{ .Values.postgres.existingPasswordSecretKey }} - {{- else }} - value: {{ .Values.postgres.password }} - {{- end }} - {{- include "lib.safeToYaml" .Values.postgres.env | nindent 12 }} - resources: {{- include "lib.safeToYaml" .Values.resources | nindent 12 }} - volumeMounts: - - name: chronicle-config - mountPath: /etc/chronicle/config/ - - name: chronicle-secrets - mountPath: /var/lib/chronicle/secrets/ - readOnly: true - - name: chronicle-data - mountPath: /var/lib/chronicle/store/ - {{- include "lib.volumeMounts" .Values.extraVolumeMounts | nindent 12 }} - volumes: - - name: chronicle-secrets - persistentVolumeClaim: - claimName: chronicle-secrets - - name: chronicle-data - persistentVolumeClaim: - claimName: chronicle-data - - name: chronicle-config - configMap: - name: {{ .Release.Name }}-chronicle-config -{{- if not .Values.postgres.persistence.enabled }} - - name: "pgdata" - emptyDir: {} -{{- end }} - volumeClaimTemplates: - - metadata: - name: chronicle-data - spec: - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 6Gi -{{- if .Values.postgres.persistence.enabled }} - - metadata: - name: "pgdata" - annotations: {{- include "lib.safeToYaml" .Values.postgres.persistence.annotations | nindent 10 }} - spec: - accessModes: {{- include "lib.safeToYaml" .Values.postgres.persistence.accessModes | nindent 10 }} - storageClassName: {{ .Values.postgres.persistence.storageClass | quote }} - resources: - requests: - storage: {{ .Values.postgres.persistence.size | quote }} -{{- end }} diff --git a/charts/btp/chronicle/templates/test-token-getter-roles.yaml b/charts/btp/chronicle/templates/test-token-getter-roles.yaml deleted file mode 100644 index 95d061f85..000000000 --- a/charts/btp/chronicle/templates/test-token-getter-roles.yaml +++ /dev/null @@ -1,35 +0,0 @@ -{{- if .Values.test.enabled }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: {{ include "common.names.fullname" . }}-test-token-getter-role - namespace: {{.Release.Namespace}} -rules: - - apiGroups: - - "" # "" refers to the core API group - resources: - - pods/exec - verbs: - - create - - apiGroups: - - "" # "" refers to the core API group - resources: - - pods - verbs: - - get ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: {{ include "common.names.fullname" . }}-test-token-getter-rb - namespace: {{ .Release.Namespace }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: {{ include "common.names.fullname" . }}-test-token-getter-role -subjects: -- kind: ServiceAccount - name: {{ include "lib.serviceAccountName" . }} - namespace: {{ .Release.Namespace }} -{{- end }} diff --git a/charts/btp/chronicle/templates/tests/api-test.yaml b/charts/btp/chronicle/templates/tests/api-test.yaml deleted file mode 100644 index e10d5d59f..000000000 --- a/charts/btp/chronicle/templates/tests/api-test.yaml +++ /dev/null @@ -1,116 +0,0 @@ -{{- if .Values.test.enabled }} -apiVersion: batch/v1 -kind: Job -metadata: - name: {{ include "common.names.fullname" . }}-api-test - labels: {{ include "chronicle.labels" . | nindent 4 }} - component: api-test - annotations: - "helm.sh/hook": test - "helm.sh/hook-delete-policy": hook-succeeded -spec: - backoffLimit: 0 - template: - spec: - restartPolicy: Never - serviceAccountName: {{ include "lib.serviceAccountName" . }} - automountServiceAccountToken: true - {{- if .Values.auth.required }} - {{ if not .Values.devIdProvider.enabled }} - {{ required "If 'auth.required' when using the test suite 'devIdProvider.enabled' must be set to 'true'!" .Values.devIdProvider.enabled }} - {{ end }} - initContainers: - - name: wait-for-id-provider - {{- include "lib.image" (dict "imageRoot" .Values.test.api.image "global" .Values.global ) | nindent 10 }} - command: [ "sh", "-c" ] - args: - - | - URL="{{ include "chronicle.id-provider.service.jwks.url" . }}" - - wait_for_url() { - local url=$1 - scheme=$(echo "$url" | cut -f 1 -d :) - hostAndPort=$(echo "$url" | cut -f 3 -d /) - HOST=$(echo "$hostAndPort" | cut -f 1 -d :) - port=$(echo "$hostAndPort" | awk -F: '{print $2}') - - case $scheme in - "http") - defaultPort=80 - ;; - "https") - defaultPort=443 - ;; - *) - defaultPort=80 - ;; - esac - - PORT=${port:-$defaultPort} - wait-for-it "$HOST:$PORT" --timeout=120 - } - - echo "Waiting for id-provider to be ready ..." - wait_for_url "$URL" - - if [ $? -eq 0 ]; then - echo "Id-provider is ready. Exiting." - exit 0 - else - echo "Timeout occurred. Please check if the correct JWKS URL has been provided." - exit 1 - fi - - name: token-loader - image: alpine/k8s:1.24.13 - command: [ "sh", "-ec" ] - args: - - | - echo "Waiting to ensure id-provider is ready ..." - sleep 20 - echo "Getting token from id-provider ..." - kubectl exec {{ include "chronicle.id-provider.service" . }}-0 -c id-provider -- oauth-token > /shared-data/jwks-token - echo "Token loaded. Exiting." - volumeMounts: - - name: shared-data - mountPath: /shared-data - {{- end }} - containers: - - name: test - {{- include "lib.image" (dict "imageRoot" .Values.test.api.image "global" .Values.global ) | nindent 10 }} - command: [ "sh", "-ec" ] - args: - - | - API={{ include "chronicle.api.service" . }} - export PORT={{ .Values.port }} - echo "Waiting for API to be ready ..." - wait-for-it $API:$PORT --timeout=0 - echo "Getting IP address for API ..." - getent hosts $API | cut -f 1 -d \ | head -n 1 > /shared-data/api-ip || exit 1 - - if [ -f "/shared-data/jwks-token" ]; then - echo "Found token." - sleep 5 - export TOKEN=$(cat "/shared-data/jwks-token") - fi - - export HOST=$(cat /shared-data/api-ip) - echo "Testing API with subscribe-submit-test..." - subscribe-submit-test - exit_code=$? - if [ $exit_code -eq 0 ]; then - echo "Test complete." - exit $exit_code - else - echo "Test failed." - exit $exit_code - fi - env: - - name: REQUIRE_AUTH - value: {{ .Values.auth.required | quote }} - volumeMounts: - - name: shared-data - mountPath: /shared-data - volumes: {{- include "lib.volumes" .Values.opa.tp.extraVolumes | nindent 8 }} - - name: shared-data - emptyDir: {} -{{- end }} diff --git a/charts/btp/chronicle/templates/tp-service.yaml b/charts/btp/chronicle/templates/tp-service.yaml deleted file mode 100644 index de0d5c7cd..000000000 --- a/charts/btp/chronicle/templates/tp-service.yaml +++ /dev/null @@ -1,13 +0,0 @@ ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ include "common.names.fullname" . }}-tp - labels: {{ include "chronicle.labels" . | nindent 4 }} - component: chronicle-tp -spec: - type: ClusterIP - clusterIP: None - sessionAffinity: ClientIP - selector: {{ include "chronicle.labels.matchLabels" . | nindent 4 }} - component: chronicle-tp diff --git a/charts/btp/chronicle/templates/tp-statefulset.yaml b/charts/btp/chronicle/templates/tp-statefulset.yaml deleted file mode 100644 index 25b685059..000000000 --- a/charts/btp/chronicle/templates/tp-statefulset.yaml +++ /dev/null @@ -1,77 +0,0 @@ -{{$stlServiceName := include "lib.call-nested" (list . "sawtooth" "common.names.fullname")}} -apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: {{ include "common.names.fullname" . }}-tp - labels: {{ include "chronicle.labels" . | nindent 4 }} - component: chronicle-tp -spec: - replicas: {{ include "tp.replicas" . }} - serviceName: {{ include "common.names.fullname" . }}-tp - podManagementPolicy: Parallel - updateStrategy: - type: RollingUpdate - {{ if (semverCompare "^1.22" .Capabilities.KubeVersion.Version) -}} - minReadySeconds: {{ .Values.tp.minReadySeconds | int }} - {{- end }} - selector: - matchLabels: {{ include "chronicle.labels.matchLabels" . | nindent 6 }} - component: chronicle-tp - template: - metadata: - labels: {{- include "chronicle.labels" . | nindent 8 }} - component: chronicle-tp - annotations: {{- include "lib.safeToYaml" .Values.podAnnotations | nindent 8 }} - spec: - serviceAccountName: {{ include "lib.serviceAccountName" . }} - affinity: {{ include "lib.safeToYaml" .Values.affinity | nindent 8 }} - hostAliases: - containers: - - name: chronicle-tp - {{- include "lib.image" (dict "imageRoot" .Values.tp.image "global" .Values.global ) | nindent 10 }} - command: [ "bash", "-c"] - args: - - | - HOST={{ $stlServiceName }}-${HOST##*-}.{{ .Release.Namespace }}.svc.cluster.local - PORT={{ include "chronicle.sawtooth.sawcomp" . }} - echo tcp://$HOST:$PORT && - /usr/local/bin/chronicle_sawtooth_tp \ - --console-logging json \ - --connect tcp://$HOST:$PORT - resources: {{- include "lib.safeToYaml" .Values.tp.resources | nindent 12 }} - env: - - name: RUST_LOG - value: {{ .Values.tp.logLevel }} - - name: HOST - valueFrom: - fieldRef: - fieldPath: metadata.name - {{- include "lib.safeToYaml" .Values.tp.env | nindent 12 }} - volumeMounts: {{- include "lib.volumeMounts" .Values.tp.extraVolumeMounts | nindent 12 }} - {{- if .Values.opa.enabled }} - - name: opa-tp - {{- include "lib.image" (dict "imageRoot" .Values.opa.tp.image "global" .Values.global ) | nindent 10 }} - command: [ "bash", "-xc"] - args: - - | - HOST={{ $stlServiceName }}-${HOST##*-}.{{ .Release.Namespace }}.svc.cluster.local - PORT={{ include "chronicle.sawtooth.sawcomp" . }} - wait-for-it $HOST:$PORT --timeout=0 - echo tcp://$HOST:$PORT && - /usr/local/bin/opa-tp \ - -C tcp://$HOST:$PORT \ - --console-logging json - resources: {{- include "lib.safeToYaml" .Values.opa.tp.resources | nindent 12 }} - env: {{ include "lib.safeToYaml" .Values.env | nindent 12 }} - - name: RUST_LOG - value: {{ .Values.logLevel }} - - name: RUST_BACKTRACE - value: {{ .Values.backtraceLevel }} - - name: HOST - valueFrom: - fieldRef: - fieldPath: metadata.name - {{- include "lib.safeToYaml" .Values.tp.env | nindent 12 }} - volumeMounts: {{- include "lib.volumeMounts" .Values.opa.tp.extraVolumeMounts | nindent 12 }} - {{- end }} - volumes: {{- include "lib.volumes" .Values.tp.extraVolumes | nindent 8 }} diff --git a/charts/btp/chronicle/values.yaml b/charts/btp/chronicle/values.yaml deleted file mode 100644 index 6cfd84a6e..000000000 --- a/charts/btp/chronicle/values.yaml +++ /dev/null @@ -1,235 +0,0 @@ ---- -## @md # Chronicle -## @md -## @md | field | description | default | -## @md |-|-|-| - -global: - image: - tag: - -## @md | `affinity`| custom affinity rules for the chronicle pod | {} | -affinity: {} - -auth: - ## @md | `auth.required` | if true require authentication, rejecting 'anonymous' requests | false | - required: false - id: - ## @md | `auth.id.claims` | Chronicle provides default values ["iss", "sub"] | nil | - claims: - jwks: - url: - userinfo: - url: - -## @md | `backtraceLevel` | backtrace level for Chronicle | nil | -backtraceLevel: full - -devIdProvider: - enabled: true - ## @md | `devIdProvider.image` | the image to use for the id-provider container | blockchaintp/id-provider | - image: - ## @md | `devIdProvider.image.pullPolicy` | the image pull policy | IfNotPresent | - pullPolicy: IfNotPresent - ## @md | `devIdProvider.image.repository` | the image repository | blockchaintp/id-provider | - repository: blockchaintp/id-provider-amd64 - ## @md | `devIdProvider.image.tag` | the image tag | latest | - tag: BTP2.1.0-0.7.3 - -## @md | `extraVolumes` | a list of additional volumes to add to chronicle | [] | -extraVolumes: [] -## @md | `extraVolumeMounts` | a list of additional volume mounts to add to chronicle | [] | -extraVolumeMounts: [] - -image: - ## @md | `image.repository` | the repository of the image | blockchaintp/chronicle | - repository: blockchaintp/chronicle-amd64 - ## @md | `image.tag`| the tag of the image to use | latest | - tag: BTP2.1.0-0.7.3 - ## @md | `image.pullPolicy` | the image pull policy to use | IfNotPresent | - pullPolicy: IfNotPresent - -imagePullSecrets: - ## @md | `imagePullSecrets.enabled`| if true use the list of named imagePullSecrets | false | - enabled: false - ## @md | `imagePullSecrets.value`| a list if named secret references of the form `- name: secretName`| [] | - value: [] - -ingress: - ## @md | `ingress.apiVersion` | if necessary the apiVersion of the ingress may be overridden | "" | - apiVersion: "" - ## @md | `ingress.enabled` | true to enable the ingress to the main service rest-api | false | - enabled: false - ## @md | `ingress.certManager` | true to enable the acme certmanager for this ingress | false | - certManager: false - ## @md | `ingress.hostname` | primary hostname for the ingress | false | - hostname: - ## @md | `ingress.path` | path for the ingress's primary hostname | / | - path: / - ## @md | `ingress.pathType` | pathType for the ingress's primary hostname | nil | - pathType: - ## @md | `ingress.annotations` | annotations for the ingress | {} | - annotations: {} - ## @md | `ingress.tls` | true to enable tls on the ingress with a secrete at hostname-tls | false | - tls: false - ## @md | `ingress.extraHosts` | list of extra hosts to add to the ingress | [] | - extraHosts: [] - ## @md | `ingress.extraPaths` | list of extra paths to add to the primary host of the ingress | [] | - extraPaths: [] - ## @md | `ingress.extraTls` | list of extra tls entries | [] | - extraTls: [] - ## @md | `ingress.hosts`| list of ingress host and path declarations for the chronicle ingress| [] | - hosts: [] - # - host: chart-example.local - # paths: - # - / - -## @md | `logLevel` | log level for Chronicle | info | -logLevel: info - -opa: - ## @md | `opa.enabled` | if true set up a full OPA enabled setup | true | - enabled: false - opaInit: - ## @md | `opa.init.image` | the image to use for the chronicle-init container | blockchaintp/chronicle-opa-init | - image: - ## @md | `image.pullPolicy` | the image pull policy to use | IfNotPresent | - pullPolicy: IfNotPresent - ## @md | `image.repository` | the repository of the image | blockchaintp/chronicle | - repository: blockchaintp/opactl-amd64 - ## @md | `image.tag`| the tag of the image to use | latest | - tag: BTP2.1.0-0.7.3 - policy: - entrypoint: allow_transactions.allowed_users - id: allow_transactions - url: file:///app/policies/bundle.tar.gz - tp: - image: - ## @md | `image.repository` | the repository of the image | blockchaintp/chronicle | - repository: blockchaintp/opa-tp-amd64 - ## @md | `image.tag`| the tag of the image to use | latest | - tag: BTP2.1.0-0.7.3 - ## @md | `image.pullPolicy` | the image pull policy to use | IfNotPresent | - pullPolicy: IfNotPresent - ## @md | `opa.tp.resources` | resources | map | nil | - resources: - ## @md | `opa.tp.extraVolumes` | extra volumes declarations for the opa-tp deployment | list | nil - extraVolumes: - ## @md | `opa.tp.extraVolumeMounts` | extra volume mounts for opa-tp deployment | list | nil - extraVolumeMounts: - -## @md | `port` | the port on which the chronicle service listens | 9982 | -port: 9982 - -## @md | `replicas` | number of Chronicle replicas to run | 1 | -replicas: 1 - -serviceAccount: - ## @md | `serviceAccount.create` | true to create a service account | false | - create: true - ## @md | `serviceAccount.name` | name of the service account | nil (defaults to based on release name) | - name: - -test: - ## @md | `test.api` | test the chronicle GraphQL server API | - api: - ## @md | `api-test-container.image` | the image to use for the api-test container | blockchaintp/chronicle-api-test | - image: - ## @md | `test.api.image.pullPolicy` | the image pull policy | IfNotPresent | - pullPolicy: IfNotPresent - ## @md | `test.api.image.repository` | the image repository | blockchaintp/chronicle-helm-api-test | - repository: blockchaintp/chronicle-helm-api-test-amd64 - ## @md | `test.api.image.tag` | the image tag | latest | - tag: BTP2.1.0-0.7.3 - ## @md | `test.enabled` | true to enable test Jobs and Services | true | - enabled: true - -postgres: - # if enabled we allocate a postgres database here - ## @md | `postgres.enabled` | if true create an internal postgres instance | boolean | true | - enabled: true - ## @md | `postgres.env` | postgres environment variables | map | N/A | - env: - image: - registry: - ## @md | `postgres.image.repository` | postgres image repository | string | "postgres" | - repository: postgres - ## @md | `postgres.image.tag` | postgres image tag | string | "11" | - tag: "11" - ## @md | `postgres.user` | user for the postgres database | string | "postgres" | - user: postgres - ## @md | `postgres.host` | host for the postgres database | string | "localhost" | - host: localhost - ## @md | `postgres.database` | database for the postgres database | string | "postgres" | - database: postgres - ## @md | `postgres.port` | port for the postgres database | int | 5432 | - port: 5432 - ## @md | `postgres.password` | password for the postgres database | string | "postgres" | - password: postgres - ## @md | `postgres.existingPasswordSecret` | name of a secret containing the postgres password | string | nil | - existingPasswordSecret: - ## @md | `postgres.existingPasswordSecret` | name of the key in a secret containing the postgres password | string | nil | - existingPasswordSecretKey: - ## @md | `postgres.tls` | postgres TLS configuration | string | nil | - tls: - ## @md | `postgres.persistence` | postgres persistence settings | map | N/A | - persistence: - ## @md | `postgres.persistence.enabled` | if true allocate a PVC for the postgres instance | boolean | false | - enabled: false - ## @md | `postgres.persistence.annotations` | any custom annotations to the postgres PVC's | map | {} | - annotations: {} - ## @md | `postgres.persistence.accessModes` | postgres PVC access modes | list | [ "ReadWriteOnce" ] | - accessModes: - - "ReadWriteOnce" - ## if set to "-" (empty string) then storageClassName: "", which disables dynamic provisioning - ## if undefined or set to null, no storageClassName is set and the clusters default StorageClass will be used - ## if a storageClass name is set then storageClassName: "setValue" - ## @md | `postgres.persistence.storageClass` | postgres PVC storageClass | string | nil | - storageClass: - ## @md | `postgres.persistence.size` | postgres PVC volume size | string | "40Gi" | - size: "40Gi" - ## @md | `postgres.resources` | resources | map | nil | - resources: - -## @md | `resources` | resources | map | nil | -resources: - -sawset: - image: - ## @md | `sawset.image.pullPolicy` | the image pull policy | IfNotPresent | - pullPolicy: IfNotPresent - ## @md | `sawset.image.repository` | the image repository | blockchaintp/sawtooth-validator | - repository: blockchaintp/sawtooth-validator - ## @md | `sawset.image.tag` | the image tag | latest | - tag: BTP2.1.0 - -tp: - ## @md | `tp.args` | a string of arguments to pass to the tp container| nil | - args: - image: - ## @md | `tp.image.pullPolicy` | the image pull policy | IfNotPresent | - pullPolicy: IfNotPresent - ## @md | `tp.image.repository` | the image repository | blockchaintp/chronicle-tp | - repository: blockchaintp/chronicle-tp-amd64 - ## @md | `tp.image.tag` | the image tag | latest | - tag: BTP2.1.0-0.7.3 - ## @md | `tp.extraVolumes` | extra volumes declarations for the chronicle-tp deployment | list | nil - extraVolumes: - ## @md | `tp.extraVolumeMounts` | extra volume mounts for chronicle-tp deployment | list | nil - extraVolumeMounts: - ## @md | `tp.resources` | resources | map | nil | - resources: - ## @md | `tp.maxUnavailable` | maximum unavailable nodes during a rolling upgrade | - maxUnavailable: 1 - ## @md | `tp.minReadySeconds` | minimum time before node becomes available | - minReadySeconds: 0 - logLevel: info - -volumes: {} - -## @md | `sawtooth` | sawtooth options may be configured | see [Sawtooth](../sawtooth/README.md) | -sawtooth: - sawtooth: - consensus: 400 - statefulset: - enabled: true diff --git a/index.yaml b/index.yaml index f1bb5fd38..bae530306 100644 --- a/index.yaml +++ b/index.yaml @@ -8914,211 +8914,7 @@ entries: type: application urls: - assets/codefresh/cf-runtime-0.1.401.tgz - version: 0.1.401 - chronicle: - - annotations: - catalog.cattle.io/certified: partner - catalog.cattle.io/display-name: Chronicle - catalog.cattle.io/release-name: chronicle - apiVersion: v2 - appVersion: 0.7.3 - created: "2023-06-16T16:58:23.101651834Z" - dependencies: - - name: standard-defs - repository: https://btp-charts-stable.s3.amazonaws.com/charts/ - version: ~0.1.0 - - name: sawtooth - repository: https://btp-charts-unstable.s3.amazonaws.com/charts/ - version: ~0.2.0 - description: 'Chronicle is an open-source, blockchain-backed, domain-agnostic - provenance product. Chronicle makes it easy for users to record and query immutable - provenance information on a distributed ledger - about any asset, in any domain, - and across multiple parties. ' - digest: 4d525fad8105e3c03b82f3d81ecf7e81529cc8c3a40630cc636a1fcf216c7316 - home: https://docs.btp.works/chronicle - icon: https://chronicle-resources.s3.amazonaws.com/icons/chronicle-transparent-bg-dark.png - keywords: - - provenance - - blockchain - name: chronicle - type: application - urls: - - assets/btp/chronicle-0.1.18.tgz - version: 0.1.18 - - annotations: - catalog.cattle.io/certified: partner - catalog.cattle.io/display-name: Chronicle - catalog.cattle.io/release-name: chronicle - apiVersion: v2 - appVersion: 0.7.3 - created: "2023-06-14T14:15:40.570407012Z" - dependencies: - - name: standard-defs - repository: https://btp-charts-stable.s3.amazonaws.com/charts/ - version: ~0.1.0 - - name: sawtooth - repository: https://btp-charts-unstable.s3.amazonaws.com/charts/ - version: ~0.2.0 - description: 'Chronicle is an open-source, blockchain-backed, domain-agnostic - provenance product. Chronicle makes it easy for users to record and query immutable - provenance information on a distributed ledger - about any asset, in any domain, - and across multiple parties. ' - digest: feb29bdf2b9e6e6da16b96085ce2015438dc02e00cc0758b38efa546eb2aec78 - home: https://docs.btp.works/chronicle - icon: https://chronicle-resources.s3.amazonaws.com/icons/chronicle-transparent-bg-dark.png - keywords: - - provenance - - blockchain - name: chronicle - type: application - urls: - - assets/btp/chronicle-0.1.16.tgz - version: 0.1.16 - - annotations: - catalog.cattle.io/certified: partner - catalog.cattle.io/display-name: Chronicle - catalog.cattle.io/release-name: chronicle - apiVersion: v2 - appVersion: 0.7.3 - created: "2023-06-08T14:15:55.693946891Z" - dependencies: - - name: standard-defs - repository: https://btp-charts-stable.s3.amazonaws.com/charts/ - version: ~0.1.0 - - name: sawtooth - repository: https://btp-charts-unstable.s3.amazonaws.com/charts/ - version: ~0.2.0 - description: 'Chronicle is an open-source, blockchain-backed, domain-agnostic - provenance product. Chronicle makes it easy for users to record and query immutable - provenance information on a distributed ledger - about any asset, in any domain, - and across multiple parties. ' - digest: ca6f4649ac24e74ccfbd1c7f04b935be7cfa6bc81db484e7705966125861a6ed - home: https://docs.btp.works/chronicle - icon: https://chronicle-resources.s3.amazonaws.com/icons/chronicle-transparent-bg-dark.png - keywords: - - provenance - - blockchain - name: chronicle - type: application - urls: - - assets/btp/chronicle-0.1.15.tgz - version: 0.1.15 - - annotations: - catalog.cattle.io/certified: partner - catalog.cattle.io/display-name: Chronicle - catalog.cattle.io/release-name: chronicle - apiVersion: v2 - appVersion: 0.6.2 - created: "2023-05-18T13:48:09.796720488Z" - dependencies: - - name: standard-defs - repository: https://btp-charts-stable.s3.amazonaws.com/charts/ - version: ~0.1.0 - - name: sawtooth - repository: https://btp-charts-stable.s3.amazonaws.com/charts/ - version: ~0.2.0 - description: 'Chronicle is an open-source, blockchain-backed, domain-agnostic - provenance product. Chronicle makes it easy for users to record and query immutable - provenance information on a distributed ledger - about any asset, in any domain, - and across multiple parties. ' - digest: 6b63d985b2088a255a60bee3ffe66090357ec9fd3b39e2e7bc96b600d7a85c92 - home: https://docs.btp.works/chronicle - icon: https://chronicle-resources.s3.amazonaws.com/icons/chronicle-transparent-bg-dark.png - keywords: - - provenance - - blockchain - name: chronicle - type: application - urls: - - assets/btp/chronicle-0.1.14.tgz - version: 0.1.14 - - annotations: - catalog.cattle.io/certified: partner - catalog.cattle.io/display-name: Chronicle - catalog.cattle.io/release-name: chronicle - apiVersion: v2 - appVersion: 0.6.2 - created: "2023-05-12T13:17:31.261840084Z" - dependencies: - - name: standard-defs - repository: https://btp-charts-stable.s3.amazonaws.com/charts/ - version: ~0.1.0 - - name: sawtooth - repository: https://btp-charts-stable.s3.amazonaws.com/charts/ - version: ~0.2.0 - description: 'Chronicle is an open-source, blockchain-backed, domain-agnostic - provenance product. Chronicle makes it easy for users to record and query immutable - provenance information on a distributed ledger - about any asset, in any domain, - and across multiple parties. ' - digest: 2d0dd93b07a5c31cd6c90b71f71588173fab9098eead78900345ee3af8fddc37 - home: https://docs.btp.works/chronicle - icon: https://chronicle-resources.s3.amazonaws.com/icons/chronicle-transparent-bg-dark.png - keywords: - - provenance - - blockchain - name: chronicle - type: application - urls: - - assets/btp/chronicle-0.1.13.tgz - version: 0.1.13 - - annotations: - catalog.cattle.io/certified: partner - catalog.cattle.io/display-name: Chronicle - catalog.cattle.io/release-name: chronicle - apiVersion: v2 - appVersion: 0.2.1 - created: "2023-04-28T17:55:40.9591923Z" - dependencies: - - name: standard-defs - repository: https://btp-charts-stable.s3.amazonaws.com/charts/ - version: ~0.1.0 - - name: sawtooth - repository: https://btp-charts-stable.s3.amazonaws.com/charts/ - version: ~0.2.0 - description: 'Chronicle is an open-source, blockchain-backed, domain-agnostic - provenance product. Chronicle makes it easy for users to record and query immutable - provenance information on a distributed ledger - about any asset, in any domain, - and across multiple parties. ' - digest: c9e800f3bc7b652e306e4db1d9b35d049ae113c2cb865bc9b5734607310edbae - home: https://docs.btp.works/chronicle - icon: https://chronicle-resources.s3.amazonaws.com/icons/chronicle-transparent-bg-dark.png - keywords: - - provenance - - blockchain - name: chronicle - type: application - urls: - - assets/btp/chronicle-0.1.7.tgz - version: 0.1.7 - - annotations: - catalog.cattle.io/certified: partner - catalog.cattle.io/display-name: Chronicle - catalog.cattle.io/release-name: chronicle - apiVersion: v2 - appVersion: 0.2.1 - created: "2023-03-15T10:54:30.00582Z" - dependencies: - - name: standard-defs - repository: file://./charts/standard-defs - version: ~0.1.0 - - name: sawtooth - repository: file://./charts/sawtooth - version: ~0.2.0 - description: 'Chronicle is an open-source, blockchain-backed, domain-agnostic - provenance product. Chronicle makes it easy for users to record and query immutable - provenance information on a distributed ledger - about any asset, in any domain, - and across multiple parties. ' - digest: 0e796be511e7f9e21ba1b4a26fdaa56879331ee1b154c796c910aa6db0dc07c1 - home: https://docs.btp.works/chronicle - icon: https://chronicle-resources.s3.amazonaws.com/icons/chronicle-transparent-bg-dark.png - keywords: - - provenance - - blockchain - name: chronicle - type: application - urls: - - assets/btp/chronicle-0.1.6.tgz - version: 0.1.6 + version: 0.1.401 citrix-adc-istio-ingress-gateway: - annotations: catalog.cattle.io/certified: partner diff --git a/packages/btp/chronicle/upstream.yaml b/packages/btp/chronicle/upstream.yaml deleted file mode 100644 index 14164676e..000000000 --- a/packages/btp/chronicle/upstream.yaml +++ /dev/null @@ -1,4 +0,0 @@ -HelmRepo: https://btp-charts-stable.s3.amazonaws.com/charts -HelmChart: chronicle -Vendor: BTP -DisplayName: Chronicle \ No newline at end of file