diff --git a/.gitignore b/.gitignore index 00aa7e1..6697b62 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ wheels/ # Node-generated files node_modules +package-lock.json # Virtual environments .venv diff --git a/README.md b/README.md index d268dc5..0b565b1 100644 --- a/README.md +++ b/README.md @@ -29,9 +29,9 @@ ### ci - [x] Добаваить тестов на предмет хелм рендеринда конфигов | добавить opa политики - [x] Добавить [семантическое версионирование](https://semver.org/lang/ru/) + git-теги + хелм-релиз-логика - - [ ] Добавить argocd-image-updater + - [x] Добавить argocd-image-updater - [ ] Тестить сборку релиза перед мерджем, в самом pr - - [ ] сonventional сommits | всё в .releaserc.json | встроить флоу для гита + - [x] сonventional сommits | всё в .releaserc.json | встроить флоу для гита ### mesh - [ ] Добавить сервис по анализу [инцидентов](https://github.com/justgithubaccount/app-release/issues/5) - [ ] Продумать концепцию нейминга как под saas сервис diff --git a/charts/consul/.helmignore b/charts/consul/.helmignore deleted file mode 100644 index 3fa2f24..0000000 --- a/charts/consul/.helmignore +++ /dev/null @@ -1,5 +0,0 @@ -.git/ -.terraform/ -bin/ -test/ -crds/kustomization.yaml diff --git a/charts/consul/Chart.yaml b/charts/consul/Chart.yaml deleted file mode 100644 index 74b0bd0..0000000 --- a/charts/consul/Chart.yaml +++ /dev/null @@ -1,33 +0,0 @@ -annotations: - artifacthub.io/images: | - - name: consul - image: hashicorp/consul:1.21.3 - - name: consul-k8s-control-plane - image: hashicorp/consul-k8s-control-plane:1.8.0 - - name: consul-dataplane - image: hashicorp/consul-dataplane:1.8.0 - - name: envoy - image: envoyproxy/envoy:v1.25.11 - artifacthub.io/license: MPL-2.0 - artifacthub.io/links: | - - name: Documentation - url: https://www.consul.io/docs/k8s - - name: hashicorp/consul - url: https://github.com/hashicorp/consul - - name: hashicorp/consul-k8s - url: https://github.com/hashicorp/consul-k8s - artifacthub.io/prerelease: "false" - artifacthub.io/signKey: | - fingerprint: C874011F0AB405110D02105534365D9472D7468F - url: https://keybase.io/hashicorp/pgp_keys.asc -apiVersion: v2 -appVersion: 1.21.3 -description: Official HashiCorp Consul Chart -home: https://www.consul.io -icon: https://raw.githubusercontent.com/hashicorp/consul-k8s/main/assets/icon.png -kubeVersion: '>=1.22.0-0' -name: consul -sources: -- https://github.com/hashicorp/consul -- https://github.com/hashicorp/consul-k8s -version: 1.8.0 diff --git a/charts/consul/README.md b/charts/consul/README.md deleted file mode 100644 index d917af6..0000000 --- a/charts/consul/README.md +++ /dev/null @@ -1,109 +0,0 @@ -# Consul on Kubernetes Helm Chart - ---- - - **We're looking for feedback on how folks are using Consul on Kubernetes. Please fill out our brief [survey](https://hashicorp.sjc1.qualtrics.com/jfe/form/SV_4MANbw1BUku7YhL)!** - -## Overview - -This is the Official HashiCorp Helm chart for installing and configuring Consul on Kubernetes. This chart supports multiple use cases of Consul on Kubernetes, depending on the values provided. - -For full documentation on this Helm chart along with all the ways you can use Consul with Kubernetes, please see the Consul and Kubernetes documentation. - -> :warning: **Please note**: We take Consul's security and our users' trust very seriously. If -you believe you have found a security issue in Consul K8s, _please responsibly disclose_ -by contacting us at [security@hashicorp.com](mailto:security@hashicorp.com). - -## Features - - * [**Consul Service Mesh**](https://www.consul.io/docs/k8s/connect): - Run Consul Service Mesh on Kubernetes. This feature - injects Envoy sidecars and registers your Pods with Consul. - - * [**Catalog Sync**](https://www.consul.io/docs/k8s/service-sync): - Sync Consul services into first-class Kubernetes services and vice versa. - This enables Kubernetes to easily access external services and for - non-Kubernetes nodes to easily discover and access Kubernetes services. - -## Installation - -`consul-k8s` is distributed in multiple forms: - - * The recommended installation method is the official - [Consul Helm chart](https://github.com/hashicorp/consul-k8s/tree/main/charts/consul). This will - automatically configure the Consul and Kubernetes integration to run within - an existing Kubernetes cluster. - - * A [Docker image `hashicorp/consul-k8s-control-plane`](https://hub.docker.com/r/hashicorp/consul-k8s-control-plane) is available. This can be used to manually run `consul-k8s-control-plane` within a scheduled environment. - - * Consul K8s CLI, distributed as `consul-k8s`, can be used to install and uninstall Consul Kubernetes. See the [Consul K8s CLI Reference](https://www.consul.io/docs/k8s/k8s-cli) for more details on usage. - -### Prerequisites - -The following pre-requisites must be met before installing Consul on Kubernetes. - - * **Kubernetes 1.27.x - 1.30.x** - This represents the earliest versions of Kubernetes tested. - It is possible that this chart works with earlier versions, but it is - untested. - * Helm install - * **Helm 3.6+** for Helm based installs. - * Consul K8s CLI based install - * `kubectl` configured to authenticate to a Kubernetes cluster with a valid `kubeconfig` file. - * `brew`, `yum`, or `apt` package manager on your local machine - -### CLI - -The Consul K8s CLI is the easiest way to get up and running with Consul on Kubernetes. See [Install Consul on K8s CLI](https://developer.hashicorp.com/consul/docs/k8s/installation/install-cli#install-the-cli) for more details on installation, and refer to -[Consul on Kubernetes CLI Reference](https://developer.hashicorp.com/consul/docs/k8s/k8s-cli) for more details on subcommands and a list of all available flags -for each subcommand. - - - 1. Install the HashiCorp tap, which is a repository of all Homebrew packages for HashiCorp: - - ``` bash - brew tap hashicorp/tap - ``` - -2. Install the Consul K8s CLI with hashicorp/tap/consul formula. - - ``` bash - brew install hashicorp/tap/consul-k8s - ``` - -3. Issue the install subcommand to install Consul on Kubernetes: - - ``` bash - consul-k8s install - ``` - -### Helm - -The Helm chart is ideal for those who prefer to use Helm for automation for either the installation or upgrade of Consul on Kubernetes. The chart supports multiple use cases of Consul on Kubernetes, depending on the values provided. Detailed installation instructions for Consul on Kubernetes are found [here](https://www.consul.io/docs/k8s/installation/overview). - -1. Add the HashiCorp Helm repository: - - ``` bash - helm repo add hashicorp https://helm.releases.hashicorp.com - ``` - -2. Ensure you have access to the Consul Helm chart and you see the latest chart version listed. If you have previously added the - HashiCorp Helm repository, run `helm repo update`. - - ``` bash - helm search repo hashicorp/consul - ``` - -3. Now you're ready to install Consul! To install Consul with the default configuration using Helm 3.2 run the following command below. - This will create a `consul` Kubernetes namespace if not already present, and install Consul on the dedicated namespace. - - ``` bash - helm install consul hashicorp/consul --set global.name=consul --create-namespace -n consul - -Please see the many options supported in the `values.yaml` -file. These are also fully documented directly on the -[Consul website](https://www.consul.io/docs/platform/k8s/helm.html). - -## Tutorials - -You can find examples and complete tutorials on how to deploy Consul on -Kubernetes using Helm on the [HashiCorp Learn website](https://learn.hashicorp.com/collections/consul/kubernetes). diff --git a/charts/consul/addons/gen.sh b/charts/consul/addons/gen.sh deleted file mode 100644 index 1d03390..0000000 --- a/charts/consul/addons/gen.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env bash -# Copyright (c) HashiCorp, Inc. -# SPDX-License-Identifier: MPL-2.0 - - -WD=$(dirname "$0") -WD=$(cd "$WD"; pwd) - -set -eux - -TEMPLATES="${WD}/../templates" -DASHBOARDS="${WD}/dashboards" -TMP=$(mktemp -d) - -# create Prometheus template -helm template prometheus prometheus \ - --repo https://prometheus-community.github.io/helm-charts \ - --namespace "replace-me-namespace" \ - --version 13.2.1 \ - -f "${WD}/values/prometheus.yaml" \ - > "${TEMPLATES}/prometheus.yaml" - -# Find and replace `replace-me-namespace` with `{{ .Release.Namespace }}` in Prometheus template. -sed -i'.orig' 's/replace-me-namespace/{{ .Release.Namespace }}/g' "${TEMPLATES}/prometheus.yaml" -# Add a comment to the top of the template file mentioning that the file is auto-generated. -sed -i'.orig' '1i\ -# This file is auto-generated, see addons/gen.sh -' "${TEMPLATES}/prometheus.yaml" -# Add `{{- if .Values.prometheus.enabled }} to the top of the Prometheus template to ensure it is only templated when enabled. -sed -i'.orig' '1i\ -{{- if .Values.prometheus.enabled }} -' "${TEMPLATES}/prometheus.yaml" -# Add `{{- end }} to the bottom of the Prometheus template to ensure it is only templated when enabled (closes the `if` statement). -sed -i'.orig' -e '$a\ -{{- end }}' "${TEMPLATES}/prometheus.yaml" -# Remove the `prometheus.yaml.orig` file that is created as a side-effect of the `sed` command on OS X. -rm "${TEMPLATES}/prometheus.yaml.orig" \ No newline at end of file diff --git a/charts/consul/addons/values/prometheus.yaml b/charts/consul/addons/values/prometheus.yaml deleted file mode 100644 index 1f90636..0000000 --- a/charts/consul/addons/values/prometheus.yaml +++ /dev/null @@ -1,21 +0,0 @@ -# Copyright (c) HashiCorp, Inc. -# SPDX-License-Identifier: MPL-2.0 - -# Disable non-essential components -alertmanager: - enabled: false -pushgateway: - enabled: false -kubeStateMetrics: - enabled: false -nodeExporter: - enabled: false -server: - podAnnotations: - "consul.hashicorp.com/connect-inject": "false" - persistentVolume: - enabled: false - readinessProbeInitialDelay: 0 - # Speed up scraping a bit from the default - global: - scrape_interval: 15s diff --git a/charts/consul/assets/icon.png b/charts/consul/assets/icon.png deleted file mode 100644 index 0798b24..0000000 Binary files a/charts/consul/assets/icon.png and /dev/null differ diff --git a/charts/consul/templates/NOTES.txt b/charts/consul/templates/NOTES.txt deleted file mode 100644 index 1f8f744..0000000 --- a/charts/consul/templates/NOTES.txt +++ /dev/null @@ -1,21 +0,0 @@ - -Thank you for installing HashiCorp Consul! - -Your release is named {{ .Release.Name }}. - -To learn more about the release, run: - - $ helm status {{ .Release.Name }} {{- if .Release.Namespace }} --namespace {{ .Release.Namespace }}{{ end }} - $ helm get all {{ .Release.Name }} {{- if .Release.Namespace }} --namespace {{ .Release.Namespace }}{{ end }} - -Consul on Kubernetes Documentation: -https://www.consul.io/docs/platform/k8s - -Consul on Kubernetes CLI Reference: -https://www.consul.io/docs/k8s/k8s-cli - -{{- if (and .Values.global.acls.manageSystemACLs (gt (len .Values.server.extraConfig) 3)) }} -Warning: Defining server extraConfig potentially disrupts the automatic ACL - bootstrapping required settings. This may cause future issues if - there are conflicts. -{{- end }} diff --git a/charts/consul/templates/_helpers.tpl b/charts/consul/templates/_helpers.tpl deleted file mode 100644 index ded6485..0000000 --- a/charts/consul/templates/_helpers.tpl +++ /dev/null @@ -1,659 +0,0 @@ -{{/* -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). Supports the legacy fullnameOverride setting -as well as the global.name setting. -*/}} -{{- define "consul.fullname" -}} -{{- if .Values.fullnameOverride -}} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else if .Values.global.name -}} -{{- .Values.global.name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} - -{{- define "consul.restrictedSecurityContext" -}} -{{- if not .Values.global.enablePodSecurityPolicies -}} -securityContext: - allowPrivilegeEscalation: false - readOnlyRootFilesystem: true - capabilities: - drop: - - ALL - add: - - NET_BIND_SERVICE - runAsNonRoot: true - seccompProfile: - type: RuntimeDefault -{{- if not .Values.global.openshift.enabled -}} -{{/* -We must set runAsUser or else the root user will be used in some cases and -containers will fail to start due to runAsNonRoot above (e.g. -tls-init-cleanup). On OpenShift, runAsUser is automatically. We pick user 100 -because it is a non-root user id that exists in the consul, consul-dataplane, -and consul-k8s-control-plane images. -*/}} - runAsUser: 100 -{{- end -}} -{{- end -}} -{{- end -}} - -{{- define "consul.vaultSecretTemplate" -}} - | - {{ "{{" }}- with secret "{{ .secretName }}" -{{ "}}" }} - {{ "{{" }}- {{ printf ".Data.data.%s" .secretKey }} -{{ "}}" }} - {{ "{{" }}- end -{{ "}}" }} -{{- end -}} - -{{- define "consul.vaultCATemplate" -}} - | - {{ "{{" }}- with secret "{{ .secretName }}" -{{ "}}" }} - {{ "{{" }}- .Data.certificate -{{ "}}" }} - {{ "{{" }}- end -{{ "}}" }} -{{- end -}} - -{{- define "consul.serverTLSCATemplate" -}} -{{ include "consul.vaultCATemplate" .Values.global.tls.caCert }} -{{- end -}} - -{{- define "consul.serverTLSCertTemplate" -}} - | - {{ "{{" }}- with secret "{{ .Values.server.serverCert.secretName }}" "{{ printf "common_name=server.%s.%s" .Values.global.datacenter .Values.global.domain }}" - "alt_names={{ include "consul.serverTLSAltNames" . }}" "ip_sans=127.0.0.1{{ include "consul.serverAdditionalIPSANs" . }}" -{{ "}}" }} - {{ "{{" }}- .Data.certificate -{{ "}}" }} - {{ "{{" }}- if .Data.ca_chain -{{ "}}" }} - {{ "{{" }}- $lastintermediatecertindex := len .Data.ca_chain | subtract 1 -{{ "}}" }} - {{ "{{" }} range $index, $cacert := .Data.ca_chain {{ "}}" }} - {{ "{{" }} if (lt $index $lastintermediatecertindex) {{ "}}" }} - {{ "{{" }} $cacert {{ "}}" }} - {{ "{{" }} end {{ "}}" }} - {{ "{{" }} end {{ "}}" }} - {{ "{{" }}- end -{{ "}}" }} - {{ "{{" }}- end -{{ "}}" }} -{{- end -}} - -{{- define "consul.serverTLSKeyTemplate" -}} - | - {{ "{{" }}- with secret "{{ .Values.server.serverCert.secretName }}" "{{ printf "common_name=server.%s.%s" .Values.global.datacenter .Values.global.domain }}" - "alt_names={{ include "consul.serverTLSAltNames" . }}" "ip_sans=127.0.0.1{{ include "consul.serverAdditionalIPSANs" . }}" -{{ "}}" }} - {{ "{{" }}- .Data.private_key -{{ "}}" }} - {{ "{{" }}- end -{{ "}}" }} -{{- end -}} - -{{- define "consul.connectInjectWebhookTLSCertTemplate" -}} - | - {{ "{{" }}- with secret "{{ .Values.global.secretsBackend.vault.connectInject.tlsCert.secretName }}" "{{- $name := include "consul.fullname" . -}}{{ printf "common_name=%s-connect-injector" $name }}" - "alt_names={{ include "consul.connectInjectorTLSAltNames" . }}" -{{ "}}" }} - {{ "{{" }}- .Data.certificate -{{ "}}" }} - {{ "{{" }}- end -{{ "}}" }} -{{- end -}} - -{{- define "consul.connectInjectWebhookTLSKeyTemplate" -}} - | - {{ "{{" }}- with secret "{{ .Values.global.secretsBackend.vault.connectInject.tlsCert.secretName }}" "{{- $name := include "consul.fullname" . -}}{{ printf "common_name=%s-connect-injector" $name }}" - "alt_names={{ include "consul.connectInjectorTLSAltNames" . }}" -{{ "}}" }} - {{ "{{" }}- .Data.private_key -{{ "}}" }} - {{ "{{" }}- end -{{ "}}" }} -{{- end -}} - -{{- define "consul.serverTLSAltNames" -}} -{{- $name := include "consul.fullname" . -}} -{{- $ns := .Release.Namespace -}} -{{ printf "localhost,%s-server,*.%s-server,*.%s-server.%s,%s-server.%s,*.%s-server.%s.svc,%s-server.%s.svc,*.server.%s.%s" $name $name $name $ns $name $ns $name $ns $name $ns (.Values.global.datacenter ) (.Values.global.domain) }}{{ include "consul.serverAdditionalDNSSANs" . }} -{{- end -}} - -{{- define "consul.serverAdditionalDNSSANs" -}} -{{- if .Values.global.tls -}}{{- if .Values.global.tls.serverAdditionalDNSSANs -}}{{- range $san := .Values.global.tls.serverAdditionalDNSSANs }},{{ $san }} {{- end -}}{{- end -}}{{- end -}} -{{- end -}} - -{{- define "consul.serverAdditionalIPSANs" -}} -{{- if .Values.global.tls -}}{{- if .Values.global.tls.serverAdditionalIPSANs -}}{{- range $san := .Values.global.tls.serverAdditionalIPSANs }},{{ $san }} {{- end -}}{{- end -}}{{- end -}} -{{- end -}} - -{{- define "consul.connectInjectorTLSAltNames" -}} -{{- $name := include "consul.fullname" . -}} -{{- $ns := .Release.Namespace -}} -{{ printf "%s-connect-injector,%s-connect-injector.%s,%s-connect-injector.%s.svc,%s-connect-injector.%s.svc.cluster.local" $name $name $ns $name $ns $name $ns}} -{{- end -}} - -{{- define "consul.vaultReplicationTokenTemplate" -}} -| - {{ "{{" }}- with secret "{{ .Values.global.acls.replicationToken.secretName }}" -{{ "}}" }} - {{ "{{" }}- {{ printf ".Data.data.%s" .Values.global.acls.replicationToken.secretKey }} -{{ "}}" }} - {{ "{{" }}- end -{{ "}}" }} -{{- end -}} - -{{- define "consul.vaultReplicationTokenConfigTemplate" -}} -| - {{ "{{" }}- with secret "{{ .Values.global.acls.replicationToken.secretName }}" -{{ "}}" }} - acl { tokens { agent = "{{ "{{" }}- {{ printf ".Data.data.%s" .Values.global.acls.replicationToken.secretKey }} -{{ "}}" }}", replication = "{{ "{{" }}- {{ printf ".Data.data.%s" .Values.global.acls.replicationToken.secretKey }} -{{ "}}" }}" }} - {{ "{{" }}- end -{{ "}}" }} -{{- end -}} - -{{- define "consul.vaultBootstrapTokenConfigTemplate" -}} -| - {{ "{{" }}- with secret "{{ .Values.global.acls.bootstrapToken.secretName }}" -{{ "}}" }} - acl { tokens { initial_management = "{{ "{{" }}- {{ printf ".Data.data.%s" .Values.global.acls.bootstrapToken.secretKey }} -{{ "}}" }}" }} - {{ "{{" }}- end -{{ "}}" }} -{{- end -}} - -{{/* -Sets up the extra-from-values config file passed to consul and then uses sed to do any necessary -substitution for HOST_IP/POD_IP/HOSTNAME. Useful for dogstats telemetry. The output file -is passed to consul as a -config-file param on command line. -*/}} -{{- define "consul.extraconfig" -}} - cp /consul/tmp/extra-config/extra-from-values.json /consul/extra-config/extra-from-values.json - [ -n "${HOST_IP}" ] && sed -Ei "s|HOST_IP|${HOST_IP?}|g" /consul/extra-config/extra-from-values.json - [ -n "${POD_IP}" ] && sed -Ei "s|POD_IP|${POD_IP?}|g" /consul/extra-config/extra-from-values.json - [ -n "${HOSTNAME}" ] && sed -Ei "s|HOSTNAME|${HOSTNAME?}|g" /consul/extra-config/extra-from-values.json -{{- end -}} - -{{/* -Cleanup server.extraConfig entries to avoid conflicting entries: - - server.enableAgentDebug: - - `enable_debug` should not exist in extraConfig - - metrics.disableAgentHostName: - - if global.metrics.enabled and global.metrics.enableAgentMetrics are enabled, `disable_hostname` should not exist in extraConfig - - metrics.enableHostMetrics: - - if global.metrics.enabled and global.metrics.enableAgentMetrics are enabled, `enable_host_metrics` should not exist in extraConfig - - metrics.prefixFilter - - if global.metrics.enabled and global.metrics.enableAgentMetrics are enabled, `prefix_filter` should not exist in extraConfig - - metrics.datadog.enabled: - - if global.metrics.datadog.enabled and global.metrics.datadog.dogstatsd.enabled, `dogstatsd_tags` and `dogstatsd_addr` should not exist in extraConfig - -Usage: {{ template "consul.validateExtraConfig" . }} -*/}} -{{- define "consul.validateExtraConfig" -}} -{{- if (contains "enable_debug" .Values.server.extraConfig) }}{{ fail "The enable_debug key is present in extra-from-values.json. Use server.enableAgentDebug to set this value." }}{{- end }} -{{- if (contains "disable_hostname" .Values.server.extraConfig) }}{{ fail "The disable_hostname key is present in extra-from-values.json. Use global.metrics.disableAgentHostName to set this value." }}{{- end }} -{{- if (contains "enable_host_metrics" .Values.server.extraConfig) }}{{ fail "The enable_host_metrics key is present in extra-from-values.json. Use global.metrics.enableHostMetrics to set this value." }}{{- end }} -{{- if (contains "prefix_filter" .Values.server.extraConfig) }}{{ fail "The prefix_filter key is present in extra-from-values.json. Use global.metrics.prefix_filter to set this value." }}{{- end }} -{{- if (and .Values.global.metrics.enabled .Values.global.metrics.enableAgentMetrics) }}{{- if (and .Values.global.metrics.datadog.dogstatsd.enabled) }}{{- if (contains "dogstatsd_tags" .Values.server.extraConfig) }}{{ fail "The dogstatsd_tags key is present in extra-from-values.json. Use global.metrics.datadog.dogstatsd.dogstatsdTags to set this value." }}{{- end }}{{- end }}{{- if (and .Values.global.metrics.datadog.dogstatsd.enabled) }}{{- if (contains "dogstatsd_addr" .Values.server.extraConfig) }}{{ fail "The dogstatsd_addr key is present in extra-from-values.json. Use global.metrics.datadog.dogstatsd.dogstatsd_addr to set this value." }}{{- end }}{{- end }}{{- end }} -{{- end -}} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "consul.chart" -}} -{{- printf "%s-helm" .Chart.Name | replace "+" "_" | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Expand the name of the chart. -*/}} -{{- define "consul.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Calculate max number of server pods that are allowed to be voluntarily disrupted. -When there's 1 server, this is set to 0 because this pod should not be disrupted. This is an edge -case and I'm not sure it makes a difference when there's only one server but that's what the previous config was and -I don't want to change it for this edge case. -Otherwise we've changed this to always be 1 as part of the move to set leave_on_terminate -to true. With leave_on_terminate set to true, whenever a server pod is stopped, the number of peers in raft -is reduced. If the number of servers is odd and the count is reduced by 1, the quorum size doesn't change, -but if it's reduced by more than 1, the quorum size can change so that's why this is now always hardcoded to 1. -*/}} -{{- define "consul.server.pdb.maxUnavailable" -}} -{{- if eq (int .Values.server.replicas) 1 -}} -{{ 0 }} -{{- else if .Values.server.disruptionBudget.maxUnavailable -}} -{{ .Values.server.disruptionBudget.maxUnavailable -}} -{{- else -}} -{{ 1 }} -{{- end -}} -{{- end -}} - -{{- define "consul.server.autopilotMinQuorum" -}} -{{- add (div (int .Values.server.replicas) 2) 1 -}} -{{- end -}} - -{{- define "consul.pdb.connectInject.maxUnavailable" -}} -{{- if eq (int .Values.connectInject.replicas) 1 -}} -{{ 0 }} -{{- else if .Values.connectInject.disruptionBudget.maxUnavailable -}} -{{ .Values.connectInject.disruptionBudget.maxUnavailable -}} -{{- else -}} -{{- if eq (int .Values.connectInject.replicas) 3 -}} -{{- 1 -}} -{{- else -}} -{{- sub (div (int .Values.connectInject.replicas) 2) 1 -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Inject extra environment vars in the format key:value, if populated -*/}} -{{- define "consul.extraEnvironmentVars" -}} -{{- if .extraEnvironmentVars -}} -{{- range $key, $value := .extraEnvironmentVars }} -- name: {{ $key }} - value: {{ $value | quote }} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Get Consul client CA to use when auto-encrypt is enabled. -This template is for an init container. -*/}} -{{- define "consul.getAutoEncryptClientCA" -}} -- name: get-auto-encrypt-client-ca - image: {{ .Values.global.imageK8S }} - {{ template "consul.imagePullPolicy" . }} - command: - - "/bin/sh" - - "-ec" - - | - consul-k8s-control-plane get-consul-client-ca \ - -output-file=/consul/tls/client/ca/tls.crt \ - -consul-api-timeout={{ .Values.global.consulAPITimeout }} \ - {{- if .Values.global.cloud.enabled }} - -tls-server-name=server.{{.Values.global.datacenter}}.{{.Values.global.domain}} \ - {{- end}} - {{- if .Values.externalServers.enabled }} - {{- if and .Values.externalServers.enabled (not .Values.externalServers.hosts) }}{{ fail "externalServers.hosts must be set if externalServers.enabled is true" }}{{ end -}} - -server-addr={{ quote (first .Values.externalServers.hosts) }} \ - -server-port={{ .Values.externalServers.httpsPort }} \ - {{- if .Values.externalServers.tlsServerName }} - -tls-server-name={{ .Values.externalServers.tlsServerName }} \ - {{- end }} - {{- else }} - -server-addr={{ template "consul.fullname" . }}-server \ - -server-port=8501 \ - {{- end }} - {{- if or (not .Values.externalServers.enabled) (and .Values.externalServers.enabled (not .Values.externalServers.useSystemRoots)) }} - {{- if .Values.global.secretsBackend.vault.enabled }} - -ca-file=/vault/secrets/serverca.crt - {{- else }} - -ca-file=/consul/tls/ca/tls.crt - {{- end }} - {{- end }} - volumeMounts: - {{- if not (and .Values.externalServers.enabled .Values.externalServers.useSystemRoots) }} - {{- if not .Values.global.secretsBackend.vault.enabled }} - - name: consul-ca-cert - mountPath: /consul/tls/ca - {{- end }} - {{- end }} - - name: consul-auto-encrypt-ca-cert - mountPath: /consul/tls/client/ca - resources: - requests: - memory: "50Mi" - cpu: "50m" - limits: - memory: "50Mi" - cpu: "50m" -{{- end -}} - -{{/* -Fails when a reserved name is passed in. This should be used to test against -Consul namespaces and partition names. -This template accepts an array that contains two elements. The first element -is the name that's being checked and the second is the name of the values.yaml -key that's setting the name. - -Usage: {{ template "consul.reservedNamesFailer" (list .Values.key "key") }} - -*/}} -{{- define "consul.reservedNamesFailer" -}} -{{- $name := index . 0 -}} -{{- $key := index . 1 -}} -{{- if or (eq "system" $name) (eq "universal" $name) (eq "operator" $name) (eq "root" $name) }} -{{- fail (cat "The name" $name "set for key" $key "is reserved by Consul for future use." ) }} -{{- end }} -{{- end -}} - -{{/* -Fails when at least one but not all of the following have been set: -- global.secretsBackend.vault.connectInjectRole -- global.secretsBackend.vault.connectInject.tlsCert.secretName -- global.secretsBackend.vault.connectInject.caCert.secretName - -The above values are needed in full to turn off web cert manager and allow -connect inject to manage its own webhook certs. - -Usage: {{ template "consul.validateVaultWebhookCertConfiguration" . }} - -*/}} -{{- define "consul.validateVaultWebhookCertConfiguration" -}} -{{- if or .Values.global.secretsBackend.vault.connectInjectRole .Values.global.secretsBackend.vault.connectInject.tlsCert.secretName .Values.global.secretsBackend.vault.connectInject.caCert.secretName}} -{{- if or (not .Values.global.secretsBackend.vault.connectInjectRole) (not .Values.global.secretsBackend.vault.connectInject.tlsCert.secretName) (not .Values.global.secretsBackend.vault.connectInject.caCert.secretName) }} -{{fail "When one of the following has been set, all must be set: global.secretsBackend.vault.connectInjectRole, global.secretsBackend.vault.connectInject.tlsCert.secretName, global.secretsBackend.vault.connectInject.caCert.secretName"}} -{{ end }} -{{ end }} -{{- end -}} - -{{/* -Consul server environment variables for consul-k8s commands. -*/}} -{{- define "consul.consulK8sConsulServerEnvVars" -}} -- name: CONSUL_ADDRESSES - {{- if .Values.externalServers.enabled }} - value: {{ .Values.externalServers.hosts | first }} - {{- else }} - value: {{ template "consul.fullname" . }}-server.{{ .Release.Namespace }}.svc - {{- end }} -- name: CONSUL_GRPC_PORT - {{- if .Values.externalServers.enabled }} - value: "{{ .Values.externalServers.grpcPort }}" - {{- else }} - value: "8502" - {{- end }} -- name: CONSUL_HTTP_PORT - {{- if .Values.externalServers.enabled }} - value: "{{ .Values.externalServers.httpsPort }}" - {{- else if .Values.global.tls.enabled }} - value: "8501" - {{- else }} - value: "8500" - {{- end }} -- name: CONSUL_DATACENTER - value: {{ .Values.global.datacenter }} -- name: CONSUL_API_TIMEOUT - value: {{ .Values.global.consulAPITimeout }} -{{- if .Values.global.adminPartitions.enabled }} -- name: CONSUL_PARTITION - value: {{ .Values.global.adminPartitions.name }} -{{- if .Values.global.acls.manageSystemACLs }} -- name: CONSUL_LOGIN_PARTITION - value: {{ .Values.global.adminPartitions.name }} -{{- end }} -{{- end }} -{{- if .Values.global.tls.enabled }} -- name: CONSUL_USE_TLS - value: "true" -{{- if (not (and .Values.externalServers.enabled .Values.externalServers.useSystemRoots)) }} -- name: CONSUL_CACERT_FILE - {{- if .Values.global.secretsBackend.vault.enabled }} - value: "/vault/secrets/serverca.crt" - {{- else }} - value: "/consul/tls/ca/tls.crt" - {{- end }} -{{- end }} -{{- if and .Values.externalServers.enabled .Values.externalServers.tlsServerName }} -- name: CONSUL_TLS_SERVER_NAME - value: {{ .Values.externalServers.tlsServerName }} -{{- else if .Values.global.cloud.enabled }} -- name: CONSUL_TLS_SERVER_NAME - value: server.{{ .Values.global.datacenter}}.{{ .Values.global.domain}} -{{- end }} -{{- end }} -{{- if and .Values.externalServers.enabled .Values.externalServers.skipServerWatch }} -- name: CONSUL_SKIP_SERVER_WATCH - value: "true" -{{- end }} -{{- end -}} - -{{/* -Fails global.cloud.enabled is true and one of the following secrets is nil or empty. -- global.cloud.resourceId.secretName -- global.cloud.clientId.secretName -- global.cloud.clientSecret.secretName - -Usage: {{ template "consul.validateRequiredCloudSecretsExist" . }} - -*/}} -{{- define "consul.validateRequiredCloudSecretsExist" -}} -{{- if (and .Values.global.cloud.enabled (or (not .Values.global.cloud.resourceId.secretName) (not .Values.global.cloud.clientId.secretName) (not .Values.global.cloud.clientSecret.secretName))) }} -{{fail "When global.cloud.enabled is true, global.cloud.resourceId.secretName, global.cloud.clientId.secretName, and global.cloud.clientSecret.secretName must also be set."}} -{{- end }} -{{- end -}} - -{{/* -Fails global.cloud.enabled is true and one of the following secrets has either an empty secretName or secretKey. -- global.cloud.resourceId.secretName / secretKey -- global.cloud.clientId.secretName / secretKey -- global.cloud.clientSecret.secretName / secretKey -- global.cloud.authUrl.secretName / secretKey -- global.cloud.apiHost.secretName / secretKey -- global.cloud.scadaAddress.secretName / secretKey -Usage: {{ template "consul.validateCloudSecretKeys" . }} - -*/}} -{{- define "consul.validateCloudSecretKeys" -}} -{{- if and .Values.global.cloud.enabled }} -{{- if or (and .Values.global.cloud.resourceId.secretName (not .Values.global.cloud.resourceId.secretKey)) (and .Values.global.cloud.resourceId.secretKey (not .Values.global.cloud.resourceId.secretName)) }} -{{fail "When either global.cloud.resourceId.secretName or global.cloud.resourceId.secretKey is defined, both must be set."}} -{{- end }} -{{- if or (and .Values.global.cloud.clientId.secretName (not .Values.global.cloud.clientId.secretKey)) (and .Values.global.cloud.clientId.secretKey (not .Values.global.cloud.clientId.secretName)) }} -{{fail "When either global.cloud.clientId.secretName or global.cloud.clientId.secretKey is defined, both must be set."}} -{{- end }} -{{- if or (and .Values.global.cloud.clientSecret.secretName (not .Values.global.cloud.clientSecret.secretKey)) (and .Values.global.cloud.clientSecret.secretKey (not .Values.global.cloud.clientSecret.secretName)) }} -{{fail "When either global.cloud.clientSecret.secretName or global.cloud.clientSecret.secretKey is defined, both must be set."}} -{{- end }} -{{- if or (and .Values.global.cloud.authUrl.secretName (not .Values.global.cloud.authUrl.secretKey)) (and .Values.global.cloud.authUrl.secretKey (not .Values.global.cloud.authUrl.secretName)) }} -{{fail "When either global.cloud.authUrl.secretName or global.cloud.authUrl.secretKey is defined, both must be set."}} -{{- end }} -{{- if or (and .Values.global.cloud.apiHost.secretName (not .Values.global.cloud.apiHost.secretKey)) (and .Values.global.cloud.apiHost.secretKey (not .Values.global.cloud.apiHost.secretName)) }} -{{fail "When either global.cloud.apiHost.secretName or global.cloud.apiHost.secretKey is defined, both must be set."}} -{{- end }} -{{- if or (and .Values.global.cloud.scadaAddress.secretName (not .Values.global.cloud.scadaAddress.secretKey)) (and .Values.global.cloud.scadaAddress.secretKey (not .Values.global.cloud.scadaAddress.secretName)) }} -{{fail "When either global.cloud.scadaAddress.secretName or global.cloud.scadaAddress.secretKey is defined, both must be set."}} -{{- end }} -{{- end }} -{{- end -}} - - -{{/* -Fails if telemetryCollector.clientId or telemetryCollector.clientSecret exist and one of other secrets is nil or empty. -- telemetryCollector.cloud.clientId.secretName -- telemetryCollector.cloud.clientSecret.secretName -- global.cloud.resourceId.secretName - -Usage: {{ template "consul.validateTelemetryCollectorCloud" . }} - -*/}} -{{- define "consul.validateTelemetryCollectorCloud" -}} -{{- if (and .Values.telemetryCollector.cloud.clientId.secretName (and (not .Values.global.cloud.clientSecret.secretName) (not .Values.telemetryCollector.cloud.clientSecret.secretName))) }} -{{fail "When telemetryCollector.cloud.clientId.secretName is set, telemetryCollector.cloud.clientSecret.secretName must also be set." }} -{{- end }} -{{- if (and .Values.telemetryCollector.cloud.clientSecret.secretName (and (not .Values.global.cloud.clientId.secretName) (not .Values.telemetryCollector.cloud.clientId.secretName))) }} -{{fail "When telemetryCollector.cloud.clientSecret.secretName is set, telemetryCollector.cloud.clientId.secretName must also be set." }} -{{- end }} -{{- end }} - -{{/**/}} - -{{- define "consul.validateTelemetryCollectorCloudSecretKeys" -}} -{{- if or (and .Values.telemetryCollector.cloud.clientId.secretName (not .Values.telemetryCollector.cloud.clientId.secretKey)) (and .Values.telemetryCollector.cloud.clientId.secretKey (not .Values.telemetryCollector.cloud.clientId.secretName)) }} -{{fail "When either telemetryCollector.cloud.clientId.secretName or telemetryCollector.cloud.clientId.secretKey is defined, both must be set."}} -{{- end }} -{{- if or (and .Values.telemetryCollector.cloud.clientSecret.secretName (not .Values.telemetryCollector.cloud.clientSecret.secretKey)) (and .Values.telemetryCollector.cloud.clientSecret.secretKey (not .Values.telemetryCollector.cloud.clientSecret.secretName)) }} -{{fail "When either telemetryCollector.cloud.clientSecret.secretName or telemetryCollector.cloud.clientSecret.secretKey is defined, both must be set."}} -{{- end }} -{{- if or (and .Values.telemetryCollector.cloud.clientSecret.secretName .Values.telemetryCollector.cloud.clientSecret.secretKey .Values.telemetryCollector.cloud.clientId.secretName .Values.telemetryCollector.cloud.clientId.secretKey (not (or .Values.telemetryCollector.cloud.resourceId.secretName .Values.global.cloud.resourceId.secretName))) }} -{{fail "When telemetryCollector has clientId and clientSecret, telemetryCollector.cloud.resourceId.secretName or global.cloud.resourceId.secretName must be set"}} -{{- end }} -{{- if or (and .Values.telemetryCollector.cloud.clientSecret.secretName .Values.telemetryCollector.cloud.clientSecret.secretKey .Values.telemetryCollector.cloud.clientId.secretName .Values.telemetryCollector.cloud.clientId.secretKey (not (or .Values.telemetryCollector.cloud.resourceId.secretKey .Values.global.cloud.resourceId.secretKey))) }} -{{fail "When telemetryCollector has clientId and clientSecret, telemetryCollector.cloud.resourceId.secretKey or global.cloud.resourceId.secretKey must be set"}} -{{- end }} -{{- end -}} - -{{/* -Fails if telemetryCollector.cloud.resourceId is set but differs from global.cloud.resourceId. This should never happen. Either one or both are set, but they should never differ. -If they differ, that implies we're configuring servers for one HCP Consul cluster but pushing envoy metrics for a different HCP Consul cluster. A user could set the same value -in two secrets (it's questionable whether resourceId should be a secret at all) but we won't know at this point, so we just check secret name+key. - -Usage: {{ template "consul.validateTelemetryCollectorResourceId" . }} - -*/}} -{{- define "consul.validateTelemetryCollectorResourceId" -}} -{{- if and (and .Values.telemetryCollector.cloud.resourceId.secretName .Values.global.cloud.resourceId.secretName) (not (eq .Values.telemetryCollector.cloud.resourceId.secretName .Values.global.cloud.resourceId.secretName)) }} -{{fail "When both global.cloud.resourceId.secretName and telemetryCollector.cloud.resourceId.secretName are set, they should be the same."}} -{{- end }} -{{- if and (and .Values.telemetryCollector.cloud.resourceId.secretKey .Values.global.cloud.resourceId.secretKey) (not (eq .Values.telemetryCollector.cloud.resourceId.secretKey .Values.global.cloud.resourceId.secretKey)) }} -{{fail "When both global.cloud.resourceId.secretKey and telemetryCollector.cloud.resourceId.secretKey are set, they should be the same."}} -{{- end }} -{{- end }} - -{{/**/}} - -{{/* -Validation for Consul Metrics configuration: - -Fail if metrics.enabled=true and metrics.disableAgentHostName=true, but metrics.enableAgentMetrics=false - - metrics.enabled = true - - metrics.enableAgentMetrics = false - - metrics.disableAgentHostName = true - -Fail if metrics.enableAgentMetrics=true and metrics.disableAgentHostName=true, but metrics.enabled=false - - metrics.enabled = false - - metrics.enableAgentMetrics = true - - metrics.disableAgentHostName = true - -Fail if metrics.enabled=true and metrics.enableHostMetrics=true, but metrics.enableAgentMetrics=false - - metrics.enabled = true - - metrics.enableAgentMetrics = false - - metrics.enableHostMetrics = true - -Fail if metrics.enableAgentMetrics=true and metrics.enableHostMetrics=true, but metrics.enabled=false - - metrics.enabled = false - - metrics.enableAgentMetrics = true - - metrics.enableHostMetrics = true - -Usage: {{ template "consul.validateMetricsConfig" . }} - -*/}} - -{{- define "consul.validateMetricsConfig" -}} -{{- if and (not .Values.global.metrics.enableAgentMetrics) (and .Values.global.metrics.disableAgentHostName .Values.global.metrics.enabled )}} -{{fail "When enabling metrics (global.metrics.enabled) and disabling hostname emission from metrics (global.metrics.disableAgentHostName), global.metrics.enableAgentMetrics must be set to true"}} -{{- end }} -{{- if and (not .Values.global.metrics) (and .Values.global.metrics.disableAgentHostName .Values.global.metrics.enableAgentMetrics )}} -{{fail "When enabling Consul agent metrics (global.metrics.enableAgentMetrics) and disabling hostname emission from metrics (global.metrics.disableAgentHostName), global metrics enablement (global.metrics.enabled) must be set to true"}} -{{- end }} -{{- if and (not .Values.global.metrics.enableAgentMetrics) (and .Values.global.metrics.disableAgentHostName .Values.global.metrics.enabled )}} -{{fail "When disabling hostname emission from metrics (global.metrics.disableAgentHostName) and enabling global metrics (global.metrics.enabled), Consul agent metrics must be enabled(global.metrics.enableAgentMetrics=true)"}} -{{- end }} -{{- if and (not .Values.global.metrics.enabled) (and .Values.global.metrics.disableAgentHostName .Values.global.metrics.enableAgentMetrics)}} -{{fail "When enabling Consul agent metrics (global.metrics.enableAgentMetrics) and disabling hostname metrics emission (global.metrics.disableAgentHostName), global metrics must be enabled (global.metrics.enabled)."}} -{{- end }} -{{- end -}} - -{{/* -Validation for Consul Datadog Integration deployment: - -Fail if Datadog integration enabled and Consul server agent telemetry is not enabled. - - global.metrics.datadog.enabled=true - - global.metrics.enableAgentMetrics=false || global.metrics.enabled=false - -Fail if Consul OpenMetrics (Prometheus) and DogStatsD metrics are both enabled and configured. - - global.metrics.datadog.dogstatsd.enabled (scrapes `/v1/agent/metrics?format=prometheus` via the `use_prometheus_endpoint` option) - - global.metrics.datadog.openMetricsPrometheus.enabled (scrapes `/v1/agent/metrics?format=prometheus`) - - see https://docs.datadoghq.com/integrations/consul/?tab=host#host for recommendation to not have both - -Fail if Datadog OTLP forwarding is enabled and Consul Telemetry Collection is not enabled. - - global.metrics.datadog.otlp.enabled=true - - telemetryCollector.enabled=false - -Fail if Consul Open Telemetry collector forwarding protocol is not one of either "http" or "grpc" - - global.metrics.datadog.otlp.protocol!="http" || global.metrics.datadog.otlp.protocol!="grpc" - -Usage: {{ template "consul.validateDatadogConfiguration" . }} - -*/}} - -{{- define "consul.validateDatadogConfiguration" -}} -{{- if and .Values.global.metrics.datadog.enabled (or (not .Values.global.metrics.enableAgentMetrics) (not .Values.global.metrics.enabled) )}} -{{fail "When enabling datadog metrics collection, the /v1/agent/metrics is required to be accessible, therefore global.metrics.enableAgentMetrics and global.metrics.enabled must be also be enabled."}} -{{- end }} -{{- if and .Values.global.metrics.datadog.dogstatsd.enabled .Values.global.metrics.datadog.openMetricsPrometheus.enabled }} -{{fail "You must have one of DogStatsD (global.metrics.datadog.dogstatsd.enabled) or OpenMetrics (global.metrics.datadog.openMetricsPrometheus.enabled) enabled, not both as this is an unsupported configuration." }} -{{- end }} -{{- if and .Values.global.metrics.datadog.otlp.enabled (not .Values.telemetryCollector.enabled) }} -{{fail "Cannot enable Datadog OTLP metrics collection (global.metrics.datadog.otlp.enabled) without consul-telemetry-collector. Ensure Consul OTLP collection is enabled (telemetryCollector.enabled) and configured." }} -{{- end }} -{{- if and (ne ( lower .Values.global.metrics.datadog.otlp.protocol) "http") (ne ( lower .Values.global.metrics.datadog.otlp.protocol) "grpc") }} -{{fail "Valid values for global.metrics.datadog.otlp.protocol must be one of either \"http\" or \"grpc\"." }} -{{- end }} -{{- end -}} - -{{/* -Sets the dogstatsd_addr field of the agent configuration dependent on the -socket transport type being used: - - "UDS" (Unix Domain Socket): prefixes "unix://" to URL and appends path to socket (i.e., unix:///var/run/datadog/dsd.socket) - - "UDP" (User Datagram Protocol): adds no prefix and appends dogstatsd port number to hostname/IP (i.e., 172.20.180.10:8125) -- global.metrics.enableDatadogIntegration.dogstatsd configuration - -Usage: {{ template "consul.dogstatsdAaddressInfo" . }} -*/}} - -{{- define "consul.dogstatsdAaddressInfo" -}} -{{- if (and .Values.global.metrics.datadog.enabled .Values.global.metrics.datadog.dogstatsd.enabled) }} - "dogstatsd_addr": "{{- if eq .Values.global.metrics.datadog.dogstatsd.socketTransportType "UDS" }}unix://{{ .Values.global.metrics.datadog.dogstatsd.dogstatsdAddr }}{{- else }}{{ .Values.global.metrics.datadog.dogstatsd.dogstatsdAddr | trimAll "\"" }}{{- if ne ( .Values.global.metrics.datadog.dogstatsd.dogstatsdPort | int ) 0 }}:{{ .Values.global.metrics.datadog.dogstatsd.dogstatsdPort | toString }}{{- end }}{{- end }}",{{- end }} -{{- end -}} - -{{/* -Configures the metrics prefixing that's required to either allow or dissallow certaing RPC or gRPC server calls: - -Usage: {{ template "consul.prefixFilter" . }} -*/}} -{{- define "consul.prefixFilter" -}} -{{- $allowList := .Values.global.metrics.prefixFilter.allowList }} -{{- $blockList := .Values.global.metrics.prefixFilter.blockList }} -{{- if and (not (empty $allowList)) (not (empty $blockList)) }} - "prefix_filter": [{{- range $index, $value := concat $allowList $blockList -}} - "{{- if (has $value $allowList) }}{{ printf "+%s" ($value | trimAll "\"") }}{{- else }}{{ printf "-%s" ($value | trimAll "\"") }}{{- end }}"{{- if lt $index (sub (len (concat $allowList $blockList)) 1) -}},{{- end -}} - {{- end -}}], -{{- else if not (empty $allowList) }} - "prefix_filter": [{{- range $index, $value := $allowList -}} - "{{ printf "+%s" ($value | trimAll "\"") }}"{{- if lt $index (sub (len $allowList) 1) -}},{{- end -}} - {{- end -}}], -{{- else if not (empty $blockList) }} - "prefix_filter": [{{- range $index, $value := $blockList -}} - "{{ printf "-%s" ($value | trimAll "\"") }}"{{- if lt $index (sub (len $blockList) 1) -}},{{- end -}} - {{- end -}}], -{{- end }} -{{- end -}} - -{{/* -Retrieves the global consul/consul-enterprise version string for use with labels or tags. -Requirements for valid labels: - - a valid label must be an empty string or consist of - => alphanumeric characters - => '-', '_' or '.' - => must start and end with an alphanumeric character - (e.g. 'MyValue', or 'my_value', or '12345', regex used for validation is - '(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?') - -Usage: {{ template "consul.versionInfo" }} -*/}} -{{- define "consul.versionInfo" -}} -{{- $imageVersion := regexSplit ":" .Values.global.image -1 }} -{{- $versionInfo := printf "%s" (index $imageVersion 1 ) | trimSuffix "\"" }} -{{- $sanitizedVersion := "" }} -{{- $pattern := "^([A-Za-z0-9][-A-Za-z0-9_.]*[A-Za-z0-9])?$" }} -{{- if not (regexMatch $pattern $versionInfo) -}} - {{- $sanitizedVersion = regexReplaceAll "[^A-Za-z0-9-_.]|sha256" $versionInfo "" }} - {{- $sanitizedVersion = printf "%s" (trimSuffix "-" (trimPrefix "-" $sanitizedVersion)) -}} -{{- else }} - {{- $sanitizedVersion = $versionInfo }} -{{- end -}} -{{- printf "%s" $sanitizedVersion | trunc 63 | quote }} -{{- end -}} - -{{/* -Sets the imagePullPolicy for all Consul images (consul, consul-dataplane, consul-k8s, consul-telemetry-collector) -Valid values are: - IfNotPresent - Always - Never - In the case of empty, see https://kubernetes.io/docs/concepts/containers/images/#image-pull-policy for details - -Usage: {{ template "consul.imagePullPolicy" . }} TODO: melisa should we name this differently ? -*/}} -{{- define "consul.imagePullPolicy" -}} -{{ if or (eq .Values.global.imagePullPolicy "IfNotPresent") (eq .Values.global.imagePullPolicy "Always") (eq .Values.global.imagePullPolicy "Never")}}imagePullPolicy: {{ .Values.global.imagePullPolicy }} -{{ else if eq .Values.global.imagePullPolicy "" }} -{{ else }} -{{fail "imagePullPolicy can only be IfNotPresent, Always, Never, or empty" }} -{{ end }} -{{- end -}} diff --git a/charts/consul/templates/auth-method-clusterrole.yaml b/charts/consul/templates/auth-method-clusterrole.yaml deleted file mode 100644 index 6b8f2c5..0000000 --- a/charts/consul/templates/auth-method-clusterrole.yaml +++ /dev/null @@ -1,18 +0,0 @@ -{{- if .Values.global.acls.manageSystemACLs }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "consul.fullname" . }}-auth-method - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: auth-method -rules: -- apiGroups: [ "" ] - resources: - - serviceaccounts - verbs: - - get -{{- end }} diff --git a/charts/consul/templates/auth-method-clusterrolebinding.yaml b/charts/consul/templates/auth-method-clusterrolebinding.yaml deleted file mode 100644 index 9bd6c64..0000000 --- a/charts/consul/templates/auth-method-clusterrolebinding.yaml +++ /dev/null @@ -1,39 +0,0 @@ -{{- if .Values.global.acls.manageSystemACLs }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "consul.fullname" . }}-authdelegator - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: auth-method -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: "system:auth-delegator" -subjects: -- kind: ServiceAccount - name: {{ template "consul.fullname" . }}-auth-method - namespace: {{ .Release.Namespace }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "consul.fullname" . }}-auth-method - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: auth-method -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "consul.fullname" . }}-auth-method -subjects: -- kind: ServiceAccount - name: {{ template "consul.fullname" . }}-auth-method - namespace: {{ .Release.Namespace }} -{{- end }} diff --git a/charts/consul/templates/auth-method-secret.yaml b/charts/consul/templates/auth-method-secret.yaml deleted file mode 100644 index af0aeb4..0000000 --- a/charts/consul/templates/auth-method-secret.yaml +++ /dev/null @@ -1,16 +0,0 @@ -{{- if .Values.global.acls.manageSystemACLs }} -apiVersion: v1 -kind: Secret -metadata: - name: {{ template "consul.fullname" . }}-auth-method - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: auth-method - annotations: - kubernetes.io/service-account.name: {{ template "consul.fullname" . }}-auth-method -type: kubernetes.io/service-account-token -{{- end }} diff --git a/charts/consul/templates/auth-method-serviceaccount.yaml b/charts/consul/templates/auth-method-serviceaccount.yaml deleted file mode 100644 index 098339b..0000000 --- a/charts/consul/templates/auth-method-serviceaccount.yaml +++ /dev/null @@ -1,19 +0,0 @@ -{{- if .Values.global.acls.manageSystemACLs }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "consul.fullname" . }}-auth-method - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: auth-method -{{- with .Values.global.imagePullSecrets }} -imagePullSecrets: -{{- range . }} -- name: {{ .name }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/consul/templates/client-config-configmap.yaml b/charts/consul/templates/client-config-configmap.yaml deleted file mode 100644 index cab2c7c..0000000 --- a/charts/consul/templates/client-config-configmap.yaml +++ /dev/null @@ -1,40 +0,0 @@ -{{- if (or (and (ne (.Values.client.enabled | toString) "-") .Values.client.enabled) (and (eq (.Values.client.enabled | toString) "-") .Values.global.enabled)) }} -# ConfigMap with extra configuration specified directly to the chart -# for client agents only. -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ template "consul.fullname" . }}-client-config - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: client -data: - client.json: |- - { - {{- if and .Values.global.secretsBackend.vault.enabled }} - "auto_reload_config": true - {{- end }} - } - log-level.json: |- - { - {{- if .Values.client.logLevel }} - "log_level": "{{ .Values.client.logLevel | upper }}" - {{- end }} - } - central-config.json: |- - { - "enable_central_service_config": true - } - {{- if .Values.connectInject.enabled }} - {{/* We set check_update_interval to 0s so that check output is immediately viewable - in the UI. */}} - config.json: |- - { - "check_update_interval": "0s" - } - {{- end }} -{{- end }} diff --git a/charts/consul/templates/client-daemonset.yaml b/charts/consul/templates/client-daemonset.yaml deleted file mode 100644 index 9c60738..0000000 --- a/charts/consul/templates/client-daemonset.yaml +++ /dev/null @@ -1,611 +0,0 @@ -{{- if .Values.global.imageK8s }}{{ fail "global.imageK8s is not a valid key, use global.imageK8S (note the capital 'S')" }}{{ end -}} -{{- if (or (and (ne (.Values.client.enabled | toString) "-") .Values.client.enabled) (and (eq (.Values.client.enabled | toString) "-") .Values.global.enabled)) }} -{{- $serverEnabled := (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) -}} -{{- if (and .Values.global.adminPartitions.enabled $serverEnabled (ne .Values.global.adminPartitions.name "default"))}}{{ fail "global.adminPartitions.name has to be \"default\" in the server cluster" }}{{ end -}} -{{- if (and (not .Values.global.secretsBackend.vault.consulClientRole) .Values.global.secretsBackend.vault.enabled) }}{{ fail "global.secretsBackend.vault.consulClientRole must be provided if global.secretsBackend.vault.enabled=true." }}{{ end -}} -{{- if (and (and .Values.global.secretsBackend.vault.enabled .Values.global.tls.enabled) (not .Values.global.tls.caCert.secretName)) }}{{ fail "global.tls.caCert.secretName must be provided if global.tls.enabled=true and global.secretsBackend.vault.enabled=true." }}{{ end -}} -{{- if (and (and .Values.global.secretsBackend.vault.enabled .Values.global.tls.enabled) (not .Values.global.tls.enableAutoEncrypt)) }}{{ fail "global.tls.enableAutoEncrypt must be true if global.secretsBackend.vault.enabled=true and global.tls.enabled=true" }}{{ end -}} -{{- if (and (and .Values.global.secretsBackend.vault.enabled .Values.global.tls.enabled) (not .Values.global.secretsBackend.vault.consulCARole)) }}{{ fail "global.secretsBackend.vault.consulCARole must be provided if global.secretsBackend.vault.enabled=true and global.tls.enabled=true" }}{{ end -}} -{{- if and .Values.global.federation.enabled .Values.global.adminPartitions.enabled }}{{ fail "If global.federation.enabled is true, global.adminPartitions.enabled must be false because they are mutually exclusive" }}{{ end }} -{{- if (and .Values.global.enterpriseLicense.secretName (not .Values.global.enterpriseLicense.secretKey)) }}{{fail "enterpriseLicense.secretKey and secretName must both be specified." }}{{ end -}} -{{- if (and (not .Values.global.enterpriseLicense.secretName) .Values.global.enterpriseLicense.secretKey) }}{{fail "enterpriseLicense.secretKey and secretName must both be specified." }}{{ end -}} -{{- if and .Values.externalServers.enabled (not .Values.externalServers.hosts) }}{{ fail "externalServers.hosts must be set if externalServers.enabled is true" }}{{ end -}} -{{ template "consul.validateRequiredCloudSecretsExist" . }} -{{ template "consul.validateCloudSecretKeys" . }} -# DaemonSet to run the Consul clients on every node. -apiVersion: apps/v1 -kind: DaemonSet -metadata: - name: {{ template "consul.fullname" . }}-client - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: client - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 4 }} - {{- end }} -spec: - {{- if .Values.client.updateStrategy }} - updateStrategy: - {{ tpl .Values.client.updateStrategy . | nindent 4 | trim }} - {{- end }} - selector: - matchLabels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - release: {{ .Release.Name }} - component: client - hasDNS: "true" - template: - metadata: - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - release: {{ .Release.Name }} - component: client - hasDNS: "true" - {{- if .Values.client.extraLabels }} - {{- toYaml .Values.client.extraLabels | nindent 8 }} - {{- end }} - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 8 }} - {{- end }} - annotations: - {{- if .Values.global.secretsBackend.vault.enabled }} - "vault.hashicorp.com/agent-inject": "true" - "vault.hashicorp.com/agent-init-first": "true" - "vault.hashicorp.com/role": "{{ .Values.global.secretsBackend.vault.consulClientRole }}" - {{- if and .Values.global.secretsBackend.vault.ca.secretName .Values.global.secretsBackend.vault.ca.secretKey }} - "vault.hashicorp.com/agent-extra-secret": "{{ .Values.global.secretsBackend.vault.ca.secretName }}" - "vault.hashicorp.com/ca-cert": "/vault/custom/{{ .Values.global.secretsBackend.vault.ca.secretKey }}" - {{- end }} - {{- if .Values.global.gossipEncryption.secretName }} - {{- with .Values.global.gossipEncryption }} - "vault.hashicorp.com/agent-inject-secret-gossip.txt": {{ .secretName }} - "vault.hashicorp.com/agent-inject-template-gossip.txt": {{ template "consul.vaultSecretTemplate" . }} - {{- end }} - {{- end }} - {{- if .Values.global.tls.enabled }} - "vault.hashicorp.com/agent-inject-secret-serverca.crt": {{ .Values.global.tls.caCert.secretName }} - "vault.hashicorp.com/agent-inject-template-serverca.crt": {{ template "consul.serverTLSCATemplate" . }} - {{- end }} - {{- if .Values.global.secretsBackend.vault.agentAnnotations }} - {{ tpl .Values.global.secretsBackend.vault.agentAnnotations . | nindent 8 | trim }} - {{- end }} - {{- if (and (.Values.global.secretsBackend.vault.vaultNamespace) (not (hasKey (default "" .Values.global.secretsBackend.vault.agentAnnotations | fromYaml) "vault.hashicorp.com/namespace")))}} - "vault.hashicorp.com/namespace": "{{ .Values.global.secretsBackend.vault.vaultNamespace }}" - {{- end }} - {{- if and .Values.global.enterpriseLicense.secretName (not .Values.global.acls.manageSystemACLs) }} - {{- with .Values.global.enterpriseLicense }} - "vault.hashicorp.com/agent-inject-secret-enterpriselicense.txt": "{{ .secretName }}" - "vault.hashicorp.com/agent-inject-template-enterpriselicense.txt": {{ template "consul.vaultSecretTemplate" . }} - {{- end }} - {{- end }} - {{- end }} - "consul.hashicorp.com/connect-inject": "false" - "consul.hashicorp.com/mesh-inject": "false" - "consul.hashicorp.com/config-checksum": {{ print (include (print $.Template.BasePath "/client-config-configmap.yaml") .) (include (print $.Template.BasePath "/client-tmp-extra-config-configmap.yaml") .) | sha256sum }} - {{- if .Values.client.annotations }} - {{- tpl .Values.client.annotations . | nindent 8 }} - {{- end }} - {{- if (and .Values.global.metrics.enabled .Values.global.metrics.enableAgentMetrics) }} - "prometheus.io/scrape": "true" - {{- if not (hasKey (default "" .Values.client.annotations | fromYaml) "prometheus.io/path")}} - "prometheus.io/path": "/v1/agent/metrics" - {{- end }} - "prometheus.io/port": "8500" - {{- end }} - spec: - {{- if .Values.client.affinity }} - affinity: - {{ tpl .Values.client.affinity . | nindent 8 | trim }} - {{- end }} - {{- if .Values.client.tolerations }} - tolerations: - {{ tpl .Values.client.tolerations . | nindent 8 | trim }} - {{- end }} - terminationGracePeriodSeconds: 10 - serviceAccountName: {{ template "consul.fullname" . }}-client - - {{- if not .Values.global.openshift.enabled }} - securityContext: - {{- toYaml .Values.client.securityContext | nindent 8 -}} - {{- end }} - - {{- if .Values.client.priorityClassName }} - priorityClassName: {{ .Values.client.priorityClassName | quote }} - {{- end }} - - {{- if .Values.client.dnsPolicy }} - dnsPolicy: {{ .Values.client.dnsPolicy }} - {{- end }} - - {{- if .Values.client.hostNetwork }} - hostNetwork: {{ .Values.client.hostNetwork }} - {{- end }} - - volumes: - - name: data - {{- if .Values.client.dataDirectoryHostPath }} - hostPath: - path: {{ .Values.client.dataDirectoryHostPath }} - type: DirectoryOrCreate - {{- else }} - emptyDir: {} - {{- end }} - - name: config - configMap: - name: {{ template "consul.fullname" . }}-client-config - - name: extra-config - emptyDir: {} - - name: consul-data - emptyDir: - medium: "Memory" - - name: tmp-extra-config - configMap: - name: {{ template "consul.fullname" . }}-client-tmp-extra-config - {{- if .Values.global.tls.enabled }} - {{- if not .Values.global.secretsBackend.vault.enabled }} - - name: consul-ca-cert - secret: - {{- if .Values.global.tls.caCert.secretName }} - secretName: {{ .Values.global.tls.caCert.secretName }} - {{- else }} - secretName: {{ template "consul.fullname" . }}-ca-cert - {{- end }} - items: - - key: {{ default "tls.crt" .Values.global.tls.caCert.secretKey }} - path: tls.crt - {{- end }} - {{- if (and (not .Values.global.secretsBackend.vault.enabled) (not .Values.global.tls.enableAutoEncrypt)) }} - - name: consul-ca-key - secret: - {{- if .Values.global.tls.caKey.secretName }} - secretName: {{ .Values.global.tls.caKey.secretName }} - {{- else }} - secretName: {{ template "consul.fullname" . }}-ca-key - {{- end }} - items: - - key: {{ default "tls.key" .Values.global.tls.caKey.secretKey }} - path: tls.key - - name: consul-client-cert - emptyDir: - # We're using tmpfs here so that - # client certs are not written to disk - medium: "Memory" - {{- end }} - {{- end }} - {{- range .Values.client.extraVolumes }} - - name: userconfig-{{ .name }} - {{ .type }}: - {{- if (eq .type "configMap") }} - name: {{ .name }} - {{- else if (eq .type "secret") }} - secretName: {{ .name }} - {{- end }} - {{- end }} - {{- if .Values.global.acls.manageSystemACLs }} - - name: aclconfig - emptyDir: {} - {{- else }} - {{- if (and .Values.global.enterpriseLicense.secretName .Values.global.enterpriseLicense.secretKey .Values.global.enterpriseLicense.enableLicenseAutoload (not .Values.global.secretsBackend.vault.enabled)) }} - - name: consul-license - secret: - secretName: {{ .Values.global.enterpriseLicense.secretName }} - {{- end }} - {{- end }} - containers: - - name: consul - image: "{{ default .Values.global.image .Values.client.image }}" - {{ template "consul.imagePullPolicy" . }} - {{- if .Values.global.acls.manageSystemACLs }} - lifecycle: - preStop: - exec: - command: - - "/bin/consul" - - "logout" - {{- end }} - env: - {{- if .Values.global.acls.manageSystemACLs }} - - name: CONSUL_HTTP_TOKEN_FILE - value: "/consul/login/acl-token" - {{- end }} - - name: ADVERTISE_IP - valueFrom: - fieldRef: - {{- if .Values.client.exposeGossipPorts }} - {{- /* Clients will be exposed on their node's hostPort for external-to-k8s communication, - so they need to advertise their host ip instead of their pod ip. */}} - fieldPath: status.hostIP - {{- else }} - fieldPath: status.podIP - {{- end }} - - name: NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: NODE - valueFrom: - fieldRef: - fieldPath: spec.nodeName - - name: HOST_IP - valueFrom: - fieldRef: - fieldPath: status.hostIP - - name: POD_IP - valueFrom: - fieldRef: - fieldPath: status.podIP - - name: CONSUL_DISABLE_PERM_MGMT - value: "true" - {{- if (or .Values.global.gossipEncryption.autoGenerate (and .Values.global.gossipEncryption.secretName .Values.global.gossipEncryption.secretKey)) }} - {{- if not .Values.global.secretsBackend.vault.enabled }} - - name: GOSSIP_KEY - valueFrom: - secretKeyRef: - {{- if .Values.global.gossipEncryption.autoGenerate }} - name: {{ template "consul.fullname" . }}-gossip-encryption-key - key: key - {{- else if (and .Values.global.gossipEncryption.secretName .Values.global.gossipEncryption.secretKey) }} - name: {{ .Values.global.gossipEncryption.secretName }} - key: {{ .Values.global.gossipEncryption.secretKey }} - {{- end }} - {{- end }} - {{- end }} - {{- if (and .Values.global.enterpriseLicense.secretName .Values.global.enterpriseLicense.secretKey .Values.global.enterpriseLicense.enableLicenseAutoload (not .Values.global.acls.manageSystemACLs)) }} - - name: CONSUL_LICENSE_PATH - {{- if .Values.global.secretsBackend.vault.enabled }} - value: /vault/secrets/enterpriselicense.txt - {{- else }} - value: /consul/license/{{ .Values.global.enterpriseLicense.secretKey }} - {{- end }} - {{- end }} - {{- if .Values.global.tls.enabled }} - - name: CONSUL_HTTP_ADDR - value: https://localhost:8501 - {{- if .Values.global.tls.enableAutoEncrypt }} - - name: CONSUL_HTTP_SSL_VERIFY - value: "false" - {{- else }} - - name: CONSUL_CACERT - value: /consul/tls/ca/tls.crt - {{- end }} - {{- end }} - {{- include "consul.extraEnvironmentVars" .Values.client | nindent 12 }} - command: - - "/bin/sh" - - "-ec" - - | - CONSUL_FULLNAME="{{template "consul.fullname" . }}" - - {{- if and .Values.global.secretsBackend.vault.enabled .Values.global.gossipEncryption.secretName }} - GOSSIP_KEY=`cat /vault/secrets/gossip.txt` - {{- end }} - - {{ template "consul.extraconfig" }} - - exec /usr/local/bin/docker-entrypoint.sh consul agent \ - -node="${NODE}" \ - -advertise="${ADVERTISE_IP}" \ - -bind=0.0.0.0 \ - -client=0.0.0.0 \ - {{- range $k, $v := .Values.client.nodeMeta }} - -node-meta={{ $k }}:{{ $v }} \ - {{- end }} - -hcl='leave_on_terminate = true' \ - {{- if .Values.global.tls.enabled }} - {{- if .Values.global.peering.enabled }} - {{- if .Values.global.secretsBackend.vault.enabled }} - -hcl='tls { defaults { ca_file = "/vault/secrets/serverca.crt" }}' \ - {{- else }} - -hcl='tls { defaults { ca_file = "/consul/tls/ca/tls.crt" }}' \ - {{- end }} - {{- if .Values.global.tls.enableAutoEncrypt }} - -hcl='auto_encrypt = {tls = true}' \ - -hcl="auto_encrypt = {ip_san = [\"$HOST_IP\",\"$POD_IP\"]}" \ - -hcl='tls { grpc { use_auto_cert = true } }' \ - {{- else }} - -hcl='tls { defaults { cert_file = "/consul/tls/client/tls.crt" }}' \ - -hcl='tls { defaults { key_file = "/consul/tls/client/tls.key" }}' \ - {{- end }} - {{- if .Values.global.tls.verify }} - -hcl='tls { defaults { verify_outgoing = true }}' \ - {{- if not .Values.global.tls.enableAutoEncrypt }} - -hcl='tls { internal_rpc { verify_incoming = true }}' \ - -hcl='tls { internal_rpc { verify_server_hostname = true }}' \ - {{- end }} - {{- end }} - -hcl='ports { https = 8501 }' \ - {{- if .Values.global.tls.httpsOnly }} - -hcl='ports { http = -1 }' \ - {{- end }} - {{- else}} - {{- if .Values.global.secretsBackend.vault.enabled }} - -hcl='ca_file = "/vault/secrets/serverca.crt"' \ - {{- else }} - -hcl='ca_file = "/consul/tls/ca/tls.crt"' \ - {{- end }} - {{- if .Values.global.tls.enableAutoEncrypt }} - -hcl='auto_encrypt = {tls = true}' \ - -hcl="auto_encrypt = {ip_san = [\"$HOST_IP\",\"$POD_IP\"]}" \ - {{- else }} - -hcl='cert_file = "/consul/tls/client/tls.crt"' \ - -hcl='key_file = "/consul/tls/client/tls.key"' \ - {{- end }} - {{- if .Values.global.tls.verify }} - -hcl='verify_outgoing = true' \ - {{- if not .Values.global.tls.enableAutoEncrypt }} - -hcl='verify_incoming_rpc = true' \ - -hcl='verify_server_hostname = true' \ - {{- end }} - {{- end }} - -hcl='ports { https = 8501 }' \ - {{- if .Values.global.tls.httpsOnly }} - -hcl='ports { http = -1 }' \ - {{- end }} - {{- end }} - {{- end }} - {{- if .Values.client.grpc }} - {{- if .Values.global.tls.enabled }} - -hcl='ports { grpc = -1, grpc_tls = 8502 }' \ - {{- else }} - -hcl='ports { grpc = 8502, grpc_tls = -1 }' \ - {{- end }} - {{- end }} - {{- if (and .Values.global.metrics.enabled .Values.global.metrics.enableAgentMetrics) }} - -hcl='telemetry { prometheus_retention_time = "{{ .Values.global.metrics.agentMetricsRetentionTime }}" }' \ - {{- end }} - {{- if .Values.global.adminPartitions.enabled }} - -hcl='partition = "{{ .Values.global.adminPartitions.name }}"' \ - {{- end }} - -config-dir=/consul/config \ - {{- if .Values.global.acls.manageSystemACLs }} - -config-dir=/consul/aclconfig \ - {{- end }} - {{- /* Always include the extraVolumes at the end so that users can - override other Consul settings. The last -config-dir takes - precedence. */}} - {{- range .Values.client.extraVolumes }} - {{- if .load }} - -config-dir=/consul/userconfig/{{ .name }} \ - {{- end }} - {{- end }} - -datacenter={{ .Values.global.datacenter }} \ - -data-dir=/consul/data \ - {{- if (or .Values.global.gossipEncryption.autoGenerate (and .Values.global.gossipEncryption.secretName .Values.global.gossipEncryption.secretKey)) }} - -encrypt="${GOSSIP_KEY}" \ - {{- end }} - {{- if .Values.client.join }} - {{- range $value := .Values.client.join }} - -retry-join={{ quote $value }} \ - {{- end }} - {{- else }} - {{- if .Values.server.enabled }} - {{- $serverSerfLANPort := .Values.server.ports.serflan.port -}} - {{- range $index := until (.Values.server.replicas | int) }} - -retry-join="${CONSUL_FULLNAME}-server-{{ $index }}.${CONSUL_FULLNAME}-server.${NAMESPACE}.svc:{{ $serverSerfLANPort }}" \ - {{- end }} - {{- end }} - {{- end }} - {{- range $value := .Values.global.recursors }} - -recursor={{ quote $value }} \ - {{- end }} - -config-dir=/consul/extra-config \ - -domain={{ .Values.global.domain }} - volumeMounts: - - name: data - mountPath: /consul/data - - name: config - mountPath: /consul/config - - name: extra-config - mountPath: /consul/extra-config - - name: tmp-extra-config - mountPath: /consul/tmp/extra-config - - mountPath: /consul/login - name: consul-data - readOnly: true - {{- if .Values.global.tls.enabled }} - {{- if not .Values.global.secretsBackend.vault.enabled }} - - name: consul-ca-cert - mountPath: /consul/tls/ca - readOnly: true - {{- if not .Values.global.tls.enableAutoEncrypt }} - - name: consul-client-cert - mountPath: /consul/tls/client - readOnly: true - {{- end }} - {{- end }} - {{- end }} - {{- range .Values.client.extraVolumes }} - - name: userconfig-{{ .name }} - readOnly: true - mountPath: /consul/userconfig/{{ .name }} - {{- end }} - {{- if .Values.global.acls.manageSystemACLs }} - - name: aclconfig - mountPath: /consul/aclconfig - {{- else }} - {{- if (and .Values.global.enterpriseLicense.secretName .Values.global.enterpriseLicense.secretKey .Values.global.enterpriseLicense.enableLicenseAutoload (not .Values.global.secretsBackend.vault.enabled)) }} - - name: consul-license - mountPath: /consul/license - readOnly: true - {{- end }} - {{- end }} - ports: - {{- if (or (not .Values.global.tls.enabled) (not .Values.global.tls.httpsOnly)) }} - - containerPort: 8500 - hostPort: 8500 - name: http - {{- end }} - {{- if .Values.global.tls.enabled }} - - containerPort: 8501 - hostPort: 8501 - name: https - {{- end }} - - containerPort: 8502 - hostPort: 8502 - name: grpc - - containerPort: 8301 - {{- if .Values.client.exposeGossipPorts }} - hostPort: 8301 - {{- end }} - protocol: "TCP" - name: serflan-tcp - - containerPort: 8301 - {{- if .Values.client.exposeGossipPorts }} - hostPort: 8301 - {{- end }} - protocol: "UDP" - name: serflan-udp - - containerPort: 8600 - name: dns-tcp - protocol: "TCP" - - containerPort: 8600 - name: dns-udp - protocol: "UDP" - readinessProbe: - # NOTE(mitchellh): when our HTTP status endpoints support the - # proper status codes, we should switch to that. This is temporary. - exec: - command: - - "/bin/sh" - - "-ec" - - | - {{- if .Values.global.tls.enabled }} - curl \ - -k \ - https://127.0.0.1:8501/v1/status/leader \ - {{- else }} - curl http://127.0.0.1:8500/v1/status/leader \ - {{- end }} - 2>/dev/null | grep -E '".+"' - {{- if .Values.client.resources }} - resources: - {{- if eq (typeOf .Values.client.resources) "string" }} - {{ tpl .Values.client.resources . | nindent 12 | trim }} - {{- else }} - {{- toYaml .Values.client.resources | nindent 12 }} - {{- end }} - {{- end }} - {{- if not .Values.global.openshift.enabled }} - securityContext: - {{- toYaml .Values.client.containerSecurityContext.client | nindent 12 }} - {{- end }} - {{- if .Values.client.extraContainers }} - {{ toYaml .Values.client.extraContainers | nindent 8 }} - {{- end }} - {{- if (or .Values.global.acls.manageSystemACLs (and .Values.global.tls.enabled (not .Values.global.tls.enableAutoEncrypt))) }} - initContainers: - {{- if .Values.global.acls.manageSystemACLs }} - - name: client-acl-init - image: {{ .Values.global.imageK8S }} - {{ template "consul.imagePullPolicy" . }} - env: - - name: NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - {{- include "consul.consulK8sConsulServerEnvVars" . | nindent 8 }} - {{- if .Values.global.acls.manageSystemACLs }} - - name: CONSUL_LOGIN_AUTH_METHOD - value: {{ template "consul.fullname" . }}-k8s-component-auth-method - - name: CONSUL_LOGIN_META - value: "component=client,pod=$(NAMESPACE)/$(POD_NAME)" - {{- end }} - - name: CONSUL_LOGIN_DATACENTER - value: {{ .Values.global.datacenter }} - command: - - "/bin/sh" - - "-ec" - - | - exec consul-k8s-control-plane acl-init \ - -log-level={{ default .Values.global.logLevel .Values.client.logLevel }} \ - -log-json={{ .Values.global.logJSON }} \ - -init-type="client" - volumeMounts: - - name: aclconfig - mountPath: /consul/aclconfig - - mountPath: /consul/login - name: consul-data - readOnly: false - {{- if (and .Values.global.tls.enabled (not .Values.global.secretsBackend.vault.enabled) (not .Values.externalServers.useSystemRoots)) }} - - name: consul-ca-cert - mountPath: /consul/tls/ca - readOnly: false - {{- end }} - resources: - requests: - memory: "25Mi" - cpu: "50m" - limits: - memory: "25Mi" - cpu: "50m" - {{- if not .Values.global.openshift.enabled }} - securityContext: - {{- toYaml .Values.client.containerSecurityContext.aclInit | nindent 10 }} - {{- end }} - {{- end }} - {{- if and .Values.global.tls.enabled (not .Values.global.tls.enableAutoEncrypt) }} - - name: client-tls-init - image: "{{ default .Values.global.image .Values.client.image }}" - {{ template "consul.imagePullPolicy" . }} - env: - - name: HOST_IP - valueFrom: - fieldRef: - fieldPath: status.hostIP - - name: POD_IP - valueFrom: - fieldRef: - fieldPath: status.podIP - command: - - "/bin/sh" - - "-ec" - - | - cd /consul/tls/client - consul tls cert create -client \ - -additional-ipaddress=${HOST_IP} \ - -additional-ipaddress=${POD_IP} \ - -dc={{ .Values.global.datacenter }} \ - -domain={{ .Values.global.domain }} \ - -ca=/consul/tls/ca/cert/tls.crt \ - -key=/consul/tls/ca/key/tls.key - mv {{ .Values.global.datacenter }}-client-{{ .Values.global.domain }}-0.pem tls.crt - mv {{ .Values.global.datacenter }}-client-{{ .Values.global.domain }}-0-key.pem tls.key - volumeMounts: - {{- if not .Values.global.secretsBackend.vault.enabled }} - - name: consul-client-cert - mountPath: /consul/tls/client - - name: consul-ca-cert - mountPath: /consul/tls/ca/cert - readOnly: true - - name: consul-ca-key - mountPath: /consul/tls/ca/key - readOnly: true - {{- end }} - resources: - requests: - memory: "50Mi" - cpu: "50m" - limits: - memory: "50Mi" - cpu: "50m" - {{- if not .Values.global.openshift.enabled }} - securityContext: - {{- toYaml .Values.client.containerSecurityContext.tlsInit | nindent 10 }} - {{- end }} - {{- end }} - {{- end }} - {{- if .Values.client.nodeSelector }} - nodeSelector: - {{ tpl .Values.client.nodeSelector . | indent 8 | trim }} - {{- end }} -{{- end }} diff --git a/charts/consul/templates/client-podsecuritypolicy.yaml b/charts/consul/templates/client-podsecuritypolicy.yaml deleted file mode 100644 index 0121bdf..0000000 --- a/charts/consul/templates/client-podsecuritypolicy.yaml +++ /dev/null @@ -1,76 +0,0 @@ -{{- if (and .Values.global.enablePodSecurityPolicies (or (and (ne (.Values.client.enabled | toString) "-") .Values.client.enabled) (and (eq (.Values.client.enabled | toString) "-") .Values.global.enabled))) }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "consul.fullname" . }}-client - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: client -spec: - privileged: false - # Required to prevent escalations to root. - allowPrivilegeEscalation: false - # This is redundant with non-root + disallow privilege escalation, - # but we can provide it for defense in depth. - requiredDropCapabilities: - - ALL - # Allow core volume types. - volumes: - - 'configMap' - - 'emptyDir' - - 'projected' - - 'secret' - - 'downwardAPI' - {{- if .Values.client.dataDirectoryHostPath }} - - 'hostPath' - {{- end }} - {{- if .Values.client.hostNetwork }} - hostNetwork: {{ .Values.client.hostNetwork }} - {{- else }} - hostNetwork: false - {{- end }} - hostPorts: - {{- if (not (and .Values.global.tls.enabled .Values.global.tls.httpsOnly)) }} - # HTTP Port - - min: 8500 - max: 8500 - {{- end }} - {{- if .Values.global.tls.enabled }} - # HTTPS port - - min: 8501 - max: 8501 - {{- end }} - {{- if .Values.client.grpc }} - # gRPC Port - - min: 8502 - max: 8502 - {{- end }} - {{- if (or .Values.client.exposeGossipPorts .Values.client.hostNetwork) }} - - min: 8301 - max: 8301 - {{- end }} - {{- if .Values.client.hostNetwork }} - - min: 8600 - max: 8600 - {{- end }} - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'RunAsAny' - fsGroup: - rule: 'RunAsAny' - readOnlyRootFilesystem: false - {{- if .Values.client.dataDirectoryHostPath }} - allowedHostPaths: - - pathPrefix: {{ .Values.client.dataDirectoryHostPath | quote }} - readOnly: false - {{- end }} -{{- end }} diff --git a/charts/consul/templates/client-role.yaml b/charts/consul/templates/client-role.yaml deleted file mode 100644 index 7f05b82..0000000 --- a/charts/consul/templates/client-role.yaml +++ /dev/null @@ -1,43 +0,0 @@ -{{- if (or (and (ne (.Values.client.enabled | toString) "-") .Values.client.enabled) (and (eq (.Values.client.enabled | toString) "-") .Values.global.enabled)) }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: {{ template "consul.fullname" . }}-client - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: client -{{- if (or .Values.global.acls.manageSystemACLs .Values.global.enablePodSecurityPolicies .Values.global.openshift.enabled) }} -rules: -{{- if .Values.global.enablePodSecurityPolicies }} - - apiGroups: ["policy"] - resources: ["podsecuritypolicies"] - resourceNames: - - {{ template "consul.fullname" . }}-client - verbs: - - use -{{- end }} -{{- if .Values.global.acls.manageSystemACLs }} - - apiGroups: [""] - resources: - - secrets - resourceNames: - - {{ template "consul.fullname" . }}-client-acl-token - verbs: - - get -{{- end }} -{{- if .Values.global.openshift.enabled}} - - apiGroups: ["security.openshift.io"] - resources: ["securitycontextconstraints"] - resourceNames: - - {{ template "consul.fullname" . }}-client - verbs: - - use -{{- end}} -{{- else}} -rules: [] -{{- end }} -{{- end }} diff --git a/charts/consul/templates/client-rolebinding.yaml b/charts/consul/templates/client-rolebinding.yaml deleted file mode 100644 index b034c70..0000000 --- a/charts/consul/templates/client-rolebinding.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if (or (and (ne (.Values.client.enabled | toString) "-") .Values.client.enabled) (and (eq (.Values.client.enabled | toString) "-") .Values.global.enabled)) }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: {{ template "consul.fullname" . }}-client - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: client -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: {{ template "consul.fullname" . }}-client -subjects: - - kind: ServiceAccount - name: {{ template "consul.fullname" . }}-client -{{- end }} diff --git a/charts/consul/templates/client-securitycontextconstraints.yaml b/charts/consul/templates/client-securitycontextconstraints.yaml deleted file mode 100644 index c14dd1c..0000000 --- a/charts/consul/templates/client-securitycontextconstraints.yaml +++ /dev/null @@ -1,61 +0,0 @@ -{{- if (and .Values.global.openshift.enabled (or (and (ne (.Values.client.enabled | toString) "-") .Values.client.enabled) (and (eq (.Values.client.enabled | toString) "-") .Values.global.enabled))) }} -apiVersion: security.openshift.io/v1 -kind: SecurityContextConstraints -metadata: - name: {{ template "consul.fullname" . }}-client - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: client - annotations: - kubernetes.io/description: {{ template "consul.fullname" . }}-client are the security context constraints required - to run the consul client. -# Iff. allowHostDirVolumePlugin is true, hostPath must be included in volumes (see below). -{{- if .Values.client.dataDirectoryHostPath }} -allowHostDirVolumePlugin: true -{{- else }} -allowHostDirVolumePlugin: false -{{- end}} -allowHostIPC: false -allowHostNetwork: {{ .Values.client.hostNetwork }} -allowHostPID: false -allowHostPorts: true -allowPrivilegeEscalation: true -allowPrivilegedContainer: false -allowedCapabilities: null -defaultAddCapabilities: null -fsGroup: - type: MustRunAs -groups: [] -priority: null -readOnlyRootFilesystem: false -requiredDropCapabilities: -- KILL -- MKNOD -- SETUID -- SETGID -runAsUser: - type: MustRunAsRange -seLinuxContext: - type: MustRunAs -supplementalGroups: - type: MustRunAs -users: [] -volumes: -# This list must be in alphabetical order to match the post-reconcile order enforced by OpenShift admission hooks. -# Furthermore, hostPath must be included explicitly if allowHostDirVolumePlugin is true, as it will otherwise be -# added by OpenShift. It must be excluded if allowHostDirVolumePlugin is false per OpenShift requirements. -# This avoids false positives in change detection by third-party diff tools (e.g. ArgoCD) that respect list order. -- configMap -- downwardAPI -- emptyDir -{{- if .Values.client.dataDirectoryHostPath }} -- hostPath -{{- end }} -- persistentVolumeClaim -- projected -- secret -{{- end}} diff --git a/charts/consul/templates/client-serviceaccount.yaml b/charts/consul/templates/client-serviceaccount.yaml deleted file mode 100644 index addd757..0000000 --- a/charts/consul/templates/client-serviceaccount.yaml +++ /dev/null @@ -1,23 +0,0 @@ -{{- if (or (and (ne (.Values.client.enabled | toString) "-") .Values.client.enabled) (and (eq (.Values.client.enabled | toString) "-") .Values.global.enabled)) }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "consul.fullname" . }}-client - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: client - {{- if .Values.client.serviceAccount.annotations }} - annotations: - {{ tpl .Values.client.serviceAccount.annotations . | nindent 4 | trim }} - {{- end }} -{{- with .Values.global.imagePullSecrets }} -imagePullSecrets: -{{- range . }} - - name: {{ .name }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/consul/templates/client-tmp-extra-config-configmap.yaml b/charts/consul/templates/client-tmp-extra-config-configmap.yaml deleted file mode 100644 index a379157..0000000 --- a/charts/consul/templates/client-tmp-extra-config-configmap.yaml +++ /dev/null @@ -1,21 +0,0 @@ -{{- if (or (and (ne (.Values.client.enabled | toString) "-") .Values.client.enabled) (and (eq (.Values.client.enabled | toString) "-") .Values.global.enabled)) }} -# ConfigMap that is used as a temporary landing spot so that the container command -# in the client-daemonset where it needs to be transformed. ConfigMaps create -# read only volumes so it needs to be copied and transformed to the extra-config -# emptyDir volume where all final extra cofngi lives for use in consul. (locality-init -# also writes to extra-config volume.) -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ template "consul.fullname" . }}-client-tmp-extra-config - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: client -data: - extra-from-values.json: |- -{{ tpl .Values.client.extraConfig . | trimAll "\"" | indent 4 }} -{{- end }} diff --git a/charts/consul/templates/cni-clusterrole.yaml b/charts/consul/templates/cni-clusterrole.yaml deleted file mode 100644 index 773942c..0000000 --- a/charts/consul/templates/cni-clusterrole.yaml +++ /dev/null @@ -1,38 +0,0 @@ -{{- if .Values.connectInject.cni.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "consul.fullname" . }}-cni - namespace: {{ default .Release.Namespace .Values.connectInject.cni.namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: cni -rules: -- apiGroups: [""] - resources: - - pods - verbs: - - get - - list - - watch - - patch - - update -- apiGroups: ["policy"] - resources: - - podsecuritypolicies - resourceNames: - - {{ template "consul.fullname" . }}-cni - verbs: - - use -{{- if .Values.global.openshift.enabled}} -- apiGroups: ["security.openshift.io"] - resources: ["securitycontextconstraints"] - resourceNames: - - {{ template "consul.fullname" . }}-cni - verbs: - - use -{{- end }} -{{- end }} diff --git a/charts/consul/templates/cni-clusterrolebinding.yaml b/charts/consul/templates/cni-clusterrolebinding.yaml deleted file mode 100644 index 4b86038..0000000 --- a/charts/consul/templates/cni-clusterrolebinding.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if .Values.connectInject.cni.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "consul.fullname" . }}-cni - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: cni -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "consul.fullname" . }}-cni -subjects: -- kind: ServiceAccount - name: {{ template "consul.fullname" . }}-cni - namespace: {{ default .Release.Namespace .Values.connectInject.cni.namespace }} -{{- end }} diff --git a/charts/consul/templates/cni-daemonset.yaml b/charts/consul/templates/cni-daemonset.yaml deleted file mode 100644 index 4ccda0b..0000000 --- a/charts/consul/templates/cni-daemonset.yaml +++ /dev/null @@ -1,113 +0,0 @@ -{{- if (and (.Values.connectInject.cni.enabled) (not .Values.connectInject.enabled)) }}{{ fail "connectInject.enabled must be true if connectInject.cni.enabled is true" }}{{ end -}} -{{- if .Values.connectInject.cni.enabled }} -apiVersion: apps/v1 -kind: DaemonSet -metadata: - name: {{ template "consul.fullname" . }}-cni - namespace: {{ default .Release.Namespace .Values.connectInject.cni.namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: cni - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 4 }} - {{- end }} -spec: - updateStrategy: - type: RollingUpdate - rollingUpdate: - maxUnavailable: 0 # Allow all pods to be unavailable - maxSurge: 1 # allow extra one pod to enable node by node rollout - selector: - matchLabels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - release: {{ .Release.Name }} - component: cni - template: - metadata: - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - release: {{ .Release.Name }} - component: cni - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 8 }} - {{- end }} - annotations: - consul.hashicorp.com/connect-inject: "false" - consul.hashicorp.com/mesh-inject: "false" - spec: - # consul-cni only runs on linux operating systems - nodeSelector: - kubernetes.io/os: linux - tolerations: - # Mark the pod as a critical add-on for rescheduling. - - key: CriticalAddonsOnly - operator: Exists - - effect: NoExecute - operator: Exists - # Tell kubernetes that this daemonset is critical so that it will be scheduled on a new node before other pods - priorityClassName: system-node-critical - serviceAccountName: {{ template "consul.fullname" . }}-cni - {{- if not .Values.global.openshift.enabled }} - securityContext: - {{- toYaml .Values.connectInject.cni.securityContext | nindent 8 -}} - {{- end }} - # Minimize downtime during a rolling upgrade or deletion; tell Kubernetes to do a "force - # deletion": https://kubernetes.io/docs/concepts/workloads/pods/pod/#termination-of-pods. - terminationGracePeriodSeconds: 100 - containers: - # This container installs the consul CNI binaries and CNI network config file on each node - - name: install-cni - image: {{ .Values.global.imageK8S }} - {{ template "consul.imagePullPolicy" . }} - securityContext: - privileged: true - command: - - consul-k8s-control-plane - - install-cni - - -log-level={{ default .Values.global.logLevel .Values.connectInject.cni.logLevel }} - - -cni-bin-dir={{ .Values.connectInject.cni.cniBinDir }} - - -cni-net-dir={{ .Values.connectInject.cni.cniNetDir }} - - -multus={{ .Values.connectInject.cni.multus }} - {{- if .Values.connectInject.cni.autorotateToken }} - - -autorotate-token={{ .Values.connectInject.cni.autorotateToken }} - {{- end }} - {{- with .Values.connectInject.cni.resources }} - resources: - {{- toYaml . | nindent 12 }} - {{- end }} - volumeMounts: - - mountPath: {{ .Values.connectInject.cni.cniBinDir }} - name: cni-bin-dir - - mountPath: {{ .Values.connectInject.cni.cniNetDir }} - name: cni-net-dir - {{- if .Values.connectInject.cni.autorotateToken }} - - mountPath: /var/run/secrets/kubernetes.io/serviceaccount - name: cni-sa-token - {{- end }} - volumes: - # Used to install CNI. - - name: cni-bin-dir - hostPath: - path: {{ .Values.connectInject.cni.cniBinDir }} - - name: cni-net-dir - hostPath: - path: {{ .Values.connectInject.cni.cniNetDir }} - {{- if .Values.connectInject.cni.autorotateToken }} - - name: cni-sa-token - projected: - sources: - - serviceAccountToken: - expirationSeconds: {{.Values.connectInject.cni.tokenExpiration}} - path: token - - configMap: - name: kube-root-ca.crt - items: - - key: ca.crt - path: ca.crt - {{- end }} -{{- end }} diff --git a/charts/consul/templates/cni-networkattachmentdefinition.yaml b/charts/consul/templates/cni-networkattachmentdefinition.yaml deleted file mode 100644 index 80ef50b..0000000 --- a/charts/consul/templates/cni-networkattachmentdefinition.yaml +++ /dev/null @@ -1,25 +0,0 @@ -{{- if (and (.Values.connectInject.cni.enabled) (.Values.connectInject.cni.multus)) }} -apiVersion: "k8s.cni.cncf.io/v1" -kind: NetworkAttachmentDefinition -metadata: - name: {{ template "consul.fullname" . }}-cni - namespace: {{ default .Release.Namespace .Values.connectInject.cni.namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: cni -spec: - config: '{ - "cniVersion": "0.3.1", - "type": "consul-cni", - "cni_bin_dir": "{{ .Values.connectInject.cni.cniBinDir }}", - "cni_net_dir": "{{ .Values.connectInject.cni.cniNetDir }}", - "kubeconfig": "ZZZ-consul-cni-kubeconfig", - "log_level": "{{ default .Values.global.logLevel .Values.connectInject.cni.logLevel }}", - "multus": true, - "name": "consul-cni", - "type": "consul-cni" - }' -{{- end }} diff --git a/charts/consul/templates/cni-podsecuritypolicy.yaml b/charts/consul/templates/cni-podsecuritypolicy.yaml deleted file mode 100644 index b600ed1..0000000 --- a/charts/consul/templates/cni-podsecuritypolicy.yaml +++ /dev/null @@ -1,31 +0,0 @@ -{{- if (and .Values.connectInject.cni.enabled .Values.global.enablePodSecurityPolicies) }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "consul.fullname" . }}-cni - namespace: {{ default .Release.Namespace .Values.connectInject.cni.namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: cni -spec: - privileged: true - # GKE requires that allowPrivilegeEscalation:true if privileged: true. - allowPrivilegeEscalation: true - volumes: - - hostPath - - secret - - emptyDir - hostNetwork: false - readOnlyRootFilesystem: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'RunAsAny' - fsGroup: - rule: 'RunAsAny' -{{- end }} diff --git a/charts/consul/templates/cni-resourcequota.yaml b/charts/consul/templates/cni-resourcequota.yaml deleted file mode 100644 index 054c306..0000000 --- a/charts/consul/templates/cni-resourcequota.yaml +++ /dev/null @@ -1,22 +0,0 @@ -{{- if .Values.connectInject.cni.enabled }} -apiVersion: v1 -kind: ResourceQuota -metadata: - name: {{ template "consul.fullname" . }}-cni - namespace: {{ default .Release.Namespace .Values.connectInject.cni.namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: cni -spec: - hard: - pods: {{ .Values.connectInject.cni.resourceQuota.pods | quote }} - scopeSelector: - matchExpressions: - - operator: In - scopeName: PriorityClass - values: - - system-node-critical -{{- end }} diff --git a/charts/consul/templates/cni-securitycontextconstraints.yaml b/charts/consul/templates/cni-securitycontextconstraints.yaml deleted file mode 100644 index cb60104..0000000 --- a/charts/consul/templates/cni-securitycontextconstraints.yaml +++ /dev/null @@ -1,55 +0,0 @@ -{{- if (and (.Values.connectInject.cni.enabled) (.Values.global.openshift.enabled)) }} -apiVersion: security.openshift.io/v1 -kind: SecurityContextConstraints -metadata: - name: {{ template "consul.fullname" . }}-cni - namespace: {{ default .Release.Namespace .Values.connectInject.cni.namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: cni - annotations: - kubernetes.io/description: {{ template "consul.fullname" . }}-cni are the security context constraints required - to run consul-cni. -# Iff. allowHostDirVolumePlugin is true, hostPath must be included in volumes (see below). -allowHostDirVolumePlugin: true -allowHostIPC: false -allowHostNetwork: false -allowHostPID: false -allowHostPorts: false -allowPrivilegeEscalation: true -allowPrivilegedContainer: true -allowedCapabilities: null -defaultAddCapabilities: null -fsGroup: - type: MustRunAs -groups: [] -priority: null -readOnlyRootFilesystem: false -requiredDropCapabilities: -- KILL -- MKNOD -- SETUID -- SETGID -runAsUser: - type: MustRunAsRange -seLinuxContext: - type: MustRunAs -supplementalGroups: - type: MustRunAs -users: [] -volumes: -# This list must be in alphabetical order to match the post-reconcile order enforced by OpenShift admission hooks. -# Furthermore, hostPath must be included explicitly if allowHostDirVolumePlugin is true, as it will otherwise be -# added by OpenShift. It must be excluded if allowHostDirVolumePlugin is false per OpenShift requirements. -# This avoids false positives in change detection by third-party diff tools (e.g. ArgoCD) that respect list order. -- configMap -- downwardAPI -- emptyDir -- hostPath -- persistentVolumeClaim -- projected -- secret -{{- end }} diff --git a/charts/consul/templates/cni-serviceaccount.yaml b/charts/consul/templates/cni-serviceaccount.yaml deleted file mode 100644 index cf4250b..0000000 --- a/charts/consul/templates/cni-serviceaccount.yaml +++ /dev/null @@ -1,19 +0,0 @@ -{{- if .Values.connectInject.cni.enabled }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "consul.fullname" . }}-cni - namespace: {{ default .Release.Namespace .Values.connectInject.cni.namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: cni -{{- with .Values.global.imagePullSecrets }} -imagePullSecrets: -{{- range . }} -- name: {{ .name }} -{{- end }} -{{- end }} -{{- end}} diff --git a/charts/consul/templates/connect-inject-clusterrole.yaml b/charts/consul/templates/connect-inject-clusterrole.yaml deleted file mode 100644 index 4e71a47..0000000 --- a/charts/consul/templates/connect-inject-clusterrole.yaml +++ /dev/null @@ -1,215 +0,0 @@ -{{- if or (and (ne (.Values.connectInject.enabled | toString) "-") .Values.connectInject.enabled) (and (eq (.Values.connectInject.enabled | toString) "-") .Values.global.enabled) }} -# The ClusterRole to enable the Connect injector to get, list, watch and patch MutatingWebhookConfiguration. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "consul.fullname" . }}-connect-injector - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: connect-injector -rules: -- apiGroups: - - consul.hashicorp.com - resources: - - servicedefaults - - serviceresolvers - - proxydefaults - - meshes - - exportedservices - - servicerouters - - servicesplitters - - serviceintentions - - ingressgateways - - terminatinggateways - - gatewayclassconfigs - - meshservices - - samenessgroups - - controlplanerequestlimits - - routeretryfilters - - routetimeoutfilters - - routeauthfilters - - gatewaypolicies - - registrations - {{- if .Values.global.peering.enabled }} - - peeringacceptors - - peeringdialers - {{- end }} - - jwtproviders - - routeauthfilters - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - consul.hashicorp.com - resources: - - servicedefaults/status - - serviceresolvers/status - - proxydefaults/status - - meshes/status - - exportedservices/status - - servicerouters/status - - servicesplitters/status - - serviceintentions/status - - ingressgateways/status - - terminatinggateways/status - - samenessgroups/status - - controlplanerequestlimits/status - - registrations/status - {{- if .Values.global.peering.enabled }} - - peeringacceptors/status - - peeringdialers/status - {{- end }} - - jwtproviders/status - - routeauthfilters/status - - gatewaypolicies/status - verbs: - - get - - patch - - update -- apiGroups: [""] - resources: ["secrets", "serviceaccounts", "services"] - verbs: - - get - - list - - watch - - delete - - create - - update -- apiGroups: [ "" ] - resources: ["endpoints", "namespaces", "nodes"] - verbs: - - get - - list - - watch -- apiGroups: [ "rbac.authorization.k8s.io" ] - resources: [ "roles", "rolebindings" ] - verbs: - - get - - list - - watch - - delete - - create - - update -- apiGroups: [ "" ] - resources: - - pods - verbs: - - "get" - - "list" - - "watch" - - "update" -- apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - create - - get - - list - - update -{{- if (and .Values.global.secretsBackend.vault.enabled .Values.global.secretsBackend.vault.connectInjectRole .Values.global.secretsBackend.vault.connectInject.tlsCert.secretName .Values.global.secretsBackend.vault.connectInject.caCert.secretName)}} -- apiGroups: - - admissionregistration.k8s.io - resources: - - mutatingwebhookconfigurations - - validatingwebhookconfigurations - verbs: - - get - - list - - watch - - patch -{{- end }} -{{- if .Values.global.peering.enabled }} -- apiGroups: [ "" ] - resources: [ "secrets" ] - verbs: - - "get" - - "list" - - "watch" - - "create" - - "update" - - "delete" -{{- end }} -- apiGroups: [ "policy" ] - resources: [ "podsecuritypolicies" ] - verbs: - - use -- apiGroups: - - gateway.networking.k8s.io - resources: - - gatewayclasses - - gateways - - httproutes - - tcproutes - - referencegrants - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - gateway.networking.k8s.io - resources: - - gatewayclasses/finalizers - - gateways/finalizers - - httproutes/finalizers - - tcproutes/finalizers - verbs: - - update -- apiGroups: - - gateway.networking.k8s.io - resources: - - gatewayclasses/status - - gateways/status - - httproutes/status - - tcproutes/status - verbs: - - get - - patch - - update -- apiGroups: - - apps - resources: - - deployments - verbs: - - create - - get - - list - - update - - watch - - delete -- apiGroups: - - core - resources: - - services - verbs: - - watch - - list -- apiGroups: [ "" ] - resources: [ "secrets" ] - verbs: - - "get" - - "list" - - "watch" -{{- if .Values.global.openshift.enabled }} -- apiGroups: - - security.openshift.io - resources: - - securitycontextconstraints - resourceNames: - - {{ .Values.connectInject.apiGateway.managedGatewayClass.openshiftSCCName }} - verbs: - - use - {{- end }} -{{- end }} diff --git a/charts/consul/templates/connect-inject-clusterrolebinding.yaml b/charts/consul/templates/connect-inject-clusterrolebinding.yaml deleted file mode 100644 index c380adb..0000000 --- a/charts/consul/templates/connect-inject-clusterrolebinding.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if or (and (ne (.Values.connectInject.enabled | toString) "-") .Values.connectInject.enabled) (and (eq (.Values.connectInject.enabled | toString) "-") .Values.global.enabled) }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "consul.fullname" . }}-connect-injector - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: connect-injector -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "consul.fullname" . }}-connect-injector -subjects: -- kind: ServiceAccount - name: {{ template "consul.fullname" . }}-connect-injector - namespace: {{ .Release.Namespace }} -{{- end }} \ No newline at end of file diff --git a/charts/consul/templates/connect-inject-configmap.yaml b/charts/consul/templates/connect-inject-configmap.yaml deleted file mode 100644 index 98a7dae..0000000 --- a/charts/consul/templates/connect-inject-configmap.yaml +++ /dev/null @@ -1,18 +0,0 @@ -{{- if .Values.connectInject.enabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ template "consul.fullname" . }}-connect-inject-config - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: connect-injector -data: - config.json: | - { - "image_pull_secrets": {{ .Values.global.imagePullSecrets | toJson }} - } -{{- end }} diff --git a/charts/consul/templates/connect-inject-deployment.yaml b/charts/consul/templates/connect-inject-deployment.yaml deleted file mode 100644 index 8eebcfe..0000000 --- a/charts/consul/templates/connect-inject-deployment.yaml +++ /dev/null @@ -1,371 +0,0 @@ -{{- if and .Values.global.peering.enabled (not .Values.connectInject.enabled) }}{{ fail "setting global.peering.enabled to true requires connectInject.enabled to be true" }}{{ end }} -{{- if and .Values.global.peering.enabled (not .Values.global.tls.enabled) }}{{ fail "setting global.peering.enabled to true requires global.tls.enabled to be true" }}{{ end }} -{{- if and .Values.global.peering.enabled (not .Values.meshGateway.enabled) }}{{ fail "setting global.peering.enabled to true requires meshGateway.enabled to be true" }}{{ end }} -{{- if (or (and (ne (.Values.connectInject.enabled | toString) "-") .Values.connectInject.enabled) (and (eq (.Values.connectInject.enabled | toString) "-") .Values.global.enabled)) }} -{{- if and .Values.global.adminPartitions.enabled (not .Values.global.enableConsulNamespaces) }}{{ fail "global.enableConsulNamespaces must be true if global.adminPartitions.enabled=true" }}{{ end }} -{{ template "consul.validateVaultWebhookCertConfiguration" . }} -{{- template "consul.reservedNamesFailer" (list .Values.connectInject.consulNamespaces.consulDestinationNamespace "connectInject.consulNamespaces.consulDestinationNamespace") }} -{{- if and .Values.externalServers.enabled (not .Values.externalServers.hosts) }}{{ fail "externalServers.hosts must be set if externalServers.enabled is true" }}{{ end -}} -{{- if and .Values.externalServers.enabled .Values.global.cloud.enabled }} - {{- if and (gt (len .Values.externalServers.hosts) 0) (regexMatch ".+.hashicorp.cloud$" ( first .Values.externalServers.hosts )) }}{{fail "global.cloud.enabled cannot be used in combination with an HCP-managed cluster address in externalServers.hosts. global.cloud.enabled is for linked self-managed clusters."}}{{- end }} -{{- end }} -{{- if and .Values.externalServers.skipServerWatch (not .Values.externalServers.enabled) }}{{ fail "externalServers.enabled must be set if externalServers.skipServerWatch is true" }}{{ end -}} -{{- $dnsEnabled := (or (and (ne (.Values.dns.enabled | toString) "-") .Values.dns.enabled) (and (eq (.Values.dns.enabled | toString) "-") .Values.connectInject.transparentProxy.defaultEnabled)) -}} -{{- $dnsRedirectionEnabled := (or (and (ne (.Values.dns.enableRedirection | toString) "-") .Values.dns.enableRedirection) (and (eq (.Values.dns.enableRedirection | toString) "-") .Values.connectInject.transparentProxy.defaultEnabled)) -}} -{{ template "consul.validateRequiredCloudSecretsExist" . }} -{{ template "consul.validateCloudSecretKeys" . }} -# The deployment for running the Connect sidecar injector -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "consul.fullname" . }}-connect-injector - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: connect-injector - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 4 }} - {{- end }} -spec: - replicas: {{ .Values.connectInject.replicas }} - selector: - matchLabels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - release: {{ .Release.Name }} - component: connect-injector - template: - metadata: - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - release: {{ .Release.Name }} - component: connect-injector - {{- if .Values.connectInject.extraLabels }} - {{- toYaml .Values.connectInject.extraLabels | nindent 8 }} - {{- end }} - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 8 }} - {{- end }} - annotations: - "consul.hashicorp.com/connect-inject": "false" - "consul.hashicorp.com/mesh-inject": "false" - {{- if .Values.connectInject.annotations }} - {{- tpl .Values.connectInject.annotations . | nindent 8 }} - {{- end }} - {{- if (and .Values.global.secretsBackend.vault.enabled .Values.global.tls.enabled) }} - "vault.hashicorp.com/agent-init-first": "true" - "vault.hashicorp.com/agent-inject": "true" - {{- if .Values.global.secretsBackend.vault.connectInjectRole }} - "vault.hashicorp.com/role": {{ .Values.global.secretsBackend.vault.connectInjectRole }} - {{ else }} - "vault.hashicorp.com/role": {{ .Values.global.secretsBackend.vault.consulCARole }} - {{ end }} - "vault.hashicorp.com/agent-inject-secret-serverca.crt": {{ .Values.global.tls.caCert.secretName }} - "vault.hashicorp.com/agent-inject-template-serverca.crt": {{ template "consul.serverTLSCATemplate" . }} - {{- if .Values.global.secretsBackend.vault.connectInject.caCert.secretName }} - {{- with .Values.global.secretsBackend.vault.connectInject.caCert }} - "vault.hashicorp.com/agent-inject-secret-ca.crt": {{ .secretName }} - "vault.hashicorp.com/agent-inject-template-ca.crt": {{ template "consul.vaultCATemplate" . }} - "vault.hashicorp.com/secret-volume-path-ca.crt": "/vault/secrets/connect-injector/certs" - {{- end }} - {{- end }} - {{- if .Values.global.secretsBackend.vault.connectInject.tlsCert.secretName }} - "vault.hashicorp.com/agent-inject-secret-tls.crt": {{ .Values.global.secretsBackend.vault.connectInject.tlsCert.secretName }} - "vault.hashicorp.com/agent-inject-template-tls.crt": {{ include "consul.connectInjectWebhookTLSCertTemplate" . }} - "vault.hashicorp.com/secret-volume-path-tls.crt": "/vault/secrets/connect-injector/certs" - "vault.hashicorp.com/agent-inject-secret-tls.key": {{ .Values.global.secretsBackend.vault.connectInject.tlsCert.secretName }} - "vault.hashicorp.com/agent-inject-template-tls.key": {{ include "consul.connectInjectWebhookTLSKeyTemplate" . }} - "vault.hashicorp.com/secret-volume-path-tls.key": "/vault/secrets/connect-injector/certs" - {{- end }} - {{- if and .Values.global.secretsBackend.vault.ca.secretName .Values.global.secretsBackend.vault.ca.secretKey }} - "vault.hashicorp.com/agent-extra-secret": "{{ .Values.global.secretsBackend.vault.ca.secretName }}" - "vault.hashicorp.com/ca-cert": "/vault/custom/{{ .Values.global.secretsBackend.vault.ca.secretKey }}" - {{- end }} - {{- if .Values.global.secretsBackend.vault.agentAnnotations }} - {{ tpl .Values.global.secretsBackend.vault.agentAnnotations . | nindent 8 | trim }} - {{- end }} - {{- if (and (.Values.global.secretsBackend.vault.vaultNamespace) (not (hasKey (default "" .Values.global.secretsBackend.vault.agentAnnotations | fromYaml) "vault.hashicorp.com/namespace")))}} - "vault.hashicorp.com/namespace": "{{ .Values.global.secretsBackend.vault.vaultNamespace }}" - {{- end }} - {{- end }} - spec: - serviceAccountName: {{ template "consul.fullname" . }}-connect-injector - containers: - - name: sidecar-injector - image: "{{ default .Values.global.imageK8S .Values.connectInject.image }}" - {{ template "consul.imagePullPolicy" . }} - ports: - - containerPort: 8080 - name: webhook-server - protocol: TCP - {{- include "consul.restrictedSecurityContext" . | nindent 10 }} - env: - - name: NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - {{- include "consul.consulK8sConsulServerEnvVars" . | nindent 12 }} - {{- if .Values.global.acls.manageSystemACLs }} - - name: CONSUL_LOGIN_AUTH_METHOD - {{- if and .Values.global.federation.enabled .Values.global.federation.primaryDatacenter }} - value: {{ template "consul.fullname" . }}-k8s-component-auth-method-{{ .Values.global.datacenter }} - {{- else }} - value: {{ template "consul.fullname" . }}-k8s-component-auth-method - {{- end }} - - name: CONSUL_LOGIN_DATACENTER - {{- if and .Values.global.federation.enabled .Values.global.federation.primaryDatacenter }} - value: {{ .Values.global.federation.primaryDatacenter }} - {{- else }} - value: {{ .Values.global.datacenter }} - {{- end }} - - name: CONSUL_LOGIN_META - value: "component=connect-injector,pod=$(NAMESPACE)/$(POD_NAME)" - {{- end }} - {{- if (and .Values.connectInject.aclInjectToken.secretName .Values.connectInject.aclInjectToken.secretKey) }} - - name: CONSUL_ACL_TOKEN - valueFrom: - secretKeyRef: - name: {{ .Values.connectInject.aclInjectToken.secretName }} - key: {{ .Values.connectInject.aclInjectToken.secretKey }} - {{- end }} - command: - - "/bin/sh" - - "-ec" - - | - exec consul-k8s-control-plane inject-connect \ - -config-file=/consul/config/config.json \ - {{- if .Values.global.federation.enabled }} - -enable-federation \ - {{- end }} - -log-level={{ default .Values.global.logLevel .Values.connectInject.logLevel }} \ - -log-json={{ .Values.global.logJSON }} \ - -default-inject={{ .Values.connectInject.default }} \ - -consul-image="{{ default .Values.global.image .Values.connectInject.imageConsul }}" \ - -consul-dataplane-image="{{ .Values.global.imageConsulDataplane }}" \ - -consul-k8s-image="{{ default .Values.global.imageK8S .Values.connectInject.image }}" \ - -release-name="{{ .Release.Name }}" \ - -release-namespace="{{ .Release.Namespace }}" \ - -resource-prefix={{ template "consul.fullname" . }} \ - -listen=:8080 \ - {{- range $k, $v := .Values.connectInject.consulNode.meta }} - -node-meta={{ $k }}={{ $v }} \ - {{- end }} - {{- if .Values.connectInject.transparentProxy.defaultEnabled }} - -default-enable-transparent-proxy=true \ - {{- else }} - -default-enable-transparent-proxy=false \ - {{- end }} - -enable-cni={{ .Values.connectInject.cni.enabled }} \ - {{- if .Values.global.peering.enabled }} - -enable-peering=true \ - {{- end }} - {{- if .Values.global.openshift.enabled }} - -enable-openshift \ - {{- end }} - {{- if .Values.connectInject.transparentProxy.defaultOverwriteProbes }} - -transparent-proxy-default-overwrite-probes=true \ - {{- else }} - -transparent-proxy-default-overwrite-probes=false \ - {{- end }} - {{- if (and $dnsEnabled $dnsRedirectionEnabled) }} - -enable-consul-dns=true \ - {{- end }} - {{- if .Values.global.openshift.enabled }} - -enable-openshift \ - {{- end }} - {{- if (or (and (ne (.Values.connectInject.metrics.defaultEnabled | toString) "-") .Values.connectInject.metrics.defaultEnabled) (and (eq (.Values.connectInject.metrics.defaultEnabled | toString) "-") .Values.global.metrics.enabled)) }} - -default-enable-metrics=true \ - {{- else }} - -default-enable-metrics=false \ - {{- end }} - -enable-gateway-metrics={{ .Values.global.metrics.enableGatewayMetrics }} \ - -default-enable-metrics-merging={{ .Values.connectInject.metrics.defaultEnableMerging }} \ - -default-merged-metrics-port={{ .Values.connectInject.metrics.defaultMergedMetricsPort }} \ - -default-prometheus-scrape-port={{ .Values.connectInject.metrics.defaultPrometheusScrapePort }} \ - -default-prometheus-scrape-path="{{ .Values.connectInject.metrics.defaultPrometheusScrapePath }}" \ - {{- if .Values.connectInject.envoyExtraArgs }} - -envoy-extra-args="{{ .Values.connectInject.envoyExtraArgs }}" \ - {{- end }} - {{- if .Values.connectInject.overrideAuthMethodName }} - -acl-auth-method="{{ .Values.connectInject.overrideAuthMethodName }}" \ - {{- else if .Values.global.acls.manageSystemACLs }} - -acl-auth-method="{{ template "consul.fullname" . }}-k8s-auth-method" \ - {{- end }} - {{- range $value := .Values.connectInject.k8sAllowNamespaces }} - -allow-k8s-namespace="{{ $value }}" \ - {{- end }} - {{- range $value := .Values.connectInject.k8sDenyNamespaces }} - -deny-k8s-namespace="{{ $value }}" \ - {{- end }} - {{- if .Values.global.adminPartitions.enabled }} - -enable-partitions=true \ - {{- end }} - {{- if .Values.global.enableConsulNamespaces }} - -enable-namespaces=true \ - {{- if .Values.connectInject.consulNamespaces.consulDestinationNamespace }} - -consul-destination-namespace={{ .Values.connectInject.consulNamespaces.consulDestinationNamespace }} \ - {{- end }} - {{- if and .Values.global.enableConsulNamespaces .Values.connectInject.consulNamespaces.mirroringK8S }} - -enable-k8s-namespace-mirroring=true \ - {{- if .Values.connectInject.consulNamespaces.mirroringK8SPrefix }} - -k8s-namespace-mirroring-prefix={{ .Values.connectInject.consulNamespaces.mirroringK8SPrefix }} \ - {{- end }} - {{- end }} - {{- if .Values.global.acls.manageSystemACLs }} - -consul-cross-namespace-acl-policy=cross-namespace-policy \ - {{- end }} - {{- end }} - {{- if and .Values.global.secretsBackend.vault.enabled .Values.global.secretsBackend.vault.connectInject.tlsCert.secretName }} - -tls-cert-dir=/vault/secrets/connect-injector/certs \ - -enable-webhook-ca-update \ - {{- else }} - -tls-cert-dir=/etc/connect-injector/certs \ - {{- end }} - {{- $resources := .Values.connectInject.sidecarProxy.resources }} - {{- /* kindIs is used here to differentiate between null and 0 */}} - {{- if not (kindIs "invalid" $resources.limits.memory) }} - -default-sidecar-proxy-memory-limit={{ $resources.limits.memory }} \ - {{- end }} - {{- if not (kindIs "invalid" $resources.requests.memory) }} - -default-sidecar-proxy-memory-request={{ $resources.requests.memory }} \ - {{- end }} - {{- if not (kindIs "invalid" $resources.limits.cpu) }} - -default-sidecar-proxy-cpu-limit={{ $resources.limits.cpu }} \ - {{- end }} - {{- if not (kindIs "invalid" $resources.requests.cpu) }} - -default-sidecar-proxy-cpu-request={{ $resources.requests.cpu }} \ - {{- end }} - -default-envoy-proxy-concurrency={{ .Values.connectInject.sidecarProxy.concurrency }} \ - {{- if .Values.connectInject.sidecarProxy.lifecycle.defaultEnabled }} - -default-enable-sidecar-proxy-lifecycle=true \ - {{- else }} - -default-enable-sidecar-proxy-lifecycle=false \ - {{- end }} - {{- if .Values.connectInject.sidecarProxy.lifecycle.defaultEnableShutdownDrainListeners }} - -default-enable-sidecar-proxy-lifecycle-shutdown-drain-listeners=true \ - {{- else }} - -default-enable-sidecar-proxy-lifecycle-shutdown-drain-listeners=false \ - {{- end }} - -default-sidecar-proxy-lifecycle-shutdown-grace-period-seconds={{ .Values.connectInject.sidecarProxy.lifecycle.defaultShutdownGracePeriodSeconds }} \ - -default-sidecar-proxy-lifecycle-startup-grace-period-seconds={{ .Values.connectInject.sidecarProxy.lifecycle.defaultStartupGracePeriodSeconds }} \ - -default-sidecar-proxy-lifecycle-graceful-port={{ .Values.connectInject.sidecarProxy.lifecycle.defaultGracefulPort }} \ - -default-sidecar-proxy-lifecycle-graceful-shutdown-path="{{ .Values.connectInject.sidecarProxy.lifecycle.defaultGracefulShutdownPath }}" \ - -default-sidecar-proxy-lifecycle-graceful-startup-path="{{ .Values.connectInject.sidecarProxy.lifecycle.defaultGracefulStartupPath }}" \ - -default-sidecar-proxy-startup-failure-seconds={{ .Values.connectInject.sidecarProxy.defaultStartupFailureSeconds }} \ - -default-sidecar-proxy-liveness-failure-seconds={{ .Values.connectInject.sidecarProxy.defaultLivenessFailureSeconds }} \ - {{- if .Values.connectInject.initContainer }} - {{- $initResources := .Values.connectInject.initContainer.resources }} - {{- if not (kindIs "invalid" $initResources.limits.memory) }} - -init-container-memory-limit={{ $initResources.limits.memory }} \ - {{- end }} - {{- if not (kindIs "invalid" $initResources.requests.memory) }} - -init-container-memory-request={{ $initResources.requests.memory }} \ - {{- end }} - {{- if not (kindIs "invalid" $initResources.limits.cpu) }} - -init-container-cpu-limit={{ $initResources.limits.cpu }} \ - {{- end }} - {{- if not (kindIs "invalid" $initResources.requests.cpu) }} - -init-container-cpu-request={{ $initResources.requests.cpu }} \ - {{- end }} - {{- end }} - - {{- if .Values.global.cloud.enabled }} - -tls-server-name=server.{{ .Values.global.datacenter}}.{{ .Values.global.domain}} \ - {{- end }} - {{- if and .Values.global.tls.enabled .Values.global.tls.enableAutoEncrypt }} - -enable-auto-encrypt \ - {{- end }} - -enable-telemetry-collector={{ .Values.global.metrics.enableTelemetryCollector}} \ - startupProbe: - httpGet: - path: /readyz/ready - port: 9445 - scheme: HTTP - initialDelaySeconds: 30 - failureThreshold: 15 - periodSeconds: 2 - timeoutSeconds: 5 - livenessProbe: - httpGet: - path: /readyz/ready - port: 9445 - scheme: HTTP - failureThreshold: 2 - initialDelaySeconds: 1 - successThreshold: 1 - timeoutSeconds: 5 - readinessProbe: - httpGet: - path: /readyz/ready - port: 9445 - scheme: HTTP - failureThreshold: 2 - initialDelaySeconds: 2 - successThreshold: 1 - timeoutSeconds: 5 - volumeMounts: - - name: config - mountPath: /consul/config - readOnly: true - {{- if not (and .Values.global.secretsBackend.vault.enabled .Values.global.secretsBackend.vault.connectInject.tlsCert.secretName) }} - - name: certs - mountPath: /etc/connect-injector/certs - readOnly: true - {{- end }} - {{- if and .Values.global.tls.enabled (not (or (and .Values.externalServers.enabled .Values.externalServers.useSystemRoots) .Values.global.secretsBackend.vault.enabled))}} - - name: consul-ca-cert - mountPath: /consul/tls/ca - readOnly: true - {{- end }} - {{- with .Values.connectInject.resources }} - resources: - {{- toYaml . | nindent 12 }} - {{- end }} - volumes: - - name: config - configMap: - name: {{ template "consul.fullname" . }}-connect-inject-config - {{- if not (and .Values.global.secretsBackend.vault.enabled .Values.global.secretsBackend.vault.connectInject.tlsCert.secretName) }} - - name: certs - secret: - defaultMode: 420 - secretName: {{ template "consul.fullname" . }}-connect-inject-webhook-cert - {{- end }} - {{- if .Values.global.tls.enabled }} - {{- if not (or (and .Values.externalServers.enabled .Values.externalServers.useSystemRoots) .Values.global.secretsBackend.vault.enabled) }} - - name: consul-ca-cert - secret: - {{- if .Values.global.tls.caCert.secretName }} - secretName: {{ .Values.global.tls.caCert.secretName }} - {{- else }} - secretName: {{ template "consul.fullname" . }}-ca-cert - {{- end }} - items: - - key: {{ default "tls.crt" .Values.global.tls.caCert.secretKey }} - path: tls.crt - {{- end }} - {{- end }} - {{- if .Values.connectInject.priorityClassName }} - priorityClassName: {{ .Values.connectInject.priorityClassName | quote }} - {{- end }} - {{- if .Values.connectInject.nodeSelector }} - nodeSelector: - {{ tpl .Values.connectInject.nodeSelector . | indent 8 | trim }} - {{- end }} - {{- if .Values.connectInject.affinity }} - affinity: - {{ tpl .Values.connectInject.affinity . | indent 8 | trim }} - {{- end }} - {{- if .Values.connectInject.tolerations }} - tolerations: - {{ tpl .Values.connectInject.tolerations . | indent 8 | trim }} - {{- end }} -{{- end }} diff --git a/charts/consul/templates/connect-inject-leader-election-role.yaml b/charts/consul/templates/connect-inject-leader-election-role.yaml deleted file mode 100644 index 703aaff..0000000 --- a/charts/consul/templates/connect-inject-leader-election-role.yaml +++ /dev/null @@ -1,41 +0,0 @@ -{{- if or (and (ne (.Values.connectInject.enabled | toString) "-") .Values.connectInject.enabled) (and (eq (.Values.connectInject.enabled | toString) "-") .Values.global.enabled) }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: {{ template "consul.fullname" . }}-connect-inject-leader-election - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: connect-injector -rules: -- apiGroups: - - "" - resources: - - configmaps - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -- apiGroups: - - "" - resources: - - configmaps/status - verbs: - - get - - update - - patch -- apiGroups: - - "" - resources: - - events - verbs: - - create - - patch -{{- end }} diff --git a/charts/consul/templates/connect-inject-leader-election-rolebinding.yaml b/charts/consul/templates/connect-inject-leader-election-rolebinding.yaml deleted file mode 100644 index 9a27d3c..0000000 --- a/charts/consul/templates/connect-inject-leader-election-rolebinding.yaml +++ /dev/null @@ -1,21 +0,0 @@ -{{- if or (and (ne (.Values.connectInject.enabled | toString) "-") .Values.connectInject.enabled) (and (eq (.Values.connectInject.enabled | toString) "-") .Values.global.enabled) }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: {{ template "consul.fullname" . }}-connect-inject-leader-election - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: connect-injector -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: {{ template "consul.fullname" . }}-connect-inject-leader-election -subjects: -- kind: ServiceAccount - name: {{ template "consul.fullname" . }}-connect-injector - namespace: {{ .Release.Namespace }} -{{- end }} diff --git a/charts/consul/templates/connect-inject-mutatingwebhookconfiguration.yaml b/charts/consul/templates/connect-inject-mutatingwebhookconfiguration.yaml deleted file mode 100644 index e4fe79f..0000000 --- a/charts/consul/templates/connect-inject-mutatingwebhookconfiguration.yaml +++ /dev/null @@ -1,358 +0,0 @@ -{{- if (or (and (ne (.Values.connectInject.enabled | toString) "-") .Values.connectInject.enabled) (and (eq (.Values.connectInject.enabled | toString) "-") .Values.global.enabled)) }} -# The MutatingWebhookConfiguration to enable the Connect injector. -apiVersion: admissionregistration.k8s.io/v1 -kind: MutatingWebhookConfiguration -metadata: - name: {{ template "consul.fullname" . }}-connect-injector - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: connect-injector -webhooks: -- clientConfig: - service: - name: {{ template "consul.fullname" . }}-connect-injector - namespace: {{ .Release.Namespace }} - path: /mutate-v1alpha1-proxydefaults - failurePolicy: Fail - admissionReviewVersions: - - "v1beta1" - - "v1" - name: mutate-proxydefaults.consul.hashicorp.com - rules: - - apiGroups: - - consul.hashicorp.com - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - resources: - - proxydefaults - sideEffects: None -- clientConfig: - service: - name: {{ template "consul.fullname" . }}-connect-injector - namespace: {{ .Release.Namespace }} - path: /mutate-v1alpha1-mesh - failurePolicy: Fail - admissionReviewVersions: - - "v1beta1" - - "v1" - name: mutate-mesh.consul.hashicorp.com - rules: - - apiGroups: - - consul.hashicorp.com - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - resources: - - meshes - sideEffects: None -- clientConfig: - service: - name: {{ template "consul.fullname" . }}-connect-injector - namespace: {{ .Release.Namespace }} - path: /mutate-v1alpha1-servicedefaults - failurePolicy: Fail - admissionReviewVersions: - - "v1beta1" - - "v1" - name: mutate-servicedefaults.consul.hashicorp.com - rules: - - apiGroups: - - consul.hashicorp.com - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - resources: - - servicedefaults - sideEffects: None -- clientConfig: - service: - name: {{ template "consul.fullname" . }}-connect-injector - namespace: {{ .Release.Namespace }} - path: /mutate-v1alpha1-serviceresolver - failurePolicy: Fail - admissionReviewVersions: - - "v1beta1" - - "v1" - name: mutate-serviceresolver.consul.hashicorp.com - rules: - - apiGroups: - - consul.hashicorp.com - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - resources: - - serviceresolvers - sideEffects: None -- clientConfig: - service: - name: {{ template "consul.fullname" . }}-connect-injector - namespace: {{ .Release.Namespace }} - path: /mutate-v1alpha1-servicerouter - failurePolicy: Fail - admissionReviewVersions: - - "v1beta1" - - "v1" - name: mutate-servicerouter.consul.hashicorp.com - rules: - - apiGroups: - - consul.hashicorp.com - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - resources: - - servicerouters - sideEffects: None -- clientConfig: - service: - name: {{ template "consul.fullname" . }}-connect-injector - namespace: {{ .Release.Namespace }} - path: /mutate-v1alpha1-servicesplitter - failurePolicy: Fail - admissionReviewVersions: - - "v1beta1" - - "v1" - name: mutate-servicesplitter.consul.hashicorp.com - rules: - - apiGroups: - - consul.hashicorp.com - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - resources: - - servicesplitters - sideEffects: None -- clientConfig: - service: - name: {{ template "consul.fullname" . }}-connect-injector - namespace: {{ .Release.Namespace }} - path: /mutate-v1alpha1-serviceintentions - failurePolicy: Fail - admissionReviewVersions: - - "v1beta1" - - "v1" - name: mutate-serviceintentions.consul.hashicorp.com - rules: - - apiGroups: - - consul.hashicorp.com - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - resources: - - serviceintentions - sideEffects: None -- clientConfig: - service: - name: {{ template "consul.fullname" . }}-connect-injector - namespace: {{ .Release.Namespace }} - path: /mutate-v1alpha1-ingressgateway - failurePolicy: Fail - admissionReviewVersions: - - "v1beta1" - - "v1" - name: mutate-ingressgateway.consul.hashicorp.com - rules: - - apiGroups: - - consul.hashicorp.com - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - resources: - - ingressgateways - sideEffects: None -- clientConfig: - service: - name: {{ template "consul.fullname" . }}-connect-injector - namespace: {{ .Release.Namespace }} - path: /mutate-v1alpha1-terminatinggateway - failurePolicy: Fail - admissionReviewVersions: - - "v1beta1" - - "v1" - name: mutate-terminatinggateway.consul.hashicorp.com - rules: - - apiGroups: - - consul.hashicorp.com - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - resources: - - terminatinggateways - sideEffects: None -- clientConfig: - service: - name: {{ template "consul.fullname" . }}-connect-injector - namespace: {{ .Release.Namespace }} - path: /mutate-v1alpha1-exportedservices - failurePolicy: Fail - admissionReviewVersions: - - "v1beta1" - - "v1" - name: mutate-exportedservices.consul.hashicorp.com - rules: - - apiGroups: - - consul.hashicorp.com - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - resources: - - exportedservices - sideEffects: None -- clientConfig: - service: - name: {{ template "consul.fullname" . }}-connect-injector - namespace: {{ .Release.Namespace }} - path: /mutate-v1alpha1-controlplanerequestlimits - failurePolicy: Fail - admissionReviewVersions: - - "v1beta1" - - "v1" - name: mutate-controlplanerequestlimit.consul.hashicorp.com - rules: - - apiGroups: - - consul.hashicorp.com - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - resources: - - controlplanerequestlimits - sideEffects: None -- name: {{ template "consul.fullname" . }}-connect-injector.consul.hashicorp.com - # The webhook will fail scheduling all pods that are not part of consul if all replicas of the webhook are unhealthy. - objectSelector: - matchExpressions: - - key: app - operator: NotIn - values: [ {{ template "consul.name" . }} ] - failurePolicy: {{ .Values.connectInject.failurePolicy }} - sideEffects: None - admissionReviewVersions: - - "v1beta1" - - "v1" - clientConfig: - service: - name: {{ template "consul.fullname" . }}-connect-injector - namespace: {{ .Release.Namespace }} - path: "/mutate" - rules: - - operations: [ "CREATE" ] - apiGroups: [ "" ] - apiVersions: [ "v1" ] - resources: [ "pods" ] -{{- if .Values.connectInject.namespaceSelector }} - namespaceSelector: -{{ tpl .Values.connectInject.namespaceSelector . | indent 6 }} -{{- end }} -{{- if .Values.global.peering.enabled }} -- name: {{ template "consul.fullname" . }}-mutate-peeringacceptors.consul.hashicorp.com - clientConfig: - service: - name: {{ template "consul.fullname" . }}-connect-injector - namespace: {{ .Release.Namespace }} - path: "/mutate-v1alpha1-peeringacceptors" - rules: - - apiGroups: - - consul.hashicorp.com - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - resources: - - peeringacceptors - failurePolicy: Fail - sideEffects: None - admissionReviewVersions: - - "v1beta1" - - "v1" -- name: {{ template "consul.fullname" . }}-mutate-peeringdialers.consul.hashicorp.com - clientConfig: - service: - name: {{ template "consul.fullname" . }}-connect-injector - namespace: {{ .Release.Namespace }} - path: "/mutate-v1alpha1-peeringdialers" - rules: - - apiGroups: - - consul.hashicorp.com - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - resources: - - peeringdialers - failurePolicy: Fail - sideEffects: None - admissionReviewVersions: - - "v1beta1" - - "v1" -- admissionReviewVersions: - - v1beta1 - - v1 - clientConfig: - service: - name: {{ template "consul.fullname" . }}-connect-injector - namespace: {{ .Release.Namespace }} - path: /mutate-v1alpha1-samenessgroup - failurePolicy: Fail - name: mutate-samenessgroup.consul.hashicorp.com - rules: - - apiGroups: - - consul.hashicorp.com - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - resources: - - samenessgroups - sideEffects: None -{{- end }} -- admissionReviewVersions: - - v1beta1 - - v1 - clientConfig: - service: - name: {{ template "consul.fullname" . }}-connect-injector - namespace: {{ .Release.Namespace }} - path: /mutate-v1alpha1-jwtprovider - failurePolicy: Fail - name: mutate-jwtprovider.consul.hashicorp.com - rules: - - apiGroups: - - consul.hashicorp.com - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - resources: - - jwtproviders - sideEffects: None -{{- end }} diff --git a/charts/consul/templates/connect-inject-podsecuritypolicy.yaml b/charts/consul/templates/connect-inject-podsecuritypolicy.yaml deleted file mode 100644 index 0fafef7..0000000 --- a/charts/consul/templates/connect-inject-podsecuritypolicy.yaml +++ /dev/null @@ -1,40 +0,0 @@ -{{- if (and .Values.global.enablePodSecurityPolicies (or (and (ne (.Values.connectInject.enabled | toString) "-") .Values.connectInject.enabled) (and (eq (.Values.connectInject.enabled | toString) "-") .Values.global.enabled))) }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "consul.fullname" . }}-connect-injector - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: connect-injector -spec: - privileged: false - # Required to prevent escalations to root. - allowPrivilegeEscalation: false - # This is redundant with non-root + disallow privilege escalation, - # but we can provide it for defense in depth. - requiredDropCapabilities: - - ALL - # Allow core volume types. - volumes: - - 'configMap' - - 'emptyDir' - - 'projected' - - 'secret' - - 'downwardAPI' - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'RunAsAny' - fsGroup: - rule: 'RunAsAny' - readOnlyRootFilesystem: false -{{- end }} diff --git a/charts/consul/templates/connect-inject-service.yaml b/charts/consul/templates/connect-inject-service.yaml deleted file mode 100644 index b0284af..0000000 --- a/charts/consul/templates/connect-inject-service.yaml +++ /dev/null @@ -1,23 +0,0 @@ -{{- if (or (and (ne (.Values.connectInject.enabled | toString) "-") .Values.connectInject.enabled) (and (eq (.Values.connectInject.enabled | toString) "-") .Values.global.enabled)) }} -# The service for the Connect sidecar injector -apiVersion: v1 -kind: Service -metadata: - name: {{ template "consul.fullname" . }}-connect-injector - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: connect-injector -spec: - ports: - - port: 443 - targetPort: 8080 - selector: - app: {{ template "consul.name" . }} - release: "{{ .Release.Name }}" - component: connect-injector -{{- end }} - diff --git a/charts/consul/templates/connect-inject-serviceaccount.yaml b/charts/consul/templates/connect-inject-serviceaccount.yaml deleted file mode 100644 index ea2352c..0000000 --- a/charts/consul/templates/connect-inject-serviceaccount.yaml +++ /dev/null @@ -1,23 +0,0 @@ -{{- if or (and (ne (.Values.connectInject.enabled | toString) "-") .Values.connectInject.enabled) (and (eq (.Values.connectInject.enabled | toString) "-") .Values.global.enabled) }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "consul.fullname" . }}-connect-injector - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: connect-injector - {{- if .Values.connectInject.serviceAccount.annotations }} - annotations: - {{ tpl .Values.connectInject.serviceAccount.annotations . | nindent 4 | trim }} - {{- end }} -{{- with .Values.global.imagePullSecrets }} -imagePullSecrets: -{{- range . }} -- name: {{ .name }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/consul/templates/connect-inject-validatingwebhookconfiguration.yaml b/charts/consul/templates/connect-inject-validatingwebhookconfiguration.yaml deleted file mode 100644 index 92068bb..0000000 --- a/charts/consul/templates/connect-inject-validatingwebhookconfiguration.yaml +++ /dev/null @@ -1,47 +0,0 @@ -{{- if (or (and (ne (.Values.connectInject.enabled | toString) "-") .Values.connectInject.enabled) (and (eq (.Values.connectInject.enabled | toString) "-") .Values.global.enabled)) }} -# The ValidatingWebhookConfiguration to enable the Connect injector. -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingWebhookConfiguration -metadata: - name: {{ template "consul.fullname" . }}-connect-injector - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: connect-injector -webhooks: -- name: validate-gatewaypolicy.consul.hashicorp.com - matchPolicy: Equivalent - rules: - - operations: [ "CREATE" , "UPDATE" ] - apiGroups: [ "consul.hashicorp.com" ] - apiVersions: [ "v1alpha1" ] - resources: [ "gatewaypolicies" ] - failurePolicy: Fail - sideEffects: None - admissionReviewVersions: - - v1 - clientConfig: - service: - name: {{ template "consul.fullname" . }}-connect-injector - namespace: {{ .Release.Namespace }} - path: /validate-v1alpha1-gatewaypolicy -- name: validate-registration.consul.hashicorp.com - matchPolicy: Equivalent - rules: - - operations: [ "CREATE" , "UPDATE" ] - apiGroups: [ "consul.hashicorp.com" ] - apiVersions: [ "v1alpha1" ] - resources: [ "registrations" ] - failurePolicy: Fail - sideEffects: None - admissionReviewVersions: - - v1 - clientConfig: - service: - name: {{ template "consul.fullname" . }}-connect-injector - namespace: {{ .Release.Namespace }} - path: /validate-v1alpha1-registration -{{- end }} diff --git a/charts/consul/templates/connect-injector-disruptionbudget.yaml b/charts/consul/templates/connect-injector-disruptionbudget.yaml deleted file mode 100644 index 9b9cf2e..0000000 --- a/charts/consul/templates/connect-injector-disruptionbudget.yaml +++ /dev/null @@ -1,30 +0,0 @@ -{{- if (and .Values.connectInject.disruptionBudget.enabled (or (and (ne (.Values.connectInject.enabled | toString) "-") .Values.connectInject.enabled) (and (eq (.Values.connectInject.enabled | toString) "-") .Values.global.enabled))) }} -# PodDisruptionBudget to prevent degrading the connectInject cluster through -# voluntary cluster changes. -{{- if .Capabilities.APIVersions.Has "policy/v1/PodDisruptionBudget" }} -apiVersion: policy/v1 -{{- else }} -apiVersion: policy/v1beta1 -{{- end }} -kind: PodDisruptionBudget -metadata: - name: {{ template "consul.fullname" . }}-connect-injector - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: connect-injector -spec: - {{- if .Values.connectInject.disruptionBudget.minAvailable }} - minAvailable: {{ .Values.connectInject.disruptionBudget.minAvailable }} - {{- else }} - maxUnavailable: {{ template "consul.pdb.connectInject.maxUnavailable" . }} - {{- end }} - selector: - matchLabels: - app: {{ template "consul.name" . }} - release: "{{ .Release.Name }}" - component: connect-injector -{{- end }} diff --git a/charts/consul/templates/crd-controlplanerequestlimits.yaml b/charts/consul/templates/crd-controlplanerequestlimits.yaml deleted file mode 100644 index 4e11ceb..0000000 --- a/charts/consul/templates/crd-controlplanerequestlimits.yaml +++ /dev/null @@ -1,201 +0,0 @@ -{{- if .Values.connectInject.enabled }} -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.14.0 - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: crd - name: controlplanerequestlimits.consul.hashicorp.com -spec: - group: consul.hashicorp.com - names: - kind: ControlPlaneRequestLimit - listKind: ControlPlaneRequestLimitList - plural: controlplanerequestlimits - singular: controlplanerequestlimit - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: The sync status of the resource with Consul - jsonPath: .status.conditions[?(@.type=="Synced")].status - name: Synced - type: string - - description: The age of the resource - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - description: ControlPlaneRequestLimit is the Schema for the controlplanerequestlimits - API. - properties: - apiVersion: - description: |- - APIVersion defines the versioned schema of this representation of an object. - Servers should convert recognized schemas to the latest internal value, and - may reject unrecognized values. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - type: string - kind: - description: |- - Kind is a string value representing the REST resource this object represents. - Servers may infer this from the endpoint the client submits requests to. - Cannot be updated. - In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - type: string - metadata: - type: object - spec: - description: ControlPlaneRequestLimitSpec defines the desired state of - ControlPlaneRequestLimit. - properties: - acl: - properties: - readRate: - type: number - writeRate: - type: number - type: object - catalog: - properties: - readRate: - type: number - writeRate: - type: number - type: object - configEntry: - properties: - readRate: - type: number - writeRate: - type: number - type: object - connectCA: - properties: - readRate: - type: number - writeRate: - type: number - type: object - coordinate: - properties: - readRate: - type: number - writeRate: - type: number - type: object - discoveryChain: - properties: - readRate: - type: number - writeRate: - type: number - type: object - health: - properties: - readRate: - type: number - writeRate: - type: number - type: object - intention: - properties: - readRate: - type: number - writeRate: - type: number - type: object - kv: - properties: - readRate: - type: number - writeRate: - type: number - type: object - mode: - type: string - preparedQuery: - properties: - readRate: - type: number - writeRate: - type: number - type: object - readRate: - type: number - session: - properties: - readRate: - type: number - writeRate: - type: number - type: object - tenancy: - properties: - readRate: - type: number - writeRate: - type: number - type: object - txn: - properties: - readRate: - type: number - writeRate: - type: number - type: object - writeRate: - type: number - type: object - status: - properties: - conditions: - description: Conditions indicate the latest available observations - of a resource's current state. - items: - description: |- - Conditions define a readiness condition for a Consul resource. - See: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#typical-status-properties - properties: - lastTransitionTime: - description: LastTransitionTime is the last time the condition - transitioned from one status to another. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. - type: string - reason: - description: The reason for the condition's last transition. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition. - type: string - required: - - status - - type - type: object - type: array - lastSyncedTime: - description: LastSyncedTime is the last time the resource successfully - synced with Consul. - format: date-time - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} -{{- end }} diff --git a/charts/consul/templates/crd-exportedservices-v1.yaml b/charts/consul/templates/crd-exportedservices-v1.yaml deleted file mode 100644 index a7fbd87..0000000 --- a/charts/consul/templates/crd-exportedservices-v1.yaml +++ /dev/null @@ -1,147 +0,0 @@ -{{- if .Values.connectInject.enabled }} -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.14.0 - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: crd - name: exportedservices.consul.hashicorp.com -spec: - group: consul.hashicorp.com - names: - kind: ExportedServices - listKind: ExportedServicesList - plural: exportedservices - shortNames: - - exported-services - singular: exportedservices - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: The sync status of the resource with Consul - jsonPath: .status.conditions[?(@.type=="Synced")].status - name: Synced - type: string - - description: The last successful synced time of the resource with Consul - jsonPath: .status.lastSyncedTime - name: Last Synced - type: date - - description: The age of the resource - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - description: ExportedServices is the Schema for the exportedservices API - properties: - apiVersion: - description: |- - APIVersion defines the versioned schema of this representation of an object. - Servers should convert recognized schemas to the latest internal value, and - may reject unrecognized values. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - type: string - kind: - description: |- - Kind is a string value representing the REST resource this object represents. - Servers may infer this from the endpoint the client submits requests to. - Cannot be updated. - In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - type: string - metadata: - type: object - spec: - description: ExportedServicesSpec defines the desired state of ExportedServices. - properties: - services: - description: |- - Services is a list of services to be exported and the list of partitions - to expose them to. - items: - description: |- - ExportedService manages the exporting of a service in the local partition to - other partitions. - properties: - consumers: - description: Consumers is a list of downstream consumers of - the service to be exported. - items: - description: ServiceConsumer represents a downstream consumer - of the service to be exported. - properties: - partition: - description: Partition is the admin partition to export - the service to. - type: string - peer: - description: Peer is the name of the peer to export the - service to. - type: string - samenessGroup: - description: SamenessGroup is the name of the sameness - group to export the service to. - type: string - type: object - type: array - name: - description: Name is the name of the service to be exported. - type: string - namespace: - description: Namespace is the namespace to export the service - from. - type: string - type: object - type: array - type: object - status: - properties: - conditions: - description: Conditions indicate the latest available observations - of a resource's current state. - items: - description: |- - Conditions define a readiness condition for a Consul resource. - See: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#typical-status-properties - properties: - lastTransitionTime: - description: LastTransitionTime is the last time the condition - transitioned from one status to another. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. - type: string - reason: - description: The reason for the condition's last transition. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition. - type: string - required: - - status - - type - type: object - type: array - lastSyncedTime: - description: LastSyncedTime is the last time the resource successfully - synced with Consul. - format: date-time - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} -{{- end }} diff --git a/charts/consul/templates/crd-gatewayclassconfigs-v1.yaml b/charts/consul/templates/crd-gatewayclassconfigs-v1.yaml deleted file mode 100644 index 2db954b..0000000 --- a/charts/consul/templates/crd-gatewayclassconfigs-v1.yaml +++ /dev/null @@ -1,232 +0,0 @@ -{{- if .Values.connectInject.enabled }} -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.14.0 - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: crd - name: gatewayclassconfigs.consul.hashicorp.com -spec: - group: consul.hashicorp.com - names: - kind: GatewayClassConfig - listKind: GatewayClassConfigList - plural: gatewayclassconfigs - singular: gatewayclassconfig - scope: Cluster - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: GatewayClassConfig defines the values that may be set on a GatewayClass - for Consul API Gateway. - properties: - apiVersion: - description: |- - APIVersion defines the versioned schema of this representation of an object. - Servers should convert recognized schemas to the latest internal value, and - may reject unrecognized values. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - type: string - kind: - description: |- - Kind is a string value representing the REST resource this object represents. - Servers may infer this from the endpoint the client submits requests to. - Cannot be updated. - In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - type: string - metadata: - type: object - spec: - description: Spec defines the desired state of GatewayClassConfig. - properties: - copyAnnotations: - description: Annotation Information to copy to services or deployments - properties: - service: - description: List of annotations to copy to the gateway service. - items: - type: string - type: array - type: object - deployment: - description: Deployment defines the deployment configuration for the - gateway. - properties: - defaultInstances: - default: 1 - description: Number of gateway instances that should be deployed - by default - format: int32 - maximum: 8 - minimum: 1 - type: integer - maxInstances: - default: 8 - description: Max allowed number of gateway instances - format: int32 - maximum: 8 - minimum: 1 - type: integer - minInstances: - default: 1 - description: Minimum allowed number of gateway instances - format: int32 - maximum: 8 - minimum: 1 - type: integer - resources: - description: Resources defines the resource requirements for the - gateway. - properties: - claims: - description: |- - Claims lists the names of resources, defined in spec.resourceClaims, - that are used by this container. - - - This is an alpha field and requires enabling the - DynamicResourceAllocation feature gate. - - - This field is immutable. It can only be set for containers. - items: - description: ResourceClaim references one entry in PodSpec.ResourceClaims. - properties: - name: - description: |- - Name must match the name of one entry in pod.spec.resourceClaims of - the Pod where this field is used. It makes that resource available - inside a container. - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - limits: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: |- - Limits describes the maximum amount of compute resources allowed. - More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ - type: object - requests: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: |- - Requests describes the minimum amount of compute resources required. - If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, - otherwise to an implementation-defined value. Requests cannot exceed Limits. - More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ - type: object - type: object - type: object - mapPrivilegedContainerPorts: - description: The value to add to privileged ports ( ports < 1024) - for gateway containers - format: int32 - type: integer - metrics: - description: Metrics defines how to configure the metrics for a gateway. - properties: - enabled: - description: |- - Enable metrics for this class of gateways. If unspecified, will inherit - behavior from the global Helm configuration. - type: boolean - path: - description: The path used for metrics. - type: string - port: - description: The port used for metrics. - format: int32 - maximum: 65535 - minimum: 1024 - type: integer - type: object - nodeSelector: - additionalProperties: - type: string - description: |- - NodeSelector is a selector which must be true for the pod to fit on a node. - Selector which must match a node's labels for the pod to be scheduled on that node. - More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ - type: object - openshiftSCCName: - description: The name of the OpenShift SecurityContextConstraints - resource for this gateway class to use. - type: string - podSecurityPolicy: - description: The name of an existing Kubernetes PodSecurityPolicy - to bind to the managed ServiceAccount if ACLs are managed. - type: string - serviceType: - description: Service Type string describes ingress methods for a service - enum: - - ClusterIP - - NodePort - - LoadBalancer - type: string - tolerations: - description: |- - Tolerations allow the scheduler to schedule nodes with matching taints. - More Info: https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/ - items: - description: |- - The pod this Toleration is attached to tolerates any taint that matches - the triple using the matching operator . - properties: - effect: - description: |- - Effect indicates the taint effect to match. Empty means match all taint effects. - When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: |- - Key is the taint key that the toleration applies to. Empty means match all taint keys. - If the key is empty, operator must be Exists; this combination means to match all values and all keys. - type: string - operator: - description: |- - Operator represents a key's relationship to the value. - Valid operators are Exists and Equal. Defaults to Equal. - Exists is equivalent to wildcard for value, so that a pod can - tolerate all taints of a particular category. - type: string - tolerationSeconds: - description: |- - TolerationSeconds represents the period of time the toleration (which must be - of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, - it is not set, which means tolerate the taint forever (do not evict). Zero and - negative values will be treated as 0 (evict immediately) by the system. - format: int64 - type: integer - value: - description: |- - Value is the taint value the toleration matches to. - If the operator is Exists, the value should be empty, otherwise just a regular string. - type: string - type: object - type: array - type: object - type: object - served: true - storage: true -{{- end }} diff --git a/charts/consul/templates/crd-gatewayclasses-external.yaml b/charts/consul/templates/crd-gatewayclasses-external.yaml deleted file mode 100644 index 93435b7..0000000 --- a/charts/consul/templates/crd-gatewayclasses-external.yaml +++ /dev/null @@ -1,328 +0,0 @@ -{{- if and .Values.connectInject.enabled .Values.connectInject.apiGateway.manageExternalCRDs }} -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/1538 - gateway.networking.k8s.io/bundle-version: v0.6.2 - gateway.networking.k8s.io/channel: experimental - creationTimestamp: null - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: crd - name: gatewayclasses.gateway.networking.k8s.io -spec: - group: gateway.networking.k8s.io - names: - categories: - - gateway-api - kind: GatewayClass - listKind: GatewayClassList - plural: gatewayclasses - shortNames: - - gc - singular: gatewayclass - scope: Cluster - versions: - - additionalPrinterColumns: - - jsonPath: .spec.controllerName - name: Controller - type: string - - jsonPath: .status.conditions[?(@.type=="Accepted")].status - name: Accepted - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - - jsonPath: .spec.description - name: Description - priority: 1 - type: string - deprecated: true - deprecationWarning: The v1alpha2 version of GatewayClass has been deprecated and will be removed in a future release of the API. Please upgrade to v1beta1. - name: v1alpha2 - schema: - openAPIV3Schema: - description: "GatewayClass describes a class of Gateways available to the user for creating Gateway resources. \n It is recommended that this resource be used as a template for Gateways. This means that a Gateway is based on the state of the GatewayClass at the time it was created and changes to the GatewayClass or associated parameters are not propagated down to existing Gateways. This recommendation is intended to limit the blast radius of changes to GatewayClass or associated parameters. If implementations choose to propagate GatewayClass changes to existing Gateways, that MUST be clearly documented by the implementation. \n Whenever one or more Gateways are using a GatewayClass, implementations MUST add the `gateway-exists-finalizer.gateway.networking.k8s.io` finalizer on the associated GatewayClass. This ensures that a GatewayClass associated with a Gateway is not deleted while in use. \n GatewayClass is a Cluster level resource." - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Spec defines the desired state of GatewayClass. - properties: - controllerName: - description: "ControllerName is the name of the controller that is managing Gateways of this class. The value of this field MUST be a domain prefixed path. \n Example: \"example.net/gateway-controller\". \n This field is not mutable and cannot be empty. \n Support: Core" - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$ - type: string - description: - description: Description helps describe a GatewayClass with more details. - maxLength: 64 - type: string - parametersRef: - description: "ParametersRef is a reference to a resource that contains the configuration parameters corresponding to the GatewayClass. This is optional if the controller does not require any additional configuration. \n ParametersRef can reference a standard Kubernetes resource, i.e. ConfigMap, or an implementation-specific custom resource. The resource can be cluster-scoped or namespace-scoped. \n If the referent cannot be found, the GatewayClass's \"InvalidParameters\" status condition will be true. \n Support: Implementation-specific" - properties: - group: - description: Group is the group of the referent. - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - description: Kind is kind of the referent. - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - name: - description: Name is the name of the referent. - maxLength: 253 - minLength: 1 - type: string - namespace: - description: Namespace is the namespace of the referent. This field is required when referring to a Namespace-scoped resource and MUST be unset when referring to a Cluster-scoped resource. - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - type: string - required: - - group - - kind - - name - type: object - required: - - controllerName - type: object - status: - default: - conditions: - - lastTransitionTime: "1970-01-01T00:00:00Z" - message: Waiting for controller - reason: Waiting - status: Unknown - type: Accepted - description: Status defines the current state of GatewayClass. - properties: - conditions: - default: - - lastTransitionTime: "1970-01-01T00:00:00Z" - message: Waiting for controller - reason: Pending - status: Unknown - type: Accepted - description: "Conditions is the current status from the controller for this GatewayClass. \n Controllers should prefer to publish conditions using values of GatewayClassConditionType for the type of each Condition." - items: - description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, \n \ttype FooStatus struct{ \t // Represents the observations of a foo's current state. \t // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" \t // +patchMergeKey=type \t // +patchStrategy=merge \t // +listType=map \t // +listMapKey=type \t Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n \t // other fields \t}" - properties: - lastTransitionTime: - description: lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: message is a human readable message indicating details about the transition. This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. --- Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 8 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - type: object - required: - - spec - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - jsonPath: .spec.controllerName - name: Controller - type: string - - jsonPath: .status.conditions[?(@.type=="Accepted")].status - name: Accepted - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - - jsonPath: .spec.description - name: Description - priority: 1 - type: string - name: v1beta1 - schema: - openAPIV3Schema: - description: "GatewayClass describes a class of Gateways available to the user for creating Gateway resources. \n It is recommended that this resource be used as a template for Gateways. This means that a Gateway is based on the state of the GatewayClass at the time it was created and changes to the GatewayClass or associated parameters are not propagated down to existing Gateways. This recommendation is intended to limit the blast radius of changes to GatewayClass or associated parameters. If implementations choose to propagate GatewayClass changes to existing Gateways, that MUST be clearly documented by the implementation. \n Whenever one or more Gateways are using a GatewayClass, implementations MUST add the `gateway-exists-finalizer.gateway.networking.k8s.io` finalizer on the associated GatewayClass. This ensures that a GatewayClass associated with a Gateway is not deleted while in use. \n GatewayClass is a Cluster level resource." - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Spec defines the desired state of GatewayClass. - properties: - controllerName: - description: "ControllerName is the name of the controller that is managing Gateways of this class. The value of this field MUST be a domain prefixed path. \n Example: \"example.net/gateway-controller\". \n This field is not mutable and cannot be empty. \n Support: Core" - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$ - type: string - description: - description: Description helps describe a GatewayClass with more details. - maxLength: 64 - type: string - parametersRef: - description: "ParametersRef is a reference to a resource that contains the configuration parameters corresponding to the GatewayClass. This is optional if the controller does not require any additional configuration. \n ParametersRef can reference a standard Kubernetes resource, i.e. ConfigMap, or an implementation-specific custom resource. The resource can be cluster-scoped or namespace-scoped. \n If the referent cannot be found, the GatewayClass's \"InvalidParameters\" status condition will be true. \n Support: Implementation-specific" - properties: - group: - description: Group is the group of the referent. - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - description: Kind is kind of the referent. - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - name: - description: Name is the name of the referent. - maxLength: 253 - minLength: 1 - type: string - namespace: - description: Namespace is the namespace of the referent. This field is required when referring to a Namespace-scoped resource and MUST be unset when referring to a Cluster-scoped resource. - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - type: string - required: - - group - - kind - - name - type: object - required: - - controllerName - type: object - status: - default: - conditions: - - lastTransitionTime: "1970-01-01T00:00:00Z" - message: Waiting for controller - reason: Waiting - status: Unknown - type: Accepted - description: Status defines the current state of GatewayClass. - properties: - conditions: - default: - - lastTransitionTime: "1970-01-01T00:00:00Z" - message: Waiting for controller - reason: Pending - status: Unknown - type: Accepted - description: "Conditions is the current status from the controller for this GatewayClass. \n Controllers should prefer to publish conditions using values of GatewayClassConditionType for the type of each Condition." - items: - description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, \n \ttype FooStatus struct{ \t // Represents the observations of a foo's current state. \t // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" \t // +patchMergeKey=type \t // +patchStrategy=merge \t // +listType=map \t // +listMapKey=type \t Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n \t // other fields \t}" - properties: - lastTransitionTime: - description: lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: message is a human readable message indicating details about the transition. This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. --- Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 8 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] -{{- end }} diff --git a/charts/consul/templates/crd-gatewaypolicies.yaml b/charts/consul/templates/crd-gatewaypolicies.yaml deleted file mode 100644 index 904b65d..0000000 --- a/charts/consul/templates/crd-gatewaypolicies.yaml +++ /dev/null @@ -1,302 +0,0 @@ -{{- if .Values.connectInject.enabled }} -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.14.0 - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: crd - name: gatewaypolicies.consul.hashicorp.com -spec: - group: consul.hashicorp.com - names: - kind: GatewayPolicy - listKind: GatewayPolicyList - plural: gatewaypolicies - singular: gatewaypolicy - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: The sync status of the resource with Consul - jsonPath: .status.conditions[?(@.type=="Synced")].status - name: Synced - type: string - - description: The last successful synced time of the resource with Consul - jsonPath: .status.lastSyncedTime - name: Last Synced - type: date - - description: The age of the resource - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - description: GatewayPolicy is the Schema for the gatewaypolicies API. - properties: - apiVersion: - description: |- - APIVersion defines the versioned schema of this representation of an object. - Servers should convert recognized schemas to the latest internal value, and - may reject unrecognized values. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - type: string - kind: - description: |- - Kind is a string value representing the REST resource this object represents. - Servers may infer this from the endpoint the client submits requests to. - Cannot be updated. - In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - type: string - metadata: - type: object - spec: - description: GatewayPolicySpec defines the desired state of GatewayPolicy. - properties: - default: - properties: - jwt: - description: GatewayJWTRequirement holds the list of JWT providers - to be verified against. - properties: - providers: - description: Providers is a list of providers to consider - when verifying a JWT. - items: - description: GatewayJWTProvider holds the provider and claim - verification information. - properties: - name: - description: |- - Name is the name of the JWT provider. There MUST be a corresponding - "jwt-provider" config entry with this name. - type: string - verifyClaims: - description: VerifyClaims is a list of additional claims - to verify in a JWT's payload. - items: - description: GatewayJWTClaimVerification holds the - actual claim information to be verified. - properties: - path: - description: Path is the path to the claim in - the token JSON. - items: - type: string - type: array - value: - description: |- - Value is the expected value at the given path: - - If the type at the path is a list then we verify - that this value is contained in the list. - - - - If the type at the path is a string then we verify - that this value matches. - type: string - required: - - path - - value - type: object - type: array - required: - - name - type: object - type: array - required: - - providers - type: object - type: object - override: - properties: - jwt: - description: GatewayJWTRequirement holds the list of JWT providers - to be verified against. - properties: - providers: - description: Providers is a list of providers to consider - when verifying a JWT. - items: - description: GatewayJWTProvider holds the provider and claim - verification information. - properties: - name: - description: |- - Name is the name of the JWT provider. There MUST be a corresponding - "jwt-provider" config entry with this name. - type: string - verifyClaims: - description: VerifyClaims is a list of additional claims - to verify in a JWT's payload. - items: - description: GatewayJWTClaimVerification holds the - actual claim information to be verified. - properties: - path: - description: Path is the path to the claim in - the token JSON. - items: - type: string - type: array - value: - description: |- - Value is the expected value at the given path: - - If the type at the path is a list then we verify - that this value is contained in the list. - - - - If the type at the path is a string then we verify - that this value matches. - type: string - required: - - path - - value - type: object - type: array - required: - - name - type: object - type: array - required: - - providers - type: object - type: object - targetRef: - description: TargetRef identifies an API object to apply policy to. - properties: - group: - description: Group is the group of the target resource. - maxLength: 253 - minLength: 1 - type: string - kind: - description: Kind is kind of the target resource. - maxLength: 253 - minLength: 1 - type: string - name: - description: Name is the name of the target resource. - maxLength: 253 - minLength: 1 - type: string - namespace: - description: |- - Namespace is the namespace of the referent. When unspecified, the local - namespace is inferred. Even when policy targets a resource in a different - namespace, it may only apply to traffic originating from the same - namespace as the policy. - maxLength: 253 - minLength: 1 - type: string - sectionName: - description: SectionName refers to the listener targeted by this - policy. - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - required: - - group - - kind - - name - type: object - required: - - targetRef - type: object - status: - description: GatewayPolicyStatus defines the observed state of the gateway. - properties: - conditions: - description: |- - Conditions describe the current conditions of the Policy. - - - Known condition types are: - - - * "Accepted" - * "ResolvedRefs" - items: - description: "Condition contains details for one aspect of the current - state of this API Resource.\n---\nThis struct is intended for - direct use as an array at the field path .status.conditions. For - example,\n\n\n\ttype FooStatus struct{\n\t // Represents the - observations of a foo's current state.\n\t // Known .status.conditions.type - are: \"Available\", \"Progressing\", and \"Degraded\"\n\t // - +patchMergeKey=type\n\t // +patchStrategy=merge\n\t // +listType=map\n\t - \ // +listMapKey=type\n\t Conditions []metav1.Condition `json:\"conditions,omitempty\" - patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"`\n\n\n\t - \ // other fields\n\t}" - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: |- - type of condition in CamelCase or in foo.example.com/CamelCase. - --- - Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be - useful (see .node.status.conditions), the ability to deconflict is important. - The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 8 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - type: object - type: object - served: true - storage: true - subresources: - status: {} -{{- end }} diff --git a/charts/consul/templates/crd-gateways-external.yaml b/charts/consul/templates/crd-gateways-external.yaml deleted file mode 100644 index 41df349..0000000 --- a/charts/consul/templates/crd-gateways-external.yaml +++ /dev/null @@ -1,882 +0,0 @@ -{{- if and .Values.connectInject.enabled .Values.connectInject.apiGateway.manageExternalCRDs }} -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/1538 - gateway.networking.k8s.io/bundle-version: v0.6.2 - gateway.networking.k8s.io/channel: experimental - creationTimestamp: null - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: crd - name: gateways.gateway.networking.k8s.io -spec: - group: gateway.networking.k8s.io - names: - categories: - - gateway-api - kind: Gateway - listKind: GatewayList - plural: gateways - shortNames: - - gtw - singular: gateway - scope: Namespaced - versions: - - additionalPrinterColumns: - - jsonPath: .spec.gatewayClassName - name: Class - type: string - - jsonPath: .status.addresses[*].value - name: Address - type: string - - jsonPath: .status.conditions[?(@.type=="Programmed")].status - name: Programmed - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - deprecated: true - deprecationWarning: The v1alpha2 version of Gateway has been deprecated and will be removed in a future release of the API. Please upgrade to v1beta1. - name: v1alpha2 - schema: - openAPIV3Schema: - description: Gateway represents an instance of a service-traffic handling infrastructure by binding Listeners to a set of IP addresses. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Spec defines the desired state of Gateway. - properties: - addresses: - description: "Addresses requested for this Gateway. This is optional and behavior can depend on the implementation. If a value is set in the spec and the requested address is invalid or unavailable, the implementation MUST indicate this in the associated entry in GatewayStatus.Addresses. \n The Addresses field represents a request for the address(es) on the \"outside of the Gateway\", that traffic bound for this Gateway will use. This could be the IP address or hostname of an external load balancer or other networking infrastructure, or some other address that traffic will be sent to. \n The .listener.hostname field is used to route traffic that has already arrived at the Gateway to the correct in-cluster destination. \n If no Addresses are specified, the implementation MAY schedule the Gateway in an implementation-specific manner, assigning an appropriate set of Addresses. \n The implementation MUST bind all Listeners to every GatewayAddress that it assigns to the Gateway and add a corresponding entry in GatewayStatus.Addresses. \n Support: Extended" - items: - description: GatewayAddress describes an address that can be bound to a Gateway. - properties: - type: - default: IPAddress - description: Type of the address. - maxLength: 253 - minLength: 1 - pattern: ^Hostname|IPAddress|NamedAddress|[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$ - type: string - value: - description: "Value of the address. The validity of the values will depend on the type and support by the controller. \n Examples: `1.2.3.4`, `128::1`, `my-ip-address`." - maxLength: 253 - minLength: 1 - type: string - required: - - value - type: object - maxItems: 16 - type: array - gatewayClassName: - description: GatewayClassName used for this Gateway. This is the name of a GatewayClass resource. - maxLength: 253 - minLength: 1 - type: string - listeners: - description: "Listeners associated with this Gateway. Listeners define logical endpoints that are bound on this Gateway's addresses. At least one Listener MUST be specified. \n Each listener in a Gateway must have a unique combination of Hostname, Port, and Protocol. \n An implementation MAY group Listeners by Port and then collapse each group of Listeners into a single Listener if the implementation determines that the Listeners in the group are \"compatible\". An implementation MAY also group together and collapse compatible Listeners belonging to different Gateways. \n For example, an implementation might consider Listeners to be compatible with each other if all of the following conditions are met: \n 1. Either each Listener within the group specifies the \"HTTP\" Protocol or each Listener within the group specifies either the \"HTTPS\" or \"TLS\" Protocol. \n 2. Each Listener within the group specifies a Hostname that is unique within the group. \n 3. As a special case, one Listener within a group may omit Hostname, in which case this Listener matches when no other Listener matches. \n If the implementation does collapse compatible Listeners, the hostname provided in the incoming client request MUST be matched to a Listener to find the correct set of Routes. The incoming hostname MUST be matched using the Hostname field for each Listener in order of most to least specific. That is, exact matches must be processed before wildcard matches. \n If this field specifies multiple Listeners that have the same Port value but are not compatible, the implementation must raise a \"Conflicted\" condition in the Listener status. \n Support: Core" - items: - description: Listener embodies the concept of a logical endpoint where a Gateway accepts network connections. - properties: - allowedRoutes: - default: - namespaces: - from: Same - description: "AllowedRoutes defines the types of routes that MAY be attached to a Listener and the trusted namespaces where those Route resources MAY be present. \n Although a client request may match multiple route rules, only one rule may ultimately receive the request. Matching precedence MUST be determined in order of the following criteria: \n * The most specific match as defined by the Route type. * The oldest Route based on creation timestamp. For example, a Route with a creation timestamp of \"2020-09-08 01:02:03\" is given precedence over a Route with a creation timestamp of \"2020-09-08 01:02:04\". * If everything else is equivalent, the Route appearing first in alphabetical order (namespace/name) should be given precedence. For example, foo/bar is given precedence over foo/baz. \n All valid rules within a Route attached to this Listener should be implemented. Invalid Route rules can be ignored (sometimes that will mean the full Route). If a Route rule transitions from valid to invalid, support for that Route rule should be dropped to ensure consistency. For example, even if a filter specified by a Route rule is invalid, the rest of the rules within that Route should still be supported. \n Support: Core" - properties: - kinds: - description: "Kinds specifies the groups and kinds of Routes that are allowed to bind to this Gateway Listener. When unspecified or empty, the kinds of Routes selected are determined using the Listener protocol. \n A RouteGroupKind MUST correspond to kinds of Routes that are compatible with the application protocol specified in the Listener's Protocol field. If an implementation does not support or recognize this resource type, it MUST set the \"ResolvedRefs\" condition to False for this Listener with the \"InvalidRouteKinds\" reason. \n Support: Core" - items: - description: RouteGroupKind indicates the group and kind of a Route resource. - properties: - group: - default: gateway.networking.k8s.io - description: Group is the group of the Route. - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - description: Kind is the kind of the Route. - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - required: - - kind - type: object - maxItems: 8 - type: array - namespaces: - default: - from: Same - description: "Namespaces indicates namespaces from which Routes may be attached to this Listener. This is restricted to the namespace of this Gateway by default. \n Support: Core" - properties: - from: - default: Same - description: "From indicates where Routes will be selected for this Gateway. Possible values are: * All: Routes in all namespaces may be used by this Gateway. * Selector: Routes in namespaces selected by the selector may be used by this Gateway. * Same: Only Routes in the same namespace may be used by this Gateway. \n Support: Core" - enum: - - All - - Selector - - Same - type: string - selector: - description: "Selector must be specified when From is set to \"Selector\". In that case, only Routes in Namespaces matching this Selector will be selected by this Gateway. This field is ignored for other values of \"From\". \n Support: Core" - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - type: object - type: object - hostname: - description: "Hostname specifies the virtual hostname to match for protocol types that define this concept. When unspecified, all hostnames are matched. This field is ignored for protocols that don't require hostname based matching. \n Implementations MUST apply Hostname matching appropriately for each of the following protocols: \n * TLS: The Listener Hostname MUST match the SNI. * HTTP: The Listener Hostname MUST match the Host header of the request. * HTTPS: The Listener Hostname SHOULD match at both the TLS and HTTP protocol layers as described above. If an implementation does not ensure that both the SNI and Host header match the Listener hostname, it MUST clearly document that. \n For HTTPRoute and TLSRoute resources, there is an interaction with the `spec.hostnames` array. When both listener and route specify hostnames, there MUST be an intersection between the values for a Route to be accepted. For more information, refer to the Route specific Hostnames documentation. \n Hostnames that are prefixed with a wildcard label (`*.`) are interpreted as a suffix match. That means that a match for `*.example.com` would match both `test.example.com`, and `foo.test.example.com`, but not `example.com`. \n Support: Core" - maxLength: 253 - minLength: 1 - pattern: ^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - name: - description: "Name is the name of the Listener. This name MUST be unique within a Gateway. \n Support: Core" - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - port: - description: "Port is the network port. Multiple listeners may use the same port, subject to the Listener compatibility rules. \n Support: Core" - format: int32 - maximum: 65535 - minimum: 1 - type: integer - protocol: - description: "Protocol specifies the network protocol this listener expects to receive. \n Support: Core" - maxLength: 255 - minLength: 1 - pattern: ^[a-zA-Z0-9]([-a-zSA-Z0-9]*[a-zA-Z0-9])?$|[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9]+$ - type: string - tls: - description: "TLS is the TLS configuration for the Listener. This field is required if the Protocol field is \"HTTPS\" or \"TLS\". It is invalid to set this field if the Protocol field is \"HTTP\", \"TCP\", or \"UDP\". \n The association of SNIs to Certificate defined in GatewayTLSConfig is defined based on the Hostname field for this listener. \n The GatewayClass MUST use the longest matching SNI out of all available certificates for any TLS handshake. \n Support: Core" - properties: - certificateRefs: - description: "CertificateRefs contains a series of references to Kubernetes objects that contains TLS certificates and private keys. These certificates are used to establish a TLS handshake for requests that match the hostname of the associated listener. \n A single CertificateRef to a Kubernetes Secret has \"Core\" support. Implementations MAY choose to support attaching multiple certificates to a Listener, but this behavior is implementation-specific. \n References to a resource in different namespace are invalid UNLESS there is a ReferenceGrant in the target namespace that allows the certificate to be attached. If a ReferenceGrant does not allow this reference, the \"ResolvedRefs\" condition MUST be set to False for this listener with the \"RefNotPermitted\" reason. \n This field is required to have at least one element when the mode is set to \"Terminate\" (default) and is optional otherwise. \n CertificateRefs can reference to standard Kubernetes resources, i.e. Secret, or implementation-specific custom resources. \n Support: Core - A single reference to a Kubernetes Secret of type kubernetes.io/tls \n Support: Implementation-specific (More than one reference or other resource types)" - items: - description: "SecretObjectReference identifies an API object including its namespace, defaulting to Secret. \n The API object must be valid in the cluster; the Group and Kind must be registered in the cluster for this reference to be valid. \n References to objects with invalid Group and Kind are not valid, and must be rejected by the implementation, with appropriate Conditions set on the containing object." - properties: - group: - default: "" - description: Group is the group of the referent. For example, "gateway.networking.k8s.io". When unspecified or empty string, core API group is inferred. - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - default: Secret - description: Kind is kind of the referent. For example "HTTPRoute" or "Service". - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - name: - description: Name is the name of the referent. - maxLength: 253 - minLength: 1 - type: string - namespace: - description: "Namespace is the namespace of the backend. When unspecified, the local namespace is inferred. \n Note that when a namespace is specified, a ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details. \n Support: Core" - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - type: string - required: - - name - type: object - maxItems: 64 - type: array - mode: - default: Terminate - description: "Mode defines the TLS behavior for the TLS session initiated by the client. There are two possible modes: \n - Terminate: The TLS session between the downstream client and the Gateway is terminated at the Gateway. This mode requires certificateRefs to be set and contain at least one element. - Passthrough: The TLS session is NOT terminated by the Gateway. This implies that the Gateway can't decipher the TLS stream except for the ClientHello message of the TLS protocol. CertificateRefs field is ignored in this mode. \n Support: Core" - enum: - - Terminate - - Passthrough - type: string - options: - additionalProperties: - description: AnnotationValue is the value of an annotation in Gateway API. This is used for validation of maps such as TLS options. This roughly matches Kubernetes annotation validation, although the length validation in that case is based on the entire size of the annotations struct. - maxLength: 4096 - minLength: 0 - type: string - description: "Options are a list of key/value pairs to enable extended TLS configuration for each implementation. For example, configuring the minimum TLS version or supported cipher suites. \n A set of common keys MAY be defined by the API in the future. To avoid any ambiguity, implementation-specific definitions MUST use domain-prefixed names, such as `example.com/my-custom-option`. Un-prefixed names are reserved for key names defined by Gateway API. \n Support: Implementation-specific" - maxProperties: 16 - type: object - type: object - required: - - name - - port - - protocol - type: object - maxItems: 64 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - required: - - gatewayClassName - - listeners - type: object - status: - default: - conditions: - - lastTransitionTime: "1970-01-01T00:00:00Z" - message: Waiting for controller - reason: NotReconciled - status: Unknown - type: Accepted - description: Status defines the current state of Gateway. - properties: - addresses: - description: Addresses lists the IP addresses that have actually been bound to the Gateway. These addresses may differ from the addresses in the Spec, e.g. if the Gateway automatically assigns an address from a reserved pool. - items: - description: GatewayAddress describes an address that can be bound to a Gateway. - properties: - type: - default: IPAddress - description: Type of the address. - maxLength: 253 - minLength: 1 - pattern: ^Hostname|IPAddress|NamedAddress|[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$ - type: string - value: - description: "Value of the address. The validity of the values will depend on the type and support by the controller. \n Examples: `1.2.3.4`, `128::1`, `my-ip-address`." - maxLength: 253 - minLength: 1 - type: string - required: - - value - type: object - maxItems: 16 - type: array - conditions: - default: - - lastTransitionTime: "1970-01-01T00:00:00Z" - message: Waiting for controller - reason: Pending - status: Unknown - type: Accepted - - lastTransitionTime: "1970-01-01T00:00:00Z" - message: Waiting for controller - reason: Pending - status: Unknown - type: Programmed - description: "Conditions describe the current conditions of the Gateway. \n Implementations should prefer to express Gateway conditions using the `GatewayConditionType` and `GatewayConditionReason` constants so that operators and tools can converge on a common vocabulary to describe Gateway state. \n Known condition types are: \n * \"Accepted\" * \"Ready\"" - items: - description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, \n \ttype FooStatus struct{ \t // Represents the observations of a foo's current state. \t // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" \t // +patchMergeKey=type \t // +patchStrategy=merge \t // +listType=map \t // +listMapKey=type \t Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n \t // other fields \t}" - properties: - lastTransitionTime: - description: lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: message is a human readable message indicating details about the transition. This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. --- Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 8 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - listeners: - description: Listeners provide status for each unique listener port defined in the Spec. - items: - description: ListenerStatus is the status associated with a Listener. - properties: - attachedRoutes: - description: AttachedRoutes represents the total number of Routes that have been successfully attached to this Listener. - format: int32 - type: integer - conditions: - description: Conditions describe the current condition of this listener. - items: - description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, \n \ttype FooStatus struct{ \t // Represents the observations of a foo's current state. \t // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" \t // +patchMergeKey=type \t // +patchStrategy=merge \t // +listType=map \t // +listMapKey=type \t Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n \t // other fields \t}" - properties: - lastTransitionTime: - description: lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: message is a human readable message indicating details about the transition. This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. --- Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 8 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - name: - description: Name is the name of the Listener that this status corresponds to. - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - supportedKinds: - description: "SupportedKinds is the list indicating the Kinds supported by this listener. This MUST represent the kinds an implementation supports for that Listener configuration. \n If kinds are specified in Spec that are not supported, they MUST NOT appear in this list and an implementation MUST set the \"ResolvedRefs\" condition to \"False\" with the \"InvalidRouteKinds\" reason. If both valid and invalid Route kinds are specified, the implementation MUST reference the valid Route kinds that have been specified." - items: - description: RouteGroupKind indicates the group and kind of a Route resource. - properties: - group: - default: gateway.networking.k8s.io - description: Group is the group of the Route. - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - description: Kind is the kind of the Route. - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - required: - - kind - type: object - maxItems: 8 - type: array - required: - - attachedRoutes - - conditions - - name - - supportedKinds - type: object - maxItems: 64 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - type: object - required: - - spec - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - jsonPath: .spec.gatewayClassName - name: Class - type: string - - jsonPath: .status.addresses[*].value - name: Address - type: string - - jsonPath: .status.conditions[?(@.type=="Programmed")].status - name: Programmed - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: Gateway represents an instance of a service-traffic handling infrastructure by binding Listeners to a set of IP addresses. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Spec defines the desired state of Gateway. - properties: - addresses: - description: "Addresses requested for this Gateway. This is optional and behavior can depend on the implementation. If a value is set in the spec and the requested address is invalid or unavailable, the implementation MUST indicate this in the associated entry in GatewayStatus.Addresses. \n The Addresses field represents a request for the address(es) on the \"outside of the Gateway\", that traffic bound for this Gateway will use. This could be the IP address or hostname of an external load balancer or other networking infrastructure, or some other address that traffic will be sent to. \n The .listener.hostname field is used to route traffic that has already arrived at the Gateway to the correct in-cluster destination. \n If no Addresses are specified, the implementation MAY schedule the Gateway in an implementation-specific manner, assigning an appropriate set of Addresses. \n The implementation MUST bind all Listeners to every GatewayAddress that it assigns to the Gateway and add a corresponding entry in GatewayStatus.Addresses. \n Support: Extended" - items: - description: GatewayAddress describes an address that can be bound to a Gateway. - properties: - type: - default: IPAddress - description: Type of the address. - maxLength: 253 - minLength: 1 - pattern: ^Hostname|IPAddress|NamedAddress|[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$ - type: string - value: - description: "Value of the address. The validity of the values will depend on the type and support by the controller. \n Examples: `1.2.3.4`, `128::1`, `my-ip-address`." - maxLength: 253 - minLength: 1 - type: string - required: - - value - type: object - maxItems: 16 - type: array - gatewayClassName: - description: GatewayClassName used for this Gateway. This is the name of a GatewayClass resource. - maxLength: 253 - minLength: 1 - type: string - listeners: - description: "Listeners associated with this Gateway. Listeners define logical endpoints that are bound on this Gateway's addresses. At least one Listener MUST be specified. \n Each listener in a Gateway must have a unique combination of Hostname, Port, and Protocol. \n An implementation MAY group Listeners by Port and then collapse each group of Listeners into a single Listener if the implementation determines that the Listeners in the group are \"compatible\". An implementation MAY also group together and collapse compatible Listeners belonging to different Gateways. \n For example, an implementation might consider Listeners to be compatible with each other if all of the following conditions are met: \n 1. Either each Listener within the group specifies the \"HTTP\" Protocol or each Listener within the group specifies either the \"HTTPS\" or \"TLS\" Protocol. \n 2. Each Listener within the group specifies a Hostname that is unique within the group. \n 3. As a special case, one Listener within a group may omit Hostname, in which case this Listener matches when no other Listener matches. \n If the implementation does collapse compatible Listeners, the hostname provided in the incoming client request MUST be matched to a Listener to find the correct set of Routes. The incoming hostname MUST be matched using the Hostname field for each Listener in order of most to least specific. That is, exact matches must be processed before wildcard matches. \n If this field specifies multiple Listeners that have the same Port value but are not compatible, the implementation must raise a \"Conflicted\" condition in the Listener status. \n Support: Core" - items: - description: Listener embodies the concept of a logical endpoint where a Gateway accepts network connections. - properties: - allowedRoutes: - default: - namespaces: - from: Same - description: "AllowedRoutes defines the types of routes that MAY be attached to a Listener and the trusted namespaces where those Route resources MAY be present. \n Although a client request may match multiple route rules, only one rule may ultimately receive the request. Matching precedence MUST be determined in order of the following criteria: \n * The most specific match as defined by the Route type. * The oldest Route based on creation timestamp. For example, a Route with a creation timestamp of \"2020-09-08 01:02:03\" is given precedence over a Route with a creation timestamp of \"2020-09-08 01:02:04\". * If everything else is equivalent, the Route appearing first in alphabetical order (namespace/name) should be given precedence. For example, foo/bar is given precedence over foo/baz. \n All valid rules within a Route attached to this Listener should be implemented. Invalid Route rules can be ignored (sometimes that will mean the full Route). If a Route rule transitions from valid to invalid, support for that Route rule should be dropped to ensure consistency. For example, even if a filter specified by a Route rule is invalid, the rest of the rules within that Route should still be supported. \n Support: Core" - properties: - kinds: - description: "Kinds specifies the groups and kinds of Routes that are allowed to bind to this Gateway Listener. When unspecified or empty, the kinds of Routes selected are determined using the Listener protocol. \n A RouteGroupKind MUST correspond to kinds of Routes that are compatible with the application protocol specified in the Listener's Protocol field. If an implementation does not support or recognize this resource type, it MUST set the \"ResolvedRefs\" condition to False for this Listener with the \"InvalidRouteKinds\" reason. \n Support: Core" - items: - description: RouteGroupKind indicates the group and kind of a Route resource. - properties: - group: - default: gateway.networking.k8s.io - description: Group is the group of the Route. - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - description: Kind is the kind of the Route. - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - required: - - kind - type: object - maxItems: 8 - type: array - namespaces: - default: - from: Same - description: "Namespaces indicates namespaces from which Routes may be attached to this Listener. This is restricted to the namespace of this Gateway by default. \n Support: Core" - properties: - from: - default: Same - description: "From indicates where Routes will be selected for this Gateway. Possible values are: * All: Routes in all namespaces may be used by this Gateway. * Selector: Routes in namespaces selected by the selector may be used by this Gateway. * Same: Only Routes in the same namespace may be used by this Gateway. \n Support: Core" - enum: - - All - - Selector - - Same - type: string - selector: - description: "Selector must be specified when From is set to \"Selector\". In that case, only Routes in Namespaces matching this Selector will be selected by this Gateway. This field is ignored for other values of \"From\". \n Support: Core" - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - type: object - type: object - hostname: - description: "Hostname specifies the virtual hostname to match for protocol types that define this concept. When unspecified, all hostnames are matched. This field is ignored for protocols that don't require hostname based matching. \n Implementations MUST apply Hostname matching appropriately for each of the following protocols: \n * TLS: The Listener Hostname MUST match the SNI. * HTTP: The Listener Hostname MUST match the Host header of the request. * HTTPS: The Listener Hostname SHOULD match at both the TLS and HTTP protocol layers as described above. If an implementation does not ensure that both the SNI and Host header match the Listener hostname, it MUST clearly document that. \n For HTTPRoute and TLSRoute resources, there is an interaction with the `spec.hostnames` array. When both listener and route specify hostnames, there MUST be an intersection between the values for a Route to be accepted. For more information, refer to the Route specific Hostnames documentation. \n Hostnames that are prefixed with a wildcard label (`*.`) are interpreted as a suffix match. That means that a match for `*.example.com` would match both `test.example.com`, and `foo.test.example.com`, but not `example.com`. \n Support: Core" - maxLength: 253 - minLength: 1 - pattern: ^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - name: - description: "Name is the name of the Listener. This name MUST be unique within a Gateway. \n Support: Core" - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - port: - description: "Port is the network port. Multiple listeners may use the same port, subject to the Listener compatibility rules. \n Support: Core" - format: int32 - maximum: 65535 - minimum: 1 - type: integer - protocol: - description: "Protocol specifies the network protocol this listener expects to receive. \n Support: Core" - maxLength: 255 - minLength: 1 - pattern: ^[a-zA-Z0-9]([-a-zSA-Z0-9]*[a-zA-Z0-9])?$|[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9]+$ - type: string - tls: - description: "TLS is the TLS configuration for the Listener. This field is required if the Protocol field is \"HTTPS\" or \"TLS\". It is invalid to set this field if the Protocol field is \"HTTP\", \"TCP\", or \"UDP\". \n The association of SNIs to Certificate defined in GatewayTLSConfig is defined based on the Hostname field for this listener. \n The GatewayClass MUST use the longest matching SNI out of all available certificates for any TLS handshake. \n Support: Core" - properties: - certificateRefs: - description: "CertificateRefs contains a series of references to Kubernetes objects that contains TLS certificates and private keys. These certificates are used to establish a TLS handshake for requests that match the hostname of the associated listener. \n A single CertificateRef to a Kubernetes Secret has \"Core\" support. Implementations MAY choose to support attaching multiple certificates to a Listener, but this behavior is implementation-specific. \n References to a resource in different namespace are invalid UNLESS there is a ReferenceGrant in the target namespace that allows the certificate to be attached. If a ReferenceGrant does not allow this reference, the \"ResolvedRefs\" condition MUST be set to False for this listener with the \"RefNotPermitted\" reason. \n This field is required to have at least one element when the mode is set to \"Terminate\" (default) and is optional otherwise. \n CertificateRefs can reference to standard Kubernetes resources, i.e. Secret, or implementation-specific custom resources. \n Support: Core - A single reference to a Kubernetes Secret of type kubernetes.io/tls \n Support: Implementation-specific (More than one reference or other resource types)" - items: - description: "SecretObjectReference identifies an API object including its namespace, defaulting to Secret. \n The API object must be valid in the cluster; the Group and Kind must be registered in the cluster for this reference to be valid. \n References to objects with invalid Group and Kind are not valid, and must be rejected by the implementation, with appropriate Conditions set on the containing object." - properties: - group: - default: "" - description: Group is the group of the referent. For example, "gateway.networking.k8s.io". When unspecified or empty string, core API group is inferred. - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - default: Secret - description: Kind is kind of the referent. For example "HTTPRoute" or "Service". - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - name: - description: Name is the name of the referent. - maxLength: 253 - minLength: 1 - type: string - namespace: - description: "Namespace is the namespace of the backend. When unspecified, the local namespace is inferred. \n Note that when a namespace is specified, a ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details. \n Support: Core" - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - type: string - required: - - name - type: object - maxItems: 64 - type: array - mode: - default: Terminate - description: "Mode defines the TLS behavior for the TLS session initiated by the client. There are two possible modes: \n - Terminate: The TLS session between the downstream client and the Gateway is terminated at the Gateway. This mode requires certificateRefs to be set and contain at least one element. - Passthrough: The TLS session is NOT terminated by the Gateway. This implies that the Gateway can't decipher the TLS stream except for the ClientHello message of the TLS protocol. CertificateRefs field is ignored in this mode. \n Support: Core" - enum: - - Terminate - - Passthrough - type: string - options: - additionalProperties: - description: AnnotationValue is the value of an annotation in Gateway API. This is used for validation of maps such as TLS options. This roughly matches Kubernetes annotation validation, although the length validation in that case is based on the entire size of the annotations struct. - maxLength: 4096 - minLength: 0 - type: string - description: "Options are a list of key/value pairs to enable extended TLS configuration for each implementation. For example, configuring the minimum TLS version or supported cipher suites. \n A set of common keys MAY be defined by the API in the future. To avoid any ambiguity, implementation-specific definitions MUST use domain-prefixed names, such as `example.com/my-custom-option`. Un-prefixed names are reserved for key names defined by Gateway API. \n Support: Implementation-specific" - maxProperties: 16 - type: object - type: object - required: - - name - - port - - protocol - type: object - maxItems: 64 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - required: - - gatewayClassName - - listeners - type: object - status: - default: - conditions: - - lastTransitionTime: "1970-01-01T00:00:00Z" - message: Waiting for controller - reason: NotReconciled - status: Unknown - type: Accepted - description: Status defines the current state of Gateway. - properties: - addresses: - description: Addresses lists the IP addresses that have actually been bound to the Gateway. These addresses may differ from the addresses in the Spec, e.g. if the Gateway automatically assigns an address from a reserved pool. - items: - description: GatewayAddress describes an address that can be bound to a Gateway. - properties: - type: - default: IPAddress - description: Type of the address. - maxLength: 253 - minLength: 1 - pattern: ^Hostname|IPAddress|NamedAddress|[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$ - type: string - value: - description: "Value of the address. The validity of the values will depend on the type and support by the controller. \n Examples: `1.2.3.4`, `128::1`, `my-ip-address`." - maxLength: 253 - minLength: 1 - type: string - required: - - value - type: object - maxItems: 16 - type: array - conditions: - default: - - lastTransitionTime: "1970-01-01T00:00:00Z" - message: Waiting for controller - reason: Pending - status: Unknown - type: Accepted - - lastTransitionTime: "1970-01-01T00:00:00Z" - message: Waiting for controller - reason: Pending - status: Unknown - type: Programmed - description: "Conditions describe the current conditions of the Gateway. \n Implementations should prefer to express Gateway conditions using the `GatewayConditionType` and `GatewayConditionReason` constants so that operators and tools can converge on a common vocabulary to describe Gateway state. \n Known condition types are: \n * \"Accepted\" * \"Ready\"" - items: - description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, \n \ttype FooStatus struct{ \t // Represents the observations of a foo's current state. \t // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" \t // +patchMergeKey=type \t // +patchStrategy=merge \t // +listType=map \t // +listMapKey=type \t Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n \t // other fields \t}" - properties: - lastTransitionTime: - description: lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: message is a human readable message indicating details about the transition. This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. --- Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 8 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - listeners: - description: Listeners provide status for each unique listener port defined in the Spec. - items: - description: ListenerStatus is the status associated with a Listener. - properties: - attachedRoutes: - description: AttachedRoutes represents the total number of Routes that have been successfully attached to this Listener. - format: int32 - type: integer - conditions: - description: Conditions describe the current condition of this listener. - items: - description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, \n \ttype FooStatus struct{ \t // Represents the observations of a foo's current state. \t // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" \t // +patchMergeKey=type \t // +patchStrategy=merge \t // +listType=map \t // +listMapKey=type \t Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n \t // other fields \t}" - properties: - lastTransitionTime: - description: lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: message is a human readable message indicating details about the transition. This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. --- Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 8 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - name: - description: Name is the name of the Listener that this status corresponds to. - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - supportedKinds: - description: "SupportedKinds is the list indicating the Kinds supported by this listener. This MUST represent the kinds an implementation supports for that Listener configuration. \n If kinds are specified in Spec that are not supported, they MUST NOT appear in this list and an implementation MUST set the \"ResolvedRefs\" condition to \"False\" with the \"InvalidRouteKinds\" reason. If both valid and invalid Route kinds are specified, the implementation MUST reference the valid Route kinds that have been specified." - items: - description: RouteGroupKind indicates the group and kind of a Route resource. - properties: - group: - default: gateway.networking.k8s.io - description: Group is the group of the Route. - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - description: Kind is the kind of the Route. - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - required: - - kind - type: object - maxItems: 8 - type: array - required: - - attachedRoutes - - conditions - - name - - supportedKinds - type: object - maxItems: 64 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] -{{- end }} diff --git a/charts/consul/templates/crd-grpcroutes-external.yaml b/charts/consul/templates/crd-grpcroutes-external.yaml deleted file mode 100644 index 739ed2c..0000000 --- a/charts/consul/templates/crd-grpcroutes-external.yaml +++ /dev/null @@ -1,766 +0,0 @@ -{{- if and .Values.connectInject.enabled .Values.connectInject.apiGateway.manageExternalCRDs }} -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/1538 - gateway.networking.k8s.io/bundle-version: v0.6.2 - gateway.networking.k8s.io/channel: experimental - creationTimestamp: null - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: crd - name: grpcroutes.gateway.networking.k8s.io -spec: - group: gateway.networking.k8s.io - names: - categories: - - gateway-api - kind: GRPCRoute - listKind: GRPCRouteList - plural: grpcroutes - singular: grpcroute - scope: Namespaced - versions: - - additionalPrinterColumns: - - jsonPath: .spec.hostnames - name: Hostnames - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha2 - schema: - openAPIV3Schema: - description: "GRPCRoute provides a way to route gRPC requests. This includes the capability to match requests by hostname, gRPC service, gRPC method, or HTTP/2 header. Filters can be used to specify additional processing steps. Backends specify where matching requests will be routed. \n GRPCRoute falls under extended support within the Gateway API. Within the following specification, the word \"MUST\" indicates that an implementation supporting GRPCRoute must conform to the indicated requirement, but an implementation not supporting this route type need not follow the requirement unless explicitly indicated. \n Implementations supporting `GRPCRoute` with the `HTTPS` `ProtocolType` MUST accept HTTP/2 connections without an initial upgrade from HTTP/1.1, i.e. via ALPN. If the implementation does not support this, then it MUST set the \"Accepted\" condition to \"False\" for the affected listener with a reason of \"UnsupportedProtocol\". Implementations MAY also accept HTTP/2 connections with an upgrade from HTTP/1. \n Implementations supporting `GRPCRoute` with the `HTTP` `ProtocolType` MUST support HTTP/2 over cleartext TCP (h2c, https://www.rfc-editor.org/rfc/rfc7540#section-3.1) without an initial upgrade from HTTP/1.1, i.e. with prior knowledge (https://www.rfc-editor.org/rfc/rfc7540#section-3.4). If the implementation does not support this, then it MUST set the \"Accepted\" condition to \"False\" for the affected listener with a reason of \"UnsupportedProtocol\". Implementations MAY also accept HTTP/2 connections with an upgrade from HTTP/1, i.e. without prior knowledge. \n Support: Extended" - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Spec defines the desired state of GRPCRoute. - properties: - hostnames: - description: "Hostnames defines a set of hostnames to match against the GRPC Host header to select a GRPCRoute to process the request. This matches the RFC 1123 definition of a hostname with 2 notable exceptions: \n 1. IPs are not allowed. 2. A hostname may be prefixed with a wildcard label (`*.`). The wildcard label MUST appear by itself as the first label. \n If a hostname is specified by both the Listener and GRPCRoute, there MUST be at least one intersecting hostname for the GRPCRoute to be attached to the Listener. For example: \n * A Listener with `test.example.com` as the hostname matches GRPCRoutes that have either not specified any hostnames, or have specified at least one of `test.example.com` or `*.example.com`. * A Listener with `*.example.com` as the hostname matches GRPCRoutes that have either not specified any hostnames or have specified at least one hostname that matches the Listener hostname. For example, `test.example.com` and `*.example.com` would both match. On the other hand, `example.com` and `test.example.net` would not match. \n Hostnames that are prefixed with a wildcard label (`*.`) are interpreted as a suffix match. That means that a match for `*.example.com` would match both `test.example.com`, and `foo.test.example.com`, but not `example.com`. \n If both the Listener and GRPCRoute have specified hostnames, any GRPCRoute hostnames that do not match the Listener hostname MUST be ignored. For example, if a Listener specified `*.example.com`, and the GRPCRoute specified `test.example.com` and `test.example.net`, `test.example.net` MUST NOT be considered for a match. \n If both the Listener and GRPCRoute have specified hostnames, and none match with the criteria above, then the GRPCRoute MUST NOT be accepted by the implementation. The implementation MUST raise an 'Accepted' Condition with a status of `False` in the corresponding RouteParentStatus. \n If a Route (A) of type HTTPRoute or GRPCRoute is attached to a Listener and that listener already has another Route (B) of the other type attached and the intersection of the hostnames of A and B is non-empty, then the implementation MUST accept exactly one of these two routes, determined by the following criteria, in order: \n * The oldest Route based on creation timestamp. * The Route appearing first in alphabetical order by \"{namespace}/{name}\". \n The rejected Route MUST raise an 'Accepted' condition with a status of 'False' in the corresponding RouteParentStatus. \n Support: Core" - items: - description: "Hostname is the fully qualified domain name of a network host. This matches the RFC 1123 definition of a hostname with 2 notable exceptions: \n 1. IPs are not allowed. 2. A hostname may be prefixed with a wildcard label (`*.`). The wildcard label must appear by itself as the first label. \n Hostname can be \"precise\" which is a domain name without the terminating dot of a network host (e.g. \"foo.example.com\") or \"wildcard\", which is a domain name prefixed with a single wildcard label (e.g. `*.example.com`). \n Note that as per RFC1035 and RFC1123, a *label* must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character. No other punctuation is allowed." - maxLength: 253 - minLength: 1 - pattern: ^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - maxItems: 16 - type: array - parentRefs: - description: "ParentRefs references the resources (usually Gateways) that a Route wants to be attached to. Note that the referenced parent resource needs to allow this for the attachment to be complete. For Gateways, that means the Gateway needs to allow attachment from Routes of this kind and namespace. \n The only kind of parent resource with \"Core\" support is Gateway. This API may be extended in the future to support additional kinds of parent resources such as one of the route kinds. \n It is invalid to reference an identical parent more than once. It is valid to reference multiple distinct sections within the same parent resource, such as 2 Listeners within a Gateway. \n It is possible to separately reference multiple distinct objects that may be collapsed by an implementation. For example, some implementations may choose to merge compatible Gateway Listeners together. If that is the case, the list of routes attached to those resources should also be merged. \n Note that for ParentRefs that cross namespace boundaries, there are specific rules. Cross-namespace references are only valid if they are explicitly allowed by something in the namespace they are referring to. For example, Gateway has the AllowedRoutes field, and ReferenceGrant provides a generic way to enable any other kind of cross-namespace reference." - items: - description: "ParentReference identifies an API object (usually a Gateway) that can be considered a parent of this resource (usually a route). The only kind of parent resource with \"Core\" support is Gateway. This API may be extended in the future to support additional kinds of parent resources, such as HTTPRoute. \n The API object must be valid in the cluster; the Group and Kind must be registered in the cluster for this reference to be valid." - properties: - group: - default: gateway.networking.k8s.io - description: "Group is the group of the referent. When unspecified, \"gateway.networking.k8s.io\" is inferred. To set the core API group (such as for a \"Service\" kind referent), Group must be explicitly set to \"\" (empty string). \n Support: Core" - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - default: Gateway - description: "Kind is kind of the referent. \n Support: Core (Gateway) \n Support: Implementation-specific (Other Resources)" - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - name: - description: "Name is the name of the referent. \n Support: Core" - maxLength: 253 - minLength: 1 - type: string - namespace: - description: "Namespace is the namespace of the referent. When unspecified, this refers to the local namespace of the Route. \n Note that there are specific rules for ParentRefs which cross namespace boundaries. Cross-namespace references are only valid if they are explicitly allowed by something in the namespace they are referring to. For example: Gateway has the AllowedRoutes field, and ReferenceGrant provides a generic way to enable any other kind of cross-namespace reference. \n Support: Core" - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - type: string - port: - description: "Port is the network port this Route targets. It can be interpreted differently based on the type of parent resource. \n When the parent resource is a Gateway, this targets all listeners listening on the specified port that also support this kind of Route(and select this Route). It's not recommended to set `Port` unless the networking behaviors specified in a Route must apply to a specific port as opposed to a listener(s) whose port(s) may be changed. When both Port and SectionName are specified, the name and port of the selected listener must match both specified values. \n Implementations MAY choose to support other parent resources. Implementations supporting other types of parent resources MUST clearly document how/if Port is interpreted. \n For the purpose of status, an attachment is considered successful as long as the parent resource accepts it partially. For example, Gateway listeners can restrict which Routes can attach to them by Route kind, namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from the referencing Route, the Route MUST be considered successfully attached. If no Gateway listeners accept attachment from this Route, the Route MUST be considered detached from the Gateway. \n Support: Extended \n " - format: int32 - maximum: 65535 - minimum: 1 - type: integer - sectionName: - description: "SectionName is the name of a section within the target resource. In the following resources, SectionName is interpreted as the following: \n * Gateway: Listener Name. When both Port (experimental) and SectionName are specified, the name and port of the selected listener must match both specified values. \n Implementations MAY choose to support attaching Routes to other resources. If that is the case, they MUST clearly document how SectionName is interpreted. \n When unspecified (empty string), this will reference the entire resource. For the purpose of status, an attachment is considered successful if at least one section in the parent resource accepts it. For example, Gateway listeners can restrict which Routes can attach to them by Route kind, namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from the referencing Route, the Route MUST be considered successfully attached. If no Gateway listeners accept attachment from this Route, the Route MUST be considered detached from the Gateway. \n Support: Core" - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - required: - - name - type: object - maxItems: 32 - type: array - rules: - default: - - matches: - - method: - type: Exact - description: Rules are a list of GRPC matchers, filters and actions. - items: - description: GRPCRouteRule defines the semantics for matching an gRPC request based on conditions (matches), processing it (filters), and forwarding the request to an API object (backendRefs). - properties: - backendRefs: - description: "BackendRefs defines the backend(s) where matching requests should be sent. \n Failure behavior here depends on how many BackendRefs are specified and how many are invalid. \n If *all* entries in BackendRefs are invalid, and there are also no filters specified in this route rule, *all* traffic which matches this rule MUST receive an `UNAVAILABLE` status. \n See the GRPCBackendRef definition for the rules about what makes a single GRPCBackendRef invalid. \n When a GRPCBackendRef is invalid, `UNAVAILABLE` statuses MUST be returned for requests that would have otherwise been routed to an invalid backend. If multiple backends are specified, and some are invalid, the proportion of requests that would otherwise have been routed to an invalid backend MUST receive an `UNAVAILABLE` status. \n For example, if two backends are specified with equal weights, and one is invalid, 50 percent of traffic MUST receive an `UNAVAILABLE` status. Implementations may choose how that 50 percent is determined. \n Support: Core for Kubernetes Service \n Support: Implementation-specific for any other resource \n Support for weight: Core" - items: - description: GRPCBackendRef defines how a GRPCRoute forwards a gRPC request. - properties: - filters: - description: "Filters defined at this level MUST be executed if and only if the request is being forwarded to the backend defined here. \n Support: Implementation-specific (For broader support of filters, use the Filters field in GRPCRouteRule.)" - items: - description: GRPCRouteFilter defines processing steps that must be completed during the request or response lifecycle. GRPCRouteFilters are meant as an extension point to express processing that may be done in Gateway implementations. Some examples include request or response modification, implementing authentication strategies, rate-limiting, and traffic shaping. API guarantee/conformance is defined based on the type of the filter. - properties: - extensionRef: - description: "ExtensionRef is an optional, implementation-specific extension to the \"filter\" behavior. For example, resource \"myroutefilter\" in group \"networking.example.net\"). ExtensionRef MUST NOT be used for core and extended filters. \n Support: Implementation-specific" - properties: - group: - description: Group is the group of the referent. For example, "gateway.networking.k8s.io". When unspecified or empty string, core API group is inferred. - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - description: Kind is kind of the referent. For example "HTTPRoute" or "Service". - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - name: - description: Name is the name of the referent. - maxLength: 253 - minLength: 1 - type: string - required: - - group - - kind - - name - type: object - requestHeaderModifier: - description: "RequestHeaderModifier defines a schema for a filter that modifies request headers. \n Support: Core" - properties: - add: - description: "Add adds the given header(s) (name, value) to the request before the action. It appends to any existing values associated with the header name. \n Input: GET /foo HTTP/1.1 my-header: foo \n Config: add: - name: \"my-header\" value: \"bar,baz\" \n Output: GET /foo HTTP/1.1 my-header: foo,bar,baz" - items: - description: HTTPHeader represents an HTTP Header name and value as defined by RFC 7230. - properties: - name: - description: "Name is the name of the HTTP Header to be matched. Name matching MUST be case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). \n If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries with an equivalent header name MUST be ignored. Due to the case-insensitivity of header names, \"foo\" and \"Foo\" are considered equivalent." - maxLength: 256 - minLength: 1 - pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ - type: string - value: - description: Value is the value of HTTP Header to be matched. - maxLength: 4096 - minLength: 1 - type: string - required: - - name - - value - type: object - maxItems: 16 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - remove: - description: "Remove the given header(s) from the HTTP request before the action. The value of Remove is a list of HTTP header names. Note that the header names are case-insensitive (see https://datatracker.ietf.org/doc/html/rfc2616#section-4.2). \n Input: GET /foo HTTP/1.1 my-header1: foo my-header2: bar my-header3: baz \n Config: remove: [\"my-header1\", \"my-header3\"] \n Output: GET /foo HTTP/1.1 my-header2: bar" - items: - type: string - maxItems: 16 - type: array - set: - description: "Set overwrites the request with the given header (name, value) before the action. \n Input: GET /foo HTTP/1.1 my-header: foo \n Config: set: - name: \"my-header\" value: \"bar\" \n Output: GET /foo HTTP/1.1 my-header: bar" - items: - description: HTTPHeader represents an HTTP Header name and value as defined by RFC 7230. - properties: - name: - description: "Name is the name of the HTTP Header to be matched. Name matching MUST be case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). \n If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries with an equivalent header name MUST be ignored. Due to the case-insensitivity of header names, \"foo\" and \"Foo\" are considered equivalent." - maxLength: 256 - minLength: 1 - pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ - type: string - value: - description: Value is the value of HTTP Header to be matched. - maxLength: 4096 - minLength: 1 - type: string - required: - - name - - value - type: object - maxItems: 16 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - type: object - requestMirror: - description: "RequestMirror defines a schema for a filter that mirrors requests. Requests are sent to the specified destination, but responses from that destination are ignored. \n Support: Extended" - properties: - backendRef: - description: "BackendRef references a resource where mirrored requests are sent. \n If the referent cannot be found, this BackendRef is invalid and must be dropped from the Gateway. The controller must ensure the \"ResolvedRefs\" condition on the Route status is set to `status: False` and not configure this backend in the underlying implementation. \n If there is a cross-namespace reference to an *existing* object that is not allowed by a ReferenceGrant, the controller must ensure the \"ResolvedRefs\" condition on the Route is set to `status: False`, with the \"RefNotPermitted\" reason and not configure this backend in the underlying implementation. \n In either error case, the Message of the `ResolvedRefs` Condition should be used to provide more detail about the problem. \n Support: Extended for Kubernetes Service \n Support: Implementation-specific for any other resource" - properties: - group: - default: "" - description: Group is the group of the referent. For example, "gateway.networking.k8s.io". When unspecified or empty string, core API group is inferred. - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - default: Service - description: Kind is kind of the referent. For example "HTTPRoute" or "Service". Defaults to "Service" when not specified. - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - name: - description: Name is the name of the referent. - maxLength: 253 - minLength: 1 - type: string - namespace: - description: "Namespace is the namespace of the backend. When unspecified, the local namespace is inferred. \n Note that when a namespace is specified, a ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details. \n Support: Core" - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - type: string - port: - description: Port specifies the destination port number to use for this resource. Port is required when the referent is a Kubernetes Service. In this case, the port number is the service port number, not the target port. For other resources, destination port might be derived from the referent resource or this field. - format: int32 - maximum: 65535 - minimum: 1 - type: integer - required: - - name - type: object - required: - - backendRef - type: object - responseHeaderModifier: - description: "ResponseHeaderModifier defines a schema for a filter that modifies response headers. \n Support: Extended \n " - properties: - add: - description: "Add adds the given header(s) (name, value) to the request before the action. It appends to any existing values associated with the header name. \n Input: GET /foo HTTP/1.1 my-header: foo \n Config: add: - name: \"my-header\" value: \"bar,baz\" \n Output: GET /foo HTTP/1.1 my-header: foo,bar,baz" - items: - description: HTTPHeader represents an HTTP Header name and value as defined by RFC 7230. - properties: - name: - description: "Name is the name of the HTTP Header to be matched. Name matching MUST be case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). \n If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries with an equivalent header name MUST be ignored. Due to the case-insensitivity of header names, \"foo\" and \"Foo\" are considered equivalent." - maxLength: 256 - minLength: 1 - pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ - type: string - value: - description: Value is the value of HTTP Header to be matched. - maxLength: 4096 - minLength: 1 - type: string - required: - - name - - value - type: object - maxItems: 16 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - remove: - description: "Remove the given header(s) from the HTTP request before the action. The value of Remove is a list of HTTP header names. Note that the header names are case-insensitive (see https://datatracker.ietf.org/doc/html/rfc2616#section-4.2). \n Input: GET /foo HTTP/1.1 my-header1: foo my-header2: bar my-header3: baz \n Config: remove: [\"my-header1\", \"my-header3\"] \n Output: GET /foo HTTP/1.1 my-header2: bar" - items: - type: string - maxItems: 16 - type: array - set: - description: "Set overwrites the request with the given header (name, value) before the action. \n Input: GET /foo HTTP/1.1 my-header: foo \n Config: set: - name: \"my-header\" value: \"bar\" \n Output: GET /foo HTTP/1.1 my-header: bar" - items: - description: HTTPHeader represents an HTTP Header name and value as defined by RFC 7230. - properties: - name: - description: "Name is the name of the HTTP Header to be matched. Name matching MUST be case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). \n If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries with an equivalent header name MUST be ignored. Due to the case-insensitivity of header names, \"foo\" and \"Foo\" are considered equivalent." - maxLength: 256 - minLength: 1 - pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ - type: string - value: - description: Value is the value of HTTP Header to be matched. - maxLength: 4096 - minLength: 1 - type: string - required: - - name - - value - type: object - maxItems: 16 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - type: object - type: - description: "Type identifies the type of filter to apply. As with other API fields, types are classified into three conformance levels: \n - Core: Filter types and their corresponding configuration defined by \"Support: Core\" in this package, e.g. \"RequestHeaderModifier\". All implementations supporting GRPCRoute MUST support core filters. \n - Extended: Filter types and their corresponding configuration defined by \"Support: Extended\" in this package, e.g. \"RequestMirror\". Implementers are encouraged to support extended filters. \n - Implementation-specific: Filters that are defined and supported by specific vendors. In the future, filters showing convergence in behavior across multiple implementations will be considered for inclusion in extended or core conformance levels. Filter-specific configuration for such filters is specified using the ExtensionRef field. `Type` MUST be set to \"ExtensionRef\" for custom filters. \n Implementers are encouraged to define custom implementation types to extend the core API with implementation-specific behavior. \n If a reference to a custom filter type cannot be resolved, the filter MUST NOT be skipped. Instead, requests that would have been processed by that filter MUST receive a HTTP error response. \n " - enum: - - ResponseHeaderModifier - - RequestHeaderModifier - - RequestMirror - - ExtensionRef - type: string - required: - - type - type: object - maxItems: 16 - type: array - group: - default: "" - description: Group is the group of the referent. For example, "gateway.networking.k8s.io". When unspecified or empty string, core API group is inferred. - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - default: Service - description: Kind is kind of the referent. For example "HTTPRoute" or "Service". Defaults to "Service" when not specified. - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - name: - description: Name is the name of the referent. - maxLength: 253 - minLength: 1 - type: string - namespace: - description: "Namespace is the namespace of the backend. When unspecified, the local namespace is inferred. \n Note that when a namespace is specified, a ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details. \n Support: Core" - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - type: string - port: - description: Port specifies the destination port number to use for this resource. Port is required when the referent is a Kubernetes Service. In this case, the port number is the service port number, not the target port. For other resources, destination port might be derived from the referent resource or this field. - format: int32 - maximum: 65535 - minimum: 1 - type: integer - weight: - default: 1 - description: "Weight specifies the proportion of requests forwarded to the referenced backend. This is computed as weight/(sum of all weights in this BackendRefs list). For non-zero values, there may be some epsilon from the exact proportion defined here depending on the precision an implementation supports. Weight is not a percentage and the sum of weights does not need to equal 100. \n If only one backend is specified and it has a weight greater than 0, 100% of the traffic is forwarded to that backend. If weight is set to 0, no traffic should be forwarded for this entry. If unspecified, weight defaults to 1. \n Support for this field varies based on the context where used." - format: int32 - maximum: 1000000 - minimum: 0 - type: integer - required: - - name - type: object - maxItems: 16 - type: array - filters: - description: "Filters define the filters that are applied to requests that match this rule. \n The effects of ordering of multiple behaviors are currently unspecified. This can change in the future based on feedback during the alpha stage. \n Conformance-levels at this level are defined based on the type of filter: \n - ALL core filters MUST be supported by all implementations that support GRPCRoute. - Implementers are encouraged to support extended filters. - Implementation-specific custom filters have no API guarantees across implementations. \n Specifying a core filter multiple times has unspecified or implementation-specific conformance. Support: Core" - items: - description: GRPCRouteFilter defines processing steps that must be completed during the request or response lifecycle. GRPCRouteFilters are meant as an extension point to express processing that may be done in Gateway implementations. Some examples include request or response modification, implementing authentication strategies, rate-limiting, and traffic shaping. API guarantee/conformance is defined based on the type of the filter. - properties: - extensionRef: - description: "ExtensionRef is an optional, implementation-specific extension to the \"filter\" behavior. For example, resource \"myroutefilter\" in group \"networking.example.net\"). ExtensionRef MUST NOT be used for core and extended filters. \n Support: Implementation-specific" - properties: - group: - description: Group is the group of the referent. For example, "gateway.networking.k8s.io". When unspecified or empty string, core API group is inferred. - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - description: Kind is kind of the referent. For example "HTTPRoute" or "Service". - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - name: - description: Name is the name of the referent. - maxLength: 253 - minLength: 1 - type: string - required: - - group - - kind - - name - type: object - requestHeaderModifier: - description: "RequestHeaderModifier defines a schema for a filter that modifies request headers. \n Support: Core" - properties: - add: - description: "Add adds the given header(s) (name, value) to the request before the action. It appends to any existing values associated with the header name. \n Input: GET /foo HTTP/1.1 my-header: foo \n Config: add: - name: \"my-header\" value: \"bar,baz\" \n Output: GET /foo HTTP/1.1 my-header: foo,bar,baz" - items: - description: HTTPHeader represents an HTTP Header name and value as defined by RFC 7230. - properties: - name: - description: "Name is the name of the HTTP Header to be matched. Name matching MUST be case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). \n If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries with an equivalent header name MUST be ignored. Due to the case-insensitivity of header names, \"foo\" and \"Foo\" are considered equivalent." - maxLength: 256 - minLength: 1 - pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ - type: string - value: - description: Value is the value of HTTP Header to be matched. - maxLength: 4096 - minLength: 1 - type: string - required: - - name - - value - type: object - maxItems: 16 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - remove: - description: "Remove the given header(s) from the HTTP request before the action. The value of Remove is a list of HTTP header names. Note that the header names are case-insensitive (see https://datatracker.ietf.org/doc/html/rfc2616#section-4.2). \n Input: GET /foo HTTP/1.1 my-header1: foo my-header2: bar my-header3: baz \n Config: remove: [\"my-header1\", \"my-header3\"] \n Output: GET /foo HTTP/1.1 my-header2: bar" - items: - type: string - maxItems: 16 - type: array - set: - description: "Set overwrites the request with the given header (name, value) before the action. \n Input: GET /foo HTTP/1.1 my-header: foo \n Config: set: - name: \"my-header\" value: \"bar\" \n Output: GET /foo HTTP/1.1 my-header: bar" - items: - description: HTTPHeader represents an HTTP Header name and value as defined by RFC 7230. - properties: - name: - description: "Name is the name of the HTTP Header to be matched. Name matching MUST be case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). \n If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries with an equivalent header name MUST be ignored. Due to the case-insensitivity of header names, \"foo\" and \"Foo\" are considered equivalent." - maxLength: 256 - minLength: 1 - pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ - type: string - value: - description: Value is the value of HTTP Header to be matched. - maxLength: 4096 - minLength: 1 - type: string - required: - - name - - value - type: object - maxItems: 16 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - type: object - requestMirror: - description: "RequestMirror defines a schema for a filter that mirrors requests. Requests are sent to the specified destination, but responses from that destination are ignored. \n Support: Extended" - properties: - backendRef: - description: "BackendRef references a resource where mirrored requests are sent. \n If the referent cannot be found, this BackendRef is invalid and must be dropped from the Gateway. The controller must ensure the \"ResolvedRefs\" condition on the Route status is set to `status: False` and not configure this backend in the underlying implementation. \n If there is a cross-namespace reference to an *existing* object that is not allowed by a ReferenceGrant, the controller must ensure the \"ResolvedRefs\" condition on the Route is set to `status: False`, with the \"RefNotPermitted\" reason and not configure this backend in the underlying implementation. \n In either error case, the Message of the `ResolvedRefs` Condition should be used to provide more detail about the problem. \n Support: Extended for Kubernetes Service \n Support: Implementation-specific for any other resource" - properties: - group: - default: "" - description: Group is the group of the referent. For example, "gateway.networking.k8s.io". When unspecified or empty string, core API group is inferred. - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - default: Service - description: Kind is kind of the referent. For example "HTTPRoute" or "Service". Defaults to "Service" when not specified. - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - name: - description: Name is the name of the referent. - maxLength: 253 - minLength: 1 - type: string - namespace: - description: "Namespace is the namespace of the backend. When unspecified, the local namespace is inferred. \n Note that when a namespace is specified, a ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details. \n Support: Core" - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - type: string - port: - description: Port specifies the destination port number to use for this resource. Port is required when the referent is a Kubernetes Service. In this case, the port number is the service port number, not the target port. For other resources, destination port might be derived from the referent resource or this field. - format: int32 - maximum: 65535 - minimum: 1 - type: integer - required: - - name - type: object - required: - - backendRef - type: object - responseHeaderModifier: - description: "ResponseHeaderModifier defines a schema for a filter that modifies response headers. \n Support: Extended \n " - properties: - add: - description: "Add adds the given header(s) (name, value) to the request before the action. It appends to any existing values associated with the header name. \n Input: GET /foo HTTP/1.1 my-header: foo \n Config: add: - name: \"my-header\" value: \"bar,baz\" \n Output: GET /foo HTTP/1.1 my-header: foo,bar,baz" - items: - description: HTTPHeader represents an HTTP Header name and value as defined by RFC 7230. - properties: - name: - description: "Name is the name of the HTTP Header to be matched. Name matching MUST be case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). \n If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries with an equivalent header name MUST be ignored. Due to the case-insensitivity of header names, \"foo\" and \"Foo\" are considered equivalent." - maxLength: 256 - minLength: 1 - pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ - type: string - value: - description: Value is the value of HTTP Header to be matched. - maxLength: 4096 - minLength: 1 - type: string - required: - - name - - value - type: object - maxItems: 16 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - remove: - description: "Remove the given header(s) from the HTTP request before the action. The value of Remove is a list of HTTP header names. Note that the header names are case-insensitive (see https://datatracker.ietf.org/doc/html/rfc2616#section-4.2). \n Input: GET /foo HTTP/1.1 my-header1: foo my-header2: bar my-header3: baz \n Config: remove: [\"my-header1\", \"my-header3\"] \n Output: GET /foo HTTP/1.1 my-header2: bar" - items: - type: string - maxItems: 16 - type: array - set: - description: "Set overwrites the request with the given header (name, value) before the action. \n Input: GET /foo HTTP/1.1 my-header: foo \n Config: set: - name: \"my-header\" value: \"bar\" \n Output: GET /foo HTTP/1.1 my-header: bar" - items: - description: HTTPHeader represents an HTTP Header name and value as defined by RFC 7230. - properties: - name: - description: "Name is the name of the HTTP Header to be matched. Name matching MUST be case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). \n If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries with an equivalent header name MUST be ignored. Due to the case-insensitivity of header names, \"foo\" and \"Foo\" are considered equivalent." - maxLength: 256 - minLength: 1 - pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ - type: string - value: - description: Value is the value of HTTP Header to be matched. - maxLength: 4096 - minLength: 1 - type: string - required: - - name - - value - type: object - maxItems: 16 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - type: object - type: - description: "Type identifies the type of filter to apply. As with other API fields, types are classified into three conformance levels: \n - Core: Filter types and their corresponding configuration defined by \"Support: Core\" in this package, e.g. \"RequestHeaderModifier\". All implementations supporting GRPCRoute MUST support core filters. \n - Extended: Filter types and their corresponding configuration defined by \"Support: Extended\" in this package, e.g. \"RequestMirror\". Implementers are encouraged to support extended filters. \n - Implementation-specific: Filters that are defined and supported by specific vendors. In the future, filters showing convergence in behavior across multiple implementations will be considered for inclusion in extended or core conformance levels. Filter-specific configuration for such filters is specified using the ExtensionRef field. `Type` MUST be set to \"ExtensionRef\" for custom filters. \n Implementers are encouraged to define custom implementation types to extend the core API with implementation-specific behavior. \n If a reference to a custom filter type cannot be resolved, the filter MUST NOT be skipped. Instead, requests that would have been processed by that filter MUST receive a HTTP error response. \n " - enum: - - ResponseHeaderModifier - - RequestHeaderModifier - - RequestMirror - - ExtensionRef - type: string - required: - - type - type: object - maxItems: 16 - type: array - matches: - default: - - method: - type: Exact - description: "Matches define conditions used for matching the rule against incoming gRPC requests. Each match is independent, i.e. this rule will be matched if **any** one of the matches is satisfied. \n For example, take the following matches configuration: \n ``` matches: - method: service: foo.bar headers: values: version: 2 - method: service: foo.bar.v2 ``` \n For a request to match against this rule, it MUST satisfy EITHER of the two conditions: \n - service of foo.bar AND contains the header `version: 2` - service of foo.bar.v2 \n See the documentation for GRPCRouteMatch on how to specify multiple match conditions to be ANDed together. \n If no matches are specified, the implementation MUST match every gRPC request. \n Proxy or Load Balancer routing configuration generated from GRPCRoutes MUST prioritize rules based on the following criteria, continuing on ties. Merging MUST not be done between GRPCRoutes and HTTPRoutes. Precedence MUST be given to the rule with the largest number of: \n * Characters in a matching non-wildcard hostname. * Characters in a matching hostname. * Characters in a matching service. * Characters in a matching method. * Header matches. \n If ties still exist across multiple Routes, matching precedence MUST be determined in order of the following criteria, continuing on ties: \n * The oldest Route based on creation timestamp. * The Route appearing first in alphabetical order by \"{namespace}/{name}\". \n If ties still exist within the Route that has been given precedence, matching precedence MUST be granted to the first matching rule meeting the above criteria." - items: - description: "GRPCRouteMatch defines the predicate used to match requests to a given action. Multiple match types are ANDed together, i.e. the match will evaluate to true only if all conditions are satisfied. \n For example, the match below will match a gRPC request only if its service is `foo` AND it contains the `version: v1` header: \n ``` matches: - method: type: Exact service: \"foo\" headers: - name: \"version\" value \"v1\" \n ```" - properties: - headers: - description: Headers specifies gRPC request header matchers. Multiple match values are ANDed together, meaning, a request MUST match all the specified headers to select the route. - items: - description: GRPCHeaderMatch describes how to select a gRPC route by matching gRPC request headers. - properties: - name: - description: "Name is the name of the gRPC Header to be matched. \n If multiple entries specify equivalent header names, only the first entry with an equivalent name MUST be considered for a match. Subsequent entries with an equivalent header name MUST be ignored. Due to the case-insensitivity of header names, \"foo\" and \"Foo\" are considered equivalent." - maxLength: 256 - minLength: 1 - pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ - type: string - type: - default: Exact - description: Type specifies how to match against the value of the header. - enum: - - Exact - - RegularExpression - type: string - value: - description: Value is the value of the gRPC Header to be matched. - maxLength: 4096 - minLength: 1 - type: string - required: - - name - - value - type: object - maxItems: 16 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - method: - default: - type: Exact - description: Method specifies a gRPC request service/method matcher. If this field is not specified, all services and methods will match. - properties: - method: - description: "Value of the method to match against. If left empty or omitted, will match all services. \n At least one of Service and Method MUST be a non-empty string. \n A GRPC Method must be a valid Protobuf Method (https://protobuf.com/docs/language-spec#methods)." - maxLength: 1024 - pattern: ^[A-Za-z_][A-Za-z_0-9]*$ - type: string - service: - description: "Value of the service to match against. If left empty or omitted, will match any service. \n At least one of Service and Method MUST be a non-empty string. \n A GRPC Service must be a valid Protobuf Type Name (https://protobuf.com/docs/language-spec#type-references)." - maxLength: 1024 - pattern: ^(?i)\.?[a-z_][a-z_0-9]*(\.[a-z_][a-z_0-9]*)*$ - type: string - type: - default: Exact - description: "Type specifies how to match against the service and/or method. Support: Core (Exact with service and method specified) \n Support: Implementation-specific (Exact with method specified but no service specified) \n Support: Implementation-specific (RegularExpression)" - enum: - - Exact - - RegularExpression - type: string - type: object - type: object - maxItems: 8 - type: array - type: object - maxItems: 16 - type: array - type: object - status: - description: Status defines the current state of GRPCRoute. - properties: - parents: - description: "Parents is a list of parent resources (usually Gateways) that are associated with the route, and the status of the route with respect to each parent. When this route attaches to a parent, the controller that manages the parent must add an entry to this list when the controller first sees the route and should update the entry as appropriate when the route or gateway is modified. \n Note that parent references that cannot be resolved by an implementation of this API will not be added to this list. Implementations of this API can only populate Route status for the Gateways/parent resources they are responsible for. \n A maximum of 32 Gateways will be represented in this list. An empty list means the route has not been attached to any Gateway." - items: - description: RouteParentStatus describes the status of a route with respect to an associated Parent. - properties: - conditions: - description: "Conditions describes the status of the route with respect to the Gateway. Note that the route's availability is also subject to the Gateway's own status conditions and listener status. \n If the Route's ParentRef specifies an existing Gateway that supports Routes of this kind AND that Gateway's controller has sufficient access, then that Gateway's controller MUST set the \"Accepted\" condition on the Route, to indicate whether the route has been accepted or rejected by the Gateway, and why. \n A Route MUST be considered \"Accepted\" if at least one of the Route's rules is implemented by the Gateway. \n There are a number of cases where the \"Accepted\" condition may not be set due to lack of controller visibility, that includes when: \n * The Route refers to a non-existent parent. * The Route is of a type that the controller does not support. * The Route is in a namespace the controller does not have access to." - items: - description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, \n \ttype FooStatus struct{ \t // Represents the observations of a foo's current state. \t // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" \t // +patchMergeKey=type \t // +patchStrategy=merge \t // +listType=map \t // +listMapKey=type \t Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n \t // other fields \t}" - properties: - lastTransitionTime: - description: lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: message is a human readable message indicating details about the transition. This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. --- Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 8 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - controllerName: - description: "ControllerName is a domain/path string that indicates the name of the controller that wrote this status. This corresponds with the controllerName field on GatewayClass. \n Example: \"example.net/gateway-controller\". \n The format of this field is DOMAIN \"/\" PATH, where DOMAIN and PATH are valid Kubernetes names (https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names). \n Controllers MUST populate this field when writing status. Controllers should ensure that entries to status populated with their ControllerName are cleaned up when they are no longer necessary." - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$ - type: string - parentRef: - description: ParentRef corresponds with a ParentRef in the spec that this RouteParentStatus struct describes the status of. - properties: - group: - default: gateway.networking.k8s.io - description: "Group is the group of the referent. When unspecified, \"gateway.networking.k8s.io\" is inferred. To set the core API group (such as for a \"Service\" kind referent), Group must be explicitly set to \"\" (empty string). \n Support: Core" - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - default: Gateway - description: "Kind is kind of the referent. \n Support: Core (Gateway) \n Support: Implementation-specific (Other Resources)" - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - name: - description: "Name is the name of the referent. \n Support: Core" - maxLength: 253 - minLength: 1 - type: string - namespace: - description: "Namespace is the namespace of the referent. When unspecified, this refers to the local namespace of the Route. \n Note that there are specific rules for ParentRefs which cross namespace boundaries. Cross-namespace references are only valid if they are explicitly allowed by something in the namespace they are referring to. For example: Gateway has the AllowedRoutes field, and ReferenceGrant provides a generic way to enable any other kind of cross-namespace reference. \n Support: Core" - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - type: string - port: - description: "Port is the network port this Route targets. It can be interpreted differently based on the type of parent resource. \n When the parent resource is a Gateway, this targets all listeners listening on the specified port that also support this kind of Route(and select this Route). It's not recommended to set `Port` unless the networking behaviors specified in a Route must apply to a specific port as opposed to a listener(s) whose port(s) may be changed. When both Port and SectionName are specified, the name and port of the selected listener must match both specified values. \n Implementations MAY choose to support other parent resources. Implementations supporting other types of parent resources MUST clearly document how/if Port is interpreted. \n For the purpose of status, an attachment is considered successful as long as the parent resource accepts it partially. For example, Gateway listeners can restrict which Routes can attach to them by Route kind, namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from the referencing Route, the Route MUST be considered successfully attached. If no Gateway listeners accept attachment from this Route, the Route MUST be considered detached from the Gateway. \n Support: Extended \n " - format: int32 - maximum: 65535 - minimum: 1 - type: integer - sectionName: - description: "SectionName is the name of a section within the target resource. In the following resources, SectionName is interpreted as the following: \n * Gateway: Listener Name. When both Port (experimental) and SectionName are specified, the name and port of the selected listener must match both specified values. \n Implementations MAY choose to support attaching Routes to other resources. If that is the case, they MUST clearly document how SectionName is interpreted. \n When unspecified (empty string), this will reference the entire resource. For the purpose of status, an attachment is considered successful if at least one section in the parent resource accepts it. For example, Gateway listeners can restrict which Routes can attach to them by Route kind, namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from the referencing Route, the Route MUST be considered successfully attached. If no Gateway listeners accept attachment from this Route, the Route MUST be considered detached from the Gateway. \n Support: Core" - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - required: - - name - type: object - required: - - controllerName - - parentRef - type: object - maxItems: 32 - type: array - required: - - parents - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] -{{- end }} diff --git a/charts/consul/templates/crd-httproutes-external.yaml b/charts/consul/templates/crd-httproutes-external.yaml deleted file mode 100644 index bba3672..0000000 --- a/charts/consul/templates/crd-httproutes-external.yaml +++ /dev/null @@ -1,1914 +0,0 @@ -{{- if and .Values.connectInject.enabled .Values.connectInject.apiGateway.manageExternalCRDs }} -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/1538 - gateway.networking.k8s.io/bundle-version: v0.6.2 - gateway.networking.k8s.io/channel: experimental - creationTimestamp: null - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: crd - name: httproutes.gateway.networking.k8s.io -spec: - group: gateway.networking.k8s.io - names: - categories: - - gateway-api - kind: HTTPRoute - listKind: HTTPRouteList - plural: httproutes - singular: httproute - scope: Namespaced - versions: - - additionalPrinterColumns: - - jsonPath: .spec.hostnames - name: Hostnames - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - deprecated: true - deprecationWarning: The v1alpha2 version of HTTPRoute has been deprecated and will be removed in a future release of the API. Please upgrade to v1beta1. - name: v1alpha2 - schema: - openAPIV3Schema: - description: HTTPRoute provides a way to route HTTP requests. This includes the capability to match requests by hostname, path, header, or query param. Filters can be used to specify additional processing steps. Backends specify where matching requests should be routed. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Spec defines the desired state of HTTPRoute. - properties: - hostnames: - description: "Hostnames defines a set of hostname that should match against the HTTP Host header to select a HTTPRoute to process the request. This matches the RFC 1123 definition of a hostname with 2 notable exceptions: \n 1. IPs are not allowed. 2. A hostname may be prefixed with a wildcard label (`*.`). The wildcard label must appear by itself as the first label. \n If a hostname is specified by both the Listener and HTTPRoute, there must be at least one intersecting hostname for the HTTPRoute to be attached to the Listener. For example: \n * A Listener with `test.example.com` as the hostname matches HTTPRoutes that have either not specified any hostnames, or have specified at least one of `test.example.com` or `*.example.com`. * A Listener with `*.example.com` as the hostname matches HTTPRoutes that have either not specified any hostnames or have specified at least one hostname that matches the Listener hostname. For example, `*.example.com`, `test.example.com`, and `foo.test.example.com` would all match. On the other hand, `example.com` and `test.example.net` would not match. \n Hostnames that are prefixed with a wildcard label (`*.`) are interpreted as a suffix match. That means that a match for `*.example.com` would match both `test.example.com`, and `foo.test.example.com`, but not `example.com`. \n If both the Listener and HTTPRoute have specified hostnames, any HTTPRoute hostnames that do not match the Listener hostname MUST be ignored. For example, if a Listener specified `*.example.com`, and the HTTPRoute specified `test.example.com` and `test.example.net`, `test.example.net` must not be considered for a match. \n If both the Listener and HTTPRoute have specified hostnames, and none match with the criteria above, then the HTTPRoute is not accepted. The implementation must raise an 'Accepted' Condition with a status of `False` in the corresponding RouteParentStatus. \n In the event that multiple HTTPRoutes specify intersecting hostnames (e.g. overlapping wildcard matching and exact matching hostnames), precedence must be given to rules from the HTTPRoute with the largest number of: \n * Characters in a matching non-wildcard hostname. * Characters in a matching hostname. \n If ties exist across multiple Routes, the matching precedence rules for HTTPRouteMatches takes over. \n Support: Core" - items: - description: "Hostname is the fully qualified domain name of a network host. This matches the RFC 1123 definition of a hostname with 2 notable exceptions: \n 1. IPs are not allowed. 2. A hostname may be prefixed with a wildcard label (`*.`). The wildcard label must appear by itself as the first label. \n Hostname can be \"precise\" which is a domain name without the terminating dot of a network host (e.g. \"foo.example.com\") or \"wildcard\", which is a domain name prefixed with a single wildcard label (e.g. `*.example.com`). \n Note that as per RFC1035 and RFC1123, a *label* must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character. No other punctuation is allowed." - maxLength: 253 - minLength: 1 - pattern: ^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - maxItems: 16 - type: array - parentRefs: - description: "ParentRefs references the resources (usually Gateways) that a Route wants to be attached to. Note that the referenced parent resource needs to allow this for the attachment to be complete. For Gateways, that means the Gateway needs to allow attachment from Routes of this kind and namespace. \n The only kind of parent resource with \"Core\" support is Gateway. This API may be extended in the future to support additional kinds of parent resources such as one of the route kinds. \n It is invalid to reference an identical parent more than once. It is valid to reference multiple distinct sections within the same parent resource, such as 2 Listeners within a Gateway. \n It is possible to separately reference multiple distinct objects that may be collapsed by an implementation. For example, some implementations may choose to merge compatible Gateway Listeners together. If that is the case, the list of routes attached to those resources should also be merged. \n Note that for ParentRefs that cross namespace boundaries, there are specific rules. Cross-namespace references are only valid if they are explicitly allowed by something in the namespace they are referring to. For example, Gateway has the AllowedRoutes field, and ReferenceGrant provides a generic way to enable any other kind of cross-namespace reference." - items: - description: "ParentReference identifies an API object (usually a Gateway) that can be considered a parent of this resource (usually a route). The only kind of parent resource with \"Core\" support is Gateway. This API may be extended in the future to support additional kinds of parent resources, such as HTTPRoute. \n The API object must be valid in the cluster; the Group and Kind must be registered in the cluster for this reference to be valid." - properties: - group: - default: gateway.networking.k8s.io - description: "Group is the group of the referent. When unspecified, \"gateway.networking.k8s.io\" is inferred. To set the core API group (such as for a \"Service\" kind referent), Group must be explicitly set to \"\" (empty string). \n Support: Core" - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - default: Gateway - description: "Kind is kind of the referent. \n Support: Core (Gateway) \n Support: Implementation-specific (Other Resources)" - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - name: - description: "Name is the name of the referent. \n Support: Core" - maxLength: 253 - minLength: 1 - type: string - namespace: - description: "Namespace is the namespace of the referent. When unspecified, this refers to the local namespace of the Route. \n Note that there are specific rules for ParentRefs which cross namespace boundaries. Cross-namespace references are only valid if they are explicitly allowed by something in the namespace they are referring to. For example: Gateway has the AllowedRoutes field, and ReferenceGrant provides a generic way to enable any other kind of cross-namespace reference. \n Support: Core" - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - type: string - port: - description: "Port is the network port this Route targets. It can be interpreted differently based on the type of parent resource. \n When the parent resource is a Gateway, this targets all listeners listening on the specified port that also support this kind of Route(and select this Route). It's not recommended to set `Port` unless the networking behaviors specified in a Route must apply to a specific port as opposed to a listener(s) whose port(s) may be changed. When both Port and SectionName are specified, the name and port of the selected listener must match both specified values. \n Implementations MAY choose to support other parent resources. Implementations supporting other types of parent resources MUST clearly document how/if Port is interpreted. \n For the purpose of status, an attachment is considered successful as long as the parent resource accepts it partially. For example, Gateway listeners can restrict which Routes can attach to them by Route kind, namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from the referencing Route, the Route MUST be considered successfully attached. If no Gateway listeners accept attachment from this Route, the Route MUST be considered detached from the Gateway. \n Support: Extended \n " - format: int32 - maximum: 65535 - minimum: 1 - type: integer - sectionName: - description: "SectionName is the name of a section within the target resource. In the following resources, SectionName is interpreted as the following: \n * Gateway: Listener Name. When both Port (experimental) and SectionName are specified, the name and port of the selected listener must match both specified values. \n Implementations MAY choose to support attaching Routes to other resources. If that is the case, they MUST clearly document how SectionName is interpreted. \n When unspecified (empty string), this will reference the entire resource. For the purpose of status, an attachment is considered successful if at least one section in the parent resource accepts it. For example, Gateway listeners can restrict which Routes can attach to them by Route kind, namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from the referencing Route, the Route MUST be considered successfully attached. If no Gateway listeners accept attachment from this Route, the Route MUST be considered detached from the Gateway. \n Support: Core" - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - required: - - name - type: object - maxItems: 32 - type: array - rules: - default: - - matches: - - path: - type: PathPrefix - value: / - description: Rules are a list of HTTP matchers, filters and actions. - items: - description: HTTPRouteRule defines semantics for matching an HTTP request based on conditions (matches), processing it (filters), and forwarding the request to an API object (backendRefs). - properties: - backendRefs: - description: "BackendRefs defines the backend(s) where matching requests should be sent. \n Failure behavior here depends on how many BackendRefs are specified and how many are invalid. \n If *all* entries in BackendRefs are invalid, and there are also no filters specified in this route rule, *all* traffic which matches this rule MUST receive a 500 status code. \n See the HTTPBackendRef definition for the rules about what makes a single HTTPBackendRef invalid. \n When a HTTPBackendRef is invalid, 500 status codes MUST be returned for requests that would have otherwise been routed to an invalid backend. If multiple backends are specified, and some are invalid, the proportion of requests that would otherwise have been routed to an invalid backend MUST receive a 500 status code. \n For example, if two backends are specified with equal weights, and one is invalid, 50 percent of traffic must receive a 500. Implementations may choose how that 50 percent is determined. \n Support: Core for Kubernetes Service \n Support: Implementation-specific for any other resource \n Support for weight: Core" - items: - description: HTTPBackendRef defines how a HTTPRoute should forward an HTTP request. - properties: - filters: - description: "Filters defined at this level should be executed if and only if the request is being forwarded to the backend defined here. \n Support: Implementation-specific (For broader support of filters, use the Filters field in HTTPRouteRule.)" - items: - description: HTTPRouteFilter defines processing steps that must be completed during the request or response lifecycle. HTTPRouteFilters are meant as an extension point to express processing that may be done in Gateway implementations. Some examples include request or response modification, implementing authentication strategies, rate-limiting, and traffic shaping. API guarantee/conformance is defined based on the type of the filter. - properties: - extensionRef: - description: "ExtensionRef is an optional, implementation-specific extension to the \"filter\" behavior. For example, resource \"myroutefilter\" in group \"networking.example.net\"). ExtensionRef MUST NOT be used for core and extended filters. \n Support: Implementation-specific" - properties: - group: - description: Group is the group of the referent. For example, "gateway.networking.k8s.io". When unspecified or empty string, core API group is inferred. - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - description: Kind is kind of the referent. For example "HTTPRoute" or "Service". - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - name: - description: Name is the name of the referent. - maxLength: 253 - minLength: 1 - type: string - required: - - group - - kind - - name - type: object - requestHeaderModifier: - description: "RequestHeaderModifier defines a schema for a filter that modifies request headers. \n Support: Core" - properties: - add: - description: "Add adds the given header(s) (name, value) to the request before the action. It appends to any existing values associated with the header name. \n Input: GET /foo HTTP/1.1 my-header: foo \n Config: add: - name: \"my-header\" value: \"bar,baz\" \n Output: GET /foo HTTP/1.1 my-header: foo,bar,baz" - items: - description: HTTPHeader represents an HTTP Header name and value as defined by RFC 7230. - properties: - name: - description: "Name is the name of the HTTP Header to be matched. Name matching MUST be case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). \n If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries with an equivalent header name MUST be ignored. Due to the case-insensitivity of header names, \"foo\" and \"Foo\" are considered equivalent." - maxLength: 256 - minLength: 1 - pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ - type: string - value: - description: Value is the value of HTTP Header to be matched. - maxLength: 4096 - minLength: 1 - type: string - required: - - name - - value - type: object - maxItems: 16 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - remove: - description: "Remove the given header(s) from the HTTP request before the action. The value of Remove is a list of HTTP header names. Note that the header names are case-insensitive (see https://datatracker.ietf.org/doc/html/rfc2616#section-4.2). \n Input: GET /foo HTTP/1.1 my-header1: foo my-header2: bar my-header3: baz \n Config: remove: [\"my-header1\", \"my-header3\"] \n Output: GET /foo HTTP/1.1 my-header2: bar" - items: - type: string - maxItems: 16 - type: array - set: - description: "Set overwrites the request with the given header (name, value) before the action. \n Input: GET /foo HTTP/1.1 my-header: foo \n Config: set: - name: \"my-header\" value: \"bar\" \n Output: GET /foo HTTP/1.1 my-header: bar" - items: - description: HTTPHeader represents an HTTP Header name and value as defined by RFC 7230. - properties: - name: - description: "Name is the name of the HTTP Header to be matched. Name matching MUST be case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). \n If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries with an equivalent header name MUST be ignored. Due to the case-insensitivity of header names, \"foo\" and \"Foo\" are considered equivalent." - maxLength: 256 - minLength: 1 - pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ - type: string - value: - description: Value is the value of HTTP Header to be matched. - maxLength: 4096 - minLength: 1 - type: string - required: - - name - - value - type: object - maxItems: 16 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - type: object - requestMirror: - description: "RequestMirror defines a schema for a filter that mirrors requests. Requests are sent to the specified destination, but responses from that destination are ignored. \n Support: Extended" - properties: - backendRef: - description: "BackendRef references a resource where mirrored requests are sent. \n If the referent cannot be found, this BackendRef is invalid and must be dropped from the Gateway. The controller must ensure the \"ResolvedRefs\" condition on the Route status is set to `status: False` and not configure this backend in the underlying implementation. \n If there is a cross-namespace reference to an *existing* object that is not allowed by a ReferenceGrant, the controller must ensure the \"ResolvedRefs\" condition on the Route is set to `status: False`, with the \"RefNotPermitted\" reason and not configure this backend in the underlying implementation. \n In either error case, the Message of the `ResolvedRefs` Condition should be used to provide more detail about the problem. \n Support: Extended for Kubernetes Service \n Support: Implementation-specific for any other resource" - properties: - group: - default: "" - description: Group is the group of the referent. For example, "gateway.networking.k8s.io". When unspecified or empty string, core API group is inferred. - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - default: Service - description: Kind is kind of the referent. For example "HTTPRoute" or "Service". Defaults to "Service" when not specified. - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - name: - description: Name is the name of the referent. - maxLength: 253 - minLength: 1 - type: string - namespace: - description: "Namespace is the namespace of the backend. When unspecified, the local namespace is inferred. \n Note that when a namespace is specified, a ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details. \n Support: Core" - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - type: string - port: - description: Port specifies the destination port number to use for this resource. Port is required when the referent is a Kubernetes Service. In this case, the port number is the service port number, not the target port. For other resources, destination port might be derived from the referent resource or this field. - format: int32 - maximum: 65535 - minimum: 1 - type: integer - required: - - name - type: object - required: - - backendRef - type: object - requestRedirect: - description: "RequestRedirect defines a schema for a filter that responds to the request with an HTTP redirection. \n Support: Core" - properties: - hostname: - description: "Hostname is the hostname to be used in the value of the `Location` header in the response. When empty, the hostname of the request is used. \n Support: Core" - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - path: - description: "Path defines parameters used to modify the path of the incoming request. The modified path is then used to construct the `Location` header. When empty, the request path is used as-is. \n Support: Extended \n " - properties: - replaceFullPath: - description: "ReplaceFullPath specifies the value with which to replace the full path of a request during a rewrite or redirect. \n " - maxLength: 1024 - type: string - replacePrefixMatch: - description: "ReplacePrefixMatch specifies the value with which to replace the prefix match of a request during a rewrite or redirect. For example, a request to \"/foo/bar\" with a prefix match of \"/foo\" would be modified to \"/bar\". \n Note that this matches the behavior of the PathPrefix match type. This matches full path elements. A path element refers to the list of labels in the path split by the `/` separator. When specified, a trailing `/` is ignored. For example, the paths `/abc`, `/abc/`, and `/abc/def` would all match the prefix `/abc`, but the path `/abcd` would not. \n " - maxLength: 1024 - type: string - type: - description: "Type defines the type of path modifier. Additional types may be added in a future release of the API. \n Note that values may be added to this enum, implementations must ensure that unknown values will not cause a crash. \n Unknown values here must result in the implementation setting the Accepted Condition for the Route to `status: False`, with a Reason of `UnsupportedValue`. \n " - enum: - - ReplaceFullPath - - ReplacePrefixMatch - type: string - required: - - type - type: object - port: - description: "Port is the port to be used in the value of the `Location` header in the response. When empty, port (if specified) of the request is used. \n Support: Extended" - format: int32 - maximum: 65535 - minimum: 1 - type: integer - scheme: - description: "Scheme is the scheme to be used in the value of the `Location` header in the response. When empty, the scheme of the request is used. \n Note that values may be added to this enum, implementations must ensure that unknown values will not cause a crash. \n Unknown values here must result in the implementation setting the Accepted Condition for the Route to `status: False`, with a Reason of `UnsupportedValue`. \n Support: Extended" - enum: - - http - - https - type: string - statusCode: - default: 302 - description: "StatusCode is the HTTP status code to be used in response. \n Note that values may be added to this enum, implementations must ensure that unknown values will not cause a crash. \n Unknown values here must result in the implementation setting the Accepted Condition for the Route to `status: False`, with a Reason of `UnsupportedValue`. \n Support: Core" - enum: - - 301 - - 302 - type: integer - type: object - responseHeaderModifier: - description: "ResponseHeaderModifier defines a schema for a filter that modifies response headers. \n Support: Extended \n " - properties: - add: - description: "Add adds the given header(s) (name, value) to the request before the action. It appends to any existing values associated with the header name. \n Input: GET /foo HTTP/1.1 my-header: foo \n Config: add: - name: \"my-header\" value: \"bar,baz\" \n Output: GET /foo HTTP/1.1 my-header: foo,bar,baz" - items: - description: HTTPHeader represents an HTTP Header name and value as defined by RFC 7230. - properties: - name: - description: "Name is the name of the HTTP Header to be matched. Name matching MUST be case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). \n If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries with an equivalent header name MUST be ignored. Due to the case-insensitivity of header names, \"foo\" and \"Foo\" are considered equivalent." - maxLength: 256 - minLength: 1 - pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ - type: string - value: - description: Value is the value of HTTP Header to be matched. - maxLength: 4096 - minLength: 1 - type: string - required: - - name - - value - type: object - maxItems: 16 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - remove: - description: "Remove the given header(s) from the HTTP request before the action. The value of Remove is a list of HTTP header names. Note that the header names are case-insensitive (see https://datatracker.ietf.org/doc/html/rfc2616#section-4.2). \n Input: GET /foo HTTP/1.1 my-header1: foo my-header2: bar my-header3: baz \n Config: remove: [\"my-header1\", \"my-header3\"] \n Output: GET /foo HTTP/1.1 my-header2: bar" - items: - type: string - maxItems: 16 - type: array - set: - description: "Set overwrites the request with the given header (name, value) before the action. \n Input: GET /foo HTTP/1.1 my-header: foo \n Config: set: - name: \"my-header\" value: \"bar\" \n Output: GET /foo HTTP/1.1 my-header: bar" - items: - description: HTTPHeader represents an HTTP Header name and value as defined by RFC 7230. - properties: - name: - description: "Name is the name of the HTTP Header to be matched. Name matching MUST be case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). \n If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries with an equivalent header name MUST be ignored. Due to the case-insensitivity of header names, \"foo\" and \"Foo\" are considered equivalent." - maxLength: 256 - minLength: 1 - pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ - type: string - value: - description: Value is the value of HTTP Header to be matched. - maxLength: 4096 - minLength: 1 - type: string - required: - - name - - value - type: object - maxItems: 16 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - type: object - type: - description: "Type identifies the type of filter to apply. As with other API fields, types are classified into three conformance levels: \n - Core: Filter types and their corresponding configuration defined by \"Support: Core\" in this package, e.g. \"RequestHeaderModifier\". All implementations must support core filters. \n - Extended: Filter types and their corresponding configuration defined by \"Support: Extended\" in this package, e.g. \"RequestMirror\". Implementers are encouraged to support extended filters. \n - Implementation-specific: Filters that are defined and supported by specific vendors. In the future, filters showing convergence in behavior across multiple implementations will be considered for inclusion in extended or core conformance levels. Filter-specific configuration for such filters is specified using the ExtensionRef field. `Type` should be set to \"ExtensionRef\" for custom filters. \n Implementers are encouraged to define custom implementation types to extend the core API with implementation-specific behavior. \n If a reference to a custom filter type cannot be resolved, the filter MUST NOT be skipped. Instead, requests that would have been processed by that filter MUST receive a HTTP error response. \n Note that values may be added to this enum, implementations must ensure that unknown values will not cause a crash. \n Unknown values here must result in the implementation setting the Accepted Condition for the Route to `status: False`, with a Reason of `UnsupportedValue`. \n " - enum: - - RequestHeaderModifier - - ResponseHeaderModifier - - RequestMirror - - RequestRedirect - - URLRewrite - - ExtensionRef - type: string - urlRewrite: - description: "URLRewrite defines a schema for a filter that modifies a request during forwarding. \n Support: Extended \n " - properties: - hostname: - description: "Hostname is the value to be used to replace the Host header value during forwarding. \n Support: Extended \n " - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - path: - description: "Path defines a path rewrite. \n Support: Extended \n " - properties: - replaceFullPath: - description: "ReplaceFullPath specifies the value with which to replace the full path of a request during a rewrite or redirect. \n " - maxLength: 1024 - type: string - replacePrefixMatch: - description: "ReplacePrefixMatch specifies the value with which to replace the prefix match of a request during a rewrite or redirect. For example, a request to \"/foo/bar\" with a prefix match of \"/foo\" would be modified to \"/bar\". \n Note that this matches the behavior of the PathPrefix match type. This matches full path elements. A path element refers to the list of labels in the path split by the `/` separator. When specified, a trailing `/` is ignored. For example, the paths `/abc`, `/abc/`, and `/abc/def` would all match the prefix `/abc`, but the path `/abcd` would not. \n " - maxLength: 1024 - type: string - type: - description: "Type defines the type of path modifier. Additional types may be added in a future release of the API. \n Note that values may be added to this enum, implementations must ensure that unknown values will not cause a crash. \n Unknown values here must result in the implementation setting the Accepted Condition for the Route to `status: False`, with a Reason of `UnsupportedValue`. \n " - enum: - - ReplaceFullPath - - ReplacePrefixMatch - type: string - required: - - type - type: object - type: object - required: - - type - type: object - maxItems: 16 - type: array - group: - default: "" - description: Group is the group of the referent. For example, "gateway.networking.k8s.io". When unspecified or empty string, core API group is inferred. - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - default: Service - description: Kind is kind of the referent. For example "HTTPRoute" or "Service". Defaults to "Service" when not specified. - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - name: - description: Name is the name of the referent. - maxLength: 253 - minLength: 1 - type: string - namespace: - description: "Namespace is the namespace of the backend. When unspecified, the local namespace is inferred. \n Note that when a namespace is specified, a ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details. \n Support: Core" - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - type: string - port: - description: Port specifies the destination port number to use for this resource. Port is required when the referent is a Kubernetes Service. In this case, the port number is the service port number, not the target port. For other resources, destination port might be derived from the referent resource or this field. - format: int32 - maximum: 65535 - minimum: 1 - type: integer - weight: - default: 1 - description: "Weight specifies the proportion of requests forwarded to the referenced backend. This is computed as weight/(sum of all weights in this BackendRefs list). For non-zero values, there may be some epsilon from the exact proportion defined here depending on the precision an implementation supports. Weight is not a percentage and the sum of weights does not need to equal 100. \n If only one backend is specified and it has a weight greater than 0, 100% of the traffic is forwarded to that backend. If weight is set to 0, no traffic should be forwarded for this entry. If unspecified, weight defaults to 1. \n Support for this field varies based on the context where used." - format: int32 - maximum: 1000000 - minimum: 0 - type: integer - required: - - name - type: object - maxItems: 16 - type: array - filters: - description: "Filters define the filters that are applied to requests that match this rule. \n The effects of ordering of multiple behaviors are currently unspecified. This can change in the future based on feedback during the alpha stage. \n Conformance-levels at this level are defined based on the type of filter: \n - ALL core filters MUST be supported by all implementations. - Implementers are encouraged to support extended filters. - Implementation-specific custom filters have no API guarantees across implementations. \n Specifying a core filter multiple times has unspecified or implementation-specific conformance. \n All filters are expected to be compatible with each other except for the URLRewrite and RequestRedirect filters, which may not be combined. If an implementation can not support other combinations of filters, they must clearly document that limitation. In all cases where incompatible or unsupported filters are specified, implementations MUST add a warning condition to status. \n Support: Core" - items: - description: HTTPRouteFilter defines processing steps that must be completed during the request or response lifecycle. HTTPRouteFilters are meant as an extension point to express processing that may be done in Gateway implementations. Some examples include request or response modification, implementing authentication strategies, rate-limiting, and traffic shaping. API guarantee/conformance is defined based on the type of the filter. - properties: - extensionRef: - description: "ExtensionRef is an optional, implementation-specific extension to the \"filter\" behavior. For example, resource \"myroutefilter\" in group \"networking.example.net\"). ExtensionRef MUST NOT be used for core and extended filters. \n Support: Implementation-specific" - properties: - group: - description: Group is the group of the referent. For example, "gateway.networking.k8s.io". When unspecified or empty string, core API group is inferred. - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - description: Kind is kind of the referent. For example "HTTPRoute" or "Service". - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - name: - description: Name is the name of the referent. - maxLength: 253 - minLength: 1 - type: string - required: - - group - - kind - - name - type: object - requestHeaderModifier: - description: "RequestHeaderModifier defines a schema for a filter that modifies request headers. \n Support: Core" - properties: - add: - description: "Add adds the given header(s) (name, value) to the request before the action. It appends to any existing values associated with the header name. \n Input: GET /foo HTTP/1.1 my-header: foo \n Config: add: - name: \"my-header\" value: \"bar,baz\" \n Output: GET /foo HTTP/1.1 my-header: foo,bar,baz" - items: - description: HTTPHeader represents an HTTP Header name and value as defined by RFC 7230. - properties: - name: - description: "Name is the name of the HTTP Header to be matched. Name matching MUST be case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). \n If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries with an equivalent header name MUST be ignored. Due to the case-insensitivity of header names, \"foo\" and \"Foo\" are considered equivalent." - maxLength: 256 - minLength: 1 - pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ - type: string - value: - description: Value is the value of HTTP Header to be matched. - maxLength: 4096 - minLength: 1 - type: string - required: - - name - - value - type: object - maxItems: 16 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - remove: - description: "Remove the given header(s) from the HTTP request before the action. The value of Remove is a list of HTTP header names. Note that the header names are case-insensitive (see https://datatracker.ietf.org/doc/html/rfc2616#section-4.2). \n Input: GET /foo HTTP/1.1 my-header1: foo my-header2: bar my-header3: baz \n Config: remove: [\"my-header1\", \"my-header3\"] \n Output: GET /foo HTTP/1.1 my-header2: bar" - items: - type: string - maxItems: 16 - type: array - set: - description: "Set overwrites the request with the given header (name, value) before the action. \n Input: GET /foo HTTP/1.1 my-header: foo \n Config: set: - name: \"my-header\" value: \"bar\" \n Output: GET /foo HTTP/1.1 my-header: bar" - items: - description: HTTPHeader represents an HTTP Header name and value as defined by RFC 7230. - properties: - name: - description: "Name is the name of the HTTP Header to be matched. Name matching MUST be case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). \n If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries with an equivalent header name MUST be ignored. Due to the case-insensitivity of header names, \"foo\" and \"Foo\" are considered equivalent." - maxLength: 256 - minLength: 1 - pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ - type: string - value: - description: Value is the value of HTTP Header to be matched. - maxLength: 4096 - minLength: 1 - type: string - required: - - name - - value - type: object - maxItems: 16 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - type: object - requestMirror: - description: "RequestMirror defines a schema for a filter that mirrors requests. Requests are sent to the specified destination, but responses from that destination are ignored. \n Support: Extended" - properties: - backendRef: - description: "BackendRef references a resource where mirrored requests are sent. \n If the referent cannot be found, this BackendRef is invalid and must be dropped from the Gateway. The controller must ensure the \"ResolvedRefs\" condition on the Route status is set to `status: False` and not configure this backend in the underlying implementation. \n If there is a cross-namespace reference to an *existing* object that is not allowed by a ReferenceGrant, the controller must ensure the \"ResolvedRefs\" condition on the Route is set to `status: False`, with the \"RefNotPermitted\" reason and not configure this backend in the underlying implementation. \n In either error case, the Message of the `ResolvedRefs` Condition should be used to provide more detail about the problem. \n Support: Extended for Kubernetes Service \n Support: Implementation-specific for any other resource" - properties: - group: - default: "" - description: Group is the group of the referent. For example, "gateway.networking.k8s.io". When unspecified or empty string, core API group is inferred. - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - default: Service - description: Kind is kind of the referent. For example "HTTPRoute" or "Service". Defaults to "Service" when not specified. - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - name: - description: Name is the name of the referent. - maxLength: 253 - minLength: 1 - type: string - namespace: - description: "Namespace is the namespace of the backend. When unspecified, the local namespace is inferred. \n Note that when a namespace is specified, a ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details. \n Support: Core" - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - type: string - port: - description: Port specifies the destination port number to use for this resource. Port is required when the referent is a Kubernetes Service. In this case, the port number is the service port number, not the target port. For other resources, destination port might be derived from the referent resource or this field. - format: int32 - maximum: 65535 - minimum: 1 - type: integer - required: - - name - type: object - required: - - backendRef - type: object - requestRedirect: - description: "RequestRedirect defines a schema for a filter that responds to the request with an HTTP redirection. \n Support: Core" - properties: - hostname: - description: "Hostname is the hostname to be used in the value of the `Location` header in the response. When empty, the hostname of the request is used. \n Support: Core" - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - path: - description: "Path defines parameters used to modify the path of the incoming request. The modified path is then used to construct the `Location` header. When empty, the request path is used as-is. \n Support: Extended \n " - properties: - replaceFullPath: - description: "ReplaceFullPath specifies the value with which to replace the full path of a request during a rewrite or redirect. \n " - maxLength: 1024 - type: string - replacePrefixMatch: - description: "ReplacePrefixMatch specifies the value with which to replace the prefix match of a request during a rewrite or redirect. For example, a request to \"/foo/bar\" with a prefix match of \"/foo\" would be modified to \"/bar\". \n Note that this matches the behavior of the PathPrefix match type. This matches full path elements. A path element refers to the list of labels in the path split by the `/` separator. When specified, a trailing `/` is ignored. For example, the paths `/abc`, `/abc/`, and `/abc/def` would all match the prefix `/abc`, but the path `/abcd` would not. \n " - maxLength: 1024 - type: string - type: - description: "Type defines the type of path modifier. Additional types may be added in a future release of the API. \n Note that values may be added to this enum, implementations must ensure that unknown values will not cause a crash. \n Unknown values here must result in the implementation setting the Accepted Condition for the Route to `status: False`, with a Reason of `UnsupportedValue`. \n " - enum: - - ReplaceFullPath - - ReplacePrefixMatch - type: string - required: - - type - type: object - port: - description: "Port is the port to be used in the value of the `Location` header in the response. When empty, port (if specified) of the request is used. \n Support: Extended" - format: int32 - maximum: 65535 - minimum: 1 - type: integer - scheme: - description: "Scheme is the scheme to be used in the value of the `Location` header in the response. When empty, the scheme of the request is used. \n Note that values may be added to this enum, implementations must ensure that unknown values will not cause a crash. \n Unknown values here must result in the implementation setting the Accepted Condition for the Route to `status: False`, with a Reason of `UnsupportedValue`. \n Support: Extended" - enum: - - http - - https - type: string - statusCode: - default: 302 - description: "StatusCode is the HTTP status code to be used in response. \n Note that values may be added to this enum, implementations must ensure that unknown values will not cause a crash. \n Unknown values here must result in the implementation setting the Accepted Condition for the Route to `status: False`, with a Reason of `UnsupportedValue`. \n Support: Core" - enum: - - 301 - - 302 - type: integer - type: object - responseHeaderModifier: - description: "ResponseHeaderModifier defines a schema for a filter that modifies response headers. \n Support: Extended \n " - properties: - add: - description: "Add adds the given header(s) (name, value) to the request before the action. It appends to any existing values associated with the header name. \n Input: GET /foo HTTP/1.1 my-header: foo \n Config: add: - name: \"my-header\" value: \"bar,baz\" \n Output: GET /foo HTTP/1.1 my-header: foo,bar,baz" - items: - description: HTTPHeader represents an HTTP Header name and value as defined by RFC 7230. - properties: - name: - description: "Name is the name of the HTTP Header to be matched. Name matching MUST be case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). \n If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries with an equivalent header name MUST be ignored. Due to the case-insensitivity of header names, \"foo\" and \"Foo\" are considered equivalent." - maxLength: 256 - minLength: 1 - pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ - type: string - value: - description: Value is the value of HTTP Header to be matched. - maxLength: 4096 - minLength: 1 - type: string - required: - - name - - value - type: object - maxItems: 16 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - remove: - description: "Remove the given header(s) from the HTTP request before the action. The value of Remove is a list of HTTP header names. Note that the header names are case-insensitive (see https://datatracker.ietf.org/doc/html/rfc2616#section-4.2). \n Input: GET /foo HTTP/1.1 my-header1: foo my-header2: bar my-header3: baz \n Config: remove: [\"my-header1\", \"my-header3\"] \n Output: GET /foo HTTP/1.1 my-header2: bar" - items: - type: string - maxItems: 16 - type: array - set: - description: "Set overwrites the request with the given header (name, value) before the action. \n Input: GET /foo HTTP/1.1 my-header: foo \n Config: set: - name: \"my-header\" value: \"bar\" \n Output: GET /foo HTTP/1.1 my-header: bar" - items: - description: HTTPHeader represents an HTTP Header name and value as defined by RFC 7230. - properties: - name: - description: "Name is the name of the HTTP Header to be matched. Name matching MUST be case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). \n If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries with an equivalent header name MUST be ignored. Due to the case-insensitivity of header names, \"foo\" and \"Foo\" are considered equivalent." - maxLength: 256 - minLength: 1 - pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ - type: string - value: - description: Value is the value of HTTP Header to be matched. - maxLength: 4096 - minLength: 1 - type: string - required: - - name - - value - type: object - maxItems: 16 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - type: object - type: - description: "Type identifies the type of filter to apply. As with other API fields, types are classified into three conformance levels: \n - Core: Filter types and their corresponding configuration defined by \"Support: Core\" in this package, e.g. \"RequestHeaderModifier\". All implementations must support core filters. \n - Extended: Filter types and their corresponding configuration defined by \"Support: Extended\" in this package, e.g. \"RequestMirror\". Implementers are encouraged to support extended filters. \n - Implementation-specific: Filters that are defined and supported by specific vendors. In the future, filters showing convergence in behavior across multiple implementations will be considered for inclusion in extended or core conformance levels. Filter-specific configuration for such filters is specified using the ExtensionRef field. `Type` should be set to \"ExtensionRef\" for custom filters. \n Implementers are encouraged to define custom implementation types to extend the core API with implementation-specific behavior. \n If a reference to a custom filter type cannot be resolved, the filter MUST NOT be skipped. Instead, requests that would have been processed by that filter MUST receive a HTTP error response. \n Note that values may be added to this enum, implementations must ensure that unknown values will not cause a crash. \n Unknown values here must result in the implementation setting the Accepted Condition for the Route to `status: False`, with a Reason of `UnsupportedValue`. \n " - enum: - - RequestHeaderModifier - - ResponseHeaderModifier - - RequestMirror - - RequestRedirect - - URLRewrite - - ExtensionRef - type: string - urlRewrite: - description: "URLRewrite defines a schema for a filter that modifies a request during forwarding. \n Support: Extended \n " - properties: - hostname: - description: "Hostname is the value to be used to replace the Host header value during forwarding. \n Support: Extended \n " - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - path: - description: "Path defines a path rewrite. \n Support: Extended \n " - properties: - replaceFullPath: - description: "ReplaceFullPath specifies the value with which to replace the full path of a request during a rewrite or redirect. \n " - maxLength: 1024 - type: string - replacePrefixMatch: - description: "ReplacePrefixMatch specifies the value with which to replace the prefix match of a request during a rewrite or redirect. For example, a request to \"/foo/bar\" with a prefix match of \"/foo\" would be modified to \"/bar\". \n Note that this matches the behavior of the PathPrefix match type. This matches full path elements. A path element refers to the list of labels in the path split by the `/` separator. When specified, a trailing `/` is ignored. For example, the paths `/abc`, `/abc/`, and `/abc/def` would all match the prefix `/abc`, but the path `/abcd` would not. \n " - maxLength: 1024 - type: string - type: - description: "Type defines the type of path modifier. Additional types may be added in a future release of the API. \n Note that values may be added to this enum, implementations must ensure that unknown values will not cause a crash. \n Unknown values here must result in the implementation setting the Accepted Condition for the Route to `status: False`, with a Reason of `UnsupportedValue`. \n " - enum: - - ReplaceFullPath - - ReplacePrefixMatch - type: string - required: - - type - type: object - type: object - required: - - type - type: object - maxItems: 16 - type: array - matches: - default: - - path: - type: PathPrefix - value: / - description: "Matches define conditions used for matching the rule against incoming HTTP requests. Each match is independent, i.e. this rule will be matched if **any** one of the matches is satisfied. \n For example, take the following matches configuration: \n ``` matches: - path: value: \"/foo\" headers: - name: \"version\" value: \"v2\" - path: value: \"/v2/foo\" ``` \n For a request to match against this rule, a request must satisfy EITHER of the two conditions: \n - path prefixed with `/foo` AND contains the header `version: v2` - path prefix of `/v2/foo` \n See the documentation for HTTPRouteMatch on how to specify multiple match conditions that should be ANDed together. \n If no matches are specified, the default is a prefix path match on \"/\", which has the effect of matching every HTTP request. \n Proxy or Load Balancer routing configuration generated from HTTPRoutes MUST prioritize matches based on the following criteria, continuing on ties. Across all rules specified on applicable Routes, precedence must be given to the match with the largest number of: \n * Characters in a matching path. * Header matches. * Query param matches. \n If ties still exist across multiple Routes, matching precedence MUST be determined in order of the following criteria, continuing on ties: \n * The oldest Route based on creation timestamp. * The Route appearing first in alphabetical order by \"{namespace}/{name}\". \n If ties still exist within an HTTPRoute, matching precedence MUST be granted to the FIRST matching rule (in list order) with a match meeting the above criteria. \n When no rules matching a request have been successfully attached to the parent a request is coming from, a HTTP 404 status code MUST be returned." - items: - description: "HTTPRouteMatch defines the predicate used to match requests to a given action. Multiple match types are ANDed together, i.e. the match will evaluate to true only if all conditions are satisfied. \n For example, the match below will match a HTTP request only if its path starts with `/foo` AND it contains the `version: v1` header: \n ``` match: \n \tpath: \t value: \"/foo\" \theaders: \t- name: \"version\" \t value \"v1\" \n ```" - properties: - headers: - description: Headers specifies HTTP request header matchers. Multiple match values are ANDed together, meaning, a request must match all the specified headers to select the route. - items: - description: HTTPHeaderMatch describes how to select a HTTP route by matching HTTP request headers. - properties: - name: - description: "Name is the name of the HTTP Header to be matched. Name matching MUST be case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). \n If multiple entries specify equivalent header names, only the first entry with an equivalent name MUST be considered for a match. Subsequent entries with an equivalent header name MUST be ignored. Due to the case-insensitivity of header names, \"foo\" and \"Foo\" are considered equivalent. \n When a header is repeated in an HTTP request, it is implementation-specific behavior as to how this is represented. Generally, proxies should follow the guidance from the RFC: https://www.rfc-editor.org/rfc/rfc7230.html#section-3.2.2 regarding processing a repeated header, with special handling for \"Set-Cookie\"." - maxLength: 256 - minLength: 1 - pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ - type: string - type: - default: Exact - description: "Type specifies how to match against the value of the header. \n Support: Core (Exact) \n Support: Implementation-specific (RegularExpression) \n Since RegularExpression HeaderMatchType has implementation-specific conformance, implementations can support POSIX, PCRE or any other dialects of regular expressions. Please read the implementation's documentation to determine the supported dialect." - enum: - - Exact - - RegularExpression - type: string - value: - description: Value is the value of HTTP Header to be matched. - maxLength: 4096 - minLength: 1 - type: string - required: - - name - - value - type: object - maxItems: 16 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - method: - description: "Method specifies HTTP method matcher. When specified, this route will be matched only if the request has the specified method. \n Support: Extended" - enum: - - GET - - HEAD - - POST - - PUT - - DELETE - - CONNECT - - OPTIONS - - TRACE - - PATCH - type: string - path: - default: - type: PathPrefix - value: / - description: Path specifies a HTTP request path matcher. If this field is not specified, a default prefix match on the "/" path is provided. - properties: - type: - default: PathPrefix - description: "Type specifies how to match against the path Value. \n Support: Core (Exact, PathPrefix) \n Support: Implementation-specific (RegularExpression)" - enum: - - Exact - - PathPrefix - - RegularExpression - type: string - value: - default: / - description: Value of the HTTP path to match against. - maxLength: 1024 - type: string - type: object - queryParams: - description: "QueryParams specifies HTTP query parameter matchers. Multiple match values are ANDed together, meaning, a request must match all the specified query parameters to select the route. \n Support: Extended" - items: - description: HTTPQueryParamMatch describes how to select a HTTP route by matching HTTP query parameters. - properties: - name: - description: "Name is the name of the HTTP query param to be matched. This must be an exact string match. (See https://tools.ietf.org/html/rfc7230#section-2.7.3). \n If multiple entries specify equivalent query param names, only the first entry with an equivalent name MUST be considered for a match. Subsequent entries with an equivalent query param name MUST be ignored. \n If a query param is repeated in an HTTP request, the behavior is purposely left undefined, since different data planes have different capabilities. However, it is *recommended* that implementations should match against the first value of the param if the data plane supports it, as this behavior is expected in other load balancing contexts outside of the Gateway API. \n Users SHOULD NOT route traffic based on repeated query params to guard themselves against potential differences in the implementations." - maxLength: 256 - minLength: 1 - type: string - type: - default: Exact - description: "Type specifies how to match against the value of the query parameter. \n Support: Extended (Exact) \n Support: Implementation-specific (RegularExpression) \n Since RegularExpression QueryParamMatchType has Implementation-specific conformance, implementations can support POSIX, PCRE or any other dialects of regular expressions. Please read the implementation's documentation to determine the supported dialect." - enum: - - Exact - - RegularExpression - type: string - value: - description: Value is the value of HTTP query param to be matched. - maxLength: 1024 - minLength: 1 - type: string - required: - - name - - value - type: object - maxItems: 16 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - type: object - maxItems: 8 - type: array - type: object - maxItems: 16 - type: array - type: object - status: - description: Status defines the current state of HTTPRoute. - properties: - parents: - description: "Parents is a list of parent resources (usually Gateways) that are associated with the route, and the status of the route with respect to each parent. When this route attaches to a parent, the controller that manages the parent must add an entry to this list when the controller first sees the route and should update the entry as appropriate when the route or gateway is modified. \n Note that parent references that cannot be resolved by an implementation of this API will not be added to this list. Implementations of this API can only populate Route status for the Gateways/parent resources they are responsible for. \n A maximum of 32 Gateways will be represented in this list. An empty list means the route has not been attached to any Gateway." - items: - description: RouteParentStatus describes the status of a route with respect to an associated Parent. - properties: - conditions: - description: "Conditions describes the status of the route with respect to the Gateway. Note that the route's availability is also subject to the Gateway's own status conditions and listener status. \n If the Route's ParentRef specifies an existing Gateway that supports Routes of this kind AND that Gateway's controller has sufficient access, then that Gateway's controller MUST set the \"Accepted\" condition on the Route, to indicate whether the route has been accepted or rejected by the Gateway, and why. \n A Route MUST be considered \"Accepted\" if at least one of the Route's rules is implemented by the Gateway. \n There are a number of cases where the \"Accepted\" condition may not be set due to lack of controller visibility, that includes when: \n * The Route refers to a non-existent parent. * The Route is of a type that the controller does not support. * The Route is in a namespace the controller does not have access to." - items: - description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, \n \ttype FooStatus struct{ \t // Represents the observations of a foo's current state. \t // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" \t // +patchMergeKey=type \t // +patchStrategy=merge \t // +listType=map \t // +listMapKey=type \t Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n \t // other fields \t}" - properties: - lastTransitionTime: - description: lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: message is a human readable message indicating details about the transition. This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. --- Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 8 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - controllerName: - description: "ControllerName is a domain/path string that indicates the name of the controller that wrote this status. This corresponds with the controllerName field on GatewayClass. \n Example: \"example.net/gateway-controller\". \n The format of this field is DOMAIN \"/\" PATH, where DOMAIN and PATH are valid Kubernetes names (https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names). \n Controllers MUST populate this field when writing status. Controllers should ensure that entries to status populated with their ControllerName are cleaned up when they are no longer necessary." - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$ - type: string - parentRef: - description: ParentRef corresponds with a ParentRef in the spec that this RouteParentStatus struct describes the status of. - properties: - group: - default: gateway.networking.k8s.io - description: "Group is the group of the referent. When unspecified, \"gateway.networking.k8s.io\" is inferred. To set the core API group (such as for a \"Service\" kind referent), Group must be explicitly set to \"\" (empty string). \n Support: Core" - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - default: Gateway - description: "Kind is kind of the referent. \n Support: Core (Gateway) \n Support: Implementation-specific (Other Resources)" - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - name: - description: "Name is the name of the referent. \n Support: Core" - maxLength: 253 - minLength: 1 - type: string - namespace: - description: "Namespace is the namespace of the referent. When unspecified, this refers to the local namespace of the Route. \n Note that there are specific rules for ParentRefs which cross namespace boundaries. Cross-namespace references are only valid if they are explicitly allowed by something in the namespace they are referring to. For example: Gateway has the AllowedRoutes field, and ReferenceGrant provides a generic way to enable any other kind of cross-namespace reference. \n Support: Core" - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - type: string - port: - description: "Port is the network port this Route targets. It can be interpreted differently based on the type of parent resource. \n When the parent resource is a Gateway, this targets all listeners listening on the specified port that also support this kind of Route(and select this Route). It's not recommended to set `Port` unless the networking behaviors specified in a Route must apply to a specific port as opposed to a listener(s) whose port(s) may be changed. When both Port and SectionName are specified, the name and port of the selected listener must match both specified values. \n Implementations MAY choose to support other parent resources. Implementations supporting other types of parent resources MUST clearly document how/if Port is interpreted. \n For the purpose of status, an attachment is considered successful as long as the parent resource accepts it partially. For example, Gateway listeners can restrict which Routes can attach to them by Route kind, namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from the referencing Route, the Route MUST be considered successfully attached. If no Gateway listeners accept attachment from this Route, the Route MUST be considered detached from the Gateway. \n Support: Extended \n " - format: int32 - maximum: 65535 - minimum: 1 - type: integer - sectionName: - description: "SectionName is the name of a section within the target resource. In the following resources, SectionName is interpreted as the following: \n * Gateway: Listener Name. When both Port (experimental) and SectionName are specified, the name and port of the selected listener must match both specified values. \n Implementations MAY choose to support attaching Routes to other resources. If that is the case, they MUST clearly document how SectionName is interpreted. \n When unspecified (empty string), this will reference the entire resource. For the purpose of status, an attachment is considered successful if at least one section in the parent resource accepts it. For example, Gateway listeners can restrict which Routes can attach to them by Route kind, namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from the referencing Route, the Route MUST be considered successfully attached. If no Gateway listeners accept attachment from this Route, the Route MUST be considered detached from the Gateway. \n Support: Core" - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - required: - - name - type: object - required: - - controllerName - - parentRef - type: object - maxItems: 32 - type: array - required: - - parents - type: object - required: - - spec - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - jsonPath: .spec.hostnames - name: Hostnames - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: HTTPRoute provides a way to route HTTP requests. This includes the capability to match requests by hostname, path, header, or query param. Filters can be used to specify additional processing steps. Backends specify where matching requests should be routed. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Spec defines the desired state of HTTPRoute. - properties: - hostnames: - description: "Hostnames defines a set of hostname that should match against the HTTP Host header to select a HTTPRoute to process the request. This matches the RFC 1123 definition of a hostname with 2 notable exceptions: \n 1. IPs are not allowed. 2. A hostname may be prefixed with a wildcard label (`*.`). The wildcard label must appear by itself as the first label. \n If a hostname is specified by both the Listener and HTTPRoute, there must be at least one intersecting hostname for the HTTPRoute to be attached to the Listener. For example: \n * A Listener with `test.example.com` as the hostname matches HTTPRoutes that have either not specified any hostnames, or have specified at least one of `test.example.com` or `*.example.com`. * A Listener with `*.example.com` as the hostname matches HTTPRoutes that have either not specified any hostnames or have specified at least one hostname that matches the Listener hostname. For example, `*.example.com`, `test.example.com`, and `foo.test.example.com` would all match. On the other hand, `example.com` and `test.example.net` would not match. \n Hostnames that are prefixed with a wildcard label (`*.`) are interpreted as a suffix match. That means that a match for `*.example.com` would match both `test.example.com`, and `foo.test.example.com`, but not `example.com`. \n If both the Listener and HTTPRoute have specified hostnames, any HTTPRoute hostnames that do not match the Listener hostname MUST be ignored. For example, if a Listener specified `*.example.com`, and the HTTPRoute specified `test.example.com` and `test.example.net`, `test.example.net` must not be considered for a match. \n If both the Listener and HTTPRoute have specified hostnames, and none match with the criteria above, then the HTTPRoute is not accepted. The implementation must raise an 'Accepted' Condition with a status of `False` in the corresponding RouteParentStatus. \n In the event that multiple HTTPRoutes specify intersecting hostnames (e.g. overlapping wildcard matching and exact matching hostnames), precedence must be given to rules from the HTTPRoute with the largest number of: \n * Characters in a matching non-wildcard hostname. * Characters in a matching hostname. \n If ties exist across multiple Routes, the matching precedence rules for HTTPRouteMatches takes over. \n Support: Core" - items: - description: "Hostname is the fully qualified domain name of a network host. This matches the RFC 1123 definition of a hostname with 2 notable exceptions: \n 1. IPs are not allowed. 2. A hostname may be prefixed with a wildcard label (`*.`). The wildcard label must appear by itself as the first label. \n Hostname can be \"precise\" which is a domain name without the terminating dot of a network host (e.g. \"foo.example.com\") or \"wildcard\", which is a domain name prefixed with a single wildcard label (e.g. `*.example.com`). \n Note that as per RFC1035 and RFC1123, a *label* must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character. No other punctuation is allowed." - maxLength: 253 - minLength: 1 - pattern: ^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - maxItems: 16 - type: array - parentRefs: - description: "ParentRefs references the resources (usually Gateways) that a Route wants to be attached to. Note that the referenced parent resource needs to allow this for the attachment to be complete. For Gateways, that means the Gateway needs to allow attachment from Routes of this kind and namespace. \n The only kind of parent resource with \"Core\" support is Gateway. This API may be extended in the future to support additional kinds of parent resources such as one of the route kinds. \n It is invalid to reference an identical parent more than once. It is valid to reference multiple distinct sections within the same parent resource, such as 2 Listeners within a Gateway. \n It is possible to separately reference multiple distinct objects that may be collapsed by an implementation. For example, some implementations may choose to merge compatible Gateway Listeners together. If that is the case, the list of routes attached to those resources should also be merged. \n Note that for ParentRefs that cross namespace boundaries, there are specific rules. Cross-namespace references are only valid if they are explicitly allowed by something in the namespace they are referring to. For example, Gateway has the AllowedRoutes field, and ReferenceGrant provides a generic way to enable any other kind of cross-namespace reference." - items: - description: "ParentReference identifies an API object (usually a Gateway) that can be considered a parent of this resource (usually a route). The only kind of parent resource with \"Core\" support is Gateway. This API may be extended in the future to support additional kinds of parent resources, such as HTTPRoute. \n The API object must be valid in the cluster; the Group and Kind must be registered in the cluster for this reference to be valid." - properties: - group: - default: gateway.networking.k8s.io - description: "Group is the group of the referent. When unspecified, \"gateway.networking.k8s.io\" is inferred. To set the core API group (such as for a \"Service\" kind referent), Group must be explicitly set to \"\" (empty string). \n Support: Core" - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - default: Gateway - description: "Kind is kind of the referent. \n Support: Core (Gateway) \n Support: Implementation-specific (Other Resources)" - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - name: - description: "Name is the name of the referent. \n Support: Core" - maxLength: 253 - minLength: 1 - type: string - namespace: - description: "Namespace is the namespace of the referent. When unspecified, this refers to the local namespace of the Route. \n Note that there are specific rules for ParentRefs which cross namespace boundaries. Cross-namespace references are only valid if they are explicitly allowed by something in the namespace they are referring to. For example: Gateway has the AllowedRoutes field, and ReferenceGrant provides a generic way to enable any other kind of cross-namespace reference. \n Support: Core" - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - type: string - port: - description: "Port is the network port this Route targets. It can be interpreted differently based on the type of parent resource. \n When the parent resource is a Gateway, this targets all listeners listening on the specified port that also support this kind of Route(and select this Route). It's not recommended to set `Port` unless the networking behaviors specified in a Route must apply to a specific port as opposed to a listener(s) whose port(s) may be changed. When both Port and SectionName are specified, the name and port of the selected listener must match both specified values. \n Implementations MAY choose to support other parent resources. Implementations supporting other types of parent resources MUST clearly document how/if Port is interpreted. \n For the purpose of status, an attachment is considered successful as long as the parent resource accepts it partially. For example, Gateway listeners can restrict which Routes can attach to them by Route kind, namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from the referencing Route, the Route MUST be considered successfully attached. If no Gateway listeners accept attachment from this Route, the Route MUST be considered detached from the Gateway. \n Support: Extended \n " - format: int32 - maximum: 65535 - minimum: 1 - type: integer - sectionName: - description: "SectionName is the name of a section within the target resource. In the following resources, SectionName is interpreted as the following: \n * Gateway: Listener Name. When both Port (experimental) and SectionName are specified, the name and port of the selected listener must match both specified values. \n Implementations MAY choose to support attaching Routes to other resources. If that is the case, they MUST clearly document how SectionName is interpreted. \n When unspecified (empty string), this will reference the entire resource. For the purpose of status, an attachment is considered successful if at least one section in the parent resource accepts it. For example, Gateway listeners can restrict which Routes can attach to them by Route kind, namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from the referencing Route, the Route MUST be considered successfully attached. If no Gateway listeners accept attachment from this Route, the Route MUST be considered detached from the Gateway. \n Support: Core" - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - required: - - name - type: object - maxItems: 32 - type: array - rules: - default: - - matches: - - path: - type: PathPrefix - value: / - description: Rules are a list of HTTP matchers, filters and actions. - items: - description: HTTPRouteRule defines semantics for matching an HTTP request based on conditions (matches), processing it (filters), and forwarding the request to an API object (backendRefs). - properties: - backendRefs: - description: "BackendRefs defines the backend(s) where matching requests should be sent. \n Failure behavior here depends on how many BackendRefs are specified and how many are invalid. \n If *all* entries in BackendRefs are invalid, and there are also no filters specified in this route rule, *all* traffic which matches this rule MUST receive a 500 status code. \n See the HTTPBackendRef definition for the rules about what makes a single HTTPBackendRef invalid. \n When a HTTPBackendRef is invalid, 500 status codes MUST be returned for requests that would have otherwise been routed to an invalid backend. If multiple backends are specified, and some are invalid, the proportion of requests that would otherwise have been routed to an invalid backend MUST receive a 500 status code. \n For example, if two backends are specified with equal weights, and one is invalid, 50 percent of traffic must receive a 500. Implementations may choose how that 50 percent is determined. \n Support: Core for Kubernetes Service \n Support: Implementation-specific for any other resource \n Support for weight: Core" - items: - description: HTTPBackendRef defines how a HTTPRoute should forward an HTTP request. - properties: - filters: - description: "Filters defined at this level should be executed if and only if the request is being forwarded to the backend defined here. \n Support: Implementation-specific (For broader support of filters, use the Filters field in HTTPRouteRule.)" - items: - description: HTTPRouteFilter defines processing steps that must be completed during the request or response lifecycle. HTTPRouteFilters are meant as an extension point to express processing that may be done in Gateway implementations. Some examples include request or response modification, implementing authentication strategies, rate-limiting, and traffic shaping. API guarantee/conformance is defined based on the type of the filter. - properties: - extensionRef: - description: "ExtensionRef is an optional, implementation-specific extension to the \"filter\" behavior. For example, resource \"myroutefilter\" in group \"networking.example.net\"). ExtensionRef MUST NOT be used for core and extended filters. \n Support: Implementation-specific" - properties: - group: - description: Group is the group of the referent. For example, "gateway.networking.k8s.io". When unspecified or empty string, core API group is inferred. - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - description: Kind is kind of the referent. For example "HTTPRoute" or "Service". - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - name: - description: Name is the name of the referent. - maxLength: 253 - minLength: 1 - type: string - required: - - group - - kind - - name - type: object - requestHeaderModifier: - description: "RequestHeaderModifier defines a schema for a filter that modifies request headers. \n Support: Core" - properties: - add: - description: "Add adds the given header(s) (name, value) to the request before the action. It appends to any existing values associated with the header name. \n Input: GET /foo HTTP/1.1 my-header: foo \n Config: add: - name: \"my-header\" value: \"bar,baz\" \n Output: GET /foo HTTP/1.1 my-header: foo,bar,baz" - items: - description: HTTPHeader represents an HTTP Header name and value as defined by RFC 7230. - properties: - name: - description: "Name is the name of the HTTP Header to be matched. Name matching MUST be case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). \n If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries with an equivalent header name MUST be ignored. Due to the case-insensitivity of header names, \"foo\" and \"Foo\" are considered equivalent." - maxLength: 256 - minLength: 1 - pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ - type: string - value: - description: Value is the value of HTTP Header to be matched. - maxLength: 4096 - minLength: 1 - type: string - required: - - name - - value - type: object - maxItems: 16 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - remove: - description: "Remove the given header(s) from the HTTP request before the action. The value of Remove is a list of HTTP header names. Note that the header names are case-insensitive (see https://datatracker.ietf.org/doc/html/rfc2616#section-4.2). \n Input: GET /foo HTTP/1.1 my-header1: foo my-header2: bar my-header3: baz \n Config: remove: [\"my-header1\", \"my-header3\"] \n Output: GET /foo HTTP/1.1 my-header2: bar" - items: - type: string - maxItems: 16 - type: array - set: - description: "Set overwrites the request with the given header (name, value) before the action. \n Input: GET /foo HTTP/1.1 my-header: foo \n Config: set: - name: \"my-header\" value: \"bar\" \n Output: GET /foo HTTP/1.1 my-header: bar" - items: - description: HTTPHeader represents an HTTP Header name and value as defined by RFC 7230. - properties: - name: - description: "Name is the name of the HTTP Header to be matched. Name matching MUST be case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). \n If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries with an equivalent header name MUST be ignored. Due to the case-insensitivity of header names, \"foo\" and \"Foo\" are considered equivalent." - maxLength: 256 - minLength: 1 - pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ - type: string - value: - description: Value is the value of HTTP Header to be matched. - maxLength: 4096 - minLength: 1 - type: string - required: - - name - - value - type: object - maxItems: 16 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - type: object - requestMirror: - description: "RequestMirror defines a schema for a filter that mirrors requests. Requests are sent to the specified destination, but responses from that destination are ignored. \n Support: Extended" - properties: - backendRef: - description: "BackendRef references a resource where mirrored requests are sent. \n If the referent cannot be found, this BackendRef is invalid and must be dropped from the Gateway. The controller must ensure the \"ResolvedRefs\" condition on the Route status is set to `status: False` and not configure this backend in the underlying implementation. \n If there is a cross-namespace reference to an *existing* object that is not allowed by a ReferenceGrant, the controller must ensure the \"ResolvedRefs\" condition on the Route is set to `status: False`, with the \"RefNotPermitted\" reason and not configure this backend in the underlying implementation. \n In either error case, the Message of the `ResolvedRefs` Condition should be used to provide more detail about the problem. \n Support: Extended for Kubernetes Service \n Support: Implementation-specific for any other resource" - properties: - group: - default: "" - description: Group is the group of the referent. For example, "gateway.networking.k8s.io". When unspecified or empty string, core API group is inferred. - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - default: Service - description: Kind is kind of the referent. For example "HTTPRoute" or "Service". Defaults to "Service" when not specified. - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - name: - description: Name is the name of the referent. - maxLength: 253 - minLength: 1 - type: string - namespace: - description: "Namespace is the namespace of the backend. When unspecified, the local namespace is inferred. \n Note that when a namespace is specified, a ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details. \n Support: Core" - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - type: string - port: - description: Port specifies the destination port number to use for this resource. Port is required when the referent is a Kubernetes Service. In this case, the port number is the service port number, not the target port. For other resources, destination port might be derived from the referent resource or this field. - format: int32 - maximum: 65535 - minimum: 1 - type: integer - required: - - name - type: object - required: - - backendRef - type: object - requestRedirect: - description: "RequestRedirect defines a schema for a filter that responds to the request with an HTTP redirection. \n Support: Core" - properties: - hostname: - description: "Hostname is the hostname to be used in the value of the `Location` header in the response. When empty, the hostname of the request is used. \n Support: Core" - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - path: - description: "Path defines parameters used to modify the path of the incoming request. The modified path is then used to construct the `Location` header. When empty, the request path is used as-is. \n Support: Extended \n " - properties: - replaceFullPath: - description: "ReplaceFullPath specifies the value with which to replace the full path of a request during a rewrite or redirect. \n " - maxLength: 1024 - type: string - replacePrefixMatch: - description: "ReplacePrefixMatch specifies the value with which to replace the prefix match of a request during a rewrite or redirect. For example, a request to \"/foo/bar\" with a prefix match of \"/foo\" would be modified to \"/bar\". \n Note that this matches the behavior of the PathPrefix match type. This matches full path elements. A path element refers to the list of labels in the path split by the `/` separator. When specified, a trailing `/` is ignored. For example, the paths `/abc`, `/abc/`, and `/abc/def` would all match the prefix `/abc`, but the path `/abcd` would not. \n " - maxLength: 1024 - type: string - type: - description: "Type defines the type of path modifier. Additional types may be added in a future release of the API. \n Note that values may be added to this enum, implementations must ensure that unknown values will not cause a crash. \n Unknown values here must result in the implementation setting the Accepted Condition for the Route to `status: False`, with a Reason of `UnsupportedValue`. \n " - enum: - - ReplaceFullPath - - ReplacePrefixMatch - type: string - required: - - type - type: object - port: - description: "Port is the port to be used in the value of the `Location` header in the response. When empty, port (if specified) of the request is used. \n Support: Extended" - format: int32 - maximum: 65535 - minimum: 1 - type: integer - scheme: - description: "Scheme is the scheme to be used in the value of the `Location` header in the response. When empty, the scheme of the request is used. \n Note that values may be added to this enum, implementations must ensure that unknown values will not cause a crash. \n Unknown values here must result in the implementation setting the Accepted Condition for the Route to `status: False`, with a Reason of `UnsupportedValue`. \n Support: Extended" - enum: - - http - - https - type: string - statusCode: - default: 302 - description: "StatusCode is the HTTP status code to be used in response. \n Note that values may be added to this enum, implementations must ensure that unknown values will not cause a crash. \n Unknown values here must result in the implementation setting the Accepted Condition for the Route to `status: False`, with a Reason of `UnsupportedValue`. \n Support: Core" - enum: - - 301 - - 302 - type: integer - type: object - responseHeaderModifier: - description: "ResponseHeaderModifier defines a schema for a filter that modifies response headers. \n Support: Extended \n " - properties: - add: - description: "Add adds the given header(s) (name, value) to the request before the action. It appends to any existing values associated with the header name. \n Input: GET /foo HTTP/1.1 my-header: foo \n Config: add: - name: \"my-header\" value: \"bar,baz\" \n Output: GET /foo HTTP/1.1 my-header: foo,bar,baz" - items: - description: HTTPHeader represents an HTTP Header name and value as defined by RFC 7230. - properties: - name: - description: "Name is the name of the HTTP Header to be matched. Name matching MUST be case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). \n If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries with an equivalent header name MUST be ignored. Due to the case-insensitivity of header names, \"foo\" and \"Foo\" are considered equivalent." - maxLength: 256 - minLength: 1 - pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ - type: string - value: - description: Value is the value of HTTP Header to be matched. - maxLength: 4096 - minLength: 1 - type: string - required: - - name - - value - type: object - maxItems: 16 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - remove: - description: "Remove the given header(s) from the HTTP request before the action. The value of Remove is a list of HTTP header names. Note that the header names are case-insensitive (see https://datatracker.ietf.org/doc/html/rfc2616#section-4.2). \n Input: GET /foo HTTP/1.1 my-header1: foo my-header2: bar my-header3: baz \n Config: remove: [\"my-header1\", \"my-header3\"] \n Output: GET /foo HTTP/1.1 my-header2: bar" - items: - type: string - maxItems: 16 - type: array - set: - description: "Set overwrites the request with the given header (name, value) before the action. \n Input: GET /foo HTTP/1.1 my-header: foo \n Config: set: - name: \"my-header\" value: \"bar\" \n Output: GET /foo HTTP/1.1 my-header: bar" - items: - description: HTTPHeader represents an HTTP Header name and value as defined by RFC 7230. - properties: - name: - description: "Name is the name of the HTTP Header to be matched. Name matching MUST be case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). \n If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries with an equivalent header name MUST be ignored. Due to the case-insensitivity of header names, \"foo\" and \"Foo\" are considered equivalent." - maxLength: 256 - minLength: 1 - pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ - type: string - value: - description: Value is the value of HTTP Header to be matched. - maxLength: 4096 - minLength: 1 - type: string - required: - - name - - value - type: object - maxItems: 16 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - type: object - type: - description: "Type identifies the type of filter to apply. As with other API fields, types are classified into three conformance levels: \n - Core: Filter types and their corresponding configuration defined by \"Support: Core\" in this package, e.g. \"RequestHeaderModifier\". All implementations must support core filters. \n - Extended: Filter types and their corresponding configuration defined by \"Support: Extended\" in this package, e.g. \"RequestMirror\". Implementers are encouraged to support extended filters. \n - Implementation-specific: Filters that are defined and supported by specific vendors. In the future, filters showing convergence in behavior across multiple implementations will be considered for inclusion in extended or core conformance levels. Filter-specific configuration for such filters is specified using the ExtensionRef field. `Type` should be set to \"ExtensionRef\" for custom filters. \n Implementers are encouraged to define custom implementation types to extend the core API with implementation-specific behavior. \n If a reference to a custom filter type cannot be resolved, the filter MUST NOT be skipped. Instead, requests that would have been processed by that filter MUST receive a HTTP error response. \n Note that values may be added to this enum, implementations must ensure that unknown values will not cause a crash. \n Unknown values here must result in the implementation setting the Accepted Condition for the Route to `status: False`, with a Reason of `UnsupportedValue`. \n " - enum: - - RequestHeaderModifier - - ResponseHeaderModifier - - RequestMirror - - RequestRedirect - - URLRewrite - - ExtensionRef - type: string - urlRewrite: - description: "URLRewrite defines a schema for a filter that modifies a request during forwarding. \n Support: Extended \n " - properties: - hostname: - description: "Hostname is the value to be used to replace the Host header value during forwarding. \n Support: Extended \n " - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - path: - description: "Path defines a path rewrite. \n Support: Extended \n " - properties: - replaceFullPath: - description: "ReplaceFullPath specifies the value with which to replace the full path of a request during a rewrite or redirect. \n " - maxLength: 1024 - type: string - replacePrefixMatch: - description: "ReplacePrefixMatch specifies the value with which to replace the prefix match of a request during a rewrite or redirect. For example, a request to \"/foo/bar\" with a prefix match of \"/foo\" would be modified to \"/bar\". \n Note that this matches the behavior of the PathPrefix match type. This matches full path elements. A path element refers to the list of labels in the path split by the `/` separator. When specified, a trailing `/` is ignored. For example, the paths `/abc`, `/abc/`, and `/abc/def` would all match the prefix `/abc`, but the path `/abcd` would not. \n " - maxLength: 1024 - type: string - type: - description: "Type defines the type of path modifier. Additional types may be added in a future release of the API. \n Note that values may be added to this enum, implementations must ensure that unknown values will not cause a crash. \n Unknown values here must result in the implementation setting the Accepted Condition for the Route to `status: False`, with a Reason of `UnsupportedValue`. \n " - enum: - - ReplaceFullPath - - ReplacePrefixMatch - type: string - required: - - type - type: object - type: object - required: - - type - type: object - maxItems: 16 - type: array - group: - default: "" - description: Group is the group of the referent. For example, "gateway.networking.k8s.io". When unspecified or empty string, core API group is inferred. - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - default: Service - description: Kind is kind of the referent. For example "HTTPRoute" or "Service". Defaults to "Service" when not specified. - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - name: - description: Name is the name of the referent. - maxLength: 253 - minLength: 1 - type: string - namespace: - description: "Namespace is the namespace of the backend. When unspecified, the local namespace is inferred. \n Note that when a namespace is specified, a ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details. \n Support: Core" - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - type: string - port: - description: Port specifies the destination port number to use for this resource. Port is required when the referent is a Kubernetes Service. In this case, the port number is the service port number, not the target port. For other resources, destination port might be derived from the referent resource or this field. - format: int32 - maximum: 65535 - minimum: 1 - type: integer - weight: - default: 1 - description: "Weight specifies the proportion of requests forwarded to the referenced backend. This is computed as weight/(sum of all weights in this BackendRefs list). For non-zero values, there may be some epsilon from the exact proportion defined here depending on the precision an implementation supports. Weight is not a percentage and the sum of weights does not need to equal 100. \n If only one backend is specified and it has a weight greater than 0, 100% of the traffic is forwarded to that backend. If weight is set to 0, no traffic should be forwarded for this entry. If unspecified, weight defaults to 1. \n Support for this field varies based on the context where used." - format: int32 - maximum: 1000000 - minimum: 0 - type: integer - required: - - name - type: object - maxItems: 16 - type: array - filters: - description: "Filters define the filters that are applied to requests that match this rule. \n The effects of ordering of multiple behaviors are currently unspecified. This can change in the future based on feedback during the alpha stage. \n Conformance-levels at this level are defined based on the type of filter: \n - ALL core filters MUST be supported by all implementations. - Implementers are encouraged to support extended filters. - Implementation-specific custom filters have no API guarantees across implementations. \n Specifying a core filter multiple times has unspecified or implementation-specific conformance. \n All filters are expected to be compatible with each other except for the URLRewrite and RequestRedirect filters, which may not be combined. If an implementation can not support other combinations of filters, they must clearly document that limitation. In all cases where incompatible or unsupported filters are specified, implementations MUST add a warning condition to status. \n Support: Core" - items: - description: HTTPRouteFilter defines processing steps that must be completed during the request or response lifecycle. HTTPRouteFilters are meant as an extension point to express processing that may be done in Gateway implementations. Some examples include request or response modification, implementing authentication strategies, rate-limiting, and traffic shaping. API guarantee/conformance is defined based on the type of the filter. - properties: - extensionRef: - description: "ExtensionRef is an optional, implementation-specific extension to the \"filter\" behavior. For example, resource \"myroutefilter\" in group \"networking.example.net\"). ExtensionRef MUST NOT be used for core and extended filters. \n Support: Implementation-specific" - properties: - group: - description: Group is the group of the referent. For example, "gateway.networking.k8s.io". When unspecified or empty string, core API group is inferred. - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - description: Kind is kind of the referent. For example "HTTPRoute" or "Service". - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - name: - description: Name is the name of the referent. - maxLength: 253 - minLength: 1 - type: string - required: - - group - - kind - - name - type: object - requestHeaderModifier: - description: "RequestHeaderModifier defines a schema for a filter that modifies request headers. \n Support: Core" - properties: - add: - description: "Add adds the given header(s) (name, value) to the request before the action. It appends to any existing values associated with the header name. \n Input: GET /foo HTTP/1.1 my-header: foo \n Config: add: - name: \"my-header\" value: \"bar,baz\" \n Output: GET /foo HTTP/1.1 my-header: foo,bar,baz" - items: - description: HTTPHeader represents an HTTP Header name and value as defined by RFC 7230. - properties: - name: - description: "Name is the name of the HTTP Header to be matched. Name matching MUST be case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). \n If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries with an equivalent header name MUST be ignored. Due to the case-insensitivity of header names, \"foo\" and \"Foo\" are considered equivalent." - maxLength: 256 - minLength: 1 - pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ - type: string - value: - description: Value is the value of HTTP Header to be matched. - maxLength: 4096 - minLength: 1 - type: string - required: - - name - - value - type: object - maxItems: 16 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - remove: - description: "Remove the given header(s) from the HTTP request before the action. The value of Remove is a list of HTTP header names. Note that the header names are case-insensitive (see https://datatracker.ietf.org/doc/html/rfc2616#section-4.2). \n Input: GET /foo HTTP/1.1 my-header1: foo my-header2: bar my-header3: baz \n Config: remove: [\"my-header1\", \"my-header3\"] \n Output: GET /foo HTTP/1.1 my-header2: bar" - items: - type: string - maxItems: 16 - type: array - set: - description: "Set overwrites the request with the given header (name, value) before the action. \n Input: GET /foo HTTP/1.1 my-header: foo \n Config: set: - name: \"my-header\" value: \"bar\" \n Output: GET /foo HTTP/1.1 my-header: bar" - items: - description: HTTPHeader represents an HTTP Header name and value as defined by RFC 7230. - properties: - name: - description: "Name is the name of the HTTP Header to be matched. Name matching MUST be case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). \n If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries with an equivalent header name MUST be ignored. Due to the case-insensitivity of header names, \"foo\" and \"Foo\" are considered equivalent." - maxLength: 256 - minLength: 1 - pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ - type: string - value: - description: Value is the value of HTTP Header to be matched. - maxLength: 4096 - minLength: 1 - type: string - required: - - name - - value - type: object - maxItems: 16 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - type: object - requestMirror: - description: "RequestMirror defines a schema for a filter that mirrors requests. Requests are sent to the specified destination, but responses from that destination are ignored. \n Support: Extended" - properties: - backendRef: - description: "BackendRef references a resource where mirrored requests are sent. \n If the referent cannot be found, this BackendRef is invalid and must be dropped from the Gateway. The controller must ensure the \"ResolvedRefs\" condition on the Route status is set to `status: False` and not configure this backend in the underlying implementation. \n If there is a cross-namespace reference to an *existing* object that is not allowed by a ReferenceGrant, the controller must ensure the \"ResolvedRefs\" condition on the Route is set to `status: False`, with the \"RefNotPermitted\" reason and not configure this backend in the underlying implementation. \n In either error case, the Message of the `ResolvedRefs` Condition should be used to provide more detail about the problem. \n Support: Extended for Kubernetes Service \n Support: Implementation-specific for any other resource" - properties: - group: - default: "" - description: Group is the group of the referent. For example, "gateway.networking.k8s.io". When unspecified or empty string, core API group is inferred. - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - default: Service - description: Kind is kind of the referent. For example "HTTPRoute" or "Service". Defaults to "Service" when not specified. - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - name: - description: Name is the name of the referent. - maxLength: 253 - minLength: 1 - type: string - namespace: - description: "Namespace is the namespace of the backend. When unspecified, the local namespace is inferred. \n Note that when a namespace is specified, a ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details. \n Support: Core" - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - type: string - port: - description: Port specifies the destination port number to use for this resource. Port is required when the referent is a Kubernetes Service. In this case, the port number is the service port number, not the target port. For other resources, destination port might be derived from the referent resource or this field. - format: int32 - maximum: 65535 - minimum: 1 - type: integer - required: - - name - type: object - required: - - backendRef - type: object - requestRedirect: - description: "RequestRedirect defines a schema for a filter that responds to the request with an HTTP redirection. \n Support: Core" - properties: - hostname: - description: "Hostname is the hostname to be used in the value of the `Location` header in the response. When empty, the hostname of the request is used. \n Support: Core" - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - path: - description: "Path defines parameters used to modify the path of the incoming request. The modified path is then used to construct the `Location` header. When empty, the request path is used as-is. \n Support: Extended \n " - properties: - replaceFullPath: - description: "ReplaceFullPath specifies the value with which to replace the full path of a request during a rewrite or redirect. \n " - maxLength: 1024 - type: string - replacePrefixMatch: - description: "ReplacePrefixMatch specifies the value with which to replace the prefix match of a request during a rewrite or redirect. For example, a request to \"/foo/bar\" with a prefix match of \"/foo\" would be modified to \"/bar\". \n Note that this matches the behavior of the PathPrefix match type. This matches full path elements. A path element refers to the list of labels in the path split by the `/` separator. When specified, a trailing `/` is ignored. For example, the paths `/abc`, `/abc/`, and `/abc/def` would all match the prefix `/abc`, but the path `/abcd` would not. \n " - maxLength: 1024 - type: string - type: - description: "Type defines the type of path modifier. Additional types may be added in a future release of the API. \n Note that values may be added to this enum, implementations must ensure that unknown values will not cause a crash. \n Unknown values here must result in the implementation setting the Accepted Condition for the Route to `status: False`, with a Reason of `UnsupportedValue`. \n " - enum: - - ReplaceFullPath - - ReplacePrefixMatch - type: string - required: - - type - type: object - port: - description: "Port is the port to be used in the value of the `Location` header in the response. When empty, port (if specified) of the request is used. \n Support: Extended" - format: int32 - maximum: 65535 - minimum: 1 - type: integer - scheme: - description: "Scheme is the scheme to be used in the value of the `Location` header in the response. When empty, the scheme of the request is used. \n Note that values may be added to this enum, implementations must ensure that unknown values will not cause a crash. \n Unknown values here must result in the implementation setting the Accepted Condition for the Route to `status: False`, with a Reason of `UnsupportedValue`. \n Support: Extended" - enum: - - http - - https - type: string - statusCode: - default: 302 - description: "StatusCode is the HTTP status code to be used in response. \n Note that values may be added to this enum, implementations must ensure that unknown values will not cause a crash. \n Unknown values here must result in the implementation setting the Accepted Condition for the Route to `status: False`, with a Reason of `UnsupportedValue`. \n Support: Core" - enum: - - 301 - - 302 - type: integer - type: object - responseHeaderModifier: - description: "ResponseHeaderModifier defines a schema for a filter that modifies response headers. \n Support: Extended \n " - properties: - add: - description: "Add adds the given header(s) (name, value) to the request before the action. It appends to any existing values associated with the header name. \n Input: GET /foo HTTP/1.1 my-header: foo \n Config: add: - name: \"my-header\" value: \"bar,baz\" \n Output: GET /foo HTTP/1.1 my-header: foo,bar,baz" - items: - description: HTTPHeader represents an HTTP Header name and value as defined by RFC 7230. - properties: - name: - description: "Name is the name of the HTTP Header to be matched. Name matching MUST be case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). \n If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries with an equivalent header name MUST be ignored. Due to the case-insensitivity of header names, \"foo\" and \"Foo\" are considered equivalent." - maxLength: 256 - minLength: 1 - pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ - type: string - value: - description: Value is the value of HTTP Header to be matched. - maxLength: 4096 - minLength: 1 - type: string - required: - - name - - value - type: object - maxItems: 16 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - remove: - description: "Remove the given header(s) from the HTTP request before the action. The value of Remove is a list of HTTP header names. Note that the header names are case-insensitive (see https://datatracker.ietf.org/doc/html/rfc2616#section-4.2). \n Input: GET /foo HTTP/1.1 my-header1: foo my-header2: bar my-header3: baz \n Config: remove: [\"my-header1\", \"my-header3\"] \n Output: GET /foo HTTP/1.1 my-header2: bar" - items: - type: string - maxItems: 16 - type: array - set: - description: "Set overwrites the request with the given header (name, value) before the action. \n Input: GET /foo HTTP/1.1 my-header: foo \n Config: set: - name: \"my-header\" value: \"bar\" \n Output: GET /foo HTTP/1.1 my-header: bar" - items: - description: HTTPHeader represents an HTTP Header name and value as defined by RFC 7230. - properties: - name: - description: "Name is the name of the HTTP Header to be matched. Name matching MUST be case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). \n If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries with an equivalent header name MUST be ignored. Due to the case-insensitivity of header names, \"foo\" and \"Foo\" are considered equivalent." - maxLength: 256 - minLength: 1 - pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ - type: string - value: - description: Value is the value of HTTP Header to be matched. - maxLength: 4096 - minLength: 1 - type: string - required: - - name - - value - type: object - maxItems: 16 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - type: object - type: - description: "Type identifies the type of filter to apply. As with other API fields, types are classified into three conformance levels: \n - Core: Filter types and their corresponding configuration defined by \"Support: Core\" in this package, e.g. \"RequestHeaderModifier\". All implementations must support core filters. \n - Extended: Filter types and their corresponding configuration defined by \"Support: Extended\" in this package, e.g. \"RequestMirror\". Implementers are encouraged to support extended filters. \n - Implementation-specific: Filters that are defined and supported by specific vendors. In the future, filters showing convergence in behavior across multiple implementations will be considered for inclusion in extended or core conformance levels. Filter-specific configuration for such filters is specified using the ExtensionRef field. `Type` should be set to \"ExtensionRef\" for custom filters. \n Implementers are encouraged to define custom implementation types to extend the core API with implementation-specific behavior. \n If a reference to a custom filter type cannot be resolved, the filter MUST NOT be skipped. Instead, requests that would have been processed by that filter MUST receive a HTTP error response. \n Note that values may be added to this enum, implementations must ensure that unknown values will not cause a crash. \n Unknown values here must result in the implementation setting the Accepted Condition for the Route to `status: False`, with a Reason of `UnsupportedValue`. \n " - enum: - - RequestHeaderModifier - - ResponseHeaderModifier - - RequestMirror - - RequestRedirect - - URLRewrite - - ExtensionRef - type: string - urlRewrite: - description: "URLRewrite defines a schema for a filter that modifies a request during forwarding. \n Support: Extended \n " - properties: - hostname: - description: "Hostname is the value to be used to replace the Host header value during forwarding. \n Support: Extended \n " - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - path: - description: "Path defines a path rewrite. \n Support: Extended \n " - properties: - replaceFullPath: - description: "ReplaceFullPath specifies the value with which to replace the full path of a request during a rewrite or redirect. \n " - maxLength: 1024 - type: string - replacePrefixMatch: - description: "ReplacePrefixMatch specifies the value with which to replace the prefix match of a request during a rewrite or redirect. For example, a request to \"/foo/bar\" with a prefix match of \"/foo\" would be modified to \"/bar\". \n Note that this matches the behavior of the PathPrefix match type. This matches full path elements. A path element refers to the list of labels in the path split by the `/` separator. When specified, a trailing `/` is ignored. For example, the paths `/abc`, `/abc/`, and `/abc/def` would all match the prefix `/abc`, but the path `/abcd` would not. \n " - maxLength: 1024 - type: string - type: - description: "Type defines the type of path modifier. Additional types may be added in a future release of the API. \n Note that values may be added to this enum, implementations must ensure that unknown values will not cause a crash. \n Unknown values here must result in the implementation setting the Accepted Condition for the Route to `status: False`, with a Reason of `UnsupportedValue`. \n " - enum: - - ReplaceFullPath - - ReplacePrefixMatch - type: string - required: - - type - type: object - type: object - required: - - type - type: object - maxItems: 16 - type: array - matches: - default: - - path: - type: PathPrefix - value: / - description: "Matches define conditions used for matching the rule against incoming HTTP requests. Each match is independent, i.e. this rule will be matched if **any** one of the matches is satisfied. \n For example, take the following matches configuration: \n ``` matches: - path: value: \"/foo\" headers: - name: \"version\" value: \"v2\" - path: value: \"/v2/foo\" ``` \n For a request to match against this rule, a request must satisfy EITHER of the two conditions: \n - path prefixed with `/foo` AND contains the header `version: v2` - path prefix of `/v2/foo` \n See the documentation for HTTPRouteMatch on how to specify multiple match conditions that should be ANDed together. \n If no matches are specified, the default is a prefix path match on \"/\", which has the effect of matching every HTTP request. \n Proxy or Load Balancer routing configuration generated from HTTPRoutes MUST prioritize matches based on the following criteria, continuing on ties. Across all rules specified on applicable Routes, precedence must be given to the match with the largest number of: \n * Characters in a matching path. * Header matches. * Query param matches. \n If ties still exist across multiple Routes, matching precedence MUST be determined in order of the following criteria, continuing on ties: \n * The oldest Route based on creation timestamp. * The Route appearing first in alphabetical order by \"{namespace}/{name}\". \n If ties still exist within an HTTPRoute, matching precedence MUST be granted to the FIRST matching rule (in list order) with a match meeting the above criteria. \n When no rules matching a request have been successfully attached to the parent a request is coming from, a HTTP 404 status code MUST be returned." - items: - description: "HTTPRouteMatch defines the predicate used to match requests to a given action. Multiple match types are ANDed together, i.e. the match will evaluate to true only if all conditions are satisfied. \n For example, the match below will match a HTTP request only if its path starts with `/foo` AND it contains the `version: v1` header: \n ``` match: \n \tpath: \t value: \"/foo\" \theaders: \t- name: \"version\" \t value \"v1\" \n ```" - properties: - headers: - description: Headers specifies HTTP request header matchers. Multiple match values are ANDed together, meaning, a request must match all the specified headers to select the route. - items: - description: HTTPHeaderMatch describes how to select a HTTP route by matching HTTP request headers. - properties: - name: - description: "Name is the name of the HTTP Header to be matched. Name matching MUST be case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). \n If multiple entries specify equivalent header names, only the first entry with an equivalent name MUST be considered for a match. Subsequent entries with an equivalent header name MUST be ignored. Due to the case-insensitivity of header names, \"foo\" and \"Foo\" are considered equivalent. \n When a header is repeated in an HTTP request, it is implementation-specific behavior as to how this is represented. Generally, proxies should follow the guidance from the RFC: https://www.rfc-editor.org/rfc/rfc7230.html#section-3.2.2 regarding processing a repeated header, with special handling for \"Set-Cookie\"." - maxLength: 256 - minLength: 1 - pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ - type: string - type: - default: Exact - description: "Type specifies how to match against the value of the header. \n Support: Core (Exact) \n Support: Implementation-specific (RegularExpression) \n Since RegularExpression HeaderMatchType has implementation-specific conformance, implementations can support POSIX, PCRE or any other dialects of regular expressions. Please read the implementation's documentation to determine the supported dialect." - enum: - - Exact - - RegularExpression - type: string - value: - description: Value is the value of HTTP Header to be matched. - maxLength: 4096 - minLength: 1 - type: string - required: - - name - - value - type: object - maxItems: 16 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - method: - description: "Method specifies HTTP method matcher. When specified, this route will be matched only if the request has the specified method. \n Support: Extended" - enum: - - GET - - HEAD - - POST - - PUT - - DELETE - - CONNECT - - OPTIONS - - TRACE - - PATCH - type: string - path: - default: - type: PathPrefix - value: / - description: Path specifies a HTTP request path matcher. If this field is not specified, a default prefix match on the "/" path is provided. - properties: - type: - default: PathPrefix - description: "Type specifies how to match against the path Value. \n Support: Core (Exact, PathPrefix) \n Support: Implementation-specific (RegularExpression)" - enum: - - Exact - - PathPrefix - - RegularExpression - type: string - value: - default: / - description: Value of the HTTP path to match against. - maxLength: 1024 - type: string - type: object - queryParams: - description: "QueryParams specifies HTTP query parameter matchers. Multiple match values are ANDed together, meaning, a request must match all the specified query parameters to select the route. \n Support: Extended" - items: - description: HTTPQueryParamMatch describes how to select a HTTP route by matching HTTP query parameters. - properties: - name: - description: "Name is the name of the HTTP query param to be matched. This must be an exact string match. (See https://tools.ietf.org/html/rfc7230#section-2.7.3). \n If multiple entries specify equivalent query param names, only the first entry with an equivalent name MUST be considered for a match. Subsequent entries with an equivalent query param name MUST be ignored. \n If a query param is repeated in an HTTP request, the behavior is purposely left undefined, since different data planes have different capabilities. However, it is *recommended* that implementations should match against the first value of the param if the data plane supports it, as this behavior is expected in other load balancing contexts outside of the Gateway API. \n Users SHOULD NOT route traffic based on repeated query params to guard themselves against potential differences in the implementations." - maxLength: 256 - minLength: 1 - type: string - type: - default: Exact - description: "Type specifies how to match against the value of the query parameter. \n Support: Extended (Exact) \n Support: Implementation-specific (RegularExpression) \n Since RegularExpression QueryParamMatchType has Implementation-specific conformance, implementations can support POSIX, PCRE or any other dialects of regular expressions. Please read the implementation's documentation to determine the supported dialect." - enum: - - Exact - - RegularExpression - type: string - value: - description: Value is the value of HTTP query param to be matched. - maxLength: 1024 - minLength: 1 - type: string - required: - - name - - value - type: object - maxItems: 16 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - type: object - maxItems: 8 - type: array - type: object - maxItems: 16 - type: array - type: object - status: - description: Status defines the current state of HTTPRoute. - properties: - parents: - description: "Parents is a list of parent resources (usually Gateways) that are associated with the route, and the status of the route with respect to each parent. When this route attaches to a parent, the controller that manages the parent must add an entry to this list when the controller first sees the route and should update the entry as appropriate when the route or gateway is modified. \n Note that parent references that cannot be resolved by an implementation of this API will not be added to this list. Implementations of this API can only populate Route status for the Gateways/parent resources they are responsible for. \n A maximum of 32 Gateways will be represented in this list. An empty list means the route has not been attached to any Gateway." - items: - description: RouteParentStatus describes the status of a route with respect to an associated Parent. - properties: - conditions: - description: "Conditions describes the status of the route with respect to the Gateway. Note that the route's availability is also subject to the Gateway's own status conditions and listener status. \n If the Route's ParentRef specifies an existing Gateway that supports Routes of this kind AND that Gateway's controller has sufficient access, then that Gateway's controller MUST set the \"Accepted\" condition on the Route, to indicate whether the route has been accepted or rejected by the Gateway, and why. \n A Route MUST be considered \"Accepted\" if at least one of the Route's rules is implemented by the Gateway. \n There are a number of cases where the \"Accepted\" condition may not be set due to lack of controller visibility, that includes when: \n * The Route refers to a non-existent parent. * The Route is of a type that the controller does not support. * The Route is in a namespace the controller does not have access to." - items: - description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, \n \ttype FooStatus struct{ \t // Represents the observations of a foo's current state. \t // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" \t // +patchMergeKey=type \t // +patchStrategy=merge \t // +listType=map \t // +listMapKey=type \t Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n \t // other fields \t}" - properties: - lastTransitionTime: - description: lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: message is a human readable message indicating details about the transition. This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. --- Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 8 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - controllerName: - description: "ControllerName is a domain/path string that indicates the name of the controller that wrote this status. This corresponds with the controllerName field on GatewayClass. \n Example: \"example.net/gateway-controller\". \n The format of this field is DOMAIN \"/\" PATH, where DOMAIN and PATH are valid Kubernetes names (https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names). \n Controllers MUST populate this field when writing status. Controllers should ensure that entries to status populated with their ControllerName are cleaned up when they are no longer necessary." - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$ - type: string - parentRef: - description: ParentRef corresponds with a ParentRef in the spec that this RouteParentStatus struct describes the status of. - properties: - group: - default: gateway.networking.k8s.io - description: "Group is the group of the referent. When unspecified, \"gateway.networking.k8s.io\" is inferred. To set the core API group (such as for a \"Service\" kind referent), Group must be explicitly set to \"\" (empty string). \n Support: Core" - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - default: Gateway - description: "Kind is kind of the referent. \n Support: Core (Gateway) \n Support: Implementation-specific (Other Resources)" - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - name: - description: "Name is the name of the referent. \n Support: Core" - maxLength: 253 - minLength: 1 - type: string - namespace: - description: "Namespace is the namespace of the referent. When unspecified, this refers to the local namespace of the Route. \n Note that there are specific rules for ParentRefs which cross namespace boundaries. Cross-namespace references are only valid if they are explicitly allowed by something in the namespace they are referring to. For example: Gateway has the AllowedRoutes field, and ReferenceGrant provides a generic way to enable any other kind of cross-namespace reference. \n Support: Core" - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - type: string - port: - description: "Port is the network port this Route targets. It can be interpreted differently based on the type of parent resource. \n When the parent resource is a Gateway, this targets all listeners listening on the specified port that also support this kind of Route(and select this Route). It's not recommended to set `Port` unless the networking behaviors specified in a Route must apply to a specific port as opposed to a listener(s) whose port(s) may be changed. When both Port and SectionName are specified, the name and port of the selected listener must match both specified values. \n Implementations MAY choose to support other parent resources. Implementations supporting other types of parent resources MUST clearly document how/if Port is interpreted. \n For the purpose of status, an attachment is considered successful as long as the parent resource accepts it partially. For example, Gateway listeners can restrict which Routes can attach to them by Route kind, namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from the referencing Route, the Route MUST be considered successfully attached. If no Gateway listeners accept attachment from this Route, the Route MUST be considered detached from the Gateway. \n Support: Extended \n " - format: int32 - maximum: 65535 - minimum: 1 - type: integer - sectionName: - description: "SectionName is the name of a section within the target resource. In the following resources, SectionName is interpreted as the following: \n * Gateway: Listener Name. When both Port (experimental) and SectionName are specified, the name and port of the selected listener must match both specified values. \n Implementations MAY choose to support attaching Routes to other resources. If that is the case, they MUST clearly document how SectionName is interpreted. \n When unspecified (empty string), this will reference the entire resource. For the purpose of status, an attachment is considered successful if at least one section in the parent resource accepts it. For example, Gateway listeners can restrict which Routes can attach to them by Route kind, namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from the referencing Route, the Route MUST be considered successfully attached. If no Gateway listeners accept attachment from this Route, the Route MUST be considered detached from the Gateway. \n Support: Core" - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - required: - - name - type: object - required: - - controllerName - - parentRef - type: object - maxItems: 32 - type: array - required: - - parents - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] -{{- end }} diff --git a/charts/consul/templates/crd-ingressgateways.yaml b/charts/consul/templates/crd-ingressgateways.yaml deleted file mode 100644 index 53649c8..0000000 --- a/charts/consul/templates/crd-ingressgateways.yaml +++ /dev/null @@ -1,466 +0,0 @@ -{{- if .Values.connectInject.enabled }} -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.14.0 - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: crd - name: ingressgateways.consul.hashicorp.com -spec: - group: consul.hashicorp.com - names: - kind: IngressGateway - listKind: IngressGatewayList - plural: ingressgateways - shortNames: - - ingress-gateway - singular: ingressgateway - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: The sync status of the resource with Consul - jsonPath: .status.conditions[?(@.type=="Synced")].status - name: Synced - type: string - - description: The last successful synced time of the resource with Consul - jsonPath: .status.lastSyncedTime - name: Last Synced - type: date - - description: The age of the resource - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - description: IngressGateway is the Schema for the ingressgateways API - properties: - apiVersion: - description: |- - APIVersion defines the versioned schema of this representation of an object. - Servers should convert recognized schemas to the latest internal value, and - may reject unrecognized values. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - type: string - kind: - description: |- - Kind is a string value representing the REST resource this object represents. - Servers may infer this from the endpoint the client submits requests to. - Cannot be updated. - In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - type: string - metadata: - type: object - spec: - description: IngressGatewaySpec defines the desired state of IngressGateway. - properties: - defaults: - description: Defaults is default configuration for all upstream services - properties: - maxConcurrentRequests: - description: |- - The maximum number of concurrent requests that - will be allowed at a single point in time. Use this to limit HTTP/2 traffic, - since HTTP/2 has many requests per connection. - format: int32 - type: integer - maxConnections: - description: |- - The maximum number of connections a service instance - will be allowed to establish against the given upstream. Use this to limit - HTTP/1.1 traffic, since HTTP/1.1 has a request per connection. - format: int32 - type: integer - maxPendingRequests: - description: |- - The maximum number of requests that will be queued - while waiting for a connection to be established. - format: int32 - type: integer - passiveHealthCheck: - description: |- - PassiveHealthCheck configuration determines how upstream proxy instances will - be monitored for removal from the load balancing pool. - properties: - baseEjectionTime: - description: |- - The base time that a host is ejected for. The real time is equal to the base time - multiplied by the number of times the host has been ejected and is capped by - max_ejection_time (Default 300s). Defaults to 30s. - type: string - enforcingConsecutive5xx: - description: |- - EnforcingConsecutive5xx is the % chance that a host will be actually ejected - when an outlier status is detected through consecutive 5xx. - This setting can be used to disable ejection or to ramp it up slowly. - Ex. Setting this to 10 will make it a 10% chance that the host will be ejected. - format: int32 - type: integer - interval: - description: |- - Interval between health check analysis sweeps. Each sweep may remove - hosts or return hosts to the pool. Ex. setting this to "10s" will set - the interval to 10 seconds. - type: string - maxEjectionPercent: - description: |- - The maximum % of an upstream cluster that can be ejected due to outlier detection. - Defaults to 10% but will eject at least one host regardless of the value. - format: int32 - type: integer - maxFailures: - description: |- - MaxFailures is the count of consecutive failures that results in a host - being removed from the pool. - format: int32 - type: integer - type: object - type: object - listeners: - description: |- - Listeners declares what ports the ingress gateway should listen on, and - what services to associated to those ports. - items: - description: IngressListener manages the configuration for a listener - on a specific port. - properties: - port: - description: Port declares the port on which the ingress gateway - should listen for traffic. - type: integer - protocol: - description: |- - Protocol declares what type of traffic this listener is expected to - receive. Depending on the protocol, a listener might support multiplexing - services over a single port, or additional discovery chain features. The - current supported values are: (tcp | http | http2 | grpc). - type: string - services: - description: |- - Services declares the set of services to which the listener forwards - traffic. - For "tcp" protocol listeners, only a single service is allowed. - For "http" listeners, multiple services can be declared. - items: - description: |- - IngressService manages configuration for services that are exposed to - ingress traffic. - properties: - hosts: - description: |- - Hosts is a list of hostnames which should be associated to this service on - the defined listener. Only allowed on layer 7 protocols, this will be used - to route traffic to the service by matching the Host header of the HTTP - request. - - - If a host is provided for a service that also has a wildcard specifier - defined, the host will override the wildcard-specifier-provided - ".*" domain for that listener. - - - This cannot be specified when using the wildcard specifier, "*", or when - using a "tcp" listener. - items: - type: string - type: array - maxConcurrentRequests: - description: |- - The maximum number of concurrent requests that - will be allowed at a single point in time. Use this to limit HTTP/2 traffic, - since HTTP/2 has many requests per connection. - format: int32 - type: integer - maxConnections: - description: |- - The maximum number of connections a service instance - will be allowed to establish against the given upstream. Use this to limit - HTTP/1.1 traffic, since HTTP/1.1 has a request per connection. - format: int32 - type: integer - maxPendingRequests: - description: |- - The maximum number of requests that will be queued - while waiting for a connection to be established. - format: int32 - type: integer - name: - description: |- - Name declares the service to which traffic should be forwarded. - - - This can either be a specific service, or the wildcard specifier, - "*". If the wildcard specifier is provided, the listener must be of "http" - protocol and means that the listener will forward traffic to all services. - - - A name can be specified on multiple listeners, and will be exposed on both - of the listeners. - type: string - namespace: - description: |- - Namespace is the namespace where the service is located. - Namespacing is a Consul Enterprise feature. - type: string - partition: - description: |- - Partition is the admin-partition where the service is located. - Partitioning is a Consul Enterprise feature. - type: string - passiveHealthCheck: - description: |- - PassiveHealthCheck configuration determines how upstream proxy instances will - be monitored for removal from the load balancing pool. - properties: - baseEjectionTime: - description: |- - The base time that a host is ejected for. The real time is equal to the base time - multiplied by the number of times the host has been ejected and is capped by - max_ejection_time (Default 300s). Defaults to 30s. - type: string - enforcingConsecutive5xx: - description: |- - EnforcingConsecutive5xx is the % chance that a host will be actually ejected - when an outlier status is detected through consecutive 5xx. - This setting can be used to disable ejection or to ramp it up slowly. - Ex. Setting this to 10 will make it a 10% chance that the host will be ejected. - format: int32 - type: integer - interval: - description: |- - Interval between health check analysis sweeps. Each sweep may remove - hosts or return hosts to the pool. Ex. setting this to "10s" will set - the interval to 10 seconds. - type: string - maxEjectionPercent: - description: |- - The maximum % of an upstream cluster that can be ejected due to outlier detection. - Defaults to 10% but will eject at least one host regardless of the value. - format: int32 - type: integer - maxFailures: - description: |- - MaxFailures is the count of consecutive failures that results in a host - being removed from the pool. - format: int32 - type: integer - type: object - requestHeaders: - description: Allow HTTP header manipulation to be configured. - properties: - add: - additionalProperties: - type: string - description: |- - Add is a set of name -> value pairs that should be appended to the request - or response (i.e. allowing duplicates if the same header already exists). - type: object - remove: - description: |- - Remove is the set of header names that should be stripped from the request - or response. - items: - type: string - type: array - set: - additionalProperties: - type: string - description: |- - Set is a set of name -> value pairs that should be added to the request or - response, overwriting any existing header values of the same name. - type: object - type: object - responseHeaders: - description: |- - HTTPHeaderModifiers is a set of rules for HTTP header modification that - should be performed by proxies as the request passes through them. It can - operate on either request or response headers depending on the context in - which it is used. - properties: - add: - additionalProperties: - type: string - description: |- - Add is a set of name -> value pairs that should be appended to the request - or response (i.e. allowing duplicates if the same header already exists). - type: object - remove: - description: |- - Remove is the set of header names that should be stripped from the request - or response. - items: - type: string - type: array - set: - additionalProperties: - type: string - description: |- - Set is a set of name -> value pairs that should be added to the request or - response, overwriting any existing header values of the same name. - type: object - type: object - tls: - description: TLS allows specifying some TLS configuration - per listener. - properties: - sds: - description: SDS allows configuring TLS certificate - from an SDS service. - properties: - certResource: - description: CertResource is the SDS resource - name to request when fetching the certificate - from the SDS service. - type: string - clusterName: - description: |- - ClusterName is the SDS cluster name to connect to, to retrieve certificates. - This cluster must be specified in the Gateway's bootstrap configuration. - type: string - type: object - type: object - type: object - type: array - tls: - description: TLS config for this listener. - properties: - cipherSuites: - description: |- - Define a subset of cipher suites to restrict - Only applicable to connections negotiated via TLS 1.2 or earlier. - items: - type: string - type: array - enabled: - description: Indicates that TLS should be enabled for this - gateway service. - type: boolean - sds: - description: SDS allows configuring TLS certificate from - an SDS service. - properties: - certResource: - description: CertResource is the SDS resource name to - request when fetching the certificate from the SDS - service. - type: string - clusterName: - description: |- - ClusterName is the SDS cluster name to connect to, to retrieve certificates. - This cluster must be specified in the Gateway's bootstrap configuration. - type: string - type: object - tlsMaxVersion: - description: |- - TLSMaxVersion sets the default maximum TLS version supported. Must be greater than or equal to `TLSMinVersion`. - One of `TLS_AUTO`, `TLSv1_0`, `TLSv1_1`, `TLSv1_2`, or `TLSv1_3`. - If unspecified, Envoy will default to TLS 1.3 as a max version for incoming connections. - type: string - tlsMinVersion: - description: |- - TLSMinVersion sets the default minimum TLS version supported. - One of `TLS_AUTO`, `TLSv1_0`, `TLSv1_1`, `TLSv1_2`, or `TLSv1_3`. - If unspecified, Envoy v1.22.0 and newer will default to TLS 1.2 as a min version, - while older releases of Envoy default to TLS 1.0. - type: string - required: - - enabled - type: object - type: object - type: array - tls: - description: TLS holds the TLS configuration for this gateway. - properties: - cipherSuites: - description: |- - Define a subset of cipher suites to restrict - Only applicable to connections negotiated via TLS 1.2 or earlier. - items: - type: string - type: array - enabled: - description: Indicates that TLS should be enabled for this gateway - service. - type: boolean - sds: - description: SDS allows configuring TLS certificate from an SDS - service. - properties: - certResource: - description: CertResource is the SDS resource name to request - when fetching the certificate from the SDS service. - type: string - clusterName: - description: |- - ClusterName is the SDS cluster name to connect to, to retrieve certificates. - This cluster must be specified in the Gateway's bootstrap configuration. - type: string - type: object - tlsMaxVersion: - description: |- - TLSMaxVersion sets the default maximum TLS version supported. Must be greater than or equal to `TLSMinVersion`. - One of `TLS_AUTO`, `TLSv1_0`, `TLSv1_1`, `TLSv1_2`, or `TLSv1_3`. - If unspecified, Envoy will default to TLS 1.3 as a max version for incoming connections. - type: string - tlsMinVersion: - description: |- - TLSMinVersion sets the default minimum TLS version supported. - One of `TLS_AUTO`, `TLSv1_0`, `TLSv1_1`, `TLSv1_2`, or `TLSv1_3`. - If unspecified, Envoy v1.22.0 and newer will default to TLS 1.2 as a min version, - while older releases of Envoy default to TLS 1.0. - type: string - required: - - enabled - type: object - type: object - status: - properties: - conditions: - description: Conditions indicate the latest available observations - of a resource's current state. - items: - description: |- - Conditions define a readiness condition for a Consul resource. - See: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#typical-status-properties - properties: - lastTransitionTime: - description: LastTransitionTime is the last time the condition - transitioned from one status to another. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. - type: string - reason: - description: The reason for the condition's last transition. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition. - type: string - required: - - status - - type - type: object - type: array - lastSyncedTime: - description: LastSyncedTime is the last time the resource successfully - synced with Consul. - format: date-time - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} -{{- end }} diff --git a/charts/consul/templates/crd-jwtproviders.yaml b/charts/consul/templates/crd-jwtproviders.yaml deleted file mode 100644 index a787407..0000000 --- a/charts/consul/templates/crd-jwtproviders.yaml +++ /dev/null @@ -1,382 +0,0 @@ -{{- if .Values.connectInject.enabled }} -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.14.0 - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: crd - name: jwtproviders.consul.hashicorp.com -spec: - group: consul.hashicorp.com - names: - kind: JWTProvider - listKind: JWTProviderList - plural: jwtproviders - singular: jwtprovider - scope: Namespaced - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: JWTProvider is the Schema for the jwtproviders API. - properties: - apiVersion: - description: |- - APIVersion defines the versioned schema of this representation of an object. - Servers should convert recognized schemas to the latest internal value, and - may reject unrecognized values. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - type: string - kind: - description: |- - Kind is a string value representing the REST resource this object represents. - Servers may infer this from the endpoint the client submits requests to. - Cannot be updated. - In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - type: string - metadata: - type: object - spec: - description: JWTProviderSpec defines the desired state of JWTProvider - properties: - audiences: - description: |- - Audiences is the set of audiences the JWT is allowed to access. - If specified, all JWTs verified with this provider must address - at least one of these to be considered valid. - items: - type: string - type: array - cacheConfig: - description: |- - CacheConfig defines configuration for caching the validation - result for previously seen JWTs. Caching results can speed up - verification when individual tokens are expected to be handled - multiple times. - properties: - size: - description: |- - Size specifies the maximum number of JWT verification - results to cache. - - - Defaults to 0, meaning that JWT caching is disabled. - type: integer - type: object - clockSkewSeconds: - description: |- - ClockSkewSeconds specifies the maximum allowable time difference - from clock skew when validating the "exp" (Expiration) and "nbf" - (Not Before) claims. - - - Default value is 30 seconds. - type: integer - forwarding: - description: Forwarding defines rules for forwarding verified JWTs - to the backend. - properties: - headerName: - description: |- - HeaderName is a header name to use when forwarding a verified - JWT to the backend. The verified JWT could have been extracted - from any location (query param, header, or cookie). - - - The header value will be base64-URL-encoded, and will not be - padded unless PadForwardPayloadHeader is true. - type: string - padForwardPayloadHeader: - description: |- - PadForwardPayloadHeader determines whether padding should be added - to the base64 encoded token forwarded with ForwardPayloadHeader. - - - Default value is false. - type: boolean - type: object - issuer: - description: |- - Issuer is the entity that must have issued the JWT. - This value must match the "iss" claim of the token. - type: string - jsonWebKeySet: - description: |- - JSONWebKeySet defines a JSON Web Key Set, its location on disk, or the - means with which to fetch a key set from a remote server. - properties: - local: - description: Local specifies a local source for the key set. - properties: - filename: - description: |- - Filename configures a location on disk where the JWKS can be - found. If specified, the file must be present on the disk of ALL - proxies with intentions referencing this provider. - type: string - jwks: - description: JWKS contains a base64 encoded JWKS. - type: string - type: object - remote: - description: Remote specifies how to fetch a key set from a remote - server. - properties: - cacheDuration: - description: |- - CacheDuration is the duration after which cached keys - should be expired. - - - Default value is 5 minutes. - type: string - fetchAsynchronously: - description: |- - FetchAsynchronously indicates that the JWKS should be fetched - when a client request arrives. Client requests will be paused - until the JWKS is fetched. - If false, the proxy listener will wait for the JWKS to be - fetched before being activated. - - - Default value is false. - type: boolean - useSNI: - description: |- - UseSNI determines whether the hostname should be set in SNI - header for TLS connection. - - Default value is false. - type: boolean - jwksCluster: - description: JWKSCluster defines how the specified Remote - JWKS URI is to be fetched. - properties: - connectTimeout: - description: |- - The timeout for new network connections to hosts in the cluster. - If not set, a default value of 5s will be used. - type: string - discoveryType: - description: |- - DiscoveryType refers to the service discovery type to use for resolving the cluster. - - - This defaults to STRICT_DNS. - Other options include STATIC, LOGICAL_DNS, EDS or ORIGINAL_DST. - type: string - tlsCertificates: - description: |- - TLSCertificates refers to the data containing certificate authority certificates to use - in verifying a presented peer certificate. - If not specified and a peer certificate is presented it will not be verified. - - - Must be either CaCertificateProviderInstance or TrustedCA. - properties: - caCertificateProviderInstance: - description: CaCertificateProviderInstance Certificate - provider instance for fetching TLS certificates. - properties: - certificateName: - description: |- - CertificateName is used to specify certificate instances or types. For example, "ROOTCA" to specify - a root-certificate (validation context) or "example.com" to specify a certificate for a - particular domain. - - - The default value is the empty string. - type: string - instanceName: - description: |- - InstanceName refers to the certificate provider instance name. - - - The default value is "default". - type: string - type: object - trustedCA: - description: |- - TrustedCA defines TLS certificate data containing certificate authority certificates - to use in verifying a presented peer certificate. - - - Exactly one of Filename, EnvironmentVariable, InlineString or InlineBytes must be specified. - properties: - environmentVariable: - type: string - filename: - type: string - inlineBytes: - format: byte - type: string - inlineString: - type: string - type: object - type: object - type: object - requestTimeoutMs: - description: |- - RequestTimeoutMs is the number of milliseconds to - time out when making a request for the JWKS. - type: integer - retryPolicy: - description: |- - RetryPolicy defines a retry policy for fetching JWKS. - - - There is no retry by default. - properties: - numRetries: - description: |- - NumRetries is the number of times to retry fetching the JWKS. - The retry strategy uses jittered exponential backoff with - a base interval of 1s and max of 10s. - - - Default value is 0. - type: integer - retryPolicyBackOff: - description: |- - Retry's backoff policy. - - - Defaults to Envoy's backoff policy. - properties: - baseInterval: - description: |- - BaseInterval to be used for the next back off computation. - - - The default value from envoy is 1s. - type: string - maxInterval: - description: |- - MaxInternal to be used to specify the maximum interval between retries. - Optional but should be greater or equal to BaseInterval. - - - Defaults to 10 times BaseInterval. - type: string - type: object - type: object - uri: - description: URI is the URI of the server to query for the - JWKS. - type: string - type: object - type: object - locations: - description: |- - Locations where the JWT will be present in requests. - Envoy will check all of these locations to extract a JWT. - If no locations are specified Envoy will default to: - 1. Authorization header with Bearer schema: - "Authorization: Bearer " - 2. accessToken query parameter. - items: - description: |- - JWTLocation is a location where the JWT could be present in requests. - - - Only one of Header, QueryParam, or Cookie can be specified. - properties: - cookie: - description: Cookie defines how to extract a JWT from an HTTP - request cookie. - properties: - name: - description: Name is the name of the cookie containing the - token. - type: string - type: object - header: - description: Header defines how to extract a JWT from an HTTP - request header. - properties: - forward: - description: |- - Forward defines whether the header with the JWT should be - forwarded after the token has been verified. If false, the - header will not be forwarded to the backend. - - - Default value is false. - type: boolean - name: - description: Name is the name of the header containing the - token. - type: string - valuePrefix: - description: |- - ValuePrefix is an optional prefix that precedes the token in the - header value. - For example, "Bearer " is a standard value prefix for a header named - "Authorization", but the prefix is not part of the token itself: - "Authorization: Bearer " - type: string - type: object - queryParam: - description: |- - QueryParam defines how to extract a JWT from an HTTP request - query parameter. - properties: - name: - description: Name is the name of the query param containing - the token. - type: string - type: object - type: object - type: array - type: object - status: - properties: - conditions: - description: Conditions indicate the latest available observations - of a resource's current state. - items: - description: |- - Conditions define a readiness condition for a Consul resource. - See: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#typical-status-properties - properties: - lastTransitionTime: - description: LastTransitionTime is the last time the condition - transitioned from one status to another. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. - type: string - reason: - description: The reason for the condition's last transition. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition. - type: string - required: - - status - - type - type: object - type: array - lastSyncedTime: - description: LastSyncedTime is the last time the resource successfully - synced with Consul. - format: date-time - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} -{{- end }} diff --git a/charts/consul/templates/crd-meshes.yaml b/charts/consul/templates/crd-meshes.yaml deleted file mode 100644 index 9ecc1f3..0000000 --- a/charts/consul/templates/crd-meshes.yaml +++ /dev/null @@ -1,259 +0,0 @@ -{{- if .Values.connectInject.enabled }} -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.14.0 - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: crd - name: meshes.consul.hashicorp.com -spec: - group: consul.hashicorp.com - names: - kind: Mesh - listKind: MeshList - plural: meshes - singular: mesh - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: The sync status of the resource with Consul - jsonPath: .status.conditions[?(@.type=="Synced")].status - name: Synced - type: string - - description: The last successful synced time of the resource with Consul - jsonPath: .status.lastSyncedTime - name: Last Synced - type: date - - description: The age of the resource - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - description: Mesh is the Schema for the mesh API - properties: - apiVersion: - description: |- - APIVersion defines the versioned schema of this representation of an object. - Servers should convert recognized schemas to the latest internal value, and - may reject unrecognized values. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - type: string - kind: - description: |- - Kind is a string value representing the REST resource this object represents. - Servers may infer this from the endpoint the client submits requests to. - Cannot be updated. - In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - type: string - metadata: - type: object - spec: - description: MeshSpec defines the desired state of Mesh. - properties: - allowEnablingPermissiveMutualTLS: - description: |- - AllowEnablingPermissiveMutualTLS must be true in order to allow setting - MutualTLSMode=permissive in either service-defaults or proxy-defaults. - type: boolean - http: - description: HTTP defines the HTTP configuration for the service mesh. - properties: - incoming: - description: Incoming configures settings for incoming HTTP traffic - to mesh proxies. - properties: - requestNormalization: - description: |- - RequestNormalizationMeshConfig contains options pertaining to the - normalization of HTTP requests processed by mesh proxies. - properties: - headersWithUnderscoresAction: - description: |- - HeadersWithUnderscoresAction sets the value of the \`headers_with_underscores_action\` option in the Envoy - listener's \`HttpConnectionManager\` under \`common_http_protocol_options\`. The default value of this option is - empty, which is equivalent to \`ALLOW\`. Refer to the Envoy documentation for more information on available - options. - type: string - insecureDisablePathNormalization: - description: |- - InsecureDisablePathNormalization sets the value of the \`normalize_path\` option in the Envoy listener's - `HttpConnectionManager`. The default value is \`false\`. When set to \`true\` in Consul, \`normalize_path\` is - set to \`false\` for the Envoy proxy. This parameter disables the normalization of request URL paths according to - RFC 3986, conversion of \`\\\` to \`/\`, and decoding non-reserved %-encoded characters. When using L7 intentions - with path match rules, we recommend enabling path normalization in order to avoid match rule circumvention with - non-normalized path values. - type: boolean - mergeSlashes: - description: |- - MergeSlashes sets the value of the \`merge_slashes\` option in the Envoy listener's \`HttpConnectionManager\`. - The default value is \`false\`. This option controls the normalization of request URL paths by merging - consecutive \`/\` characters. This normalization is not part of RFC 3986. When using L7 intentions with path - match rules, we recommend enabling this setting to avoid match rule circumvention through non-normalized path - values, unless legitimate service traffic depends on allowing for repeat \`/\` characters, or upstream services - are configured to differentiate between single and multiple slashes. - type: boolean - pathWithEscapedSlashesAction: - description: |- - PathWithEscapedSlashesAction sets the value of the \`path_with_escaped_slashes_action\` option in the Envoy - listener's \`HttpConnectionManager\`. The default value of this option is empty, which is equivalent to - \`IMPLEMENTATION_SPECIFIC_DEFAULT\`. This parameter controls the action taken in response to request URL paths - with escaped slashes in the path. When using L7 intentions with path match rules, we recommend enabling this - setting to avoid match rule circumvention through non-normalized path values, unless legitimate service traffic - depends on allowing for escaped \`/\` or \`\\\` characters, or upstream services are configured to differentiate - between escaped and unescaped slashes. Refer to the Envoy documentation for more information on available - options. - type: string - type: object - type: object - sanitizeXForwardedClientCert: - type: boolean - type: object - peering: - description: Peering defines the peering configuration for the service - mesh. - properties: - peerThroughMeshGateways: - description: |- - PeerThroughMeshGateways determines whether peering traffic between - control planes should flow through mesh gateways. If enabled, - Consul servers will advertise mesh gateway addresses as their own. - Additionally, mesh gateways will configure themselves to expose - the local servers using a peering-specific SNI. - type: boolean - type: object - tls: - description: TLS defines the TLS configuration for the service mesh. - properties: - incoming: - description: |- - Incoming defines the TLS configuration for inbound mTLS connections targeting - the public listener on Connect and TerminatingGateway proxy kinds. - properties: - cipherSuites: - description: |- - CipherSuites sets the default list of TLS cipher suites to support when negotiating connections using TLS 1.2 or earlier. - If unspecified, Envoy will use a default server cipher list. The list of supported cipher suites can be seen in - https://github.com/hashicorp/consul/blob/v1.11.2/types/tls.go#L154-L169 and is dependent on underlying support in Envoy. - Future releases of Envoy may remove currently-supported but insecure cipher suites, - and future releases of Consul may add new supported cipher suites if any are added to Envoy. - items: - type: string - type: array - tlsMaxVersion: - description: |- - TLSMaxVersion sets the default maximum TLS version supported. Must be greater than or equal to `TLSMinVersion`. - One of `TLS_AUTO`, `TLSv1_0`, `TLSv1_1`, `TLSv1_2`, or `TLSv1_3`. - If unspecified, Envoy will default to TLS 1.3 as a max version for incoming connections. - type: string - tlsMinVersion: - description: |- - TLSMinVersion sets the default minimum TLS version supported. - One of `TLS_AUTO`, `TLSv1_0`, `TLSv1_1`, `TLSv1_2`, or `TLSv1_3`. - If unspecified, Envoy v1.22.0 and newer will default to TLS 1.2 as a min version, - while older releases of Envoy default to TLS 1.0. - type: string - type: object - outgoing: - description: |- - Outgoing defines the TLS configuration for outbound mTLS connections dialing upstreams - from Connect and IngressGateway proxy kinds. - properties: - cipherSuites: - description: |- - CipherSuites sets the default list of TLS cipher suites to support when negotiating connections using TLS 1.2 or earlier. - If unspecified, Envoy will use a default server cipher list. The list of supported cipher suites can be seen in - https://github.com/hashicorp/consul/blob/v1.11.2/types/tls.go#L154-L169 and is dependent on underlying support in Envoy. - Future releases of Envoy may remove currently-supported but insecure cipher suites, - and future releases of Consul may add new supported cipher suites if any are added to Envoy. - items: - type: string - type: array - tlsMaxVersion: - description: |- - TLSMaxVersion sets the default maximum TLS version supported. Must be greater than or equal to `TLSMinVersion`. - One of `TLS_AUTO`, `TLSv1_0`, `TLSv1_1`, `TLSv1_2`, or `TLSv1_3`. - If unspecified, Envoy will default to TLS 1.3 as a max version for incoming connections. - type: string - tlsMinVersion: - description: |- - TLSMinVersion sets the default minimum TLS version supported. - One of `TLS_AUTO`, `TLSv1_0`, `TLSv1_1`, `TLSv1_2`, or `TLSv1_3`. - If unspecified, Envoy v1.22.0 and newer will default to TLS 1.2 as a min version, - while older releases of Envoy default to TLS 1.0. - type: string - type: object - type: object - transparentProxy: - description: TransparentProxy controls the configuration specific - to proxies in "transparent" mode. Added in v1.10.0. - properties: - meshDestinationsOnly: - description: |- - MeshDestinationsOnly determines whether sidecar proxies operating in "transparent" mode can proxy traffic - to IP addresses not registered in Consul's catalog. If enabled, traffic will only be proxied to upstreams - with service registrations in the catalog. - type: boolean - type: object - validateClusters: - description: |- - ValidateClusters controls whether the clusters the route table refers to are validated. The default value is - false. When set to false and a route refers to a cluster that does not exist, the route table loads and routing - to a non-existent cluster results in a 404. When set to true and the route is set to a cluster that do not exist, - the route table will not load. For more information, refer to - [HTTP route configuration in the Envoy docs](https://www.envoyproxy.io/docs/envoy/latest/api-v3/config/route/v3/route.proto#envoy-v3-api-field-config-route-v3-routeconfiguration-validate-clusters) - for more details. - type: boolean - type: object - status: - properties: - conditions: - description: Conditions indicate the latest available observations - of a resource's current state. - items: - description: |- - Conditions define a readiness condition for a Consul resource. - See: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#typical-status-properties - properties: - lastTransitionTime: - description: LastTransitionTime is the last time the condition - transitioned from one status to another. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. - type: string - reason: - description: The reason for the condition's last transition. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition. - type: string - required: - - status - - type - type: object - type: array - lastSyncedTime: - description: LastSyncedTime is the last time the resource successfully - synced with Consul. - format: date-time - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} -{{- end }} diff --git a/charts/consul/templates/crd-meshservices.yaml b/charts/consul/templates/crd-meshservices.yaml deleted file mode 100644 index 1623749..0000000 --- a/charts/consul/templates/crd-meshservices.yaml +++ /dev/null @@ -1,61 +0,0 @@ -{{- if .Values.connectInject.enabled }} -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.14.0 - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: crd - name: meshservices.consul.hashicorp.com -spec: - group: consul.hashicorp.com - names: - kind: MeshService - listKind: MeshServiceList - plural: meshservices - singular: meshservice - scope: Namespaced - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: MeshService holds a reference to an externally managed Consul - Service Mesh service. - properties: - apiVersion: - description: |- - APIVersion defines the versioned schema of this representation of an object. - Servers should convert recognized schemas to the latest internal value, and - may reject unrecognized values. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - type: string - kind: - description: |- - Kind is a string value representing the REST resource this object represents. - Servers may infer this from the endpoint the client submits requests to. - Cannot be updated. - In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - type: string - metadata: - type: object - spec: - description: Spec defines the desired state of MeshService. - properties: - name: - description: Name holds the service name for a Consul service. - type: string - peer: - description: |- - Peer optionally specifies the name of the peer exporting the Consul service. - If not specified, the Consul service is assumed to be in the local datacenter. - type: string - type: object - type: object - served: true - storage: true -{{- end }} diff --git a/charts/consul/templates/crd-peeringacceptors.yaml b/charts/consul/templates/crd-peeringacceptors.yaml deleted file mode 100644 index 60b31d9..0000000 --- a/charts/consul/templates/crd-peeringacceptors.yaml +++ /dev/null @@ -1,152 +0,0 @@ -{{- if and .Values.connectInject.enabled .Values.global.peering.enabled }} -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.14.0 - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: crd - name: peeringacceptors.consul.hashicorp.com -spec: - group: consul.hashicorp.com - names: - kind: PeeringAcceptor - listKind: PeeringAcceptorList - plural: peeringacceptors - shortNames: - - peering-acceptor - singular: peeringacceptor - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: The sync status of the resource with Consul - jsonPath: .status.conditions[?(@.type=="Synced")].status - name: Synced - type: string - - description: The last successful synced time of the resource with Consul - jsonPath: .status.lastSyncedTime - name: Last Synced - type: date - - description: The age of the resource - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - description: PeeringAcceptor is the Schema for the peeringacceptors API. - properties: - apiVersion: - description: |- - APIVersion defines the versioned schema of this representation of an object. - Servers should convert recognized schemas to the latest internal value, and - may reject unrecognized values. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - type: string - kind: - description: |- - Kind is a string value representing the REST resource this object represents. - Servers may infer this from the endpoint the client submits requests to. - Cannot be updated. - In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - type: string - metadata: - type: object - spec: - description: PeeringAcceptorSpec defines the desired state of PeeringAcceptor. - properties: - peer: - description: Peer describes the information needed to create a peering. - properties: - secret: - description: Secret describes how to store the generated peering - token. - properties: - backend: - description: 'Backend is where the generated secret is stored. - Currently supports the value: "kubernetes".' - type: string - key: - description: Key is the key of the secret generated. - type: string - name: - description: Name is the name of the secret generated. - type: string - type: object - type: object - required: - - peer - type: object - status: - description: PeeringAcceptorStatus defines the observed state of PeeringAcceptor. - properties: - conditions: - description: Conditions indicate the latest available observations - of a resource's current state. - items: - description: |- - Conditions define a readiness condition for a Consul resource. - See: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#typical-status-properties - properties: - lastTransitionTime: - description: LastTransitionTime is the last time the condition - transitioned from one status to another. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. - type: string - reason: - description: The reason for the condition's last transition. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition. - type: string - required: - - status - - type - type: object - type: array - lastSyncedTime: - description: LastSyncedTime is the last time the resource successfully - synced with Consul. - format: date-time - type: string - latestPeeringVersion: - description: LatestPeeringVersion is the latest version of the resource - that was reconciled. - format: int64 - type: integer - secret: - description: SecretRef shows the status of the secret. - properties: - backend: - description: 'Backend is where the generated secret is stored. - Currently supports the value: "kubernetes".' - type: string - key: - description: Key is the key of the secret generated. - type: string - name: - description: Name is the name of the secret generated. - type: string - resourceVersion: - description: ResourceVersion is the resource version for the secret. - type: string - type: object - type: object - type: object - served: true - storage: true - subresources: - status: {} -{{- end }} diff --git a/charts/consul/templates/crd-peeringdialers.yaml b/charts/consul/templates/crd-peeringdialers.yaml deleted file mode 100644 index 562c760..0000000 --- a/charts/consul/templates/crd-peeringdialers.yaml +++ /dev/null @@ -1,152 +0,0 @@ -{{- if and .Values.connectInject.enabled .Values.global.peering.enabled }} -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.14.0 - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: crd - name: peeringdialers.consul.hashicorp.com -spec: - group: consul.hashicorp.com - names: - kind: PeeringDialer - listKind: PeeringDialerList - plural: peeringdialers - shortNames: - - peering-dialer - singular: peeringdialer - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: The sync status of the resource with Consul - jsonPath: .status.conditions[?(@.type=="Synced")].status - name: Synced - type: string - - description: The last successful synced time of the resource with Consul - jsonPath: .status.lastSyncedTime - name: Last Synced - type: date - - description: The age of the resource - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - description: PeeringDialer is the Schema for the peeringdialers API. - properties: - apiVersion: - description: |- - APIVersion defines the versioned schema of this representation of an object. - Servers should convert recognized schemas to the latest internal value, and - may reject unrecognized values. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - type: string - kind: - description: |- - Kind is a string value representing the REST resource this object represents. - Servers may infer this from the endpoint the client submits requests to. - Cannot be updated. - In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - type: string - metadata: - type: object - spec: - description: PeeringDialerSpec defines the desired state of PeeringDialer. - properties: - peer: - description: Peer describes the information needed to create a peering. - properties: - secret: - description: Secret describes how to store the generated peering - token. - properties: - backend: - description: 'Backend is where the generated secret is stored. - Currently supports the value: "kubernetes".' - type: string - key: - description: Key is the key of the secret generated. - type: string - name: - description: Name is the name of the secret generated. - type: string - type: object - type: object - required: - - peer - type: object - status: - description: PeeringDialerStatus defines the observed state of PeeringDialer. - properties: - conditions: - description: Conditions indicate the latest available observations - of a resource's current state. - items: - description: |- - Conditions define a readiness condition for a Consul resource. - See: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#typical-status-properties - properties: - lastTransitionTime: - description: LastTransitionTime is the last time the condition - transitioned from one status to another. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. - type: string - reason: - description: The reason for the condition's last transition. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition. - type: string - required: - - status - - type - type: object - type: array - lastSyncedTime: - description: LastSyncedTime is the last time the resource successfully - synced with Consul. - format: date-time - type: string - latestPeeringVersion: - description: LatestPeeringVersion is the latest version of the resource - that was reconciled. - format: int64 - type: integer - secret: - description: SecretRef shows the status of the secret. - properties: - backend: - description: 'Backend is where the generated secret is stored. - Currently supports the value: "kubernetes".' - type: string - key: - description: Key is the key of the secret generated. - type: string - name: - description: Name is the name of the secret generated. - type: string - resourceVersion: - description: ResourceVersion is the resource version for the secret. - type: string - type: object - type: object - type: object - served: true - storage: true - subresources: - status: {} -{{- end }} diff --git a/charts/consul/templates/crd-proxydefaults.yaml b/charts/consul/templates/crd-proxydefaults.yaml deleted file mode 100644 index a5fa817..0000000 --- a/charts/consul/templates/crd-proxydefaults.yaml +++ /dev/null @@ -1,278 +0,0 @@ -{{- if .Values.connectInject.enabled }} -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.14.0 - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: crd - name: proxydefaults.consul.hashicorp.com -spec: - group: consul.hashicorp.com - names: - kind: ProxyDefaults - listKind: ProxyDefaultsList - plural: proxydefaults - shortNames: - - proxy-defaults - singular: proxydefaults - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: The sync status of the resource with Consul - jsonPath: .status.conditions[?(@.type=="Synced")].status - name: Synced - type: string - - description: The last successful synced time of the resource with Consul - jsonPath: .status.lastSyncedTime - name: Last Synced - type: date - - description: The age of the resource - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - description: ProxyDefaults is the Schema for the proxydefaults API - properties: - apiVersion: - description: |- - APIVersion defines the versioned schema of this representation of an object. - Servers should convert recognized schemas to the latest internal value, and - may reject unrecognized values. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - type: string - kind: - description: |- - Kind is a string value representing the REST resource this object represents. - Servers may infer this from the endpoint the client submits requests to. - Cannot be updated. - In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - type: string - metadata: - type: object - spec: - description: ProxyDefaultsSpec defines the desired state of ProxyDefaults. - properties: - accessLogs: - description: AccessLogs controls all envoy instances' access logging - configuration. - properties: - disableListenerLogs: - description: |- - DisableListenerLogs turns off just listener logs for connections rejected by Envoy because they don't - have a matching listener filter. - type: boolean - enabled: - description: Enabled turns on all access logging - type: boolean - jsonFormat: - description: |- - JSONFormat is a JSON-formatted string of an Envoy access log format dictionary. - See for more info on formatting: https://www.envoyproxy.io/docs/envoy/latest/configuration/observability/access_log/usage#format-dictionaries - Defining JSONFormat and TextFormat is invalid. - type: string - path: - description: Path is the output file to write logs for file-type - logging - type: string - textFormat: - description: |- - TextFormat is a representation of Envoy access logs format. - See for more info on formatting: https://www.envoyproxy.io/docs/envoy/latest/configuration/observability/access_log/usage#format-strings - Defining JSONFormat and TextFormat is invalid. - type: string - type: - description: |- - Type selects the output for logs - one of "file", "stderr". "stdout" - type: string - type: object - config: - description: |- - Config is an arbitrary map of configuration values used by Connect proxies. - Any values that your proxy allows can be configured globally here. - Supports JSON config values. See https://www.consul.io/docs/connect/proxies/envoy#configuration-formatting - type: object - x-kubernetes-preserve-unknown-fields: true - envoyExtensions: - description: EnvoyExtensions are a list of extensions to modify Envoy - proxy configuration. - items: - description: EnvoyExtension has configuration for an extension that - patches Envoy resources. - properties: - arguments: - type: object - x-kubernetes-preserve-unknown-fields: true - name: - type: string - required: - type: boolean - type: object - type: array - expose: - description: Expose controls the default expose path configuration - for Envoy. - properties: - checks: - description: |- - Checks defines whether paths associated with Consul checks will be exposed. - This flag triggers exposing all HTTP and GRPC check paths registered for the service. - type: boolean - paths: - description: Paths is the list of paths exposed through the proxy. - items: - properties: - listenerPort: - description: ListenerPort defines the port of the proxy's - listener for exposed paths. - type: integer - localPathPort: - description: LocalPathPort is the port that the service - is listening on for the given path. - type: integer - path: - description: Path is the path to expose through the proxy, - ie. "/metrics". - type: string - protocol: - description: |- - Protocol describes the upstream's service protocol. - Valid values are "http" and "http2", defaults to "http". - type: string - type: object - type: array - type: object - failoverPolicy: - description: FailoverPolicy specifies the exact mechanism used for - failover. - properties: - mode: - description: |- - Mode specifies the type of failover that will be performed. Valid values are - "sequential", "" (equivalent to "sequential") and "order-by-locality". - type: string - regions: - description: |- - Regions is the ordered list of the regions of the failover targets. - Valid values can be "us-west-1", "us-west-2", and so on. - items: - type: string - type: array - type: object - meshGateway: - description: MeshGateway controls the default mesh gateway configuration - for this service. - properties: - mode: - description: |- - Mode is the mode that should be used for the upstream connection. - One of none, local, or remote. - type: string - type: object - mode: - description: |- - Mode can be one of "direct" or "transparent". "transparent" represents that inbound and outbound - application traffic is being captured and redirected through the proxy. This mode does not - enable the traffic redirection itself. Instead it signals Consul to configure Envoy as if - traffic is already being redirected. "direct" represents that the proxy's listeners must be - dialed directly by the local application and other proxies. - Note: This cannot be set using the CRD and should be set using annotations on the - services that are part of the mesh. - type: string - mutualTLSMode: - description: |- - MutualTLSMode controls whether mutual TLS is required for all incoming - connections when transparent proxy is enabled. This can be set to - "permissive" or "strict". "strict" is the default which requires mutual - TLS for incoming connections. In the insecure "permissive" mode, - connections to the sidecar proxy public listener port require mutual - TLS, but connections to the service port do not require mutual TLS and - are proxied to the application unmodified. Note: Intentions are not - enforced for non-mTLS connections. To keep your services secure, we - recommend using "strict" mode whenever possible and enabling - "permissive" mode only when necessary. - type: string - prioritizeByLocality: - description: |- - PrioritizeByLocality controls whether the locality of services within the - local partition will be used to prioritize connectivity. - properties: - mode: - description: |- - Mode specifies the type of prioritization that will be performed - when selecting nodes in the local partition. - Valid values are: "" (default "none"), "none", and "failover". - type: string - type: object - transparentProxy: - description: |- - TransparentProxy controls configuration specific to proxies in transparent mode. - Note: This cannot be set using the CRD and should be set using annotations on the - services that are part of the mesh. - properties: - dialedDirectly: - description: |- - DialedDirectly indicates whether transparent proxies can dial this proxy instance directly. - The discovery chain is not considered when dialing a service instance directly. - This setting is useful when addressing stateful services, such as a database cluster with a leader node. - type: boolean - outboundListenerPort: - description: |- - OutboundListenerPort is the port of the listener where outbound application - traffic is being redirected to. - type: integer - type: object - type: object - status: - properties: - conditions: - description: Conditions indicate the latest available observations - of a resource's current state. - items: - description: |- - Conditions define a readiness condition for a Consul resource. - See: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#typical-status-properties - properties: - lastTransitionTime: - description: LastTransitionTime is the last time the condition - transitioned from one status to another. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. - type: string - reason: - description: The reason for the condition's last transition. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition. - type: string - required: - - status - - type - type: object - type: array - lastSyncedTime: - description: LastSyncedTime is the last time the resource successfully - synced with Consul. - format: date-time - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} -{{- end }} diff --git a/charts/consul/templates/crd-referencegrants-external.yaml b/charts/consul/templates/crd-referencegrants-external.yaml deleted file mode 100644 index db9cf12..0000000 --- a/charts/consul/templates/crd-referencegrants-external.yaml +++ /dev/null @@ -1,208 +0,0 @@ -{{- if and .Values.connectInject.enabled .Values.connectInject.apiGateway.manageExternalCRDs }} -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/1538 - gateway.networking.k8s.io/bundle-version: v0.6.2 - gateway.networking.k8s.io/channel: experimental - creationTimestamp: null - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: crd - name: referencegrants.gateway.networking.k8s.io -spec: - group: gateway.networking.k8s.io - names: - categories: - - gateway-api - kind: ReferenceGrant - listKind: ReferenceGrantList - plural: referencegrants - shortNames: - - refgrant - singular: referencegrant - scope: Namespaced - versions: - - additionalPrinterColumns: - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha2 - schema: - openAPIV3Schema: - description: "ReferenceGrant identifies kinds of resources in other namespaces that are trusted to reference the specified kinds of resources in the same namespace as the policy. \n Each ReferenceGrant can be used to represent a unique trust relationship. Additional Reference Grants can be used to add to the set of trusted sources of inbound references for the namespace they are defined within. \n All cross-namespace references in Gateway API (with the exception of cross-namespace Gateway-route attachment) require a ReferenceGrant. \n ReferenceGrant is a form of runtime verification allowing users to assert which cross-namespace object references are permitted. Implementations that support ReferenceGrant MUST NOT permit cross-namespace references which have no grant, and MUST respond to the removal of a grant by revoking the access that the grant allowed. \n Support: Core" - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Spec defines the desired state of ReferenceGrant. - properties: - from: - description: "From describes the trusted namespaces and kinds that can reference the resources described in \"To\". Each entry in this list MUST be considered to be an additional place that references can be valid from, or to put this another way, entries MUST be combined using OR. \n Support: Core" - items: - description: ReferenceGrantFrom describes trusted namespaces and kinds. - properties: - group: - description: "Group is the group of the referent. When empty, the Kubernetes core API group is inferred. \n Support: Core" - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - description: "Kind is the kind of the referent. Although implementations may support additional resources, the following types are part of the \"Core\" support level for this field. \n When used to permit a SecretObjectReference: \n * Gateway \n When used to permit a BackendObjectReference: \n * GRPCRoute * HTTPRoute * TCPRoute * TLSRoute * UDPRoute" - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - namespace: - description: "Namespace is the namespace of the referent. \n Support: Core" - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - type: string - required: - - group - - kind - - namespace - type: object - maxItems: 16 - minItems: 1 - type: array - to: - description: "To describes the resources that may be referenced by the resources described in \"From\". Each entry in this list MUST be considered to be an additional place that references can be valid to, or to put this another way, entries MUST be combined using OR. \n Support: Core" - items: - description: ReferenceGrantTo describes what Kinds are allowed as targets of the references. - properties: - group: - description: "Group is the group of the referent. When empty, the Kubernetes core API group is inferred. \n Support: Core" - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - description: "Kind is the kind of the referent. Although implementations may support additional resources, the following types are part of the \"Core\" support level for this field: \n * Secret when used to permit a SecretObjectReference * Service when used to permit a BackendObjectReference" - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - name: - description: Name is the name of the referent. When unspecified, this policy refers to all resources of the specified Group and Kind in the local namespace. - maxLength: 253 - minLength: 1 - type: string - required: - - group - - kind - type: object - maxItems: 16 - minItems: 1 - type: array - required: - - from - - to - type: object - type: object - served: true - storage: true - subresources: {} - - additionalPrinterColumns: - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: "ReferenceGrant identifies kinds of resources in other namespaces that are trusted to reference the specified kinds of resources in the same namespace as the policy. \n Each ReferenceGrant can be used to represent a unique trust relationship. Additional Reference Grants can be used to add to the set of trusted sources of inbound references for the namespace they are defined within. \n All cross-namespace references in Gateway API (with the exception of cross-namespace Gateway-route attachment) require a ReferenceGrant. \n ReferenceGrant is a form of runtime verification allowing users to assert which cross-namespace object references are permitted. Implementations that support ReferenceGrant MUST NOT permit cross-namespace references which have no grant, and MUST respond to the removal of a grant by revoking the access that the grant allowed. \n Support: Core" - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Spec defines the desired state of ReferenceGrant. - properties: - from: - description: "From describes the trusted namespaces and kinds that can reference the resources described in \"To\". Each entry in this list MUST be considered to be an additional place that references can be valid from, or to put this another way, entries MUST be combined using OR. \n Support: Core" - items: - description: ReferenceGrantFrom describes trusted namespaces and kinds. - properties: - group: - description: "Group is the group of the referent. When empty, the Kubernetes core API group is inferred. \n Support: Core" - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - description: "Kind is the kind of the referent. Although implementations may support additional resources, the following types are part of the \"Core\" support level for this field. \n When used to permit a SecretObjectReference: \n * Gateway \n When used to permit a BackendObjectReference: \n * GRPCRoute * HTTPRoute * TCPRoute * TLSRoute * UDPRoute" - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - namespace: - description: "Namespace is the namespace of the referent. \n Support: Core" - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - type: string - required: - - group - - kind - - namespace - type: object - maxItems: 16 - minItems: 1 - type: array - to: - description: "To describes the resources that may be referenced by the resources described in \"From\". Each entry in this list MUST be considered to be an additional place that references can be valid to, or to put this another way, entries MUST be combined using OR. \n Support: Core" - items: - description: ReferenceGrantTo describes what Kinds are allowed as targets of the references. - properties: - group: - description: "Group is the group of the referent. When empty, the Kubernetes core API group is inferred. \n Support: Core" - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - description: "Kind is the kind of the referent. Although implementations may support additional resources, the following types are part of the \"Core\" support level for this field: \n * Secret when used to permit a SecretObjectReference * Service when used to permit a BackendObjectReference" - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - name: - description: Name is the name of the referent. When unspecified, this policy refers to all resources of the specified Group and Kind in the local namespace. - maxLength: 253 - minLength: 1 - type: string - required: - - group - - kind - type: object - maxItems: 16 - minItems: 1 - type: array - required: - - from - - to - type: object - type: object - served: true - storage: false - subresources: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] -{{- end }} diff --git a/charts/consul/templates/crd-registrations.yaml b/charts/consul/templates/crd-registrations.yaml deleted file mode 100644 index f126978..0000000 --- a/charts/consul/templates/crd-registrations.yaml +++ /dev/null @@ -1,257 +0,0 @@ -{{- if .Values.connectInject.enabled }} -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.14.0 - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: crd - name: registrations.consul.hashicorp.com -spec: - group: consul.hashicorp.com - names: - kind: Registration - listKind: RegistrationList - plural: registrations - singular: registration - scope: Cluster - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: Registration defines the resource for working with service registrations. - properties: - apiVersion: - description: |- - APIVersion defines the versioned schema of this representation of an object. - Servers should convert recognized schemas to the latest internal value, and - may reject unrecognized values. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - type: string - kind: - description: |- - Kind is a string value representing the REST resource this object represents. - Servers may infer this from the endpoint the client submits requests to. - Cannot be updated. - In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - type: string - metadata: - type: object - spec: - description: Spec defines the desired state of Registration. - properties: - address: - type: string - check: - description: HealthCheck is used to represent a single check. - properties: - checkId: - type: string - definition: - description: |- - HealthCheckDefinition is used to store the details about - a health check's execution. - properties: - body: - type: string - deregisterCriticalServiceAfterDuration: - type: string - grpc: - type: string - grpcUseTLS: - type: boolean - header: - additionalProperties: - items: - type: string - type: array - type: object - http: - type: string - intervalDuration: - type: string - method: - type: string - osService: - type: string - tcp: - type: string - tcpUseTLS: - type: boolean - timeoutDuration: - type: string - tlsServerName: - type: string - tlsSkipVerify: - type: boolean - udp: - type: string - required: - - intervalDuration - type: object - exposedPort: - type: integer - name: - type: string - namespace: - type: string - node: - type: string - notes: - type: string - output: - type: string - partition: - type: string - serviceId: - type: string - serviceName: - type: string - status: - type: string - type: - type: string - required: - - checkId - - definition - - name - - serviceId - - serviceName - - status - type: object - datacenter: - type: string - id: - type: string - locality: - properties: - region: - type: string - zone: - type: string - type: object - node: - type: string - nodeMeta: - additionalProperties: - type: string - type: object - partition: - type: string - service: - properties: - address: - type: string - enableTagOverride: - type: boolean - id: - type: string - locality: - properties: - region: - type: string - zone: - type: string - type: object - meta: - additionalProperties: - type: string - type: object - name: - type: string - namespace: - type: string - partition: - type: string - port: - type: integer - socketPath: - type: string - taggedAddresses: - additionalProperties: - properties: - address: - type: string - port: - type: integer - required: - - address - - port - type: object - type: object - tags: - items: - type: string - type: array - weights: - properties: - passing: - type: integer - warning: - type: integer - required: - - passing - - warning - type: object - required: - - name - - port - type: object - skipNodeUpdate: - type: boolean - taggedAddresses: - additionalProperties: - type: string - type: object - type: object - status: - description: RegistrationStatus defines the observed state of Registration. - properties: - conditions: - description: Conditions indicate the latest available observations - of a resource's current state. - items: - description: |- - Conditions define a readiness condition for a Consul resource. - See: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#typical-status-properties - properties: - lastTransitionTime: - description: LastTransitionTime is the last time the condition - transitioned from one status to another. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. - type: string - reason: - description: The reason for the condition's last transition. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition. - type: string - required: - - status - - type - type: object - type: array - lastSyncedTime: - description: LastSyncedTime is the last time the resource successfully - synced with Consul. - format: date-time - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} -{{- end }} diff --git a/charts/consul/templates/crd-routeauthfilters.yaml b/charts/consul/templates/crd-routeauthfilters.yaml deleted file mode 100644 index 65403e6..0000000 --- a/charts/consul/templates/crd-routeauthfilters.yaml +++ /dev/null @@ -1,215 +0,0 @@ -{{- if .Values.connectInject.enabled }} -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.14.0 - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: crd - name: routeauthfilters.consul.hashicorp.com -spec: - group: consul.hashicorp.com - names: - kind: RouteAuthFilter - listKind: RouteAuthFilterList - plural: routeauthfilters - singular: routeauthfilter - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: The sync status of the resource with Consul - jsonPath: .status.conditions[?(@.type=="Synced")].status - name: Synced - type: string - - description: The last successful synced time of the resource with Consul - jsonPath: .status.lastSyncedTime - name: Last Synced - type: date - - description: The age of the resource - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - description: RouteAuthFilter is the Schema for the routeauthfilters API. - properties: - apiVersion: - description: |- - APIVersion defines the versioned schema of this representation of an object. - Servers should convert recognized schemas to the latest internal value, and - may reject unrecognized values. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - type: string - kind: - description: |- - Kind is a string value representing the REST resource this object represents. - Servers may infer this from the endpoint the client submits requests to. - Cannot be updated. - In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - type: string - metadata: - type: object - spec: - description: RouteAuthFilterSpec defines the desired state of RouteAuthFilter. - properties: - jwt: - description: This re-uses the JWT requirement type from Gateway Policy - Types. - properties: - providers: - description: Providers is a list of providers to consider when - verifying a JWT. - items: - description: GatewayJWTProvider holds the provider and claim - verification information. - properties: - name: - description: |- - Name is the name of the JWT provider. There MUST be a corresponding - "jwt-provider" config entry with this name. - type: string - verifyClaims: - description: VerifyClaims is a list of additional claims - to verify in a JWT's payload. - items: - description: GatewayJWTClaimVerification holds the actual - claim information to be verified. - properties: - path: - description: Path is the path to the claim in the - token JSON. - items: - type: string - type: array - value: - description: |- - Value is the expected value at the given path: - - If the type at the path is a list then we verify - that this value is contained in the list. - - - - If the type at the path is a string then we verify - that this value matches. - type: string - required: - - path - - value - type: object - type: array - required: - - name - type: object - type: array - required: - - providers - type: object - type: object - status: - description: RouteAuthFilterStatus defines the observed state of the gateway. - properties: - conditions: - default: - - lastTransitionTime: "1970-01-01T00:00:00Z" - message: Waiting for controller - reason: Pending - status: Unknown - type: Accepted - - lastTransitionTime: "1970-01-01T00:00:00Z" - message: Waiting for controller - reason: Pending - status: Unknown - type: ResolvedRefs - description: |- - Conditions describe the current conditions of the Filter. - - - Known condition types are: - - - * "Accepted" - * "ResolvedRefs" - items: - description: "Condition contains details for one aspect of the current - state of this API Resource.\n---\nThis struct is intended for - direct use as an array at the field path .status.conditions. For - example,\n\n\n\ttype FooStatus struct{\n\t // Represents the - observations of a foo's current state.\n\t // Known .status.conditions.type - are: \"Available\", \"Progressing\", and \"Degraded\"\n\t // - +patchMergeKey=type\n\t // +patchStrategy=merge\n\t // +listType=map\n\t - \ // +listMapKey=type\n\t Conditions []metav1.Condition `json:\"conditions,omitempty\" - patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"`\n\n\n\t - \ // other fields\n\t}" - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: |- - type of condition in CamelCase or in foo.example.com/CamelCase. - --- - Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be - useful (see .node.status.conditions), the ability to deconflict is important. - The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 8 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - type: object - type: object - served: true - storage: true - subresources: - status: {} -{{- end }} diff --git a/charts/consul/templates/crd-routeretryfilters.yaml b/charts/consul/templates/crd-routeretryfilters.yaml deleted file mode 100644 index d26dff9..0000000 --- a/charts/consul/templates/crd-routeretryfilters.yaml +++ /dev/null @@ -1,121 +0,0 @@ -{{- if .Values.connectInject.enabled }} -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.14.0 - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: crd - name: routeretryfilters.consul.hashicorp.com -spec: - group: consul.hashicorp.com - names: - kind: RouteRetryFilter - listKind: RouteRetryFilterList - plural: routeretryfilters - singular: routeretryfilter - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: The sync status of the resource with Consul - jsonPath: .status.conditions[?(@.type=="Synced")].status - name: Synced - type: string - - description: The last successful synced time of the resource with Consul - jsonPath: .status.lastSyncedTime - name: Last Synced - type: date - - description: The age of the resource - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - description: RouteRetryFilter is the Schema for the routeretryfilters API - properties: - apiVersion: - description: |- - APIVersion defines the versioned schema of this representation of an object. - Servers should convert recognized schemas to the latest internal value, and - may reject unrecognized values. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - type: string - kind: - description: |- - Kind is a string value representing the REST resource this object represents. - Servers may infer this from the endpoint the client submits requests to. - Cannot be updated. - In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - type: string - metadata: - type: object - spec: - description: RouteRetryFilterSpec defines the desired state of RouteRetryFilter. - properties: - numRetries: - format: int32 - minimum: 0 - type: integer - retryOn: - items: - type: string - type: array - retryOnConnectFailure: - type: boolean - retryOnStatusCodes: - items: - format: int32 - type: integer - type: array - type: object - status: - properties: - conditions: - description: Conditions indicate the latest available observations - of a resource's current state. - items: - description: |- - Conditions define a readiness condition for a Consul resource. - See: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#typical-status-properties - properties: - lastTransitionTime: - description: LastTransitionTime is the last time the condition - transitioned from one status to another. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. - type: string - reason: - description: The reason for the condition's last transition. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition. - type: string - required: - - status - - type - type: object - type: array - lastSyncedTime: - description: LastSyncedTime is the last time the resource successfully - synced with Consul. - format: date-time - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} -{{- end }} diff --git a/charts/consul/templates/crd-routetimeoutfilters.yaml b/charts/consul/templates/crd-routetimeoutfilters.yaml deleted file mode 100644 index 568b025..0000000 --- a/charts/consul/templates/crd-routetimeoutfilters.yaml +++ /dev/null @@ -1,113 +0,0 @@ -{{- if .Values.connectInject.enabled }} -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.14.0 - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: crd - name: routetimeoutfilters.consul.hashicorp.com -spec: - group: consul.hashicorp.com - names: - kind: RouteTimeoutFilter - listKind: RouteTimeoutFilterList - plural: routetimeoutfilters - singular: routetimeoutfilter - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: The sync status of the resource with Consul - jsonPath: .status.conditions[?(@.type=="Synced")].status - name: Synced - type: string - - description: The last successful synced time of the resource with Consul - jsonPath: .status.lastSyncedTime - name: Last Synced - type: date - - description: The age of the resource - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - description: RouteTimeoutFilter is the Schema for the httproutetimeoutfilters - API - properties: - apiVersion: - description: |- - APIVersion defines the versioned schema of this representation of an object. - Servers should convert recognized schemas to the latest internal value, and - may reject unrecognized values. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - type: string - kind: - description: |- - Kind is a string value representing the REST resource this object represents. - Servers may infer this from the endpoint the client submits requests to. - Cannot be updated. - In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - type: string - metadata: - type: object - spec: - description: RouteTimeoutFilterSpec defines the desired state of RouteTimeoutFilter. - properties: - idleTimeout: - format: duration - type: string - requestTimeout: - format: duration - type: string - type: object - status: - properties: - conditions: - description: Conditions indicate the latest available observations - of a resource's current state. - items: - description: |- - Conditions define a readiness condition for a Consul resource. - See: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#typical-status-properties - properties: - lastTransitionTime: - description: LastTransitionTime is the last time the condition - transitioned from one status to another. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. - type: string - reason: - description: The reason for the condition's last transition. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition. - type: string - required: - - status - - type - type: object - type: array - lastSyncedTime: - description: LastSyncedTime is the last time the resource successfully - synced with Consul. - format: date-time - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} -{{- end }} diff --git a/charts/consul/templates/crd-samenessgroups.yaml b/charts/consul/templates/crd-samenessgroups.yaml deleted file mode 100644 index 29cd24f..0000000 --- a/charts/consul/templates/crd-samenessgroups.yaml +++ /dev/null @@ -1,133 +0,0 @@ -{{- if .Values.connectInject.enabled }} -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.14.0 - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: crd - name: samenessgroups.consul.hashicorp.com -spec: - group: consul.hashicorp.com - names: - kind: SamenessGroup - listKind: SamenessGroupList - plural: samenessgroups - shortNames: - - sameness-group - singular: samenessgroup - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: The sync status of the resource with Consul - jsonPath: .status.conditions[?(@.type=="Synced")].status - name: Synced - type: string - - description: The last successful synced time of the resource with Consul - jsonPath: .status.lastSyncedTime - name: Last Synced - type: date - - description: The age of the resource - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - description: SamenessGroup is the Schema for the samenessgroups API - properties: - apiVersion: - description: |- - APIVersion defines the versioned schema of this representation of an object. - Servers should convert recognized schemas to the latest internal value, and - may reject unrecognized values. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - type: string - kind: - description: |- - Kind is a string value representing the REST resource this object represents. - Servers may infer this from the endpoint the client submits requests to. - Cannot be updated. - In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - type: string - metadata: - type: object - spec: - description: SamenessGroupSpec defines the desired state of SamenessGroup. - properties: - defaultForFailover: - description: |- - DefaultForFailover indicates that upstream requests to members of the given sameness group will implicitly failover between members of this sameness group. - When DefaultForFailover is true, the local partition must be a member of the sameness group or IncludeLocal must be set to true. - type: boolean - includeLocal: - description: |- - IncludeLocal is used to include the local partition as the first member of the sameness group. - The local partition can only be a member of a single sameness group. - type: boolean - members: - description: |- - Members are the partitions and peers that are part of the sameness group. - If a member of a sameness group does not exist, it will be ignored. - items: - properties: - partition: - description: |- - The partitions and peers that are part of the sameness group. - A sameness group member cannot define both peer and partition at the same time. - type: string - peer: - type: string - type: object - type: array - type: object - status: - properties: - conditions: - description: Conditions indicate the latest available observations - of a resource's current state. - items: - description: |- - Conditions define a readiness condition for a Consul resource. - See: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#typical-status-properties - properties: - lastTransitionTime: - description: LastTransitionTime is the last time the condition - transitioned from one status to another. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. - type: string - reason: - description: The reason for the condition's last transition. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition. - type: string - required: - - status - - type - type: object - type: array - lastSyncedTime: - description: LastSyncedTime is the last time the resource successfully - synced with Consul. - format: date-time - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} -{{- end }} diff --git a/charts/consul/templates/crd-servicedefaults.yaml b/charts/consul/templates/crd-servicedefaults.yaml deleted file mode 100644 index a976d09..0000000 --- a/charts/consul/templates/crd-servicedefaults.yaml +++ /dev/null @@ -1,580 +0,0 @@ -{{- if .Values.connectInject.enabled }} -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.14.0 - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: crd - name: servicedefaults.consul.hashicorp.com -spec: - group: consul.hashicorp.com - names: - kind: ServiceDefaults - listKind: ServiceDefaultsList - plural: servicedefaults - shortNames: - - service-defaults - singular: servicedefaults - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: The sync status of the resource with Consul - jsonPath: .status.conditions[?(@.type=="Synced")].status - name: Synced - type: string - - description: The last successful synced time of the resource with Consul - jsonPath: .status.lastSyncedTime - name: Last Synced - type: date - - description: The age of the resource - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - description: ServiceDefaults is the Schema for the servicedefaults API - properties: - apiVersion: - description: |- - APIVersion defines the versioned schema of this representation of an object. - Servers should convert recognized schemas to the latest internal value, and - may reject unrecognized values. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - type: string - kind: - description: |- - Kind is a string value representing the REST resource this object represents. - Servers may infer this from the endpoint the client submits requests to. - Cannot be updated. - In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - type: string - metadata: - type: object - spec: - description: ServiceDefaultsSpec defines the desired state of ServiceDefaults. - properties: - balanceInboundConnections: - description: |- - BalanceInboundConnections sets the strategy for allocating inbound connections to the service across - proxy threads. The only supported value is exact_balance. By default, no connection balancing is used. - Refer to the Envoy Connection Balance config for details. - type: string - destination: - description: |- - Destination is an address(es)/port combination that represents an endpoint - outside the mesh. This is only valid when the mesh is configured in "transparent" - mode. Destinations live outside of Consul's catalog, and because of this, they - do not require an artificial node to be created. - properties: - addresses: - description: |- - Addresses is a list of IPs and/or hostnames that can be dialed - and routed through a terminating gateway. - items: - type: string - type: array - port: - description: |- - Port is the port that can be dialed on any of the addresses in this - Destination. - format: int32 - type: integer - type: object - envoyExtensions: - description: EnvoyExtensions are a list of extensions to modify Envoy - proxy configuration. - items: - description: EnvoyExtension has configuration for an extension that - patches Envoy resources. - properties: - arguments: - type: object - x-kubernetes-preserve-unknown-fields: true - name: - type: string - required: - type: boolean - type: object - type: array - expose: - description: Expose controls the default expose path configuration - for Envoy. - properties: - checks: - description: |- - Checks defines whether paths associated with Consul checks will be exposed. - This flag triggers exposing all HTTP and GRPC check paths registered for the service. - type: boolean - paths: - description: Paths is the list of paths exposed through the proxy. - items: - properties: - listenerPort: - description: ListenerPort defines the port of the proxy's - listener for exposed paths. - type: integer - localPathPort: - description: LocalPathPort is the port that the service - is listening on for the given path. - type: integer - path: - description: Path is the path to expose through the proxy, - ie. "/metrics". - type: string - protocol: - description: |- - Protocol describes the upstream's service protocol. - Valid values are "http" and "http2", defaults to "http". - type: string - type: object - type: array - type: object - externalSNI: - description: |- - ExternalSNI is an optional setting that allows for the TLS SNI value - to be changed to a non-connect value when federating with an external system. - type: string - localConnectTimeoutMs: - description: |- - LocalConnectTimeoutMs is the number of milliseconds allowed to make connections to the local application - instance before timing out. Defaults to 5000. - type: integer - localRequestTimeoutMs: - description: |- - LocalRequestTimeoutMs is the timeout for HTTP requests to the local application instance in milliseconds. - Applies to HTTP-based protocols only. If not specified, inherits the Envoy default for - route timeouts (15s). - type: integer - maxInboundConnections: - description: |- - MaxInboundConnections is the maximum number of concurrent inbound connections to - each service instance. Defaults to 0 (using consul's default) if not set. - type: integer - meshGateway: - description: MeshGateway controls the default mesh gateway configuration - for this service. - properties: - mode: - description: |- - Mode is the mode that should be used for the upstream connection. - One of none, local, or remote. - type: string - type: object - mode: - description: |- - Mode can be one of "direct" or "transparent". "transparent" represents that inbound and outbound - application traffic is being captured and redirected through the proxy. This mode does not - enable the traffic redirection itself. Instead it signals Consul to configure Envoy as if - traffic is already being redirected. "direct" represents that the proxy's listeners must be - dialed directly by the local application and other proxies. - Note: This cannot be set using the CRD and should be set using annotations on the - services that are part of the mesh. - type: string - mutualTLSMode: - description: |- - MutualTLSMode controls whether mutual TLS is required for all incoming - connections when transparent proxy is enabled. This can be set to - "permissive" or "strict". "strict" is the default which requires mutual - TLS for incoming connections. In the insecure "permissive" mode, - connections to the sidecar proxy public listener port require mutual - TLS, but connections to the service port do not require mutual TLS and - are proxied to the application unmodified. Note: Intentions are not - enforced for non-mTLS connections. To keep your services secure, we - recommend using "strict" mode whenever possible and enabling - "permissive" mode only when necessary. - type: string - protocol: - description: |- - Protocol sets the protocol of the service. This is used by Connect proxies for - things like observability features and to unlock usage of the - service-splitter and service-router config entries for a service. - type: string - rateLimits: - description: |- - RateLimits is rate limiting configuration that is applied to - inbound traffic for a service. Rate limiting is a Consul enterprise feature. - properties: - instanceLevel: - description: |- - InstanceLevel represents rate limit configuration - that is applied per service instance. - properties: - requestsMaxBurst: - description: |- - RequestsMaxBurst is the maximum number of requests that can be sent - in a burst. Should be equal to or greater than RequestsPerSecond. - If unset, defaults to RequestsPerSecond. - - - Internally, this is the maximum size of the token bucket used for rate limiting. - type: integer - requestsPerSecond: - description: |- - RequestsPerSecond is the average number of requests per second that can be - made without being throttled. This field is required if RequestsMaxBurst - is set. The allowed number of requests may exceed RequestsPerSecond up to - the value specified in RequestsMaxBurst. - - - Internally, this is the refill rate of the token bucket used for rate limiting. - type: integer - routes: - description: |- - Routes is a list of rate limits applied to specific routes. - For a given request, the first matching route will be applied, if any. - Overrides any top-level configuration. - items: - properties: - pathExact: - description: Exact path to match. Exactly one of PathExact, - PathPrefix, or PathRegex must be specified. - type: string - pathPrefix: - description: Prefix to match. Exactly one of PathExact, - PathPrefix, or PathRegex must be specified. - type: string - pathRegex: - description: Regex to match. Exactly one of PathExact, - PathPrefix, or PathRegex must be specified. - type: string - requestsMaxBurst: - description: |- - RequestsMaxBurst is the maximum number of requests that can be sent - in a burst. Should be equal to or greater than RequestsPerSecond. If unset, - defaults to RequestsPerSecond. Internally, this is the maximum size of the token - bucket used for rate limiting. - type: integer - requestsPerSecond: - description: |- - RequestsPerSecond is the average number of requests per - second that can be made without being throttled. This field is required - if RequestsMaxBurst is set. The allowed number of requests may exceed - RequestsPerSecond up to the value specified in RequestsMaxBurst. - Internally, this is the refill rate of the token bucket used for rate limiting. - type: integer - type: object - type: array - type: object - type: object - transparentProxy: - description: |- - TransparentProxy controls configuration specific to proxies in transparent mode. - Note: This cannot be set using the CRD and should be set using annotations on the - services that are part of the mesh. - properties: - dialedDirectly: - description: |- - DialedDirectly indicates whether transparent proxies can dial this proxy instance directly. - The discovery chain is not considered when dialing a service instance directly. - This setting is useful when addressing stateful services, such as a database cluster with a leader node. - type: boolean - outboundListenerPort: - description: |- - OutboundListenerPort is the port of the listener where outbound application - traffic is being redirected to. - type: integer - type: object - upstreamConfig: - description: |- - UpstreamConfig controls default configuration settings that apply across all upstreams, - and per-upstream configuration overrides. Note that per-upstream configuration applies - across all federated datacenters to the pairing of source and upstream destination services. - properties: - defaults: - description: |- - Defaults contains default configuration for all upstreams of a given - service. The name field must be empty. - properties: - connectTimeoutMs: - description: |- - ConnectTimeoutMs is the number of milliseconds to timeout making a new - connection to this upstream. Defaults to 5000 (5 seconds) if not set. - type: integer - envoyClusterJSON: - description: |- - EnvoyClusterJSON is a complete override ("escape hatch") for the upstream's - cluster. The Connect client TLS certificate and context will be injected - overriding any TLS settings present. - Note: This escape hatch is NOT compatible with the discovery chain and - will be ignored if a discovery chain is active. - type: string - envoyListenerJSON: - description: |- - EnvoyListenerJSON is a complete override ("escape hatch") for the upstream's - listener. - Note: This escape hatch is NOT compatible with the discovery chain and - will be ignored if a discovery chain is active. - type: string - limits: - description: |- - Limits are the set of limits that are applied to the proxy for a specific upstream of a - service instance. - properties: - maxConcurrentRequests: - description: |- - MaxConcurrentRequests is the maximum number of in-flight requests that will be allowed - to the upstream cluster at a point in time. This is mostly applicable to HTTP/2 - clusters since all HTTP/1.1 requests are limited by MaxConnections. - type: integer - maxConnections: - description: |- - MaxConnections is the maximum number of connections the local proxy can - make to the upstream service. - type: integer - maxPendingRequests: - description: |- - MaxPendingRequests is the maximum number of requests that will be queued - waiting for an available connection. This is mostly applicable to HTTP/1.1 - clusters since all HTTP/2 requests are streamed over a single - connection. - type: integer - type: object - meshGateway: - description: MeshGatewayConfig controls how Mesh Gateways - are configured and used. - properties: - mode: - description: |- - Mode is the mode that should be used for the upstream connection. - One of none, local, or remote. - type: string - type: object - name: - description: Name is only accepted within service ServiceDefaultsSpec.UpstreamConfig.Overrides - config entry. - type: string - namespace: - description: Namespace is only accepted within service ServiceDefaultsSpec.UpstreamConfig.Overrides - config entry. - type: string - partition: - description: Partition is only accepted within service ServiceDefaultsSpec.UpstreamConfig.Overrides - config entry. - type: string - passiveHealthCheck: - description: |- - PassiveHealthCheck configuration determines how upstream proxy instances will - be monitored for removal from the load balancing pool. - properties: - baseEjectionTime: - description: |- - The base time that a host is ejected for. The real time is equal to the base time - multiplied by the number of times the host has been ejected and is capped by - max_ejection_time (Default 300s). Defaults to 30s. - type: string - enforcingConsecutive5xx: - description: |- - EnforcingConsecutive5xx is the % chance that a host will be actually ejected - when an outlier status is detected through consecutive 5xx. - This setting can be used to disable ejection or to ramp it up slowly. - Ex. Setting this to 10 will make it a 10% chance that the host will be ejected. - format: int32 - type: integer - interval: - description: |- - Interval between health check analysis sweeps. Each sweep may remove - hosts or return hosts to the pool. Ex. setting this to "10s" will set - the interval to 10 seconds. - type: string - maxEjectionPercent: - description: |- - The maximum % of an upstream cluster that can be ejected due to outlier detection. - Defaults to 10% but will eject at least one host regardless of the value. - format: int32 - type: integer - maxFailures: - description: |- - MaxFailures is the count of consecutive failures that results in a host - being removed from the pool. - format: int32 - type: integer - type: object - peer: - description: Peer is only accepted within service ServiceDefaultsSpec.UpstreamConfig.Overrides - config entry. - type: string - protocol: - description: |- - Protocol describes the upstream's service protocol. Valid values are "tcp", - "http" and "grpc". Anything else is treated as tcp. This enables protocol - aware features like per-request metrics and connection pooling, tracing, - routing etc. - type: string - type: object - overrides: - description: |- - Overrides is a slice of per-service configuration. The name field is - required. - items: - properties: - connectTimeoutMs: - description: |- - ConnectTimeoutMs is the number of milliseconds to timeout making a new - connection to this upstream. Defaults to 5000 (5 seconds) if not set. - type: integer - envoyClusterJSON: - description: |- - EnvoyClusterJSON is a complete override ("escape hatch") for the upstream's - cluster. The Connect client TLS certificate and context will be injected - overriding any TLS settings present. - Note: This escape hatch is NOT compatible with the discovery chain and - will be ignored if a discovery chain is active. - type: string - envoyListenerJSON: - description: |- - EnvoyListenerJSON is a complete override ("escape hatch") for the upstream's - listener. - Note: This escape hatch is NOT compatible with the discovery chain and - will be ignored if a discovery chain is active. - type: string - limits: - description: |- - Limits are the set of limits that are applied to the proxy for a specific upstream of a - service instance. - properties: - maxConcurrentRequests: - description: |- - MaxConcurrentRequests is the maximum number of in-flight requests that will be allowed - to the upstream cluster at a point in time. This is mostly applicable to HTTP/2 - clusters since all HTTP/1.1 requests are limited by MaxConnections. - type: integer - maxConnections: - description: |- - MaxConnections is the maximum number of connections the local proxy can - make to the upstream service. - type: integer - maxPendingRequests: - description: |- - MaxPendingRequests is the maximum number of requests that will be queued - waiting for an available connection. This is mostly applicable to HTTP/1.1 - clusters since all HTTP/2 requests are streamed over a single - connection. - type: integer - type: object - meshGateway: - description: MeshGatewayConfig controls how Mesh Gateways - are configured and used. - properties: - mode: - description: |- - Mode is the mode that should be used for the upstream connection. - One of none, local, or remote. - type: string - type: object - name: - description: Name is only accepted within service ServiceDefaultsSpec.UpstreamConfig.Overrides - config entry. - type: string - namespace: - description: Namespace is only accepted within service ServiceDefaultsSpec.UpstreamConfig.Overrides - config entry. - type: string - partition: - description: Partition is only accepted within service ServiceDefaultsSpec.UpstreamConfig.Overrides - config entry. - type: string - passiveHealthCheck: - description: |- - PassiveHealthCheck configuration determines how upstream proxy instances will - be monitored for removal from the load balancing pool. - properties: - baseEjectionTime: - description: |- - The base time that a host is ejected for. The real time is equal to the base time - multiplied by the number of times the host has been ejected and is capped by - max_ejection_time (Default 300s). Defaults to 30s. - type: string - enforcingConsecutive5xx: - description: |- - EnforcingConsecutive5xx is the % chance that a host will be actually ejected - when an outlier status is detected through consecutive 5xx. - This setting can be used to disable ejection or to ramp it up slowly. - Ex. Setting this to 10 will make it a 10% chance that the host will be ejected. - format: int32 - type: integer - interval: - description: |- - Interval between health check analysis sweeps. Each sweep may remove - hosts or return hosts to the pool. Ex. setting this to "10s" will set - the interval to 10 seconds. - type: string - maxEjectionPercent: - description: |- - The maximum % of an upstream cluster that can be ejected due to outlier detection. - Defaults to 10% but will eject at least one host regardless of the value. - format: int32 - type: integer - maxFailures: - description: |- - MaxFailures is the count of consecutive failures that results in a host - being removed from the pool. - format: int32 - type: integer - type: object - peer: - description: Peer is only accepted within service ServiceDefaultsSpec.UpstreamConfig.Overrides - config entry. - type: string - protocol: - description: |- - Protocol describes the upstream's service protocol. Valid values are "tcp", - "http" and "grpc". Anything else is treated as tcp. This enables protocol - aware features like per-request metrics and connection pooling, tracing, - routing etc. - type: string - type: object - type: array - type: object - type: object - status: - properties: - conditions: - description: Conditions indicate the latest available observations - of a resource's current state. - items: - description: |- - Conditions define a readiness condition for a Consul resource. - See: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#typical-status-properties - properties: - lastTransitionTime: - description: LastTransitionTime is the last time the condition - transitioned from one status to another. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. - type: string - reason: - description: The reason for the condition's last transition. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition. - type: string - required: - - status - - type - type: object - type: array - lastSyncedTime: - description: LastSyncedTime is the last time the resource successfully - synced with Consul. - format: date-time - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} -{{- end }} diff --git a/charts/consul/templates/crd-serviceintentions.yaml b/charts/consul/templates/crd-serviceintentions.yaml deleted file mode 100644 index 09daae2..0000000 --- a/charts/consul/templates/crd-serviceintentions.yaml +++ /dev/null @@ -1,319 +0,0 @@ -{{- if .Values.connectInject.enabled }} -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.14.0 - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: crd - name: serviceintentions.consul.hashicorp.com -spec: - group: consul.hashicorp.com - names: - kind: ServiceIntentions - listKind: ServiceIntentionsList - plural: serviceintentions - shortNames: - - service-intentions - singular: serviceintentions - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: The sync status of the resource with Consul - jsonPath: .status.conditions[?(@.type=="Synced")].status - name: Synced - type: string - - description: The last successful synced time of the resource with Consul - jsonPath: .status.lastSyncedTime - name: Last Synced - type: date - - description: The age of the resource - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - description: ServiceIntentions is the Schema for the serviceintentions API - properties: - apiVersion: - description: |- - APIVersion defines the versioned schema of this representation of an object. - Servers should convert recognized schemas to the latest internal value, and - may reject unrecognized values. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - type: string - kind: - description: |- - Kind is a string value representing the REST resource this object represents. - Servers may infer this from the endpoint the client submits requests to. - Cannot be updated. - In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - type: string - metadata: - type: object - spec: - description: ServiceIntentionsSpec defines the desired state of ServiceIntentions. - properties: - destination: - description: Destination is the intention destination that will have - the authorization granted to. - properties: - name: - description: |- - Name is the destination of all intentions defined in this config entry. - This may be set to the wildcard character (*) to match - all services that don't otherwise have intentions defined. - type: string - namespace: - description: |- - Namespace specifies the namespace the config entry will apply to. - This may be set to the wildcard character (*) to match all services - in all namespaces that don't otherwise have intentions defined. - type: string - type: object - jwt: - description: JWT specifies the configuration to validate a JSON Web - Token for all incoming requests. - properties: - providers: - description: Providers is a list of providers to consider when - verifying a JWT. - items: - properties: - name: - description: |- - Name is the name of the JWT provider. There MUST be a corresponding - "jwt-provider" config entry with this name. - type: string - verifyClaims: - description: VerifyClaims is a list of additional claims - to verify in a JWT's payload. - items: - properties: - path: - description: Path is the path to the claim in the - token JSON. - items: - type: string - type: array - value: - description: |- - Value is the expected value at the given path. If the type at the path - is a list then we verify that this value is contained in the list. If - the type at the path is a string then we verify that this value matches. - type: string - type: object - type: array - type: object - type: array - type: object - sources: - description: |- - Sources is the list of all intention sources and the authorization granted to those sources. - The order of this list does not matter, but out of convenience Consul will always store this - reverse sorted by intention precedence, as that is the order that they will be evaluated at enforcement time. - items: - properties: - action: - description: |- - Action is required for an L4 intention, and should be set to one of - "allow" or "deny" for the action that should be taken if this intention matches a request. - type: string - description: - description: Description for the intention. This is not used - by Consul, but is presented in API responses to assist tooling. - type: string - name: - description: |- - Name is the source of the intention. This is the name of a - Consul service. The service doesn't need to be registered. - type: string - namespace: - description: Namespace is the namespace for the Name parameter. - type: string - partition: - description: Partition is the Admin Partition for the Name parameter. - type: string - peer: - description: Peer is the peer name for the Name parameter. - type: string - permissions: - description: |- - Permissions is the list of all additional L7 attributes that extend the intention match criteria. - Permission precedence is applied top to bottom. For any given request the first permission to match - in the list is terminal and stops further evaluation. As with L4 intentions, traffic that fails to - match any of the provided permissions in this intention will be subject to the default intention - behavior is defined by the default ACL policy. This should be omitted for an L4 intention - as it is mutually exclusive with the Action field. - items: - properties: - action: - description: |- - Action is one of "allow" or "deny" for the action that - should be taken if this permission matches a request. - type: string - http: - description: HTTP is a set of HTTP-specific authorization - criteria. - properties: - header: - description: |- - Header is a set of criteria that can match on HTTP request headers. - If more than one is configured all must match for the overall match to apply. - items: - properties: - contains: - description: Contains matches if the header - with the given name contains this value. - type: string - exact: - description: Exact matches if the header with - the given name is this value. - type: string - ignoreCase: - description: IgnoreCase ignores the case of - the header value when matching with exact, - prefix, suffix, or contains. - type: boolean - invert: - description: Invert inverts the logic of the - match. - type: boolean - name: - description: Name is the name of the header - to match. - type: string - prefix: - description: Prefix matches if the header with - the given name has this prefix. - type: string - present: - description: Present matches if the header with - the given name is present with any value. - type: boolean - regex: - description: Regex matches if the header with - the given name matches this pattern. - type: string - suffix: - description: Suffix matches if the header with - the given name has this suffix. - type: string - type: object - type: array - methods: - description: |- - Methods is a list of HTTP methods for which this match applies. If unspecified - all HTTP methods are matched. If provided the names must be a valid method. - items: - type: string - type: array - pathExact: - description: PathExact is the exact path to match - on the HTTP request path. - type: string - pathPrefix: - description: PathPrefix is the path prefix to match - on the HTTP request path. - type: string - pathRegex: - description: PathRegex is the regular expression to - match on the HTTP request path. - type: string - type: object - jwt: - description: JWT specifies configuration to validate a - JSON Web Token for incoming requests. - properties: - providers: - description: Providers is a list of providers to consider - when verifying a JWT. - items: - properties: - name: - description: |- - Name is the name of the JWT provider. There MUST be a corresponding - "jwt-provider" config entry with this name. - type: string - verifyClaims: - description: VerifyClaims is a list of additional - claims to verify in a JWT's payload. - items: - properties: - path: - description: Path is the path to the claim - in the token JSON. - items: - type: string - type: array - value: - description: |- - Value is the expected value at the given path. If the type at the path - is a list then we verify that this value is contained in the list. If - the type at the path is a string then we verify that this value matches. - type: string - type: object - type: array - type: object - type: array - type: object - type: object - type: array - samenessGroup: - description: SamenessGroup is the name of the sameness group, - if applicable. - type: string - type: object - type: array - type: object - status: - properties: - conditions: - description: Conditions indicate the latest available observations - of a resource's current state. - items: - description: |- - Conditions define a readiness condition for a Consul resource. - See: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#typical-status-properties - properties: - lastTransitionTime: - description: LastTransitionTime is the last time the condition - transitioned from one status to another. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. - type: string - reason: - description: The reason for the condition's last transition. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition. - type: string - required: - - status - - type - type: object - type: array - lastSyncedTime: - description: LastSyncedTime is the last time the resource successfully - synced with Consul. - format: date-time - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} -{{- end }} diff --git a/charts/consul/templates/crd-serviceresolvers.yaml b/charts/consul/templates/crd-serviceresolvers.yaml deleted file mode 100644 index 9367d6d..0000000 --- a/charts/consul/templates/crd-serviceresolvers.yaml +++ /dev/null @@ -1,372 +0,0 @@ -{{- if .Values.connectInject.enabled }} -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.14.0 - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: crd - name: serviceresolvers.consul.hashicorp.com -spec: - group: consul.hashicorp.com - names: - kind: ServiceResolver - listKind: ServiceResolverList - plural: serviceresolvers - shortNames: - - service-resolver - singular: serviceresolver - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: The sync status of the resource with Consul - jsonPath: .status.conditions[?(@.type=="Synced")].status - name: Synced - type: string - - description: The last successful synced time of the resource with Consul - jsonPath: .status.lastSyncedTime - name: Last Synced - type: date - - description: The age of the resource - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - description: ServiceResolver is the Schema for the serviceresolvers API - properties: - apiVersion: - description: |- - APIVersion defines the versioned schema of this representation of an object. - Servers should convert recognized schemas to the latest internal value, and - may reject unrecognized values. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - type: string - kind: - description: |- - Kind is a string value representing the REST resource this object represents. - Servers may infer this from the endpoint the client submits requests to. - Cannot be updated. - In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - type: string - metadata: - type: object - spec: - description: ServiceResolverSpec defines the desired state of ServiceResolver. - properties: - connectTimeout: - description: |- - ConnectTimeout is the timeout for establishing new network connections - to this service. - type: string - defaultSubset: - description: |- - DefaultSubset is the subset to use when no explicit subset is requested. - If empty the unnamed subset is used. - type: string - failover: - additionalProperties: - properties: - datacenters: - description: Datacenters is a fixed list of datacenters to try - during failover. - items: - type: string - type: array - namespace: - description: |- - Namespace is the namespace to resolve the requested service from to form - the failover group of instances. If empty the current namespace is used. - type: string - policy: - description: Policy specifies the exact mechanism used for failover. - properties: - mode: - description: |- - Mode specifies the type of failover that will be performed. Valid values are - "sequential", "" (equivalent to "sequential") and "order-by-locality". - type: string - regions: - description: |- - Regions is the ordered list of the regions of the failover targets. - Valid values can be "us-west-1", "us-west-2", and so on. - items: - type: string - type: array - type: object - samenessGroup: - description: SamenessGroup is the name of the sameness group - to try during failover. - type: string - service: - description: |- - Service is the service to resolve instead of the default as the failover - group of instances during failover. - type: string - serviceSubset: - description: |- - ServiceSubset is the named subset of the requested service to resolve as - the failover group of instances. If empty the default subset for the - requested service is used. - type: string - targets: - description: Targets specifies a fixed list of failover targets - to try during failover. - items: - properties: - datacenter: - description: Datacenter specifies the datacenter to try - during failover. - type: string - namespace: - description: Namespace specifies the namespace to try - during failover. - type: string - partition: - description: Partition specifies the partition to try - during failover. - type: string - peer: - description: Peer specifies the name of the cluster peer - to try during failover. - type: string - service: - description: Service specifies the name of the service - to try during failover. - type: string - serviceSubset: - description: ServiceSubset specifies the service subset - to try during failover. - type: string - type: object - type: array - type: object - description: |- - Failover controls when and how to reroute traffic to an alternate pool of - service instances. - The map is keyed by the service subset it applies to and the special - string "*" is a wildcard that applies to any subset not otherwise - specified here. - type: object - loadBalancer: - description: |- - LoadBalancer determines the load balancing policy and configuration for services - issuing requests to this upstream service. - properties: - hashPolicies: - description: |- - HashPolicies is a list of hash policies to use for hashing load balancing algorithms. - Hash policies are evaluated individually and combined such that identical lists - result in the same hash. - If no hash policies are present, or none are successfully evaluated, - then a random backend host will be selected. - items: - properties: - cookieConfig: - description: CookieConfig contains configuration for the - "cookie" hash policy type. - properties: - path: - description: Path is the path to set for the cookie. - type: string - session: - description: Session determines whether to generate - a session cookie with no expiration. - type: boolean - ttl: - description: TTL is the ttl for generated cookies. Cannot - be specified for session cookies. - type: string - type: object - field: - description: |- - Field is the attribute type to hash on. - Must be one of "header", "cookie", or "query_parameter". - Cannot be specified along with sourceIP. - type: string - fieldValue: - description: |- - FieldValue is the value to hash. - ie. header name, cookie name, URL query parameter name - Cannot be specified along with sourceIP. - type: string - sourceIP: - description: |- - SourceIP determines whether the hash should be of the source IP rather than of a field and field value. - Cannot be specified along with field or fieldValue. - type: boolean - terminal: - description: |- - Terminal will short circuit the computation of the hash when multiple hash policies are present. - If a hash is computed when a Terminal policy is evaluated, - then that hash will be used and subsequent hash policies will be ignored. - type: boolean - type: object - type: array - leastRequestConfig: - description: LeastRequestConfig contains configuration for the - "leastRequest" policy type. - properties: - choiceCount: - description: ChoiceCount determines the number of random healthy - hosts from which to select the one with the least requests. - format: int32 - type: integer - type: object - policy: - description: Policy is the load balancing policy used to select - a host. - type: string - ringHashConfig: - description: RingHashConfig contains configuration for the "ringHash" - policy type. - properties: - maximumRingSize: - description: MaximumRingSize determines the maximum number - of entries in the hash ring. - format: int64 - type: integer - minimumRingSize: - description: MinimumRingSize determines the minimum number - of entries in the hash ring. - format: int64 - type: integer - type: object - type: object - prioritizeByLocality: - description: |- - PrioritizeByLocality controls whether the locality of services within the - local partition will be used to prioritize connectivity. - properties: - mode: - description: |- - Mode specifies the type of prioritization that will be performed - when selecting nodes in the local partition. - Valid values are: "" (default "none"), "none", and "failover". - type: string - type: object - redirect: - description: |- - Redirect when configured, all attempts to resolve the service this - resolver defines will be substituted for the supplied redirect - EXCEPT when the redirect has already been applied. - When substituting the supplied redirect, all other fields besides - Kind, Name, and Redirect will be ignored. - properties: - datacenter: - description: |- - Datacenter is the datacenter to resolve the service from instead of the - current one. - type: string - namespace: - description: |- - Namespace is the Consul namespace to resolve the service from instead of - the current namespace. If empty the current namespace is assumed. - type: string - partition: - description: |- - Partition is the Consul partition to resolve the service from instead of - the current partition. If empty the current partition is assumed. - type: string - peer: - description: |- - Peer is the name of the cluster peer to resolve the service from instead - of the current one. - type: string - samenessGroup: - description: SamenessGroup is the name of the sameness group to - resolve the service from instead of the current one. - type: string - service: - description: Service is a service to resolve instead of the current - service. - type: string - serviceSubset: - description: |- - ServiceSubset is a named subset of the given service to resolve instead - of one defined as that service's DefaultSubset If empty the default - subset is used. - type: string - type: object - requestTimeout: - description: |- - RequestTimeout is the timeout for receiving an HTTP response from this - service before the connection is terminated. - type: string - subsets: - additionalProperties: - properties: - filter: - description: |- - Filter is the filter expression to be used for selecting instances of the - requested service. If empty all healthy instances are returned. This - expression can filter on the same selectors as the Health API endpoint. - type: string - onlyPassing: - description: |- - OnlyPassing specifies the behavior of the resolver's health check - interpretation. If this is set to false, instances with checks in the - passing as well as the warning states will be considered healthy. If this - is set to true, only instances with checks in the passing state will be - considered healthy. - type: boolean - type: object - description: |- - Subsets is map of subset name to subset definition for all usable named - subsets of this service. The map key is the name of the subset and all - names must be valid DNS subdomain elements. - This may be empty, in which case only the unnamed default subset will - be usable. - type: object - type: object - status: - properties: - conditions: - description: Conditions indicate the latest available observations - of a resource's current state. - items: - description: |- - Conditions define a readiness condition for a Consul resource. - See: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#typical-status-properties - properties: - lastTransitionTime: - description: LastTransitionTime is the last time the condition - transitioned from one status to another. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. - type: string - reason: - description: The reason for the condition's last transition. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition. - type: string - required: - - status - - type - type: object - type: array - lastSyncedTime: - description: LastSyncedTime is the last time the resource successfully - synced with Consul. - format: date-time - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} -{{- end }} diff --git a/charts/consul/templates/crd-servicerouters.yaml b/charts/consul/templates/crd-servicerouters.yaml deleted file mode 100644 index 4d62149..0000000 --- a/charts/consul/templates/crd-servicerouters.yaml +++ /dev/null @@ -1,335 +0,0 @@ -{{- if .Values.connectInject.enabled }} -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.14.0 - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: crd - name: servicerouters.consul.hashicorp.com -spec: - group: consul.hashicorp.com - names: - kind: ServiceRouter - listKind: ServiceRouterList - plural: servicerouters - shortNames: - - service-router - singular: servicerouter - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: The sync status of the resource with Consul - jsonPath: .status.conditions[?(@.type=="Synced")].status - name: Synced - type: string - - description: The last successful synced time of the resource with Consul - jsonPath: .status.lastSyncedTime - name: Last Synced - type: date - - description: The age of the resource - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - description: ServiceRouter is the Schema for the servicerouters API - properties: - apiVersion: - description: |- - APIVersion defines the versioned schema of this representation of an object. - Servers should convert recognized schemas to the latest internal value, and - may reject unrecognized values. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - type: string - kind: - description: |- - Kind is a string value representing the REST resource this object represents. - Servers may infer this from the endpoint the client submits requests to. - Cannot be updated. - In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - type: string - metadata: - type: object - spec: - description: ServiceRouterSpec defines the desired state of ServiceRouter. - properties: - routes: - description: |- - Routes are the list of routes to consider when processing L7 requests. - The first route to match in the list is terminal and stops further - evaluation. Traffic that fails to match any of the provided routes will - be routed to the default service. - items: - properties: - destination: - description: Destination controls how to proxy the matching - request(s) to a service. - properties: - idleTimeout: - description: |- - IdleTimeout is total amount of time permitted - for the request stream to be idle. - type: string - namespace: - description: |- - Namespace is the Consul namespace to resolve the service from instead of - the current namespace. If empty the current namespace is assumed. - type: string - numRetries: - description: NumRetries is the number of times to retry - the request when a retryable result occurs - format: int32 - type: integer - partition: - description: |- - Partition is the Consul partition to resolve the service from instead of - the current partition. If empty the current partition is assumed. - type: string - prefixRewrite: - description: |- - PrefixRewrite defines how to rewrite the HTTP request path before proxying - it to its final destination. - This requires that either match.http.pathPrefix or match.http.pathExact - be configured on this route. - type: string - requestHeaders: - description: Allow HTTP header manipulation to be configured. - properties: - add: - additionalProperties: - type: string - description: |- - Add is a set of name -> value pairs that should be appended to the request - or response (i.e. allowing duplicates if the same header already exists). - type: object - remove: - description: |- - Remove is the set of header names that should be stripped from the request - or response. - items: - type: string - type: array - set: - additionalProperties: - type: string - description: |- - Set is a set of name -> value pairs that should be added to the request or - response, overwriting any existing header values of the same name. - type: object - type: object - requestTimeout: - description: |- - RequestTimeout is the total amount of time permitted for the entire - downstream request (and retries) to be processed. - type: string - responseHeaders: - description: |- - HTTPHeaderModifiers is a set of rules for HTTP header modification that - should be performed by proxies as the request passes through them. It can - operate on either request or response headers depending on the context in - which it is used. - properties: - add: - additionalProperties: - type: string - description: |- - Add is a set of name -> value pairs that should be appended to the request - or response (i.e. allowing duplicates if the same header already exists). - type: object - remove: - description: |- - Remove is the set of header names that should be stripped from the request - or response. - items: - type: string - type: array - set: - additionalProperties: - type: string - description: |- - Set is a set of name -> value pairs that should be added to the request or - response, overwriting any existing header values of the same name. - type: object - type: object - retryOn: - description: |- - RetryOn is a flat list of conditions for Consul to retry requests based on the response from an upstream service. - Refer to the valid conditions here: https://developer.hashicorp.com/consul/docs/connect/config-entries/service-router#routes-destination-retryon - items: - type: string - type: array - retryOnConnectFailure: - description: RetryOnConnectFailure allows for connection - failure errors to trigger a retry. - type: boolean - retryOnStatusCodes: - description: RetryOnStatusCodes is a flat list of http response - status codes that are eligible for retry. - items: - format: int32 - type: integer - type: array - service: - description: |- - Service is the service to resolve instead of the default service. - If empty then the default service name is used. - type: string - serviceSubset: - description: |- - ServiceSubset is a named subset of the given service to resolve instead - of the one defined as that service's DefaultSubset. - If empty, the default subset is used. - type: string - type: object - match: - description: |- - Match is a set of criteria that can match incoming L7 requests. - If empty or omitted it acts as a catch-all. - properties: - http: - description: HTTP is a set of http-specific match criteria. - properties: - caseInsensitive: - description: CaseInsensitive configures PathExact and - PathPrefix matches to ignore upper/lower casing. - type: boolean - header: - description: |- - Header is a set of criteria that can match on HTTP request headers. - If more than one is configured all must match for the overall match to apply. - items: - properties: - exact: - description: Exact will match if the header with - the given name is this value. - type: string - invert: - description: Invert inverts the logic of the match. - type: boolean - name: - description: Name is the name of the header to - match. - type: string - prefix: - description: Prefix will match if the header with - the given name has this prefix. - type: string - present: - description: Present will match if the header - with the given name is present with any value. - type: boolean - regex: - description: Regex will match if the header with - the given name matches this pattern. - type: string - suffix: - description: Suffix will match if the header with - the given name has this suffix. - type: string - required: - - name - type: object - type: array - methods: - description: |- - Methods is a list of HTTP methods for which this match applies. - If unspecified all http methods are matched. - items: - type: string - type: array - pathExact: - description: PathExact is an exact path to match on - the HTTP request path. - type: string - pathPrefix: - description: PathPrefix is a path prefix to match on - the HTTP request path. - type: string - pathRegex: - description: PathRegex is a regular expression to match - on the HTTP request path. - type: string - queryParam: - description: |- - QueryParam is a set of criteria that can match on HTTP query parameters. - If more than one is configured all must match for the overall match to apply. - items: - properties: - exact: - description: Exact will match if the query parameter - with the given name is this value. - type: string - name: - description: Name is the name of the query parameter - to match on. - type: string - present: - description: |- - Present will match if the query parameter with the given name is present - with any value. - type: boolean - regex: - description: Regex will match if the query parameter - with the given name matches this pattern. - type: string - required: - - name - type: object - type: array - type: object - type: object - type: object - type: array - type: object - status: - properties: - conditions: - description: Conditions indicate the latest available observations - of a resource's current state. - items: - description: |- - Conditions define a readiness condition for a Consul resource. - See: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#typical-status-properties - properties: - lastTransitionTime: - description: LastTransitionTime is the last time the condition - transitioned from one status to another. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. - type: string - reason: - description: The reason for the condition's last transition. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition. - type: string - required: - - status - - type - type: object - type: array - lastSyncedTime: - description: LastSyncedTime is the last time the resource successfully - synced with Consul. - format: date-time - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} -{{- end }} diff --git a/charts/consul/templates/crd-servicesplitters.yaml b/charts/consul/templates/crd-servicesplitters.yaml deleted file mode 100644 index 704ad5d..0000000 --- a/charts/consul/templates/crd-servicesplitters.yaml +++ /dev/null @@ -1,194 +0,0 @@ -{{- if .Values.connectInject.enabled }} -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.14.0 - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: crd - name: servicesplitters.consul.hashicorp.com -spec: - group: consul.hashicorp.com - names: - kind: ServiceSplitter - listKind: ServiceSplitterList - plural: servicesplitters - shortNames: - - service-splitter - singular: servicesplitter - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: The sync status of the resource with Consul - jsonPath: .status.conditions[?(@.type=="Synced")].status - name: Synced - type: string - - description: The last successful synced time of the resource with Consul - jsonPath: .status.lastSyncedTime - name: Last Synced - type: date - - description: The age of the resource - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - description: ServiceSplitter is the Schema for the servicesplitters API - properties: - apiVersion: - description: |- - APIVersion defines the versioned schema of this representation of an object. - Servers should convert recognized schemas to the latest internal value, and - may reject unrecognized values. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - type: string - kind: - description: |- - Kind is a string value representing the REST resource this object represents. - Servers may infer this from the endpoint the client submits requests to. - Cannot be updated. - In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - type: string - metadata: - type: object - spec: - description: ServiceSplitterSpec defines the desired state of ServiceSplitter. - properties: - splits: - description: |- - Splits defines how much traffic to send to which set of service instances during a traffic split. - The sum of weights across all splits must add up to 100. - items: - properties: - namespace: - description: |- - Namespace is the Consul namespace to resolve the service from instead of - the current namespace. If empty the current namespace is assumed. - type: string - partition: - description: |- - Partition is the Consul partition to resolve the service from instead of - the current partition. If empty the current partition is assumed. - type: string - requestHeaders: - description: Allow HTTP header manipulation to be configured. - properties: - add: - additionalProperties: - type: string - description: |- - Add is a set of name -> value pairs that should be appended to the request - or response (i.e. allowing duplicates if the same header already exists). - type: object - remove: - description: |- - Remove is the set of header names that should be stripped from the request - or response. - items: - type: string - type: array - set: - additionalProperties: - type: string - description: |- - Set is a set of name -> value pairs that should be added to the request or - response, overwriting any existing header values of the same name. - type: object - type: object - responseHeaders: - description: |- - HTTPHeaderModifiers is a set of rules for HTTP header modification that - should be performed by proxies as the request passes through them. It can - operate on either request or response headers depending on the context in - which it is used. - properties: - add: - additionalProperties: - type: string - description: |- - Add is a set of name -> value pairs that should be appended to the request - or response (i.e. allowing duplicates if the same header already exists). - type: object - remove: - description: |- - Remove is the set of header names that should be stripped from the request - or response. - items: - type: string - type: array - set: - additionalProperties: - type: string - description: |- - Set is a set of name -> value pairs that should be added to the request or - response, overwriting any existing header values of the same name. - type: object - type: object - service: - description: Service is the service to resolve instead of the - default. - type: string - serviceSubset: - description: |- - ServiceSubset is a named subset of the given service to resolve instead of one defined - as that service's DefaultSubset. If empty the default subset is used. - type: string - weight: - description: |- - Weight is a value between 0 and 100 reflecting what portion of traffic should be directed to this split. - The smallest representable weight is 1/10000 or .01%. - type: number - type: object - type: array - type: object - status: - properties: - conditions: - description: Conditions indicate the latest available observations - of a resource's current state. - items: - description: |- - Conditions define a readiness condition for a Consul resource. - See: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#typical-status-properties - properties: - lastTransitionTime: - description: LastTransitionTime is the last time the condition - transitioned from one status to another. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. - type: string - reason: - description: The reason for the condition's last transition. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition. - type: string - required: - - status - - type - type: object - type: array - lastSyncedTime: - description: LastSyncedTime is the last time the resource successfully - synced with Consul. - format: date-time - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} -{{- end }} diff --git a/charts/consul/templates/crd-tcproutes-external.yaml b/charts/consul/templates/crd-tcproutes-external.yaml deleted file mode 100644 index a57a329..0000000 --- a/charts/consul/templates/crd-tcproutes-external.yaml +++ /dev/null @@ -1,281 +0,0 @@ -{{- if and .Values.connectInject.enabled (or .Values.connectInject.apiGateway.manageExternalCRDs .Values.connectInject.apiGateway.manageNonStandardCRDs ) }} -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/1538 - gateway.networking.k8s.io/bundle-version: v0.6.2 - gateway.networking.k8s.io/channel: experimental - creationTimestamp: null - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: crd - name: tcproutes.gateway.networking.k8s.io -spec: - group: gateway.networking.k8s.io - names: - categories: - - gateway-api - kind: TCPRoute - listKind: TCPRouteList - plural: tcproutes - singular: tcproute - scope: Namespaced - versions: - - additionalPrinterColumns: - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha2 - schema: - openAPIV3Schema: - description: TCPRoute provides a way to route TCP requests. When combined with a Gateway listener, it can be used to forward connections on the port specified by the listener to a set of backends specified by the TCPRoute. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Spec defines the desired state of TCPRoute. - properties: - parentRefs: - description: "ParentRefs references the resources (usually Gateways) that a Route wants to be attached to. Note that the referenced parent resource needs to allow this for the attachment to be complete. For Gateways, that means the Gateway needs to allow attachment from Routes of this kind and namespace. \n The only kind of parent resource with \"Core\" support is Gateway. This API may be extended in the future to support additional kinds of parent resources such as one of the route kinds. \n It is invalid to reference an identical parent more than once. It is valid to reference multiple distinct sections within the same parent resource, such as 2 Listeners within a Gateway. \n It is possible to separately reference multiple distinct objects that may be collapsed by an implementation. For example, some implementations may choose to merge compatible Gateway Listeners together. If that is the case, the list of routes attached to those resources should also be merged. \n Note that for ParentRefs that cross namespace boundaries, there are specific rules. Cross-namespace references are only valid if they are explicitly allowed by something in the namespace they are referring to. For example, Gateway has the AllowedRoutes field, and ReferenceGrant provides a generic way to enable any other kind of cross-namespace reference." - items: - description: "ParentReference identifies an API object (usually a Gateway) that can be considered a parent of this resource (usually a route). The only kind of parent resource with \"Core\" support is Gateway. This API may be extended in the future to support additional kinds of parent resources, such as HTTPRoute. \n The API object must be valid in the cluster; the Group and Kind must be registered in the cluster for this reference to be valid." - properties: - group: - default: gateway.networking.k8s.io - description: "Group is the group of the referent. When unspecified, \"gateway.networking.k8s.io\" is inferred. To set the core API group (such as for a \"Service\" kind referent), Group must be explicitly set to \"\" (empty string). \n Support: Core" - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - default: Gateway - description: "Kind is kind of the referent. \n Support: Core (Gateway) \n Support: Implementation-specific (Other Resources)" - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - name: - description: "Name is the name of the referent. \n Support: Core" - maxLength: 253 - minLength: 1 - type: string - namespace: - description: "Namespace is the namespace of the referent. When unspecified, this refers to the local namespace of the Route. \n Note that there are specific rules for ParentRefs which cross namespace boundaries. Cross-namespace references are only valid if they are explicitly allowed by something in the namespace they are referring to. For example: Gateway has the AllowedRoutes field, and ReferenceGrant provides a generic way to enable any other kind of cross-namespace reference. \n Support: Core" - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - type: string - port: - description: "Port is the network port this Route targets. It can be interpreted differently based on the type of parent resource. \n When the parent resource is a Gateway, this targets all listeners listening on the specified port that also support this kind of Route(and select this Route). It's not recommended to set `Port` unless the networking behaviors specified in a Route must apply to a specific port as opposed to a listener(s) whose port(s) may be changed. When both Port and SectionName are specified, the name and port of the selected listener must match both specified values. \n Implementations MAY choose to support other parent resources. Implementations supporting other types of parent resources MUST clearly document how/if Port is interpreted. \n For the purpose of status, an attachment is considered successful as long as the parent resource accepts it partially. For example, Gateway listeners can restrict which Routes can attach to them by Route kind, namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from the referencing Route, the Route MUST be considered successfully attached. If no Gateway listeners accept attachment from this Route, the Route MUST be considered detached from the Gateway. \n Support: Extended \n " - format: int32 - maximum: 65535 - minimum: 1 - type: integer - sectionName: - description: "SectionName is the name of a section within the target resource. In the following resources, SectionName is interpreted as the following: \n * Gateway: Listener Name. When both Port (experimental) and SectionName are specified, the name and port of the selected listener must match both specified values. \n Implementations MAY choose to support attaching Routes to other resources. If that is the case, they MUST clearly document how SectionName is interpreted. \n When unspecified (empty string), this will reference the entire resource. For the purpose of status, an attachment is considered successful if at least one section in the parent resource accepts it. For example, Gateway listeners can restrict which Routes can attach to them by Route kind, namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from the referencing Route, the Route MUST be considered successfully attached. If no Gateway listeners accept attachment from this Route, the Route MUST be considered detached from the Gateway. \n Support: Core" - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - required: - - name - type: object - maxItems: 32 - type: array - rules: - description: Rules are a list of TCP matchers and actions. - items: - description: TCPRouteRule is the configuration for a given rule. - properties: - backendRefs: - description: "BackendRefs defines the backend(s) where matching requests should be sent. If unspecified or invalid (refers to a non-existent resource or a Service with no endpoints), the underlying implementation MUST actively reject connection attempts to this backend. Connection rejections must respect weight; if an invalid backend is requested to have 80% of connections, then 80% of connections must be rejected instead. \n Support: Core for Kubernetes Service \n Support: Implementation-specific for any other resource \n Support for weight: Extended" - items: - description: "BackendRef defines how a Route should forward a request to a Kubernetes resource. \n Note that when a namespace is specified, a ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details." - properties: - group: - default: "" - description: Group is the group of the referent. For example, "gateway.networking.k8s.io". When unspecified or empty string, core API group is inferred. - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - default: Service - description: Kind is kind of the referent. For example "HTTPRoute" or "Service". Defaults to "Service" when not specified. - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - name: - description: Name is the name of the referent. - maxLength: 253 - minLength: 1 - type: string - namespace: - description: "Namespace is the namespace of the backend. When unspecified, the local namespace is inferred. \n Note that when a namespace is specified, a ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details. \n Support: Core" - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - type: string - port: - description: Port specifies the destination port number to use for this resource. Port is required when the referent is a Kubernetes Service. In this case, the port number is the service port number, not the target port. For other resources, destination port might be derived from the referent resource or this field. - format: int32 - maximum: 65535 - minimum: 1 - type: integer - weight: - default: 1 - description: "Weight specifies the proportion of requests forwarded to the referenced backend. This is computed as weight/(sum of all weights in this BackendRefs list). For non-zero values, there may be some epsilon from the exact proportion defined here depending on the precision an implementation supports. Weight is not a percentage and the sum of weights does not need to equal 100. \n If only one backend is specified and it has a weight greater than 0, 100% of the traffic is forwarded to that backend. If weight is set to 0, no traffic should be forwarded for this entry. If unspecified, weight defaults to 1. \n Support for this field varies based on the context where used." - format: int32 - maximum: 1000000 - minimum: 0 - type: integer - required: - - name - type: object - maxItems: 16 - minItems: 1 - type: array - type: object - maxItems: 16 - minItems: 1 - type: array - required: - - rules - type: object - status: - description: Status defines the current state of TCPRoute. - properties: - parents: - description: "Parents is a list of parent resources (usually Gateways) that are associated with the route, and the status of the route with respect to each parent. When this route attaches to a parent, the controller that manages the parent must add an entry to this list when the controller first sees the route and should update the entry as appropriate when the route or gateway is modified. \n Note that parent references that cannot be resolved by an implementation of this API will not be added to this list. Implementations of this API can only populate Route status for the Gateways/parent resources they are responsible for. \n A maximum of 32 Gateways will be represented in this list. An empty list means the route has not been attached to any Gateway." - items: - description: RouteParentStatus describes the status of a route with respect to an associated Parent. - properties: - conditions: - description: "Conditions describes the status of the route with respect to the Gateway. Note that the route's availability is also subject to the Gateway's own status conditions and listener status. \n If the Route's ParentRef specifies an existing Gateway that supports Routes of this kind AND that Gateway's controller has sufficient access, then that Gateway's controller MUST set the \"Accepted\" condition on the Route, to indicate whether the route has been accepted or rejected by the Gateway, and why. \n A Route MUST be considered \"Accepted\" if at least one of the Route's rules is implemented by the Gateway. \n There are a number of cases where the \"Accepted\" condition may not be set due to lack of controller visibility, that includes when: \n * The Route refers to a non-existent parent. * The Route is of a type that the controller does not support. * The Route is in a namespace the controller does not have access to." - items: - description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, \n \ttype FooStatus struct{ \t // Represents the observations of a foo's current state. \t // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" \t // +patchMergeKey=type \t // +patchStrategy=merge \t // +listType=map \t // +listMapKey=type \t Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n \t // other fields \t}" - properties: - lastTransitionTime: - description: lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: message is a human readable message indicating details about the transition. This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. --- Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 8 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - controllerName: - description: "ControllerName is a domain/path string that indicates the name of the controller that wrote this status. This corresponds with the controllerName field on GatewayClass. \n Example: \"example.net/gateway-controller\". \n The format of this field is DOMAIN \"/\" PATH, where DOMAIN and PATH are valid Kubernetes names (https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names). \n Controllers MUST populate this field when writing status. Controllers should ensure that entries to status populated with their ControllerName are cleaned up when they are no longer necessary." - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$ - type: string - parentRef: - description: ParentRef corresponds with a ParentRef in the spec that this RouteParentStatus struct describes the status of. - properties: - group: - default: gateway.networking.k8s.io - description: "Group is the group of the referent. When unspecified, \"gateway.networking.k8s.io\" is inferred. To set the core API group (such as for a \"Service\" kind referent), Group must be explicitly set to \"\" (empty string). \n Support: Core" - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - default: Gateway - description: "Kind is kind of the referent. \n Support: Core (Gateway) \n Support: Implementation-specific (Other Resources)" - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - name: - description: "Name is the name of the referent. \n Support: Core" - maxLength: 253 - minLength: 1 - type: string - namespace: - description: "Namespace is the namespace of the referent. When unspecified, this refers to the local namespace of the Route. \n Note that there are specific rules for ParentRefs which cross namespace boundaries. Cross-namespace references are only valid if they are explicitly allowed by something in the namespace they are referring to. For example: Gateway has the AllowedRoutes field, and ReferenceGrant provides a generic way to enable any other kind of cross-namespace reference. \n Support: Core" - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - type: string - port: - description: "Port is the network port this Route targets. It can be interpreted differently based on the type of parent resource. \n When the parent resource is a Gateway, this targets all listeners listening on the specified port that also support this kind of Route(and select this Route). It's not recommended to set `Port` unless the networking behaviors specified in a Route must apply to a specific port as opposed to a listener(s) whose port(s) may be changed. When both Port and SectionName are specified, the name and port of the selected listener must match both specified values. \n Implementations MAY choose to support other parent resources. Implementations supporting other types of parent resources MUST clearly document how/if Port is interpreted. \n For the purpose of status, an attachment is considered successful as long as the parent resource accepts it partially. For example, Gateway listeners can restrict which Routes can attach to them by Route kind, namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from the referencing Route, the Route MUST be considered successfully attached. If no Gateway listeners accept attachment from this Route, the Route MUST be considered detached from the Gateway. \n Support: Extended \n " - format: int32 - maximum: 65535 - minimum: 1 - type: integer - sectionName: - description: "SectionName is the name of a section within the target resource. In the following resources, SectionName is interpreted as the following: \n * Gateway: Listener Name. When both Port (experimental) and SectionName are specified, the name and port of the selected listener must match both specified values. \n Implementations MAY choose to support attaching Routes to other resources. If that is the case, they MUST clearly document how SectionName is interpreted. \n When unspecified (empty string), this will reference the entire resource. For the purpose of status, an attachment is considered successful if at least one section in the parent resource accepts it. For example, Gateway listeners can restrict which Routes can attach to them by Route kind, namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from the referencing Route, the Route MUST be considered successfully attached. If no Gateway listeners accept attachment from this Route, the Route MUST be considered detached from the Gateway. \n Support: Core" - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - required: - - name - type: object - required: - - controllerName - - parentRef - type: object - maxItems: 32 - type: array - required: - - parents - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] -{{- end }} diff --git a/charts/consul/templates/crd-terminatinggateways.yaml b/charts/consul/templates/crd-terminatinggateways.yaml deleted file mode 100644 index 5d78a50..0000000 --- a/charts/consul/templates/crd-terminatinggateways.yaml +++ /dev/null @@ -1,148 +0,0 @@ -{{- if .Values.connectInject.enabled }} -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.14.0 - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: crd - name: terminatinggateways.consul.hashicorp.com -spec: - group: consul.hashicorp.com - names: - kind: TerminatingGateway - listKind: TerminatingGatewayList - plural: terminatinggateways - shortNames: - - terminating-gateway - singular: terminatinggateway - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: The sync status of the resource with Consul - jsonPath: .status.conditions[?(@.type=="Synced")].status - name: Synced - type: string - - description: The last successful synced time of the resource with Consul - jsonPath: .status.lastSyncedTime - name: Last Synced - type: date - - description: The age of the resource - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - description: TerminatingGateway is the Schema for the terminatinggateways - API - properties: - apiVersion: - description: |- - APIVersion defines the versioned schema of this representation of an object. - Servers should convert recognized schemas to the latest internal value, and - may reject unrecognized values. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - type: string - kind: - description: |- - Kind is a string value representing the REST resource this object represents. - Servers may infer this from the endpoint the client submits requests to. - Cannot be updated. - In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - type: string - metadata: - type: object - spec: - description: TerminatingGatewaySpec defines the desired state of TerminatingGateway. - properties: - services: - description: Services is a list of service names represented by the - terminating gateway. - items: - description: A LinkedService is a service represented by a terminating - gateway. - properties: - caFile: - description: |- - CAFile is the optional path to a CA certificate to use for TLS connections - from the gateway to the linked service. - type: string - certFile: - description: |- - CertFile is the optional path to a client certificate to use for TLS connections - from the gateway to the linked service. - type: string - disableAutoHostRewrite: - description: DisableAutoHostRewrite disables terminating gateways - auto host rewrite feature when set to true. - type: boolean - keyFile: - description: |- - KeyFile is the optional path to a private key to use for TLS connections - from the gateway to the linked service. - type: string - name: - description: Name is the name of the service, as defined in - Consul's catalog. - type: string - namespace: - description: The namespace the service is registered in. - type: string - sni: - description: SNI is the optional name to specify during the - TLS handshake with a linked service. - type: string - type: object - type: array - type: object - status: - properties: - conditions: - description: Conditions indicate the latest available observations - of a resource's current state. - items: - description: |- - Conditions define a readiness condition for a Consul resource. - See: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#typical-status-properties - properties: - lastTransitionTime: - description: LastTransitionTime is the last time the condition - transitioned from one status to another. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. - type: string - reason: - description: The reason for the condition's last transition. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition. - type: string - required: - - status - - type - type: object - type: array - lastSyncedTime: - description: LastSyncedTime is the last time the resource successfully - synced with Consul. - format: date-time - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} -{{- end }} diff --git a/charts/consul/templates/crd-tlsroutes-external.yaml b/charts/consul/templates/crd-tlsroutes-external.yaml deleted file mode 100644 index 1acd1b9..0000000 --- a/charts/consul/templates/crd-tlsroutes-external.yaml +++ /dev/null @@ -1,291 +0,0 @@ -{{- if and .Values.connectInject.enabled .Values.connectInject.apiGateway.manageExternalCRDs }} -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/1538 - gateway.networking.k8s.io/bundle-version: v0.6.2 - gateway.networking.k8s.io/channel: experimental - creationTimestamp: null - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: crd - name: tlsroutes.gateway.networking.k8s.io -spec: - group: gateway.networking.k8s.io - names: - categories: - - gateway-api - kind: TLSRoute - listKind: TLSRouteList - plural: tlsroutes - singular: tlsroute - scope: Namespaced - versions: - - additionalPrinterColumns: - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha2 - schema: - openAPIV3Schema: - description: "The TLSRoute resource is similar to TCPRoute, but can be configured to match against TLS-specific metadata. This allows more flexibility in matching streams for a given TLS listener. \n If you need to forward traffic to a single target for a TLS listener, you could choose to use a TCPRoute with a TLS listener." - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Spec defines the desired state of TLSRoute. - properties: - hostnames: - description: "Hostnames defines a set of SNI names that should match against the SNI attribute of TLS ClientHello message in TLS handshake. This matches the RFC 1123 definition of a hostname with 2 notable exceptions: \n 1. IPs are not allowed in SNI names per RFC 6066. 2. A hostname may be prefixed with a wildcard label (`*.`). The wildcard label must appear by itself as the first label. \n If a hostname is specified by both the Listener and TLSRoute, there must be at least one intersecting hostname for the TLSRoute to be attached to the Listener. For example: \n * A Listener with `test.example.com` as the hostname matches TLSRoutes that have either not specified any hostnames, or have specified at least one of `test.example.com` or `*.example.com`. * A Listener with `*.example.com` as the hostname matches TLSRoutes that have either not specified any hostnames or have specified at least one hostname that matches the Listener hostname. For example, `test.example.com` and `*.example.com` would both match. On the other hand, `example.com` and `test.example.net` would not match. \n If both the Listener and TLSRoute have specified hostnames, any TLSRoute hostnames that do not match the Listener hostname MUST be ignored. For example, if a Listener specified `*.example.com`, and the TLSRoute specified `test.example.com` and `test.example.net`, `test.example.net` must not be considered for a match. \n If both the Listener and TLSRoute have specified hostnames, and none match with the criteria above, then the TLSRoute is not accepted. The implementation must raise an 'Accepted' Condition with a status of `False` in the corresponding RouteParentStatus. \n Support: Core" - items: - description: "Hostname is the fully qualified domain name of a network host. This matches the RFC 1123 definition of a hostname with 2 notable exceptions: \n 1. IPs are not allowed. 2. A hostname may be prefixed with a wildcard label (`*.`). The wildcard label must appear by itself as the first label. \n Hostname can be \"precise\" which is a domain name without the terminating dot of a network host (e.g. \"foo.example.com\") or \"wildcard\", which is a domain name prefixed with a single wildcard label (e.g. `*.example.com`). \n Note that as per RFC1035 and RFC1123, a *label* must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character. No other punctuation is allowed." - maxLength: 253 - minLength: 1 - pattern: ^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - maxItems: 16 - type: array - parentRefs: - description: "ParentRefs references the resources (usually Gateways) that a Route wants to be attached to. Note that the referenced parent resource needs to allow this for the attachment to be complete. For Gateways, that means the Gateway needs to allow attachment from Routes of this kind and namespace. \n The only kind of parent resource with \"Core\" support is Gateway. This API may be extended in the future to support additional kinds of parent resources such as one of the route kinds. \n It is invalid to reference an identical parent more than once. It is valid to reference multiple distinct sections within the same parent resource, such as 2 Listeners within a Gateway. \n It is possible to separately reference multiple distinct objects that may be collapsed by an implementation. For example, some implementations may choose to merge compatible Gateway Listeners together. If that is the case, the list of routes attached to those resources should also be merged. \n Note that for ParentRefs that cross namespace boundaries, there are specific rules. Cross-namespace references are only valid if they are explicitly allowed by something in the namespace they are referring to. For example, Gateway has the AllowedRoutes field, and ReferenceGrant provides a generic way to enable any other kind of cross-namespace reference." - items: - description: "ParentReference identifies an API object (usually a Gateway) that can be considered a parent of this resource (usually a route). The only kind of parent resource with \"Core\" support is Gateway. This API may be extended in the future to support additional kinds of parent resources, such as HTTPRoute. \n The API object must be valid in the cluster; the Group and Kind must be registered in the cluster for this reference to be valid." - properties: - group: - default: gateway.networking.k8s.io - description: "Group is the group of the referent. When unspecified, \"gateway.networking.k8s.io\" is inferred. To set the core API group (such as for a \"Service\" kind referent), Group must be explicitly set to \"\" (empty string). \n Support: Core" - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - default: Gateway - description: "Kind is kind of the referent. \n Support: Core (Gateway) \n Support: Implementation-specific (Other Resources)" - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - name: - description: "Name is the name of the referent. \n Support: Core" - maxLength: 253 - minLength: 1 - type: string - namespace: - description: "Namespace is the namespace of the referent. When unspecified, this refers to the local namespace of the Route. \n Note that there are specific rules for ParentRefs which cross namespace boundaries. Cross-namespace references are only valid if they are explicitly allowed by something in the namespace they are referring to. For example: Gateway has the AllowedRoutes field, and ReferenceGrant provides a generic way to enable any other kind of cross-namespace reference. \n Support: Core" - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - type: string - port: - description: "Port is the network port this Route targets. It can be interpreted differently based on the type of parent resource. \n When the parent resource is a Gateway, this targets all listeners listening on the specified port that also support this kind of Route(and select this Route). It's not recommended to set `Port` unless the networking behaviors specified in a Route must apply to a specific port as opposed to a listener(s) whose port(s) may be changed. When both Port and SectionName are specified, the name and port of the selected listener must match both specified values. \n Implementations MAY choose to support other parent resources. Implementations supporting other types of parent resources MUST clearly document how/if Port is interpreted. \n For the purpose of status, an attachment is considered successful as long as the parent resource accepts it partially. For example, Gateway listeners can restrict which Routes can attach to them by Route kind, namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from the referencing Route, the Route MUST be considered successfully attached. If no Gateway listeners accept attachment from this Route, the Route MUST be considered detached from the Gateway. \n Support: Extended \n " - format: int32 - maximum: 65535 - minimum: 1 - type: integer - sectionName: - description: "SectionName is the name of a section within the target resource. In the following resources, SectionName is interpreted as the following: \n * Gateway: Listener Name. When both Port (experimental) and SectionName are specified, the name and port of the selected listener must match both specified values. \n Implementations MAY choose to support attaching Routes to other resources. If that is the case, they MUST clearly document how SectionName is interpreted. \n When unspecified (empty string), this will reference the entire resource. For the purpose of status, an attachment is considered successful if at least one section in the parent resource accepts it. For example, Gateway listeners can restrict which Routes can attach to them by Route kind, namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from the referencing Route, the Route MUST be considered successfully attached. If no Gateway listeners accept attachment from this Route, the Route MUST be considered detached from the Gateway. \n Support: Core" - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - required: - - name - type: object - maxItems: 32 - type: array - rules: - description: Rules are a list of TLS matchers and actions. - items: - description: TLSRouteRule is the configuration for a given rule. - properties: - backendRefs: - description: "BackendRefs defines the backend(s) where matching requests should be sent. If unspecified or invalid (refers to a non-existent resource or a Service with no endpoints), the rule performs no forwarding; if no filters are specified that would result in a response being sent, the underlying implementation must actively reject request attempts to this backend, by rejecting the connection or returning a 500 status code. Request rejections must respect weight; if an invalid backend is requested to have 80% of requests, then 80% of requests must be rejected instead. \n Support: Core for Kubernetes Service \n Support: Implementation-specific for any other resource \n Support for weight: Extended" - items: - description: "BackendRef defines how a Route should forward a request to a Kubernetes resource. \n Note that when a namespace is specified, a ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details." - properties: - group: - default: "" - description: Group is the group of the referent. For example, "gateway.networking.k8s.io". When unspecified or empty string, core API group is inferred. - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - default: Service - description: Kind is kind of the referent. For example "HTTPRoute" or "Service". Defaults to "Service" when not specified. - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - name: - description: Name is the name of the referent. - maxLength: 253 - minLength: 1 - type: string - namespace: - description: "Namespace is the namespace of the backend. When unspecified, the local namespace is inferred. \n Note that when a namespace is specified, a ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details. \n Support: Core" - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - type: string - port: - description: Port specifies the destination port number to use for this resource. Port is required when the referent is a Kubernetes Service. In this case, the port number is the service port number, not the target port. For other resources, destination port might be derived from the referent resource or this field. - format: int32 - maximum: 65535 - minimum: 1 - type: integer - weight: - default: 1 - description: "Weight specifies the proportion of requests forwarded to the referenced backend. This is computed as weight/(sum of all weights in this BackendRefs list). For non-zero values, there may be some epsilon from the exact proportion defined here depending on the precision an implementation supports. Weight is not a percentage and the sum of weights does not need to equal 100. \n If only one backend is specified and it has a weight greater than 0, 100% of the traffic is forwarded to that backend. If weight is set to 0, no traffic should be forwarded for this entry. If unspecified, weight defaults to 1. \n Support for this field varies based on the context where used." - format: int32 - maximum: 1000000 - minimum: 0 - type: integer - required: - - name - type: object - maxItems: 16 - minItems: 1 - type: array - type: object - maxItems: 16 - minItems: 1 - type: array - required: - - rules - type: object - status: - description: Status defines the current state of TLSRoute. - properties: - parents: - description: "Parents is a list of parent resources (usually Gateways) that are associated with the route, and the status of the route with respect to each parent. When this route attaches to a parent, the controller that manages the parent must add an entry to this list when the controller first sees the route and should update the entry as appropriate when the route or gateway is modified. \n Note that parent references that cannot be resolved by an implementation of this API will not be added to this list. Implementations of this API can only populate Route status for the Gateways/parent resources they are responsible for. \n A maximum of 32 Gateways will be represented in this list. An empty list means the route has not been attached to any Gateway." - items: - description: RouteParentStatus describes the status of a route with respect to an associated Parent. - properties: - conditions: - description: "Conditions describes the status of the route with respect to the Gateway. Note that the route's availability is also subject to the Gateway's own status conditions and listener status. \n If the Route's ParentRef specifies an existing Gateway that supports Routes of this kind AND that Gateway's controller has sufficient access, then that Gateway's controller MUST set the \"Accepted\" condition on the Route, to indicate whether the route has been accepted or rejected by the Gateway, and why. \n A Route MUST be considered \"Accepted\" if at least one of the Route's rules is implemented by the Gateway. \n There are a number of cases where the \"Accepted\" condition may not be set due to lack of controller visibility, that includes when: \n * The Route refers to a non-existent parent. * The Route is of a type that the controller does not support. * The Route is in a namespace the controller does not have access to." - items: - description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, \n \ttype FooStatus struct{ \t // Represents the observations of a foo's current state. \t // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" \t // +patchMergeKey=type \t // +patchStrategy=merge \t // +listType=map \t // +listMapKey=type \t Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n \t // other fields \t}" - properties: - lastTransitionTime: - description: lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: message is a human readable message indicating details about the transition. This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. --- Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 8 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - controllerName: - description: "ControllerName is a domain/path string that indicates the name of the controller that wrote this status. This corresponds with the controllerName field on GatewayClass. \n Example: \"example.net/gateway-controller\". \n The format of this field is DOMAIN \"/\" PATH, where DOMAIN and PATH are valid Kubernetes names (https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names). \n Controllers MUST populate this field when writing status. Controllers should ensure that entries to status populated with their ControllerName are cleaned up when they are no longer necessary." - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$ - type: string - parentRef: - description: ParentRef corresponds with a ParentRef in the spec that this RouteParentStatus struct describes the status of. - properties: - group: - default: gateway.networking.k8s.io - description: "Group is the group of the referent. When unspecified, \"gateway.networking.k8s.io\" is inferred. To set the core API group (such as for a \"Service\" kind referent), Group must be explicitly set to \"\" (empty string). \n Support: Core" - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - default: Gateway - description: "Kind is kind of the referent. \n Support: Core (Gateway) \n Support: Implementation-specific (Other Resources)" - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - name: - description: "Name is the name of the referent. \n Support: Core" - maxLength: 253 - minLength: 1 - type: string - namespace: - description: "Namespace is the namespace of the referent. When unspecified, this refers to the local namespace of the Route. \n Note that there are specific rules for ParentRefs which cross namespace boundaries. Cross-namespace references are only valid if they are explicitly allowed by something in the namespace they are referring to. For example: Gateway has the AllowedRoutes field, and ReferenceGrant provides a generic way to enable any other kind of cross-namespace reference. \n Support: Core" - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - type: string - port: - description: "Port is the network port this Route targets. It can be interpreted differently based on the type of parent resource. \n When the parent resource is a Gateway, this targets all listeners listening on the specified port that also support this kind of Route(and select this Route). It's not recommended to set `Port` unless the networking behaviors specified in a Route must apply to a specific port as opposed to a listener(s) whose port(s) may be changed. When both Port and SectionName are specified, the name and port of the selected listener must match both specified values. \n Implementations MAY choose to support other parent resources. Implementations supporting other types of parent resources MUST clearly document how/if Port is interpreted. \n For the purpose of status, an attachment is considered successful as long as the parent resource accepts it partially. For example, Gateway listeners can restrict which Routes can attach to them by Route kind, namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from the referencing Route, the Route MUST be considered successfully attached. If no Gateway listeners accept attachment from this Route, the Route MUST be considered detached from the Gateway. \n Support: Extended \n " - format: int32 - maximum: 65535 - minimum: 1 - type: integer - sectionName: - description: "SectionName is the name of a section within the target resource. In the following resources, SectionName is interpreted as the following: \n * Gateway: Listener Name. When both Port (experimental) and SectionName are specified, the name and port of the selected listener must match both specified values. \n Implementations MAY choose to support attaching Routes to other resources. If that is the case, they MUST clearly document how SectionName is interpreted. \n When unspecified (empty string), this will reference the entire resource. For the purpose of status, an attachment is considered successful if at least one section in the parent resource accepts it. For example, Gateway listeners can restrict which Routes can attach to them by Route kind, namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from the referencing Route, the Route MUST be considered successfully attached. If no Gateway listeners accept attachment from this Route, the Route MUST be considered detached from the Gateway. \n Support: Core" - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - required: - - name - type: object - required: - - controllerName - - parentRef - type: object - maxItems: 32 - type: array - required: - - parents - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] -{{- end }} diff --git a/charts/consul/templates/crd-trafficpermissions.yaml b/charts/consul/templates/crd-trafficpermissions.yaml deleted file mode 100644 index 87727f4..0000000 --- a/charts/consul/templates/crd-trafficpermissions.yaml +++ /dev/null @@ -1,265 +0,0 @@ -{{- if .Values.connectInject.enabled }} -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.12.1 - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: crd - name: trafficpermissions.auth.consul.hashicorp.com -spec: - group: auth.consul.hashicorp.com - names: - kind: TrafficPermissions - listKind: TrafficPermissionsList - plural: trafficpermissions - shortNames: - - traffic-permissions - singular: trafficpermissions - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: The sync status of the resource with Consul - jsonPath: .status.conditions[?(@.type=="Synced")].status - name: Synced - type: string - - description: The last successful synced time of the resource with Consul - jsonPath: .status.lastSyncedTime - name: Last Synced - type: date - - description: The age of the resource - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v2beta1 - schema: - openAPIV3Schema: - description: TrafficPermissions is the Schema for the traffic-permissions - API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - properties: - action: - description: "Action can be either allow or deny for the entire object. - It will default to allow. \n If action is allow, we will allow the - connection if one of the rules in Rules matches, in other words, - we will deny all requests except for the ones that match Rules. - If Consul is in default allow mode, then allow actions have no effect - without a deny permission as everything is allowed by default. \n - If action is deny, we will deny the connection if one of the rules - in Rules match, in other words, we will allow all requests except - for the ones that match Rules. If Consul is default deny mode, then - deny permissions have no effect without an allow permission as everything - is denied by default. \n Action unspecified is reserved for compatibility - with the addition of future actions." - enum: - - ACTION_ALLOW - - ACTION_DENY - - ACTION_UNKNOWN - format: int32 - type: string - destination: - description: Destination is a configuration of the destination proxies - where these traffic permissions should apply. - properties: - identityName: - type: string - type: object - permissions: - description: Permissions is a list of permissions to match on. They - are applied using OR semantics. - items: - description: Permissions is a list of permissions to match on. - properties: - destinationRules: - description: DestinationRules is a list of rules to apply for - matching sources in this Permission. These rules are specific - to the request or connection that is going to the destination(s) - selected by the TrafficPermissions resource. - items: - description: DestinationRule contains rules rules to apply - to the incoming connection. - properties: - exclude: - description: Exclude contains a list of rules to exclude - when evaluating rules for the incoming connection. - items: - properties: - headers: - items: - properties: - exact: - type: string - invert: - type: boolean - name: - type: string - prefix: - type: string - present: - type: boolean - regex: - type: string - suffix: - type: string - type: object - type: array - methods: - description: Methods is the list of HTTP methods. - items: - type: string - type: array - pathExact: - type: string - pathPrefix: - type: string - pathRegex: - type: string - portNames: - description: PortNames is a list of workload ports - to apply this rule to. The ports specified here - must be the ports used in the connection. - items: - type: string - type: array - type: object - type: array - headers: - items: - properties: - exact: - type: string - invert: - type: boolean - name: - type: string - prefix: - type: string - present: - type: boolean - regex: - type: string - suffix: - type: string - type: object - type: array - methods: - description: Methods is the list of HTTP methods. If no - methods are specified, this rule will apply to all methods. - items: - type: string - type: array - pathExact: - type: string - pathPrefix: - type: string - pathRegex: - type: string - portNames: - items: - type: string - type: array - type: object - type: array - sources: - description: Sources is a list of sources in this traffic permission. - items: - description: Source represents the source identity. To specify - any of the wildcard sources, the specific fields need to - be omitted. For example, for a wildcard namespace, identity_name - should be omitted. - properties: - exclude: - description: Exclude is a list of sources to exclude from - this source. - items: - description: ExcludeSource is almost the same as source - but it prevents the addition of matching sources. - properties: - identityName: - type: string - namespace: - type: string - partition: - type: string - peer: - type: string - samenessGroup: - type: string - type: object - type: array - identityName: - type: string - namespace: - type: string - partition: - type: string - peer: - type: string - samenessGroup: - type: string - type: object - type: array - type: object - type: array - type: object - status: - properties: - conditions: - description: Conditions indicate the latest available observations - of a resource's current state. - items: - description: 'Conditions define a readiness condition for a Consul - resource. See: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#typical-status-properties' - properties: - lastTransitionTime: - description: LastTransitionTime is the last time the condition - transitioned from one status to another. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. - type: string - reason: - description: The reason for the condition's last transition. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition. - type: string - required: - - status - - type - type: object - type: array - lastSyncedTime: - description: LastSyncedTime is the last time the resource successfully - synced with Consul. - format: date-time - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} -{{- end }} diff --git a/charts/consul/templates/crd-udproutes-external.yaml b/charts/consul/templates/crd-udproutes-external.yaml deleted file mode 100644 index 0661b24..0000000 --- a/charts/consul/templates/crd-udproutes-external.yaml +++ /dev/null @@ -1,281 +0,0 @@ -{{- if and .Values.connectInject.enabled .Values.connectInject.apiGateway.manageExternalCRDs }} -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/1538 - gateway.networking.k8s.io/bundle-version: v0.6.2 - gateway.networking.k8s.io/channel: experimental - creationTimestamp: null - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: crd - name: udproutes.gateway.networking.k8s.io -spec: - group: gateway.networking.k8s.io - names: - categories: - - gateway-api - kind: UDPRoute - listKind: UDPRouteList - plural: udproutes - singular: udproute - scope: Namespaced - versions: - - additionalPrinterColumns: - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha2 - schema: - openAPIV3Schema: - description: UDPRoute provides a way to route UDP traffic. When combined with a Gateway listener, it can be used to forward traffic on the port specified by the listener to a set of backends specified by the UDPRoute. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Spec defines the desired state of UDPRoute. - properties: - parentRefs: - description: "ParentRefs references the resources (usually Gateways) that a Route wants to be attached to. Note that the referenced parent resource needs to allow this for the attachment to be complete. For Gateways, that means the Gateway needs to allow attachment from Routes of this kind and namespace. \n The only kind of parent resource with \"Core\" support is Gateway. This API may be extended in the future to support additional kinds of parent resources such as one of the route kinds. \n It is invalid to reference an identical parent more than once. It is valid to reference multiple distinct sections within the same parent resource, such as 2 Listeners within a Gateway. \n It is possible to separately reference multiple distinct objects that may be collapsed by an implementation. For example, some implementations may choose to merge compatible Gateway Listeners together. If that is the case, the list of routes attached to those resources should also be merged. \n Note that for ParentRefs that cross namespace boundaries, there are specific rules. Cross-namespace references are only valid if they are explicitly allowed by something in the namespace they are referring to. For example, Gateway has the AllowedRoutes field, and ReferenceGrant provides a generic way to enable any other kind of cross-namespace reference." - items: - description: "ParentReference identifies an API object (usually a Gateway) that can be considered a parent of this resource (usually a route). The only kind of parent resource with \"Core\" support is Gateway. This API may be extended in the future to support additional kinds of parent resources, such as HTTPRoute. \n The API object must be valid in the cluster; the Group and Kind must be registered in the cluster for this reference to be valid." - properties: - group: - default: gateway.networking.k8s.io - description: "Group is the group of the referent. When unspecified, \"gateway.networking.k8s.io\" is inferred. To set the core API group (such as for a \"Service\" kind referent), Group must be explicitly set to \"\" (empty string). \n Support: Core" - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - default: Gateway - description: "Kind is kind of the referent. \n Support: Core (Gateway) \n Support: Implementation-specific (Other Resources)" - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - name: - description: "Name is the name of the referent. \n Support: Core" - maxLength: 253 - minLength: 1 - type: string - namespace: - description: "Namespace is the namespace of the referent. When unspecified, this refers to the local namespace of the Route. \n Note that there are specific rules for ParentRefs which cross namespace boundaries. Cross-namespace references are only valid if they are explicitly allowed by something in the namespace they are referring to. For example: Gateway has the AllowedRoutes field, and ReferenceGrant provides a generic way to enable any other kind of cross-namespace reference. \n Support: Core" - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - type: string - port: - description: "Port is the network port this Route targets. It can be interpreted differently based on the type of parent resource. \n When the parent resource is a Gateway, this targets all listeners listening on the specified port that also support this kind of Route(and select this Route). It's not recommended to set `Port` unless the networking behaviors specified in a Route must apply to a specific port as opposed to a listener(s) whose port(s) may be changed. When both Port and SectionName are specified, the name and port of the selected listener must match both specified values. \n Implementations MAY choose to support other parent resources. Implementations supporting other types of parent resources MUST clearly document how/if Port is interpreted. \n For the purpose of status, an attachment is considered successful as long as the parent resource accepts it partially. For example, Gateway listeners can restrict which Routes can attach to them by Route kind, namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from the referencing Route, the Route MUST be considered successfully attached. If no Gateway listeners accept attachment from this Route, the Route MUST be considered detached from the Gateway. \n Support: Extended \n " - format: int32 - maximum: 65535 - minimum: 1 - type: integer - sectionName: - description: "SectionName is the name of a section within the target resource. In the following resources, SectionName is interpreted as the following: \n * Gateway: Listener Name. When both Port (experimental) and SectionName are specified, the name and port of the selected listener must match both specified values. \n Implementations MAY choose to support attaching Routes to other resources. If that is the case, they MUST clearly document how SectionName is interpreted. \n When unspecified (empty string), this will reference the entire resource. For the purpose of status, an attachment is considered successful if at least one section in the parent resource accepts it. For example, Gateway listeners can restrict which Routes can attach to them by Route kind, namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from the referencing Route, the Route MUST be considered successfully attached. If no Gateway listeners accept attachment from this Route, the Route MUST be considered detached from the Gateway. \n Support: Core" - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - required: - - name - type: object - maxItems: 32 - type: array - rules: - description: Rules are a list of UDP matchers and actions. - items: - description: UDPRouteRule is the configuration for a given rule. - properties: - backendRefs: - description: "BackendRefs defines the backend(s) where matching requests should be sent. If unspecified or invalid (refers to a non-existent resource or a Service with no endpoints), the underlying implementation MUST actively reject connection attempts to this backend. Packet drops must respect weight; if an invalid backend is requested to have 80% of the packets, then 80% of packets must be dropped instead. \n Support: Core for Kubernetes Service Support: Implementation-specific for any other resource \n Support for weight: Extended" - items: - description: "BackendRef defines how a Route should forward a request to a Kubernetes resource. \n Note that when a namespace is specified, a ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details." - properties: - group: - default: "" - description: Group is the group of the referent. For example, "gateway.networking.k8s.io". When unspecified or empty string, core API group is inferred. - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - default: Service - description: Kind is kind of the referent. For example "HTTPRoute" or "Service". Defaults to "Service" when not specified. - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - name: - description: Name is the name of the referent. - maxLength: 253 - minLength: 1 - type: string - namespace: - description: "Namespace is the namespace of the backend. When unspecified, the local namespace is inferred. \n Note that when a namespace is specified, a ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details. \n Support: Core" - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - type: string - port: - description: Port specifies the destination port number to use for this resource. Port is required when the referent is a Kubernetes Service. In this case, the port number is the service port number, not the target port. For other resources, destination port might be derived from the referent resource or this field. - format: int32 - maximum: 65535 - minimum: 1 - type: integer - weight: - default: 1 - description: "Weight specifies the proportion of requests forwarded to the referenced backend. This is computed as weight/(sum of all weights in this BackendRefs list). For non-zero values, there may be some epsilon from the exact proportion defined here depending on the precision an implementation supports. Weight is not a percentage and the sum of weights does not need to equal 100. \n If only one backend is specified and it has a weight greater than 0, 100% of the traffic is forwarded to that backend. If weight is set to 0, no traffic should be forwarded for this entry. If unspecified, weight defaults to 1. \n Support for this field varies based on the context where used." - format: int32 - maximum: 1000000 - minimum: 0 - type: integer - required: - - name - type: object - maxItems: 16 - minItems: 1 - type: array - type: object - maxItems: 16 - minItems: 1 - type: array - required: - - rules - type: object - status: - description: Status defines the current state of UDPRoute. - properties: - parents: - description: "Parents is a list of parent resources (usually Gateways) that are associated with the route, and the status of the route with respect to each parent. When this route attaches to a parent, the controller that manages the parent must add an entry to this list when the controller first sees the route and should update the entry as appropriate when the route or gateway is modified. \n Note that parent references that cannot be resolved by an implementation of this API will not be added to this list. Implementations of this API can only populate Route status for the Gateways/parent resources they are responsible for. \n A maximum of 32 Gateways will be represented in this list. An empty list means the route has not been attached to any Gateway." - items: - description: RouteParentStatus describes the status of a route with respect to an associated Parent. - properties: - conditions: - description: "Conditions describes the status of the route with respect to the Gateway. Note that the route's availability is also subject to the Gateway's own status conditions and listener status. \n If the Route's ParentRef specifies an existing Gateway that supports Routes of this kind AND that Gateway's controller has sufficient access, then that Gateway's controller MUST set the \"Accepted\" condition on the Route, to indicate whether the route has been accepted or rejected by the Gateway, and why. \n A Route MUST be considered \"Accepted\" if at least one of the Route's rules is implemented by the Gateway. \n There are a number of cases where the \"Accepted\" condition may not be set due to lack of controller visibility, that includes when: \n * The Route refers to a non-existent parent. * The Route is of a type that the controller does not support. * The Route is in a namespace the controller does not have access to." - items: - description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, \n \ttype FooStatus struct{ \t // Represents the observations of a foo's current state. \t // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" \t // +patchMergeKey=type \t // +patchStrategy=merge \t // +listType=map \t // +listMapKey=type \t Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n \t // other fields \t}" - properties: - lastTransitionTime: - description: lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: message is a human readable message indicating details about the transition. This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. --- Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 8 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - controllerName: - description: "ControllerName is a domain/path string that indicates the name of the controller that wrote this status. This corresponds with the controllerName field on GatewayClass. \n Example: \"example.net/gateway-controller\". \n The format of this field is DOMAIN \"/\" PATH, where DOMAIN and PATH are valid Kubernetes names (https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names). \n Controllers MUST populate this field when writing status. Controllers should ensure that entries to status populated with their ControllerName are cleaned up when they are no longer necessary." - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$ - type: string - parentRef: - description: ParentRef corresponds with a ParentRef in the spec that this RouteParentStatus struct describes the status of. - properties: - group: - default: gateway.networking.k8s.io - description: "Group is the group of the referent. When unspecified, \"gateway.networking.k8s.io\" is inferred. To set the core API group (such as for a \"Service\" kind referent), Group must be explicitly set to \"\" (empty string). \n Support: Core" - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - default: Gateway - description: "Kind is kind of the referent. \n Support: Core (Gateway) \n Support: Implementation-specific (Other Resources)" - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - name: - description: "Name is the name of the referent. \n Support: Core" - maxLength: 253 - minLength: 1 - type: string - namespace: - description: "Namespace is the namespace of the referent. When unspecified, this refers to the local namespace of the Route. \n Note that there are specific rules for ParentRefs which cross namespace boundaries. Cross-namespace references are only valid if they are explicitly allowed by something in the namespace they are referring to. For example: Gateway has the AllowedRoutes field, and ReferenceGrant provides a generic way to enable any other kind of cross-namespace reference. \n Support: Core" - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - type: string - port: - description: "Port is the network port this Route targets. It can be interpreted differently based on the type of parent resource. \n When the parent resource is a Gateway, this targets all listeners listening on the specified port that also support this kind of Route(and select this Route). It's not recommended to set `Port` unless the networking behaviors specified in a Route must apply to a specific port as opposed to a listener(s) whose port(s) may be changed. When both Port and SectionName are specified, the name and port of the selected listener must match both specified values. \n Implementations MAY choose to support other parent resources. Implementations supporting other types of parent resources MUST clearly document how/if Port is interpreted. \n For the purpose of status, an attachment is considered successful as long as the parent resource accepts it partially. For example, Gateway listeners can restrict which Routes can attach to them by Route kind, namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from the referencing Route, the Route MUST be considered successfully attached. If no Gateway listeners accept attachment from this Route, the Route MUST be considered detached from the Gateway. \n Support: Extended \n " - format: int32 - maximum: 65535 - minimum: 1 - type: integer - sectionName: - description: "SectionName is the name of a section within the target resource. In the following resources, SectionName is interpreted as the following: \n * Gateway: Listener Name. When both Port (experimental) and SectionName are specified, the name and port of the selected listener must match both specified values. \n Implementations MAY choose to support attaching Routes to other resources. If that is the case, they MUST clearly document how SectionName is interpreted. \n When unspecified (empty string), this will reference the entire resource. For the purpose of status, an attachment is considered successful if at least one section in the parent resource accepts it. For example, Gateway listeners can restrict which Routes can attach to them by Route kind, namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from the referencing Route, the Route MUST be considered successfully attached. If no Gateway listeners accept attachment from this Route, the Route MUST be considered detached from the Gateway. \n Support: Core" - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - required: - - name - type: object - required: - - controllerName - - parentRef - type: object - maxItems: 32 - type: array - required: - - parents - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] -{{- end }} diff --git a/charts/consul/templates/create-federation-secret-job.yaml b/charts/consul/templates/create-federation-secret-job.yaml deleted file mode 100644 index 2092b97..0000000 --- a/charts/consul/templates/create-federation-secret-job.yaml +++ /dev/null @@ -1,147 +0,0 @@ -{{- if .Values.global.federation.createFederationSecret }} -{{- if not .Values.global.federation.enabled }}{{ fail "global.federation.enabled must be true when global.federation.createFederationSecret is true" }}{{ end }} -{{- if and (not .Values.global.acls.createReplicationToken) .Values.global.acls.manageSystemACLs }}{{ fail "global.acls.createReplicationToken must be true when global.acls.manageSystemACLs is true because the federation secret must include the replication token" }}{{ end }} -{{- if eq (int .Values.server.updatePartition) 0 }} -{{ template "consul.validateRequiredCloudSecretsExist" . }} -{{ template "consul.validateCloudSecretKeys" . }} -apiVersion: batch/v1 -kind: Job -metadata: - name: {{ template "consul.fullname" . }}-create-federation-secret - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: create-federation-secret - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 4 }} - {{- end }} - annotations: - "helm.sh/hook": post-install,post-upgrade - {{- /* Hook weight needs to be 1 so that the service account is provisioned first */}} - "helm.sh/hook-weight": "1" - "helm.sh/hook-delete-policy": hook-succeeded -spec: - template: - metadata: - name: {{ template "consul.fullname" . }}-create-federation-secret - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - release: {{ .Release.Name }} - component: create-federation-secret - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 8 }} - {{- end }} - annotations: - "consul.hashicorp.com/connect-inject": "false" - "consul.hashicorp.com/mesh-inject": "false" - spec: - restartPolicy: Never - serviceAccountName: {{ template "consul.fullname" . }}-create-federation-secret - {{- if .Values.client.tolerations }} - tolerations: - {{ tpl .Values.client.tolerations . | nindent 8 | trim }} - {{- end }} - {{- if .Values.client.priorityClassName }} - priorityClassName: {{ .Values.client.priorityClassName | quote }} - {{- end }} - {{- if .Values.client.nodeSelector }} - nodeSelector: - {{ tpl .Values.client.nodeSelector . | indent 8 | trim }} - {{- end }} - volumes: - {{- /* We can assume tls is enabled because there is a check in server-statefulset - that requires tls to be enabled if federation is enabled. */}} - - name: consul-ca-cert - secret: - {{- if .Values.global.tls.caCert.secretName }} - secretName: {{ .Values.global.tls.caCert.secretName }} - {{- else }} - secretName: {{ template "consul.fullname" . }}-ca-cert - {{- end }} - items: - - key: {{ default "tls.crt" .Values.global.tls.caCert.secretKey }} - path: tls.crt - - name: consul-ca-key - secret: - {{- if .Values.global.tls.caKey.secretName }} - secretName: {{ .Values.global.tls.caKey.secretName }} - {{- else }} - secretName: {{ template "consul.fullname" . }}-ca-key - {{- end }} - items: - - key: {{ default "tls.key" .Values.global.tls.caKey.secretKey }} - path: tls.key - {{- if (and .Values.global.gossipEncryption.secretName .Values.global.gossipEncryption.secretKey) }} - - name: gossip-encryption-key - secret: - secretName: {{ .Values.global.gossipEncryption.secretName }} - items: - - key: {{ .Values.global.gossipEncryption.secretKey }} - path: gossip.key - {{- else if .Values.global.gossipEncryption.autoGenerate }} - - name: gossip-encryption-key - secret: - secretName: {{ template "consul.fullname" . }}-gossip-encryption-key - items: - - key: key - path: gossip.key - {{- end }} - - containers: - - name: create-federation-secret - image: "{{ .Values.global.imageK8S }}" - {{ template "consul.imagePullPolicy" . }} - {{- include "consul.restrictedSecurityContext" . | nindent 10 }} - env: - - name: NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: CONSUL_HTTP_ADDR - value: "https://{{ template "consul.fullname" . }}-server.{{ .Release.Namespace }}.svc:8501" - - name: CONSUL_CACERT - value: /consul/tls/ca/tls.crt - volumeMounts: - - name: consul-ca-cert - mountPath: /consul/tls/ca - readOnly: true - - name: consul-ca-key - mountPath: /consul/tls/server/ca - readOnly: true - {{- if (or .Values.global.gossipEncryption.autoGenerate (and .Values.global.gossipEncryption.secretName .Values.global.gossipEncryption.secretKey)) }} - - name: gossip-encryption-key - mountPath: /consul/gossip - readOnly: true - {{- end }} - command: - - "/bin/sh" - - "-ec" - - | - exec consul-k8s-control-plane create-federation-secret \ - -log-level={{ default .Values.global.logLevel .Values.global.federation.logLevel }} \ - -log-json={{ .Values.global.logJSON }} \ - {{- if (or .Values.global.gossipEncryption.autoGenerate (and .Values.global.gossipEncryption.secretName .Values.global.gossipEncryption.secretKey)) }} - -gossip-key-file=/consul/gossip/gossip.key \ - {{- end }} - {{- if .Values.global.acls.createReplicationToken }} - -export-replication-token=true \ - {{- end }} - -mesh-gateway-service-name={{ .Values.meshGateway.consulServiceName }} \ - -k8s-namespace="${NAMESPACE}" \ - -resource-prefix="{{ template "consul.fullname" . }}" \ - -server-ca-cert-file=/consul/tls/ca/tls.crt \ - -server-ca-key-file=/consul/tls/server/ca/tls.key \ - -consul-api-timeout={{ .Values.global.consulAPITimeout }} - resources: - requests: - memory: "50Mi" - cpu: "50m" - limits: - memory: "50Mi" - cpu: "50m" -{{- end }} -{{- end }} diff --git a/charts/consul/templates/create-federation-secret-podsecuritypolicy.yaml b/charts/consul/templates/create-federation-secret-podsecuritypolicy.yaml deleted file mode 100644 index 8217311..0000000 --- a/charts/consul/templates/create-federation-secret-podsecuritypolicy.yaml +++ /dev/null @@ -1,42 +0,0 @@ -{{- if .Values.global.enablePodSecurityPolicies }} -{{- if .Values.global.federation.createFederationSecret }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "consul.fullname" . }}-create-federation-secret - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: create-federation-secret - annotations: - "helm.sh/hook": post-install,post-upgrade - "helm.sh/hook-delete-policy": hook-succeeded,before-hook-creation -spec: - privileged: false - # Required to prevent escalations to root. - allowPrivilegeEscalation: false - # This is redundant with non-root + disallow privilege escalation, - # but we can provide it for defense in depth. - requiredDropCapabilities: - - ALL - # Allow core volume types. - volumes: - - 'secret' - - 'emptyDir' - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'RunAsAny' - fsGroup: - rule: 'RunAsAny' - readOnlyRootFilesystem: false -{{- end }} -{{- end }} diff --git a/charts/consul/templates/create-federation-secret-role.yaml b/charts/consul/templates/create-federation-secret-role.yaml deleted file mode 100644 index 086932a..0000000 --- a/charts/consul/templates/create-federation-secret-role.yaml +++ /dev/null @@ -1,49 +0,0 @@ -{{- if .Values.global.federation.createFederationSecret }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: {{ template "consul.fullname" . }}-create-federation-secret - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: create-federation-secret - annotations: - "helm.sh/hook": post-install,post-upgrade - "helm.sh/hook-delete-policy": hook-succeeded,before-hook-creation -rules: - {{/* Must have separate rule for create secret permissions vs update because - can't set resourceNames for create (https://github.com/kubernetes/kubernetes/issues/80295) */}} - - apiGroups: [""] - resources: - - secrets - verbs: - - create - - apiGroups: [""] - resources: - - secrets - resourceNames: - - {{ template "consul.fullname" . }}-federation - verbs: - - update - {{- if .Values.global.acls.manageSystemACLs }} - - apiGroups: [""] - resources: - - secrets - resourceNames: - - {{ template "consul.fullname" . }}-acl-replication-acl-token - verbs: - - get - {{- end }} - {{- if .Values.global.enablePodSecurityPolicies }} - - apiGroups: ["policy"] - resources: - - podsecuritypolicies - verbs: - - use - resourceNames: - - {{ template "consul.fullname" . }}-create-federation-secret - {{- end }} -{{- end }} diff --git a/charts/consul/templates/create-federation-secret-rolebinding.yaml b/charts/consul/templates/create-federation-secret-rolebinding.yaml deleted file mode 100644 index 3db8e7c..0000000 --- a/charts/consul/templates/create-federation-secret-rolebinding.yaml +++ /dev/null @@ -1,23 +0,0 @@ -{{- if .Values.global.federation.createFederationSecret }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: {{ template "consul.fullname" . }}-create-federation-secret - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: create-federation-secret - annotations: - "helm.sh/hook": post-install,post-upgrade - "helm.sh/hook-delete-policy": hook-succeeded,before-hook-creation -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: {{ template "consul.fullname" . }}-create-federation-secret -subjects: -- kind: ServiceAccount - name: {{ template "consul.fullname" . }}-create-federation-secret -{{- end }} diff --git a/charts/consul/templates/create-federation-secret-serviceaccount.yaml b/charts/consul/templates/create-federation-secret-serviceaccount.yaml deleted file mode 100644 index e398ec6..0000000 --- a/charts/consul/templates/create-federation-secret-serviceaccount.yaml +++ /dev/null @@ -1,22 +0,0 @@ -{{- if .Values.global.federation.createFederationSecret }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "consul.fullname" . }}-create-federation-secret - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: create-federation-secret - annotations: - "helm.sh/hook": post-install,post-upgrade - "helm.sh/hook-delete-policy": hook-succeeded,before-hook-creation -{{- with .Values.global.imagePullSecrets }} -imagePullSecrets: -{{- range . }} - - name: {{ .name }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/consul/templates/datadog-agent-role.yaml b/charts/consul/templates/datadog-agent-role.yaml deleted file mode 100644 index 191e643..0000000 --- a/charts/consul/templates/datadog-agent-role.yaml +++ /dev/null @@ -1,38 +0,0 @@ -{{- if .Values.global.metrics.datadog.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: {{ template "consul.fullname" . }}-datadog-metrics - namespace: {{ .Release.Namespace }} - labels: - app: datadog - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: agent -{{- if (or (and .Values.global.openshift.enabled .Values.server.exposeGossipAndRPCPorts) .Values.global.enablePodSecurityPolicies) }} -{{- if .Values.global.enablePodSecurityPolicies }} -rules: - - apiGroups: ["policy"] - resources: ["podsecuritypolicies"] - resourceNames: - - {{ template "consul.fullname" . }}-datadog-metrics - verbs: - - use -{{- end }} -{{- if (and .Values.global.openshift.enabled .Values.server.exposeGossipAndRPCPorts ) }} - - apiGroups: ["security.openshift.io"] - resources: ["securitycontextconstraints"] - resourceNames: - - {{ template "consul.fullname" . }}-datadog-metrics - verbs: - - use -{{- end }} -{{- else}} -rules: - - apiGroups: [ "" ] - resources: [ "secrets" ] - resourceNames: - - {{ .Release.Namespace }}-datadog-agent-metrics-acl-token - verbs: [ "get", "watch", "list" ] -{{- end }} -{{- end }} \ No newline at end of file diff --git a/charts/consul/templates/datadog-agent-rolebinding.yaml b/charts/consul/templates/datadog-agent-rolebinding.yaml deleted file mode 100644 index 5fc3fdf..0000000 --- a/charts/consul/templates/datadog-agent-rolebinding.yaml +++ /dev/null @@ -1,26 +0,0 @@ -{{- if .Values.global.metrics.datadog.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: {{ template "consul.fullname" . }}-datadog-metrics - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: agent -subjects: - - kind: ServiceAccount - apiGroup: "" - name: datadog-agent - namespace: datadog - - kind: ServiceAccount - apiGroup: "" - name: datadog-cluster-agent - namespace: datadog -roleRef: - kind: Role - name: {{ template "consul.fullname" . }}-datadog-metrics - apiGroup: "" -{{- end }} \ No newline at end of file diff --git a/charts/consul/templates/dns-proxy-clusterrole.yaml b/charts/consul/templates/dns-proxy-clusterrole.yaml deleted file mode 100644 index 0ad128c..0000000 --- a/charts/consul/templates/dns-proxy-clusterrole.yaml +++ /dev/null @@ -1,34 +0,0 @@ -{{- if (or (and (ne (.Values.dns.proxy.enabled | toString) "-") .Values.dns.proxy.enabled) (and (eq (.Values.dns.proxy.enabled | toString) "-") .Values.global.enabled)) }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "consul.fullname" . }}-dns-proxy - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: dns-proxy -{{- if or .Values.global.acls.manageSystemACLs .Values.global.enablePodSecurityPolicies }} -rules: - {{- if .Values.global.acls.manageSystemACLs }} - - apiGroups: [""] - resources: - - secrets - resourceNames: - - {{ template "consul.fullname" . }}-dns-proxy-acl-token - verbs: - - get - {{- end }} - {{- if .Values.global.enablePodSecurityPolicies }} - - apiGroups: ["policy"] - resources: ["podsecuritypolicies"] - resourceNames: - - {{ template "consul.fullname" . }}-dns-proxy - verbs: - - use - {{- end }} - {{- else }} -rules: [] - {{- end }} -{{- end }} \ No newline at end of file diff --git a/charts/consul/templates/dns-proxy-clusterrolebinding.yaml b/charts/consul/templates/dns-proxy-clusterrolebinding.yaml deleted file mode 100644 index 346d09e..0000000 --- a/charts/consul/templates/dns-proxy-clusterrolebinding.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if (or (and (ne (.Values.dns.proxy.enabled | toString) "-") .Values.dns.proxy.enabled) (and (eq (.Values.dns.proxy.enabled | toString) "-") .Values.global.enabled)) }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "consul.fullname" . }}-dns-proxy - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: dns-proxy -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "consul.fullname" . }}-dns-proxy -subjects: - - kind: ServiceAccount - name: {{ template "consul.fullname" . }}-dns-proxy - namespace: {{ .Release.Namespace }} -{{- end }} diff --git a/charts/consul/templates/dns-proxy-deployment.yaml b/charts/consul/templates/dns-proxy-deployment.yaml deleted file mode 100644 index 3ef5440..0000000 --- a/charts/consul/templates/dns-proxy-deployment.yaml +++ /dev/null @@ -1,205 +0,0 @@ -{{- if (or (and (ne (.Values.dns.proxy.enabled | toString) "-") .Values.dns.proxy.enabled) (and (eq (.Values.dns.proxy.enabled | toString) "-") .Values.global.enabled)) }} -{{ template "consul.validateRequiredCloudSecretsExist" . }} -{{ template "consul.validateCloudSecretKeys" . }} - -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "consul.fullname" . }}-dns-proxy - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: dns-proxy - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 4 }} - {{- end }} -spec: - replicas: {{ .Values.dns.proxy.replicas }} - selector: - matchLabels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - release: {{ .Release.Name }} - component: dns-proxy - template: - metadata: - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - release: {{ .Release.Name }} - component: dns-proxy - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 8 }} - {{- end }} - annotations: - "consul.hashicorp.com/connect-inject": "false" - "consul.hashicorp.com/mesh-inject": "false" - {{- if (and .Values.global.secretsBackend.vault.enabled .Values.global.tls.enabled) }} - "vault.hashicorp.com/agent-init-first": "true" - "vault.hashicorp.com/agent-inject": "true" - "vault.hashicorp.com/role": {{ .Values.global.secretsBackend.vault.consulCARole }} - "vault.hashicorp.com/agent-inject-secret-serverca.crt": {{ .Values.global.tls.caCert.secretName }} - "vault.hashicorp.com/agent-inject-template-serverca.crt": {{ template "consul.serverTLSCATemplate" . }} - {{- if and .Values.global.secretsBackend.vault.ca.secretName .Values.global.secretsBackend.vault.ca.secretKey }} - "vault.hashicorp.com/agent-extra-secret": "{{ .Values.global.secretsBackend.vault.ca.secretName }}" - "vault.hashicorp.com/ca-cert": "/vault/custom/{{ .Values.global.secretsBackend.vault.ca.secretKey }}" - {{- end }} - {{- if .Values.global.secretsBackend.vault.agentAnnotations }} - {{ tpl .Values.global.secretsBackend.vault.agentAnnotations . | nindent 8 | trim }} - {{- end }} - {{- if (and (.Values.global.secretsBackend.vault.vaultNamespace) (not (hasKey (default "" .Values.global.secretsBackend.vault.agentAnnotations | fromYaml) "vault.hashicorp.com/namespace")))}} - "vault.hashicorp.com/namespace": "{{ .Values.global.secretsBackend.vault.vaultNamespace }}" - {{- end }} - {{- end }} - {{- if .Values.dns.annotations }} - {{- tpl .Values.dns.annotations . | nindent 8 }} - {{- end }} - spec: - terminationGracePeriodSeconds: 10 - serviceAccountName: {{ template "consul.fullname" . }}-dns-proxy - volumes: - - name: consul-service - emptyDir: - medium: "Memory" - {{- if .Values.global.tls.enabled }} - {{- if not (or (and .Values.externalServers.enabled .Values.externalServers.useSystemRoots) .Values.global.secretsBackend.vault.enabled) }} - - name: consul-ca-cert - secret: - {{- if .Values.global.tls.caCert.secretName }} - secretName: {{ .Values.global.tls.caCert.secretName }} - {{- else }} - secretName: {{ template "consul.fullname" . }}-ca-cert - {{- end }} - items: - - key: {{ default "tls.crt" .Values.global.tls.caCert.secretKey }} - path: tls.crt - {{- end }} - {{- end }} - containers: - - name: dns-proxy - image: {{ .Values.global.imageConsulDataplane | quote }} - volumeMounts: - - mountPath: /consul/service - name: consul-service - readOnly: true - {{- if .Values.global.tls.enabled }} - {{- if not (or (and .Values.externalServers.enabled .Values.externalServers.useSystemRoots) .Values.global.secretsBackend.vault.enabled) }} - - name: consul-ca-cert - mountPath: /consul/tls/ca - readOnly: true - {{- end }} - {{- end }} - env: - - name: NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: HOST_IP - valueFrom: - fieldRef: - fieldPath: status.hostIP - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - - name: DP_SERVICE_NODE_NAME - value: $(NODE_NAME)-virtual - {{- if .Values.global.acls.manageSystemACLs }} - - name: DP_CREDENTIAL_LOGIN_META1 - value: pod=$(NAMESPACE)/$(POD_NAME) - - name: DP_CREDENTIAL_LOGIN_META2 - value: component=dns-proxy - {{- else if (and .Values.dns.proxy.aclToken.secretName .Values.dns.proxy.aclToken.secretKey) }} - - name: DP_CREDENTIAL_STATIC_TOKEN - valueFrom: - secretKeyRef: - name: {{ .Values.dns.proxy.aclToken.secretName }} - key: {{ .Values.dns.proxy.aclToken.secretKey }} - {{- end }} - command: - - consul-dataplane - args: - - -consul-dns-bind-addr=0.0.0.0 - - -consul-dns-bind-port={{ .Values.dns.proxy.port }} - {{- if .Values.externalServers.enabled }} - - -addresses={{ .Values.externalServers.hosts | first }} - {{- else }} - - -addresses={{ template "consul.fullname" . }}-server.{{ .Release.Namespace }}.svc - {{- end }} - {{- if .Values.externalServers.enabled }} - - -grpc-port={{ .Values.externalServers.grpcPort }} - {{- else }} - - -grpc-port=8502 - {{- end }} - {{- if .Values.global.tls.enabled }} - {{- if (not (and .Values.externalServers.enabled .Values.externalServers.useSystemRoots)) }} - {{- if .Values.global.secretsBackend.vault.enabled }} - - -ca-certs=/vault/secrets/serverca.crt - {{- else }} - - -ca-certs=/consul/tls/ca/tls.crt - {{- end }} - {{- end }} - {{- if and .Values.externalServers.enabled .Values.externalServers.tlsServerName }} - - -tls-server-name={{.Values.externalServers.tlsServerName }} - {{- else if .Values.global.cloud.enabled }} - - -tls-server-name=server.{{ .Values.global.datacenter}}.{{ .Values.global.domain}} - {{- end }} - {{- else }} - - -tls-disabled - {{- end }} - {{- if .Values.global.acls.manageSystemACLs }} - - -credential-type=login - - -login-bearer-token-path=/var/run/secrets/kubernetes.io/serviceaccount/token - {{- if and .Values.global.federation.enabled .Values.global.federation.primaryDatacenter }} - - -login-auth-method={{ template "consul.fullname" . }}-k8s-component-auth-method-{{ .Values.global.datacenter }} - - -login-datacenter={{ .Values.global.federation.primaryDatacenter }} - {{- else }} - - -login-auth-method={{ template "consul.fullname" . }}-k8s-component-auth-method - {{- end }} - {{- if .Values.global.adminPartitions.enabled }} - - -login-partition={{ .Values.global.adminPartitions.name }} - {{- end }} - {{- else }} - - -credential-type=static - {{- end }} - {{- if .Values.global.adminPartitions.enabled }} - - -service-partition={{ .Values.global.adminPartitions.name }} - {{- end }} - - -log-level={{ default .Values.global.logLevel .Values.dns.proxy.logLevel }} - - -log-json={{ .Values.global.logJSON }} - - {{- if and .Values.externalServers.enabled .Values.externalServers.skipServerWatch }} - - -server-watch-disabled=true - {{- end }} - - -mode=dns-proxy - livenessProbe: - tcpSocket: - port: {{ .Values.dns.proxy.port }} - failureThreshold: 3 - initialDelaySeconds: 30 - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 5 - readinessProbe: - tcpSocket: - port: {{ .Values.dns.proxy.port }} - failureThreshold: 3 - initialDelaySeconds: 10 - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 5 - ports: - - containerPort: {{ .Values.dns.proxy.port }} - protocol: "TCP" - name: dns-tcp - - containerPort: {{ .Values.dns.proxy.port }} - protocol: "UDP" - name: dns-udp -{{- end }} \ No newline at end of file diff --git a/charts/consul/templates/dns-proxy-service.yaml b/charts/consul/templates/dns-proxy-service.yaml deleted file mode 100644 index f3f9624..0000000 --- a/charts/consul/templates/dns-proxy-service.yaml +++ /dev/null @@ -1,39 +0,0 @@ -{{- if (or (and (ne (.Values.dns.proxy.enabled | toString) "-") .Values.dns.proxy.enabled) (and (eq (.Values.dns.proxy.enabled | toString) "-") .Values.global.enabled)) }} - -apiVersion: v1 -kind: Service -metadata: - name: {{ template "consul.fullname" . }}-dns-proxy - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: dns-proxy -{{- if .Values.dns.annotations }} - annotations: - {{ tpl .Values.dns.annotations . | nindent 4 | trim }} -{{- end }} -spec: - selector: - app: {{ template "consul.name" . }} - release: "{{ .Release.Name }}" - component: dns-proxy -{{- if .Values.dns.type }} - type: {{ .Values.dns.type }} -{{- end }} -{{- if .Values.dns.clusterIP }} - clusterIP: {{ .Values.dns.clusterIP }} -{{- end }} - ports: - - name: dns-tcp - port: {{ .Values.dns.proxy.port }} - protocol: "TCP" - targetPort: dns-tcp - - name: dns-udp - port: {{ .Values.dns.proxy.port }} - protocol: "UDP" - targetPort: dns-udp ---- -{{- end }} diff --git a/charts/consul/templates/dns-proxy-serviceaccount.yaml b/charts/consul/templates/dns-proxy-serviceaccount.yaml deleted file mode 100644 index 74c88ec..0000000 --- a/charts/consul/templates/dns-proxy-serviceaccount.yaml +++ /dev/null @@ -1,19 +0,0 @@ -{{- if (or (and (ne (.Values.dns.proxy.enabled | toString) "-") .Values.dns.proxy.enabled) (and (eq (.Values.dns.proxy.enabled | toString) "-") .Values.global.enabled)) }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "consul.fullname" . }}-dns-proxy - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: dns-proxy -{{- with .Values.global.imagePullSecrets }} -imagePullSecrets: -{{- range . }} - - name: {{ .name }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/consul/templates/dns-service.yaml b/charts/consul/templates/dns-service.yaml deleted file mode 100644 index 740c816..0000000 --- a/charts/consul/templates/dns-service.yaml +++ /dev/null @@ -1,43 +0,0 @@ -{{- if (or (and (ne (.Values.dns.enabled | toString) "-") .Values.dns.enabled) (and (eq (.Values.dns.enabled | toString) "-") .Values.connectInject.transparentProxy.defaultEnabled)) }} -{{- if not .Values.dns.proxy.enabled }} -# Service for Consul DNS. -apiVersion: v1 -kind: Service -metadata: - name: {{ template "consul.fullname" . }}-dns - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: dns - {{- if .Values.dns.annotations }} - annotations: - {{ tpl .Values.dns.annotations . | nindent 4 | trim }} - {{- end }} -spec: -{{- if .Values.dns.type }} - type: {{ .Values.dns.type }} -{{- end }} -{{- if .Values.dns.clusterIP }} - clusterIP: {{ .Values.dns.clusterIP }} -{{- end }} - ports: - - name: dns-tcp - port: 53 - protocol: "TCP" - targetPort: dns-tcp - - name: dns-udp - port: 53 - protocol: "UDP" - targetPort: dns-udp - selector: - app: {{ template "consul.name" . }} - release: "{{ .Release.Name }}" - hasDNS: "true" - {{- if .Values.dns.additionalSpec }} - {{ tpl .Values.dns.additionalSpec . | nindent 2 | trim }} - {{- end }} -{{- end }} -{{- end }} diff --git a/charts/consul/templates/enterprise-license-job.yaml b/charts/consul/templates/enterprise-license-job.yaml deleted file mode 100644 index 9dd0281..0000000 --- a/charts/consul/templates/enterprise-license-job.yaml +++ /dev/null @@ -1,147 +0,0 @@ -{{- if .Values.server.enterpriseLicense }}{{ fail "server.enterpriseLicense has been moved to global.enterpriseLicense" }}{{ end -}} -{{- if (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) }} -{{- if (and .Values.global.enterpriseLicense.secretName .Values.global.enterpriseLicense.secretKey (not .Values.global.enterpriseLicense.enableLicenseAutoload)) }} -apiVersion: batch/v1 -kind: Job -metadata: - name: {{ template "consul.fullname" . }}-enterprise-license - namespace: {{ .Release.Namespace }} - labels: - app.kubernetes.io/managed-by: {{.Release.Service | quote }} - app.kubernetes.io/instance: {{.Release.Name | quote }} - helm.sh/chart: "{{.Chart.Name}}-{{.Chart.Version}}" - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: license - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 4 }} - {{- end }} - annotations: - "helm.sh/hook": post-install,post-upgrade - "helm.sh/hook-weight": "100" - "helm.sh/hook-delete-policy": hook-succeeded -spec: - template: - metadata: - name: {{ template "consul.fullname" . }}-license - labels: - app.kubernetes.io/managed-by: {{.Release.Service | quote }} - app.kubernetes.io/instance: {{.Release.Name | quote }} - helm.sh/chart: "{{.Chart.Name}}-{{.Chart.Version}}" - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - release: {{ .Release.Name }} - component: license - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 8 }} - {{- end }} - annotations: - "consul.hashicorp.com/connect-inject": "false" - "consul.hashicorp.com/mesh-inject": "false" - spec: - restartPolicy: Never - serviceAccountName: {{ template "consul.fullname" . }}-enterprise-license - {{- if .Values.global.tls.enabled }} - volumes: - - name: consul-ca-cert - secret: - {{- if .Values.global.tls.caCert.secretName }} - secretName: {{ .Values.global.tls.caCert.secretName }} - {{- else }} - secretName: {{ template "consul.fullname" . }}-ca-cert - {{- end }} - items: - - key: {{ default "tls.crt" .Values.global.tls.caCert.secretKey }} - path: tls.crt - {{- end }} - containers: - - name: apply-enterprise-license - image: "{{ default .Values.global.image .Values.server.image }}" - {{ template "consul.imagePullPolicy" . }} - env: - - name: ENTERPRISE_LICENSE - {{- if .Values.global.secretsBackend.vault.enabled }} - value: /vault/secrets/enterpriselicense.txt - {{- else }} - valueFrom: - secretKeyRef: - name: {{ .Values.global.enterpriseLicense.secretName }} - key: {{ .Values.global.enterpriseLicense.secretKey }} - {{- end }} - - name: CONSUL_HTTP_ADDR - {{- if .Values.global.tls.enabled }} - value: https://{{ template "consul.fullname" . }}-server:8501 - {{- else }} - value: http://{{ template "consul.fullname" . }}-server:8500 - {{- end }} - {{- if .Values.global.tls.enabled }} - - name: CONSUL_CACERT - value: /consul/tls/ca/tls.crt - {{- end}} - {{- if .Values.global.acls.manageSystemACLs }} - - name: CONSUL_HTTP_TOKEN - valueFrom: - secretKeyRef: - name: "{{ template "consul.fullname" . }}-enterprise-license-acl-token" - key: "token" - {{- end}} - command: - - "/bin/sh" - - "-c" - - | - # Create a script that we can execute with the timeout command. - mkdir -p /tmp/scripts/ - cat > /tmp/scripts/apply-license.sh << 'EOF' - #!/bin/sh - while true; do - echo "Applying license..." - if consul license put "${ENTERPRISE_LICENSE}" 2>&1; then - echo "License applied successfully" - break - fi - echo "Retrying in 2s..." - sleep 2 - done - EOF - chmod +x /tmp/scripts/apply-license.sh - - # Time out after 20 minutes. Use || to support new timeout versions that don't accept -t - timeout -t 1200 /tmp/scripts/apply-license.sh 2> /dev/null || timeout 1200 /tmp/scripts/apply-license.sh 2> /dev/null - {{- if .Values.global.tls.enabled }} - volumeMounts: - - name: consul-ca-cert - mountPath: /consul/tls/ca - readOnly: true - {{- end }} - resources: - requests: - memory: "50Mi" - cpu: "50m" - limits: - memory: "50Mi" - cpu: "50m" - {{- if .Values.global.acls.manageSystemACLs }} - initContainers: - - name: ent-license-acl-init - image: {{ .Values.global.imageK8S }} - {{ template "consul.imagePullPolicy" . }} - command: - - "/bin/sh" - - "-ec" - - | - exec consul-k8s-control-plane acl-init \ - -secret-name="{{ template "consul.fullname" . }}-enterprise-license-acl-token" \ - -k8s-namespace={{ .Release.Namespace }} \ - -consul-api-timeout={{ .Values.global.consulAPITimeout }} - resources: - requests: - memory: "25Mi" - cpu: "50m" - limits: - memory: "25Mi" - cpu: "50m" - {{- end }} -{{- end }} -{{- end }} diff --git a/charts/consul/templates/enterprise-license-podsecuritypolicy.yaml b/charts/consul/templates/enterprise-license-podsecuritypolicy.yaml deleted file mode 100644 index cf96367..0000000 --- a/charts/consul/templates/enterprise-license-podsecuritypolicy.yaml +++ /dev/null @@ -1,39 +0,0 @@ -{{- if (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) }} -{{- if (and .Values.global.enterpriseLicense.secretName .Values.global.enterpriseLicense.secretKey (not .Values.global.enterpriseLicense.enableLicenseAutoload)) }} -{{- if .Values.global.enablePodSecurityPolicies }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "consul.fullname" . }}-enterprise-license - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: license -spec: - privileged: false - # Allow core volume types. - volumes: - - 'secret' - allowPrivilegeEscalation: false - # This is redundant with non-root + disallow privilege escalation, - # but we can provide it for defense in depth. - requiredDropCapabilities: - - ALL - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'RunAsAny' - fsGroup: - rule: 'RunAsAny' - readOnlyRootFilesystem: false -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/consul/templates/enterprise-license-role.yaml b/charts/consul/templates/enterprise-license-role.yaml deleted file mode 100644 index 6a1b7fd..0000000 --- a/charts/consul/templates/enterprise-license-role.yaml +++ /dev/null @@ -1,37 +0,0 @@ -{{- if (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) }} -{{- if (and .Values.global.enterpriseLicense.secretName .Values.global.enterpriseLicense.secretKey (not .Values.global.enterpriseLicense.enableLicenseAutoload)) }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: {{ template "consul.fullname" . }}-enterprise-license - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: license -{{- if or .Values.global.acls.manageSystemACLs .Values.global.enablePodSecurityPolicies }} -rules: -{{- if .Values.global.acls.manageSystemACLs }} - - apiGroups: [""] - resources: - - secrets - resourceNames: - - {{ template "consul.fullname" . }}-enterprise-license-acl-token - verbs: - - get -{{- end }} -{{- if .Values.global.enablePodSecurityPolicies }} - - apiGroups: ["policy"] - resources: ["podsecuritypolicies"] - resourceNames: - - {{ template "consul.fullname" . }}-enterprise-license - verbs: - - use -{{- end }} -{{- else }} -rules: [] -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/consul/templates/enterprise-license-rolebinding.yaml b/charts/consul/templates/enterprise-license-rolebinding.yaml deleted file mode 100644 index a21118b..0000000 --- a/charts/consul/templates/enterprise-license-rolebinding.yaml +++ /dev/null @@ -1,22 +0,0 @@ -{{- if (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) }} -{{- if (and .Values.global.enterpriseLicense.secretName .Values.global.enterpriseLicense.secretKey (not .Values.global.enterpriseLicense.enableLicenseAutoload)) }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: {{ template "consul.fullname" . }}-enterprise-license - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: license -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: {{ template "consul.fullname" . }}-enterprise-license -subjects: - - kind: ServiceAccount - name: {{ template "consul.fullname" . }}-enterprise-license -{{- end }} -{{- end }} diff --git a/charts/consul/templates/enterprise-license-serviceaccount.yaml b/charts/consul/templates/enterprise-license-serviceaccount.yaml deleted file mode 100644 index 31c9da8..0000000 --- a/charts/consul/templates/enterprise-license-serviceaccount.yaml +++ /dev/null @@ -1,21 +0,0 @@ -{{- if (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) }} -{{- if (and .Values.global.enterpriseLicense.secretName .Values.global.enterpriseLicense.secretKey (not .Values.global.enterpriseLicense.enableLicenseAutoload)) }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "consul.fullname" . }}-enterprise-license - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: license -{{- with .Values.global.imagePullSecrets }} -imagePullSecrets: -{{- range . }} - - name: {{ .name }} -{{- end }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/consul/templates/expose-servers-service.yaml b/charts/consul/templates/expose-servers-service.yaml deleted file mode 100644 index d86cec9..0000000 --- a/charts/consul/templates/expose-servers-service.yaml +++ /dev/null @@ -1,63 +0,0 @@ -{{- $serverEnabled := (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) -}} -{{- $serverExposeServiceEnabled := (or (and (ne (.Values.server.exposeService.enabled | toString) "-") .Values.server.exposeService.enabled) (and (eq (.Values.server.exposeService.enabled | toString) "-") .Values.global.adminPartitions.enabled)) -}} -{{- if (and $serverEnabled $serverExposeServiceEnabled) }} - -# Service with an external IP to reach Consul servers. -# Used for exposing gRPC port for peering and ports for client partitions to discover servers. -apiVersion: v1 -kind: Service -metadata: - name: {{ template "consul.fullname" . }}-expose-servers - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: server - annotations: - {{- if .Values.server.exposeService.annotations }} - {{ tpl .Values.server.exposeService.annotations . | nindent 4 | trim }} - {{- end }} -spec: - type: "{{ .Values.server.exposeService.type }}" - ports: - {{- if (or (not .Values.global.tls.enabled) (not .Values.global.tls.httpsOnly)) }} - - name: http - port: 8500 - targetPort: 8500 - {{ if (and (eq .Values.server.exposeService.type "NodePort") .Values.server.exposeService.nodePort.http) }} - nodePort: {{ .Values.server.exposeService.nodePort.http }} - {{- end }} - {{- end }} - {{- if .Values.global.tls.enabled }} - - name: https - port: 8501 - targetPort: 8501 - {{ if (and (eq .Values.server.exposeService.type "NodePort") .Values.server.exposeService.nodePort.https) }} - nodePort: {{ .Values.server.exposeService.nodePort.https }} - {{- end }} - {{- end }} - - name: serflan - port: 8301 - targetPort: 8301 - {{ if (and (eq .Values.server.exposeService.type "NodePort") .Values.server.exposeService.nodePort.serf) }} - nodePort: {{ .Values.server.exposeService.nodePort.serf }} - {{- end }} - - name: rpc - port: 8300 - targetPort: 8300 - {{ if (and (eq .Values.server.exposeService.type "NodePort") .Values.server.exposeService.nodePort.rpc) }} - nodePort: {{ .Values.server.exposeService.nodePort.rpc }} - {{- end }} - - name: grpc - port: 8502 - targetPort: 8502 - {{ if (and (eq .Values.server.exposeService.type "NodePort") .Values.server.exposeService.nodePort.grpc) }} - nodePort: {{ .Values.server.exposeService.nodePort.grpc }} - {{- end }} - selector: - app: {{ template "consul.name" . }} - release: "{{ .Release.Name }}" - component: server -{{- end }} diff --git a/charts/consul/templates/gateway-cleanup-clusterrole.yaml b/charts/consul/templates/gateway-cleanup-clusterrole.yaml deleted file mode 100644 index c533a88..0000000 --- a/charts/consul/templates/gateway-cleanup-clusterrole.yaml +++ /dev/null @@ -1,35 +0,0 @@ -{{- if .Values.connectInject.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "consul.fullname" . }}-gateway-cleanup - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: gateway-cleanup -rules: - - apiGroups: - - consul.hashicorp.com - resources: - - gatewayclassconfigs - verbs: - - get - - delete - - apiGroups: - - gateway.networking.k8s.io - resources: - - gatewayclasses - verbs: - - get - - delete -{{- if .Values.global.enablePodSecurityPolicies }} - - apiGroups: ["policy"] - resources: ["podsecuritypolicies"] - resourceNames: - - {{ template "consul.fullname" . }}-gateway-cleanup - verbs: - - use -{{- end }} -{{- end }} diff --git a/charts/consul/templates/gateway-cleanup-clusterrolebinding.yaml b/charts/consul/templates/gateway-cleanup-clusterrolebinding.yaml deleted file mode 100644 index 9235f32..0000000 --- a/charts/consul/templates/gateway-cleanup-clusterrolebinding.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if .Values.connectInject.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "consul.fullname" . }}-gateway-cleanup - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: gateway-cleanup -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "consul.fullname" . }}-gateway-cleanup -subjects: - - kind: ServiceAccount - name: {{ template "consul.fullname" . }}-gateway-cleanup - namespace: {{ .Release.Namespace }} -{{- end }} \ No newline at end of file diff --git a/charts/consul/templates/gateway-cleanup-job.yaml b/charts/consul/templates/gateway-cleanup-job.yaml deleted file mode 100644 index 0d38f6e..0000000 --- a/charts/consul/templates/gateway-cleanup-job.yaml +++ /dev/null @@ -1,68 +0,0 @@ -{{- if .Values.connectInject.enabled }} -apiVersion: batch/v1 -kind: Job -metadata: - name: {{ template "consul.fullname" . }}-gateway-cleanup - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: gateway-cleanup - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 4 }} - {{- end }} - annotations: - "helm.sh/hook": pre-delete - "helm.sh/hook-weight": "0" - "helm.sh/hook-delete-policy": hook-succeeded,hook-failed -spec: - template: - metadata: - name: {{ template "consul.fullname" . }}-gateway-cleanup - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - release: {{ .Release.Name }} - component: gateway-cleanup - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 8 }} - {{- end }} - annotations: - "consul.hashicorp.com/connect-inject": "false" - "consul.hashicorp.com/mesh-inject": "false" - spec: - restartPolicy: Never - serviceAccountName: {{ template "consul.fullname" . }}-gateway-cleanup - containers: - - name: gateway-cleanup - image: {{ .Values.global.imageK8S }} - {{ template "consul.imagePullPolicy" . }} - {{- include "consul.restrictedSecurityContext" . | nindent 10 }} - command: - - consul-k8s-control-plane - args: - - gateway-cleanup - - -gateway-class-name=consul - - -gateway-class-config-name=consul-api-gateway - resources: - requests: - memory: "50Mi" - cpu: "50m" - limits: - memory: "50Mi" - cpu: "50m" - volumeMounts: - - name: config - mountPath: /consul/config - readOnly: true - {{- if .Values.global.acls.tolerations }} - tolerations: - {{ tpl .Values.global.acls.tolerations . | indent 8 | trim }} - {{- end }} - volumes: - - name: config - configMap: - name: {{ template "consul.fullname" . }}-gateway-resources-config -{{- end }} diff --git a/charts/consul/templates/gateway-cleanup-podsecuritypolicy.yaml b/charts/consul/templates/gateway-cleanup-podsecuritypolicy.yaml deleted file mode 100644 index ffbad13..0000000 --- a/charts/consul/templates/gateway-cleanup-podsecuritypolicy.yaml +++ /dev/null @@ -1,32 +0,0 @@ -{{- if (and .Values.connectInject.enabled .Values.global.enablePodSecurityPolicies)}} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "consul.fullname" . }}-gateway-cleanup - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: gateway-cleanup -spec: - privileged: false - allowPrivilegeEscalation: false - # This is redundant with non-root + disallow privilege escalation, - # but we can provide it for defense in depth. - requiredDropCapabilities: - - ALL - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'RunAsAny' - fsGroup: - rule: 'RunAsAny' - readOnlyRootFilesystem: false -{{- end }} diff --git a/charts/consul/templates/gateway-cleanup-serviceaccount.yaml b/charts/consul/templates/gateway-cleanup-serviceaccount.yaml deleted file mode 100644 index 52c340f..0000000 --- a/charts/consul/templates/gateway-cleanup-serviceaccount.yaml +++ /dev/null @@ -1,19 +0,0 @@ -{{- if .Values.connectInject.enabled }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "consul.fullname" . }}-gateway-cleanup - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: gateway-cleanup -{{- with .Values.global.imagePullSecrets }} -imagePullSecrets: -{{- range . }} - - name: {{ .name }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/consul/templates/gateway-resources-clusterrole.yaml b/charts/consul/templates/gateway-resources-clusterrole.yaml deleted file mode 100644 index c3bdfeb..0000000 --- a/charts/consul/templates/gateway-resources-clusterrole.yaml +++ /dev/null @@ -1,37 +0,0 @@ -{{- if .Values.connectInject.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "consul.fullname" . }}-gateway-resources - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: gateway-resources -rules: - - apiGroups: - - consul.hashicorp.com - resources: - - gatewayclassconfigs - verbs: - - get - - update - - create - - apiGroups: - - gateway.networking.k8s.io - resources: - - gatewayclasses - verbs: - - get - - update - - create -{{- if .Values.global.enablePodSecurityPolicies }} - - apiGroups: ["policy"] - resources: ["podsecuritypolicies"] - resourceNames: - - {{ template "consul.fullname" . }}-gateway-resources - verbs: - - use -{{- end }} -{{- end }} diff --git a/charts/consul/templates/gateway-resources-clusterrolebinding.yaml b/charts/consul/templates/gateway-resources-clusterrolebinding.yaml deleted file mode 100644 index 921df23..0000000 --- a/charts/consul/templates/gateway-resources-clusterrolebinding.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if .Values.connectInject.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "consul.fullname" . }}-gateway-resources - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: gateway-resources -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "consul.fullname" . }}-gateway-resources -subjects: - - kind: ServiceAccount - name: {{ template "consul.fullname" . }}-gateway-resources - namespace: {{ .Release.Namespace }} -{{- end }} \ No newline at end of file diff --git a/charts/consul/templates/gateway-resources-configmap.yaml b/charts/consul/templates/gateway-resources-configmap.yaml deleted file mode 100644 index 9b17504..0000000 --- a/charts/consul/templates/gateway-resources-configmap.yaml +++ /dev/null @@ -1,24 +0,0 @@ -{{- if .Values.connectInject.enabled }} - -# Validation -# For meshGateway.wanAddress, static must be set if source is "Static" -{{if (and (eq .Values.meshGateway.wanAddress.source "Static") (eq .Values.meshGateway.wanAddress.static ""))}}{{fail ".meshGateway.wanAddress.static must be set to a value if .meshGateway.wanAddress.source is Static"}}{{ end }} - -# Configuration of Gateway Resources Job which creates managed Gateway configuration. -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ template "consul.fullname" . }}-gateway-resources-config - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: gateway-resources -data: - {{- if .Values.connectInject.apiGateway.managedGatewayClass.resources }} - resources.json: | - {{ toJson .Values.connectInject.apiGateway.managedGatewayClass.resources }} - {{- end }} -{{- end }} diff --git a/charts/consul/templates/gateway-resources-job.yaml b/charts/consul/templates/gateway-resources-job.yaml deleted file mode 100644 index ff53129..0000000 --- a/charts/consul/templates/gateway-resources-job.yaml +++ /dev/null @@ -1,109 +0,0 @@ -{{- if .Values.apiGateway}}{{fail "[DEPRECATED and REMOVED] the apiGateway stanza is no longer supported as of Consul 1.19.0. Use connectInject.apiGateway instead."}}{{- end -}} -{{- if .Values.connectInject.enabled }} -apiVersion: batch/v1 -kind: Job -metadata: - name: {{ template "consul.fullname" . }}-gateway-resources - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: gateway-resources - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 4 }} - {{- end }} - annotations: - "helm.sh/hook": post-install,post-upgrade - "helm.sh/hook-weight": "0" - "helm.sh/hook-delete-policy": hook-succeeded -spec: - template: - metadata: - name: {{ template "consul.fullname" . }}-gateway-resources - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - release: {{ .Release.Name }} - component: gateway-resources - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 8 }} - {{- end }} - annotations: - "consul.hashicorp.com/connect-inject": "false" - "consul.hashicorp.com/mesh-inject": "false" - spec: - restartPolicy: Never - serviceAccountName: {{ template "consul.fullname" . }}-gateway-resources - containers: - - name: gateway-resources - image: {{ .Values.global.imageK8S }} - {{ template "consul.imagePullPolicy" . }} - {{- include "consul.restrictedSecurityContext" . | nindent 10 }} - command: - - consul-k8s-control-plane - args: - - gateway-resources - - -gateway-class-name=consul - - -gateway-class-config-name=consul-api-gateway - - -controller-name=consul.hashicorp.com/gateway-controller - - -app={{template "consul.name" .}} - - -chart={{template "consul.chart" .}} - - -heritage={{ .Release.Service }} - - -release-name={{ .Release.Name }} - - -component=api-gateway - {{- if .Values.connectInject.apiGateway.managedGatewayClass.deployment }} - {{- if .Values.connectInject.apiGateway.managedGatewayClass.deployment.defaultInstances }} - - -deployment-default-instances={{ .Values.connectInject.apiGateway.managedGatewayClass.deployment.defaultInstances }} - {{- end}} - {{- if .Values.connectInject.apiGateway.managedGatewayClass.deployment.maxInstances }} - - -deployment-max-instances={{ .Values.connectInject.apiGateway.managedGatewayClass.deployment.maxInstances }} - {{- end}} - {{- if .Values.connectInject.apiGateway.managedGatewayClass.deployment.minInstances }} - - -deployment-min-instances={{ .Values.connectInject.apiGateway.managedGatewayClass.deployment.minInstances }} - {{- end}} - {{- end}} - {{- if .Values.connectInject.apiGateway.managedGatewayClass.nodeSelector }} - - -node-selector - - {{- toYaml .Values.connectInject.apiGateway.managedGatewayClass.nodeSelector | nindent 14 -}} - {{- end }} - {{- if .Values.connectInject.apiGateway.managedGatewayClass.tolerations }} - - -tolerations - - {{- toYaml .Values.connectInject.apiGateway.managedGatewayClass.tolerations | nindent 14 -}} - {{- end }} - {{- if .Values.connectInject.apiGateway.managedGatewayClass.copyAnnotations.service }} - - -service-annotations - - {{- toYaml .Values.connectInject.apiGateway.managedGatewayClass.copyAnnotations.service.annotations | nindent 14 -}} - {{- end }} - - -service-type={{ .Values.connectInject.apiGateway.managedGatewayClass.serviceType }} - {{- if .Values.global.openshift.enabled }} - - -openshift-scc-name={{ .Values.connectInject.apiGateway.managedGatewayClass.openshiftSCCName }} - {{- end }} - - -map-privileged-container-ports={{ .Values.connectInject.apiGateway.managedGatewayClass.mapPrivilegedContainerPorts }} - {{- if (ne (.Values.connectInject.apiGateway.managedGatewayClass.metrics.enabled | toString) "-") }} - - -enable-metrics={{ .Values.connectInject.apiGateway.managedGatewayClass.metrics.enabled | toString }} - {{- end }} - {{- if .Values.connectInject.apiGateway.managedGatewayClass.metrics.path }} - - -metrics-path={{ .Values.connectInject.apiGateway.managedGatewayClass.metrics.path }} - {{- end }} - {{- if .Values.connectInject.apiGateway.managedGatewayClass.metrics.port }} - - -metrics-port={{ .Values.connectInject.apiGateway.managedGatewayClass.metrics.port }} - {{- end }} - {{- with .Values.connectInject.apiGateway.managedGatewayClass.resourceJob.resources }} - resources: - {{- toYaml . | nindent 12 }} - {{- end }} - volumeMounts: - - name: config - mountPath: /consul/config - readOnly: true - {{- if .Values.global.acls.tolerations }} - tolerations: - {{ tpl .Values.global.acls.tolerations . | indent 8 | trim }} - {{- end }} - volumes: - - name: config - configMap: - name: {{ template "consul.fullname" . }}-gateway-resources-config -{{- end }} diff --git a/charts/consul/templates/gateway-resources-podsecuritypolicy.yaml b/charts/consul/templates/gateway-resources-podsecuritypolicy.yaml deleted file mode 100644 index da52991..0000000 --- a/charts/consul/templates/gateway-resources-podsecuritypolicy.yaml +++ /dev/null @@ -1,32 +0,0 @@ -{{- if (and .Values.global.enablePodSecurityPolicies .Values.connectInject.enabled)}} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "consul.fullname" . }}-gateway-resources - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: gateway-resources -spec: - privileged: false - allowPrivilegeEscalation: false - # This is redundant with non-root + disallow privilege escalation, - # but we can provide it for defense in depth. - requiredDropCapabilities: - - ALL - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'RunAsAny' - fsGroup: - rule: 'RunAsAny' - readOnlyRootFilesystem: false -{{- end }} diff --git a/charts/consul/templates/gateway-resources-serviceaccount.yaml b/charts/consul/templates/gateway-resources-serviceaccount.yaml deleted file mode 100644 index db3a449..0000000 --- a/charts/consul/templates/gateway-resources-serviceaccount.yaml +++ /dev/null @@ -1,19 +0,0 @@ -{{- if .Values.connectInject.enabled }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "consul.fullname" . }}-gateway-resources - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: gateway-resources -{{- with .Values.global.imagePullSecrets }} -imagePullSecrets: -{{- range . }} - - name: {{ .name }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/consul/templates/gossip-encryption-autogenerate-job.yaml b/charts/consul/templates/gossip-encryption-autogenerate-job.yaml deleted file mode 100644 index 485064f..0000000 --- a/charts/consul/templates/gossip-encryption-autogenerate-job.yaml +++ /dev/null @@ -1,71 +0,0 @@ -{{- if .Values.global.gossipEncryption.autoGenerate }} -{{- if (or .Values.global.gossipEncryption.secretName .Values.global.gossipEncryption.secretKey) }} - {{ fail "If global.gossipEncryption.autoGenerate is true, global.gossipEncryption.secretName and global.gossipEncryption.secretKey must not be set." }} -{{ end }} -# automatically generate encryption key for gossip protocol and save it in Kubernetes secret -apiVersion: batch/v1 -kind: Job -metadata: - name: {{ template "consul.fullname" . }}-gossip-encryption-autogenerate - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: gossip-encryption-autogenerate - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 4 }} - {{- end }} - annotations: - "helm.sh/hook": pre-install,pre-upgrade - "helm.sh/hook-weight": "1" - "helm.sh/hook-delete-policy": hook-succeeded,before-hook-creation -spec: - template: - metadata: - name: {{ template "consul.fullname" . }}-gossip-encryption-autogenerate - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - release: {{ .Release.Name }} - component: gossip-encryption-autogenerate - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 8 }} - {{- end }} - annotations: - "consul.hashicorp.com/connect-inject": "false" - "consul.hashicorp.com/mesh-inject": "false" - spec: - restartPolicy: Never - serviceAccountName: {{ template "consul.fullname" . }}-gossip-encryption-autogenerate - {{- if not .Values.global.openshift.enabled }} - securityContext: - runAsNonRoot: true - runAsGroup: 1000 - runAsUser: 100 - fsGroup: 1000 - {{- end }} - containers: - - name: gossip-encryption-autogen - image: "{{ .Values.global.imageK8S }}" - {{ template "consul.imagePullPolicy" . }} - {{- include "consul.restrictedSecurityContext" . | nindent 10 }} - command: - - "/bin/sh" - - "-ec" - - | - exec consul-k8s-control-plane gossip-encryption-autogenerate \ - -namespace={{ .Release.Namespace }} \ - -secret-name={{ template "consul.fullname" . }}-gossip-encryption-key \ - -secret-key="key" \ - -log-level={{ default .Values.global.logLevel .Values.global.gossipEncryption.logLevel }} \ - -log-json={{ .Values.global.logJSON }} - resources: - requests: - memory: "50Mi" - cpu: "50m" - limits: - memory: "50Mi" - cpu: "50m" -{{- end }} diff --git a/charts/consul/templates/gossip-encryption-autogenerate-podsecuritypolicy.yaml b/charts/consul/templates/gossip-encryption-autogenerate-podsecuritypolicy.yaml deleted file mode 100644 index 209b3aa..0000000 --- a/charts/consul/templates/gossip-encryption-autogenerate-podsecuritypolicy.yaml +++ /dev/null @@ -1,40 +0,0 @@ -{{- if and .Values.global.gossipEncryption.autoGenerate .Values.global.enablePodSecurityPolicies }} ---- -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "consul.fullname" . }}-gossip-encryption-autogenerate - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: gossip-encryption-autogenerate - annotations: - "helm.sh/hook": pre-install,pre-upgrade - "helm.sh/hook-delete-policy": before-hook-creation -spec: - privileged: false - # Required to prevent escalations to root. - allowPrivilegeEscalation: false - # This is redundant with non-root + disallow privilege escalation, - # but we can provide it for defense in depth. - requiredDropCapabilities: - - ALL - # Allow core volume types. - volumes: - - 'secret' - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'RunAsAny' - fsGroup: - rule: 'RunAsAny' - readOnlyRootFilesystem: false -{{- end }} diff --git a/charts/consul/templates/gossip-encryption-autogenerate-role.yaml b/charts/consul/templates/gossip-encryption-autogenerate-role.yaml deleted file mode 100644 index 8c51c96..0000000 --- a/charts/consul/templates/gossip-encryption-autogenerate-role.yaml +++ /dev/null @@ -1,32 +0,0 @@ -{{- if .Values.global.gossipEncryption.autoGenerate }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: {{ template "consul.fullname" . }}-gossip-encryption-autogenerate - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: gossip-encryption-autogenerate - annotations: - "helm.sh/hook": pre-install,pre-upgrade - "helm.sh/hook-delete-policy": before-hook-creation -rules: -- apiGroups: [""] - resources: - - secrets - verbs: - - create - - get -{{- if .Values.global.enablePodSecurityPolicies }} -- apiGroups: ["policy"] - resources: - - podsecuritypolicies - verbs: - - use - resourceNames: - - {{ template "consul.fullname" . }}-gossip-encryption-autogenerate -{{- end }} -{{- end }} diff --git a/charts/consul/templates/gossip-encryption-autogenerate-rolebinding.yaml b/charts/consul/templates/gossip-encryption-autogenerate-rolebinding.yaml deleted file mode 100644 index 7118475..0000000 --- a/charts/consul/templates/gossip-encryption-autogenerate-rolebinding.yaml +++ /dev/null @@ -1,23 +0,0 @@ -{{- if .Values.global.gossipEncryption.autoGenerate }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: {{ template "consul.fullname" . }}-gossip-encryption-autogenerate - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: gossip-encryption-autogenerate - annotations: - "helm.sh/hook": pre-install,pre-upgrade - "helm.sh/hook-delete-policy": before-hook-creation -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: {{ template "consul.fullname" . }}-gossip-encryption-autogenerate -subjects: -- kind: ServiceAccount - name: {{ template "consul.fullname" . }}-gossip-encryption-autogenerate -{{- end }} diff --git a/charts/consul/templates/gossip-encryption-autogenerate-serviceaccount.yaml b/charts/consul/templates/gossip-encryption-autogenerate-serviceaccount.yaml deleted file mode 100644 index 1fd6202..0000000 --- a/charts/consul/templates/gossip-encryption-autogenerate-serviceaccount.yaml +++ /dev/null @@ -1,22 +0,0 @@ -{{- if .Values.global.gossipEncryption.autoGenerate }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "consul.fullname" . }}-gossip-encryption-autogenerate - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: gossip-encryption-autogenerate - annotations: - "helm.sh/hook": pre-install,pre-upgrade - "helm.sh/hook-delete-policy": before-hook-creation -{{- with .Values.global.imagePullSecrets }} -imagePullSecrets: -{{- range . }} - - name: {{ .name }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/consul/templates/ingress-gateways-deployment.yaml b/charts/consul/templates/ingress-gateways-deployment.yaml deleted file mode 100644 index c7a38bb..0000000 --- a/charts/consul/templates/ingress-gateways-deployment.yaml +++ /dev/null @@ -1,379 +0,0 @@ -{{- if .Values.ingressGateways.enabled }} -{{- if not .Values.connectInject.enabled }}{{ fail "connectInject.enabled must be true" }}{{ end -}} -{{- if and .Values.global.adminPartitions.enabled (not .Values.global.enableConsulNamespaces) }}{{ fail "global.enableConsulNamespaces must be true if global.adminPartitions.enabled=true" }}{{ end }} -{{- if .Values.global.lifecycleSidecarContainer }}{{ fail "global.lifecycleSidecarContainer has been renamed to global.consulSidecarContainer. Please set values using global.consulSidecarContainer." }}{{ end }} -{{ template "consul.validateRequiredCloudSecretsExist" . }} -{{ template "consul.validateCloudSecretKeys" . }} - -{{- $root := . }} -{{- $defaults := .Values.ingressGateways.defaults }} -{{- $names := dict }} - -{{- /* Check if gateway names are unique. */ -}} -{{- $gateways := .Values.ingressGateways.gateways }} -{{- range $outerIngressIndex, $outerIngressVal := $gateways }} - -{{- range $innerIngressIndex, $innerIngressVal := $gateways }} -{{- if (and (ne $outerIngressIndex $innerIngressIndex) (eq $outerIngressVal.name $innerIngressVal.name)) }} -{{ fail (cat "ingress gateways must have unique names but found duplicate name" $innerIngressVal.name) }} -{{ end -}} -{{ end -}} -{{ end -}} - -{{- range .Values.ingressGateways.gateways }} - -{{- $service := .service }} - -{{- if empty .name }} -# Check that the gateway name is provided -{{ fail "Ingress gateway names cannot be empty"}} -{{ end -}} -{{- if hasKey $names .name }} -# Check that the gateway name is unique -{{ fail "Ingress gateway names must be unique"}} -{{ end -}} -{{- /* Add the gateway name to the $names dict to ensure uniqueness */ -}} -{{- $_ := set $names .name .name }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "consul.fullname" $root }}-{{ .name }} - namespace: {{ $root.Release.Namespace }} - labels: - app: {{ template "consul.name" $root }} - chart: {{ template "consul.chart" $root }} - heritage: {{ $root.Release.Service }} - release: {{ $root.Release.Name }} - component: ingress-gateway - ingress-gateway-name: {{ template "consul.fullname" $root }}-{{ .name }} - {{- if $root.Values.global.extraLabels }} - {{- toYaml $root.Values.global.extraLabels | nindent 4 }} - {{- end }} -spec: - replicas: {{ default $defaults.replicas .replicas }} - selector: - matchLabels: - app: {{ template "consul.name" $root }} - chart: {{ template "consul.chart" $root }} - heritage: {{ $root.Release.Service }} - release: {{ $root.Release.Name }} - component: ingress-gateway - ingress-gateway-name: {{ template "consul.fullname" $root }}-{{ .name }} - template: - metadata: - labels: - app: {{ template "consul.name" $root }} - chart: {{ template "consul.chart" $root }} - heritage: {{ $root.Release.Service }} - release: {{ $root.Release.Name }} - component: ingress-gateway - ingress-gateway-name: {{ template "consul.fullname" $root }}-{{ .name }} - consul.hashicorp.com/connect-inject-managed-by: consul-k8s-endpoints-controller - {{- if $root.Values.global.extraLabels }} - {{- toYaml $root.Values.global.extraLabels | nindent 8 }} - {{- end }} - annotations: - "consul.hashicorp.com/connect-inject": "false" - "consul.hashicorp.com/mesh-inject": "false" - "consul.hashicorp.com/gateway-kind": "ingress-gateway" - "consul.hashicorp.com/gateway-consul-service-name": "{{ .name }}" - {{- if $root.Values.global.enableConsulNamespaces }} - "consul.hashicorp.com/gateway-namespace": {{ (default $defaults.consulNamespace .consulNamespace) }} - {{- end }} - "consul.hashicorp.com/gateway-wan-address-source": "Service" - {{- $serviceType := (default $defaults.service.type $service.type) }} - {{- if (eq $serviceType "NodePort") }} - {{- if $service.ports }} - {{- $firstPort := first $service.ports}} - {{- if $firstPort.nodePort }} - "consul.hashicorp.com/gateway-wan-port": "{{ $firstPort.nodePort }}" - {{- else }}{{ fail "if ingressGateways .service.type=NodePort and defining ingressGateways.gateways.service.ports, the first port entry must include a nodePort" }} - {{- end }} - {{- else if $defaults.service.ports }} - {{- $firstDefaultPort := first $defaults.service.ports}} - {{- if $firstDefaultPort.nodePort }} - "consul.hashicorp.com/gateway-wan-port": "{{ $firstDefaultPort.nodePort }}" - {{- else }}{{ fail "if ingressGateways .service.type=NodePort and using ingressGateways.defaults.service.ports, the first port entry must include a nodePort" }} - {{- end }} - {{- else }}{{ fail "if ingressGateways .service.type=NodePort, the first port entry in either the defaults or specific gateway must include a nodePort" }} - {{- end }} - {{- else }} - {{- if $service.ports }} - {{- $firstPort := first $service.ports}} - {{- if $firstPort.port }} - "consul.hashicorp.com/gateway-wan-port": "{{ $firstPort.port }}" - {{- else }}{{ fail "if ingressGateways .service.type is not NodePort and defining ingressGateways.gateways.service.ports, the first port entry must include a port" }} - {{- end }} - {{- else if $defaults.service.ports }} - {{- $firstDefaultPort := first $defaults.service.ports}} - {{- if $firstDefaultPort.port }} - "consul.hashicorp.com/gateway-wan-port": "{{ $firstDefaultPort.port }}" - {{- else }}{{ fail "if ingressGateways .service.type is not NodePort and using ingressGateways.defaults.service.ports, the first port entry must include a port" }} - {{- end }} - {{- else }}{{ fail "if ingressGateways .service.type is not NodePort, the first port entry in either the defaults or specific gateway must include a port" }} - {{- end }} - {{- end }} - {{- if (and $root.Values.global.secretsBackend.vault.enabled $root.Values.global.tls.enabled) }} - "vault.hashicorp.com/agent-init-first": "true" - "vault.hashicorp.com/agent-inject": "true" - "vault.hashicorp.com/role": {{ $root.Values.global.secretsBackend.vault.consulCARole }} - "vault.hashicorp.com/agent-inject-secret-serverca.crt": {{ $root.Values.global.tls.caCert.secretName }} - "vault.hashicorp.com/agent-inject-template-serverca.crt": {{ template "consul.serverTLSCATemplate" $root }} - {{- if and $root.Values.global.secretsBackend.vault.ca.secretName $root.Values.global.secretsBackend.vault.ca.secretKey }} - "vault.hashicorp.com/agent-extra-secret": {{ $root.Values.global.secretsBackend.vault.ca.secretName }} - "vault.hashicorp.com/ca-cert": /vault/custom/{{ $root.Values.global.secretsBackend.vault.ca.secretKey }} - {{- end }} - {{- if $root.Values.global.secretsBackend.vault.agentAnnotations }} - {{ tpl $root.Values.global.secretsBackend.vault.agentAnnotations $root | nindent 8 | trim }} - {{- end }} - {{- if (and ($root.Values.global.secretsBackend.vault.vaultNamespace) (not (hasKey (default "" $root.Values.global.secretsBackend.vault.agentAnnotations | fromYaml) "vault.hashicorp.com/namespace")))}} - "vault.hashicorp.com/namespace": "{{ $root.Values.global.secretsBackend.vault.vaultNamespace }}" - {{- end }} - {{- end }} - {{- if (and $root.Values.global.metrics.enabled $root.Values.global.metrics.enableGatewayMetrics) }} - "prometheus.io/scrape": "true" - {{- if not (hasKey (default "" $defaults.annotations | fromYaml) "prometheus.io/path")}} - "prometheus.io/path": "/metrics" - {{- end }} - "prometheus.io/port": "20200" - {{- end }} - {{- if $defaults.annotations }} - # We allow both default annotations and gateway-specific annotations - {{- tpl $defaults.annotations $root | nindent 8 }} - {{- end }} - {{- if .annotations }} - {{- tpl .annotations $root | nindent 8 }} - {{- end }} - spec: - {{- if (or $defaults.affinity .affinity) }} - affinity: - {{ tpl (default $defaults.affinity .affinity) $root | nindent 8 | trim }} - {{- end }} - {{- if (or $defaults.tolerations .tolerations) }} - tolerations: - {{ tpl (default $defaults.tolerations .tolerations) $root | nindent 8 | trim }} - {{- end }} - {{- if (or $defaults.topologySpreadConstraints .topologySpreadConstraints) }} - topologySpreadConstraints: - {{ tpl (default $defaults.topologySpreadConstraints .topologySpreadConstraints) $root | nindent 8 | trim }} - {{- end }} - terminationGracePeriodSeconds: {{ default $defaults.terminationGracePeriodSeconds .terminationGracePeriodSeconds }} - serviceAccountName: {{ template "consul.fullname" $root }}-{{ .name }} - volumes: - - name: tmp - emptyDir: - medium: "Memory" - - name: consul-service - emptyDir: - medium: "Memory" - {{- if $root.Values.global.tls.enabled }} - {{- if not (or (and $root.Values.externalServers.enabled $root.Values.externalServers.useSystemRoots) ($root.Values.global.secretsBackend.vault.enabled)) }} - - name: consul-ca-cert - secret: - {{- if $root.Values.global.tls.caCert.secretName }} - secretName: {{ $root.Values.global.tls.caCert.secretName }} - {{- else }} - secretName: {{ template "consul.fullname" $root }}-ca-cert - {{- end }} - items: - - key: {{ default "tls.crt" $root.Values.global.tls.caCert.secretKey }} - path: tls.crt - {{- end }} - {{- end }} - initContainers: - # ingress-gateway-init registers the ingress gateway service with Consul. - - name: ingress-gateway-init - image: {{ $root.Values.global.imageK8S }} - {{ template "consul.imagePullPolicy" $root }} - {{- include "consul.restrictedSecurityContext" $ | nindent 8 }} - env: - - name: NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - {{- include "consul.consulK8sConsulServerEnvVars" $root | nindent 8 }} - {{- if $root.Values.global.enableConsulNamespaces }} - - name: CONSUL_NAMESPACE - value: {{ (default $defaults.consulNamespace .consulNamespace) }} - {{- end }} - {{- if $root.Values.global.acls.manageSystemACLs }} - - name: CONSUL_LOGIN_AUTH_METHOD - value: {{ template "consul.fullname" $root }}-k8s-component-auth-method - - name: CONSUL_LOGIN_DATACENTER - value: {{ $root.Values.global.datacenter }} - - name: CONSUL_LOGIN_META - value: "component=ingress-gateway,pod=$(NAMESPACE)/$(POD_NAME)" - {{- end }} - - name: CONSUL_NODE_NAME - value: $(NODE_NAME)-virtual - command: - - "/bin/sh" - - "-ec" - - | - exec consul-k8s-control-plane connect-init -pod-name=${POD_NAME} -pod-namespace=${NAMESPACE} \ - -gateway-kind="ingress-gateway" \ - -proxy-id-file=/consul/service/proxy-id \ - -service-name={{ template "consul.fullname" $root }}-{{ .name }} \ - -log-level={{ default $root.Values.global.logLevel $root.Values.ingressGateways.logLevel }} \ - -log-json={{ $root.Values.global.logJSON }} - volumeMounts: - - name: tmp - mountPath: /tmp - - name: consul-service - mountPath: /consul/service - {{- if $root.Values.global.tls.enabled }} - {{- if not (or (and $root.Values.externalServers.enabled $root.Values.externalServers.useSystemRoots) ($root.Values.global.secretsBackend.vault.enabled)) }} - - name: consul-ca-cert - mountPath: /consul/tls/ca - readOnly: true - {{- end }} - {{- end }} - resources: - requests: - memory: "50Mi" - cpu: "50m" - limits: - memory: "50Mi" - cpu: "50m" - containers: - - name: ingress-gateway - image: {{ $root.Values.global.imageConsulDataplane | quote }} - {{ template "consul.imagePullPolicy" $root }} - {{- include "consul.restrictedSecurityContext" $ | nindent 8 }} - {{- if (default $defaults.resources .resources) }} - resources: {{ toYaml (default $defaults.resources .resources) | nindent 10 }} - {{- end }} - volumeMounts: - - name: tmp - mountPath: /tmp - - name: consul-service - mountPath: /consul/service - readOnly: true - {{- if $root.Values.global.tls.enabled }} - {{- if not (or (and $root.Values.externalServers.enabled $root.Values.externalServers.useSystemRoots) ($root.Values.global.secretsBackend.vault.enabled)) }} - - name: consul-ca-cert - mountPath: /consul/tls/ca - readOnly: true - {{- end }} - {{- end }} - env: - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: POD_IP - valueFrom: - fieldRef: - fieldPath: status.podIP - - name: NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - - name: DP_ENVOY_READY_BIND_ADDRESS - valueFrom: - fieldRef: - fieldPath: status.podIP - - name: DP_CREDENTIAL_LOGIN_META1 - value: pod=$(NAMESPACE)/$(POD_NAME) - - name: DP_CREDENTIAL_LOGIN_META2 - value: component=ingress-gateway - - name: DP_SERVICE_NODE_NAME - value: $(NODE_NAME)-virtual - command: - - consul-dataplane - args: - - -envoy-ready-bind-port=21000 - {{- if $root.Values.externalServers.enabled }} - - -addresses={{ $root.Values.externalServers.hosts | first }} - {{- else }} - - -addresses={{ template "consul.fullname" $root }}-server.{{ $root.Release.Namespace }}.svc - {{- end }} - {{- if $root.Values.externalServers.enabled }} - - -grpc-port={{ $root.Values.externalServers.grpcPort }} - {{- else }} - - -grpc-port=8502 - {{- end }} - - -proxy-service-id-path=/consul/service/proxy-id - {{- if $root.Values.global.enableConsulNamespaces }} - - -service-namespace={{ (default $defaults.consulNamespace .consulNamespace) }} - {{- end }} - {{- if and $root.Values.global.tls.enabled }} - {{- if (not (and $root.Values.externalServers.enabled $root.Values.externalServers.useSystemRoots)) }} - {{- if $root.Values.global.secretsBackend.vault.enabled }} - - -ca-certs=/vault/secrets/serverca.crt - {{- else }} - - -ca-certs=/consul/tls/ca/tls.crt - {{- end }} - {{- end }} - {{- if and $root.Values.externalServers.enabled $root.Values.externalServers.tlsServerName }} - - -tls-server-name={{ $root.Values.externalServers.tlsServerName }} - {{- else if $root.Values.global.cloud.enabled }} - - -tls-server-name=server.{{ $root.Values.global.datacenter}}.{{ $root.Values.global.domain}} - {{- end }} - {{- else }} - - -tls-disabled - {{- end }} - {{- if $root.Values.global.acls.manageSystemACLs }} - - -credential-type=login - - -login-bearer-token-path=/var/run/secrets/kubernetes.io/serviceaccount/token - - -login-auth-method={{ template "consul.fullname" $root }}-k8s-component-auth-method - {{- if $root.Values.global.adminPartitions.enabled }} - - -login-partition={{ $root.Values.global.adminPartitions.name }} - {{- end }} - {{- end }} - {{- if $root.Values.global.adminPartitions.enabled }} - - -service-partition={{ $root.Values.global.adminPartitions.name }} - {{- end }} - - -log-level={{ default $root.Values.global.logLevel $root.Values.ingressGateways.logLevel }} - - -log-json={{ $root.Values.global.logJSON }} - {{- if (and $root.Values.global.metrics.enabled $root.Values.global.metrics.enableGatewayMetrics) }} - - -telemetry-prom-scrape-path=/metrics - {{- end }} - {{- if and $root.Values.externalServers.enabled $root.Values.externalServers.skipServerWatch }} - - -server-watch-disabled=true - {{- end }} - livenessProbe: - tcpSocket: - port: 21000 - failureThreshold: 3 - initialDelaySeconds: 30 - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 5 - readinessProbe: - tcpSocket: - port: 21000 - failureThreshold: 3 - initialDelaySeconds: 10 - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 5 - ports: - - name: gateway-health - containerPort: 21000 - {{- range $index, $allPorts := (default $defaults.service.ports $service.ports) }} - - name: gateway-{{ $index }} - containerPort: {{ $allPorts.port }} - {{- end }} - {{- if (default $defaults.priorityClassName .priorityClassName) }} - priorityClassName: {{ default $defaults.priorityClassName .priorityClassName | quote }} - {{- end }} - {{- if (default $defaults.nodeSelector .nodeSelector) }} - nodeSelector: - {{ tpl (default $defaults.nodeSelector .nodeSelector) $root | indent 8 | trim }} - {{- end }} ---- -{{- end }} -{{- end }} diff --git a/charts/consul/templates/ingress-gateways-podsecuritypolicy.yaml b/charts/consul/templates/ingress-gateways-podsecuritypolicy.yaml deleted file mode 100644 index b847e44..0000000 --- a/charts/consul/templates/ingress-gateways-podsecuritypolicy.yaml +++ /dev/null @@ -1,47 +0,0 @@ -{{- if (and .Values.global.enablePodSecurityPolicies .Values.ingressGateways.enabled) }} -{{- $root := . }} -{{- range .Values.ingressGateways.gateways }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "consul.fullname" $root }}-{{ .name }} - namespace: {{ $root.Release.Namespace }} - labels: - app: {{ template "consul.name" $root }} - chart: {{ template "consul.chart" $root }} - heritage: {{ $root.Release.Service }} - release: {{ $root.Release.Name }} - component: ingress-gateway - ingress-gateway-name: {{ template "consul.fullname" $root }}-{{ .name }} -spec: - privileged: false - # Required to prevent escalations to root. - allowPrivilegeEscalation: false - # This is redundant with non-root + disallow privilege escalation, - # but we can provide it for defense in depth. - requiredDropCapabilities: - - ALL - defaultAddCapabilities: - - NET_BIND_SERVICE - # Allow core volume types. - volumes: - - 'configMap' - - 'emptyDir' - - 'projected' - - 'secret' - - 'downwardAPI' - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'RunAsAny' - fsGroup: - rule: 'RunAsAny' - readOnlyRootFilesystem: false ---- -{{- end }} -{{- end }} diff --git a/charts/consul/templates/ingress-gateways-role.yaml b/charts/consul/templates/ingress-gateways-role.yaml deleted file mode 100644 index 49e8486..0000000 --- a/charts/consul/templates/ingress-gateways-role.yaml +++ /dev/null @@ -1,46 +0,0 @@ -{{- if .Values.ingressGateways.enabled }} - -{{- $root := . }} -{{- $defaults := .Values.ingressGateways.defaults }} - -{{- range .Values.ingressGateways.gateways }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: {{ template "consul.fullname" $root }}-{{ .name }} - namespace: {{ $root.Release.Namespace }} - labels: - app: {{ template "consul.name" $root }} - chart: {{ template "consul.chart" $root }} - heritage: {{ $root.Release.Service }} - release: {{ $root.Release.Name }} - component: ingress-gateway - ingress-gateway-name: {{ template "consul.fullname" $root }}-{{ .name }} -rules: - - apiGroups: [""] - resources: - - services - resourceNames: - - {{ template "consul.fullname" $root }}-{{ .name }} - verbs: - - get -{{- if $root.Values.global.enablePodSecurityPolicies }} - - apiGroups: ["policy"] - resources: ["podsecuritypolicies"] - resourceNames: - - {{ template "consul.fullname" $root }}-{{ .name }} - verbs: - - use -{{- end }} -{{- if $root.Values.global.acls.manageSystemACLs }} - - apiGroups: [""] - resources: - - secrets - resourceNames: - - {{ template "consul.fullname" $root }}-{{ .name }}-acl-token - verbs: - - get -{{- end }} ---- -{{- end }} -{{- end }} diff --git a/charts/consul/templates/ingress-gateways-rolebinding.yaml b/charts/consul/templates/ingress-gateways-rolebinding.yaml deleted file mode 100644 index 601de77..0000000 --- a/charts/consul/templates/ingress-gateways-rolebinding.yaml +++ /dev/null @@ -1,25 +0,0 @@ -{{- if .Values.ingressGateways.enabled }} -{{- $root := . }} -{{- range .Values.ingressGateways.gateways }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: {{ template "consul.fullname" $root }}-{{ .name }} - namespace: {{ $root.Release.Namespace }} - labels: - app: {{ template "consul.name" $root }} - chart: {{ template "consul.chart" $root }} - heritage: {{ $root.Release.Service }} - release: {{ $root.Release.Name }} - component: ingress-gateway - ingress-gateway-name: {{ template "consul.fullname" $root }}-{{ .name }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: {{ template "consul.fullname" $root }}-{{ .name }} -subjects: - - kind: ServiceAccount - name: {{ template "consul.fullname" $root }}-{{ .name }} ---- -{{- end }} -{{- end }} diff --git a/charts/consul/templates/ingress-gateways-service.yaml b/charts/consul/templates/ingress-gateways-service.yaml deleted file mode 100644 index cf54a74..0000000 --- a/charts/consul/templates/ingress-gateways-service.yaml +++ /dev/null @@ -1,51 +0,0 @@ -{{- if .Values.ingressGateways.enabled }} - -{{- $root := . }} -{{- $defaults := .Values.ingressGateways.defaults }} - -{{- range .Values.ingressGateways.gateways }} - -{{- $service := .service }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "consul.fullname" $root }}-{{ .name }} - namespace: {{ $root.Release.Namespace }} - labels: - app: {{ template "consul.name" $root }} - chart: {{ template "consul.chart" $root }} - heritage: {{ $root.Release.Service }} - release: {{ $root.Release.Name }} - component: ingress-gateway - ingress-gateway-name: {{ template "consul.fullname" $root }}-{{ .name }} - {{- if (or $defaults.service.annotations $service.annotations) }} - # We allow both default annotations and gateway-specific annotations - annotations: - {{- if $defaults.service.annotations }} - {{ tpl $defaults.service.annotations $root | nindent 4 | trim }} - {{- end }} - {{- if $service.annotations }} - {{ tpl $service.annotations $root | nindent 4 | trim }} - {{- end }} - {{- end }} -spec: - selector: - app: {{ template "consul.name" $root }} - release: "{{ $root.Release.Name }}" - component: ingress-gateway - ingress-gateway-name: {{ template "consul.fullname" $root }}-{{ .name }} - ports: - {{- range $index, $ports := (default $defaults.service.ports $service.ports) }} - - name: gateway-{{ $index }} - port: {{ $ports.port }} - {{- if (and (eq (default $defaults.service.type $service.type) "NodePort") $ports.nodePort) }} - nodePort: {{ $ports.nodePort }} - {{- end}} - {{- end }} - type: {{ default $defaults.service.type $service.type }} - {{- if (default $defaults.service.additionalSpec $service.additionalSpec) }} - {{ tpl (default $defaults.service.additionalSpec $service.additionalSpec) $root | nindent 2 | trim }} - {{- end }} ---- -{{- end }} -{{- end }} diff --git a/charts/consul/templates/ingress-gateways-serviceaccount.yaml b/charts/consul/templates/ingress-gateways-serviceaccount.yaml deleted file mode 100644 index cea6caf..0000000 --- a/charts/consul/templates/ingress-gateways-serviceaccount.yaml +++ /dev/null @@ -1,35 +0,0 @@ -{{- if .Values.ingressGateways.enabled }} -{{- $root := . }} -{{- $defaults := .Values.ingressGateways.defaults }} -{{- range .Values.ingressGateways.gateways }} -{{- $serviceAccount := .serviceAccount }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "consul.fullname" $root }}-{{ .name }} - namespace: {{ $root.Release.Namespace }} - labels: - app: {{ template "consul.name" $root }} - chart: {{ template "consul.chart" $root }} - heritage: {{ $root.Release.Service }} - release: {{ $root.Release.Name }} - component: ingress-gateway - ingress-gateway-name: {{ template "consul.fullname" $root }}-{{ .name }} - {{- if (or $defaults.serviceAccount.annotations $serviceAccount.annotations) }} - annotations: - {{- if $defaults.serviceAccount.annotations }} - {{ tpl $defaults.serviceAccount.annotations $root | nindent 4 | trim }} - {{- end }} - {{- if $serviceAccount.annotations }} - {{ tpl $serviceAccount.annotations $root | nindent 4 | trim }} - {{- end }} - {{- end }} -{{- with $root.Values.global.imagePullSecrets }} -imagePullSecrets: -{{- range . }} - - name: {{ .name }} -{{- end }} -{{- end }} ---- -{{- end }} -{{- end }} diff --git a/charts/consul/templates/mesh-gateway-clusterrole.yaml b/charts/consul/templates/mesh-gateway-clusterrole.yaml deleted file mode 100644 index b951418..0000000 --- a/charts/consul/templates/mesh-gateway-clusterrole.yaml +++ /dev/null @@ -1,34 +0,0 @@ -{{- if .Values.meshGateway.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "consul.fullname" . }}-mesh-gateway - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: mesh-gateway -{{- if or .Values.global.acls.manageSystemACLs .Values.global.enablePodSecurityPolicies (eq .Values.meshGateway.wanAddress.source "Service") }} -rules: -{{- if .Values.global.enablePodSecurityPolicies }} - - apiGroups: ["policy"] - resources: ["podsecuritypolicies"] - resourceNames: - - {{ template "consul.fullname" . }}-mesh-gateway - verbs: - - use -{{- end }} -{{- if eq .Values.meshGateway.wanAddress.source "Service" }} - - apiGroups: [""] - resources: - - services - resourceNames: - - {{ template "consul.fullname" . }}-mesh-gateway - verbs: - - get - {{- end }} -{{- else }} -rules: [] -{{- end }} -{{- end }} diff --git a/charts/consul/templates/mesh-gateway-clusterrolebinding.yaml b/charts/consul/templates/mesh-gateway-clusterrolebinding.yaml deleted file mode 100644 index f8150eb..0000000 --- a/charts/consul/templates/mesh-gateway-clusterrolebinding.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if .Values.meshGateway.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "consul.fullname" . }}-mesh-gateway - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: mesh-gateway -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "consul.fullname" . }}-mesh-gateway -subjects: - - kind: ServiceAccount - name: {{ template "consul.fullname" . }}-mesh-gateway - namespace: {{ .Release.Namespace }} -{{- end }} diff --git a/charts/consul/templates/mesh-gateway-deployment.yaml b/charts/consul/templates/mesh-gateway-deployment.yaml deleted file mode 100644 index 1ff9c81..0000000 --- a/charts/consul/templates/mesh-gateway-deployment.yaml +++ /dev/null @@ -1,337 +0,0 @@ -{{- if .Values.meshGateway.enabled }} -{{- if not .Values.connectInject.enabled }}{{ fail "connectInject.enabled must be true" }}{{ end -}} -{{- if and .Values.global.acls.manageSystemACLs (ne .Values.meshGateway.consulServiceName "") (ne .Values.meshGateway.consulServiceName "mesh-gateway") }}{{ fail "if global.acls.manageSystemACLs is true, meshGateway.consulServiceName cannot be set" }}{{ end -}} -{{- if .Values.meshGateway.globalMode }}{{ fail "meshGateway.globalMode is no longer supported; instead, you must migrate to CRDs (see www.consul.io/docs/k8s/crds/upgrade-to-crds)" }}{{ end -}} -{{- if and .Values.global.adminPartitions.enabled (not .Values.global.enableConsulNamespaces) }}{{ fail "global.enableConsulNamespaces must be true if global.adminPartitions.enabled=true" }}{{ end }} -{{- if and (eq .Values.meshGateway.wanAddress.source "Static") (eq .Values.meshGateway.wanAddress.static "") }}{{ fail "if meshGateway.wanAddress.source=Static then meshGateway.wanAddress.static cannot be empty" }}{{ end }} -{{- if and (eq .Values.meshGateway.wanAddress.source "Service") (eq .Values.meshGateway.service.type "NodePort") (not .Values.meshGateway.service.nodePort) }}{{ fail "if meshGateway.wanAddress.source=Service and meshGateway.service.type=NodePort, meshGateway.service.nodePort must be set" }}{{ end }} -{{ template "consul.validateRequiredCloudSecretsExist" . }} -{{ template "consul.validateCloudSecretKeys" . }} - -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "consul.fullname" . }}-mesh-gateway - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: mesh-gateway - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 4 }} - {{- end }} -spec: - replicas: {{ .Values.meshGateway.replicas }} - selector: - matchLabels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - release: {{ .Release.Name }} - component: mesh-gateway - template: - metadata: - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - release: {{ .Release.Name }} - component: mesh-gateway - consul.hashicorp.com/connect-inject-managed-by: consul-k8s-endpoints-controller - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 8 }} - {{- end }} - annotations: - "consul.hashicorp.com/connect-inject": "false" - "consul.hashicorp.com/mesh-inject": "false" - "consul.hashicorp.com/gateway-kind": "mesh-gateway" - "consul.hashicorp.com/gateway-consul-service-name": "{{ .Values.meshGateway.consulServiceName }}" - "consul.hashicorp.com/mesh-gateway-container-port": "{{ .Values.meshGateway.containerPort }}" - "consul.hashicorp.com/gateway-wan-address-source": "{{ .Values.meshGateway.wanAddress.source }}" - "consul.hashicorp.com/gateway-wan-address-static": "{{ .Values.meshGateway.wanAddress.static }}" - {{- if eq .Values.meshGateway.wanAddress.source "Service" }} - {{- if eq .Values.meshGateway.service.type "NodePort" }} - "consul.hashicorp.com/gateway-wan-port": "{{ .Values.meshGateway.service.nodePort }}" - {{- else }} - "consul.hashicorp.com/gateway-wan-port": "{{ .Values.meshGateway.service.port }}" - {{- end }} - {{- else }} - "consul.hashicorp.com/gateway-wan-port": "{{ .Values.meshGateway.wanAddress.port }}" - {{- end }} - {{- if (and .Values.global.secretsBackend.vault.enabled .Values.global.tls.enabled) }} - "vault.hashicorp.com/agent-init-first": "true" - "vault.hashicorp.com/agent-inject": "true" - "vault.hashicorp.com/role": {{ .Values.global.secretsBackend.vault.consulCARole }} - "vault.hashicorp.com/agent-inject-secret-serverca.crt": {{ .Values.global.tls.caCert.secretName }} - "vault.hashicorp.com/agent-inject-template-serverca.crt": {{ template "consul.serverTLSCATemplate" . }} - {{- if and .Values.global.secretsBackend.vault.ca.secretName .Values.global.secretsBackend.vault.ca.secretKey }} - "vault.hashicorp.com/agent-extra-secret": "{{ .Values.global.secretsBackend.vault.ca.secretName }}" - "vault.hashicorp.com/ca-cert": "/vault/custom/{{ .Values.global.secretsBackend.vault.ca.secretKey }}" - {{- end }} - {{- if .Values.global.secretsBackend.vault.agentAnnotations }} - {{ tpl .Values.global.secretsBackend.vault.agentAnnotations . | nindent 8 | trim }} - {{- end }} - {{- if (and (.Values.global.secretsBackend.vault.vaultNamespace) (not (hasKey (default "" .Values.global.secretsBackend.vault.agentAnnotations | fromYaml) "vault.hashicorp.com/namespace")))}} - "vault.hashicorp.com/namespace": "{{ .Values.global.secretsBackend.vault.vaultNamespace }}" - {{- end }} - {{- end }} - {{- if (and .Values.global.metrics.enabled .Values.global.metrics.enableGatewayMetrics) }} - "prometheus.io/scrape": "true" - {{- if not (hasKey (default "" .Values.meshGateway.annotations | fromYaml) "prometheus.io/path")}} - "prometheus.io/path": "/metrics" - {{- end }} - "prometheus.io/port": "20200" - {{- end }} - {{- if .Values.meshGateway.annotations }} - {{- tpl .Values.meshGateway.annotations . | nindent 8 }} - {{- end }} - spec: - {{- if .Values.meshGateway.affinity }} - affinity: - {{ tpl .Values.meshGateway.affinity . | nindent 8 | trim }} - {{- end }} - {{- if .Values.meshGateway.tolerations }} - tolerations: - {{ tpl .Values.meshGateway.tolerations . | nindent 8 | trim }} - {{- end }} - {{- if .Values.meshGateway.topologySpreadConstraints }} - topologySpreadConstraints: - {{ tpl .Values.meshGateway.topologySpreadConstraints . | nindent 8 | trim }} - {{- end }} - terminationGracePeriodSeconds: 10 - serviceAccountName: {{ template "consul.fullname" . }}-mesh-gateway - volumes: - - name: consul-service - emptyDir: - medium: "Memory" - {{- if .Values.global.tls.enabled }} - {{- if not (or (and .Values.externalServers.enabled .Values.externalServers.useSystemRoots) .Values.global.secretsBackend.vault.enabled) }} - - name: consul-ca-cert - secret: - {{- if .Values.global.tls.caCert.secretName }} - secretName: {{ .Values.global.tls.caCert.secretName }} - {{- else }} - secretName: {{ template "consul.fullname" . }}-ca-cert - {{- end }} - items: - - key: {{ default "tls.crt" .Values.global.tls.caCert.secretKey }} - path: tls.crt - {{- end }} - {{- end }} - {{- if .Values.meshGateway.hostNetwork }} - hostNetwork: {{ .Values.meshGateway.hostNetwork }} - {{- end }} - {{- if .Values.meshGateway.dnsPolicy }} - dnsPolicy: {{ .Values.meshGateway.dnsPolicy }} - {{- end }} - initContainers: - - name: mesh-gateway-init - securityContext: - allowPrivilegeEscalation: false - readOnlyRootFilesystem: true - runAsNonRoot: true - seccompProfile: - type: RuntimeDefault - capabilities: - drop: - - ALL - image: {{ .Values.global.imageK8S }} - {{ template "consul.imagePullPolicy" . }} - env: - - name: NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - {{- include "consul.consulK8sConsulServerEnvVars" . | nindent 8 }} - {{- if .Values.global.acls.manageSystemACLs }} - - name: CONSUL_LOGIN_AUTH_METHOD - {{- if and .Values.global.federation.enabled .Values.global.federation.primaryDatacenter }} - value: {{ template "consul.fullname" . }}-k8s-component-auth-method-{{ .Values.global.datacenter }} - {{- else }} - value: {{ template "consul.fullname" . }}-k8s-component-auth-method - {{- end }} - - name: CONSUL_LOGIN_DATACENTER - {{- if and .Values.global.federation.enabled .Values.global.federation.primaryDatacenter }} - value: {{ .Values.global.federation.primaryDatacenter }} - {{- else }} - value: {{ .Values.global.datacenter }} - {{- end }} - - name: CONSUL_LOGIN_META - value: "component=mesh-gateway,pod=$(NAMESPACE)/$(POD_NAME)" - {{- end }} - - name: CONSUL_NODE_NAME - value: $(NODE_NAME)-virtual - command: - - "/bin/sh" - - "-ec" - - | - exec consul-k8s-control-plane connect-init -pod-name=${POD_NAME} -pod-namespace=${NAMESPACE} \ - -gateway-kind="mesh-gateway" \ - -proxy-id-file=/consul/service/proxy-id \ - -service-name={{ .Values.meshGateway.consulServiceName }} \ - -log-level={{ default .Values.global.logLevel .Values.meshGateway.logLevel }} \ - -log-json={{ .Values.global.logJSON }} - volumeMounts: - - name: consul-service - mountPath: /consul/service - {{- if .Values.global.tls.enabled }} - {{- if not (or (and .Values.externalServers.enabled .Values.externalServers.useSystemRoots) .Values.global.secretsBackend.vault.enabled) }} - - name: consul-ca-cert - mountPath: /consul/tls/ca - readOnly: true - {{- end }} - {{- end }} - {{- if .Values.meshGateway.initServiceInitContainer.resources }} - resources: {{ toYaml .Values.meshGateway.initServiceInitContainer.resources | nindent 10 }} - {{- end }} - containers: - - name: mesh-gateway - image: {{ .Values.global.imageConsulDataplane | quote }} - {{ template "consul.imagePullPolicy" . }} - securityContext: - allowPrivilegeEscalation: false - readOnlyRootFilesystem: true - runAsNonRoot: true - seccompProfile: - type: RuntimeDefault - capabilities: - {{ if not .Values.meshGateway.hostNetwork}} - drop: - - ALL - {{- end }} - add: - - NET_BIND_SERVICE - {{- if .Values.meshGateway.resources }} - resources: - {{- if eq (typeOf .Values.meshGateway.resources) "string" }} - {{ tpl .Values.meshGateway.resources . | nindent 12 | trim }} - {{- else }} - {{- toYaml .Values.meshGateway.resources | nindent 12 }} - {{- end }} - {{- end }} - volumeMounts: - - mountPath: /consul/service - name: consul-service - readOnly: true - {{- if .Values.global.tls.enabled }} - {{- if not (or (and .Values.externalServers.enabled .Values.externalServers.useSystemRoots) .Values.global.secretsBackend.vault.enabled) }} - - name: consul-ca-cert - mountPath: /consul/tls/ca - readOnly: true - {{- end }} - {{- end }} - env: - - name: NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: HOST_IP - valueFrom: - fieldRef: - fieldPath: status.hostIP - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - - name: DP_CREDENTIAL_LOGIN_META1 - value: pod=$(NAMESPACE)/$(POD_NAME) - - name: DP_CREDENTIAL_LOGIN_META2 - value: component=mesh-gateway - - name: DP_SERVICE_NODE_NAME - value: $(NODE_NAME)-virtual - command: - - consul-dataplane - args: - {{- if .Values.externalServers.enabled }} - - -addresses={{ .Values.externalServers.hosts | first }} - {{- else }} - - -addresses={{ template "consul.fullname" . }}-server.{{ .Release.Namespace }}.svc - {{- end }} - {{- if .Values.externalServers.enabled }} - - -grpc-port={{ .Values.externalServers.grpcPort }} - {{- else }} - - -grpc-port=8502 - {{- end }} - - -proxy-service-id-path=/consul/service/proxy-id - {{- if .Values.global.tls.enabled }} - {{- if (not (and .Values.externalServers.enabled .Values.externalServers.useSystemRoots)) }} - {{- if .Values.global.secretsBackend.vault.enabled }} - - -ca-certs=/vault/secrets/serverca.crt - {{- else }} - - -ca-certs=/consul/tls/ca/tls.crt - {{- end }} - {{- end }} - {{- if and .Values.externalServers.enabled .Values.externalServers.tlsServerName }} - - -tls-server-name={{.Values.externalServers.tlsServerName }} - {{- else if .Values.global.cloud.enabled }} - - -tls-server-name=server.{{ .Values.global.datacenter}}.{{ .Values.global.domain}} - {{- end }} - {{- else }} - - -tls-disabled - {{- end }} - {{- if .Values.global.acls.manageSystemACLs }} - - -credential-type=login - - -login-bearer-token-path=/var/run/secrets/kubernetes.io/serviceaccount/token - {{- if and .Values.global.federation.enabled .Values.global.federation.primaryDatacenter }} - - -login-auth-method={{ template "consul.fullname" . }}-k8s-component-auth-method-{{ .Values.global.datacenter }} - - -login-datacenter={{ .Values.global.federation.primaryDatacenter }} - {{- else }} - - -login-auth-method={{ template "consul.fullname" . }}-k8s-component-auth-method - {{- end }} - {{- if .Values.global.adminPartitions.enabled }} - - -login-partition={{ .Values.global.adminPartitions.name }} - {{- end }} - {{- end }} - {{- if .Values.global.adminPartitions.enabled }} - - -service-partition={{ .Values.global.adminPartitions.name }} - {{- end }} - - -log-level={{ default .Values.global.logLevel .Values.meshGateway.logLevel }} - - -log-json={{ .Values.global.logJSON }} - {{- if (and .Values.global.metrics.enabled .Values.global.metrics.enableGatewayMetrics) }} - - -telemetry-prom-scrape-path=/metrics - {{- end }} - {{- if and .Values.externalServers.enabled .Values.externalServers.skipServerWatch }} - - -server-watch-disabled=true - {{- end }} - livenessProbe: - tcpSocket: - port: {{ .Values.meshGateway.containerPort }} - failureThreshold: 3 - initialDelaySeconds: 30 - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 5 - readinessProbe: - tcpSocket: - port: {{ .Values.meshGateway.containerPort }} - failureThreshold: 3 - initialDelaySeconds: 10 - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 5 - ports: - - name: gateway - containerPort: {{ .Values.meshGateway.containerPort }} - {{- if .Values.meshGateway.hostPort }} - hostPort: {{ .Values.meshGateway.hostPort }} - {{- end }} - {{- if .Values.meshGateway.priorityClassName }} - priorityClassName: {{ .Values.meshGateway.priorityClassName | quote }} - {{- end }} - {{- if .Values.meshGateway.nodeSelector }} - nodeSelector: - {{ tpl .Values.meshGateway.nodeSelector . | indent 8 | trim }} - {{- end }} -{{- end }} diff --git a/charts/consul/templates/mesh-gateway-podsecuritypolicy.yaml b/charts/consul/templates/mesh-gateway-podsecuritypolicy.yaml deleted file mode 100644 index 04576fe..0000000 --- a/charts/consul/templates/mesh-gateway-podsecuritypolicy.yaml +++ /dev/null @@ -1,54 +0,0 @@ -{{- if and .Values.global.enablePodSecurityPolicies .Values.meshGateway.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "consul.fullname" . }}-mesh-gateway - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: mesh-gateway -spec: - privileged: false - # Required to prevent escalations to root. - allowPrivilegeEscalation: false - # This is redundant with non-root + disallow privilege escalation, - # but we can provide it for defense in depth. - requiredDropCapabilities: - - ALL - defaultAddCapabilities: - - NET_BIND_SERVICE - # Allow core volume types. - volumes: - - 'configMap' - - 'emptyDir' - - 'projected' - - 'secret' - - 'downwardAPI' - {{- if .Values.meshGateway.hostNetwork }} - hostNetwork: {{ .Values.meshGateway.hostNetwork }} - {{- else }} - hostNetwork: false - {{- end }} - hostPorts: - {{- if .Values.meshGateway.hostPort }} - - min: {{ .Values.meshGateway.hostPort }} - max: {{ .Values.meshGateway.hostPort }} - {{- else if .Values.meshGateway.hostNetwork }} - - min: {{ .Values.meshGateway.containerPort }} - max: {{ .Values.meshGateway.containerPort }} - {{- end }} - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'RunAsAny' - fsGroup: - rule: 'RunAsAny' - readOnlyRootFilesystem: false -{{- end }} diff --git a/charts/consul/templates/mesh-gateway-service.yaml b/charts/consul/templates/mesh-gateway-service.yaml deleted file mode 100644 index 5fdceca..0000000 --- a/charts/consul/templates/mesh-gateway-service.yaml +++ /dev/null @@ -1,33 +0,0 @@ -{{- if and .Values.meshGateway.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "consul.fullname" . }}-mesh-gateway - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: mesh-gateway - {{- if .Values.meshGateway.service.annotations }} - annotations: - {{ tpl .Values.meshGateway.service.annotations . | nindent 4 | trim }} - {{- end }} -spec: - selector: - app: {{ template "consul.name" . }} - release: "{{ .Release.Name }}" - component: mesh-gateway - ports: - - name: gateway - port: {{ .Values.meshGateway.service.port }} - targetPort: {{ .Values.meshGateway.containerPort }} - {{- if .Values.meshGateway.service.nodePort }} - nodePort: {{ .Values.meshGateway.service.nodePort }} - {{- end}} - type: {{ .Values.meshGateway.service.type }} - {{- if .Values.meshGateway.service.additionalSpec }} - {{ tpl .Values.meshGateway.service.additionalSpec . | nindent 2 | trim }} - {{- end }} -{{- end }} diff --git a/charts/consul/templates/mesh-gateway-serviceaccount.yaml b/charts/consul/templates/mesh-gateway-serviceaccount.yaml deleted file mode 100644 index 8c2da5a..0000000 --- a/charts/consul/templates/mesh-gateway-serviceaccount.yaml +++ /dev/null @@ -1,23 +0,0 @@ -{{- if .Values.meshGateway.enabled }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "consul.fullname" . }}-mesh-gateway - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: mesh-gateway - {{- if .Values.meshGateway.serviceAccount.annotations }} - annotations: - {{ tpl .Values.meshGateway.serviceAccount.annotations . | nindent 4 | trim }} - {{- end }} -{{- with .Values.global.imagePullSecrets }} -imagePullSecrets: -{{- range . }} - - name: {{ .name }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/consul/templates/partition-init-job.yaml b/charts/consul/templates/partition-init-job.yaml deleted file mode 100644 index 2053419..0000000 --- a/charts/consul/templates/partition-init-job.yaml +++ /dev/null @@ -1,129 +0,0 @@ -{{- $serverEnabled := (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) -}} -{{- if (and .Values.global.adminPartitions.enabled (not $serverEnabled) (ne .Values.global.adminPartitions.name "default")) }} -{{- template "consul.reservedNamesFailer" (list .Values.global.adminPartitions.name "global.adminPartitions.name") }} -{{- if and (not .Values.externalServers.enabled) (ne .Values.global.adminPartitions.name "default") }}{{ fail "externalServers.enabled needs to be true and configured to create a non-default partition." }}{{ end -}} -{{- if and .Values.global.secretsBackend.vault.enabled .Values.global.acls.manageSystemACLs (not .Values.global.secretsBackend.vault.adminPartitionsRole) }}{{ fail "global.secretsBackend.vault.adminPartitionsRole is required when global.secretsBackend.vault.enabled and global.acls.manageSystemACLs are true." }}{{ end -}} -{{- if and .Values.externalServers.enabled (not .Values.externalServers.hosts) }}{{ fail "externalServers.hosts must be set if externalServers.enabled is true" }}{{ end -}} -apiVersion: batch/v1 -kind: Job -metadata: - name: {{ template "consul.fullname" . }}-partition-init - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: partition-init - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 4 }} - {{- end }} - annotations: - "helm.sh/hook": pre-install - "helm.sh/hook-weight": "2" - "helm.sh/hook-delete-policy": hook-succeeded,before-hook-creation -spec: - template: - metadata: - name: {{ template "consul.fullname" . }}-partition-init - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - release: {{ .Release.Name }} - component: partition-init - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 8 }} - {{- end }} - annotations: - "consul.hashicorp.com/connect-inject": "false" - "consul.hashicorp.com/mesh-inject": "false" - {{- if (and .Values.global.secretsBackend.vault.enabled (or .Values.global.tls.enabled .Values.global.acls.manageSystemACLs)) }} - "vault.hashicorp.com/agent-pre-populate-only": "true" - "vault.hashicorp.com/agent-inject": "true" - {{- if .Values.global.acls.manageSystemACLs }} - "vault.hashicorp.com/role": {{ .Values.global.secretsBackend.vault.adminPartitionsRole }} - {{- if .Values.global.acls.bootstrapToken.secretName }} - {{- with .Values.global.acls.bootstrapToken }} - "vault.hashicorp.com/agent-inject-secret-bootstrap-token": "{{ .secretName }}" - "vault.hashicorp.com/agent-inject-template-bootstrap-token": {{ template "consul.vaultSecretTemplate" . }} - {{- end }} - {{- end }} - {{- else }} - "vault.hashicorp.com/role": {{ .Values.global.secretsBackend.vault.consulCARole }} - {{- end }} - "vault.hashicorp.com/agent-inject-secret-serverca.crt": {{ .Values.global.tls.caCert.secretName }} - "vault.hashicorp.com/agent-inject-template-serverca.crt": {{ template "consul.serverTLSCATemplate" . }} - {{- if and .Values.global.secretsBackend.vault.ca.secretName .Values.global.secretsBackend.vault.ca.secretKey }} - "vault.hashicorp.com/agent-extra-secret": "{{ .Values.global.secretsBackend.vault.ca.secretName }}" - "vault.hashicorp.com/ca-cert": "/vault/custom/{{ .Values.global.secretsBackend.vault.ca.secretKey }}" - {{- end }} - {{- if .Values.global.secretsBackend.vault.agentAnnotations }} - {{ tpl .Values.global.secretsBackend.vault.agentAnnotations . | nindent 8 | trim }} - {{- end }} - {{- if (and (.Values.global.secretsBackend.vault.vaultNamespace) (not (hasKey (default "" .Values.global.secretsBackend.vault.agentAnnotations | fromYaml) "vault.hashicorp.com/namespace")))}} - "vault.hashicorp.com/namespace": "{{ .Values.global.secretsBackend.vault.vaultNamespace }}" - {{- end }} - {{- end }} - spec: - restartPolicy: Never - serviceAccountName: {{ template "consul.fullname" . }}-partition-init - {{- if .Values.global.tls.enabled }} - {{- if not (or .Values.externalServers.useSystemRoots .Values.global.secretsBackend.vault.enabled) }} - volumes: - - name: consul-ca-cert - secret: - {{- if .Values.global.tls.caCert.secretName }} - secretName: {{ .Values.global.tls.caCert.secretName }} - {{- else }} - secretName: {{ template "consul.fullname" . }}-ca-cert - {{- end }} - items: - - key: {{ default "tls.crt" .Values.global.tls.caCert.secretKey }} - path: tls.crt - {{- end }} - {{- end }} - containers: - - name: partition-init-job - image: {{ .Values.global.imageK8S }} - {{ template "consul.imagePullPolicy" . }} - {{- include "consul.restrictedSecurityContext" . | nindent 10 }} - env: - {{- include "consul.consulK8sConsulServerEnvVars" . | nindent 10 }} - {{- if (and .Values.global.acls.bootstrapToken.secretName .Values.global.acls.bootstrapToken.secretKey) }} - {{- if .Values.global.secretsBackend.vault.enabled }} - - name: CONSUL_ACL_TOKEN_FILE - value: /vault/secrets/bootstrap-token - {{- else }} - - name: CONSUL_ACL_TOKEN - valueFrom: - secretKeyRef: - name: {{ .Values.global.acls.bootstrapToken.secretName }} - key: {{ .Values.global.acls.bootstrapToken.secretKey }} - {{- end }} - {{- end }} - {{- if .Values.global.tls.enabled }} - {{- if not (or .Values.externalServers.useSystemRoots .Values.global.secretsBackend.vault.enabled) }} - volumeMounts: - - name: consul-ca-cert - mountPath: /consul/tls/ca - readOnly: true - {{- end }} - {{- end }} - command: - - "/bin/sh" - - "-ec" - - | - exec consul-k8s-control-plane partition-init \ - -log-level={{ .Values.global.logLevel }} \ - -log-json={{ .Values.global.logJSON }} \ - {{- if .Values.global.cloud.enabled }} - -tls-server-name=server.{{ .Values.global.datacenter}}.{{ .Values.global.domain}} \ - {{- end }} - resources: - requests: - memory: "50Mi" - cpu: "50m" - limits: - memory: "50Mi" - cpu: "50m" -{{- end }} diff --git a/charts/consul/templates/partition-init-podsecuritypolicy.yaml b/charts/consul/templates/partition-init-podsecuritypolicy.yaml deleted file mode 100644 index 2bc6782..0000000 --- a/charts/consul/templates/partition-init-podsecuritypolicy.yaml +++ /dev/null @@ -1,40 +0,0 @@ -{{- $serverEnabled := (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) -}} -{{- if (and .Values.global.adminPartitions.enabled .Values.global.enablePodSecurityPolicies (not $serverEnabled)) }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "consul.fullname" . }}-partition-init - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: partition-init - annotations: - "helm.sh/hook": pre-install,pre-upgrade - "helm.sh/hook-delete-policy": before-hook-creation -spec: - privileged: false - # Allow core volume types. - volumes: - - 'secret' - - 'emptyDir' - allowPrivilegeEscalation: false - # This is redundant with non-root + disallow privilege escalation, - # but we can provide it for defense in depth. - requiredDropCapabilities: - - ALL - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'RunAsAny' - fsGroup: - rule: 'RunAsAny' - readOnlyRootFilesystem: false -{{- end }} diff --git a/charts/consul/templates/partition-init-role.yaml b/charts/consul/templates/partition-init-role.yaml deleted file mode 100644 index 340c59e..0000000 --- a/charts/consul/templates/partition-init-role.yaml +++ /dev/null @@ -1,35 +0,0 @@ -{{- $serverEnabled := (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) -}} -{{- if (and .Values.global.adminPartitions.enabled (not $serverEnabled)) }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: {{ template "consul.fullname" . }}-partition-init - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: partition-init - annotations: - "helm.sh/hook": pre-install,pre-upgrade - "helm.sh/hook-delete-policy": before-hook-creation -rules: -{{- if .Values.connectInject.enabled }} - - apiGroups: [""] - resources: - - serviceaccounts - resourceNames: - - {{ template "consul.fullname" . }}-connect-injector - verbs: - - get -{{- end }} -{{- if .Values.global.enablePodSecurityPolicies }} - - apiGroups: ["policy"] - resources: ["podsecuritypolicies"] - resourceNames: - - {{ template "consul.fullname" . }}-partition-init - verbs: - - use -{{- end }} -{{- end }} diff --git a/charts/consul/templates/partition-init-rolebinding.yaml b/charts/consul/templates/partition-init-rolebinding.yaml deleted file mode 100644 index 432d6df..0000000 --- a/charts/consul/templates/partition-init-rolebinding.yaml +++ /dev/null @@ -1,24 +0,0 @@ -{{- $serverEnabled := (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) -}} -{{- if (and .Values.global.adminPartitions.enabled (not $serverEnabled)) }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: {{ template "consul.fullname" . }}-partition-init - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: partition-init - annotations: - "helm.sh/hook": pre-install,pre-upgrade - "helm.sh/hook-delete-policy": before-hook-creation -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: {{ template "consul.fullname" . }}-partition-init -subjects: - - kind: ServiceAccount - name: {{ template "consul.fullname" . }}-partition-init -{{- end }} diff --git a/charts/consul/templates/partition-init-serviceaccount.yaml b/charts/consul/templates/partition-init-serviceaccount.yaml deleted file mode 100644 index 65fcf43..0000000 --- a/charts/consul/templates/partition-init-serviceaccount.yaml +++ /dev/null @@ -1,23 +0,0 @@ -{{- $serverEnabled := (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) -}} -{{- if (and .Values.global.adminPartitions.enabled (not $serverEnabled)) }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "consul.fullname" . }}-partition-init - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: partition-init - annotations: - "helm.sh/hook": pre-install,pre-upgrade - "helm.sh/hook-delete-policy": before-hook-creation -{{- with .Values.global.imagePullSecrets }} -imagePullSecrets: -{{- range . }} - - name: {{ .name }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/consul/templates/partition-name-configmap.yaml b/charts/consul/templates/partition-name-configmap.yaml deleted file mode 100644 index ee330b0..0000000 --- a/charts/consul/templates/partition-name-configmap.yaml +++ /dev/null @@ -1,19 +0,0 @@ -{{- $serverEnabled := (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) -}} -{{- if (and .Values.global.adminPartitions.enabled (not $serverEnabled)) }} -# Immutable ConfigMap which saves the partition name. Attempting to update this configmap -# with a new Admin Partition name will cause the helm upgrade to fail -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ template "consul.fullname" . }}-partition - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: partition-init -immutable: true -data: - partitionName: {{ .Values.global.adminPartitions.name }} -{{- end }} diff --git a/charts/consul/templates/prometheus.yaml b/charts/consul/templates/prometheus.yaml deleted file mode 100644 index a708708..0000000 --- a/charts/consul/templates/prometheus.yaml +++ /dev/null @@ -1,488 +0,0 @@ -{{- if .Values.prometheus.enabled }} -# This file is auto-generated, see addons/gen.sh ---- -# Source: prometheus/templates/server/serviceaccount.yaml -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - component: "server" - app: prometheus - release: prometheus - chart: prometheus-13.2.1 - heritage: Helm - name: prometheus-server - namespace: {{ .Release.Namespace }} - annotations: - {} ---- -# Source: prometheus/templates/server/cm.yaml -apiVersion: v1 -kind: ConfigMap -metadata: - labels: - component: "server" - app: prometheus - release: prometheus - chart: prometheus-13.2.1 - heritage: Helm - name: prometheus-server - namespace: {{ .Release.Namespace }} -data: - alerting_rules.yml: | - {} - alerts: | - {} - prometheus.yml: | - global: - evaluation_interval: 1m - scrape_interval: 15s - scrape_timeout: 10s - rule_files: - - /etc/config/recording_rules.yml - - /etc/config/alerting_rules.yml - - /etc/config/rules - - /etc/config/alerts - scrape_configs: - - job_name: prometheus - static_configs: - - targets: - - localhost:9090 - - bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token - job_name: kubernetes-apiservers - kubernetes_sd_configs: - - role: endpoints - relabel_configs: - - action: keep - regex: default;kubernetes;https - source_labels: - - __meta_kubernetes_namespace - - __meta_kubernetes_service_name - - __meta_kubernetes_endpoint_port_name - scheme: https - tls_config: - ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt - insecure_skip_verify: true - - bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token - job_name: kubernetes-nodes - kubernetes_sd_configs: - - role: node - relabel_configs: - - action: labelmap - regex: __meta_kubernetes_node_label_(.+) - - replacement: kubernetes.default.svc:443 - target_label: __address__ - - regex: (.+) - replacement: /api/v1/nodes/$1/proxy/metrics - source_labels: - - __meta_kubernetes_node_name - target_label: __metrics_path__ - scheme: https - tls_config: - ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt - insecure_skip_verify: true - - bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token - job_name: kubernetes-nodes-cadvisor - kubernetes_sd_configs: - - role: node - relabel_configs: - - action: labelmap - regex: __meta_kubernetes_node_label_(.+) - - replacement: kubernetes.default.svc:443 - target_label: __address__ - - regex: (.+) - replacement: /api/v1/nodes/$1/proxy/metrics/cadvisor - source_labels: - - __meta_kubernetes_node_name - target_label: __metrics_path__ - scheme: https - tls_config: - ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt - insecure_skip_verify: true - - job_name: kubernetes-service-endpoints - kubernetes_sd_configs: - - role: endpoints - relabel_configs: - - action: keep - regex: true - source_labels: - - __meta_kubernetes_service_annotation_prometheus_io_scrape - - action: replace - regex: (https?) - source_labels: - - __meta_kubernetes_service_annotation_prometheus_io_scheme - target_label: __scheme__ - - action: replace - regex: (.+) - source_labels: - - __meta_kubernetes_service_annotation_prometheus_io_path - target_label: __metrics_path__ - - action: replace - regex: ([^:]+)(?::\d+)?;(\d+) - replacement: $1:$2 - source_labels: - - __address__ - - __meta_kubernetes_service_annotation_prometheus_io_port - target_label: __address__ - - action: labelmap - regex: __meta_kubernetes_service_label_(.+) - - action: replace - source_labels: - - __meta_kubernetes_namespace - target_label: kubernetes_namespace - - action: replace - source_labels: - - __meta_kubernetes_service_name - target_label: kubernetes_name - - action: replace - source_labels: - - __meta_kubernetes_pod_node_name - target_label: kubernetes_node - - job_name: kubernetes-service-endpoints-slow - kubernetes_sd_configs: - - role: endpoints - relabel_configs: - - action: keep - regex: true - source_labels: - - __meta_kubernetes_service_annotation_prometheus_io_scrape_slow - - action: replace - regex: (https?) - source_labels: - - __meta_kubernetes_service_annotation_prometheus_io_scheme - target_label: __scheme__ - - action: replace - regex: (.+) - source_labels: - - __meta_kubernetes_service_annotation_prometheus_io_path - target_label: __metrics_path__ - - action: replace - regex: ([^:]+)(?::\d+)?;(\d+) - replacement: $1:$2 - source_labels: - - __address__ - - __meta_kubernetes_service_annotation_prometheus_io_port - target_label: __address__ - - action: labelmap - regex: __meta_kubernetes_service_label_(.+) - - action: replace - source_labels: - - __meta_kubernetes_namespace - target_label: kubernetes_namespace - - action: replace - source_labels: - - __meta_kubernetes_service_name - target_label: kubernetes_name - - action: replace - source_labels: - - __meta_kubernetes_pod_node_name - target_label: kubernetes_node - scrape_interval: 5m - scrape_timeout: 30s - - honor_labels: true - job_name: prometheus-pushgateway - kubernetes_sd_configs: - - role: service - relabel_configs: - - action: keep - regex: pushgateway - source_labels: - - __meta_kubernetes_service_annotation_prometheus_io_probe - - job_name: kubernetes-services - kubernetes_sd_configs: - - role: service - metrics_path: /probe - params: - module: - - http_2xx - relabel_configs: - - action: keep - regex: true - source_labels: - - __meta_kubernetes_service_annotation_prometheus_io_probe - - source_labels: - - __address__ - target_label: __param_target - - replacement: blackbox - target_label: __address__ - - source_labels: - - __param_target - target_label: instance - - action: labelmap - regex: __meta_kubernetes_service_label_(.+) - - source_labels: - - __meta_kubernetes_namespace - target_label: kubernetes_namespace - - source_labels: - - __meta_kubernetes_service_name - target_label: kubernetes_name - - job_name: kubernetes-pods - kubernetes_sd_configs: - - role: pod - relabel_configs: - - action: keep - regex: true - source_labels: - - __meta_kubernetes_pod_annotation_prometheus_io_scrape - - action: replace - regex: (https?) - source_labels: - - __meta_kubernetes_pod_annotation_prometheus_io_scheme - target_label: __scheme__ - - action: replace - regex: (.+) - source_labels: - - __meta_kubernetes_pod_annotation_prometheus_io_path - target_label: __metrics_path__ - - action: replace - regex: ([^:]+)(?::\d+)?;(\d+) - replacement: $1:$2 - source_labels: - - __address__ - - __meta_kubernetes_pod_annotation_prometheus_io_port - target_label: __address__ - - action: labelmap - regex: __meta_kubernetes_pod_label_(.+) - - action: replace - source_labels: - - __meta_kubernetes_namespace - target_label: kubernetes_namespace - - action: replace - source_labels: - - __meta_kubernetes_pod_name - target_label: kubernetes_pod_name - - action: drop - regex: Pending|Succeeded|Failed - source_labels: - - __meta_kubernetes_pod_phase - - job_name: kubernetes-pods-slow - kubernetes_sd_configs: - - role: pod - relabel_configs: - - action: keep - regex: true - source_labels: - - __meta_kubernetes_pod_annotation_prometheus_io_scrape_slow - - action: replace - regex: (https?) - source_labels: - - __meta_kubernetes_pod_annotation_prometheus_io_scheme - target_label: __scheme__ - - action: replace - regex: (.+) - source_labels: - - __meta_kubernetes_pod_annotation_prometheus_io_path - target_label: __metrics_path__ - - action: replace - regex: ([^:]+)(?::\d+)?;(\d+) - replacement: $1:$2 - source_labels: - - __address__ - - __meta_kubernetes_pod_annotation_prometheus_io_port - target_label: __address__ - - action: labelmap - regex: __meta_kubernetes_pod_label_(.+) - - action: replace - source_labels: - - __meta_kubernetes_namespace - target_label: kubernetes_namespace - - action: replace - source_labels: - - __meta_kubernetes_pod_name - target_label: kubernetes_pod_name - - action: drop - regex: Pending|Succeeded|Failed - source_labels: - - __meta_kubernetes_pod_phase - scrape_interval: 5m - scrape_timeout: 30s - recording_rules.yml: | - {} - rules: | - {} ---- -# Source: prometheus/templates/server/clusterrole.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - component: "server" - app: prometheus - release: prometheus - chart: prometheus-13.2.1 - heritage: Helm - name: prometheus-server -rules: - - apiGroups: - - "" - resources: - - nodes - - nodes/proxy - - nodes/metrics - - services - - endpoints - - pods - - ingresses - - configmaps - verbs: - - get - - list - - watch - - apiGroups: - - "extensions" - - "networking.k8s.io" - resources: - - ingresses/status - - ingresses - verbs: - - get - - list - - watch - - nonResourceURLs: - - "/metrics" - verbs: - - get ---- -# Source: prometheus/templates/server/clusterrolebinding.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - component: "server" - app: prometheus - release: prometheus - chart: prometheus-13.2.1 - heritage: Helm - name: prometheus-server -subjects: - - kind: ServiceAccount - name: prometheus-server - namespace: {{ .Release.Namespace }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: prometheus-server ---- -# Source: prometheus/templates/server/service.yaml -apiVersion: v1 -kind: Service -metadata: - labels: - component: "server" - app: prometheus - release: prometheus - chart: prometheus-13.2.1 - heritage: Helm - name: prometheus-server - namespace: {{ .Release.Namespace }} -spec: - ports: - - name: http - port: 80 - protocol: TCP - targetPort: 9090 - selector: - component: "server" - app: prometheus - release: prometheus - sessionAffinity: None - type: "ClusterIP" ---- -# Source: prometheus/templates/server/deploy.yaml -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - component: "server" - app: prometheus - release: prometheus - chart: prometheus-13.2.1 - heritage: Helm - name: prometheus-server - namespace: {{ .Release.Namespace }} -spec: - selector: - matchLabels: - component: "server" - app: prometheus - release: prometheus - replicas: 1 - template: - metadata: - annotations: - consul.hashicorp.com/connect-inject: "false" - consul.hashicorp.com/mesh-inject: "false" - labels: - component: "server" - app: prometheus - release: prometheus - chart: prometheus-13.2.1 - heritage: Helm - spec: - serviceAccountName: prometheus-server - containers: - - name: prometheus-server-configmap-reload - image: "jimmidyson/configmap-reload:v0.4.0" - imagePullPolicy: "IfNotPresent" - args: - - --volume-dir=/etc/config - - --webhook-url=http://127.0.0.1:9090/-/reload - resources: - {} - volumeMounts: - - name: config-volume - mountPath: /etc/config - readOnly: true - - - name: prometheus-server - image: "quay.io/prometheus/prometheus:v2.24.0" - imagePullPolicy: "IfNotPresent" - args: - - --storage.tsdb.retention.time=15d - - --config.file=/etc/config/prometheus.yml - - --storage.tsdb.path=/data - - --web.console.libraries=/etc/prometheus/console_libraries - - --web.console.templates=/etc/prometheus/consoles - - --web.enable-lifecycle - ports: - - containerPort: 9090 - readinessProbe: - httpGet: - path: /-/ready - port: 9090 - initialDelaySeconds: 0 - periodSeconds: 5 - timeoutSeconds: 4 - failureThreshold: 3 - successThreshold: 1 - livenessProbe: - httpGet: - path: /-/healthy - port: 9090 - initialDelaySeconds: 30 - periodSeconds: 15 - timeoutSeconds: 10 - failureThreshold: 3 - successThreshold: 1 - resources: - {} - volumeMounts: - - name: config-volume - mountPath: /etc/config - - name: storage-volume - mountPath: /data - subPath: "" - securityContext: - fsGroup: 65534 - runAsGroup: 65534 - runAsNonRoot: true - runAsUser: 65534 - terminationGracePeriodSeconds: 300 - volumes: - - name: config-volume - configMap: - name: prometheus-server - - name: storage-volume - emptyDir: - {} -{{- end }} diff --git a/charts/consul/templates/server-acl-init-cleanup-job.yaml b/charts/consul/templates/server-acl-init-cleanup-job.yaml deleted file mode 100644 index 3d7d6c8..0000000 --- a/charts/consul/templates/server-acl-init-cleanup-job.yaml +++ /dev/null @@ -1,90 +0,0 @@ -{{- $serverEnabled := (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) -}} -{{- if (or $serverEnabled .Values.externalServers.enabled) }} -{{- if .Values.global.acls.manageSystemACLs }} -{{- /* See reason for this in server-acl-init-job.yaml */ -}} -{{- if eq (int .Values.server.updatePartition) 0 }} -# This job deletes the server-acl-init job once it completes successfully. -# It runs as a helm hook because it only needs to run when the server-acl-init -# Job gets recreated which only happens during an install or upgrade. -# We also utilize the helm hook-delete-policy to delete this job itself. -# We want to delete the server-acl-init job because once it runs successfully -# it's not needed and also because if it stays around then when users run -# helm upgrade with values that change the spec of the job, Kubernetes errors -# because the job spec is immutable. If the job is deleted, then a new job -# is created and there's no error. -apiVersion: batch/v1 -kind: Job -metadata: - name: {{ template "consul.fullname" . }}-server-acl-init-cleanup - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: server-acl-init-cleanup - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 4 }} - {{- end }} - annotations: - "helm.sh/hook": post-install,post-upgrade - "helm.sh/hook-weight": "0" - # If the hook fails then all that happens is we didn't delete the job. - # There's no reason for *this* job to stay around in that case so delete - # regardless of success. - "helm.sh/hook-delete-policy": hook-succeeded,hook-failed -spec: - template: - metadata: - name: {{ template "consul.fullname" . }}-server-acl-init-cleanup - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - release: {{ .Release.Name }} - component: server-acl-init-cleanup - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 8 }} - {{- end }} - annotations: - "consul.hashicorp.com/connect-inject": "false" - "consul.hashicorp.com/mesh-inject": "false" - {{- if .Values.global.acls.annotations }} - {{- tpl .Values.global.acls.annotations . | nindent 8 }} - {{- end }} - spec: - restartPolicy: Never - serviceAccountName: {{ template "consul.fullname" . }}-server-acl-init-cleanup - {{- if .Values.server.containerSecurityContext.aclInit }} - securityContext: - {{- toYaml .Values.server.containerSecurityContext.aclInit | nindent 8 }} - {{- end }} - containers: - - name: server-acl-init-cleanup - image: {{ .Values.global.imageK8S }} - {{ template "consul.imagePullPolicy" . }} - {{- if not .Values.server.containerSecurityContext.aclInit }} - {{- include "consul.restrictedSecurityContext" . | nindent 10 }} - {{- end }} - command: - - consul-k8s-control-plane - args: - - delete-completed-job - - -log-level={{ default .Values.global.logLevel .Values.global.acls.logLevel }} - - -log-json={{ .Values.global.logJSON }} - - -k8s-namespace={{ .Release.Namespace }} - - {{ template "consul.fullname" . }}-server-acl-init - {{- if .Values.global.acls.resources }} - resources: - {{- toYaml .Values.global.acls.resources | nindent 12 }} - {{- end }} - {{- if .Values.global.acls.tolerations }} - tolerations: - {{ tpl .Values.global.acls.tolerations . | indent 8 | trim }} - {{- end }} - {{- if .Values.global.acls.nodeSelector }} - nodeSelector: - {{ tpl .Values.global.acls.nodeSelector . | indent 8 | trim }} - {{- end }} - {{- end }} - {{- end }} - {{- end }} diff --git a/charts/consul/templates/server-acl-init-cleanup-podsecuritypolicy.yaml b/charts/consul/templates/server-acl-init-cleanup-podsecuritypolicy.yaml deleted file mode 100644 index dd5dad2..0000000 --- a/charts/consul/templates/server-acl-init-cleanup-podsecuritypolicy.yaml +++ /dev/null @@ -1,40 +0,0 @@ -{{- $serverEnabled := (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) -}} -{{- if (or $serverEnabled .Values.externalServers.enabled) }} -{{- if .Values.global.acls.manageSystemACLs }} -{{- if .Values.global.enablePodSecurityPolicies }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "consul.fullname" . }}-server-acl-init-cleanup - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: server-acl-init-cleanup -spec: - privileged: false - # Allow core volume types. - volumes: - - 'secret' - allowPrivilegeEscalation: false - # This is redundant with non-root + disallow privilege escalation, - # but we can provide it for defense in depth. - requiredDropCapabilities: - - ALL - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'RunAsAny' - fsGroup: - rule: 'RunAsAny' - readOnlyRootFilesystem: false - {{- end }} - {{- end }} - {{- end }} diff --git a/charts/consul/templates/server-acl-init-cleanup-role.yaml b/charts/consul/templates/server-acl-init-cleanup-role.yaml deleted file mode 100644 index 0a2f296..0000000 --- a/charts/consul/templates/server-acl-init-cleanup-role.yaml +++ /dev/null @@ -1,28 +0,0 @@ -{{- $serverEnabled := (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) -}} -{{- if (or $serverEnabled .Values.externalServers.enabled) }} -{{- if .Values.global.acls.manageSystemACLs }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: {{ template "consul.fullname" . }}-server-acl-init-cleanup - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: server-acl-init-cleanup -rules: - - apiGroups: ["batch"] - resources: ["jobs"] - verbs: ["get", "delete"] -{{- if .Values.global.enablePodSecurityPolicies }} - - apiGroups: ["policy"] - resources: ["podsecuritypolicies"] - resourceNames: - - {{ template "consul.fullname" . }}-server-acl-init-cleanup - verbs: - - use -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/consul/templates/server-acl-init-cleanup-rolebinding.yaml b/charts/consul/templates/server-acl-init-cleanup-rolebinding.yaml deleted file mode 100644 index 268eaa5..0000000 --- a/charts/consul/templates/server-acl-init-cleanup-rolebinding.yaml +++ /dev/null @@ -1,23 +0,0 @@ -{{- $serverEnabled := (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) -}} -{{- if (or $serverEnabled .Values.externalServers.enabled) }} -{{- if .Values.global.acls.manageSystemACLs }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: {{ template "consul.fullname" . }}-server-acl-init-cleanup - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: server-acl-init-cleanup -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: {{ template "consul.fullname" . }}-server-acl-init-cleanup -subjects: - - kind: ServiceAccount - name: {{ template "consul.fullname" . }}-server-acl-init-cleanup -{{- end }} -{{- end }} diff --git a/charts/consul/templates/server-acl-init-cleanup-serviceaccount.yaml b/charts/consul/templates/server-acl-init-cleanup-serviceaccount.yaml deleted file mode 100644 index 604e6d7..0000000 --- a/charts/consul/templates/server-acl-init-cleanup-serviceaccount.yaml +++ /dev/null @@ -1,22 +0,0 @@ -{{- $serverEnabled := (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) -}} -{{- if (or $serverEnabled .Values.externalServers.enabled) }} -{{- if .Values.global.acls.manageSystemACLs }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "consul.fullname" . }}-server-acl-init-cleanup - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: server-acl-init-cleanup -{{- with .Values.global.imagePullSecrets }} -imagePullSecrets: -{{- range . }} - - name: {{ .name }} -{{- end }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/consul/templates/server-acl-init-job.yaml b/charts/consul/templates/server-acl-init-job.yaml deleted file mode 100644 index a6be262..0000000 --- a/charts/consul/templates/server-acl-init-job.yaml +++ /dev/null @@ -1,348 +0,0 @@ -{{- $serverEnabled := (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) -}} -{{- if (and $serverEnabled .Values.externalServers.enabled) }}{{ fail "only one of server.enabled or externalServers.enabled can be set" }}{{ end -}} -{{- if (or $serverEnabled .Values.externalServers.enabled) }} -{{- if and .Values.global.acls.createReplicationToken (not .Values.global.acls.manageSystemACLs) }}{{ fail "if global.acls.createReplicationToken is true, global.acls.manageSystemACLs must be true" }}{{ end -}} -{{- if .Values.global.bootstrapACLs }}{{ fail "global.bootstrapACLs was removed, use global.acls.manageSystemACLs instead" }}{{ end -}} -{{- if .Values.global.acls.manageSystemACLs }} -{{- if or (and .Values.global.acls.bootstrapToken.secretName (not .Values.global.acls.bootstrapToken.secretKey)) (and .Values.global.acls.bootstrapToken.secretKey (not .Values.global.acls.bootstrapToken.secretName))}}{{ fail "both global.acls.bootstrapToken.secretKey and global.acls.bootstrapToken.secretName must be set if one of them is provided" }}{{ end -}} -{{- if or (and .Values.global.acls.replicationToken.secretName (not .Values.global.acls.replicationToken.secretKey)) (and .Values.global.acls.replicationToken.secretKey (not .Values.global.acls.replicationToken.secretName))}}{{ fail "both global.acls.replicationToken.secretKey and global.acls.replicationToken.secretName must be set if one of them is provided" }}{{ end -}} -{{- if (and .Values.global.secretsBackend.vault.enabled (and (not .Values.global.acls.bootstrapToken.secretName) (not .Values.global.acls.replicationToken.secretName ))) }}{{fail "global.acls.bootstrapToken or global.acls.replicationToken must be provided when global.secretsBackend.vault.enabled and global.acls.manageSystemACLs are true" }}{{ end -}} -{{ template "consul.validateRequiredCloudSecretsExist" . }} -{{ template "consul.validateCloudSecretKeys" . }} -{{- if (and .Values.global.secretsBackend.vault.enabled (not .Values.global.secretsBackend.vault.manageSystemACLsRole)) }}{{fail "global.secretsBackend.vault.manageSystemACLsRole is required when global.secretsBackend.vault.enabled and global.acls.manageSystemACLs are true" }}{{ end -}} - {{- /* We don't render this job when server.updatePartition > 0 because that - means a server rollout is in progress and this job won't complete unless - the rollout is finished (which won't happen until the partition is 0). - If we ran it in this case, then the job would not complete which would cause - the server-acl-init-cleanup hook to run indefinitely which would cause the - helm upgrade command to hang. -*/ -}} -{{- if eq (int .Values.server.updatePartition) 0 }} -apiVersion: batch/v1 -kind: Job -metadata: - name: {{ template "consul.fullname" . }}-server-acl-init - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: server-acl-init - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 4 }} - {{- end }} - {{- if .Values.global.argocd.enabled }} - annotations: - "argocd.argoproj.io/hook": "Sync" - "argocd.argoproj.io/hook-delete-policy": "HookSucceeded" - {{- end }} -spec: - template: - metadata: - name: {{ template "consul.fullname" . }}-server-acl-init - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - release: {{ .Release.Name }} - component: server-acl-init - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 8 }} - {{- end }} - annotations: - "consul.hashicorp.com/connect-inject": "false" - "consul.hashicorp.com/mesh-inject": "false" - {{- if .Values.global.acls.annotations }} - {{- tpl .Values.global.acls.annotations . | nindent 8 }} - {{- end }} - {{- if .Values.global.secretsBackend.vault.enabled }} - {{- /* Run the Vault agent as both an init container and sidecar. - The Vault agent sidecar is needed when server-acl-init bootstraps ACLs - and writes the bootstrap token back to Vault. - * agent-pre-populate: true - Run the Vault agent init container. - * agent-pre-populate-only: false - Also, run the Vault agent sidecar. - * agent-cache-enable: true - Enable the Agent cache listener. - * agent-cache-listener-port: 8200 - (optional) Listen on 127.0.0.1:8200. - * agent-enable-quit: true - Enable a "quit" endpoint. server-acl-init - tells the Vault agent to stop (without this the Job will not complete). - */}} - "vault.hashicorp.com/agent-pre-populate": "true" - "vault.hashicorp.com/agent-pre-populate-only": "false" - "vault.hashicorp.com/agent-cache-enable": "true" - "vault.hashicorp.com/agent-cache-listener-port": "8200" - "vault.hashicorp.com/agent-enable-quit": "true" - "vault.hashicorp.com/agent-inject": "true" - {{- if .Values.global.acls.partitionToken.secretName }} - {{- with .Values.global.acls.partitionToken }} - "vault.hashicorp.com/agent-inject-secret-partition-token": "{{ .secretName }}" - "vault.hashicorp.com/agent-inject-template-partition-token": {{ template "consul.vaultSecretTemplate" . }} - {{- end }} - {{- end }} - {{- if .Values.global.tls.enabled }} - "vault.hashicorp.com/agent-inject-secret-serverca.crt": {{ .Values.global.tls.caCert.secretName }} - "vault.hashicorp.com/agent-inject-template-serverca.crt": {{ template "consul.serverTLSCATemplate" . }} - {{- end }} - {{- if .Values.global.secretsBackend.vault.manageSystemACLsRole }} - "vault.hashicorp.com/role": {{ .Values.global.secretsBackend.vault.manageSystemACLsRole }} - {{- else if .Values.global.tls.enabled }} - "vault.hashicorp.com/role": {{ .Values.global.secretsBackend.vault.consulCARole }} - {{- end }} - {{- if and .Values.global.secretsBackend.vault.ca.secretName .Values.global.secretsBackend.vault.ca.secretKey }} - "vault.hashicorp.com/agent-extra-secret": "{{ .Values.global.secretsBackend.vault.ca.secretName }}" - "vault.hashicorp.com/ca-cert": "/vault/custom/{{ .Values.global.secretsBackend.vault.ca.secretKey }}" - {{- end }} - {{- if .Values.global.acls.replicationToken.secretName }} - "vault.hashicorp.com/agent-inject-secret-replication-token": "{{ .Values.global.acls.replicationToken.secretName }}" - "vault.hashicorp.com/agent-inject-template-replication-token": {{ template "consul.vaultReplicationTokenTemplate" . }} - {{- end }} - {{- if .Values.global.secretsBackend.vault.agentAnnotations }} - {{ tpl .Values.global.secretsBackend.vault.agentAnnotations . | nindent 8 | trim }} - {{- end }} - {{- if (and (.Values.global.secretsBackend.vault.vaultNamespace) (not (hasKey (default "" .Values.global.secretsBackend.vault.agentAnnotations | fromYaml) "vault.hashicorp.com/namespace")))}} - "vault.hashicorp.com/namespace": "{{ .Values.global.secretsBackend.vault.vaultNamespace }}" - {{- end }} - {{- end }} - spec: - restartPolicy: Never - serviceAccountName: {{ template "consul.fullname" . }}-server-acl-init - {{- if .Values.server.containerSecurityContext.aclInit }} - securityContext: - {{- toYaml .Values.server.containerSecurityContext.aclInit | nindent 8 }} - {{- end }} - {{- if (or .Values.global.tls.enabled .Values.global.acls.replicationToken.secretName .Values.global.acls.bootstrapToken.secretName) }} - volumes: - {{- if and .Values.global.tls.enabled (not .Values.global.secretsBackend.vault.enabled) }} - {{- if not (and .Values.externalServers.enabled .Values.externalServers.useSystemRoots) }} - - name: consul-ca-cert - secret: - {{- if .Values.global.tls.caCert.secretName }} - secretName: {{ .Values.global.tls.caCert.secretName }} - {{- else }} - secretName: {{ template "consul.fullname" . }}-ca-cert - {{- end }} - items: - - key: {{ default "tls.crt" .Values.global.tls.caCert.secretKey }} - path: tls.crt - {{- end }} - {{- end }} - {{- if and .Values.global.acls.replicationToken.secretName (not .Values.global.secretsBackend.vault.enabled) }} - - name: acl-replication-token - secret: - secretName: {{ .Values.global.acls.replicationToken.secretName }} - items: - - key: {{ .Values.global.acls.replicationToken.secretKey }} - path: acl-replication-token - {{- end }} - {{- end }} - containers: - - name: server-acl-init-job - image: {{ .Values.global.imageK8S }} - {{ template "consul.imagePullPolicy" . }} - {{- if not .Values.server.containerSecurityContext.aclInit }} - {{- include "consul.restrictedSecurityContext" . | nindent 8 }} - {{- end }} - env: - - name: NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - # Extract the Vault namespace from the Vault agent annotations. - {{- if .Values.global.secretsBackend.vault.enabled }} - {{- if and (.Values.global.secretsBackend.vault.agentAnnotations) (hasKey (default "" .Values.global.secretsBackend.vault.agentAnnotations | fromYaml) "vault.hashicorp.com/namespace") }} - - name: VAULT_NAMESPACE - value: {{ get (tpl .Values.global.secretsBackend.vault.agentAnnotations . | fromYaml) "vault.hashicorp.com/namespace" }} - {{- else if .Values.global.secretsBackend.vault.vaultNamespace }} - - name: VAULT_NAMESPACE - value: {{ .Values.global.secretsBackend.vault.vaultNamespace }} - {{- end }} - {{- end }} - {{- include "consul.consulK8sConsulServerEnvVars" . | nindent 8 }} - {{- if (or .Values.global.tls.enabled .Values.global.acls.replicationToken.secretName .Values.global.acls.bootstrapToken.secretName) }} - volumeMounts: - {{- if and .Values.global.tls.enabled (not .Values.global.secretsBackend.vault.enabled) }} - {{- if not (and .Values.externalServers.enabled .Values.externalServers.useSystemRoots) }} - - name: consul-ca-cert - mountPath: /consul/tls/ca - readOnly: true - {{- end }} - {{- end }} - {{- if and .Values.global.acls.replicationToken.secretName (not .Values.global.secretsBackend.vault.enabled) }} - - name: acl-replication-token - mountPath: /consul/acl/tokens - readOnly: true - {{- end }} - {{- end }} - command: - - "/bin/sh" - - "-ec" - - | - CONSUL_FULLNAME="{{template "consul.fullname" . }}" - - exec consul-k8s-control-plane server-acl-init \ - -log-level={{ default .Values.global.logLevel .Values.global.acls.logLevel}} \ - -log-json={{ .Values.global.logJSON }} \ - -resource-prefix=${CONSUL_FULLNAME} \ - -k8s-namespace={{ .Release.Namespace }} \ - -set-server-tokens={{ $serverEnabled }} \ - {{- if .Values.global.secretsBackend.vault.enabled }} - -secrets-backend=vault \ - {{- else }} - -secrets-backend=kubernetes \ - {{- end }} - - {{- if .Values.global.acls.bootstrapToken.secretName }} - -bootstrap-token-secret-name={{ .Values.global.acls.bootstrapToken.secretName }} \ - -bootstrap-token-secret-key={{ .Values.global.acls.bootstrapToken.secretKey }} \ - {{- end }} - - {{- if .Values.syncCatalog.enabled }} - -sync-catalog=true \ - {{- if .Values.syncCatalog.consulNodeName }} - -sync-consul-node-name={{ .Values.syncCatalog.consulNodeName }} \ - {{- end }} - {{- end }} - - {{- if .Values.global.peering.enabled }} - -enable-peering=true \ - {{- end }} - {{- if (or (and (ne (.Values.dns.enabled | toString) "-") .Values.dns.enabled) (and (eq (.Values.dns.enabled | toString) "-") .Values.connectInject.transparentProxy.defaultEnabled)) }} - -allow-dns=true \ - {{- end }} - - {{- if (or (and (ne (.Values.connectInject.enabled | toString) "-") .Values.connectInject.enabled) (and (eq (.Values.connectInject.enabled | toString) "-") .Values.global.enabled)) }} - -connect-inject=true \ - {{- end }} - {{- if and .Values.externalServers.enabled .Values.externalServers.k8sAuthMethodHost }} - -auth-method-host={{ .Values.externalServers.k8sAuthMethodHost }} \ - {{- end }} - - {{- if .Values.global.federation.k8sAuthMethodHost }} - -auth-method-host={{ .Values.global.federation.k8sAuthMethodHost }} \ - {{- end }} - - {{- if .Values.meshGateway.enabled }} - -mesh-gateway=true \ - {{- end }} - {{- if .Values.dns.proxy.enabled }} - -dns-proxy=true \ - {{- end }} - {{- if .Values.ingressGateways.enabled }} - {{- if .Values.global.enableConsulNamespaces }} - {{- $root := . }} - {{- range .Values.ingressGateways.gateways }} - {{- if (or $root.Values.ingressGateways.defaults.consulNamespace .consulNamespace) }} - -ingress-gateway-name="{{ .name }}.{{ (default $root.Values.ingressGateways.defaults.consulNamespace .consulNamespace) }}" \ - {{- else }} - -ingress-gateway-name="{{ .name }}" \ - {{- end }} - {{- end }} - {{- else }} - {{- range .Values.ingressGateways.gateways }} - -ingress-gateway-name="{{ .name }}" \ - {{- end }} - {{- end }} - {{- end }} - - {{- if .Values.terminatingGateways.enabled }} - {{- if .Values.global.enableConsulNamespaces }} - {{- $root := . }} - {{- range .Values.terminatingGateways.gateways }} - {{- if (or $root.Values.terminatingGateways.defaults.consulNamespace .consulNamespace) }} - -terminating-gateway-name="{{ .name }}.{{ (default $root.Values.terminatingGateways.defaults.consulNamespace .consulNamespace) }}" \ - {{- else }} - -terminating-gateway-name="{{ .name }}" \ - {{- end }} - {{- end }} - {{- else }} - {{- range .Values.terminatingGateways.gateways }} - -terminating-gateway-name="{{ .name }}" \ - {{- end }} - {{- end }} - {{- end }} - - {{- if .Values.connectInject.aclBindingRuleSelector }} - -acl-binding-rule-selector={{ .Values.connectInject.aclBindingRuleSelector }} \ - {{- end }} - - {{- if (and .Values.global.enterpriseLicense.secretName .Values.global.enterpriseLicense.secretKey) }} - -create-enterprise-license-token=true \ - {{- end }} - - {{- if (and (not .Values.global.metrics.datadog.dogstatsd.enabled) .Values.global.metrics.datadog.enabled .Values.global.acls.manageSystemACLs) }} - -create-dd-agent-token=true \ - {{- end }} - - {{- if .Values.server.snapshotAgent.enabled }} - -snapshot-agent=true \ - {{- end }} - - {{- if not (or (and (ne (.Values.client.enabled | toString) "-") .Values.client.enabled) (and (eq (.Values.client.enabled | toString) "-") .Values.global.enabled)) }} - -client=false \ - {{- end }} - - {{- if .Values.global.acls.createReplicationToken }} - -create-acl-replication-token=true \ - {{- end }} - - {{- if .Values.global.federation.enabled }} - -federation=true \ - {{- end }} - - {{- if .Values.global.acls.replicationToken.secretName }} - {{- if .Values.global.secretsBackend.vault.enabled }} - -acl-replication-token-file=/vault/secrets/replication-token \ - {{- else }} - -acl-replication-token-file=/consul/acl/tokens/acl-replication-token \ - {{- end }} - {{- end }} - {{- if and .Values.global.secretsBackend.vault.enabled .Values.global.acls.partitionToken.secretName }} - -partition-token-file=/vault/secrets/partition-token \ - {{- end }} - - {{- if .Values.global.enableConsulNamespaces }} - -enable-namespaces=true \ - {{- /* syncCatalog must be enabled to set sync flags */}} - {{- if (or (and (ne (.Values.syncCatalog.enabled | toString) "-") .Values.syncCatalog.enabled) (and (eq (.Values.syncCatalog.enabled | toString) "-") .Values.global.enabled)) }} - {{- if .Values.syncCatalog.consulNamespaces.consulDestinationNamespace }} - -consul-sync-destination-namespace={{ .Values.syncCatalog.consulNamespaces.consulDestinationNamespace }} \ - {{- end }} - {{- if .Values.syncCatalog.consulNamespaces.mirroringK8S }} - -enable-sync-k8s-namespace-mirroring=true \ - {{- if .Values.syncCatalog.consulNamespaces.mirroringK8SPrefix }} - -sync-k8s-namespace-mirroring-prefix={{ .Values.syncCatalog.consulNamespaces.mirroringK8SPrefix }} \ - {{- end }} - {{- end }} - {{- end }} - - {{- /* connectInject must be enabled to set inject flags */}} - {{- if (or (and (ne (.Values.connectInject.enabled | toString) "-") .Values.connectInject.enabled) (and (eq (.Values.connectInject.enabled | toString) "-") .Values.global.enabled)) }} - {{- if .Values.connectInject.consulNamespaces.consulDestinationNamespace }} - -consul-inject-destination-namespace={{ .Values.connectInject.consulNamespaces.consulDestinationNamespace }} \ - {{- end }} - {{- if .Values.connectInject.consulNamespaces.mirroringK8S }} - -enable-inject-k8s-namespace-mirroring=true \ - {{- if .Values.connectInject.consulNamespaces.mirroringK8SPrefix }} - -inject-k8s-namespace-mirroring-prefix={{ .Values.connectInject.consulNamespaces.mirroringK8SPrefix }} \ - {{- end }} - {{- end }} - {{- end }} - {{- end }} - {{- if .Values.global.acls.resources }} - resources: - {{- toYaml .Values.global.acls.resources | nindent 10 }} - {{- end }} - {{- if .Values.global.acls.tolerations }} - tolerations: - {{ tpl .Values.global.acls.tolerations . | indent 8 | trim }} - {{- end }} - {{- if .Values.global.acls.nodeSelector }} - nodeSelector: - {{ tpl .Values.global.acls.nodeSelector . | indent 8 | trim }} - {{- end }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/consul/templates/server-acl-init-podsecuritypolicy.yaml b/charts/consul/templates/server-acl-init-podsecuritypolicy.yaml deleted file mode 100644 index 9bf93e2..0000000 --- a/charts/consul/templates/server-acl-init-podsecuritypolicy.yaml +++ /dev/null @@ -1,41 +0,0 @@ -{{- $serverEnabled := (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) -}} -{{- if (or $serverEnabled .Values.externalServers.enabled) }} -{{- if .Values.global.acls.manageSystemACLs }} -{{- if .Values.global.enablePodSecurityPolicies }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "consul.fullname" . }}-server-acl-init - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: server-acl-init -spec: - privileged: false - # Allow core volume types. - volumes: - - 'secret' - - 'emptyDir' - allowPrivilegeEscalation: false - # This is redundant with non-root + disallow privilege escalation, - # but we can provide it for defense in depth. - requiredDropCapabilities: - - ALL - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'RunAsAny' - fsGroup: - rule: 'RunAsAny' - readOnlyRootFilesystem: false - {{- end }} - {{- end }} - {{- end }} diff --git a/charts/consul/templates/server-acl-init-role.yaml b/charts/consul/templates/server-acl-init-role.yaml deleted file mode 100644 index eb7b6a9..0000000 --- a/charts/consul/templates/server-acl-init-role.yaml +++ /dev/null @@ -1,38 +0,0 @@ -{{- $serverEnabled := (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) -}} -{{- if (or $serverEnabled .Values.externalServers.enabled) }} -{{- if .Values.global.acls.manageSystemACLs }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: {{ template "consul.fullname" . }}-server-acl-init - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: server-acl-init -rules: -- apiGroups: [ "" ] - resources: - - secrets - verbs: - - create - - get -- apiGroups: [ "" ] - resources: - - serviceaccounts - resourceNames: - - {{ template "consul.fullname" . }}-auth-method - verbs: - - get -{{- if .Values.global.enablePodSecurityPolicies }} -- apiGroups: [ "policy" ] - resources: [ "podsecuritypolicies" ] - resourceNames: - - {{ template "consul.fullname" . }}-server-acl-init - verbs: - - use -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/consul/templates/server-acl-init-rolebinding.yaml b/charts/consul/templates/server-acl-init-rolebinding.yaml deleted file mode 100644 index fda4726..0000000 --- a/charts/consul/templates/server-acl-init-rolebinding.yaml +++ /dev/null @@ -1,23 +0,0 @@ -{{- $serverEnabled := (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) -}} -{{- if (or $serverEnabled .Values.externalServers.enabled) }} -{{- if .Values.global.acls.manageSystemACLs }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: {{ template "consul.fullname" . }}-server-acl-init - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: server-acl-init -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: {{ template "consul.fullname" . }}-server-acl-init -subjects: - - kind: ServiceAccount - name: {{ template "consul.fullname" . }}-server-acl-init -{{- end }} -{{- end }} diff --git a/charts/consul/templates/server-acl-init-serviceaccount.yaml b/charts/consul/templates/server-acl-init-serviceaccount.yaml deleted file mode 100644 index c0e257d..0000000 --- a/charts/consul/templates/server-acl-init-serviceaccount.yaml +++ /dev/null @@ -1,22 +0,0 @@ -{{- $serverEnabled := (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) -}} -{{- if (or $serverEnabled .Values.externalServers.enabled) }} -{{- if .Values.global.acls.manageSystemACLs }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "consul.fullname" . }}-server-acl-init - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: server-acl-init -{{- with .Values.global.imagePullSecrets }} -imagePullSecrets: -{{- range . }} - - name: {{ .name }} -{{- end }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/consul/templates/server-clusterrole.yaml b/charts/consul/templates/server-clusterrole.yaml deleted file mode 100644 index c22f562..0000000 --- a/charts/consul/templates/server-clusterrole.yaml +++ /dev/null @@ -1,16 +0,0 @@ -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "consul.fullname" . }}-server - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: server -rules: -- apiGroups: [""] - resources: ["nodes"] - verbs: - - get diff --git a/charts/consul/templates/server-clusterrolebinding.yaml b/charts/consul/templates/server-clusterrolebinding.yaml deleted file mode 100644 index 854fda8..0000000 --- a/charts/consul/templates/server-clusterrolebinding.yaml +++ /dev/null @@ -1,18 +0,0 @@ -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "consul.fullname" . }}-server - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: server -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "consul.fullname" . }}-server -subjects: -- kind: ServiceAccount - name: {{ template "consul.fullname" . }}-server - namespace: {{ .Release.Namespace }} diff --git a/charts/consul/templates/server-config-configmap.yaml b/charts/consul/templates/server-config-configmap.yaml deleted file mode 100644 index 8c74364..0000000 --- a/charts/consul/templates/server-config-configmap.yaml +++ /dev/null @@ -1,220 +0,0 @@ -{{- if (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) }} -{{- if (not (or (eq .Values.server.limits.requestLimits.mode "disabled") (eq .Values.server.limits.requestLimits.mode "permissive") (eq .Values.server.limits.requestLimits.mode "enforce"))) }}{{fail "server.limits.requestLimits.mode must be one of the following values: disabled, permissive, and enforce." }}{{ end -}} -{{- if and .Values.server.auditLogs.enabled (not .Values.global.acls.manageSystemACLs) }}{{fail "ACLs must be enabled inorder to configure audit logs"}}{{ end -}} -# StatefulSet to run the actual Consul server cluster. -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ template "consul.fullname" . }}-server-config - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: server -data: - server.json: | - { - {{- if and .Values.global.secretsBackend.vault.enabled }} - "auto_reload_config": true, - {{- end }} - "bind_addr": "0.0.0.0", - "bootstrap_expect": {{ if .Values.server.bootstrapExpect }}{{ .Values.server.bootstrapExpect }}{{ else }}{{ .Values.server.replicas }}{{ end }}, - "client_addr": "0.0.0.0", - "connect": { - "enabled": {{ .Values.server.connect }} - }, - "datacenter": "{{ .Values.global.datacenter }}", - "data_dir": "/consul/data", - {{- if .Values.server.logLevel }} - "log_level": "{{ .Values.server.logLevel | upper }}", - {{- end }} - "enable_debug": {{ .Values.server.enableAgentDebug }}, - "domain": "{{ .Values.global.domain }}", - "limits": { - "request_limits": { - "mode": "{{ .Values.server.limits.requestLimits.mode }}", - "read_rate": {{ .Values.server.limits.requestLimits.readRate }}, - "write_rate": {{ .Values.server.limits.requestLimits.writeRate }} - } - }, - "ports": { - {{- if not .Values.global.tls.enabled }} - "grpc": 8502, - "grpc_tls": -1, - {{- end }} - {{- if .Values.global.tls.enabled }} - "grpc": -1, - "grpc_tls": 8502, - {{- end }} - "serf_lan": {{ .Values.server.ports.serflan.port }} - }, - "recursors": {{ .Values.global.recursors | toJson }}, - "retry_join": ["{{template "consul.fullname" . }}-server.{{ .Release.Namespace }}.svc:{{ .Values.server.ports.serflan.port }}"], - {{- if .Values.global.peering.enabled }} - "peering": { - "enabled": true - }, - {{- end }} - "server": true, - "leave_on_terminate": true, - "autopilot": { - "min_quorum": {{ template "consul.server.autopilotMinQuorum" . }}, - "disable_upgrade_migration": true - } - } - {{- $vaultConnectCAEnabled := and .Values.global.secretsBackend.vault.connectCA.address .Values.global.secretsBackend.vault.connectCA.rootPKIPath .Values.global.secretsBackend.vault.connectCA.intermediatePKIPath -}} - {{- if and .Values.global.secretsBackend.vault.enabled $vaultConnectCAEnabled }} - {{- with .Values.global.secretsBackend.vault }} - connect-ca-config.json: | - { - "connect": [ - { - "ca_config": [ - { - "address": "{{ .connectCA.address }}", - {{- if and .ca.secretName .ca.secretKey }} - "ca_file": "/consul/vault-ca/tls.crt", - {{- end }} - "intermediate_pki_path": "{{ .connectCA.intermediatePKIPath }}", - {{- if (and (.vaultNamespace) (not (contains "namespace" (default "" .connectCA.additionalConfig)))) }} - "namespace": "{{ .vaultNamespace }}", - {{- end }} - "root_pki_path": "{{ .connectCA.rootPKIPath }}", - "auth_method": { - "type": "kubernetes", - "mount_path": "{{ .connectCA.authMethodPath }}", - "params": { - "role": "{{ .consulServerRole }}" - } - } - } - ], - "ca_provider": "vault" - } - ] - } - {{- if .connectCA.additionalConfig }} - additional-connect-ca-config.json: | -{{ tpl .connectCA.additionalConfig $ | trimAll "\"" | indent 4 }} - {{- end }} - {{- end }} - {{- end }} - {{- if .Values.global.acls.manageSystemACLs }} - acl-config.json: |- - { - "acl": { - "enabled": true, - "default_policy": "deny", - "down_policy": "extend-cache", - {{- if (and .Values.global.acls.replicationToken.secretName .Values.global.acls.replicationToken.secretKey) }} - "enable_token_replication": true, - {{- end }} - "enable_token_persistence": true - } - } - {{- end }} - {{- if .Values.global.tls.enabled }} - tls-config.json: |- - { - "tls": { - {{- if .Values.global.tls.verify }} - "internal_rpc": { - "verify_incoming": true, - "verify_server_hostname": true - }, - "grpc": { - "verify_incoming": false - }, - {{- end }} - "defaults": { - {{- if .Values.global.tls.verify }} - "verify_outgoing": true, - {{- end }} - {{- if .Values.global.secretsBackend.vault.enabled }} - "ca_file": "/vault/secrets/serverca.crt", - "cert_file": "/vault/secrets/servercert.crt", - "key_file": "/vault/secrets/servercert.key" - {{- else }} - "ca_file": "/consul/tls/ca/tls.crt", - "cert_file": "/consul/tls/server/tls.crt", - "key_file": "/consul/tls/server/tls.key" - {{- end }} - } - }, - {{- if .Values.global.tls.enableAutoEncrypt }} - "auto_encrypt": { - "allow_tls": true - }, - {{- end }} - "ports": { - {{- if .Values.global.tls.httpsOnly }} - "http": -1, - {{- end }} - "https": 8501 - } - } - {{- end }} - {{- if .Values.ui.enabled }} - ui-config.json: |- - { - "ui_config": { - {{- if (or (eq "true" (.Values.ui.metrics.enabled | toString) ) (and .Values.global.metrics.enabled (eq "-" (.Values.ui.metrics.enabled | toString)))) }} - "metrics_provider": "{{ .Values.ui.metrics.provider }}", - "metrics_proxy": { - "base_url": "{{ .Values.ui.metrics.baseURL }}" - }, - {{- end }} - {{- if .Values.ui.dashboardURLTemplates.service }} - "dashboard_url_templates": { - "service": "{{ .Values.ui.dashboardURLTemplates.service }}" - }, - {{- end }} - "enabled": true - } - } - {{- end }} - central-config.json: |- - { - "enable_central_service_config": true - } - {{- if .Values.global.federation.enabled }} - federation-config.json: |- - { - "primary_datacenter": "{{ .Values.global.federation.primaryDatacenter }}", - "primary_gateways": {{ .Values.global.federation.primaryGateways | toJson }}, - "connect": { - "enable_mesh_gateway_wan_federation": true - } - } - {{- end }} - {{- if (and .Values.global.metrics.enabled .Values.global.metrics.enableAgentMetrics) }} - telemetry-config.json: |- - { - "telemetry": { - "prometheus_retention_time": "{{ .Values.global.metrics.agentMetricsRetentionTime }}", - "disable_hostname": {{ .Values.global.metrics.disableAgentHostName }},{{ template "consul.prefixFilter" . }} - "enable_host_metrics": {{ .Values.global.metrics.enableHostMetrics }}{{- if .Values.global.metrics.datadog.dogstatsd.enabled }},{{ template "consul.dogstatsdAaddressInfo" . }} - {{- if .Values.global.metrics.datadog.dogstatsd.enabled }} - "dogstatsd_tags": {{ .Values.global.metrics.datadog.dogstatsd.dogstatsdTags | toJson }} - {{- end }} - {{- end }} - } - } - {{- end }} - {{- if and .Values.server.auditLogs.enabled .Values.global.acls.manageSystemACLs }} - audit-logging.json: |- - { - "audit": { - "enabled": true, - "sink": { - {{- range $index, $element := .Values.server.auditLogs.sinks }} - {{- if ne $index 0 }},{{end}} - "{{ get $element "name" }}": {{ omit $element "name" | toJson }} - {{- end }} - } - } - } - {{- end }} -{{- end }} diff --git a/charts/consul/templates/server-disruptionbudget.yaml b/charts/consul/templates/server-disruptionbudget.yaml deleted file mode 100644 index 56805ed..0000000 --- a/charts/consul/templates/server-disruptionbudget.yaml +++ /dev/null @@ -1,26 +0,0 @@ -{{- if (and .Values.server.disruptionBudget.enabled (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled))) }} -# PodDisruptionBudget to prevent degrading the server cluster through -# voluntary cluster changes. -{{- if .Capabilities.APIVersions.Has "policy/v1/PodDisruptionBudget" }} -apiVersion: policy/v1 -{{- else }} -apiVersion: policy/v1beta1 -{{- end }} -kind: PodDisruptionBudget -metadata: - name: {{ template "consul.fullname" . }}-server - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: server -spec: - maxUnavailable: {{ template "consul.server.pdb.maxUnavailable" . }} - selector: - matchLabels: - app: {{ template "consul.name" . }} - release: "{{ .Release.Name }}" - component: server -{{- end }} diff --git a/charts/consul/templates/server-podsecuritypolicy.yaml b/charts/consul/templates/server-podsecuritypolicy.yaml deleted file mode 100644 index 09e8d75..0000000 --- a/charts/consul/templates/server-podsecuritypolicy.yaml +++ /dev/null @@ -1,53 +0,0 @@ -{{- if (and .Values.global.enablePodSecurityPolicies (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled))) }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "consul.fullname" . }}-server - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: server -spec: - privileged: false - # Required to prevent escalations to root. - allowPrivilegeEscalation: false - # This is redundant with non-root + disallow privilege escalation, - # but we can provide it for defense in depth. - requiredDropCapabilities: - - ALL - # Allow core volume types. - volumes: - - 'configMap' - - 'emptyDir' - - 'projected' - - 'secret' - - 'downwardAPI' - - 'persistentVolumeClaim' - hostNetwork: false - hostPorts: - {{- if .Values.server.exposeGossipAndRPCPorts }} - - min: 8300 - max: 8300 - - min: {{ .Values.server.ports.serflan.port }} - max: {{ .Values.server.ports.serflan.port }} - - min: 8302 - max: 8302 - - min: 8502 - max: 8502 - {{- end }} - hostIPC: false - hostPID: false - runAsUser: - # Require the container to run without root privileges. - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'RunAsAny' - fsGroup: - rule: 'RunAsAny' - readOnlyRootFilesystem: false -{{- end }} diff --git a/charts/consul/templates/server-role.yaml b/charts/consul/templates/server-role.yaml deleted file mode 100644 index 202518b..0000000 --- a/charts/consul/templates/server-role.yaml +++ /dev/null @@ -1,34 +0,0 @@ -{{- if (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: {{ template "consul.fullname" . }}-server - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: server -{{- if (or (and .Values.global.openshift.enabled .Values.server.exposeGossipAndRPCPorts) .Values.global.enablePodSecurityPolicies) }} -rules: -{{- if .Values.global.enablePodSecurityPolicies }} -- apiGroups: ["policy"] - resources: ["podsecuritypolicies"] - resourceNames: - - {{ template "consul.fullname" . }}-server - verbs: - - use -{{- end }} -{{- if (and .Values.global.openshift.enabled .Values.server.exposeGossipAndRPCPorts ) }} -- apiGroups: ["security.openshift.io"] - resources: ["securitycontextconstraints"] - resourceNames: - - {{ template "consul.fullname" . }}-server - verbs: - - use -{{- end }} -{{- else}} -rules: [] -{{- end }} -{{- end }} diff --git a/charts/consul/templates/server-rolebinding.yaml b/charts/consul/templates/server-rolebinding.yaml deleted file mode 100644 index 8ab705d..0000000 --- a/charts/consul/templates/server-rolebinding.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: {{ template "consul.fullname" . }}-server - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: server -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: {{ template "consul.fullname" . }}-server -subjects: - - kind: ServiceAccount - name: {{ template "consul.fullname" . }}-server -{{- end }} diff --git a/charts/consul/templates/server-securitycontextconstraints.yaml b/charts/consul/templates/server-securitycontextconstraints.yaml deleted file mode 100644 index 8edd784..0000000 --- a/charts/consul/templates/server-securitycontextconstraints.yaml +++ /dev/null @@ -1,49 +0,0 @@ -{{- if (and .Values.global.openshift.enabled .Values.server.exposeGossipAndRPCPorts (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled))) }} -apiVersion: security.openshift.io/v1 -kind: SecurityContextConstraints -metadata: - name: {{ template "consul.fullname" . }}-server - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: server - annotations: - kubernetes.io/description: {{ template "consul.fullname" . }}-server are the security context constraints required - to run the consul server. -allowHostPorts: true -allowHostDirVolumePlugin: false -allowHostIPC: false -allowHostPID: false -allowHostNetwork: false -allowPrivilegeEscalation: false -allowPrivilegedContainer: false -allowedCapabilities: null -defaultAddCapabilities: null -fsGroup: - type: MustRunAs -groups: [] -priority: null -readOnlyRootFilesystem: false -requiredDropCapabilities: -- KILL -- MKNOD -- SETUID -- SETGID -runAsUser: - type: MustRunAsRange -seLinuxContext: - type: MustRunAs -supplementalGroups: - type: MustRunAs -users: [] -volumes: -- configMap -- downwardAPI -- emptyDir -- persistentVolumeClaim -- projected -- secret -{{- end -}} diff --git a/charts/consul/templates/server-service.yaml b/charts/consul/templates/server-service.yaml deleted file mode 100644 index a392f0e..0000000 --- a/charts/consul/templates/server-service.yaml +++ /dev/null @@ -1,72 +0,0 @@ -{{- if (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) }} -# Headless service for Consul server DNS entries. This service should only -# point to Consul servers. For access to an agent, one should assume that -# the agent is installed locally on the node and the NODE_IP should be used. -# If the node can't run a Consul agent, then this service can be used to -# communicate directly to a server agent. -apiVersion: v1 -kind: Service -metadata: - name: {{ template "consul.fullname" . }}-server - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: server - annotations: - {{- if .Values.server.service.annotations }} - {{ tpl .Values.server.service.annotations . | nindent 4 | trim }} - {{- end }} -spec: - clusterIP: None - # We want the servers to become available even if they're not ready - # since this DNS is also used for join operations. - publishNotReadyAddresses: true - ports: - {{- if (or (not .Values.global.tls.enabled) (not .Values.global.tls.httpsOnly)) }} - - name: http - port: 8500 - targetPort: 8500 - {{- end }} - {{- if .Values.global.tls.enabled }} - - name: https - port: 8501 - targetPort: 8501 - {{- end }} - - name: grpc - port: 8502 - targetPort: 8502 - - name: serflan-tcp - protocol: "TCP" - port: 8301 - targetPort: 8301 - - name: serflan-udp - protocol: "UDP" - port: 8301 - targetPort: 8301 - - name: serfwan-tcp - protocol: "TCP" - port: 8302 - targetPort: 8302 - - name: serfwan-udp - protocol: "UDP" - port: 8302 - targetPort: 8302 - - name: server - port: 8300 - targetPort: 8300 - - name: dns-tcp - protocol: "TCP" - port: 8600 - targetPort: dns-tcp - - name: dns-udp - protocol: "UDP" - port: 8600 - targetPort: dns-udp - selector: - app: {{ template "consul.name" . }} - release: "{{ .Release.Name }}" - component: server -{{- end }} diff --git a/charts/consul/templates/server-serviceaccount.yaml b/charts/consul/templates/server-serviceaccount.yaml deleted file mode 100644 index a161797..0000000 --- a/charts/consul/templates/server-serviceaccount.yaml +++ /dev/null @@ -1,23 +0,0 @@ -{{- if (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "consul.fullname" . }}-server - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: server - {{- if .Values.server.serviceAccount.annotations }} - annotations: - {{ tpl .Values.server.serviceAccount.annotations . | nindent 4 | trim }} - {{- end }} -{{- with .Values.global.imagePullSecrets }} -imagePullSecrets: -{{- range . }} - - name: {{ .name }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/consul/templates/server-snapshot-agent-configmap.yaml b/charts/consul/templates/server-snapshot-agent-configmap.yaml deleted file mode 100644 index da68d15..0000000 --- a/charts/consul/templates/server-snapshot-agent-configmap.yaml +++ /dev/null @@ -1,24 +0,0 @@ -{{- if .Values.server.snapshotAgent.enabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ template "consul.fullname" . }}-snapshot-agent-config - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: server -data: - snapshot-login.json: | - { - "snapshot_agent": { - "login": { - "auth_method": "{{ template "consul.fullname" . }}-k8s-component-auth-method", - "bearer_token_file": "/var/run/secrets/kubernetes.io/serviceaccount/token", - "meta": {"component": "snapshot-agent"} - } - } - } -{{- end }} diff --git a/charts/consul/templates/server-statefulset.yaml b/charts/consul/templates/server-statefulset.yaml deleted file mode 100644 index 208382f..0000000 --- a/charts/consul/templates/server-statefulset.yaml +++ /dev/null @@ -1,779 +0,0 @@ -{{- if (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) }} -{{- if and .Values.global.federation.enabled .Values.global.adminPartitions.enabled }}{{ fail "If global.federation.enabled is true, global.adminPartitions.enabled must be false because they are mutually exclusive" }}{{ end }} -{{- if and .Values.global.federation.enabled (not .Values.global.tls.enabled) }}{{ fail "If global.federation.enabled is true, global.tls.enabled must be true because federation is only supported with TLS enabled" }}{{ end }} -{{- if and .Values.global.federation.enabled (not .Values.meshGateway.enabled) }}{{ fail "If global.federation.enabled is true, meshGateway.enabled must be true because mesh gateways are required for federation" }}{{ end }} -{{- if and .Values.server.serverCert.secretName (not .Values.global.tls.caCert.secretName) }}{{ fail "If server.serverCert.secretName is provided, global.tls.caCert must also be provided" }}{{ end }} -{{- if .Values.server.disableFsGroupSecurityContext }}{{ fail "server.disableFsGroupSecurityContext has been removed. Please use global.openshift.enabled instead." }}{{ end }} -{{- if .Values.server.bootstrapExpect }}{{ if lt (int .Values.server.bootstrapExpect) (int .Values.server.replicas) }}{{ fail "server.bootstrapExpect cannot be less than server.replicas" }}{{ end }}{{ end }} -{{- if (and .Values.global.gossipEncryption.secretName (not .Values.global.gossipEncryption.secretKey)) }}{{fail "gossipEncryption.secretKey and secretName must both be specified." }}{{ end -}} -{{- if (and (not .Values.global.gossipEncryption.secretName) .Values.global.gossipEncryption.secretKey) }}{{fail "gossipEncryption.secretKey and secretName must both be specified." }}{{ end -}} -{{- if (and .Values.global.secretsBackend.vault.enabled (not .Values.global.secretsBackend.vault.consulServerRole)) }}{{ fail "global.secretsBackend.vault.consulServerRole must be provided if global.secretsBackend.vault.enabled=true." }}{{ end -}} -{{- if (and .Values.server.serverCert.secretName (not .Values.global.tls.caCert.secretName)) }}{{ fail "If server.serverCert.secretName is provided, global.tls.caCert.secretName must also be provided" }}{{ end }} -{{- if (and (and .Values.global.secretsBackend.vault.enabled .Values.global.tls.enabled) (not .Values.global.tls.caCert.secretName)) }}{{ fail "global.tls.caCert.secretName must be provided if global.tls.enabled=true and global.secretsBackend.vault.enabled=true." }}{{ end -}} -{{- if (and .Values.global.enterpriseLicense.secretName (not .Values.global.enterpriseLicense.secretKey)) }}{{fail "enterpriseLicense.secretKey and secretName must both be specified." }}{{ end -}} -{{- if (and (not .Values.global.enterpriseLicense.secretName) .Values.global.enterpriseLicense.secretKey) }}{{fail "enterpriseLicense.secretKey and secretName must both be specified." }}{{ end -}} -{{- if (and .Values.global.acls.bootstrapToken.secretName (not .Values.global.acls.bootstrapToken.secretKey)) }}{{fail "both global.acls.bootstrapToken.secretKey and global.acls.bootstrapToken.secretName must be set if one of them is provided." }}{{ end -}} -{{- if (and (not .Values.global.acls.bootstrapToken.secretName) .Values.global.acls.bootstrapToken.secretKey) }}{{fail "both global.acls.bootstrapToken.secretKey and global.acls.bootstrapToken.secretName must be set if one of them is provided." }}{{ end -}} -{{- if .Values.server.snapshotAgent.enabled -}} -{{- if or (and .Values.server.snapshotAgent.configSecret.secretName (not .Values.server.snapshotAgent.configSecret.secretKey)) (and (not .Values.server.snapshotAgent.configSecret.secretName) .Values.server.snapshotAgent.configSecret.secretKey) }}{{fail "server.snapshotAgent.configSecret.secretKey and server.snapshotAgent.configSecret.secretName must both be specified." }}{{ end -}} -{{- end -}} -{{ template "consul.validateRequiredCloudSecretsExist" . }} -{{ template "consul.validateCloudSecretKeys" . }} -{{ template "consul.validateMetricsConfig" . }} -{{ template "consul.validateDatadogConfiguration" . }} -{{ template "consul.validateExtraConfig" . }} -# StatefulSet to run the actual Consul server cluster. -apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: {{ template "consul.fullname" . }}-server - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: server - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 4 }} - {{- end }} -spec: - serviceName: {{ template "consul.fullname" . }}-server - podManagementPolicy: Parallel - replicas: {{ .Values.server.replicas }} - {{- if (gt (int .Values.server.updatePartition) 0) }} - updateStrategy: - type: RollingUpdate - rollingUpdate: - partition: {{ .Values.server.updatePartition }} - {{- end }} - {{- if and (semverCompare ">= 1.23-0" .Capabilities.KubeVersion.Version) (.Values.server.persistentVolumeClaimRetentionPolicy) }} - persistentVolumeClaimRetentionPolicy: {{ toYaml .Values.server.persistentVolumeClaimRetentionPolicy | nindent 4 }} - {{- end }} - selector: - matchLabels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - release: {{ .Release.Name }} - component: server - hasDNS: "true" - template: - metadata: - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - release: {{ .Release.Name }} - component: server - hasDNS: "true" - {{- if .Values.global.metrics.datadog.enabled }} - "tags.datadoghq.com/version": {{ template "consul.versionInfo" . }} - "tags.datadoghq.com/env": {{ template "consul.name" . }} - "tags.datadoghq.com/service": "consul-server" - {{- end }} - {{- if .Values.server.extraLabels }} - {{- toYaml .Values.server.extraLabels | nindent 8 }} - {{- end }} - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 8 }} - {{- end }} - annotations: - {{- if .Values.global.secretsBackend.vault.enabled }} - "vault.hashicorp.com/agent-inject": "true" - "vault.hashicorp.com/role": "{{ .Values.global.secretsBackend.vault.consulServerRole }}" - {{- if and .Values.global.secretsBackend.vault.ca.secretName .Values.global.secretsBackend.vault.ca.secretKey }} - "vault.hashicorp.com/agent-extra-secret": {{ .Values.global.secretsBackend.vault.ca.secretName }} - "vault.hashicorp.com/ca-cert": /vault/custom/{{ .Values.global.secretsBackend.vault.ca.secretKey }} - {{- end }} - {{- if .Values.global.gossipEncryption.secretName }} - {{- with .Values.global.gossipEncryption }} - "vault.hashicorp.com/agent-inject-secret-gossip.txt": "{{ .secretName }}" - "vault.hashicorp.com/agent-inject-template-gossip.txt": {{ template "consul.vaultSecretTemplate" . }} - {{- end }} - {{- end }} - {{- if .Values.server.serverCert.secretName }} - "vault.hashicorp.com/agent-inject-secret-servercert.crt": {{ .Values.server.serverCert.secretName }} - "vault.hashicorp.com/agent-inject-template-servercert.crt": {{ include "consul.serverTLSCertTemplate" . }} - "vault.hashicorp.com/agent-inject-secret-servercert.key": {{ .Values.server.serverCert.secretName }} - "vault.hashicorp.com/agent-inject-template-servercert.key": {{ include "consul.serverTLSKeyTemplate" . }} - "vault.hashicorp.com/agent-inject-secret-serverca.crt": {{ .Values.global.tls.caCert.secretName }} - "vault.hashicorp.com/agent-inject-template-serverca.crt": {{ include "consul.serverTLSCATemplate" . }} - {{- end }} - {{- if (and .Values.global.acls.replicationToken.secretName (not .Values.global.acls.createReplicationToken)) }} - "vault.hashicorp.com/agent-inject-secret-replication-token-config.hcl": "{{ .Values.global.acls.replicationToken.secretName }}" - "vault.hashicorp.com/agent-inject-template-replication-token-config.hcl": {{ template "consul.vaultReplicationTokenConfigTemplate" . }} - {{- end }} - {{- if (and .Values.global.acls.manageSystemACLs .Values.global.acls.bootstrapToken.secretName) }} - "vault.hashicorp.com/agent-inject-secret-bootstrap-token-config.hcl": "{{ .Values.global.acls.bootstrapToken.secretName }}" - "vault.hashicorp.com/agent-inject-template-bootstrap-token-config.hcl": {{ template "consul.vaultBootstrapTokenConfigTemplate" . }} - {{- end }} - {{- if .Values.global.secretsBackend.vault.agentAnnotations }} - {{ tpl .Values.global.secretsBackend.vault.agentAnnotations . | nindent 8 | trim }} - {{- end }} - {{- if (and (.Values.global.secretsBackend.vault.vaultNamespace) (not (hasKey (default "" .Values.global.secretsBackend.vault.agentAnnotations | fromYaml) "vault.hashicorp.com/namespace")))}} - "vault.hashicorp.com/namespace": "{{ .Values.global.secretsBackend.vault.vaultNamespace }}" - {{- end }} - {{- if .Values.global.enterpriseLicense.secretName }} - {{- with .Values.global.enterpriseLicense }} - "vault.hashicorp.com/agent-inject-secret-enterpriselicense.txt": "{{ .secretName }}" - "vault.hashicorp.com/agent-inject-template-enterpriselicense.txt": {{ template "consul.vaultSecretTemplate" . }} - {{- end }} - {{- end }} - {{- if .Values.server.snapshotAgent.configSecret.secretName }} - {{- with .Values.server.snapshotAgent.configSecret }} - "vault.hashicorp.com/agent-inject-secret-snapshot-agent-config.json": "{{ .secretName }}" - "vault.hashicorp.com/agent-inject-template-snapshot-agent-config.json": {{ template "consul.vaultSecretTemplate" . }} - {{- end }} - {{- end }} - {{- end }} - "consul.hashicorp.com/connect-inject": "false" - "consul.hashicorp.com/mesh-inject": "false" - "consul.hashicorp.com/config-checksum": {{ print (include (print $.Template.BasePath "/server-config-configmap.yaml") .) (include (print $.Template.BasePath "/server-tmp-extra-config-configmap.yaml") .) | sha256sum }} - {{- if .Values.server.annotations }} - {{- tpl .Values.server.annotations . | nindent 8 }} - {{- end }} - {{- if (and .Values.global.metrics.enabled .Values.global.metrics.enableAgentMetrics) }} - {{- if (or (not .Values.global.metrics.datadog.enabled) (and .Values.global.metrics.datadog.enabled (.Values.global.metrics.datadog.dogstatsd.enabled))) }} - "prometheus.io/scrape": "true" - {{- if not (hasKey (default "" .Values.server.annotations | fromYaml) "prometheus.io/path")}} - "prometheus.io/path": "/v1/agent/metrics" - {{- end }} - {{- if .Values.global.tls.enabled }} - "prometheus.io/port": "8501" - "prometheus.io/scheme": "https" - {{- else }} - "prometheus.io/port": "8500" - "prometheus.io/scheme": "http" - {{- end }} - {{- end }} - {{- if .Values.global.metrics.datadog.enabled }} - "ad.datadoghq.com/tolerate-unready": "true" - "ad.datadoghq.com/consul.logs": {{ .Values.global.metrics.datadog.dogstatsd.dogstatsdTags | toJson | replace "[" "[{" | replace "]" "}]" | replace ":" "\": \"" | join "\",\"" | squote }} - {{- if .Values.global.metrics.datadog.openMetricsPrometheus.enabled }} - "ad.datadoghq.com/consul.checks": | - { - "openmetrics": { - "init_config": {}, - "instances": [ - { - {{- if .Values.global.tls.enabled }} - "openmetrics_endpoint": "https://{{ template "consul.fullname" . }}-server.{{ .Release.Namespace }}.svc:8501/v1/agent/metrics?format=prometheus", - "tls_cert": "/etc/datadog-agent/conf.d/consul.d/certs/tls.crt", - "tls_private_key": "/etc/datadog-agent/conf.d/consul.d/certs/tls.key", - "tls_ca_cert": "/etc/datadog-agent/conf.d/consul.d/ca/tls.crt", - {{- else }} - "openmetrics_endpoint": "http://{{ template "consul.fullname" . }}-server.{{ .Release.Namespace }}.svc:8500/v1/agent/metrics?format=prometheus", - {{- end }} - {{- if ( .Values.global.acls.manageSystemACLs) }} - "headers": { - "X-Consul-Token": "ENC[k8s_secret@{{ .Release.Namespace }}/{{ .Release.Namespace }}-datadog-agent-metrics-acl-token/token]" - }, - {{- end }} - "namespace": "{{ .Release.Namespace }}", - "metrics": [ ".*" ] - } - ] - } - } - {{- else if (not .Values.global.metrics.datadog.dogstatsd.enabled) }} - "ad.datadoghq.com/consul.checks": | - { - "consul": { - "init_config": {}, - "instances": [ - { - {{- if .Values.global.tls.enabled }} - "url": "https://{{ template "consul.fullname" . }}-server.{{ .Release.Namespace }}.svc:8501", - "tls_cert": "/etc/datadog-agent/conf.d/consul.d/certs/tls.crt", - "tls_private_key": "/etc/datadog-agent/conf.d/consul.d/certs/tls.key", - "tls_ca_cert": "/etc/datadog-agent/conf.d/consul.d/ca/tls.crt", - {{- else }} - "url": "http://{{ template "consul.fullname" . }}-server.{{ .Release.Namespace }}.svc:8500", - {{- end }} - "use_prometheus_endpoint": true, - {{- if ( .Values.global.acls.manageSystemACLs) }} - "acl_token": "ENC[k8s_secret@{{ .Release.Namespace }}/{{ .Release.Namespace }}-datadog-agent-metrics-acl-token/token]", - {{- end }} - "new_leader_checks": true, - "network_latency_checks": true, - "catalog_checks": true, - "auth_type": "basic" - } - ] - } - } - {{- else }} - "ad.datadoghq.com/consul.metrics_exclude": "true" - {{- end }} - {{- end }} - {{- end }} - spec: - {{- if .Values.server.affinity }} - affinity: - {{ tpl .Values.server.affinity . | nindent 8 | trim }} - {{- end }} - {{- if .Values.server.tolerations }} - tolerations: - {{ tpl .Values.server.tolerations . | nindent 8 | trim }} - {{- end }} - {{- if .Values.server.topologySpreadConstraints }} - topologySpreadConstraints: - {{ tpl .Values.server.topologySpreadConstraints . | nindent 8 | trim }} - {{- end }} - terminationGracePeriodSeconds: 30 - serviceAccountName: {{ template "consul.fullname" . }}-server - {{- if not .Values.global.openshift.enabled }} - securityContext: - {{- toYaml .Values.server.securityContext | nindent 8 }} - {{- end }} - volumes: - - name: tmp - emptyDir: {} - - name: config - configMap: - name: {{ template "consul.fullname" . }}-server-config - - name: extra-config - emptyDir: {} - - name: tmp-extra-config - configMap: - name: {{ template "consul.fullname" . }}-server-tmp-extra-config - {{- if (and .Values.global.tls.enabled (not .Values.global.secretsBackend.vault.enabled)) }} - - name: consul-ca-cert - secret: - {{- if .Values.global.tls.caCert.secretName }} - secretName: {{ .Values.global.tls.caCert.secretName }} - {{- else }} - secretName: {{ template "consul.fullname" . }}-ca-cert - {{- end }} - items: - - key: {{ default "tls.crt" .Values.global.tls.caCert.secretKey }} - path: tls.crt - - name: consul-server-cert - secret: - {{- if .Values.server.serverCert.secretName }} - secretName: {{ .Values.server.serverCert.secretName }} - {{- else }} - secretName: {{ template "consul.fullname" . }}-server-cert - {{- end }} - {{- end }} - {{- if (and .Values.global.enterpriseLicense.secretName .Values.global.enterpriseLicense.enableLicenseAutoload (not .Values.global.secretsBackend.vault.enabled)) }} - - name: consul-license - secret: - secretName: {{ .Values.global.enterpriseLicense.secretName }} - {{- end }} - {{- if and .Values.global.secretsBackend.vault.ca.secretName .Values.global.secretsBackend.vault.ca.secretKey }} - - name: vault-ca - secret: - secretName: {{ .Values.global.secretsBackend.vault.ca.secretName }} - items: - - key: {{ .Values.global.secretsBackend.vault.ca.secretKey }} - path: tls.crt - {{- end }} - {{- if .Values.server.snapshotAgent.enabled }} - {{- if .Values.global.acls.manageSystemACLs }} - - name: snapshot-agent-config - configMap: - name: {{ template "consul.fullname" . }}-snapshot-agent-config - {{- end }} - {{- if (and .Values.server.snapshotAgent.configSecret.secretName .Values.server.snapshotAgent.configSecret.secretKey (not .Values.global.secretsBackend.vault.enabled)) }} - - name: snapshot-agent-user-config - secret: - secretName: {{ .Values.server.snapshotAgent.configSecret.secretName }} - items: - - key: {{ .Values.server.snapshotAgent.configSecret.secretKey }} - path: snapshot-config.json - {{- end }} - {{- if .Values.server.snapshotAgent.caCert }} - - name: extra-ssl-certs - emptyDir: - medium: "Memory" - {{- end }} - {{- end }} - {{- if .Values.global.trustedCAs }} - - name: trusted-cas - emptyDir: - medium: "Memory" - {{- end }} - {{- if and .Values.global.metrics.datadog.enabled .Values.global.metrics.datadog.dogstatsd.enabled (eq .Values.global.metrics.datadog.dogstatsd.socketTransportType "UDS" ) }} - - name: dsdsocket - hostPath: - path: {{ dir .Values.global.metrics.datadog.dogstatsd.dogstatsdAddr | trimAll "\"" }} - type: DirectoryOrCreate - {{- end }} - {{- range .Values.server.extraVolumes }} - - name: userconfig-{{ .name }} - {{ .type }}: - {{- if (eq .type "configMap") }} - name: {{ .name }} - {{- else if (eq .type "secret") }} - secretName: {{ .name }} - {{- end }} - {{- with .items }} - items: - {{- range . }} - - key: {{.key}} - path: {{.path}} - {{- end }} - {{- end }} - {{- end }} - {{- range .Values.server.snapshotAgent.extraVolumes }} - - name: userconfig-snapshot-{{ .name }} - {{ .type }}: - {{- if (eq .type "configMap") }} - name: {{ .name }} - {{- else if (eq .type "secret") }} - secretName: {{ .name }} - {{- end }} - {{- with .items }} - items: - {{- range . }} - - key: {{.key}} - path: {{.path}} - {{- end }} - {{- end }} - {{- end }} - {{- if .Values.server.priorityClassName }} - priorityClassName: {{ .Values.server.priorityClassName | quote }} - {{- end }} - initContainers: - - name: locality-init - image: {{ .Values.global.imageK8S }} - {{ template "consul.imagePullPolicy" . }} - env: - - name: NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - command: - - "/bin/sh" - - "-ec" - - | - exec consul-k8s-control-plane fetch-server-region -node-name "$NODE_NAME" -output-file /consul/extra-config/locality.json - volumeMounts: - - name: extra-config - mountPath: /consul/extra-config - {{- include "consul.restrictedSecurityContext" . | nindent 8 }} - containers: - - name: consul - image: "{{ default .Values.global.image .Values.server.image | trimPrefix "\"" | trimSuffix "\"" }}" - {{ template "consul.imagePullPolicy" . }} - imagePullPolicy: {{ .Values.global.imagePullPolicy }} - env: - - name: ADVERTISE_IP - valueFrom: - fieldRef: - {{- if .Values.server.exposeGossipAndRPCPorts }} - {{- /* Server gossip and RPC ports will be exposed as a hostPort - on the hostIP, so they need to advertise their host ip - instead of their pod ip. This is to support external client - agents. */}} - fieldPath: status.hostIP - {{- else }} - fieldPath: status.podIP - {{- end }} - - name: HOST_IP - valueFrom: - fieldRef: - fieldPath: status.hostIP - - name: POD_IP - valueFrom: - fieldRef: - fieldPath: status.podIP - - name: CONSUL_DISABLE_PERM_MGMT - value: "true" - {{- if (or .Values.global.gossipEncryption.autoGenerate (and .Values.global.gossipEncryption.secretName .Values.global.gossipEncryption.secretKey)) }} - {{- if not .Values.global.secretsBackend.vault.enabled }} - - name: GOSSIP_KEY - valueFrom: - secretKeyRef: - {{- if .Values.global.gossipEncryption.autoGenerate }} - name: {{ template "consul.fullname" . }}-gossip-encryption-key - key: key - {{- else if (and .Values.global.gossipEncryption.secretName .Values.global.gossipEncryption.secretKey) }} - name: {{ .Values.global.gossipEncryption.secretName }} - key: {{ .Values.global.gossipEncryption.secretKey }} - {{- end }} - {{- end }} - {{- end }} - {{- if .Values.global.tls.enabled }} - - name: CONSUL_HTTP_ADDR - value: https://localhost:8501 - - name: CONSUL_CACERT - {{- if .Values.global.secretsBackend.vault.enabled }} - value: /vault/secrets/serverca.crt - {{- else }} - value: /consul/tls/ca/tls.crt - {{- end }} - {{- end }} - {{- if (and .Values.global.enterpriseLicense.secretName .Values.global.enterpriseLicense.enableLicenseAutoload) }} - - name: CONSUL_LICENSE_PATH - {{- if .Values.global.secretsBackend.vault.enabled }} - value: /vault/secrets/enterpriselicense.txt - {{- else }} - value: /consul/license/{{ .Values.global.enterpriseLicense.secretKey }} - {{- end }} - {{- end }} - {{- if and (not .Values.global.secretsBackend.vault.enabled) .Values.global.acls.bootstrapToken.secretName }} - - name: ACL_BOOTSTRAP_TOKEN - valueFrom: - secretKeyRef: - name: {{ .Values.global.acls.bootstrapToken.secretName | quote }} - key: {{ .Values.global.acls.bootstrapToken.secretKey | quote }} - {{- end }} - {{- if (and .Values.global.acls.replicationToken.secretName .Values.global.acls.replicationToken.secretKey (not .Values.global.secretsBackend.vault.enabled)) }} - - name: ACL_REPLICATION_TOKEN - valueFrom: - secretKeyRef: - name: {{ .Values.global.acls.replicationToken.secretName | quote }} - key: {{ .Values.global.acls.replicationToken.secretKey | quote }} - {{- end }} - {{- if .Values.global.cloud.enabled}} - # These are mounted as secrets so that the consul server agent can use them. - # - the hcp-go-sdk in consul agent will already look for HCP_CLIENT_ID, HCP_CLIENT_SECRET, HCP_AUTH_URL, - # HCP_SCADA_ADDRESS, and HCP_API_HOST. so nothing more needs to be done. - # - HCP_RESOURCE_ID is created for use in the - # `-hcl="cloud { resource_id = \"${HCP_RESOURCE_ID}\" }"` logic in the command below. - {{- if .Values.global.cloud.clientId.secretName }} - - name: HCP_CLIENT_ID - valueFrom: - secretKeyRef: - name: {{ .Values.global.cloud.clientId.secretName }} - key: {{ .Values.global.cloud.clientId.secretKey }} - {{- end }} - {{- if .Values.global.cloud.clientSecret.secretName }} - - name: HCP_CLIENT_SECRET - valueFrom: - secretKeyRef: - name: {{ .Values.global.cloud.clientSecret.secretName }} - key: {{ .Values.global.cloud.clientSecret.secretKey }} - {{- end}} - {{- if .Values.global.cloud.resourceId.secretName }} - - name: HCP_RESOURCE_ID - valueFrom: - secretKeyRef: - name: {{ .Values.global.cloud.resourceId.secretName }} - key: {{ .Values.global.cloud.resourceId.secretKey }} - {{- end }} - {{- if .Values.global.cloud.authUrl.secretName }} - - name: HCP_AUTH_URL - valueFrom: - secretKeyRef: - name: {{ .Values.global.cloud.authUrl.secretName }} - key: {{ .Values.global.cloud.authUrl.secretKey }} - {{- end}} - {{- if .Values.global.cloud.apiHost.secretName }} - - name: HCP_API_HOST - valueFrom: - secretKeyRef: - name: {{ .Values.global.cloud.apiHost.secretName }} - key: {{ .Values.global.cloud.apiHost.secretKey }} - {{- end}} - {{- if .Values.global.cloud.scadaAddress.secretName }} - - name: HCP_SCADA_ADDRESS - valueFrom: - secretKeyRef: - name: {{ .Values.global.cloud.scadaAddress.secretName }} - key: {{ .Values.global.cloud.scadaAddress.secretKey }} - {{- end}} - {{- end }} - {{- if .Values.global.trustedCAs }} - - name: SSL_CERT_DIR - value: "/etc/ssl/certs:/trusted-cas" - {{- end }} - {{- include "consul.extraEnvironmentVars" .Values.server | nindent 12 }} - command: - - "/bin/sh" - - "-ec" - - | - {{- if .Values.global.trustedCAs }} - {{- range $i, $cert := .Values.global.trustedCAs }} - cat < /trusted-cas/custom-ca-{{$i}}.pem - {{- $cert | nindent 14 }} - EOF - {{- end }} - {{- end }} - - {{- if and .Values.global.secretsBackend.vault.enabled .Values.global.gossipEncryption.secretName }} - GOSSIP_KEY=`cat /vault/secrets/gossip.txt` - {{- end }} - - {{ template "consul.extraconfig" }} - - exec /usr/local/bin/docker-entrypoint.sh consul agent \ - -advertise="${ADVERTISE_IP}" \ - -config-dir=/consul/config \ - {{- if (or .Values.global.gossipEncryption.autoGenerate (and .Values.global.gossipEncryption.secretName .Values.global.gossipEncryption.secretKey)) }} - -encrypt="${GOSSIP_KEY}" \ - {{- end }} - {{- if (and .Values.global.acls.replicationToken.secretName .Values.global.acls.replicationToken.secretKey) }} - {{- if (and .Values.global.secretsBackend.vault.enabled (not .Values.global.acls.createReplicationToken)) }} - -config-file=/vault/secrets/replication-token-config.hcl \ - {{- else }} - -hcl="acl { tokens { agent = \"${ACL_REPLICATION_TOKEN}\", replication = \"${ACL_REPLICATION_TOKEN}\" } }" \ - {{- end }} - {{- end }} - {{- if and .Values.global.secretsBackend.vault.enabled .Values.global.acls.bootstrapToken.secretName }} - -config-file=/vault/secrets/bootstrap-token-config.hcl \ - {{- else if (and (not .Values.global.secretsBackend.vault.enabled) .Values.global.acls.bootstrapToken.secretName) }} - -hcl="acl { tokens { initial_management = \"${ACL_BOOTSTRAP_TOKEN}\" } }" \ - {{- end }} - {{- /* Always include the extraVolumes at the end so that users can - override other Consul settings. The last -config-dir takes - precedence. */}} - {{- range .Values.server.extraVolumes }} - {{- if .load }} - -config-dir=/consul/userconfig/{{ .name }} \ - {{- end }} - {{- end }} - -config-dir=/consul/extra-config \ - {{- if and .Values.global.cloud.enabled .Values.global.cloud.resourceId.secretName }} - -hcl="cloud { resource_id = \"${HCP_RESOURCE_ID}\" }" - {{- end }} - - {{- if .Values.global.experiments }} - {{- $commaSeparatedValues := "" }} - {{- range $index, $value := .Values.global.experiments }} - {{- if ne $index 0 }} - {{- $commaSeparatedValues = printf "%s,\\\"%s\\\"" $commaSeparatedValues $value }} - {{- else }} - {{- $commaSeparatedValues = printf "\\\"%s\\\"" $value }} - {{- end }} - {{- end }} - -hcl="experiments=[{{ $commaSeparatedValues }}]" - {{- end }} - volumeMounts: - - name: data-{{ .Release.Namespace | trunc 58 | trimSuffix "-" }} - mountPath: /consul/data - - name: config - mountPath: /consul/config - - name: extra-config - mountPath: /consul/extra-config - - name: tmp-extra-config - mountPath: /consul/tmp/extra-config - {{- if (and .Values.global.tls.enabled (not .Values.global.secretsBackend.vault.enabled)) }} - - name: consul-ca-cert - mountPath: /consul/tls/ca/ - readOnly: true - - name: consul-server-cert - mountPath: /consul/tls/server - readOnly: true - {{- end }} - {{- if (and .Values.global.enterpriseLicense.secretName .Values.global.enterpriseLicense.enableLicenseAutoload (not .Values.global.secretsBackend.vault.enabled)) }} - - name: consul-license - mountPath: /consul/license - readOnly: true - {{- end }} - {{- if and .Values.global.metrics.datadog.enabled .Values.global.metrics.datadog.dogstatsd.enabled (eq .Values.global.metrics.datadog.dogstatsd.socketTransportType "UDS" ) }} - - name: dsdsocket - mountPath: {{ dir .Values.global.metrics.datadog.dogstatsd.dogstatsdAddr | trimAll "\"" }} - readOnly: true - {{- end }} - {{- range .Values.server.extraVolumes }} - - name: userconfig-{{ .name }} - readOnly: true - mountPath: /consul/userconfig/{{ .name }} - {{- end }} - {{- if and .Values.global.secretsBackend.vault.ca.secretName .Values.global.secretsBackend.vault.ca.secretKey }} - - name: vault-ca - mountPath: /consul/vault-ca/ - readOnly: true - {{- end }} - {{- if .Values.global.trustedCAs }} - - name: trusted-cas - mountPath: /trusted-cas - readOnly: false - {{- end }} - - name: tmp - mountPath: /tmp - readOnly: false - ports: - {{- if (or (not .Values.global.tls.enabled) (not .Values.global.tls.httpsOnly)) }} - - name: http - containerPort: 8500 - {{- end }} - {{- if .Values.global.tls.enabled }} - - name: https - containerPort: 8501 - {{- end }} - - name: grpc - containerPort: 8502 - {{- if .Values.server.exposeGossipAndRPCPorts }} - hostPort: 8502 - {{- end }} - protocol: "TCP" - - name: serflan-tcp - containerPort: {{ .Values.server.ports.serflan.port }} - {{- if .Values.server.exposeGossipAndRPCPorts }} - hostPort: {{ .Values.server.ports.serflan.port }} - {{- end }} - protocol: "TCP" - - name: serflan-udp - containerPort: {{ .Values.server.ports.serflan.port }} - {{- if .Values.server.exposeGossipAndRPCPorts }} - hostPort: {{ .Values.server.ports.serflan.port }} - {{- end }} - protocol: "UDP" - - name: serfwan-tcp - containerPort: 8302 - {{- if .Values.server.exposeGossipAndRPCPorts }} - hostPort: 8302 - {{- end }} - protocol: "TCP" - - name: serfwan-udp - containerPort: 8302 - {{- if .Values.server.exposeGossipAndRPCPorts }} - hostPort: 8302 - {{- end }} - protocol: "UDP" - - name: server - containerPort: 8300 - {{- if .Values.server.exposeGossipAndRPCPorts }} - hostPort: 8300 - {{- end }} - - name: dns-tcp - containerPort: 8600 - protocol: "TCP" - - name: dns-udp - containerPort: 8600 - protocol: "UDP" - readinessProbe: - # NOTE(mitchellh): when our HTTP status endpoints support the - # proper status codes, we should switch to that. This is temporary. - exec: - command: - - "/bin/sh" - - "-ec" - - | - {{- if .Values.global.tls.enabled }} - curl -k \ - https://127.0.0.1:8501/v1/status/leader \ - {{- else }} - curl http://127.0.0.1:8500/v1/status/leader \ - {{- end }} - 2>/dev/null | grep -E '".+"' - failureThreshold: 2 - initialDelaySeconds: 5 - periodSeconds: 3 - successThreshold: 1 - timeoutSeconds: 5 - {{- if .Values.server.resources }} - resources: - {{- if eq (typeOf .Values.server.resources) "string" }} - {{ tpl .Values.server.resources . | nindent 12 | trim }} - {{- else }} - {{- toYaml .Values.server.resources | nindent 12 }} - {{- end }} - {{- end }} - {{- if .Values.server.containerSecurityContext.server }} - securityContext: - {{- toYaml .Values.server.containerSecurityContext.server | nindent 12 }} - {{- else }} - {{- include "consul.restrictedSecurityContext" . | nindent 10 }} - {{- end }} - {{- if .Values.server.extraContainers }} - {{ toYaml .Values.server.extraContainers | nindent 8 }} - {{- end }} - {{- if .Values.server.snapshotAgent.enabled }} - - name: consul-snapshot-agent - image: "{{ default .Values.global.image .Values.server.image }}" - {{ template "consul.imagePullPolicy" . }} - env: - {{- if .Values.server.snapshotAgent.caCert }} - - name: SSL_CERT_DIR - value: "/etc/ssl/certs:/extra-ssl-certs" - {{- end }} - {{- if .Values.global.tls.enabled }} - - name: CONSUL_HTTP_ADDR - value: https://127.0.0.1:8501 - - name: CONSUL_CACERT - {{- if .Values.global.secretsBackend.vault.enabled }} - value: /vault/secrets/serverca.crt - {{- else }} - value: /consul/tls/ca/tls.crt - {{- end }} - {{- else }} - - name: CONSUL_HTTP_ADDR - value: http://127.0.0.1:8500 - {{- end }} - {{- if (and .Values.global.enterpriseLicense.secretName .Values.global.enterpriseLicense.secretKey .Values.global.enterpriseLicense.enableLicenseAutoload (not .Values.global.acls.manageSystemACLs)) }} - - name: CONSUL_LICENSE_PATH - {{- if .Values.global.secretsBackend.vault.enabled }} - value: /vault/secrets/enterpriselicense.txt - {{- else }} - value: /consul/license/{{ .Values.global.enterpriseLicense.secretKey }} - {{- end }} - {{- end }} - {{- include "consul.extraEnvironmentVars" .Values.server.snapshotAgent | nindent 12 }} - command: - - "/bin/sh" - - "-ec" - - | - {{- if .Values.server.snapshotAgent.caCert }} - cat < /extra-ssl-certs/custom-ca.pem - {{- .Values.server.snapshotAgent.caCert | nindent 14 }} - EOF - {{- end }} - exec /bin/consul snapshot agent \ - -interval={{ .Values.server.snapshotAgent.interval }} \ - {{- if .Values.global.acls.manageSystemACLs }} - -config-file=/consul/config/snapshot-login.json \ - {{- end }} - {{- if (and .Values.server.snapshotAgent.configSecret.secretName .Values.server.snapshotAgent.configSecret.secretKey) }} - {{- if .Values.global.secretsBackend.vault.enabled }} - -config-file=/vault/secrets/snapshot-agent-config.json \ - {{- else }} - -config-dir=/consul/user-config \ - {{- end }} - {{- end }} - volumeMounts: - {{- if .Values.global.acls.manageSystemACLs }} - - name: snapshot-agent-config - mountPath: /consul/config - readOnly: true - {{- end }} - {{- if .Values.server.snapshotAgent.caCert }} - - name: extra-ssl-certs - mountPath: /extra-ssl-certs - readOnly: false - {{- end }} - {{- if (and .Values.server.snapshotAgent.configSecret.secretName .Values.server.snapshotAgent.configSecret.secretKey (not .Values.global.secretsBackend.vault.enabled)) }} - - name: snapshot-agent-user-config - mountPath: /consul/user-config - readOnly: true - {{- end }} - {{- if (and .Values.global.enterpriseLicense.secretName .Values.global.enterpriseLicense.secretKey .Values.global.enterpriseLicense.enableLicenseAutoload (not .Values.global.secretsBackend.vault.enabled) (not .Values.global.acls.manageSystemACLs))}} - - name: consul-license - mountPath: /consul/license - readOnly: true - {{- end }} - {{- if and .Values.global.tls.enabled (not .Values.global.secretsBackend.vault.enabled) }} - - name: consul-ca-cert - mountPath: /consul/tls/ca - readOnly: true - {{- end }} - {{- range .Values.server.snapshotAgent.extraVolumes }} - - name: userconfig-snapshot-{{ .name }} - readOnly: true - mountPath: /consul/userconfig/{{ .name }} - {{- end }} - {{- with .Values.server.snapshotAgent.resources }} - resources: - {{- toYaml . | nindent 12 }} - {{- end }} - {{- end }} - {{- if .Values.server.nodeSelector }} - nodeSelector: - {{ tpl .Values.server.nodeSelector . | indent 8 | trim }} - {{- end }} - volumeClaimTemplates: - - metadata: - name: data-{{ .Release.Namespace | trunc 58 | trimSuffix "-" }} - spec: - accessModes: - - ReadWriteOnce - resources: - requests: - storage: {{ .Values.server.storage }} - {{- if .Values.server.storageClass }} - storageClassName: {{ .Values.server.storageClass }} - {{- end }} -{{- end }} diff --git a/charts/consul/templates/server-tmp-extra-config-configmap.yaml b/charts/consul/templates/server-tmp-extra-config-configmap.yaml deleted file mode 100644 index a42d6d0..0000000 --- a/charts/consul/templates/server-tmp-extra-config-configmap.yaml +++ /dev/null @@ -1,21 +0,0 @@ -{{- if (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) }} -# ConfigMap that is used as a temporary landing spot so that the container command -# in the server-stateful set where it needs to be transformed. ConfigMaps create -# read only volumes so it needs to be copied and transformed to the extra-config -# emptyDir volume where all final extra cofngi lives for use in consul. (locality-init -# also writes to extra-config volume.) -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ template "consul.fullname" . }}-server-tmp-extra-config - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: server -data: - extra-from-values.json: |- -{{ tpl .Values.server.extraConfig . | trimAll "\"" | indent 4 }} -{{- end }} \ No newline at end of file diff --git a/charts/consul/templates/sync-catalog-cleanup-on-uninstall-job.yaml b/charts/consul/templates/sync-catalog-cleanup-on-uninstall-job.yaml deleted file mode 100644 index 955042d..0000000 --- a/charts/consul/templates/sync-catalog-cleanup-on-uninstall-job.yaml +++ /dev/null @@ -1,174 +0,0 @@ -{{- if .Values.syncCatalog.cleanupNodeOnRemoval }} -apiVersion: batch/v1 -kind: Job -metadata: - name: {{ template "consul.fullname" . }}-sync-catalog-cleanup-on-uninstall - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: sync-catalog-cleanup - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 4 }} - {{- end }} - annotations: - "helm.sh/hook": pre-delete - "helm.sh/hook-weight": "0" - "helm.sh/hook-delete-policy": hook-succeeded,hook-failed -spec: - template: - metadata: - name: {{ template "consul.fullname" . }}-sync-catalog-cleanup-on-uninstall - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - release: {{ .Release.Name }} - component: sync-catalog-cleanup - {{- if .Values.syncCatalog.extraLabels }} - {{- toYaml .Values.syncCatalog.extraLabels | nindent 8 }} - {{- end }} - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 8 }} - {{- end }} - annotations: - "consul.hashicorp.com/connect-inject": "false" - "consul.hashicorp.com/mesh-inject": "false" - {{- if .Values.syncCatalog.annotations }} - {{- tpl .Values.syncCatalog.annotations . | nindent 8 }} - {{- end }} - {{- if (and .Values.global.secretsBackend.vault.enabled .Values.global.tls.enabled) }} - "vault.hashicorp.com/agent-init-first": "true" - "vault.hashicorp.com/agent-inject": "true" - "vault.hashicorp.com/role": {{ .Values.global.secretsBackend.vault.consulCARole }} - "vault.hashicorp.com/agent-inject-secret-serverca.crt": {{ .Values.global.tls.caCert.secretName }} - "vault.hashicorp.com/agent-inject-template-serverca.crt": {{ template "consul.serverTLSCATemplate" . }} - {{- if and .Values.global.secretsBackend.vault.ca.secretName .Values.global.secretsBackend.vault.ca.secretKey }} - "vault.hashicorp.com/agent-extra-secret": "{{ .Values.global.secretsBackend.vault.ca.secretName }}" - "vault.hashicorp.com/ca-cert": "/vault/custom/{{ .Values.global.secretsBackend.vault.ca.secretKey }}" - {{- end }} - {{- if .Values.global.secretsBackend.vault.agentAnnotations }} - {{ tpl .Values.global.secretsBackend.vault.agentAnnotations . | nindent 8 | trim }} - {{- end }} - {{- if (and (.Values.global.secretsBackend.vault.vaultNamespace) (not (hasKey (default "" .Values.global.secretsBackend.vault.agentAnnotations | fromYaml) "vault.hashicorp.com/namespace")))}} - "vault.hashicorp.com/namespace": "{{ .Values.global.secretsBackend.vault.vaultNamespace }}" - {{- end }} - {{- end }} - {{- if .Values.syncCatalog.metrics.enabled | default .Values.global.metrics.enabled }} - "prometheus.io/scrape": "true" - {{- if not (hasKey (default "" .Values.syncCatalog.annotations | fromYaml) "prometheus.io/path")}} - "prometheus.io/path": {{ default "/metrics" .Values.syncCatalog.metrics.path }} - {{- end }} - "prometheus.io/port": {{ .Values.syncCatalog.metrics.port | default "20300" | quote }} - {{- end }} - spec: - restartPolicy: Never - serviceAccountName: {{ template "consul.fullname" . }}-sync-catalog-cleanup - containers: - - name: sync-catalog-cleanup-job - image: "{{ default .Values.global.imageK8S .Values.syncCatalog.image }}" - {{ template "consul.imagePullPolicy" . }} - {{- include "consul.restrictedSecurityContext" . | nindent 8 }} - env: - {{- include "consul.consulK8sConsulServerEnvVars" . | nindent 8 }} - {{- if .Values.global.acls.manageSystemACLs }} - - name: CONSUL_LOGIN_AUTH_METHOD - {{- if and .Values.global.federation.enabled .Values.global.federation.primaryDatacenter .Values.global.enableConsulNamespaces }} - value: {{ template "consul.fullname" . }}-k8s-component-auth-method-{{ .Values.global.datacenter }} - {{- else }} - value: {{ template "consul.fullname" . }}-k8s-component-auth-method - {{- end }} - - name: CONSUL_LOGIN_DATACENTER - {{- if and .Values.global.federation.enabled .Values.global.federation.primaryDatacenter .Values.global.enableConsulNamespaces }} - value: {{ .Values.global.federation.primaryDatacenter }} - {{- else }} - value: {{ .Values.global.datacenter }} - {{- end }} - - name: CONSUL_LOGIN_META - value: "component=sync-catalog,pod=$(NAMESPACE)/$(POD_NAME)" - {{- end }} - - name: NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - {{- if (and .Values.syncCatalog.aclSyncToken.secretName .Values.syncCatalog.aclSyncToken.secretKey) }} - - name: CONSUL_ACL_TOKEN - valueFrom: - secretKeyRef: - name: {{ .Values.syncCatalog.aclSyncToken.secretName }} - key: {{ .Values.syncCatalog.aclSyncToken.secretKey }} - {{- end }} - volumeMounts: - {{- if .Values.global.tls.enabled }} - {{- if not (or (and .Values.externalServers.enabled .Values.externalServers.useSystemRoots) .Values.global.secretsBackend.vault.enabled) }} - - name: consul-ca-cert - mountPath: /consul/tls/ca - readOnly: true - {{- end }} - {{- end }} - command: - - "/bin/sh" - - "-ec" - - | - exec consul-k8s-control-plane sync-catalog \ - -log-level={{ default .Values.global.logLevel .Values.syncCatalog.logLevel }} \ - -log-json={{ .Values.global.logJSON }} \ - -k8s-default-sync={{ .Values.syncCatalog.default }} \ - {{- if .Values.global.adminPartitions.enabled }} - -partition={{ .Values.global.adminPartitions.name }} \ - {{- end }} - {{- if .Values.syncCatalog.consulNodeName }} - -consul-node-name={{ .Values.syncCatalog.consulNodeName }} \ - {{- end }} - {{- if .Values.syncCatalog.metrics.enabled | default .Values.global.metrics.enabled }} - -enable-metrics \ - {{- end }} - {{- if .Values.syncCatalog.metrics.path }} - -metrics-path={{ .Values.syncCatalog.metrics.path }} \ - {{- end }} - {{- if .Values.syncCatalog.metrics.port }} - -metrics-port={{ .Values.syncCatalog.metrics.port }} \ - {{- end }} - -prometheus-retention-time={{ .Values.global.metrics.agentMetricsRetentionTime }} \ - -purge-k8s-services-from-node - {{- with .Values.syncCatalog.resources }} - resources: - {{- toYaml . | nindent 10 }} - {{- end }} - {{- if or (eq (.Values.syncCatalog.metrics.enabled | toString) "-") .Values.syncCatalog.metrics.enabled .Values.global.metrics.enabled }} - ports: - - name: prometheus - containerPort: {{ .Values.syncCatalog.metrics.port | default "20300" | int }} - {{- end }} - {{- if .Values.syncCatalog.priorityClassName }} - priorityClassName: {{ .Values.syncCatalog.priorityClassName | quote }} - {{- end }} - {{- if .Values.syncCatalog.nodeSelector }} - nodeSelector: - {{ tpl .Values.syncCatalog.nodeSelector . | indent 8 | trim }} - {{- end }} - {{- if .Values.syncCatalog.affinity }} - affinity: - {{ tpl .Values.syncCatalog.affinity . | indent 8 | trim }} - {{- end }} - {{- if .Values.syncCatalog.tolerations }} - tolerations: - {{ tpl .Values.syncCatalog.tolerations . | indent 8 | trim }} - {{- end }} - volumes: - {{- if .Values.global.tls.enabled }} - {{- if not (or (and .Values.externalServers.enabled .Values.externalServers.useSystemRoots) .Values.global.secretsBackend.vault.enabled) }} - - name: consul-ca-cert - secret: - {{- if .Values.global.tls.caCert.secretName }} - secretName: {{ .Values.global.tls.caCert.secretName }} - {{- else }} - secretName: {{ template "consul.fullname" . }}-ca-cert - {{- end }} - items: - - key: {{ default "tls.crt" .Values.global.tls.caCert.secretKey }} - path: tls.crt - {{- end }} - {{- end }} -{{- end }} diff --git a/charts/consul/templates/sync-catalog-cleanup-on-upgrade-job.yaml b/charts/consul/templates/sync-catalog-cleanup-on-upgrade-job.yaml deleted file mode 100644 index 2349c51..0000000 --- a/charts/consul/templates/sync-catalog-cleanup-on-upgrade-job.yaml +++ /dev/null @@ -1,175 +0,0 @@ -{{- $syncCatalogEnabled := (or (and (ne (.Values.syncCatalog.enabled | toString) "-") .Values.syncCatalog.enabled) (and (eq (.Values.syncCatalog.enabled | toString) "-") .Values.global.enabled)) }} -{{- if and (not $syncCatalogEnabled) .Values.syncCatalog.cleanupNodeOnRemoval .Release.IsUpgrade }} -apiVersion: batch/v1 -kind: Job -metadata: - name: {{ template "consul.fullname" . }}-sync-catalog-cleanup-on-upgrade - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: sync-catalog-cleanup - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 4 }} - {{- end }} - annotations: - "helm.sh/hook": pre-upgrade - "helm.sh/hook-weight": "0" - "helm.sh/hook-delete-policy": hook-succeeded,hook-failed -spec: - template: - metadata: - name: {{ template "consul.fullname" . }}-sync-catalog-cleanup-on-upgrade - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - release: {{ .Release.Name }} - component: sync-catalog-cleanup - {{- if .Values.syncCatalog.extraLabels }} - {{- toYaml .Values.syncCatalog.extraLabels | nindent 8 }} - {{- end }} - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 8 }} - {{- end }} - annotations: - "consul.hashicorp.com/connect-inject": "false" - "consul.hashicorp.com/mesh-inject": "false" - {{- if .Values.syncCatalog.annotations }} - {{- tpl .Values.syncCatalog.annotations . | nindent 8 }} - {{- end }} - {{- if (and .Values.global.secretsBackend.vault.enabled .Values.global.tls.enabled) }} - "vault.hashicorp.com/agent-init-first": "true" - "vault.hashicorp.com/agent-inject": "true" - "vault.hashicorp.com/role": {{ .Values.global.secretsBackend.vault.consulCARole }} - "vault.hashicorp.com/agent-inject-secret-serverca.crt": {{ .Values.global.tls.caCert.secretName }} - "vault.hashicorp.com/agent-inject-template-serverca.crt": {{ template "consul.serverTLSCATemplate" . }} - {{- if and .Values.global.secretsBackend.vault.ca.secretName .Values.global.secretsBackend.vault.ca.secretKey }} - "vault.hashicorp.com/agent-extra-secret": "{{ .Values.global.secretsBackend.vault.ca.secretName }}" - "vault.hashicorp.com/ca-cert": "/vault/custom/{{ .Values.global.secretsBackend.vault.ca.secretKey }}" - {{- end }} - {{- if .Values.global.secretsBackend.vault.agentAnnotations }} - {{ tpl .Values.global.secretsBackend.vault.agentAnnotations . | nindent 8 | trim }} - {{- end }} - {{- if (and (.Values.global.secretsBackend.vault.vaultNamespace) (not (hasKey (default "" .Values.global.secretsBackend.vault.agentAnnotations | fromYaml) "vault.hashicorp.com/namespace")))}} - "vault.hashicorp.com/namespace": "{{ .Values.global.secretsBackend.vault.vaultNamespace }}" - {{- end }} - {{- end }} - {{- if .Values.syncCatalog.metrics.enabled | default .Values.global.metrics.enabled }} - "prometheus.io/scrape": "true" - {{- if not (hasKey (default "" .Values.syncCatalog.annotations | fromYaml) "prometheus.io/path")}} - "prometheus.io/path": {{ default "/metrics" .Values.syncCatalog.metrics.path }} - {{- end }} - "prometheus.io/port": {{ .Values.syncCatalog.metrics.port | default "20300" | quote }} - {{- end }} - spec: - restartPolicy: Never - serviceAccountName: {{ template "consul.fullname" . }}-sync-catalog-cleanup - containers: - - name: sync-catalog-cleanup-job - image: "{{ default .Values.global.imageK8S .Values.syncCatalog.image }}" - {{ template "consul.imagePullPolicy" . }} - {{- include "consul.restrictedSecurityContext" . | nindent 8 }} - env: - {{- include "consul.consulK8sConsulServerEnvVars" . | nindent 8 }} - {{- if .Values.global.acls.manageSystemACLs }} - - name: CONSUL_LOGIN_AUTH_METHOD - {{- if and .Values.global.federation.enabled .Values.global.federation.primaryDatacenter .Values.global.enableConsulNamespaces }} - value: {{ template "consul.fullname" . }}-k8s-component-auth-method-{{ .Values.global.datacenter }} - {{- else }} - value: {{ template "consul.fullname" . }}-k8s-component-auth-method - {{- end }} - - name: CONSUL_LOGIN_DATACENTER - {{- if and .Values.global.federation.enabled .Values.global.federation.primaryDatacenter .Values.global.enableConsulNamespaces }} - value: {{ .Values.global.federation.primaryDatacenter }} - {{- else }} - value: {{ .Values.global.datacenter }} - {{- end }} - - name: CONSUL_LOGIN_META - value: "component=sync-catalog,pod=$(NAMESPACE)/$(POD_NAME)" - {{- end }} - - name: NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - {{- if (and .Values.syncCatalog.aclSyncToken.secretName .Values.syncCatalog.aclSyncToken.secretKey) }} - - name: CONSUL_ACL_TOKEN - valueFrom: - secretKeyRef: - name: {{ .Values.syncCatalog.aclSyncToken.secretName }} - key: {{ .Values.syncCatalog.aclSyncToken.secretKey }} - {{- end }} - volumeMounts: - {{- if .Values.global.tls.enabled }} - {{- if not (or (and .Values.externalServers.enabled .Values.externalServers.useSystemRoots) .Values.global.secretsBackend.vault.enabled) }} - - name: consul-ca-cert - mountPath: /consul/tls/ca - readOnly: true - {{- end }} - {{- end }} - command: - - "/bin/sh" - - "-ec" - - | - exec consul-k8s-control-plane sync-catalog \ - -log-level={{ default .Values.global.logLevel .Values.syncCatalog.logLevel }} \ - -log-json={{ .Values.global.logJSON }} \ - -k8s-default-sync={{ .Values.syncCatalog.default }} \ - {{- if .Values.global.adminPartitions.enabled }} - -partition={{ .Values.global.adminPartitions.name }} \ - {{- end }} - {{- if .Values.syncCatalog.consulNodeName }} - -consul-node-name={{ .Values.syncCatalog.consulNodeName }} \ - {{- end }} - {{- if .Values.syncCatalog.metrics.enabled | default .Values.global.metrics.enabled }} - -enable-metrics \ - {{- end }} - {{- if .Values.syncCatalog.metrics.path }} - -metrics-path={{ .Values.syncCatalog.metrics.path }} \ - {{- end }} - {{- if .Values.syncCatalog.metrics.port }} - -metrics-port={{ .Values.syncCatalog.metrics.port }} \ - {{- end }} - -prometheus-retention-time={{ .Values.global.metrics.agentMetricsRetentionTime }} \ - -purge-k8s-services-from-node - {{- with .Values.syncCatalog.resources }} - resources: - {{- toYaml . | nindent 10 }} - {{- end }} - {{- if or (eq (.Values.syncCatalog.metrics.enabled | toString) "-") .Values.syncCatalog.metrics.enabled .Values.global.metrics.enabled }} - ports: - - name: prometheus - containerPort: {{ .Values.syncCatalog.metrics.port | default "20300" | int }} - {{- end }} - {{- if .Values.syncCatalog.priorityClassName }} - priorityClassName: {{ .Values.syncCatalog.priorityClassName | quote }} - {{- end }} - {{- if .Values.syncCatalog.nodeSelector }} - nodeSelector: - {{ tpl .Values.syncCatalog.nodeSelector . | indent 8 | trim }} - {{- end }} - {{- if .Values.syncCatalog.affinity }} - affinity: - {{ tpl .Values.syncCatalog.affinity . | indent 8 | trim }} - {{- end }} - {{- if .Values.syncCatalog.tolerations }} - tolerations: - {{ tpl .Values.syncCatalog.tolerations . | indent 8 | trim }} - {{- end }} - volumes: - {{- if .Values.global.tls.enabled }} - {{- if not (or (and .Values.externalServers.enabled .Values.externalServers.useSystemRoots) .Values.global.secretsBackend.vault.enabled) }} - - name: consul-ca-cert - secret: - {{- if .Values.global.tls.caCert.secretName }} - secretName: {{ .Values.global.tls.caCert.secretName }} - {{- else }} - secretName: {{ template "consul.fullname" . }}-ca-cert - {{- end }} - items: - - key: {{ default "tls.crt" .Values.global.tls.caCert.secretKey }} - path: tls.crt - {{- end }} - {{- end }} -{{- end }} diff --git a/charts/consul/templates/sync-catalog-cleanup-serviceaccount.yaml b/charts/consul/templates/sync-catalog-cleanup-serviceaccount.yaml deleted file mode 100644 index c49852b..0000000 --- a/charts/consul/templates/sync-catalog-cleanup-serviceaccount.yaml +++ /dev/null @@ -1,23 +0,0 @@ -{{- if .Values.syncCatalog.cleanupNodeOnRemoval }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "consul.fullname" . }}-sync-catalog-cleanup - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: sync-catalog-cleanup - {{- if .Values.syncCatalog.serviceAccount.annotations }} - annotations: - {{ tpl .Values.syncCatalog.serviceAccount.annotations . | nindent 4 | trim }} - {{- end }} -{{- with .Values.global.imagePullSecrets }} -imagePullSecrets: -{{- range . }} - - name: {{ .name }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/consul/templates/sync-catalog-clusterrole.yaml b/charts/consul/templates/sync-catalog-clusterrole.yaml deleted file mode 100644 index 89ea9f3..0000000 --- a/charts/consul/templates/sync-catalog-clusterrole.yaml +++ /dev/null @@ -1,60 +0,0 @@ -{{- $syncEnabled := (or (and (ne (.Values.syncCatalog.enabled | toString) "-") .Values.syncCatalog.enabled) (and (eq (.Values.syncCatalog.enabled | toString) "-") .Values.global.enabled)) }} -{{- if $syncEnabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "consul.fullname" . }}-sync-catalog - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: sync-catalog -rules: -- apiGroups: [ "" ] - resources: - - services - verbs: - - get - - list - - watch -{{- if .Values.syncCatalog.toK8S }} - - update - - patch - - delete - - create -{{- end }} -- apiGroups: ["discovery.k8s.io"] - resources: - - endpointslices - verbs: - - get - - list - - watch -{{- if .Values.syncCatalog.toK8S }} - - update - - patch - - delete - - create -{{- end }} -- apiGroups: [ "" ] - resources: - - nodes - verbs: - - get -{{- if .Values.global.enablePodSecurityPolicies }} -- apiGroups: [ "policy" ] - resources: [ "podsecuritypolicies" ] - verbs: - - use - resourceNames: - - {{ template "consul.fullname" . }}-sync-catalog -{{- end }} -- apiGroups: [ "networking.k8s.io" ] - resources: - - ingresses - verbs: - - get - - list - - watch -{{- end }} diff --git a/charts/consul/templates/sync-catalog-clusterrolebinding.yaml b/charts/consul/templates/sync-catalog-clusterrolebinding.yaml deleted file mode 100644 index 818823c..0000000 --- a/charts/consul/templates/sync-catalog-clusterrolebinding.yaml +++ /dev/null @@ -1,21 +0,0 @@ -{{- $syncEnabled := (or (and (ne (.Values.syncCatalog.enabled | toString) "-") .Values.syncCatalog.enabled) (and (eq (.Values.syncCatalog.enabled | toString) "-") .Values.global.enabled)) }} -{{- if $syncEnabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "consul.fullname" . }}-sync-catalog - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: sync-catalog -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "consul.fullname" . }}-sync-catalog -subjects: - - kind: ServiceAccount - name: {{ template "consul.fullname" . }}-sync-catalog - namespace: {{ .Release.Namespace }} -{{- end }} diff --git a/charts/consul/templates/sync-catalog-deployment.yaml b/charts/consul/templates/sync-catalog-deployment.yaml deleted file mode 100644 index 5e69110..0000000 --- a/charts/consul/templates/sync-catalog-deployment.yaml +++ /dev/null @@ -1,261 +0,0 @@ -{{- $syncCatalogEnabled := (or (and (ne (.Values.syncCatalog.enabled | toString) "-") .Values.syncCatalog.enabled) (and (eq (.Values.syncCatalog.enabled | toString) "-") .Values.global.enabled)) }} -{{- if $syncCatalogEnabled }} -{{- template "consul.reservedNamesFailer" (list .Values.syncCatalog.consulNamespaces.consulDestinationNamespace "syncCatalog.consulNamespaces.consulDestinationNamespace") }} -{{ template "consul.validateRequiredCloudSecretsExist" . }} -{{ template "consul.validateCloudSecretKeys" . }} -# The deployment for running the sync-catalog pod -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "consul.fullname" . }}-sync-catalog - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: sync-catalog - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 4 }} - {{- end }} -spec: - replicas: 1 - selector: - matchLabels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - release: {{ .Release.Name }} - component: sync-catalog - template: - metadata: - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - release: {{ .Release.Name }} - component: sync-catalog - {{- if .Values.syncCatalog.extraLabels }} - {{- toYaml .Values.syncCatalog.extraLabels | nindent 8 }} - {{- end }} - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 8 }} - {{- end }} - annotations: - "consul.hashicorp.com/connect-inject": "false" - "consul.hashicorp.com/mesh-inject": "false" - {{- if .Values.syncCatalog.annotations }} - {{- tpl .Values.syncCatalog.annotations . | nindent 8 }} - {{- end }} - {{- if (and .Values.global.secretsBackend.vault.enabled .Values.global.tls.enabled) }} - "vault.hashicorp.com/agent-init-first": "true" - "vault.hashicorp.com/agent-inject": "true" - "vault.hashicorp.com/role": {{ .Values.global.secretsBackend.vault.consulCARole }} - "vault.hashicorp.com/agent-inject-secret-serverca.crt": {{ .Values.global.tls.caCert.secretName }} - "vault.hashicorp.com/agent-inject-template-serverca.crt": {{ template "consul.serverTLSCATemplate" . }} - {{- if and .Values.global.secretsBackend.vault.ca.secretName .Values.global.secretsBackend.vault.ca.secretKey }} - "vault.hashicorp.com/agent-extra-secret": "{{ .Values.global.secretsBackend.vault.ca.secretName }}" - "vault.hashicorp.com/ca-cert": "/vault/custom/{{ .Values.global.secretsBackend.vault.ca.secretKey }}" - {{- end }} - {{- if .Values.global.secretsBackend.vault.agentAnnotations }} - {{ tpl .Values.global.secretsBackend.vault.agentAnnotations . | nindent 8 | trim }} - {{- end }} - {{- if (and (.Values.global.secretsBackend.vault.vaultNamespace) (not (hasKey (default "" .Values.global.secretsBackend.vault.agentAnnotations | fromYaml) "vault.hashicorp.com/namespace")))}} - "vault.hashicorp.com/namespace": "{{ .Values.global.secretsBackend.vault.vaultNamespace }}" - {{- end }} - {{- end }} - {{- if .Values.syncCatalog.metrics.enabled | default .Values.global.metrics.enabled }} - "prometheus.io/scrape": "true" - {{- if not (hasKey (default "" .Values.syncCatalog.annotations | fromYaml) "prometheus.io/path")}} - "prometheus.io/path": {{ default "/metrics" .Values.syncCatalog.metrics.path }} - {{- end }} - "prometheus.io/port": {{ .Values.syncCatalog.metrics.port | default "20300" | quote }} - {{- end }} - spec: - serviceAccountName: {{ template "consul.fullname" . }}-sync-catalog - volumes: - {{- if .Values.global.tls.enabled }} - {{- if not (or (and .Values.externalServers.enabled .Values.externalServers.useSystemRoots) .Values.global.secretsBackend.vault.enabled) }} - - name: consul-ca-cert - secret: - {{- if .Values.global.tls.caCert.secretName }} - secretName: {{ .Values.global.tls.caCert.secretName }} - {{- else }} - secretName: {{ template "consul.fullname" . }}-ca-cert - {{- end }} - items: - - key: {{ default "tls.crt" .Values.global.tls.caCert.secretKey }} - path: tls.crt - {{- end }} - {{- end }} - containers: - - name: sync-catalog - image: "{{ default .Values.global.imageK8S .Values.syncCatalog.image }}" - {{ template "consul.imagePullPolicy" . }} - {{- include "consul.restrictedSecurityContext" . | nindent 8 }} - env: - {{- include "consul.consulK8sConsulServerEnvVars" . | nindent 8 }} - {{- if .Values.global.acls.manageSystemACLs }} - - name: CONSUL_LOGIN_AUTH_METHOD - {{- if and .Values.global.federation.enabled .Values.global.federation.primaryDatacenter .Values.global.enableConsulNamespaces }} - value: {{ template "consul.fullname" . }}-k8s-component-auth-method-{{ .Values.global.datacenter }} - {{- else }} - value: {{ template "consul.fullname" . }}-k8s-component-auth-method - {{- end }} - - name: CONSUL_LOGIN_DATACENTER - {{- if and .Values.global.federation.enabled .Values.global.federation.primaryDatacenter .Values.global.enableConsulNamespaces }} - value: {{ .Values.global.federation.primaryDatacenter }} - {{- else }} - value: {{ .Values.global.datacenter }} - {{- end }} - - name: CONSUL_LOGIN_META - value: "component=sync-catalog,pod=$(NAMESPACE)/$(POD_NAME)" - {{- end }} - - name: NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - {{- if (and .Values.syncCatalog.aclSyncToken.secretName .Values.syncCatalog.aclSyncToken.secretKey) }} - - name: CONSUL_ACL_TOKEN - valueFrom: - secretKeyRef: - name: {{ .Values.syncCatalog.aclSyncToken.secretName }} - key: {{ .Values.syncCatalog.aclSyncToken.secretKey }} - {{- end }} - volumeMounts: - {{- if .Values.global.tls.enabled }} - {{- if not (or (and .Values.externalServers.enabled .Values.externalServers.useSystemRoots) .Values.global.secretsBackend.vault.enabled) }} - - name: consul-ca-cert - mountPath: /consul/tls/ca - readOnly: true - {{- end }} - {{- end }} - command: - - "/bin/sh" - - "-ec" - - | - exec consul-k8s-control-plane sync-catalog \ - -log-level={{ default .Values.global.logLevel .Values.syncCatalog.logLevel }} \ - -log-json={{ .Values.global.logJSON }} \ - -k8s-default-sync={{ .Values.syncCatalog.default }} \ - {{- if (not .Values.syncCatalog.toConsul) }} - -to-consul=false \ - {{- end }} - {{- if (not .Values.syncCatalog.toK8S) }} - -to-k8s=false \ - {{- end }} - -consul-domain={{ .Values.global.domain }} \ - {{- if .Values.syncCatalog.k8sPrefix }} - -k8s-service-prefix="{{ .Values.syncCatalog.k8sPrefix}}" \ - {{- end }} - {{- if .Values.syncCatalog.k8sSourceNamespace }} - -k8s-source-namespace="{{ .Values.syncCatalog.k8sSourceNamespace}}" \ - {{- end }} - {{- range $value := .Values.syncCatalog.k8sAllowNamespaces }} - -allow-k8s-namespace="{{ $value }}" \ - {{- end }} - {{- range $value := .Values.syncCatalog.k8sDenyNamespaces }} - -deny-k8s-namespace="{{ $value }}" \ - {{- end }} - -k8s-write-namespace=${NAMESPACE} \ - {{- if (not .Values.syncCatalog.syncClusterIPServices) }} - -sync-clusterip-services=false \ - {{- end }} - {{- if .Values.syncCatalog.nodePortSyncType }} - -node-port-sync-type={{ .Values.syncCatalog.nodePortSyncType }} \ - {{- end }} - {{- if .Values.syncCatalog.consulWriteInterval }} - -consul-write-interval={{ .Values.syncCatalog.consulWriteInterval }} \ - {{- end }} - {{- if .Values.syncCatalog.k8sTag }} - -consul-k8s-tag={{ .Values.syncCatalog.k8sTag }} \ - {{- end }} - {{- if .Values.syncCatalog.consulNodeName }} - -consul-node-name={{ .Values.syncCatalog.consulNodeName }} \ - {{- end }} - {{- if .Values.global.adminPartitions.enabled }} - -partition={{ .Values.global.adminPartitions.name }} \ - {{- end }} - {{- if .Values.syncCatalog.consulPrefix}} - -consul-service-prefix="{{ .Values.syncCatalog.consulPrefix}}" \ - {{- end}} - {{- if .Values.syncCatalog.addK8SNamespaceSuffix}} - -add-k8s-namespace-suffix \ - {{- end}} - {{- if .Values.global.enableConsulNamespaces }} - -enable-namespaces=true \ - {{- if .Values.syncCatalog.consulNamespaces.consulDestinationNamespace }} - -consul-destination-namespace={{ .Values.syncCatalog.consulNamespaces.consulDestinationNamespace }} \ - {{- end }} - {{- if .Values.syncCatalog.consulNamespaces.mirroringK8S }} - -enable-k8s-namespace-mirroring=true \ - {{- if .Values.syncCatalog.consulNamespaces.mirroringK8SPrefix }} - -k8s-namespace-mirroring-prefix={{ .Values.syncCatalog.consulNamespaces.mirroringK8SPrefix }} \ - {{- end }} - {{- end }} - {{- if .Values.global.acls.manageSystemACLs }} - -consul-cross-namespace-acl-policy=cross-namespace-policy \ - {{- end }} - {{- end }} - {{- if .Values.syncCatalog.ingress.enabled }} - -enable-ingress=true \ - {{- if .Values.syncCatalog.ingress.loadBalancerIPs }} - -loadBalancer-ips=true \ - {{- end }} - {{- end }} - {{- if .Values.syncCatalog.syncLoadBalancerEndpoints }} - -sync-lb-services-endpoints=true \ - {{- end }} - {{- if .Values.syncCatalog.metrics.enabled | default .Values.global.metrics.enabled }} - -enable-metrics \ - {{- end }} - {{- if .Values.syncCatalog.metrics.path }} - -metrics-path={{ .Values.syncCatalog.metrics.path }} \ - {{- end }} - {{- if .Values.syncCatalog.metrics.port }} - -metrics-port={{ .Values.syncCatalog.metrics.port }} \ - {{- end }} - -prometheus-retention-time={{ .Values.global.metrics.agentMetricsRetentionTime }} \ - livenessProbe: - httpGet: - path: /health/ready - port: 8080 - scheme: HTTP - failureThreshold: 3 - initialDelaySeconds: 30 - periodSeconds: 5 - successThreshold: 1 - timeoutSeconds: 5 - readinessProbe: - httpGet: - path: /health/ready - port: 8080 - scheme: HTTP - failureThreshold: 5 - initialDelaySeconds: 10 - periodSeconds: 5 - successThreshold: 1 - timeoutSeconds: 5 - {{- with .Values.syncCatalog.resources }} - resources: - {{- toYaml . | nindent 10 }} - {{- end }} - {{- if or (eq (.Values.syncCatalog.metrics.enabled | toString) "-") .Values.syncCatalog.metrics.enabled .Values.global.metrics.enabled }} - ports: - - name: prometheus - containerPort: {{ .Values.syncCatalog.metrics.port | default "20300" | int }} - {{- end }} - {{- if .Values.syncCatalog.priorityClassName }} - priorityClassName: {{ .Values.syncCatalog.priorityClassName | quote }} - {{- end }} - {{- if .Values.syncCatalog.nodeSelector }} - nodeSelector: - {{ tpl .Values.syncCatalog.nodeSelector . | indent 8 | trim }} - {{- end }} - {{- if .Values.syncCatalog.affinity }} - affinity: - {{ tpl .Values.syncCatalog.affinity . | indent 8 | trim }} - {{- end }} - {{- if .Values.syncCatalog.tolerations }} - tolerations: - {{ tpl .Values.syncCatalog.tolerations . | indent 8 | trim }} - {{- end }} -{{- end }} diff --git a/charts/consul/templates/sync-catalog-podsecuritypolicy.yaml b/charts/consul/templates/sync-catalog-podsecuritypolicy.yaml deleted file mode 100644 index cc70fea..0000000 --- a/charts/consul/templates/sync-catalog-podsecuritypolicy.yaml +++ /dev/null @@ -1,40 +0,0 @@ -{{- if (and .Values.global.enablePodSecurityPolicies (or (and (ne (.Values.syncCatalog.enabled | toString) "-") .Values.syncCatalog.enabled) (and (eq (.Values.syncCatalog.enabled | toString) "-") .Values.global.enabled))) }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "consul.fullname" . }}-sync-catalog - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: sync-catalog -spec: - privileged: false - # Required to prevent escalations to root. - allowPrivilegeEscalation: false - # This is redundant with non-root + disallow privilege escalation, - # but we can provide it for defense in depth. - requiredDropCapabilities: - - ALL - # Allow core volume types. - volumes: - - 'configMap' - - 'emptyDir' - - 'projected' - - 'secret' - - 'downwardAPI' - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'RunAsAny' - fsGroup: - rule: 'RunAsAny' - readOnlyRootFilesystem: false -{{- end }} diff --git a/charts/consul/templates/sync-catalog-serviceaccount.yaml b/charts/consul/templates/sync-catalog-serviceaccount.yaml deleted file mode 100644 index deab1ad..0000000 --- a/charts/consul/templates/sync-catalog-serviceaccount.yaml +++ /dev/null @@ -1,24 +0,0 @@ -{{- $syncEnabled := (or (and (ne (.Values.syncCatalog.enabled | toString) "-") .Values.syncCatalog.enabled) (and (eq (.Values.syncCatalog.enabled | toString) "-") .Values.global.enabled)) }} -{{- if $syncEnabled }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "consul.fullname" . }}-sync-catalog - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: sync-catalog - {{- if .Values.syncCatalog.serviceAccount.annotations }} - annotations: - {{ tpl .Values.syncCatalog.serviceAccount.annotations . | nindent 4 | trim }} - {{- end }} -{{- with .Values.global.imagePullSecrets }} -imagePullSecrets: -{{- range . }} - - name: {{ .name }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/consul/templates/telemetry-collector-configmap.yaml b/charts/consul/templates/telemetry-collector-configmap.yaml deleted file mode 100644 index 0bf5b87..0000000 --- a/charts/consul/templates/telemetry-collector-configmap.yaml +++ /dev/null @@ -1,18 +0,0 @@ -{{- if (and .Values.telemetryCollector.enabled .Values.telemetryCollector.customExporterConfig) }} -# Immutable ConfigMap which saves the partition name. Attempting to update this configmap -# with a new Admin Partition name will cause the helm upgrade to fail -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ template "consul.fullname" . }}-telemetry-collector - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: consul-telemetry-collector -data: - config.json: |- - {{ tpl .Values.telemetryCollector.customExporterConfig . | trimAll "\"" | indent 4 }} -{{- end }} diff --git a/charts/consul/templates/telemetry-collector-deployment.yaml b/charts/consul/templates/telemetry-collector-deployment.yaml deleted file mode 100644 index 826e072..0000000 --- a/charts/consul/templates/telemetry-collector-deployment.yaml +++ /dev/null @@ -1,453 +0,0 @@ -{{- if .Values.telemetryCollector.enabled }} -{{- if not .Values.telemetryCollector.image}}{{ fail "telemetryCollector.image must be set to enable consul-telemetry-collector" }}{{ end }} -{{- if not .Values.connectInject.enabled }}{{ fail "connectInject.enabled must be true" }}{{ end -}} -{{- if and .Values.global.adminPartitions.enabled (not .Values.global.enableConsulNamespaces) }}{{ fail "global.enableConsulNamespaces must be true if global.adminPartitions.enabled=true" }}{{ end }} -{{ template "consul.validateCloudSecretKeys" . }} -{{ template "consul.validateTelemetryCollectorCloud" . }} -{{ template "consul.validateTelemetryCollectorCloudSecretKeys" . }} -{{ template "consul.validateTelemetryCollectorResourceId" . }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "consul.fullname" . }}-telemetry-collector - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: consul-telemetry-collector - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 4 }} - {{- end }} -spec: - replicas: {{ .Values.telemetryCollector.replicas }} - selector: - matchLabels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - release: {{ .Release.Name }} - component: consul-telemetry-collector - template: - metadata: - annotations: - "consul.hashicorp.com/connect-inject": "false" - # This annotation tells the endpoints controller that this pod was injected even though it wasn't. The - # endpoints controller would then sync the endpoint into Consul - "consul.hashicorp.com/connect-inject-status": "injected" - # Signals to the endpoints controller that we should force Consul NS creation, since we bypass the mesh webhook. - "consul.hashicorp.com/telemetry-collector": "true" - # We aren't using tproxy and we don't have an original pod. This would be simpler if we made a path similar - # to gateways - "consul.hashicorp.com/connect-service-port": "metricsserver" - "consul.hashicorp.com/transparent-proxy": "false" - "consul.hashicorp.com/transparent-proxy-overwrite-probes": "false" - "consul.hashicorp.com/connect-k8s-version": {{ $.Chart.Version }} - {{- if .Values.telemetryCollector.customExporterConfig }} - # configmap checksum - "consul.hashicorp.com/config-checksum": {{ include (print $.Template.BasePath "/telemetry-collector-configmap.yaml") . | sha256sum }} - {{- end }} - # vault annotations - {{- if (and .Values.global.secretsBackend.vault.enabled .Values.global.tls.enabled) }} - "vault.hashicorp.com/agent-init-first": "true" - "vault.hashicorp.com/agent-inject": "true" - "vault.hashicorp.com/role": {{ .Values.global.secretsBackend.vault.consulCARole }} - "vault.hashicorp.com/agent-inject-secret-serverca.crt": {{ .Values.global.tls.caCert.secretName }} - "vault.hashicorp.com/agent-inject-template-serverca.crt": {{ template "consul.serverTLSCATemplate" . }} - {{- if and .Values.global.secretsBackend.vault.ca.secretName .Values.global.secretsBackend.vault.ca.secretKey }} - "vault.hashicorp.com/agent-extra-secret": "{{ .Values.global.secretsBackend.vault.ca.secretName }}" - "vault.hashicorp.com/ca-cert": "/vault/custom/{{ .Values.global.secretsBackend.vault.ca.secretKey }}" - {{- end }} - {{- if .Values.global.secretsBackend.vault.agentAnnotations }} - {{ tpl .Values.global.secretsBackend.vault.agentAnnotations . | nindent 8 | trim }} - {{- end }} - {{- if (and (.Values.global.secretsBackend.vault.vaultNamespace) (not (hasKey (default "" .Values.global.secretsBackend.vault.agentAnnotations | fromYaml) "vault.hashicorp.com/namespace")))}} - "vault.hashicorp.com/namespace": "{{ .Values.global.secretsBackend.vault.vaultNamespace }}" - {{- end }} - {{- end }} - - labels: - consul.hashicorp.com/connect-inject-managed-by: consul-k8s-endpoints-controller - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - release: {{ .Release.Name }} - component: consul-telemetry-collector - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 8 }} - {{- end }} - spec: - # This needs to explicitly be consul-telemetry-collector because we look this up from each service consul-dataplane - # to forward metrics to it. - serviceAccountName: consul-telemetry-collector - initContainers: - # We're manually managing this init container instead of using the connect injector so that we don't run into - # any race conditions on the connect-injector deployment or upgrade - - name: consul-connect-init - env: - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - - name: CONSUL_NODE_NAME - value: $(NODE_NAME)-virtual - {{- include "consul.consulK8sConsulServerEnvVars" . | nindent 10 }} - # acl login info - {{- if .Values.global.acls.manageSystemACLs }} - - name: CONSUL_LOGIN_AUTH_METHOD - value: {{ template "consul.fullname" . }}-k8s-auth-method - - name: CONSUL_LOGIN_DATACENTER - value: {{ .Values.global.datacenter }} - - name: CONSUL_LOGIN_META - value: "component=consul-telemetry-collector,pod=$(NAMESPACE)/$(POD_NAME)" - {{- end }} - # service and login namespace - # this is attempting to replicate the behavior of webhooks in calculating namespace - # https://github.com/hashicorp/consul-k8s/blob/b84339050bb2c4b62b60cec96275f74952b0ac9d/control-plane/connect-inject/webhook/consul_dataplane_sidecar.go#L200 - {{- if .Values.global.enableConsulNamespaces }} - {{- if .Values.connectInject.consulNamespaces.mirroringK8S }} - - name: CONSUL_NAMESPACE - value: {{ .Values.connectInject.consulNamespaces.mirroringK8SPrefix }}{{ .Release.Namespace }} - {{- else }} - - name: CONSUL_NAMESPACE - value: {{ .Values.connectInject.consulNamespaces.consulDestinationNamespace }} - {{- end }} - {{- if .Values.global.acls.manageSystemACLs }} - {{- if .Values.connectInject.consulNamespaces.mirroringK8S }} - - name: CONSUL_LOGIN_NAMESPACE - value: default - {{- else }} - - name: CONSUL_LOGIN_NAMESPACE - value: {{ .Values.connectInject.consulNamespaces.consulDestinationNamespace }} - {{- end }} - {{- end }} - {{- end }} - command: - - /bin/sh - - -ec - - |- - exec consul-k8s-control-plane connect-init \ - -log-json={{ .Values.global.logJSON }} \ - -log-level={{ default .Values.global.logLevel .Values.telemetryCollector.logLevel }} \ - -pod-name=${POD_NAME} \ - -pod-namespace=${POD_NAMESPACE} \ - -proxy-id-file="/consul/connect-inject/proxyid" \ - -service-account-name="consul-telemetry-collector" \ - -service-name="" - - image: {{ .Values.global.imageK8S }} - {{ template "consul.imagePullPolicy" . }} - {{- if .Values.telemetryCollector.initContainer.resources }} - resources: - {{- toYaml .Values.telemetryCollector.initContainer.resources | nindent 12 }} - {{- else }} - resources: - limits: - cpu: 50m - memory: 150Mi - requests: - cpu: 50m - memory: 25Mi - {{- end }} - terminationMessagePath: /dev/termination-log - terminationMessagePolicy: File - volumeMounts: - - mountPath: /consul/connect-inject - name: consul-connect-inject-data - {{- if .Values.global.tls.enabled }} - {{- if not (or (and .Values.externalServers.enabled .Values.externalServers.useSystemRoots) .Values.global.secretsBackend.vault.enabled) }} - - name: consul-ca-cert - mountPath: /consul/tls/ca - readOnly: true - {{- end }} - {{- end }} - containers: - - name: consul-telemetry-collector - image: {{ .Values.telemetryCollector.image }} - {{ template "consul.imagePullPolicy" . }} - ports: - - containerPort: 9090 - name: metrics - protocol: TCP - - containerPort: 9356 - name: metricsserver - protocol: TCP - env: - # These are mounted as secrets so that the telemetry-collector can use them when cloud is enabled. - # - the hcp-go-sdk in consul agent will already look for HCP_CLIENT_ID, HCP_CLIENT_SECRET, HCP_AUTH_URL, - # HCP_SCADA_ADDRESS, and HCP_API_HOST. so nothing more needs to be done. - # - HCP_RESOURCE_ID is created either in the global cloud section or in telemetryCollector.cloud - {{- if .Values.telemetryCollector.cloud.resourceId.secretName }} - - name: HCP_RESOURCE_ID - valueFrom: - secretKeyRef: - name: {{ .Values.telemetryCollector.cloud.resourceId.secretName }} - key: {{ .Values.telemetryCollector.cloud.resourceId.secretKey }} - {{- else if .Values.global.cloud.resourceId.secretName }} - - name: HCP_RESOURCE_ID - valueFrom: - secretKeyRef: - name: {{ .Values.global.cloud.resourceId.secretName }} - key: {{ .Values.global.cloud.resourceId.secretKey }} - {{- end }} - {{- if .Values.telemetryCollector.cloud.clientId.secretName }} - - name: HCP_CLIENT_ID - valueFrom: - secretKeyRef: - name: {{ .Values.telemetryCollector.cloud.clientId.secretName }} - key: {{ .Values.telemetryCollector.cloud.clientId.secretKey }} - {{- else if .Values.global.cloud.clientId.secretName }} - - name: HCP_CLIENT_ID - valueFrom: - secretKeyRef: - name: {{ .Values.global.cloud.clientId.secretName }} - key: {{ .Values.global.cloud.clientId.secretKey }} - {{- end }} - {{- if .Values.telemetryCollector.cloud.clientSecret.secretName }} - - name: HCP_CLIENT_SECRET - valueFrom: - secretKeyRef: - name: {{ .Values.telemetryCollector.cloud.clientSecret.secretName }} - key: {{ .Values.telemetryCollector.cloud.clientSecret.secretKey }} - {{- else if .Values.global.cloud.clientSecret.secretName }} - - name: HCP_CLIENT_SECRET - valueFrom: - secretKeyRef: - name: {{ .Values.global.cloud.clientSecret.secretName }} - key: {{ .Values.global.cloud.clientSecret.secretKey }} - {{- end}} - {{- if .Values.global.cloud.authUrl.secretName }} - - name: HCP_AUTH_URL - valueFrom: - secretKeyRef: - name: {{ .Values.global.cloud.authUrl.secretName }} - key: {{ .Values.global.cloud.authUrl.secretKey }} - {{- end}} - {{- if .Values.global.cloud.apiHost.secretName }} - - name: HCP_API_HOST - valueFrom: - secretKeyRef: - name: {{ .Values.global.cloud.apiHost.secretName }} - key: {{ .Values.global.cloud.apiHost.secretKey }} - {{- end}} - {{- if .Values.global.cloud.scadaAddress.secretName }} - - name: HCP_SCADA_ADDRESS - valueFrom: - secretKeyRef: - name: {{ .Values.global.cloud.scadaAddress.secretName }} - key: {{ .Values.global.cloud.scadaAddress.secretKey }} - {{- end}} - {{- if .Values.global.trustedCAs }} - - name: SSL_CERT_DIR - value: "/etc/ssl/certs:/trusted-cas" - {{- end }} - {{- if .Values.global.metrics.datadog.otlp.enabled }} - - name: HOST_IP - valueFrom: - fieldRef: - fieldPath: status.hostIP - {{- if eq (.Values.global.metrics.datadog.otlp.protocol | lower ) "http" }} - - name: CO_OTEL_HTTP_ENDPOINT - value: "http://$(HOST_IP):4318" - - name: OTEL_EXPORTER_OTLP_ENDPOINT - value: "http://$(HOST_IP):4318" - {{- else if eq (.Values.global.metrics.datadog.otlp.protocol | lower) "grpc" }} - - name: CO_OTEL_HTTP_ENDPOINT - value: "http://$(HOST_IP):4317" - - name: OTEL_EXPORTER_OTLP_ENDPOINT - value: "http://$(HOST_IP):4317" - {{- end }} - {{- end }} - {{- include "consul.extraEnvironmentVars" .Values.telemetryCollector | nindent 12 }} - command: - - "/bin/sh" - - "-ec" - - | - {{- if .Values.global.trustedCAs }} - {{- range $i, $cert := .Values.global.trustedCAs }} - cat < /trusted-cas/custom-ca-{{$i}}.pem - {{- $cert | nindent 10 }} - EOF - {{- end }} - {{- end }} - - exec consul-telemetry-collector agent \ - {{- if .Values.telemetryCollector.customExporterConfig }} - -config-file-path /consul/config/config.json \ - {{ end }} - volumeMounts: - {{- if .Values.telemetryCollector.customExporterConfig }} - - name: config - mountPath: /consul/config - {{- end }} - {{- if .Values.global.trustedCAs }} - - name: trusted-cas - mountPath: /trusted-cas - readOnly: false - {{- end }} - resources: - {{- if .Values.telemetryCollector.resources }} - {{- toYaml .Values.telemetryCollector.resources | nindent 12 }} - {{- end }} - # consul-dataplane container - - name: consul-dataplane - image: "{{ .Values.global.imageConsulDataplane }}" - {{ template "consul.imagePullPolicy" . }} - command: - - consul-dataplane - args: - # addresses - {{- if .Values.externalServers.enabled }} - - -addresses={{ .Values.externalServers.hosts | first }} - {{- else }} - - -addresses={{ template "consul.fullname" . }}-server.{{ .Release.Namespace }}.svc - {{- end }} - # grpc - {{- if .Values.externalServers.enabled }} - - -grpc-port={{ .Values.externalServers.grpcPort }} - {{- else }} - - -grpc-port=8502 - {{- end }} - - -proxy-service-id-path=/consul/connect-inject/proxyid - # tls - {{- if .Values.global.tls.enabled }} - {{- if (not (and .Values.externalServers.enabled .Values.externalServers.useSystemRoots)) }} - {{- if .Values.global.secretsBackend.vault.enabled }} - - -ca-certs=/vault/secrets/serverca.crt - {{- else }} - - -ca-certs=/consul/tls/ca/tls.crt - {{- end }} - {{- end }} - {{- if and .Values.externalServers.enabled .Values.externalServers.tlsServerName }} - - -tls-server-name={{.Values.externalServers.tlsServerName }} - {{- else if .Values.global.cloud.enabled }} - - -tls-server-name=server.{{ .Values.global.datacenter}}.{{ .Values.global.domain}} - {{- end }} - {{- else }} - - -tls-disabled - {{- end }} - # credentials - {{- if .Values.global.acls.manageSystemACLs }} - - -credential-type=login - - -login-bearer-token-path=/var/run/secrets/kubernetes.io/serviceaccount/token - - -login-auth-method={{ template "consul.fullname" . }}-k8s-auth-method - {{- end }} - # service and login namespace - {{- if .Values.global.enableConsulNamespaces }} - {{- if .Values.connectInject.consulNamespaces.mirroringK8S }} - - -service-namespace={{ .Values.connectInject.consulNamespaces.mirroringK8SPrefix }}{{ .Release.Namespace }} - {{- else }} - - -service-namespace={{ .Values.connectInject.consulNamespaces.consulDestinationNamespace }} - {{- end }} - {{- if .Values.global.acls.manageSystemACLs }} - {{- if .Values.connectInject.consulNamespaces.mirroringK8S }} - - -login-namespace=default - {{- else }} - - -login-namespace={{ .Values.connectInject.consulNamespaces.consulDestinationNamespace }} - {{- end }} - {{- end }} - {{- end }} - # service and login partition - {{- if .Values.global.adminPartitions.enabled }} - - -service-partition={{ .Values.global.adminPartitions.name }} - {{- if .Values.global.acls.manageSystemACLs }} - - -login-partition={{ .Values.global.adminPartitions.name }} - {{- end }} - {{- end }} - # telemetry - {{- if .Values.global.metrics.enabled }} - - -telemetry-prom-scrape-path=/metrics - {{- end }} - - -log-level={{ default .Values.global.logLevel .Values.telemetryCollector.logLevel }} - - -log-json={{ .Values.global.logJSON }} - - -envoy-concurrency=2 - {{- if and .Values.externalServers.enabled .Values.externalServers.skipServerWatch }} - - -server-watch-disabled=true - {{- end }} - env: - - name: NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - - name: DP_CREDENTIAL_LOGIN_META1 - value: pod=$(NAMESPACE)/$(POD_NAME) - - name: DP_CREDENTIAL_LOGIN_META2 - value: component=consul-telemetry-collector - - name: DP_SERVICE_NODE_NAME - value: $(NODE_NAME)-virtual - - name: TMPDIR - value: /consul/connect-inject - readinessProbe: - failureThreshold: 3 - initialDelaySeconds: 1 - periodSeconds: 10 - successThreshold: 1 - tcpSocket: - port: 20000 - timeoutSeconds: 1 - securityContext: - readOnlyRootFilesystem: true - runAsGroup: 5995 - runAsNonRoot: true - runAsUser: 5995 - # dataplane volume mounts - volumeMounts: - - mountPath: /consul/connect-inject - name: consul-connect-inject-data - {{- if .Values.global.tls.enabled }} - {{- if not (or (and .Values.externalServers.enabled .Values.externalServers.useSystemRoots) .Values.global.secretsBackend.vault.enabled) }} - - name: consul-ca-cert - mountPath: /consul/tls/ca - readOnly: true - {{- end }} - {{- end }} - - {{- if .Values.telemetryCollector.nodeSelector }} - nodeSelector: - {{ tpl .Values.telemetryCollector.nodeSelector . | indent 8 | trim }} - {{- end }} - {{- if .Values.telemetryCollector.priorityClassName }} - priorityClassName: {{ .Values.telemetryCollector.priorityClassName }} - {{- end }} - volumes: - - emptyDir: - medium: Memory - name: consul-connect-inject-data - {{- if .Values.global.trustedCAs }} - - name: trusted-cas - emptyDir: - medium: "Memory" - {{- end }} - {{- if .Values.global.tls.enabled }} - {{- if not (or (and .Values.externalServers.enabled .Values.externalServers.useSystemRoots) .Values.global.secretsBackend.vault.enabled) }} - - name: consul-ca-cert - secret: - {{- if .Values.global.tls.caCert.secretName }} - secretName: {{ .Values.global.tls.caCert.secretName }} - {{- else }} - secretName: {{ template "consul.fullname" . }}-ca-cert - {{- end }} - items: - - key: {{ default "tls.crt" .Values.global.tls.caCert.secretKey }} - path: tls.crt - {{- end }} - {{- end }} - - name: config - configMap: - name: {{ template "consul.fullname" . }}-telemetry-collector -{{- end }} diff --git a/charts/consul/templates/telemetry-collector-podsecuritypolicy.yaml b/charts/consul/templates/telemetry-collector-podsecuritypolicy.yaml deleted file mode 100644 index f4c05a2..0000000 --- a/charts/consul/templates/telemetry-collector-podsecuritypolicy.yaml +++ /dev/null @@ -1,42 +0,0 @@ -{{- if and .Values.global.enablePodSecurityPolicies .Values.telemetryCollector.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "consul.fullname" . }}-telemetry-collector - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: telemetry-collector -spec: - privileged: false - # Required to prevent escalations to root. - allowPrivilegeEscalation: false - # This is redundant with non-root + disallow privilege escalation, - # but we can provide it for defense in depth. - requiredDropCapabilities: - - ALL - defaultAddCapabilities: - - NET_BIND_SERVICE - # Allow core volume types. - volumes: - - 'configMap' - - 'emptyDir' - - 'projected' - - 'secret' - - 'downwardAPI' - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'RunAsAny' - fsGroup: - rule: 'RunAsAny' - readOnlyRootFilesystem: false -{{- end }} diff --git a/charts/consul/templates/telemetry-collector-role.yaml b/charts/consul/templates/telemetry-collector-role.yaml deleted file mode 100644 index f893732..0000000 --- a/charts/consul/templates/telemetry-collector-role.yaml +++ /dev/null @@ -1,21 +0,0 @@ -{{- if and .Values.global.enablePodSecurityPolicies .Values.telemetryCollector.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: {{ template "consul.fullname" . }}-telemetry-collector - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: consul-telemetry-collector -rules: - - apiGroups: ["policy"] - resources: ["podsecuritypolicies"] - resourceNames: - - {{ template "consul.fullname" . }}-telemetry-collector - verbs: - - use -{{- end }} - diff --git a/charts/consul/templates/telemetry-collector-rolebinding.yaml b/charts/consul/templates/telemetry-collector-rolebinding.yaml deleted file mode 100644 index 1f9a896..0000000 --- a/charts/consul/templates/telemetry-collector-rolebinding.yaml +++ /dev/null @@ -1,21 +0,0 @@ -{{- if and .Values.global.enablePodSecurityPolicies .Values.telemetryCollector.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: {{ template "consul.fullname" . }}-telemetry-collector - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: consul-telemetry-collector -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: {{ template "consul.fullname" . }}-telemetry-collector -subjects: - - kind: ServiceAccount - name: {{ template "consul.fullname" . }}-telemetry-collector -{{- end }} - diff --git a/charts/consul/templates/telemetry-collector-service.yaml b/charts/consul/templates/telemetry-collector-service.yaml deleted file mode 100644 index 266c80b..0000000 --- a/charts/consul/templates/telemetry-collector-service.yaml +++ /dev/null @@ -1,24 +0,0 @@ -{{- if .Values.telemetryCollector.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: consul-telemetry-collector - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - release: {{ .Release.Name }} - component: consul-telemetry-collector - {{ if .Values.telemetryCollector.service.annotations }} - annotations: - {{ tpl .Values.telemetryCollector.service.annotations . | nindent 4 | trim }} - {{- end }} -spec: - type: ClusterIP - ports: - - port: 9356 - targetPort: 9356 - selector: - app: consul - component: consul-telemetry-collector -{{- end }} \ No newline at end of file diff --git a/charts/consul/templates/telemetry-collector-serviceaccount.yaml b/charts/consul/templates/telemetry-collector-serviceaccount.yaml deleted file mode 100644 index fca58ee..0000000 --- a/charts/consul/templates/telemetry-collector-serviceaccount.yaml +++ /dev/null @@ -1,23 +0,0 @@ -{{- if .Values.telemetryCollector.enabled }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: consul-telemetry-collector - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - release: {{ .Release.Name }} - component: consul-telemetry-collector - {{- if .Values.telemetryCollector.serviceAccount.annotations }} - annotations: - {{ tpl .Values.telemetryCollector.serviceAccount.annotations . | nindent 4 | trim }} - {{- end }} -automountServiceAccountToken: true -{{- with .Values.global.imagePullSecrets }} -imagePullSecrets: -{{- range . }} - - name: {{ .name }} -{{- end }} -{{- end }} -{{- end }} \ No newline at end of file diff --git a/charts/consul/templates/terminating-gateways-deployment.yaml b/charts/consul/templates/terminating-gateways-deployment.yaml deleted file mode 100644 index c497097..0000000 --- a/charts/consul/templates/terminating-gateways-deployment.yaml +++ /dev/null @@ -1,356 +0,0 @@ -{{- if .Values.terminatingGateways.enabled }} -{{- if not .Values.connectInject.enabled }}{{ fail "connectInject.enabled must be true" }}{{ end -}} -{{- if and .Values.global.adminPartitions.enabled (not .Values.global.enableConsulNamespaces) }}{{ fail "global.enableConsulNamespaces must be true if global.adminPartitions.enabled=true" }}{{ end }} -{{ template "consul.validateRequiredCloudSecretsExist" . }} -{{ template "consul.validateCloudSecretKeys" . }} - -{{- $root := . }} -{{- $defaults := .Values.terminatingGateways.defaults }} -{{- $names := dict }} - -{{- $gateways := .Values.terminatingGateways.gateways }} -{{- range $outerTerminatingIndex, $outerTerminatingVal := $gateways }} - -{{- range $innerTerminatingIndex, $innerTerminatingVal := $gateways }} -{{- if (and (ne $outerTerminatingIndex $innerTerminatingIndex) (eq $outerTerminatingVal.name $innerTerminatingVal.name)) }} -{{ fail (cat "terminating gateways must have unique names but found duplicate name" $innerTerminatingVal.name) }} -{{ end -}} -{{ end -}} - -{{- range $outerIngressIndex, $outerIngressVal := $root.Values.ingressGateways.gateways }} -{{- if (eq $outerTerminatingVal.name $outerIngressVal.name) }} -{{ fail (cat "terminating gateways cannot have duplicate names of any ingress gateways but found duplicate name" $outerTerminatingVal.name) }} -{{ end -}} -{{ end -}} -{{ end -}} - -{{- range .Values.terminatingGateways.gateways }} - -{{- if empty .name }} -# Check that name is not empty -{{ fail "Terminating gateway names cannot be empty"}} -{{ end -}} -{{- if hasKey $names .name }} -# Check that the name doesn't already exist -{{ fail "Terminating gateway names must be unique"}} -{{ end -}} -{{- /* Add the gateway name to the $names dict to ensure uniqueness */ -}} -{{- $_ := set $names .name .name }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "consul.fullname" $root }}-{{ .name }} - namespace: {{ $root.Release.Namespace }} - labels: - app: {{ template "consul.name" $root }} - chart: {{ template "consul.chart" $root }} - heritage: {{ $root.Release.Service }} - release: {{ $root.Release.Name }} - component: terminating-gateway - terminating-gateway-name: {{ template "consul.fullname" $root }}-{{ .name }} - {{- if $root.Values.global.extraLabels }} - {{- toYaml $root.Values.global.extraLabels | nindent 4 }} - {{- end }} -spec: - replicas: {{ default $defaults.replicas .replicas }} - selector: - matchLabels: - app: {{ template "consul.name" $root }} - chart: {{ template "consul.chart" $root }} - heritage: {{ $root.Release.Service }} - release: {{ $root.Release.Name }} - component: terminating-gateway - terminating-gateway-name: {{ template "consul.fullname" $root }}-{{ .name }} - template: - metadata: - labels: - app: {{ template "consul.name" $root }} - chart: {{ template "consul.chart" $root }} - heritage: {{ $root.Release.Service }} - release: {{ $root.Release.Name }} - component: terminating-gateway - terminating-gateway-name: {{ template "consul.fullname" $root }}-{{ .name }} - consul.hashicorp.com/connect-inject-managed-by: consul-k8s-endpoints-controller - {{- if $root.Values.global.extraLabels }} - {{- toYaml $root.Values.global.extraLabels | nindent 8 }} - {{- end }} - annotations: - "consul.hashicorp.com/connect-inject": "false" - "consul.hashicorp.com/mesh-inject": "false" - "consul.hashicorp.com/gateway-kind": "terminating-gateway" - "consul.hashicorp.com/gateway-consul-service-name": "{{ .name }}" - {{- if $root.Values.global.enableConsulNamespaces }} - "consul.hashicorp.com/gateway-namespace": {{ (default $defaults.consulNamespace .consulNamespace) }} - {{- end }} - {{- if (and $root.Values.global.secretsBackend.vault.enabled $root.Values.global.tls.enabled) }} - "vault.hashicorp.com/agent-init-first": "true" - "vault.hashicorp.com/agent-inject": "true" - "vault.hashicorp.com/role": {{ $root.Values.global.secretsBackend.vault.consulCARole }} - "vault.hashicorp.com/agent-inject-secret-serverca.crt": {{ $root.Values.global.tls.caCert.secretName }} - "vault.hashicorp.com/agent-inject-template-serverca.crt": {{ template "consul.serverTLSCATemplate" $root }} - {{- if and $root.Values.global.secretsBackend.vault.ca.secretName $root.Values.global.secretsBackend.vault.ca.secretKey }} - "vault.hashicorp.com/agent-extra-secret": {{ $root.Values.global.secretsBackend.vault.ca.secretName }} - "vault.hashicorp.com/ca-cert": /vault/custom/{{ $root.Values.global.secretsBackend.vault.ca.secretKey }} - {{- end }} - {{- if $root.Values.global.secretsBackend.vault.agentAnnotations }} - {{ tpl $root.Values.global.secretsBackend.vault.agentAnnotations $root | nindent 8 | trim }} - {{- end }} - {{- if (and ($root.Values.global.secretsBackend.vault.vaultNamespace) (not (hasKey (default "" $root.Values.global.secretsBackend.vault.agentAnnotations | fromYaml) "vault.hashicorp.com/namespace")))}} - "vault.hashicorp.com/namespace": "{{ $root.Values.global.secretsBackend.vault.vaultNamespace }}" - {{- end }} - {{- end }} - {{- if (and $root.Values.global.metrics.enabled $root.Values.global.metrics.enableGatewayMetrics) }} - "prometheus.io/scrape": "true" - {{- if not (hasKey (default "" $defaults.annotations | fromYaml) "prometheus.io/path")}} - "prometheus.io/path": "/metrics" - {{- end }} - "prometheus.io/port": "20200" - {{- end }} - {{- if $defaults.annotations }} - # We allow both default annotations and gateway-specific annotations - {{- tpl $defaults.annotations $root | nindent 8 }} - {{- end }} - {{- if .annotations }} - {{- tpl .annotations $root | nindent 8 }} - {{- end }} - spec: - {{- if (or $defaults.affinity .affinity) }} - affinity: - {{ tpl (default $defaults.affinity .affinity) $root | nindent 8 | trim }} - {{- end }} - {{- if (or $defaults.tolerations .tolerations) }} - tolerations: - {{ tpl (default $defaults.tolerations .tolerations) $root | nindent 8 | trim }} - {{- end }} - {{- if (or $defaults.topologySpreadConstraints .topologySpreadConstraints) }} - topologySpreadConstraints: - {{ tpl (default $defaults.topologySpreadConstraints .topologySpreadConstraints) $root | nindent 8 | trim }} - {{- end }} - terminationGracePeriodSeconds: 10 - serviceAccountName: {{ template "consul.fullname" $root }}-{{ .name }} - volumes: - - name: tmp - emptyDir: - medium: "Memory" - - name: consul-service - emptyDir: - medium: "Memory" - {{- range (default $defaults.extraVolumes .extraVolumes) }} - - name: userconfig-{{ .name }} - {{ .type }}: - {{- if (eq .type "configMap") }} - name: {{ .name }} - {{- else if (eq .type "secret") }} - secretName: {{ .name }} - {{- end }} - {{- with .items }} - items: - {{- range . }} - - key: {{.key}} - path: {{.path}} - {{- end }} - {{- end }} - {{- end }} - {{- if $root.Values.global.tls.enabled }} - {{- if not (or (and $root.Values.externalServers.enabled $root.Values.externalServers.useSystemRoots) ($root.Values.global.secretsBackend.vault.enabled)) }} - - name: consul-ca-cert - secret: - {{- if $root.Values.global.tls.caCert.secretName }} - secretName: {{ $root.Values.global.tls.caCert.secretName }} - {{- else }} - secretName: {{ template "consul.fullname" $root }}-ca-cert - {{- end }} - items: - - key: {{ default "tls.crt" $root.Values.global.tls.caCert.secretKey }} - path: tls.crt - {{- end }} - {{- end }} - initContainers: - # terminating-gateway-init registers the terminating gateway service with Consul. - - name: terminating-gateway-init - image: {{ $root.Values.global.imageK8S }} - {{ template "consul.imagePullPolicy" $root }} - {{- include "consul.restrictedSecurityContext" $ | nindent 10 }} - env: - - name: NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - {{- include "consul.consulK8sConsulServerEnvVars" $root | nindent 10 }} - {{- if $root.Values.global.enableConsulNamespaces }} - - name: CONSUL_NAMESPACE - value: {{ (default $defaults.consulNamespace .consulNamespace) }} - {{- end }} - {{- if $root.Values.global.acls.manageSystemACLs }} - - name: CONSUL_LOGIN_AUTH_METHOD - value: {{ template "consul.fullname" $root }}-k8s-component-auth-method - - name: CONSUL_LOGIN_DATACENTER - value: {{ $root.Values.global.datacenter }} - - name: CONSUL_LOGIN_META - value: "component=terminating-gateway,pod=$(NAMESPACE)/$(POD_NAME)" - {{- end }} - - name: CONSUL_NODE_NAME - value: $(NODE_NAME)-virtual - command: - - "/bin/sh" - - "-ec" - - | - exec consul-k8s-control-plane connect-init -pod-name=${POD_NAME} -pod-namespace=${NAMESPACE} \ - -gateway-kind="terminating-gateway" \ - -proxy-id-file=/consul/service/proxy-id \ - -service-name={{ .name }} \ - -log-level={{ default $root.Values.global.logLevel $root.Values.terminatingGateways.logLevel }} \ - -log-json={{ $root.Values.global.logJSON }} - volumeMounts: - - name: tmp - mountPath: /tmp - - name: consul-service - mountPath: /consul/service - {{- if $root.Values.global.tls.enabled }} - {{- if not (or (and $root.Values.externalServers.enabled $root.Values.externalServers.useSystemRoots) ($root.Values.global.secretsBackend.vault.enabled)) }} - - name: consul-ca-cert - mountPath: /consul/tls/ca - readOnly: true - {{- end }} - {{- end }} - resources: - requests: - memory: "50Mi" - cpu: "50m" - limits: - memory: "50Mi" - cpu: "50m" - containers: - - name: terminating-gateway - image: {{ $root.Values.global.imageConsulDataplane | quote }} - {{ template "consul.imagePullPolicy" $root }} - {{- include "consul.restrictedSecurityContext" $ | nindent 10 }} - volumeMounts: - - name: tmp - mountPath: /tmp - - name: consul-service - mountPath: /consul/service - readOnly: true - {{- if $root.Values.global.tls.enabled }} - {{- if not (or (and $root.Values.externalServers.enabled $root.Values.externalServers.useSystemRoots) ($root.Values.global.secretsBackend.vault.enabled)) }} - - name: consul-ca-cert - mountPath: /consul/tls/ca - readOnly: true - {{- end }} - {{- end }} - {{- range (default $defaults.extraVolumes .extraVolumes) }} - - name: userconfig-{{ .name }} - readOnly: true - mountPath: /consul/userconfig/{{ .name }} - {{- end }} - {{- if (default $defaults.resources .resources) }} - resources: {{ toYaml (default $defaults.resources .resources) | nindent 12 }} - {{- end }} - env: - - name: NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - - name: DP_CREDENTIAL_LOGIN_META1 - value: pod=$(NAMESPACE)/$(POD_NAME) - - name: DP_CREDENTIAL_LOGIN_META2 - value: component=terminating-gateway - - name: DP_SERVICE_NODE_NAME - value: $(NODE_NAME)-virtual - command: - - consul-dataplane - args: - {{- if $root.Values.externalServers.enabled }} - - -addresses={{ $root.Values.externalServers.hosts | first }} - {{- else }} - - -addresses={{ template "consul.fullname" $root }}-server.{{ $root.Release.Namespace }}.svc - {{- end }} - {{- if $root.Values.externalServers.enabled }} - - -grpc-port={{ $root.Values.externalServers.grpcPort }} - {{- else }} - - -grpc-port=8502 - {{- end }} - - -proxy-service-id-path=/consul/service/proxy-id - {{- if $root.Values.global.enableConsulNamespaces }} - - -service-namespace={{ (default $defaults.consulNamespace .consulNamespace) }} - {{- end }} - {{- if and $root.Values.global.tls.enabled }} - {{- if (not (and $root.Values.externalServers.enabled $root.Values.externalServers.useSystemRoots)) }} - {{- if $root.Values.global.secretsBackend.vault.enabled }} - - -ca-certs=/vault/secrets/serverca.crt - {{- else }} - - -ca-certs=/consul/tls/ca/tls.crt - {{- end }} - {{- end }} - {{- if and $root.Values.externalServers.enabled $root.Values.externalServers.tlsServerName }} - - -tls-server-name={{$root.Values.externalServers.tlsServerName }} - {{- else if $root.Values.global.cloud.enabled }} - - -tls-server-name=server.{{ $root.Values.global.datacenter}}.{{ $root.Values.global.domain}} - {{- end }} - {{- else }} - - -tls-disabled - {{- end }} - {{- if $root.Values.global.acls.manageSystemACLs }} - - -credential-type=login - - -login-bearer-token-path=/var/run/secrets/kubernetes.io/serviceaccount/token - - -login-auth-method={{ template "consul.fullname" $root }}-k8s-component-auth-method - {{- if $root.Values.global.adminPartitions.enabled }} - - -login-partition={{ $root.Values.global.adminPartitions.name }} - {{- end }} - {{- end }} - {{- if $root.Values.global.adminPartitions.enabled }} - - -service-partition={{ $root.Values.global.adminPartitions.name }} - {{- end }} - - -log-level={{ default $root.Values.global.logLevel $root.Values.terminatingGateways.logLevel }} - - -log-json={{ $root.Values.global.logJSON }} - {{- if (and $root.Values.global.metrics.enabled $root.Values.global.metrics.enableGatewayMetrics) }} - - -telemetry-prom-scrape-path=/metrics - {{- end }} - {{- if and $root.Values.externalServers.enabled $root.Values.externalServers.skipServerWatch }} - - -server-watch-disabled=true - {{- end }} - livenessProbe: - tcpSocket: - port: 8443 - failureThreshold: 3 - initialDelaySeconds: 30 - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 5 - readinessProbe: - tcpSocket: - port: 8443 - failureThreshold: 3 - initialDelaySeconds: 10 - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 5 - ports: - - name: gateway - containerPort: 8443 - {{- if (default $defaults.priorityClassName .priorityClassName) }} - priorityClassName: {{ (default $defaults.priorityClassName .priorityClassName) | quote }} - {{- end }} - {{- if (default $defaults.nodeSelector .nodeSelector) }} - nodeSelector: - {{ tpl (default $defaults.nodeSelector .nodeSelector) $root | indent 8 | trim }} - {{- end }} ---- -{{- end }} -{{- end }} diff --git a/charts/consul/templates/terminating-gateways-podsecuritypolicy.yaml b/charts/consul/templates/terminating-gateways-podsecuritypolicy.yaml deleted file mode 100644 index 7307fb8..0000000 --- a/charts/consul/templates/terminating-gateways-podsecuritypolicy.yaml +++ /dev/null @@ -1,47 +0,0 @@ -{{- if (and .Values.global.enablePodSecurityPolicies .Values.terminatingGateways.enabled) }} -{{- $root := . }} -{{- range .Values.terminatingGateways.gateways }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "consul.fullname" $root }}-{{ .name }} - namespace: {{ $root.Release.Namespace }} - labels: - app: {{ template "consul.name" $root }} - chart: {{ template "consul.chart" $root }} - heritage: {{ $root.Release.Service }} - release: {{ $root.Release.Name }} - component: terminating-gateway - terminating-gateway-name: {{ template "consul.fullname" $root }}-{{ .name }} -spec: - privileged: false - # Required to prevent escalations to root. - allowPrivilegeEscalation: false - # This is redundant with non-root + disallow privilege escalation, - # but we can provide it for defense in depth. - requiredDropCapabilities: - - ALL - defaultAddCapabilities: - - NET_BIND_SERVICE - # Allow core volume types. - volumes: - - 'configMap' - - 'emptyDir' - - 'projected' - - 'secret' - - 'downwardAPI' - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'RunAsAny' - fsGroup: - rule: 'RunAsAny' - readOnlyRootFilesystem: false ---- -{{- end }} -{{- end }} diff --git a/charts/consul/templates/terminating-gateways-role.yaml b/charts/consul/templates/terminating-gateways-role.yaml deleted file mode 100644 index 51e3766..0000000 --- a/charts/consul/templates/terminating-gateways-role.yaml +++ /dev/null @@ -1,32 +0,0 @@ -{{- if .Values.terminatingGateways.enabled }} - -{{- $root := . }} -{{- $defaults := .Values.terminatingGateways.defaults }} - -{{- range .Values.terminatingGateways.gateways }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: {{ template "consul.fullname" $root }}-{{ .name }} - namespace: {{ $root.Release.Namespace }} - labels: - app: {{ template "consul.name" $root }} - chart: {{ template "consul.chart" $root }} - heritage: {{ $root.Release.Service }} - release: {{ $root.Release.Name }} - component: terminating-gateway - terminating-gateway-name: {{ template "consul.fullname" $root }}-{{ .name }} -{{- if $root.Values.global.enablePodSecurityPolicies }} -rules: - - apiGroups: ["policy"] - resources: ["podsecuritypolicies"] - resourceNames: - - {{ template "consul.fullname" $root }}-{{ .name }} - verbs: - - use -{{- else }} -rules: [] -{{- end }} ---- -{{- end }} -{{- end }} diff --git a/charts/consul/templates/terminating-gateways-rolebinding.yaml b/charts/consul/templates/terminating-gateways-rolebinding.yaml deleted file mode 100644 index 4271f8f..0000000 --- a/charts/consul/templates/terminating-gateways-rolebinding.yaml +++ /dev/null @@ -1,26 +0,0 @@ -{{- if .Values.terminatingGateways.enabled }} -{{- $root := . }} -{{- range .Values.terminatingGateways.gateways }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: {{ template "consul.fullname" $root }}-{{ .name }} - namespace: {{ $root.Release.Namespace }} - labels: - app: {{ template "consul.name" $root }} - chart: {{ template "consul.chart" $root }} - heritage: {{ $root.Release.Service }} - release: {{ $root.Release.Name }} - component: terminating-gateway - terminating-gateway-name: {{ template "consul.fullname" $root }}-{{ .name }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: {{ template "consul.fullname" $root }}-{{ .name }} -subjects: - - kind: ServiceAccount - name: {{ template "consul.fullname" $root }}-{{ .name }} - namespace: {{ $root.Release.Namespace }} ---- -{{- end }} -{{- end }} diff --git a/charts/consul/templates/terminating-gateways-service.yaml b/charts/consul/templates/terminating-gateways-service.yaml deleted file mode 100644 index 124900e..0000000 --- a/charts/consul/templates/terminating-gateways-service.yaml +++ /dev/null @@ -1,31 +0,0 @@ -{{- if .Values.terminatingGateways.enabled }} - -{{- $root := . }} -{{- $defaults := .Values.terminatingGateways.defaults }} - -{{- range .Values.terminatingGateways.gateways }} - -{{- $service := .service }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "consul.fullname" $root }}-{{ .name }} - namespace: {{ $root.Release.Namespace }} - labels: - app: {{ template "consul.name" $root }} - chart: {{ template "consul.chart" $root }} - heritage: {{ $root.Release.Service }} - release: {{ $root.Release.Name }} - component: terminating-gateway -spec: - selector: - app: {{ template "consul.name" $root }} - release: "{{ $root.Release.Name }}" - component: terminating-gateway - type: ClusterIP - ports: - - port: 80 - targetPort: 8443 ---- -{{- end }} -{{- end }} diff --git a/charts/consul/templates/terminating-gateways-serviceaccount.yaml b/charts/consul/templates/terminating-gateways-serviceaccount.yaml deleted file mode 100644 index 211fb5c..0000000 --- a/charts/consul/templates/terminating-gateways-serviceaccount.yaml +++ /dev/null @@ -1,35 +0,0 @@ -{{- if .Values.terminatingGateways.enabled }} -{{- $root := . }} -{{- $defaults := .Values.terminatingGateways.defaults }} -{{- range .Values.terminatingGateways.gateways }} -{{- $serviceAccount := .serviceAccount }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "consul.fullname" $root }}-{{ .name }} - namespace: {{ $root.Release.Namespace }} - labels: - app: {{ template "consul.name" $root }} - chart: {{ template "consul.chart" $root }} - heritage: {{ $root.Release.Service }} - release: {{ $root.Release.Name }} - component: terminating-gateway - terminating-gateway-name: {{ template "consul.fullname" $root }}-{{ .name }} - {{- if (or $defaults.serviceAccount.annotations $serviceAccount.annotations) }} - annotations: - {{- if $defaults.serviceAccount.annotations }} - {{ tpl $defaults.serviceAccount.annotations $root | nindent 4 | trim }} - {{- end }} - {{- if $serviceAccount.annotations }} - {{ tpl $serviceAccount.annotations $root | nindent 4 | trim }} - {{- end }} - {{- end }} -{{- with $root.Values.global.imagePullSecrets }} -imagePullSecrets: -{{- range . }} - - name: {{ .name }} -{{- end }} -{{- end }} ---- -{{- end }} -{{- end }} diff --git a/charts/consul/templates/tests/test-runner.yaml b/charts/consul/templates/tests/test-runner.yaml deleted file mode 100644 index 4c3e81c..0000000 --- a/charts/consul/templates/tests/test-runner.yaml +++ /dev/null @@ -1,79 +0,0 @@ -{{- if .Values.tests.enabled }} -apiVersion: v1 -kind: Pod -metadata: - name: "{{ template "consul.fullname" . }}-test" - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - annotations: - "helm.sh/hook": test-success -spec: - {{- if .Values.global.tls.enabled }} - volumes: - {{- if not (and .Values.externalServers.enabled .Values.externalServers.useSystemRoots) }} - - name: consul-ca-cert - secret: - {{- if .Values.global.tls.caCert.secretName }} - secretName: {{ .Values.global.tls.caCert.secretName }} - {{- else }} - secretName: {{ template "consul.fullname" . }}-ca-cert - {{- end }} - items: - - key: {{ default "tls.crt" .Values.global.tls.caCert.secretKey }} - path: tls.crt - {{- end }} - - name: consul-auto-encrypt-ca-cert - emptyDir: - medium: "Memory" - {{- end }} - {{- if and .Values.global.tls.enabled .Values.global.tls.enableAutoEncrypt }} - initContainers: - {{- include "consul.getAutoEncryptClientCA" . | nindent 2 }} - {{- end }} - containers: - - name: consul-test - image: "{{ .Values.global.image }}" - {{ template "consul.imagePullPolicy" . }} - env: - - name: HOST_IP - valueFrom: - fieldRef: - fieldPath: status.hostIP - {{- if .Values.global.tls.enabled }} - - name: CONSUL_HTTP_ADDR - value: https://$(HOST_IP):8501 - - name: CONSUL_CACERT - value: /consul/tls/ca/tls.crt - {{- else }} - - name: CONSUL_HTTP_ADDR - value: http://$(HOST_IP):8500 - {{- end }} - {{- if .Values.global.tls.enabled }} - volumeMounts: - {{- if .Values.global.tls.enableAutoEncrypt }} - - name: consul-auto-encrypt-ca-cert - mountPath: /consul/tls/ca - readOnly: true - {{- else }} - - name: consul-ca-cert - mountPath: /consul/tls/ca - readOnly: true - {{- end }} - {{- end }} - command: - - "/bin/sh" - - "-ec" - - | - consul members | tee members.txt - if [ $(grep -c consul-server members.txt) != $(grep consul-server members.txt | grep -c alive) ] - then - echo "Failed because not all consul servers are available" - exit 1 - fi - - restartPolicy: Never -{{- end }} diff --git a/charts/consul/templates/tls-init-cleanup-job.yaml b/charts/consul/templates/tls-init-cleanup-job.yaml deleted file mode 100644 index 5ebe236..0000000 --- a/charts/consul/templates/tls-init-cleanup-job.yaml +++ /dev/null @@ -1,85 +0,0 @@ -{{- if (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) }} -{{- if (and .Values.global.tls.enabled (not .Values.server.serverCert.secretName)) }} -{{- if not .Values.global.secretsBackend.vault.enabled }} -# tls-init-cleanup job deletes Kubernetes secrets created by tls-init -apiVersion: batch/v1 -kind: Job -metadata: - name: {{ template "consul.fullname" . }}-tls-init-cleanup - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: tls-init-cleanup - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 4 }} - {{- end }} - annotations: - "helm.sh/hook": pre-delete - "helm.sh/hook-delete-policy": hook-succeeded - {{- /* Hook weight needs to be 1 so that the service account is provisioned first */}} - "helm.sh/hook-weight": "1" -spec: - template: - metadata: - name: {{ template "consul.fullname" . }}-tls-init-cleanup - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - release: {{ .Release.Name }} - component: tls-init-cleanup - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 8 }} - {{- end }} - annotations: - "consul.hashicorp.com/connect-inject": "false" - "consul.hashicorp.com/mesh-inject": "false" - {{- if .Values.global.tls.annotations }} - {{- tpl .Values.global.tls.annotations . | nindent 8 }} - {{- end }} - spec: - restartPolicy: Never - serviceAccountName: {{ template "consul.fullname" . }}-tls-init-cleanup - {{- if .Values.server.containerSecurityContext.tlsInit }} - securityContext: - {{- toYaml .Values.server.containerSecurityContext.tlsInit | nindent 8 }} - {{- end }} - containers: - - name: tls-init-cleanup - image: "{{ .Values.global.image }}" - {{ template "consul.imagePullPolicy" . }} - {{- if not .Values.server.containerSecurityContext.tlsInit }} - {{- include "consul.restrictedSecurityContext" . | nindent 10 }} - {{- end }} - env: - - name: NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - command: - - "/bin/sh" - - "-ec" - - | - {{- if (not (and .Values.global.tls.caCert.secretName .Values.global.tls.caKey.secretName)) }} - curl -s -X DELETE --cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt \ - https://${KUBERNETES_SERVICE_HOST}:${KUBERNETES_SERVICE_PORT}/api/v1/namespaces/${NAMESPACE}/secrets/{{ template "consul.fullname" . }}-ca-cert \ - -H "Authorization: Bearer $( cat /var/run/secrets/kubernetes.io/serviceaccount/token )" - curl -s -X DELETE --cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt \ - https://${KUBERNETES_SERVICE_HOST}:${KUBERNETES_SERVICE_PORT}/api/v1/namespaces/${NAMESPACE}/secrets/{{ template "consul.fullname" . }}-ca-key \ - -H "Authorization: Bearer $( cat /var/run/secrets/kubernetes.io/serviceaccount/token )" - {{- end }} - curl -s -X DELETE --cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt \ - https://${KUBERNETES_SERVICE_HOST}:${KUBERNETES_SERVICE_PORT}/api/v1/namespaces/${NAMESPACE}/secrets/{{ template "consul.fullname" . }}-server-cert \ - -H "Authorization: Bearer $( cat /var/run/secrets/kubernetes.io/serviceaccount/token )" - resources: - requests: - memory: "50Mi" - cpu: "50m" - limits: - memory: "50Mi" - cpu: "50m" -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/consul/templates/tls-init-cleanup-podsecuritypolicy.yaml b/charts/consul/templates/tls-init-cleanup-podsecuritypolicy.yaml deleted file mode 100644 index ed99d5f..0000000 --- a/charts/consul/templates/tls-init-cleanup-podsecuritypolicy.yaml +++ /dev/null @@ -1,43 +0,0 @@ -{{- if (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) }} -{{- if (and (and .Values.global.tls.enabled .Values.global.enablePodSecurityPolicies) (not .Values.server.serverCert.secretName)) }} -{{- if not .Values.global.secretsBackend.vault.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "consul.fullname" . }}-tls-init-cleanup - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: tls-init-cleanup - annotations: - "helm.sh/hook": pre-delete - "helm.sh/hook-delete-policy": hook-succeeded -spec: - privileged: false - # Required to prevent escalations to root. - allowPrivilegeEscalation: false - # This is redundant with non-root + disallow privilege escalation, - # but we can provide it for defense in depth. - requiredDropCapabilities: - - ALL - # Allow core volume types. - volumes: - - 'secret' - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'RunAsAny' - fsGroup: - rule: 'RunAsAny' - readOnlyRootFilesystem: false -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/consul/templates/tls-init-cleanup-role.yaml b/charts/consul/templates/tls-init-cleanup-role.yaml deleted file mode 100644 index aa66e3e..0000000 --- a/charts/consul/templates/tls-init-cleanup-role.yaml +++ /dev/null @@ -1,41 +0,0 @@ -{{- if (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) }} -{{- if (and .Values.global.tls.enabled (not .Values.server.serverCert.secretName)) }} -{{- if not .Values.global.secretsBackend.vault.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: {{ template "consul.fullname" . }}-tls-init-cleanup - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: tls-init-cleanup - annotations: - "helm.sh/hook": pre-delete - "helm.sh/hook-delete-policy": hook-succeeded -rules: -- apiGroups: [""] - resources: - - secrets - resourceNames: - {{- if (not (and .Values.global.tls.caCert.secretName .Values.global.tls.caKey.secretName)) }} - - {{ template "consul.fullname" . }}-ca-cert - - {{ template "consul.fullname" . }}-ca-key - {{- end }} - - {{ template "consul.fullname" . }}-server-cert - verbs: - - delete -{{- if .Values.global.enablePodSecurityPolicies }} -- apiGroups: ["policy"] - resources: - - podsecuritypolicies - verbs: - - use - resourceNames: - - {{ template "consul.fullname" . }}-tls-init-cleanup -{{- end }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/consul/templates/tls-init-cleanup-rolebinding.yaml b/charts/consul/templates/tls-init-cleanup-rolebinding.yaml deleted file mode 100644 index 0d3bfe3..0000000 --- a/charts/consul/templates/tls-init-cleanup-rolebinding.yaml +++ /dev/null @@ -1,27 +0,0 @@ -{{- if (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) }} -{{- if (and .Values.global.tls.enabled (not .Values.server.serverCert.secretName)) }} -{{- if not .Values.global.secretsBackend.vault.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: {{ template "consul.fullname" . }}-tls-init-cleanup - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: tls-init-cleanup - annotations: - "helm.sh/hook": pre-delete - "helm.sh/hook-delete-policy": hook-succeeded -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: {{ template "consul.fullname" . }}-tls-init-cleanup -subjects: -- kind: ServiceAccount - name: {{ template "consul.fullname" . }}-tls-init-cleanup -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/consul/templates/tls-init-cleanup-serviceaccount.yaml b/charts/consul/templates/tls-init-cleanup-serviceaccount.yaml deleted file mode 100644 index 57e40dd..0000000 --- a/charts/consul/templates/tls-init-cleanup-serviceaccount.yaml +++ /dev/null @@ -1,26 +0,0 @@ -{{- if (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) }} -{{- if (and .Values.global.tls.enabled (not .Values.server.serverCert.secretName)) }} -{{- if not .Values.global.secretsBackend.vault.enabled }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "consul.fullname" . }}-tls-init-cleanup - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: tls-init-cleanup - annotations: - "helm.sh/hook": pre-delete - "helm.sh/hook-delete-policy": hook-succeeded -{{- with .Values.global.imagePullSecrets }} -imagePullSecrets: -{{- range . }} - - name: {{ .name }} -{{- end }} -{{- end }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/consul/templates/tls-init-job.yaml b/charts/consul/templates/tls-init-job.yaml deleted file mode 100644 index 177472c..0000000 --- a/charts/consul/templates/tls-init-job.yaml +++ /dev/null @@ -1,127 +0,0 @@ -{{- if (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) }} -{{- if (and .Values.global.tls.enabled (not .Values.server.serverCert.secretName)) }} -{{- if not .Values.global.secretsBackend.vault.enabled }} -# tls-init job generate Consul cluster CA and certificates for the Consul servers -# and creates Kubernetes secrets for them. -apiVersion: batch/v1 -kind: Job -metadata: - name: {{ template "consul.fullname" . }}-tls-init - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: tls-init - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 4 }} - {{- end }} - annotations: - "helm.sh/hook": pre-install,pre-upgrade - "helm.sh/hook-weight": "1" - "helm.sh/hook-delete-policy": hook-succeeded,before-hook-creation -spec: - template: - metadata: - name: {{ template "consul.fullname" . }}-tls-init - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - release: {{ .Release.Name }} - component: tls-init - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 8 }} - {{- end }} - annotations: - "consul.hashicorp.com/connect-inject": "false" - "consul.hashicorp.com/mesh-inject": "false" - {{- if .Values.global.tls.annotations }} - {{- tpl .Values.global.tls.annotations . | nindent 8 }} - {{- end }} - spec: - restartPolicy: Never - serviceAccountName: {{ template "consul.fullname" . }}-tls-init - {{- if .Values.server.containerSecurityContext.tlsInit }} - securityContext: - {{- toYaml .Values.server.containerSecurityContext.tlsInit | nindent 8 }} - {{- end }} - {{- if (and .Values.global.tls.caCert.secretName .Values.global.tls.caKey.secretName) }} - volumes: - - name: consul-ca-cert - secret: - secretName: {{ .Values.global.tls.caCert.secretName }} - items: - - key: {{ default "tls.crt" .Values.global.tls.caCert.secretKey }} - path: tls.crt - - name: consul-ca-key - secret: - secretName: {{ .Values.global.tls.caKey.secretName }} - items: - - key: {{ default "tls.key" .Values.global.tls.caKey.secretKey }} - path: tls.key - {{- end }} - containers: - - name: tls-init - image: "{{ .Values.global.imageK8S }}" - {{ template "consul.imagePullPolicy" . }} - {{- if not .Values.server.containerSecurityContext.tlsInit }} - {{- include "consul.restrictedSecurityContext" . | nindent 10 }} - {{- end }} - env: - - name: NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - workingDir: /tmp - command: - - "/bin/sh" - - "-ec" - - | - # Suppress globbing so we can interpolate the $NAMESPACE environment variable - # and use * at the start of the dns name when setting -additional-dnsname. - set -o noglob - exec consul-k8s-control-plane tls-init \ - -log-level={{ default .Values.global.logLevel .Values.global.tls.logLevel }} \ - -log-json={{ .Values.global.logJSON }} \ - -domain={{ .Values.global.domain }} \ - -days=730 \ - -name-prefix={{ template "consul.fullname" . }} \ - -k8s-namespace=${NAMESPACE} \ - {{- if (and .Values.global.tls.caCert.secretName .Values.global.tls.caKey.secretName) }} - -ca=/consul/tls/ca/cert/tls.crt \ - -key=/consul/tls/ca/key/tls.key \ - {{- end }} - -additional-dnsname="{{ template "consul.fullname" . }}-server" \ - -additional-dnsname="*.{{ template "consul.fullname" . }}-server" \ - -additional-dnsname="*.{{ template "consul.fullname" . }}-server.${NAMESPACE}" \ - -additional-dnsname="{{ template "consul.fullname" . }}-server.${NAMESPACE}" \ - -additional-dnsname="*.{{ template "consul.fullname" . }}-server.${NAMESPACE}.svc" \ - -additional-dnsname="{{ template "consul.fullname" . }}-server.${NAMESPACE}.svc" \ - -additional-dnsname="*.server.{{ .Values.global.datacenter }}.{{ .Values.global.domain }}" \ - {{- range .Values.global.tls.serverAdditionalIPSANs }} - -additional-ipaddress={{ . }} \ - {{- end }} - {{- range .Values.global.tls.serverAdditionalDNSSANs }} - -additional-dnsname={{ . }} \ - {{- end }} - -dc={{ .Values.global.datacenter }} - {{- if (and .Values.global.tls.caCert.secretName .Values.global.tls.caKey.secretName) }} - volumeMounts: - - name: consul-ca-cert - mountPath: /consul/tls/ca/cert - readOnly: true - - name: consul-ca-key - mountPath: /consul/tls/ca/key - readOnly: true - {{- end }} - resources: - requests: - memory: "50Mi" - cpu: "50m" - limits: - memory: "50Mi" - cpu: "50m" -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/consul/templates/tls-init-podsecuritypolicy.yaml b/charts/consul/templates/tls-init-podsecuritypolicy.yaml deleted file mode 100644 index 5d2a393..0000000 --- a/charts/consul/templates/tls-init-podsecuritypolicy.yaml +++ /dev/null @@ -1,43 +0,0 @@ -{{- if (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) }} -{{- if (and (and .Values.global.tls.enabled .Values.global.enablePodSecurityPolicies) (not .Values.server.serverCert.secretName)) }} -{{- if not .Values.global.secretsBackend.vault.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "consul.fullname" . }}-tls-init - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: tls-init - annotations: - "helm.sh/hook": pre-install,pre-upgrade - "helm.sh/hook-delete-policy": before-hook-creation -spec: - privileged: false - # Required to prevent escalations to root. - allowPrivilegeEscalation: false - # This is redundant with non-root + disallow privilege escalation, - # but we can provide it for defense in depth. - requiredDropCapabilities: - - ALL - # Allow core volume types. - volumes: - - 'secret' - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'RunAsAny' - fsGroup: - rule: 'RunAsAny' - readOnlyRootFilesystem: false -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/consul/templates/tls-init-role.yaml b/charts/consul/templates/tls-init-role.yaml deleted file mode 100644 index 216602e..0000000 --- a/charts/consul/templates/tls-init-role.yaml +++ /dev/null @@ -1,38 +0,0 @@ -{{- if (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) }} -{{- if (and .Values.global.tls.enabled (not .Values.server.serverCert.secretName)) }} -{{- if not .Values.global.secretsBackend.vault.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: {{ template "consul.fullname" . }}-tls-init - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: tls-init - annotations: - "helm.sh/hook": pre-install,pre-upgrade - "helm.sh/hook-delete-policy": before-hook-creation -rules: -- apiGroups: [""] - resources: - - secrets - verbs: - - create - - update - - get - - list -{{- if .Values.global.enablePodSecurityPolicies }} -- apiGroups: ["policy"] - resources: - - podsecuritypolicies - verbs: - - use - resourceNames: - - {{ template "consul.fullname" . }}-tls-init -{{- end }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/consul/templates/tls-init-rolebinding.yaml b/charts/consul/templates/tls-init-rolebinding.yaml deleted file mode 100644 index 9b68d97..0000000 --- a/charts/consul/templates/tls-init-rolebinding.yaml +++ /dev/null @@ -1,27 +0,0 @@ -{{- if (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) }} -{{- if (and .Values.global.tls.enabled (not .Values.server.serverCert.secretName)) }} -{{- if not .Values.global.secretsBackend.vault.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: {{ template "consul.fullname" . }}-tls-init - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: tls-init - annotations: - "helm.sh/hook": pre-install,pre-upgrade - "helm.sh/hook-delete-policy": before-hook-creation -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: {{ template "consul.fullname" . }}-tls-init -subjects: -- kind: ServiceAccount - name: {{ template "consul.fullname" . }}-tls-init -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/consul/templates/tls-init-serviceaccount.yaml b/charts/consul/templates/tls-init-serviceaccount.yaml deleted file mode 100644 index f8504da..0000000 --- a/charts/consul/templates/tls-init-serviceaccount.yaml +++ /dev/null @@ -1,26 +0,0 @@ -{{- if (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) }} -{{- if (and .Values.global.tls.enabled (not .Values.server.serverCert.secretName)) }} -{{- if not .Values.global.secretsBackend.vault.enabled }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "consul.fullname" . }}-tls-init - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: tls-init - annotations: - "helm.sh/hook": pre-install,pre-upgrade - "helm.sh/hook-delete-policy": before-hook-creation -{{- with .Values.global.imagePullSecrets }} -imagePullSecrets: -{{- range . }} - - name: {{ .name }} -{{- end }} -{{- end }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/consul/templates/ui-ingress.yaml b/charts/consul/templates/ui-ingress.yaml deleted file mode 100644 index f8c7f92..0000000 --- a/charts/consul/templates/ui-ingress.yaml +++ /dev/null @@ -1,85 +0,0 @@ -{{- if (and (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) (or (and (ne (.Values.ui.enabled | toString) "-") .Values.ui.enabled) (and (eq (.Values.ui.enabled | toString) "-") .Values.global.enabled)) (or (and (ne (.Values.ui.service.enabled | toString) "-") .Values.ui.service.enabled) (and (eq (.Values.ui.service.enabled | toString) "-") .Values.global.enabled))) }} -{{- if (and (ne (.Values.ui.ingress.enabled | toString) "-") .Values.ui.ingress.enabled) }} -{{- $serviceName := printf "%s-%s" (include "consul.fullname" .) "ui" -}} -{{- /* We use the kube version to determine if the apiVersion of networking.k8s.io should be v1 or v1beta1. -This is because while networks.k8s.io/v1 was introduced in Kubernetes v1.15+, the Ingress resource was -promoted to v1 only in Kubernetes v1.19+. This ensures the correct API version is chosen that supports -the Ingress resource. */}} -{{- if or ( gt .Capabilities.KubeVersion.Major "1" ) ( ge .Capabilities.KubeVersion.Minor "19" ) }} -apiVersion: networking.k8s.io/v1 -{{- else }} -apiVersion: networking.k8s.io/v1beta1 -{{- end }} -kind: Ingress -metadata: - name: {{ template "consul.fullname" . }}-ui - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: ui - {{- if .Values.ui.ingress.annotations }} - annotations: - {{ tpl .Values.ui.ingress.annotations . | nindent 4 | trim }} - {{- end }} -spec: - {{- if ne .Values.ui.ingress.ingressClassName "" }} - ingressClassName: {{ .Values.ui.ingress.ingressClassName }} - {{- end }} - rules: - {{- $global := .Values.global }} - {{- if or ( gt .Capabilities.KubeVersion.Major "1" ) ( ge .Capabilities.KubeVersion.Minor "19" ) }} - {{- range .Values.ui.ingress.hosts }} - - host: {{ .host | quote }} - http: - paths: - {{- range (.paths | default (list "/")) }} - {{- if (or (not $global.tls.enabled) (not $global.tls.httpsOnly)) }} - - backend: - service: - name: {{ $serviceName }} - port: - number: 80 - path: {{ . }} - pathType: {{ $.Values.ui.ingress.pathType }} - {{- end }} - {{- if $global.tls.enabled }} - - backend: - service: - name: {{ $serviceName }} - port: - number: 443 - path: {{ . }} - pathType: {{ $.Values.ui.ingress.pathType }} - {{- end }} - {{- end }} - {{- end }} - {{- else }} - {{- range .Values.ui.ingress.hosts }} - - host: {{ .host | quote }} - http: - paths: - {{- range (.paths | default (list "/")) }} - {{- if (or (not $global.tls.enabled) (not $global.tls.httpsOnly)) }} - - backend: - serviceName: {{ $serviceName }} - servicePort: 80 - path: {{ . }} - {{- end }} - {{- if $global.tls.enabled }} - - backend: - serviceName: {{ $serviceName }} - servicePort: 443 - path: {{ . }} - {{- end }} - {{- end }} - {{- end }} - {{- end }} - {{- if .Values.ui.ingress.tls }} - tls: - {{- toYaml .Values.ui.ingress.tls | nindent 4 }} - {{- end }} -{{- end }} -{{- end }} diff --git a/charts/consul/templates/ui-service.yaml b/charts/consul/templates/ui-service.yaml deleted file mode 100644 index dc2abf4..0000000 --- a/charts/consul/templates/ui-service.yaml +++ /dev/null @@ -1,46 +0,0 @@ -{{- if (and (or (and (ne (.Values.server.enabled | toString) "-") .Values.server.enabled) (and (eq (.Values.server.enabled | toString) "-") .Values.global.enabled)) (or (and (ne (.Values.ui.enabled | toString) "-") .Values.ui.enabled) (and (eq (.Values.ui.enabled | toString) "-") .Values.global.enabled)) (or (and (ne (.Values.ui.service.enabled | toString) "-") .Values.ui.service.enabled) (and (eq (.Values.ui.service.enabled | toString) "-") .Values.global.enabled))) }} -# UI Service for Consul Server -apiVersion: v1 -kind: Service -metadata: - name: {{ template "consul.fullname" . }}-ui - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: ui - {{- if .Values.ui.service.annotations }} - annotations: - {{ tpl .Values.ui.service.annotations . | nindent 4 | trim }} - {{- end }} -spec: - selector: - app: {{ template "consul.name" . }} - release: "{{ .Release.Name }}" - component: server - ports: - {{- if (or (not .Values.global.tls.enabled) (not .Values.global.tls.httpsOnly)) }} - - name: http - port: {{ .Values.ui.service.port.http }} - targetPort: 8500 - {{- if .Values.ui.service.type }}{{ if (and (eq .Values.ui.service.type "NodePort") .Values.ui.service.nodePort.http) }} - nodePort: {{ .Values.ui.service.nodePort.http }} - {{- end }}{{ end }} - {{- end }} - {{- if .Values.global.tls.enabled }} - - name: https - port: {{ .Values.ui.service.port.https }} - targetPort: 8501 - {{- if .Values.ui.service.type }}{{ if (and (eq .Values.ui.service.type "NodePort") .Values.ui.service.nodePort.https) }} - nodePort: {{ .Values.ui.service.nodePort.https }} - {{- end }}{{ end }} - {{- end }} - {{- if .Values.ui.service.type }} - type: {{ .Values.ui.service.type }} - {{- end }} - {{- if .Values.ui.service.additionalSpec }} - {{ tpl .Values.ui.service.additionalSpec . | nindent 2 | trim }} - {{- end }} -{{- end }} diff --git a/charts/consul/templates/webhook-cert-manager-clusterrole.yaml b/charts/consul/templates/webhook-cert-manager-clusterrole.yaml deleted file mode 100644 index 2a5c80d..0000000 --- a/charts/consul/templates/webhook-cert-manager-clusterrole.yaml +++ /dev/null @@ -1,54 +0,0 @@ -{{ $hasConfiguredWebhookCertsUsingVault := (and .Values.global.secretsBackend.vault.enabled .Values.global.secretsBackend.vault.connectInjectRole .Values.global.secretsBackend.vault.connectInject.tlsCert.secretName .Values.global.secretsBackend.vault.connectInject.caCert.secretName) -}} -{{- if (and .Values.connectInject.enabled (not $hasConfiguredWebhookCertsUsingVault)) }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "consul.fullname" . }}-webhook-cert-manager - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: webhook-cert-manager -rules: -- apiGroups: - - "" - resources: - - secrets - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - admissionregistration.k8s.io - resources: - - mutatingwebhookconfigurations - - validatingwebhookconfigurations - verbs: - - get - - list - - watch - - patch -- apiGroups: - - apps - resources: - - deployments - resourceNames: - - {{ template "consul.fullname" . }}-webhook-cert-manager - verbs: - - get -{{- if .Values.global.enablePodSecurityPolicies }} -- apiGroups: - - policy - resources: - - podsecuritypolicies - resourceNames: - - {{ template "consul.fullname" . }}-webhook-cert-manager - verbs: - - use -{{- end }} -{{- end }} diff --git a/charts/consul/templates/webhook-cert-manager-clusterrolebinding.yaml b/charts/consul/templates/webhook-cert-manager-clusterrolebinding.yaml deleted file mode 100644 index 472ef4e..0000000 --- a/charts/consul/templates/webhook-cert-manager-clusterrolebinding.yaml +++ /dev/null @@ -1,21 +0,0 @@ -{{ $hasConfiguredWebhookCertsUsingVault := (and .Values.global.secretsBackend.vault.enabled .Values.global.secretsBackend.vault.connectInjectRole .Values.global.secretsBackend.vault.connectInject.tlsCert.secretName .Values.global.secretsBackend.vault.connectInject.caCert.secretName) -}} -{{- if (and .Values.connectInject.enabled (not $hasConfiguredWebhookCertsUsingVault)) }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "consul.fullname" . }}-webhook-cert-manager - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: webhook-cert-manager -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "consul.fullname" . }}-webhook-cert-manager -subjects: -- kind: ServiceAccount - name: {{ template "consul.fullname" . }}-webhook-cert-manager - namespace: {{ .Release.Namespace }} -{{- end }} diff --git a/charts/consul/templates/webhook-cert-manager-configmap.yaml b/charts/consul/templates/webhook-cert-manager-configmap.yaml deleted file mode 100644 index 293dd32..0000000 --- a/charts/consul/templates/webhook-cert-manager-configmap.yaml +++ /dev/null @@ -1,29 +0,0 @@ -{{ $hasConfiguredWebhookCertsUsingVault := (and .Values.global.secretsBackend.vault.enabled .Values.global.secretsBackend.vault.connectInjectRole .Values.global.secretsBackend.vault.connectInject.tlsCert.secretName .Values.global.secretsBackend.vault.connectInject.caCert.secretName) -}} -{{- if (and .Values.connectInject.enabled (not $hasConfiguredWebhookCertsUsingVault)) }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ template "consul.fullname" . }}-webhook-cert-manager-config - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: webhook-cert-manager -data: - webhook-config.json: |- - [ - { - "name": "{{ template "consul.fullname" . }}-connect-injector", - "tlsAutoHosts": [ - "{{ template "consul.fullname" . }}-connect-injector", - "{{ template "consul.fullname" . }}-connect-injector.{{ .Release.Namespace }}", - "{{ template "consul.fullname" . }}-connect-injector.{{ .Release.Namespace }}.svc", - "{{ template "consul.fullname" . }}-connect-injector.{{ .Release.Namespace }}.svc.cluster.local" - ], - "secretName": "{{ template "consul.fullname" . }}-connect-inject-webhook-cert", - "secretNamespace": "{{ .Release.Namespace }}" - } - ] - {{- end }} diff --git a/charts/consul/templates/webhook-cert-manager-deployment.yaml b/charts/consul/templates/webhook-cert-manager-deployment.yaml deleted file mode 100644 index 71cddca..0000000 --- a/charts/consul/templates/webhook-cert-manager-deployment.yaml +++ /dev/null @@ -1,79 +0,0 @@ -{{ $hasConfiguredWebhookCertsUsingVault := (and .Values.global.secretsBackend.vault.enabled .Values.global.secretsBackend.vault.connectInjectRole .Values.global.secretsBackend.vault.connectInject.tlsCert.secretName .Values.global.secretsBackend.vault.connectInject.caCert.secretName) -}} -{{- if (and .Values.connectInject.enabled (not $hasConfiguredWebhookCertsUsingVault)) }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "consul.fullname" . }}-webhook-cert-manager - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: webhook-cert-manager - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 4 }} - {{- end }} -spec: - replicas: 1 - selector: - matchLabels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: webhook-cert-manager - template: - metadata: - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: webhook-cert-manager - {{- if .Values.global.extraLabels }} - {{- toYaml .Values.global.extraLabels | nindent 8 }} - {{- end }} - annotations: - "consul.hashicorp.com/connect-inject": "false" - "consul.hashicorp.com/mesh-inject": "false" - "consul.hashicorp.com/config-checksum": {{ include (print $.Template.BasePath "/webhook-cert-manager-configmap.yaml") . | sha256sum }} - spec: - containers: - - command: - - "/bin/sh" - - "-ec" - - | - exec consul-k8s-control-plane webhook-cert-manager \ - -log-level={{ .Values.global.logLevel }} \ - -log-json={{ .Values.global.logJSON }} \ - -config-file=/bootstrap/config/webhook-config.json \ - -deployment-name={{ template "consul.fullname" . }}-webhook-cert-manager \ - -deployment-namespace={{ .Release.Namespace }} - image: {{ .Values.global.imageK8S }} - {{ template "consul.imagePullPolicy" . }} - name: webhook-cert-manager - {{- include "consul.restrictedSecurityContext" . | nindent 8 }} - {{- with .Values.webhookCertManager.resources }} - resources: - {{- toYaml . | nindent 12 }} - {{- end }} - volumeMounts: - - name: config - mountPath: /bootstrap/config - terminationGracePeriodSeconds: 10 - serviceAccountName: {{ template "consul.fullname" . }}-webhook-cert-manager - volumes: - - name: config - configMap: - name: {{ template "consul.fullname" . }}-webhook-cert-manager-config - {{- if .Values.webhookCertManager.tolerations }} - tolerations: - {{ tpl .Values.webhookCertManager.tolerations . | indent 8 | trim }} - {{- end }} - {{- if .Values.webhookCertManager.nodeSelector }} - nodeSelector: - {{ tpl .Values.webhookCertManager.nodeSelector . | indent 8 | trim }} - {{- end }} - -{{- end }} diff --git a/charts/consul/templates/webhook-cert-manager-podsecuritypolicy.yaml b/charts/consul/templates/webhook-cert-manager-podsecuritypolicy.yaml deleted file mode 100644 index 4d685ed..0000000 --- a/charts/consul/templates/webhook-cert-manager-podsecuritypolicy.yaml +++ /dev/null @@ -1,43 +0,0 @@ -{{ $hasConfiguredWebhookCertsUsingVault := (and .Values.global.secretsBackend.vault.enabled .Values.global.secretsBackend.vault.connectInjectRole .Values.global.secretsBackend.vault.connectInject.tlsCert.secretName .Values.global.secretsBackend.vault.connectInject.caCert.secretName) -}} -{{- if (and .Values.global.enablePodSecurityPolicies (or (and (ne (.Values.connectInject.enabled | toString) "-") .Values.connectInject.enabled) (and (eq (.Values.connectInject.enabled | toString) "-") .Values.global.enabled))) }} -{{- if (and .Values.connectInject.enabled (not $hasConfiguredWebhookCertsUsingVault)) }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "consul.fullname" . }}-webhook-cert-manager - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: webhook-cert-manager -spec: - privileged: false - # Required to prevent escalations to root. - allowPrivilegeEscalation: false - # This is redundant with non-root + disallow privilege escalation, - # but we can provide it for defense in depth. - requiredDropCapabilities: - - ALL - # Allow core volume types. - volumes: - - 'configMap' - - 'emptyDir' - - 'projected' - - 'secret' - - 'downwardAPI' - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'RunAsAny' - fsGroup: - rule: 'RunAsAny' - readOnlyRootFilesystem: false -{{- end }} -{{- end }} diff --git a/charts/consul/templates/webhook-cert-manager-serviceaccount.yaml b/charts/consul/templates/webhook-cert-manager-serviceaccount.yaml deleted file mode 100644 index 68c54f3..0000000 --- a/charts/consul/templates/webhook-cert-manager-serviceaccount.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{ $hasConfiguredWebhookCertsUsingVault := (and .Values.global.secretsBackend.vault.enabled .Values.global.secretsBackend.vault.connectInjectRole .Values.global.secretsBackend.vault.connectInject.tlsCert.secretName .Values.global.secretsBackend.vault.connectInject.caCert.secretName) -}} -{{- if (and .Values.connectInject.enabled (not $hasConfiguredWebhookCertsUsingVault)) }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "consul.fullname" . }}-webhook-cert-manager - namespace: {{ .Release.Namespace }} - labels: - app: {{ template "consul.name" . }} - chart: {{ template "consul.chart" . }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - component: webhook-cert-manager - {{- with .Values.global.imagePullSecrets }} -imagePullSecrets: - {{- range . }} -- name: {{ .name }} - {{- end }} - {{- end }} -{{- end }} diff --git a/charts/consul/values.yaml b/charts/consul/values.yaml deleted file mode 100644 index f9dde2d..0000000 --- a/charts/consul/values.yaml +++ /dev/null @@ -1,3741 +0,0 @@ -# Copyright (c) HashiCorp, Inc. -# SPDX-License-Identifier: MPL-2.0 - -# Available parameters and their default values for the Consul chart. - -# Holds values that affect multiple components of the chart. -global: - # The main enabled/disabled setting. If true, servers, - # clients, Consul DNS and the Consul UI will be enabled. Each component can override - # this default via its component-specific "enabled" config. If false, no components - # will be installed by default and per-component opt-in is required, such as by - # setting `server.enabled` to true. - enabled: true - - # The default log level to apply to all components which do not otherwise override this setting. - # It is recommended to generally not set this below "info" unless actively debugging due to logging verbosity. - # One of "debug", "info", "warn", or "error". - # @type: string - logLevel: "info" - - # Enable all component logs to be output in JSON format. - # @type: boolean - logJSON: false - - # Set the prefix used for all resources in the Helm chart. If not set, - # the prefix will be `-consul`. - # @type: string - name: null - - # The domain Consul will answer DNS queries for - # (Refer to [`-domain`](https://developer.hashicorp.com/consul/docs/agent/config/cli-flags#_domain)) and the domain services synced from - # Consul into Kubernetes will have, e.g. `service-name.service.consul`. - domain: consul - - # Configures the Cluster Peering feature. Requires Consul v1.14+ and Consul-K8s v1.0.0+. - peering: - # If true, the Helm chart enables Cluster Peering for the cluster. This option enables peering controllers and - # allows use of the PeeringAcceptor and PeeringDialer CRDs for establishing service mesh peerings. - enabled: false - - # [Enterprise Only] Enabling `adminPartitions` allows creation of Admin Partitions in Kubernetes clusters. - # It additionally indicates that you are running Consul Enterprise v1.11+ with a valid Consul Enterprise - # license. Admin partitions enables deploying services across partitions, while sharing - # a set of Consul servers. - adminPartitions: - # If true, the Helm chart will enable Admin Partitions for the cluster. The clients in the server cluster - # must be installed in the default partition. Creation of Admin Partitions is only supported during installation. - # Admin Partitions cannot be installed via a Helm upgrade operation. Only Helm installs are supported. - enabled: false - - # The name of the Admin Partition. The partition name cannot be modified once the partition has been installed. - # Changing the partition name would require an un-install and a re-install with the updated name. - # Must be "default" in the server cluster ie the Kubernetes cluster that the Consul server pods are deployed onto. - name: "default" - - # The name (and tag) of the Consul Docker image for clients and servers. - # This can be overridden per component. This should be pinned to a specific - # version tag, otherwise you may inadvertently upgrade your Consul version. - # - # Examples: - # - # ```yaml - # # Consul 1.10.0 - # image: "consul:1.10.0" - # # Consul Enterprise 1.10.0 - # image: "hashicorp/consul-enterprise:1.10.0-ent" - # ``` - # @default: hashicorp/consul: - image: hashicorp/consul:1.21.3 - - # Array of objects containing image pull secret names that will be applied to each service account. - # This can be used to reference image pull secrets if using a custom consul or consul-k8s-control-plane Docker image. - # Refer to https://kubernetes.io/docs/concepts/containers/images/#using-a-private-registry. - # - # Example: - # - # ```yaml - # imagePullSecrets: - # - name: pull-secret-name - # - name: pull-secret-name-2 - # ``` - # @type: array - imagePullSecrets: [] - - # The name (and tag) of the consul-k8s-control-plane Docker - # image that is used for functionality such as catalog sync. - # This can be overridden per component. - # @default: hashicorp/consul-k8s-control-plane: - imageK8S: hashicorp/consul-k8s-control-plane:1.8.0 - - # The image pull policy used globally for images controlled by Consul (consul, consul-dataplane, consul-k8s, consul-telemetry-collector). - # One of "IfNotPresent", "Always", "Never", and "". Refer to https://kubernetes.io/docs/concepts/containers/images/#image-pull-policy - # @default: "" - imagePullPolicy: "" - - # The name of the datacenter that the agents should - # register as. This can't be changed once the Consul cluster is up and running - # since Consul doesn't support an automatic way to change this value currently: - # https://github.com/hashicorp/consul/issues/1858. - datacenter: dc1 - - # Controls whether pod security policies are created for the Consul components - # created by this chart. Refer to https://kubernetes.io/docs/concepts/policy/pod-security-policy/. - enablePodSecurityPolicies: false - - # secretsBackend is used to configure Vault as the secrets backend for the Consul on Kubernetes installation. - # The Vault cluster needs to have the Kubernetes Auth Method, KV2 and PKI secrets engines enabled - # and have necessary secrets, policies and roles created prior to installing Consul. - # Refer to [Vault as the Secrets Backend](https://developer.hashicorp.com/consul/docs/k8s/deployment-configurations/vault) - # documentation for full instructions. - # - # The Vault cluster _must_ not have the Consul cluster installed by this Helm chart as its storage backend - # as that would cause a circular dependency. - # Vault can have Consul as its storage backend as long as that Consul cluster is not running on this Kubernetes cluster - # and is being managed separately from this Helm installation. - # - # Note: When using Vault KV2 secrets engines the "data" field is implicitly required for Vault API calls, - # secretName should be in the form of "vault-kv2-mount-path/data/secret-name". - # secretKey should be in the form of "key". - secretsBackend: - vault: - # Vault namespace (optional). This sets the Vault namespace for the `vault.hashicorp.com/namespace` - # agent annotation and [Vault Connect CA namespace](https://developer.hashicorp.com/consul/docs/connect/ca/vault#namespace). - # To override one of these values individually, see `agentAnnotations` and `connectCA.additionalConfig`. - vaultNamespace: "" - - # Enabling the Vault secrets backend will replace Kubernetes secrets with referenced Vault secrets. - enabled: false - - # The Vault role for the Consul server. - # The role must be connected to the Consul server's service account. - # The role must also have a policy with read capabilities for the following secrets: - # - gossip encryption key defined by the `global.gossipEncryption.secretName` value - # - certificate issue path defined by the `server.serverCert.secretName` value - # - CA certificate defined by the `global.tls.caCert.secretName` value - # - replication token defined by the `global.acls.replicationToken.secretName` value if `global.federation.enabled` is `true` - # To discover the service account name of the Consul server, run - # ```shell-session - # $ helm template --show-only templates/server-serviceaccount.yaml hashicorp/consul - # ``` - # and check the name of `metadata.name`. - consulServerRole: "" - - # The Vault role for the Consul client. - # The role must be connected to the Consul client's service account. - # The role must also have a policy with read capabilities for the gossip encryption - # key defined by the `global.gossipEncryption.secretName` value. - # To discover the service account name of the Consul client, run - # ```shell-session - # $ helm template --show-only templates/client-serviceaccount.yaml hashicorp/consul - # ``` - # and check the name of `metadata.name`. - consulClientRole: "" - - # A Vault role for the Consul `server-acl-init` job, which manages setting ACLs so that clients and components can obtain ACL tokens. - # The role must be connected to the `server-acl-init` job's service account. - # The role must also have a policy with read and write capabilities for the bootstrap, replication or partition tokens - # To discover the service account name of the `server-acl-init` job, run - # ```shell-session - # $ helm template --show-only templates/server-acl-init-serviceaccount.yaml \ - # --set global.acls.manageSystemACLs=true hashicorp/consul - # ``` - # and check the name of `metadata.name`. - manageSystemACLsRole: "" - - # [Enterprise Only] A Vault role that allows the Consul `partition-init` job to read a Vault secret for the partition ACL token. - # The `partition-init` job bootstraps Admin Partitions on Consul servers. - # . - # This role must be bound the `partition-init` job's service account. - # To discover the service account name of the `partition-init` job, run with Helm values for the client cluster: - # ```shell-session - # $ helm template --show-only templates/partition-init-serviceaccount.yaml -f client-cluster-values.yaml hashicorp/consul - # ``` - # and check the name of `metadata.name`. - adminPartitionsRole: "" - - # The Vault role to read Consul connect-injector webhook's CA - # and issue a certificate and private key. - # A Vault policy must be created which grants issue capabilities to - # `global.secretsBackend.vault.connectInject.tlsCert.secretName`. - connectInjectRole: "" - - # The Vault role for all Consul components to read the Consul's server's CA Certificate (unauthenticated). - # The role should be connected to the service accounts of all Consul components, or alternatively `*` since it - # will be used only against the `pki/cert/ca` endpoint which is unauthenticated. A policy must be created which grants - # read capabilities to `global.tls.caCert.secretName`, which is usually `pki/cert/ca`. - consulCARole: "" - - # This value defines additional annotations for - # Vault agent on any pods where it'll be running. - # This should be formatted as a multi-line string. - # - # ```yaml - # annotations: | - # "sample/annotation1": "foo" - # "sample/annotation2": "bar" - # ``` - # - # @type: string - agentAnnotations: null - - # Configuration for Vault server CA certificate. This certificate will be mounted - # to any pod where Vault agent needs to run. - ca: - # The name of the Kubernetes or Vault secret that holds the Vault CA certificate. - # A Kubernetes secret must be in the same namespace that Consul is installed into. - secretName: "" - # The key within the Kubernetes or Vault secret that holds the Vault CA certificate. - secretKey: "" - - # Configuration for the Vault Connect CA provider. - # The provider will be configured to use the Vault Kubernetes auth method - # and therefore requires the role provided by `global.secretsBackend.vault.consulServerRole` - # to have permissions to the root and intermediate PKI paths. - # Please refer to [Vault ACL policies](https://developer.hashicorp.com/consul/docs/connect/ca/vault#vault-acl-policies) - # documentation for information on how to configure the Vault policies. - connectCA: - # The address of the Vault server. - address: "" - - # The mount path of the Kubernetes auth method in Vault. - authMethodPath: "kubernetes" - - # The path to a PKI secrets engine for the root certificate. - # For more details, please refer to [Vault Connect CA configuration](https://developer.hashicorp.com/consul/docs/connect/ca/vault#rootpkipath). - rootPKIPath: "" - - # The path to a PKI secrets engine for the generated intermediate certificate. - # For more details, please refer to [Vault Connect CA configuration](https://developer.hashicorp.com/consul/docs/connect/ca/vault#intermediatepkipath). - intermediatePKIPath: "" - - # Additional Connect CA configuration in JSON format. - # Please refer to [Vault Connect CA configuration](https://developer.hashicorp.com/consul/docs/connect/ca/vault#configuration) - # for all configuration options available for that provider. - # - # Example: - # - # ```yaml - # additionalConfig: | - # { - # "connect": [{ - # "ca_config": [{ - # "leaf_cert_ttl": "36h" - # }] - # }] - # } - # ``` - additionalConfig: | - {} - - connectInject: - # Configuration to the Vault Secret that Kubernetes uses on - # Kubernetes pod creation, deletion, and update, to get CA certificates - # used issued from vault to send webhooks to the ConnectInject. - caCert: - # The Vault secret path that contains the CA certificate for - # Connect Inject webhooks. - # @type: string - secretName: null - - # Configuration to the Vault Secret that Kubernetes uses on - # Kubernetes pod creation, deletion, and update, to get TLS certificates - # used issued from vault to send webhooks to the ConnectInject. - tlsCert: - # The Vault secret path that issues TLS certificates for connect - # inject webhooks. - # @type: string - secretName: null - - # Configures Consul's gossip encryption key. - # (Refer to [`-encrypt`](https://developer.hashicorp.com/consul/docs/agent/config/cli-flags#_encrypt)). - # By default, gossip encryption is not enabled. The gossip encryption key may be set automatically or manually. - # The recommended method is to automatically generate the key. - # To automatically generate and set a gossip encryption key, set autoGenerate to true. - # Values for secretName and secretKey should not be set if autoGenerate is true. - # To manually generate a gossip encryption key, set secretName and secretKey and use Consul to generate - # a key, saving this as a Kubernetes secret or Vault secret path and key. - # If `global.secretsBackend.vault.enabled=true`, be sure to add the "data" component of the secretName path as required by - # the Vault KV-2 secrets engine [refer to example]. - # - # ```shell-session - # $ kubectl create secret generic consul-gossip-encryption-key --from-literal=key=$(consul keygen) - # ``` - # - # Vault CLI Example: - # ```shell-session - # $ vault kv put consul/secrets/gossip key=$(consul keygen) - # ``` - # `gossipEncryption.secretName="consul/data/secrets/gossip"` - # `gossipEncryption.secretKey="key"` - - gossipEncryption: - # Automatically generate a gossip encryption key and save it to a Kubernetes or Vault secret. - autoGenerate: false - # The name of the Kubernetes secret or Vault secret path that holds the gossip - # encryption key. A Kubernetes secret must be in the same namespace that Consul is installed into. - secretName: "" - # The key within the Kubernetes secret or Vault secret key that holds the gossip - # encryption key. - secretKey: "" - # Override global log verbosity level for gossip-encryption-autogenerate-job pods. One of "trace", "debug", "info", "warn", or "error". - # @type: string - logLevel: "" - - # A list of addresses of upstream DNS servers that are used to recursively resolve DNS queries. - # These values are given as `-recursor` flags to Consul servers and clients. - # Refer to [`-recursor`](https://developer.hashicorp.com/consul/docs/agent/config/cli-flags#_recursor) for more details. - # If this is an empty array (the default), then Consul DNS will only resolve queries for the Consul top level domain (by default `.consul`). - # @type: array - recursors: [] - - # Enables [TLS](https://developer.hashicorp.com/consul/tutorials/security/tls-encryption-secure) - # across the cluster to verify authenticity of the Consul servers and clients. - # Requires Consul v1.4.1+. - tls: - # If true, the Helm chart will enable TLS for Consul - # servers and clients and all consul-k8s-control-plane components, as well as generate certificate - # authority (optional) and server and client certificates. - # This setting is required for [Cluster Peering](https://developer.hashicorp.com/consul/docs/connect/cluster-peering/k8s). - enabled: false - - # Override global log verbosity level. One of "trace", "debug", "info", "warn", or "error". - # @type: string - logLevel: "" - - # If true, turns on the auto-encrypt feature on clients and servers. - # It also switches consul-k8s-control-plane components to retrieve the CA from the servers - # via the API. Requires Consul 1.7.1+. - enableAutoEncrypt: false - - # A list of additional DNS names to set as Subject Alternative Names (SANs) - # in the server certificate. This is useful when you need to access the - # Consul server(s) externally, for example, if you're using the UI. - # @type: array - serverAdditionalDNSSANs: [] - - # A list of additional IP addresses to set as Subject Alternative Names (SANs) - # in the server certificate. This is useful when you need to access the - # Consul server(s) externally, for example, if you're using the UI. - # @type: array - serverAdditionalIPSANs: [] - - # If true, `verify_outgoing`, `verify_server_hostname`, - # and `verify_incoming` for internal RPC communication will be set to `true` for Consul servers and clients. - # Set this to false to incrementally roll out TLS on an existing Consul cluster. - # Please refer to [TLS on existing clusters](https://developer.hashicorp.com/consul/docs/k8s/operations/tls-on-existing-cluster) - # for more details. - verify: true - - # If true, the Helm chart will configure Consul to disable the HTTP port on - # both clients and servers and to only accept HTTPS connections. - httpsOnly: true - - # A secret containing the certificate of the CA to use for TLS communication within the Consul cluster. - # If you have generated the CA yourself with the consul CLI, you could use the following command to create the secret - # in Kubernetes: - # - # ```shell-session - # $ kubectl create secret generic consul-ca-cert \ - # --from-file='tls.crt=./consul-agent-ca.pem' - # ``` - # If you are using Vault as a secrets backend with TLS, `caCert.secretName` must be provided and should reference - # the CA path for your PKI secrets engine. This should be of the form `pki/cert/ca` where `pki` is the mount point of your PKI secrets engine. - # A read policy must be created and associated with the CA cert path for `global.tls.caCert.secretName`. - # This will be consumed by the `global.secretsBackend.vault.consulCARole` role by all Consul components. - # When using Vault the secretKey is not used. - caCert: - # The name of the Kubernetes or Vault secret that holds the CA certificate. - # @type: string - secretName: null - # The key within the Kubernetes or Vault secret that holds the CA certificate. - # @type: string - secretKey: null - - # A Kubernetes or Vault secret containing the private key of the CA to use for - # TLS communication within the Consul cluster. If you have generated the CA yourself - # with the consul CLI, you could use the following command to create the secret - # in Kubernetes: - # - # ```shell-session - # $ kubectl create secret generic consul-ca-key \ - # --from-file='tls.key=./consul-agent-ca-key.pem' - # ``` - # - # Note that we need the CA key so that we can generate server and client certificates. - # It is particularly important for the client certificates since they need to have host IPs - # as Subject Alternative Names. If you are setting server certs yourself via `server.serverCert` - # and you are not enabling clients (or clients are enabled with autoEncrypt) then you do not - # need to provide the CA key. - caKey: - # The name of the Kubernetes or Vault secret that holds the CA key. - # @type: string - secretName: null - # The key within the Kubernetes or Vault secret that holds the CA key. - # @type: string - secretKey: null - - # This value defines additional annotations for - # tls init jobs. This should be formatted as a multi-line string. - # - # ```yaml - # annotations: | - # "sample/annotation1": "foo" - # "sample/annotation2": "bar" - # ``` - # - # @type: string - annotations: null - - # [Enterprise Only] `enableConsulNamespaces` indicates that you are running - # Consul Enterprise v1.7+ with a valid Consul Enterprise license and would - # like to make use of configuration beyond registering everything into - # the `default` Consul namespace. Additional configuration - # options are found in the `consulNamespaces` section of both the catalog sync - # and connect injector. - enableConsulNamespaces: false - - # Configure ACLs. - acls: - # If true, the Helm chart will automatically manage ACL tokens and policies - # for all Consul and consul-k8s-control-plane components. - # This requires Consul >= 1.4. - manageSystemACLs: false - - # Override global log verbosity level. One of "trace", "debug", "info", "warn", or "error". - # @type: string - logLevel: "" - - # A Kubernetes or Vault secret containing the bootstrap token to use for creating policies and - # tokens for all Consul and consul-k8s-control-plane components. If `secretName` and `secretKey` - # are unset, a default secret name and secret key are used. If the secret is populated, then - # we will skip ACL bootstrapping of the servers and will only initialize ACLs for the Consul - # clients and consul-k8s-control-plane system components. - # If the secret is empty, then we will bootstrap ACLs on the Consul servers, and write the - # bootstrap token to this secret. If ACLs are already bootstrapped on the servers, then the - # secret must contain the bootstrap token. - bootstrapToken: - # The name of the Kubernetes or Vault secret that holds the bootstrap token. - # If unset, this defaults to `{{ global.name }}-bootstrap-acl-token`. - secretName: null - # The key within the Kubernetes or Vault secret that holds the bootstrap token. - # If unset, this defaults to `token`. - secretKey: null - - # If true, an ACL token will be created that can be used in secondary - # datacenters for replication. This should only be set to true in the - # primary datacenter since the replication token must be created from that - # datacenter. - # In secondary datacenters, the secret needs to be imported from the primary - # datacenter and referenced via `global.acls.replicationToken`. - createReplicationToken: false - - # replicationToken references a secret containing the replication ACL token. - # This token will be used by secondary datacenters to perform ACL replication - # and create ACL tokens and policies. - # This value is ignored if `bootstrapToken` is also set. - replicationToken: - # The name of the Kubernetes or Vault secret that holds the replication token. - # @type: string - secretName: null - # The key within the Kubernetes or Vault secret that holds the replication token. - # @type: string - secretKey: null - - # The resource requests (CPU, memory, etc.) for the server-acl-init and server-acl-init-cleanup pods. - # This should be a YAML map corresponding to a Kubernetes - # [`ResourceRequirements``](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.27/#resourcerequirements-v1-core) - # object. - # - # Example: - # - # ```yaml - # resources: - # requests: - # memory: '200Mi' - # cpu: '100m' - # limits: - # memory: '200Mi' - # cpu: '100m' - # ``` - # - # @recurse: false - # @type: map - resources: - requests: - memory: "50Mi" - cpu: "50m" - limits: - memory: "50Mi" - cpu: "50m" - - # partitionToken references a Vault secret containing the ACL token to be used in non-default partitions. - # This value should only be provided in the default partition and only when setting - # the `global.secretsBackend.vault.enabled` value to true. - # Consul will use the value of the secret stored in Vault to create an ACL token in Consul with the value of the - # secret as the secretID for the token. - # In non-default, partitions set this secret as the `bootstrapToken`. - partitionToken: - # The name of the Vault secret that holds the partition token. - # @type: string - secretName: null - # The key within the Vault secret that holds the parition token. - # @type: string - secretKey: null - - # tolerations configures the taints and tolerations for the server-acl-init - # and server-acl-init-cleanup jobs. This should be a multi-line string matching the - # [Tolerations](https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/) array in a Pod spec. - tolerations: "" - - # This value defines [`nodeSelector`](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector) - # labels for the server-acl-init and server-acl-init-cleanup jobs pod assignment, formatted as a multi-line string. - # - # Example: - # - # ```yaml - # nodeSelector: | - # beta.kubernetes.io/arch: amd64 - # ``` - # - # @type: string - nodeSelector: null - - # This value defines additional annotations for - # acl init jobs. This should be formatted as a multi-line string. - # - # ```yaml - # annotations: | - # "sample/annotation1": "foo" - # "sample/annotation2": "bar" - # ``` - # - # @type: string - annotations: null - - # If argocd.enabled is set to true, following annotations are added to - # job - server-acl-init-job - # annotations - - # argocd.argoproj.io/hook: Sync - # argocd.argoproj.io/hook-delete-policy: HookSucceeded - argocd: - enabled: false - - # [Enterprise Only] This value refers to a Kubernetes or Vault secret that you have created - # that contains your enterprise license. It is required if you are using an - # enterprise binary. Defining it here applies it to your cluster once a leader - # has been elected. If you are not using an enterprise image or if you plan to - # introduce the license key via another route, then set these fields to null. - # Note: the job to apply license runs on both Helm installs and upgrades. - enterpriseLicense: - # The name of the Kubernetes or Vault secret that holds the enterprise license. - # A Kubernetes secret must be in the same namespace that Consul is installed into. - # @type: string - secretName: null - # The key within the Kubernetes or Vault secret that holds the enterprise license. - # @type: string - secretKey: null - # Manages license autoload. Required in Consul 1.10.0+, 1.9.7+ and 1.8.12+. - enableLicenseAutoload: true - - # Configure federation. - federation: - # If enabled, this datacenter will be federation-capable. Only federation - # via mesh gateways is supported. - # Mesh gateways and servers will be configured to allow federation. - # Requires `global.tls.enabled`, `connectInject.enabled`, and one of - # `meshGateway.enabled` or `externalServers.enabled` to be true. - # Requires Consul 1.8+. - enabled: false - - # If true, the chart will create a Kubernetes secret that can be imported - # into secondary datacenters so they can federate with this datacenter. The - # secret contains all the information secondary datacenters need to contact - # and authenticate with this datacenter. This should only be set to true - # in your primary datacenter. The secret name is - # `-federation` (if setting `global.name`), otherwise - # `-consul-federation`. - createFederationSecret: false - - # The name of the primary datacenter. - # @type: string - primaryDatacenter: null - - # A list of addresses of the primary mesh gateways in the form `:` - # (e.g. `["1.1.1.1:443", "2.3.4.5:443"]`). - # @type: array - primaryGateways: [] - - # If you are setting `global.federation.enabled` to true and are in a secondary datacenter, - # set `k8sAuthMethodHost` to the address of the Kubernetes API server of the secondary datacenter. - # This address must be reachable from the Consul servers in the primary datacenter. - # This auth method will be used to provision ACL tokens for Consul components and is different - # from the one used by the Consul Service Mesh. - # Please refer to the [Kubernetes Auth Method documentation](https://developer.hashicorp.com/consul/docs/security/acl/auth-methods/kubernetes). - # - # If `externalServers.enabled` is set to true, `global.federation.k8sAuthMethodHost` and - # `externalServers.k8sAuthMethodHost` should be set to the same value. - # - # You can retrieve this value from your `kubeconfig` by running: - # - # ```shell-session - # $ kubectl config view \ - # -o jsonpath="{.clusters[?(@.name=='')].cluster.server}" - # ``` - # - # @type: string - k8sAuthMethodHost: null - - # Override global log verbosity level for the create-federation-secret-job pods. One of "trace", "debug", "info", "warn", or "error". - # @type: string - logLevel: "" - - # Configures metrics for Consul service mesh - metrics: - # Configures the Helm chart’s components - # to expose Prometheus metrics for the Consul service mesh. By default - # this includes gateway metrics and sidecar metrics. - # @type: boolean - enabled: false - - # Configures consul agent metrics. Only applicable if - # `global.metrics.enabled` is true. - # @type: boolean - enableAgentMetrics: false - - # Set to true to stop prepending the machine's hostname to gauge-type metrics. Default is false. - # Only applicable if `global.metrics.enabled` and `global.metrics.enableAgentMetrics` is true. - # @type: boolean - disableAgentHostName: false - - # Configures consul agent underlying host metrics. Default is false. - # Only applicable if `global.metrics.enabled` and `global.metrics.enableAgentMetrics` is true. - # @type: boolean - enableHostMetrics: false - - # Configures the retention time for metrics in Consul clients and - # servers. This must be greater than 0 for Consul clients and servers - # to expose any metrics at all. - # Only applicable if `global.metrics.enabled` is true. - # @type: string - agentMetricsRetentionTime: 1m - - # If true, mesh, terminating, and ingress gateways will expose their - # Envoy metrics on port `20200` at the `/metrics` path and all gateway pods - # will have Prometheus scrape annotations. Only applicable if `global.metrics.enabled` is true. - # @type: boolean - enableGatewayMetrics: true - - # Configures the Helm chart’s components to forward envoy metrics for the Consul service mesh to the - # consul-telemetry-collector. This includes gateway metrics and sidecar metrics. - # @type: boolean - enableTelemetryCollector: false - - # Configures the list of filter rules to apply for allowing or blocking - # metrics by prefix in the following format: - # - # A leading "+" will enable any metrics with the given prefix, and a leading "-" will block them. - # If there is overlap between two rules, the more specific rule will take precedence. - # Blocking will take priority if the same prefix is listed multiple times. - prefixFilter: - # @type: array - allowList: [] - # @type: array - blockList: [] - - # Configures consul integration configurations for datadog on kubernetes. - # Only applicable if `global.metrics.enabled` and `global.metrics.enableAgentMetrics` is true. - datadog: - # Enables datadog [Consul Autodiscovery Integration](https://docs.datadoghq.com/integrations/consul/?tab=containerized#metric-collection) - # by configuring the required `ad.datadoghq.com/consul.checks` annotation. The following _Consul_ agent metrics/health statuses - # are monitored by Datadog unless monitoring via OpenMetrics (Prometheus) or DogStatsD: - # - Serf events and member flaps - # - The Raft protocol - # - DNS performance - # - API Endpoints scraped: - # - `/v1/agent/metrics?format=prometheus` - # - `/v1/agent/self` - # - `/v1/status/leader` - # - `/v1/status/peers` - # - `/v1/catalog/services` - # - `/v1/health/service` - # - `/v1/health/state/any` - # - `/v1/coordinate/datacenters` - # - `/v1/coordinate/nodes` - # - # Setting either `global.metrics.datadog.otlp.enabled=true` or `global.metrics.datadog.dogstatsd.enabled=true` disables the above checks - # in lieu of metrics data collection via DogStatsD or by a customer OpenMetrics (Prometheus) collection endpoint. - # - # ~> **Note:** If you have a [dogstatsd_mapper_profile](https://docs.datadoghq.com/integrations/consul/?tab=host#dogstatsd) configured for Consul - # residing on either your Datadog NodeAgent or ClusterAgent the default Consul agent metrics/health status checks will fail. If you do not desire - # to utilize DogStatsD metrics emission from Consul, remove this configuration file, and restart your Datadog agent to permit the checks to run. - # - # @default: false - # @type: boolean - enabled: false - - # Configures Kubernetes Prometheus/OpenMetrics auto-discovery annotations for use with Datadog. - # This configuration is less common and more for advanced usage with custom metrics monitoring - # configurations. Refer to the [Datadog documentation](https://docs.datadoghq.com/containers/kubernetes/prometheus/?tab=kubernetesadv2) for more details. - openMetricsPrometheus: - # @default: false - # @type: boolean - enabled: false - - otlp: - # Enables forwarding of Consul's Telemetry Collector OTLP metrics for - # ingestion by Datadog Agent. - # @default: false - # @type: boolean - enabled: false - # Protocol used for DataDog Endpoint OTLP ingestion. - # - # Valid protocol options are one of either: - # - # - "http": will forward to DataDog HTTP OTLP Node Agent Endpoint default - "0.0.0.0:4318" - # - "grpc": will forward to DataDog gRPC OTLP Node Agent Endpoint default - "0.0.0.0:4317" - # - # @default: "http" - # @type: string - protocol: "http" - - # Configuration settings for DogStatsD metrics aggregation service - # that is bundled with the Datadog Agent. - # DogStatsD implements the StatsD protocol and adds a few Datadog-specific extensions: - # - Histogram metric type - # - Service checks - # - Events - # - Tagging - dogstatsd: - enabled: false - # Sets the socket transport type for dogstatsd: - # - "UDS" (Unix Domain Socket): prefixes `unix://` to URL and appends path to socket (i.e., "unix:///var/run/datadog/dsd.socket") - # If set, this will create the required [hostPath](https://kubernetes.io/docs/concepts/storage/volumes/#hostpath) mount for - # managing [DogStatsD with Unix Domain Socket on Kubernetes](https://docs.datadoghq.com/developers/dogstatsd/unix_socket/?tab=kubernetes). - # The volume is mounted using the `DirectoryOrCreate` type, thereby setting `0755` permissions with the same kubelet group ownership. - # - # Applies the following `volumes` and `volumeMounts` to the consul-server stateful set consul containers: - # - # ```yaml - # volumes: - # - name: dsdsocket - # hostPath: - # path: /var/run/datadog - # type: DirectoryOrCreate - # volumeMounts: - # - name: dsdsocket - # mountPath: /var/run/datadog - # readOnly: true - # ``` - # - "UDP" (User Datagram Protocol): assigns address to use `hostname/IP:Port` formatted URL for UDP transport to hostIP based - # dogstatsd sink (i.e., 127.0.0.1:8125). HostIP of Datadog agent must be reachable and known to Consul server emitting metrics. - # - # @default: "UDS" - # @type: string - socketTransportType: "UDS" - # Sets URL path for dogstatsd: - # - # Can be either a path to unix domain socket or an IP Address or Hostname that's reachable from the - # consul-server service, server containers. When using "UDS" the path will be appended. When using "UDP" - # the path will be prepended to the specified `dogstatsdPort`. - # - # @default: "/var/run/datadog/dsd.socket" - # @type: string - dogstatsdAddr: "/var/run/datadog/dsd.socket" - # Configures IP based dogstatsd designated port that will be appended to "UDP" based transport socket IP/Hostname URL. - # - # If using a kubernetes service based address (i.e., datadog.default.svc.cluster.local), set this to 0 to - # mitigate appending a port value to the dogstatsd address field. Resultant address would be "datadog.default.svc.cluster.local" with - # default port setting, while appending a non-zero port would result in "172.10.23.6:8125" with a dogstatsdAddr value - # of "172.10.23.6". - # - # @default: 0 - # @type: integer - dogstatsdPort: 0 - # Configures datadog [autodiscovery](https://docs.datadoghq.com/containers/kubernetes/log/?tab=operator#autodiscovery) - # style [log integration](https://docs.datadoghq.com/integrations/consul/?tab=containerized#log-collection) - # configuration for Consul. - # - # The default settings should handle most Consul Kubernetes deployment schemes. The resultant annotation - # will reside on the consul-server statefulset as autodiscovery annotations. - # (i.e., ad.datadoghq.com/consul.logs: ["source:consul","consul_service:consul-server", ""]) - # - # @default: ["source:consul","consul_service:consul-server"] - # @type: array - dogstatsdTags: ["source:consul","consul_service:consul-server"] - # Namespace - # - # @default: "default" - # @type: string - namespace: "default" - - - # The name (and tag) of the consul-dataplane Docker image used for the - # connect-injected sidecar proxies and mesh, terminating, and ingress gateways. - # @default: hashicorp/consul-dataplane: - imageConsulDataplane: hashicorp/consul-dataplane:1.8.0 - - # Configuration for running this Helm chart on the Red Hat OpenShift platform. - # This Helm chart currently supports OpenShift v4.x+. - openshift: - # If true, the Helm chart will create necessary configuration for running - # its components on OpenShift. - enabled: false - - # The time in seconds that the consul API client will wait for a response from - # the API before cancelling the request. - consulAPITimeout: 5s - - # Enables installing an HCP Consul Central self-managed cluster. - # Requires Consul v1.14+. - cloud: - # If true, the Helm chart will link a [self-managed cluster to HCP](https://developer.hashicorp.com/hcp/docs/consul/self-managed). - # This can either be used to [configure a new cluster](https://developer.hashicorp.com/hcp/docs/consul/self-managed/new) - # or [link an existing one](https://developer.hashicorp.com/hcp/docs/consul/self-managed/existing). - # - # Note: this setting should not be enabled for [HCP Consul Dedicated clusters](/hcp/docs/consul/dedicated). - # It is strictly for linking self-managed clusters. - enabled: false - - # The resource id of the HCP Consul Central cluster to link to. Eg: - # organization/27109cd4-a309-4bf3-9986-e1d071914b18/project/fcef6c24-259d-4510-bb8d-1d812e120e34/hashicorp.consul.global-network-manager.cluster/consul-cluster - # This is required when global.cloud.enabled is true. - resourceId: - # The name of the Kubernetes secret that holds the resource id. - # @type: string - secretName: null - # The key within the Kubernetes secret that holds the resource id. - # @type: string - secretKey: null - - # The client id portion of a [service principal](https://developer.hashicorp.com/hcp/docs/hcp/admin/iam/service-principals#service-principals) with authorization to link the cluster - # in global.cloud.resourceId to HCP Consul Central. - # This is required when global.cloud.enabled is true. - clientId: - # The name of the Kubernetes secret that holds the client id. - # @type: string - secretName: null - # The key within the Kubernetes secret that holds the client id. - # @type: string - secretKey: null - - # The client secret portion of a [service principal](https://developer.hashicorp.com/hcp/docs/hcp/admin/iam/service-principals#service-principals) with authorization to link the cluster - # in global.cloud.resourceId to HCP Consul Central. - # This is required when global.cloud.enabled is true. - clientSecret: - # The name of the Kubernetes secret that holds the client secret. - # @type: string - secretName: null - # The key within the Kubernetes secret that holds the client secret. - # @type: string - secretKey: null - - # The hostname of HCP's API. This setting is used for internal testing and validation. - apiHost: - # The name of the Kubernetes secret that holds the api hostname. - # @type: string - secretName: null - # The key within the Kubernetes secret that holds the api hostname. - # @type: string - secretKey: null - - # The URL of HCP's auth API. This setting is used for internal testing and validation. - authUrl: - # The name of the Kubernetes secret that holds the authorization url. - # @type: string - secretName: null - # The key within the Kubernetes secret that holds the authorization url. - # @type: string - secretKey: null - - # The address of HCP's scada service. This setting is used for internal testing and validation. - scadaAddress: - # The name of the Kubernetes secret that holds the scada address. - # @type: string - secretName: null - # The key within the Kubernetes secret that holds the scada address. - # @type: string - secretKey: null - - # Extra labels to attach to all pods, deployments, daemonsets, statefulsets, and jobs. This should be a YAML map. - # - # Example: - # - # ```yaml - # extraLabels: - # labelKey: label-value - # anotherLabelKey: another-label-value - # ``` - # - # @type: map - extraLabels: {} - - # Optional PEM-encoded CA certificates that will be added to trusted system CAs. - # - # Example: - # - # ```yaml - # trustedCAs: [ - # | - # -----BEGIN CERTIFICATE----- - # MIIC7jCCApSgAwIBAgIRAIq2zQEVexqxvtxP6J0bXAwwCgYIKoZIzj0EAwIwgbkx - # ... - # ] - # ``` - # @type: array - trustedCAs: [] - - # Consul feature flags that will be enabled across components. - # Supported feature flags: - # - # - `v1dns`: - # When this flag is set, Consul agents use the legacy DNS implementation. - # This setting exists in the case a DNS bug is found after the refactoring introduced in v1.19.0. - # - # Example: - # - # ```yaml - # experiments: [ "v1dns" ] - # ``` - # @type: array - experiments: [] - -# Server, when enabled, configures a server cluster to run. This should -# be disabled if you plan on connecting to a Consul cluster external to -# the Kube cluster. -server: - # If true, the chart will install all the resources necessary for a - # Consul server cluster. If you're running Consul externally and want agents - # within Kubernetes to join that cluster, this should probably be false. - # @default: global.enabled - # @type: boolean - enabled: "-" - - # Override global log verbosity level. One of "trace", "debug", "info", "warn", or "error". - # @type: string - logLevel: "" - - # The name of the Docker image (including any tag) for the containers running - # Consul server agents. - # @type: string - image: null - - # The number of server agents to run. This determines the fault tolerance of - # the cluster. Please refer to the [deployment table](https://developer.hashicorp.com/consul/docs/architecture/consensus#deployment-table) - # for more information. - replicas: 1 - - # The number of servers that are expected to be running. - # It defaults to server.replicas. - # In most cases the default should be used, however if there are more - # servers in this datacenter than server.replicas it might make sense - # to override the default. This would be the case if two kube clusters - # were joined into the same datacenter and each cluster ran a certain number - # of servers. - # @type: int - bootstrapExpect: null - - # A secret containing a certificate & key for the server agents to use - # for TLS communication within the Consul cluster. Cert needs to be provided with - # additional DNS name SANs so that it will work within the Kubernetes cluster: - # - # Kubernetes Secrets backend: - # ```bash - # consul tls cert create -server -days=730 -domain=consul -ca=consul-agent-ca.pem \ - # -key=consul-agent-ca-key.pem -dc={{datacenter}} \ - # -additional-dnsname="{{fullname}}-server" \ - # -additional-dnsname="*.{{fullname}}-server" \ - # -additional-dnsname="*.{{fullname}}-server.{{namespace}}" \ - # -additional-dnsname="*.{{fullname}}-server.{{namespace}}.svc" \ - # -additional-dnsname="*.server.{{datacenter}}.{{domain}}" \ - # -additional-dnsname="server.{{datacenter}}.{{domain}}" - # ``` - # - # If you have generated the server-cert yourself with the consul CLI, you could use the following command - # to create the secret in Kubernetes: - # - # ```bash - # kubectl create secret generic consul-server-cert \ - # --from-file='tls.crt=./dc1-server-consul-0.pem' - # --from-file='tls.key=./dc1-server-consul-0-key.pem' - # ``` - # - # Vault Secrets backend: - # If you are using Vault as a secrets backend, a Vault Policy must be created which allows `["create", "update"]` - # capabilities on the PKI issuing endpoint, which is usually of the form `pki/issue/consul-server`. - # Complete [this tutorial](https://developer.hashicorp.com/consul/tutorials/vault-secure/vault-pki-consul-secure-tls) - # to learn how to generate a compatible certificate. - # Note: when using TLS, both the `server.serverCert` and `global.tls.caCert` which points to the CA endpoint of this PKI engine - # must be provided. - serverCert: - # The name of the Vault secret that holds the PEM encoded server certificate. - # @type: string - secretName: null - - # Exposes the servers' gossip and RPC ports as hostPorts. To enable a client - # agent outside of the k8s cluster to join the datacenter, you would need to - # enable `server.exposeGossipAndRPCPorts`, `client.exposeGossipPorts`, and - # set `server.ports.serflan.port` to a port not being used on the host. Since - # `client.exposeGossipPorts` uses the hostPort 8301, - # `server.ports.serflan.port` must be set to something other than 8301. - exposeGossipAndRPCPorts: false - - # Configures ports for the consul servers. - ports: - # Configures the LAN gossip port for the consul servers. If you choose to - # enable `server.exposeGossipAndRPCPorts` and `client.exposeGossipPorts`, - # that will configure the LAN gossip ports on the servers and clients to be - # hostPorts, so if you are running clients and servers on the same node the - # ports will conflict if they are both 8301. When you enable - # `server.exposeGossipAndRPCPorts` and `client.exposeGossipPorts`, you must - # change this from the default to an unused port on the host, e.g. 9301. By - # default the LAN gossip port is 8301 and configured as a containerPort on - # the consul server Pods. - serflan: - port: 8301 - - # This defines the disk size for configuring the - # servers' StatefulSet storage. For dynamically provisioned storage classes, this is the - # desired size. For manually defined persistent volumes, this should be set to - # the disk size of the attached volume. - storage: 10Gi - - # The StorageClass to use for the servers' StatefulSet storage. It must be - # able to be dynamically provisioned if you want the storage - # to be automatically created. For example, to use - # local(https://kubernetes.io/docs/concepts/storage/storage-classes/#local) - # storage classes, the PersistentVolumeClaims would need to be manually created. - # A `null` value will use the Kubernetes cluster's default StorageClass. If a default - # StorageClass does not exist, you will need to create one. - # Refer to the [Read/Write Tuning](https://developer.hashicorp.com/consul/docs/install/performance#read-write-tuning) - # section of the Server Performance Requirements documentation for considerations - # around choosing a performant storage class. - # - # ~> **Note:** The [Reference Architecture](https://developer.hashicorp.com/consul/tutorials/production-deploy/reference-architecture#hardware-sizing-for-consul-servers) - # contains best practices and recommendations for selecting suitable - # hardware sizes for your Consul servers. - # @type: string - storageClass: null - - # The [Persistent Volume Claim (PVC) retention policy](https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#persistentvolumeclaim-retention) - # controls if and how PVCs are deleted during the lifecycle of a StatefulSet. - # WhenDeleted specifies what happens to PVCs created from StatefulSet VolumeClaimTemplates when the StatefulSet is deleted, - # and WhenScaled specifies what happens to PVCs created from StatefulSet VolumeClaimTemplates when the StatefulSet is scaled down. - # - # Example: - # - # ```yaml - # persistentVolumeClaimRetentionPolicy: - # whenDeleted: Retain - # whenScaled: Retain - # ``` - # @type: map - persistentVolumeClaimRetentionPolicy: null - - # This will enable/disable [service mesh](https://developer.hashicorp.com/consul/docs/connect). Setting this to true - # _will not_ automatically secure pod communication, this - # setting will only enable usage of the feature. Consul will automatically initialize - # a new CA and set of certificates. Additional service mesh settings can be configured - # by setting the `server.extraConfig` value or by applying [configuration entries](https://developer.hashicorp.com/consul/docs/connect/config-entries). - connect: true - - # When set to true, enables Consul to report additional debugging information, including runtime profiling (pprof) data. - # This setting is only required for clusters without ACL enabled. Sets `enable_debug` in server agent config to `true`. - # If you change this setting, you must restart the agent for the change to take effect. Default is false. - # @type: boolean - enableAgentDebug: false - - serviceAccount: - # This value defines additional annotations for the server service account. This should be formatted as a multi-line - # string. - # - # ```yaml - # annotations: | - # "sample/annotation1": "foo" - # "sample/annotation2": "bar" - # ``` - # - # @type: string - annotations: null - - # The resource requests (CPU, memory, etc.) - # for each of the server agents. This should be a YAML map corresponding to a Kubernetes - # [`ResourceRequirements``](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.24/#resourcerequirements-v1-core) - # object. NOTE: The use of a YAML string is deprecated. - # - # Example: - # - # ```yaml - # resources: - # requests: - # memory: '200Mi' - # cpu: '100m' - # limits: - # memory: '200Mi' - # cpu: '100m' - # ``` - # - # @recurse: false - # @type: map - resources: - requests: - memory: "200Mi" - cpu: "100m" - limits: - memory: "200Mi" - cpu: "100m" - - # The security context for the server pods. This should be a YAML map corresponding to a - # Kubernetes [SecurityContext](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/) object. - # By default, servers will run as non-root, with user ID `100` and group ID `1000`, - # which correspond to the consul user and group created by the Consul docker image. - # Note: if running on OpenShift, this setting is ignored because the user and group are set automatically - # by the OpenShift platform. - # @type: map - # @recurse: false - securityContext: - runAsNonRoot: true - runAsGroup: 1000 - runAsUser: 100 - fsGroup: 1000 - - # The container securityContext for each container in the server pods. In - # addition to the Pod's SecurityContext this can - # set the capabilities of processes running in the container and ensure the - # root file systems in the container is read-only. - # @type: map - # @recurse: true - containerSecurityContext: - # The consul server agent container - # @type: map - # @recurse: false - server: null - # The acl-init job - # @type: map - # @recurse: false - aclInit: null - # The tls-init job - # @type: map - # @recurse: false - tlsInit: null - - # This value is used to carefully - # control a rolling update of Consul server agents. This value specifies the - # [partition](https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#partitions) - # for performing a rolling update. Please read the linked Kubernetes - # and [Upgrade Consul](https://developer.hashicorp.com/consul/docs/k8s/upgrade#upgrading-consul-servers) - # documentation for more information. - updatePartition: 0 - - # This configures the [`PodDisruptionBudget`](https://kubernetes.io/docs/tasks/run-application/configure-pdb/) - # for the server cluster. - disruptionBudget: - # Enables registering a PodDisruptionBudget for the server - # cluster. If enabled, it only registers the budget so long as - # the server cluster is enabled. To disable, set to `false`. - enabled: true - - # The maximum number of unavailable pods. In most cases you should not change this as it is automatically set to - # the correct number when left as null. This setting has been kept to preserve backwards compatibility. - # - # By default, this is set to 1 internally in the chart. When server pods are stopped gracefully, they leave the Raft - # consensus pool. When running an odd number of servers, one server leaving the pool does not change the quorum - # size, and so fault tolerance is not affected. However, if more than one server were to leave the pool, the quorum - # size would change. That's why this is set to 1 internally and should not be changed in most cases. - # - # If you need to set this to `0`, you will need to add a - # --set 'server.disruptionBudget.maxUnavailable=0'` flag to the helm chart installation - # command because of a limitation in the Helm templating language. - # @type: integer - maxUnavailable: null - - # A raw string of extra [JSON configuration](https://developer.hashicorp.com/consul/docs/agent/config/config-files) for Consul - # servers. This will be saved as-is into a ConfigMap that is read by the Consul - # server agents. This can be used to add additional configuration that - # isn't directly exposed by the chart. - # - # Example: - # - # ```yaml - # extraConfig: | - # { - # "log_level": "DEBUG" - # } - # ``` - # - # This can also be set using Helm's `--set` flag using the following syntax: - # - # ```shell-session - # --set 'server.extraConfig="{"log_level": "DEBUG"}"' - # ``` - extraConfig: | - {} - - # A list of extra volumes to mount for server agents. This - # is useful for bringing in extra data that can be referenced by other configurations - # at a well known path, such as TLS certificates or Gossip encryption keys. The - # value of this should be a list of objects. - # - # Example: - # - # ```yaml - # extraVolumes: - # - type: secret - # name: consul-certs - # load: false - # ``` - # - # Each object supports the following keys: - # - # - `type` - Type of the volume, must be one of "configMap" or "secret". Case sensitive. - # - # - `name` - Name of the configMap or secret to be mounted. This also controls - # the path that it is mounted to. The volume will be mounted to `/consul/userconfig/`. - # - # - `load` - If true, then the agent will be - # configured to automatically load HCL/JSON configuration files from this volume - # with `-config-dir`. This defaults to false. - # - # @type: array - extraVolumes: [] - - # A list of sidecar containers. - # Example: - # - # ```yaml - # extraContainers: - # - name: extra-container - # image: example-image:latest - # command: - # - ... - # ``` - # @type: array - extraContainers: [] - - # This value defines the [affinity](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity) - # for server pods. It defaults to allowing only a single server pod on each node, which - # minimizes risk of the cluster becoming unusable if a node is lost. If you need - # to run more pods per node (for example, testing on Minikube), set this value - # to `null`. - # - # Example: - # - # ```yaml - # affinity: | - # podAntiAffinity: - # requiredDuringSchedulingIgnoredDuringExecution: - # - labelSelector: - # matchLabels: - # app: {{ template "consul.name" . }} - # release: "{{ .Release.Name }}" - # component: server - # topologyKey: kubernetes.io/hostname - # ``` - affinity: | - podAntiAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchLabels: - app: {{ template "consul.name" . }} - release: "{{ .Release.Name }}" - component: server - topologyKey: kubernetes.io/hostname - - # Toleration settings for server pods. This - # should be a multi-line string matching the - # [Tolerations](https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/) - # array in a Pod spec. - tolerations: "" - - # Pod topology spread constraints for server pods. - # This should be a multi-line YAML string matching the - # [`topologySpreadConstraints`](https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/) - # array in a Pod Spec. - # - # This requires K8S >= 1.18 (beta) or 1.19 (stable). - # - # Example: - # - # ```yaml - # topologySpreadConstraints: | - # - maxSkew: 1 - # topologyKey: topology.kubernetes.io/zone - # whenUnsatisfiable: DoNotSchedule - # labelSelector: - # matchLabels: - # app: {{ template "consul.name" . }} - # release: "{{ .Release.Name }}" - # component: server - # ``` - topologySpreadConstraints: "" - - # This value defines [`nodeSelector`](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector) - # labels for server pod assignment, formatted as a multi-line string. - # - # Example: - # - # ```yaml - # nodeSelector: | - # beta.kubernetes.io/arch: amd64 - # ``` - # - # @type: string - nodeSelector: null - - # This value references an existing - # Kubernetes [`priorityClassName`](https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#pod-priority) - # that can be assigned to server pods. - priorityClassName: "" - - # Extra labels to attach to the server pods. This should be a YAML map. - # - # Example: - # - # ```yaml - # extraLabels: - # labelKey: label-value - # anotherLabelKey: another-label-value - # ``` - # - # @type: map - extraLabels: null - - # This value defines additional annotations for - # server pods. This should be formatted as a multi-line string. - # - # ```yaml - # annotations: | - # "sample/annotation1": "foo" - # "sample/annotation2": "bar" - # ``` - # - # @type: string - annotations: null - - # Configures a service to expose ports on the Consul servers over a Kubernetes Service. - exposeService: - # When enabled, deploys a Kubernetes Service to reach the Consul servers. - # @type: boolean - enabled: "-" - # Type of service, supports LoadBalancer or NodePort. - # @type: string - type: LoadBalancer - # If service is of type NodePort, configures the nodePorts. - nodePort: - # Configures the nodePort to expose the Consul server http port. - # @type: integer - http: null - # Configures the nodePort to expose the Consul server https port. - # @type: integer - https: null - # Configures the nodePort to expose the Consul server serf port. - # @type: integer - serf: null - # Configures the nodePort to expose the Consul server rpc port. - # @type: integer - rpc: null - # Configures the nodePort to expose the Consul server grpc port. - # @type: integer - grpc: null - # This value defines additional annotations for - # server pods. This should be formatted as a multi-line string. - # - # ```yaml - # annotations: | - # "sample/annotation1": "foo" - # "sample/annotation2": "bar" - # ``` - # - # @type: string - annotations: null - - # Server service properties. - service: - # Annotations to apply to the server service. - # - # ```yaml - # annotations: | - # "annotation-key": "annotation-value" - # ``` - # - # @type: string - annotations: null - - # A list of extra environment variables to set within the stateful set. - # These could be used to include proxy settings required for cloud auto-join - # feature, in case kubernetes cluster is behind egress http proxies. Additionally, - # it could be used to configure custom consul parameters. - # @type: map - extraEnvironmentVars: {} - - # [Enterprise Only] Values for setting up and running - # [snapshot agents](https://developer.hashicorp.com/consul/commands/snapshot/agent) - # within the Consul clusters. They run as a sidecar with Consul servers. - snapshotAgent: - # If true, the chart will install resources necessary to run the snapshot agent. - enabled: false - - # Interval at which to perform snapshots. - # Refer to [`interval`](https://developer.hashicorp.com/consul/commands/snapshot/agent#interval) - # @type: string - interval: 1h - - # A Kubernetes or Vault secret that should be manually created to contain the entire - # config to be used on the snapshot agent. - # This is the preferred method of configuration since there are usually storage - # credentials present. Please refer to the [Snapshot agent config](https://developer.hashicorp.com/consul/commands/snapshot/agent#config-file-options) - # for details. - configSecret: - # The name of the Kubernetes secret or Vault secret path that holds the snapshot agent config. - # @type: string - secretName: null - # The key within the Kubernetes secret or Vault secret key that holds the snapshot agent config. - # @type: string - secretKey: null - - # The resource settings for snapshot agent pods. - # @recurse: false - # @type: map - resources: - requests: - memory: "50Mi" - cpu: "50m" - limits: - memory: "50Mi" - cpu: "50m" - - # Optional PEM-encoded CA certificate that will be added to the trusted system CAs. - # Useful if using an S3-compatible storage exposing a self-signed certificate. - # - # Example: - # - # ```yaml - # caCert: | - # -----BEGIN CERTIFICATE----- - # MIIC7jCCApSgAwIBAgIRAIq2zQEVexqxvtxP6J0bXAwwCgYIKoZIzj0EAwIwgbkx - # ... - # ``` - # @type: string - caCert: null - - # A list of extra environment variables to set on the snapshot agent specifically. - # Use this parameter to configure credentials that the rest of the - # stateful set would not need access to, like `GOOGLE_APPLICATION_CREDENTIALS`. - # @type: map - extraEnvironmentVars: { } - - # A list of extra volumes to mount onto the snapshot agent. Use this block - # to include extra data that only the snapshot agent needs access - # to, such as storage credentials. This value should be a list of objects. - # - # Example: - # - # ```yaml - # extraVolumes: - # - type: secret - # name: storage-credentials - # ``` - # - # Each object supports the following keys: - # - # - `type` - Type of the volume. Must be one of `configMap` or `secret`. Case sensitive. - # - # - `name` - Name of the configMap or secret to mount. This specification also controls - # the path it mounts to. The volume will be mounted to `/consul/userconfig/`. - # - # The snapshot agent will not attempt to load any volumes passed in this stanza - # @type: array - extraVolumes: [ ] - - # [Enterprise Only] Added in Consul 1.8, the audit object allow users to enable auditing - # and configure a sink and filters for their audit logs. Please refer to - # [audit logs](https://developer.hashicorp.com/consul/docs/enterprise/audit-logging) documentation - # for further information. - auditLogs: - # Controls whether Consul logs out each time a user performs an operation. - # global.acls.manageSystemACLs must be enabled to use this feature. - enabled: false - - # A single entry of the sink object provides configuration for the destination to which Consul - # will log auditing events. - # - # Example: - # - # ```yaml - # sinks: - # - name: My Sink - # type: file - # format: json - # path: /tmp/audit.json - # delivery_guarantee: best-effort - # rotate_duration: 24h - # rotate_max_files: 15 - # rotate_bytes: 25165824 - # - # ``` - # - # The sink object supports the following keys: - # - # - `name` - Name of the sink. - # - # - `type` - Type specifies what kind of sink this is. Currently only file sinks are available - # - # - `format` - Format specifies what format the events will be emitted with. Currently only `json` - # events are emitted. - # - # - `path` - The directory and filename to write audit events to. - # - # - `delivery_guarantee` - Specifies the rules governing how audit events are written. Consul - # only supports `best-effort` event delivery. - # - # - `mode` - The permissions to set on the audit log files. - # - # - `rotate_duration` - Specifies the interval by which the system rotates to a new log file. - # At least one of `rotate_duration` or `rotate_bytes` must be configured to enable audit logging. - # - # - `rotate_bytes` - Specifies how large an individual log file can grow before Consul rotates to a new file. - # At least one of rotate_bytes or rotate_duration must be configured to enable audit logging. - # - # - `rotate_max_files` - Defines the limit that Consul should follow before it deletes old log files. - # - # @type: array - sinks: [] - - # Settings for potentially limiting timeouts, rate limiting on clients as well - # as servers, and other settings to limit exposure too many requests, requests - # waiting for too long, and other runtime considerations. - limits: - # This object specifies configurations that limit the rate of RPC and gRPC - # requests on the Consul server. Limiting the rate of gRPC and RPC requests - # also limits HTTP requests to the Consul server. - # https://developer.hashicorp.com/consul/docs/agent/config/config-files#request_limits - requestLimits: - # Setting for disabling or enabling rate limiting. If not disabled, it - # enforces the action that will occur when RequestLimitsReadRate - # or RequestLimitsWriteRate is exceeded. The default value of "disabled" will - # prevent any rate limiting from occuring. A value of "enforce" will block - # the request from processings by returning an error. A value of - # "permissive" will not block the request and will allow the request to - # continue processing. - # @type: string - mode: "disabled" - - # Setting that controls how frequently RPC, gRPC, and HTTP - # queries are allowed to happen. In any large enough time interval, rate - # limiter limits the rate to RequestLimitsReadRate tokens per second. - # - # See https://en.wikipedia.org/wiki/Token_bucket for more about token - # buckets. - # @type: integer - readRate: -1 - - # Setting that controls how frequently RPC, gRPC, and HTTP - # writes are allowed to happen. In any large enough time interval, rate - # limiter limits the rate to RequestLimitsWriteRate tokens per second. - # - # See https://en.wikipedia.org/wiki/Token_bucket for more about token - # buckets. - # @type: integer - writeRate: -1 - -# Configuration for Consul servers when the servers are running outside of Kubernetes. -# When running external servers, configuring these values is recommended -# if setting `global.tls.enableAutoEncrypt` to true -# or `global.acls.manageSystemACLs` to true. -externalServers: - # If true, the Helm chart will be configured to talk to the external servers. - # If setting this to true, you must also set `server.enabled` to false. - enabled: false - - # An array of external Consul server hosts that are used to make - # HTTPS connections from the components in this Helm chart. - # Valid values include an IP, a DNS name, or an [exec=](https://github.com/hashicorp/go-netaddrs) string. - # The port must be provided separately below. - # Note: This slice can only contain a single element. - # Note: If enabling clients, `client.join` must also be set to the hosts that should be - # used to join the cluster. In most cases, the `client.join` values - # should be the same, however, they may be different if you - # wish to use separate hosts for the HTTPS connections. `tlsServerName` is required if TLS is enabled and 'hosts' is not a DNS name. - # @type: array - hosts: [] - - # The HTTPS port of the Consul servers. - httpsPort: 8501 - - # The GRPC port of the Consul servers. - grpcPort: 8502 - - # The server name to use as the SNI host header when connecting with HTTPS. This name also appears as the hostname in the server certificate's subject field. - # @type: string - tlsServerName: null - - # If true, consul-k8s-control-plane components will ignore the CA set in - # `global.tls.caCert` when making HTTPS calls to Consul servers and - # will instead use the consul-k8s-control-plane image's system CAs for TLS verification. - # If false, consul-k8s-control-plane components will use `global.tls.caCert` when - # making HTTPS calls to Consul servers. - # **NOTE:** This does not affect Consul's internal RPC communication which will - # always use `global.tls.caCert`. - useSystemRoots: false - - # If you are setting `global.acls.manageSystemACLs` and - # `connectInject.enabled` to true, set `k8sAuthMethodHost` to the address of the Kubernetes API server. - # This address must be reachable from the Consul servers. - # Please refer to the [Kubernetes Auth Method documentation](https://developer.hashicorp.com/consul/docs/security/acl/auth-methods/kubernetes). - # - # If `global.federation.enabled` is set to true, `global.federation.k8sAuthMethodHost` and - # `externalServers.k8sAuthMethodHost` should be set to the same value. - # - # You could retrieve this value from your `kubeconfig` by running: - # - # ```shell-session - # $ kubectl config view \ - # -o jsonpath="{.clusters[?(@.name=='')].cluster.server}" - # ``` - # - # @type: string - k8sAuthMethodHost: null - - # If true, setting this prevents the consul-dataplane and consul-k8s components from watching the Consul servers for changes. This is - # useful for situations where Consul servers are behind a load balancer. - skipServerWatch: false - -# Values that configure running a Consul client on Kubernetes nodes. -client: - # If true, the chart will install all - # the resources necessary for a Consul client on every Kubernetes node. This _does not_ require - # `server.enabled`, since the agents can be configured to join an external cluster. - # @type: boolean - enabled: false - - # Override global log verbosity level. One of "trace", "debug", "info", "warn", or "error". - # @type: string - logLevel: "" - - # The name of the Docker image (including any tag) for the containers - # running Consul client agents. - # @type: string - image: null - - # A list of valid [`-retry-join` values](https://developer.hashicorp.com/consul/docs/agent/config/cli-flags#_retry_join). - # If this is `null` (default), then the clients will attempt to automatically - # join the server cluster running within Kubernetes. - # This means that with `server.enabled` set to true, clients will automatically - # join that cluster. If `server.enabled` is not true, then a value must be - # specified so the clients can join a valid cluster. - # @type: array - join: null - - # An absolute path to a directory on the host machine to use as the Consul - # client data directory. If set to the empty string or null, the Consul agent - # will store its data in the Pod's local filesystem (which will - # be lost if the Pod is deleted). Security Warning: If setting this, Pod Security - # Policies _must_ be enabled on your cluster and in this Helm chart (via the - # `global.enablePodSecurityPolicies` setting) to prevent other pods from - # mounting the same host path and gaining access to all of Consul's data. - # Consul's data is not encrypted at rest. - # @type: string - dataDirectoryHostPath: null - - # If true, agents will enable their GRPC listener on - # port 8502 and expose it to the host. This will use slightly more resources, but is - # required for Connect. - grpc: true - - # nodeMeta specifies an arbitrary metadata key/value pair to associate with the node - # (refer to [`-node-meta`](https://developer.hashicorp.com/consul/docs/agent/config/cli-flags#_node_meta)) - nodeMeta: - pod-name: ${HOSTNAME} - host-ip: ${HOST_IP} - - # If true, the Helm chart will expose the clients' gossip ports as hostPorts. - # This is only necessary if pod IPs in the k8s cluster are not directly routable - # and the Consul servers are outside of the k8s cluster. - # This also changes the clients' advertised IP to the `hostIP` rather than `podIP`. - exposeGossipPorts: false - - serviceAccount: - # This value defines additional annotations for the client service account. This should be formatted as a multi-line - # string. - # - # ```yaml - # annotations: | - # "sample/annotation1": "foo" - # "sample/annotation2": "bar" - # ``` - # - # @type: string - annotations: null - - # The resource settings for Client agents. - # NOTE: The use of a YAML string is deprecated. Instead, set directly as a - # YAML map. - # @recurse: false - # @type: map - resources: - requests: - memory: "100Mi" - cpu: "100m" - limits: - memory: "100Mi" - cpu: "100m" - - # The security context for the client pods. This should be a YAML map corresponding to a - # Kubernetes [SecurityContext](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/) object. - # By default, servers will run as non-root, with user ID `100` and group ID `1000`, - # which correspond to the consul user and group created by the Consul docker image. - # Note: if running on OpenShift, this setting is ignored because the user and group are set automatically - # by the OpenShift platform. - # @type: map - # @recurse: false - securityContext: - runAsNonRoot: true - runAsGroup: 1000 - runAsUser: 100 - fsGroup: 1000 - - # The container securityContext for each container in the client pods. In - # addition to the Pod's SecurityContext this can - # set the capabilities of processes running in the container and ensure the - # root file systems in the container is read-only. - # @type: map - # @recurse: true - containerSecurityContext: - # The consul client agent container - # @type: map - # @recurse: false - client: null - # The acl-init initContainer - # @type: map - # @recurse: false - aclInit: null - # The tls-init initContainer - # @type: map - # @recurse: false - tlsInit: null - - # A raw string of extra [JSON configuration](https://developer.hashicorp.com/consul/docs/agent/config/config-files) for Consul - # clients. This will be saved as-is into a ConfigMap that is read by the Consul - # client agents. This can be used to add additional configuration that - # isn't directly exposed by the chart. - # - # Example: - # - # ```yaml - # extraConfig: | - # { - # "log_level": "DEBUG" - # } - # ``` - # - # This can also be set using Helm's `--set` flag using the following syntax: - # - # ```shell-session - # --set 'client.extraConfig="{"log_level": "DEBUG"}"' - # ``` - extraConfig: | - {} - - # A list of extra volumes to mount for client agents. This - # is useful for bringing in extra data that can be referenced by other configurations - # at a well known path, such as TLS certificates or Gossip encryption keys. The - # value of this should be a list of objects. - # - # Example: - # - # ```yaml - # extraVolumes: - # - type: secret - # name: consul-certs - # load: false - # ``` - # - # Each object supports the following keys: - # - # - `type` - Type of the volume, must be one of "configMap" or "secret". Case sensitive. - # - # - `name` - Name of the configMap or secret to be mounted. This also controls - # the path that it is mounted to. The volume will be mounted to `/consul/userconfig/`. - # - # - `load` - If true, then the agent will be - # configured to automatically load HCL/JSON configuration files from this volume - # with `-config-dir`. This defaults to false. - # - # @type: array - extraVolumes: [] - - # A list of sidecar containers. - # Example: - # - # ```yaml - # extraContainers: - # - name: extra-container - # image: example-image:latest - # command: - # - ... - # ``` - # @type: array - extraContainers: [] - - # Toleration Settings for Client pods - # This should be a multi-line string matching the Toleration array - # in a PodSpec. - # The example below will allow Client pods to run on every node - # regardless of taints - # - # ```yaml - # tolerations: | - # - operator: Exists - # ``` - tolerations: "" - - # nodeSelector labels for client pod assignment, formatted as a multi-line string. - # ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector - # - # Example: - # - # ```yaml - # nodeSelector: | - # beta.kubernetes.io/arch: amd64 - # ``` - # @type: string - nodeSelector: null - - # Affinity Settings for Client pods, formatted as a multi-line YAML string. - # ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity - # - # Example: - # - # ```yaml - # affinity: | - # nodeAffinity: - # requiredDuringSchedulingIgnoredDuringExecution: - # nodeSelectorTerms: - # - matchExpressions: - # - key: node-role.kubernetes.io/master - # operator: DoesNotExist - # ``` - # @type: string - affinity: null - - # This value references an existing - # Kubernetes [`priorityClassName`](https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#pod-priority) - # that can be assigned to client pods. - priorityClassName: "" - - # This value defines additional annotations for - # client pods. This should be formatted as a multi-line string. - # - # ```yaml - # annotations: | - # "sample/annotation1": "foo" - # "sample/annotation2": "bar" - # ``` - # - # @type: string - annotations: null - - # Extra labels to attach to the client pods. This should be a regular YAML map. - # - # Example: - # - # ```yaml - # extraLabels: - # labelKey: label-value - # anotherLabelKey: another-label-value - # ``` - # - # @type: map - extraLabels: null - - # A list of extra environment variables to set within the stateful set. - # These could be used to include proxy settings required for cloud auto-join - # feature, in case kubernetes cluster is behind egress http proxies. Additionally, - # it could be used to configure custom consul parameters. - # @type: map - extraEnvironmentVars: {} - - # This value defines the [Pod DNS policy](https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pod-s-dns-policy) - # for client pods to use. - # @type: string - dnsPolicy: null - - # hostNetwork defines whether or not we use host networking instead of hostPort in the event - # that a CNI plugin doesn't support `hostPort`. This has security implications and is not recommended - # as doing so gives the consul client unnecessary access to all network traffic on the host. - # In most cases, pod network and host network are on different networks so this should be - # combined with `dnsPolicy: ClusterFirstWithHostNet` - hostNetwork: false - - # updateStrategy for the DaemonSet. - # Refer to the Kubernetes [Daemonset upgrade strategy](https://kubernetes.io/docs/tasks/manage-daemon/update-daemon-set/#daemonset-update-strategy) - # documentation. - # This should be a multi-line string mapping directly to the updateStrategy - # - # Example: - # - # ```yaml - # updateStrategy: | - # rollingUpdate: - # maxUnavailable: 5 - # type: RollingUpdate - # ``` - # - # @type: string - updateStrategy: null - -# Configuration for DNS configuration within the Kubernetes cluster. -# This creates a service that routes to all agents (client or server) -# for serving DNS requests. This DOES NOT automatically configure kube-dns -# today, so you must still manually configure a `stubDomain` with kube-dns -# for this to have any effect: -# https://kubernetes.io/docs/tasks/administer-cluster/dns-custom-nameservers/#configure-stub-domain-and-upstream-dns-servers -dns: - # @type: boolean - enabled: "-" - - # If true, services using Consul service mesh will use Consul DNS - # for default DNS resolution. The DNS lookups fall back to the nameserver IPs - # listed in /etc/resolv.conf if not found in Consul. - # @type: boolean - enableRedirection: "-" - - # Used to control the type of service created. For - # example, setting this to "LoadBalancer" will create an external load - # balancer (for supported K8S installations) - type: ClusterIP - - # Set a predefined cluster IP for the DNS service. - # Useful if you need to reference the DNS service's IP - # address in CoreDNS config. - # @type: string - clusterIP: null - - # Extra annotations to attach to the dns service - # This should be a multi-line string of - # annotations to apply to the dns Service - # @type: string - annotations: null - - # Additional ServiceSpec values - # This should be a multi-line string mapping directly to a Kubernetes - # ServiceSpec object. - # @type: string - additionalSpec: null - - # Configures dns-proxy deployment. - proxy: - # True if you want to enable dns-proxy - enabled: false - - # The number of deployment replicas. - replicas: 1 - - port: 53 - - # Refers to an existing Kubernetes secret that contains an ACL token - # for your Consul cluster. This token provides permissions for the DNS - # proxy. This field is required when `global.acls.manageSystemACLs` - # is set to `false` to enable manual ACL management in a Consul cluster. - # node_prefix "" { - # policy = "read" - # } - # service_prefix "" { - # policy = "read" - # } - aclToken: - # The name of the Kubernetes secret that holds the ACL token. - # @type: string - secretName: null - # The key within the Kubernetes secret that holds the ACL token. - # @type: string - secretKey: null - -# Values that configure the Consul UI. -ui: - # If true, the UI will be enabled. This will - # only _enable_ the UI, it doesn't automatically register any service for external - # access. The UI will only be enabled on server agents. If `server.enabled` is - # false, then this setting has no effect. To expose the UI in some way, you must - # configure `ui.service`. - # @default: global.enabled - # @type: boolean - enabled: "-" - - # Configure the service for the Consul UI. - service: - # This will enable/disable registering a - # Kubernetes Service for the Consul UI. This value only takes effect if `ui.enabled` is - # true and taking effect. - enabled: true - - # The service type to register. - # @type: string - type: null - - # Set the port value of the UI service. - port: - # HTTP port. - http: 80 - - # HTTPS port. - https: 443 - - # Optionally set the nodePort value of the ui service if using a NodePort service. - # If not set and using a NodePort service, Kubernetes will automatically assign - # a port. - nodePort: - # HTTP node port - # @type: integer - http: null - - # HTTPS node port - # @type: integer - https: null - - # Annotations to apply to the UI service. - # - # Example: - # - # ```yaml - # annotations: | - # 'annotation-key': annotation-value - # ``` - # @type: string - annotations: null - - # Additional ServiceSpec values - # This should be a multi-line string mapping directly to a Kubernetes - # ServiceSpec object. - # @type: string - additionalSpec: null - - # Configure Ingress for the Consul UI. - # If `global.tls.enabled` is set to `true`, the Ingress will expose - # the port 443 on the UI service. Please ensure the Ingress Controller - # supports SSL pass-through and it is enabled to ensure traffic forwarded - # to port 443 has not been TLS terminated. - ingress: - # This will create an Ingress resource for the Consul UI. - # @type: boolean - enabled: false - - # Optionally set the ingressClassName. - ingressClassName: "" - - # pathType override - refer to: https://kubernetes.io/docs/concepts/services-networking/ingress/#path-types - pathType: Prefix - - # hosts is a list of host name to create Ingress rules. - # - # ```yaml - # hosts: - # - host: foo.bar - # paths: - # - /example - # - /test - # ``` - # - # @type: array - hosts: [] - - # tls is a list of hosts and secret name in an Ingress - # which tells the Ingress controller to secure the channel. - # - # ```yaml - # tls: - # - hosts: - # - chart-example.local - # secretName: testsecret-tls - # ``` - # @type: array - tls: [] - - # Annotations to apply to the UI ingress. - # - # Example: - # - # ```yaml - # annotations: | - # 'annotation-key': annotation-value - # ``` - # @type: string - annotations: null - - # Configurations for displaying metrics in the UI. - metrics: - # Enable displaying metrics in the UI. The default value of "-" - # will inherit from `global.metrics.enabled` value. - # @type: boolean - # @default: global.metrics.enabled - enabled: "-" - # Provider for metrics. Refer to - # [`metrics_provider`](https://developer.hashicorp.com/consul/docs/agent/config/config-files#ui_config_metrics_provider) - # This value is only used if `ui.enabled` is set to true. - # @type: string - provider: "prometheus" - - # baseURL is the URL of the prometheus server, usually the service URL. - # This value is only used if `ui.enabled` is set to true. - # @type: string - baseURL: http://prometheus-server - - # Corresponds to [`dashboard_url_templates`](https://developer.hashicorp.com/consul/docs/agent/config/config-files#ui_config_dashboard_url_templates) - # configuration. - dashboardURLTemplates: - # Sets [`dashboardURLTemplates.service`](https://developer.hashicorp.com/consul/docs/agent/config/config-files#ui_config_dashboard_url_templates_service). - service: "" - -# Configure the catalog sync process to sync K8S with Consul -# services. This can run bidirectional (default) or unidirectionally (Consul -# to K8S or K8S to Consul only). -# -# This process assumes that a Consul agent is available on the host IP. -# This is done automatically if clients are enabled. If clients are not -# enabled then set the node selection so that it chooses a node with a -# Consul agent. -syncCatalog: - # True if you want to enable the catalog sync. Set to "-" to inherit from - # global.enabled. - enabled: false - - # True if you want to deregister all services in this cluster from consul that have been registered by the catalog sync when the `enabled` flag is set to false. - # @type: boolean - cleanupNodeOnRemoval: false - - # The name of the Docker image (including any tag) for consul-k8s-control-plane - # to run the sync program. - # @type: string - image: null - - # If true, all valid services in K8S are - # synced by default. If false, the service must be [annotated](https://developer.hashicorp.com/consul/docs/k8s/service-sync#enable-and-disable-sync) - # properly to sync. - # In either case an annotation can override the default. - default: true - - # Optional priorityClassName. - priorityClassName: "" - - # If true, will sync Kubernetes services to Consul. This can be disabled to - # have a one-way sync. - toConsul: true - - # If true, will sync Consul services to Kubernetes. This can be disabled to - # have a one-way sync. - toK8S: true - - # Service prefix to prepend to services before registering - # with Kubernetes. For example "consul-" will register all services - # prepended with "consul-". (Consul -> Kubernetes sync) - # @type: string - k8sPrefix: null - - # List of k8s namespaces to sync the k8s services from. - # If a k8s namespace is not included in this list or is listed in `k8sDenyNamespaces`, - # services in that k8s namespace will not be synced even if they are explicitly - # annotated. Use `["*"]` to automatically allow all k8s namespaces. - # - # For example, `["namespace1", "namespace2"]` will only allow services in the k8s - # namespaces `namespace1` and `namespace2` to be synced and registered - # with Consul. All other k8s namespaces will be ignored. - # - # To deny all namespaces, set this to `[]`. - # - # Note: `k8sDenyNamespaces` takes precedence over values defined here. - # @type: array - k8sAllowNamespaces: ["*"] - - # List of k8s namespaces that should not have their - # services synced. This list takes precedence over `k8sAllowNamespaces`. - # `*` is not supported because then nothing would be allowed to sync. - # - # For example, if `k8sAllowNamespaces` is `["*"]` and `k8sDenyNamespaces` is - # `["namespace1", "namespace2"]`, then all k8s namespaces besides `namespace1` - # and `namespace2` will be synced. - # @type: array - k8sDenyNamespaces: ["kube-system", "kube-public"] - - # [DEPRECATED] Use k8sAllowNamespaces and k8sDenyNamespaces instead. For - # backwards compatibility, if both this and the allow/deny lists are set, - # the allow/deny lists will be ignored. - # k8sSourceNamespace is the Kubernetes namespace to watch for service - # changes and sync to Consul. If this is not set then it will default - # to all namespaces. - # @type: string - k8sSourceNamespace: null - - # [Enterprise Only] These settings manage the catalog sync's interaction with - # Consul namespaces (requires consul-ent v1.7+). - # Also, `global.enableConsulNamespaces` must be true. - consulNamespaces: - # Name of the Consul namespace to register all - # k8s services into. If the Consul namespace does not already exist, - # it will be created. This will be ignored if `mirroringK8S` is true. - consulDestinationNamespace: "default" - - # If true, k8s services will be registered into a Consul namespace - # of the same name as their k8s namespace, optionally prefixed if - # `mirroringK8SPrefix` is set below. If the Consul namespace does not - # already exist, it will be created. Turning this on overrides the - # `consulDestinationNamespace` setting. - # `addK8SNamespaceSuffix` may no longer be needed if enabling this option. - # If mirroring is enabled, avoid creating any Consul resources in the following - # Kubernetes namespaces, as Consul currently reserves these namespaces for - # system use: "system", "universal", "operator", "root". - mirroringK8S: true - - # If `mirroringK8S` is set to true, `mirroringK8SPrefix` allows each Consul namespace - # to be given a prefix. For example, if `mirroringK8SPrefix` is set to "k8s-", a - # service in the k8s `staging` namespace will be registered into the - # `k8s-staging` Consul namespace. - mirroringK8SPrefix: "" - - # Appends Kubernetes namespace suffix to - # each service name synced to Consul, separated by a dash. - # For example, for a service 'foo' in the default namespace, - # the sync process will create a Consul service named 'foo-default'. - # Set this flag to true to avoid registering services with the same name - # but in different namespaces as instances for the same Consul service. - # Namespace suffix is not added if 'annotationServiceName' is provided. - addK8SNamespaceSuffix: true - - # Service prefix which prepends itself - # to Kubernetes services registered within Consul - # For example, "k8s-" will register all services prepended with "k8s-". - # (Kubernetes -> Consul sync) - # consulPrefix is ignored when 'annotationServiceName' is provided. - # NOTE: Updating this property to a non-null value for an existing installation will result in deregistering - # of existing services in Consul and registering them with a new name. - # @type: string - consulPrefix: null - - # Optional tag that is applied to all of the Kubernetes services - # that are synced into Consul. If nothing is set, defaults to "k8s". - # (Kubernetes -> Consul sync) - # @type: string - k8sTag: null - - # Defines the Consul synthetic node that all services - # will be registered to. - # NOTE: Changing the node name and upgrading the Helm chart will leave - # all of the previously sync'd services registered with Consul and - # register them again under the new Consul node name. The out-of-date - # registrations will need to be explicitly removed. - consulNodeName: "k8s-sync" - - # Syncs services of the ClusterIP type, which may - # or may not be broadly accessible depending on your Kubernetes cluster. - # Set this to false to skip syncing ClusterIP services. - syncClusterIPServices: true - - # If true, LoadBalancer service endpoints instead of ingress addresses will be synced to Consul. - # If false, LoadBalancer endpoints are not synced to Consul. - syncLoadBalancerEndpoints: false - - # Metrics settings for syncCatalog - metrics: - # This value enables or disables metrics collection for registered services, overriding the global metrics collection settings. - # @type: boolean - enabled: false - # This value sets the port to use for scraping syncCatalog metrics via prometheus, defaults to 20300 if not set. Must be in the port - # range of 1024-65535. - # @type: int - port: null - # This value sets the path to use for scraping syncCatalog metrics via prometheus, defaults to /metrics if not set. - # @type: string - path: null - - ingress: - # Syncs the hostname from a Kubernetes Ingress resource to service registrations - # when a rule matched a service. Currently only supports host based routing and - # not path based routing. The only supported path on an ingress rule is "/". - # Set this to false to skip syncing Ingress services. - # - # Currently, port 80 is synced if there is not TLS entry for the hostname. Syncs the port - # 443 if there is a TLS entry that matches the hostname. - enabled: false - # Requires syncIngress to be `true`. syncs the LoadBalancer IP from a Kubernetes Ingress - # resource instead of the hostname to service registrations when a rule matched a service. - loadBalancerIPs: false - - # Configures the type of syncing that happens for NodePort - # services. The valid options are: ExternalOnly, InternalOnly, ExternalFirst. - # - # - ExternalOnly will only use a node's ExternalIP address for the sync - # - InternalOnly use's the node's InternalIP address - # - ExternalFirst will preferentially use the node's ExternalIP address, but - # if it doesn't exist, it will use the node's InternalIP address instead. - nodePortSyncType: ExternalFirst - - # Refers to a Kubernetes secret that you have created that contains - # an ACL token for your Consul cluster which allows the sync process the correct - # permissions. This is only needed if ACLs are managed manually within the Consul cluster, i.e. `global.acls.manageSystemACLs` is `false`. - aclSyncToken: - # The name of the Kubernetes secret that holds the acl sync token. - # @type: string - secretName: null - # The key within the Kubernetes secret that holds the acl sync token. - # @type: string - secretKey: null - - # This value defines [`nodeSelector`](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector) - # labels for catalog sync pod assignment, formatted as a multi-line string. - # - # Example: - # - # ```yaml - # nodeSelector: | - # beta.kubernetes.io/arch: amd64 - # ``` - # - # @type: string - nodeSelector: null - - # Affinity Settings - # This should be a multi-line string matching the affinity object - # @type: string - affinity: null - - # Toleration Settings - # This should be a multi-line string matching the Toleration array - # in a PodSpec. - # @type: string - tolerations: null - - serviceAccount: - # This value defines additional annotations for the mesh gateways' service account. This should be formatted as a - # multi-line string. - # - # ```yaml - # annotations: | - # "sample/annotation1": "foo" - # "sample/annotation2": "bar" - # ``` - # - # @type: string - annotations: null - - # The resource settings for sync catalog pods. - # @recurse: false - # @type: map - resources: - requests: - memory: "50Mi" - cpu: "50m" - limits: - memory: "50Mi" - cpu: "50m" - - # Override global log verbosity level. One of "debug", "info", "warn", or "error". - # @type: string - logLevel: "" - - # Override the default interval to perform syncing operations creating Consul services. - # @type: string - consulWriteInterval: null - - # Extra labels to attach to the sync catalog pods. This should be a YAML map. - # - # Example: - # - # ```yaml - # extraLabels: - # labelKey: label-value - # anotherLabelKey: another-label-value - # ``` - # - # @type: map - extraLabels: null - - # This value defines additional annotations for - # the catalog sync pods. This should be formatted as a multi-line string. - # - # ```yaml - # annotations: | - # "sample/annotation1": "foo" - # "sample/annotation2": "bar" - # ``` - # - # @type: string - annotations: null - - - -# Configures the automatic Connect sidecar injector. -connectInject: - # True if you want to enable connect injection. Set to "-" to inherit from - # global.enabled. - enabled: true - - # The number of deployment replicas. - replicas: 1 - - # Image for consul-k8s-control-plane that contains the injector. - # @type: string - image: null - - # If true, the injector will inject the - # Connect sidecar into all pods by default. Otherwise, pods must specify the - # [injection annotation](https://developer.hashicorp.com/consul/docs/k8s/connect#consul-hashicorp-com-connect-inject) - # to opt-in to Connect injection. If this is true, pods can use the same annotation - # to explicitly opt-out of injection. - default: false - - # Configures Transparent Proxy for Consul Service mesh services. - # Using this feature requires Consul 1.10.0-beta1+. - transparentProxy: - # If true, then all Consul Service mesh will run with transparent proxy enabled by default, - # i.e. we enforce that all traffic within the pod will go through the proxy. - # This value is overridable via the "consul.hashicorp.com/transparent-proxy" pod annotation. - defaultEnabled: true - - # If true, we will overwrite Kubernetes HTTP probes of the pod to point to the Envoy proxy instead. - # This setting is recommended because with traffic being enforced to go through the Envoy proxy, - # the probes on the pod will fail because kube-proxy doesn't have the right certificates - # to talk to Envoy. - # This value is also overridable via the "consul.hashicorp.com/transparent-proxy-overwrite-probes" annotation. - # Note: This value has no effect if transparent proxy is disabled on the pod. - defaultOverwriteProbes: true - - # This configures the [`PodDisruptionBudget`](https://kubernetes.io/docs/tasks/run-application/configure-pdb/) - # for the service mesh sidecar injector. - disruptionBudget: - # This will enable/disable registering a PodDisruptionBudget for the - # service mesh sidecar injector. If this is enabled, it will only register the budget so long as - # the service mesh is enabled. - enabled: true - - # The maximum number of unavailable pods. By default, this will be - # automatically computed based on the `connectInject.replicas` value to be `(n/2)-1`. - # If you need to set this to `0`, you will need to add a - # --set 'connectInject.disruptionBudget.maxUnavailable=0'` flag to the helm chart installation - # command because of a limitation in the Helm templating language. - # @type: integer - maxUnavailable: null - - # The minimum number of available pods. - # Takes precedence over maxUnavailable if set. - # @type: integer - minAvailable: null - - # Configuration settings for the Consul API Gateway integration. - apiGateway: - # Enables Consul on Kubernetes to manage the CRDs used for Gateway API. - # Setting this to true will install the CRDs used for the Gateway API when Consul on Kubernetes is installed. - # These CRDs can clash with existing Gateway API CRDs if they are already installed in your cluster. - # If this setting is false, you will need to install the Gateway API CRDs manually. - manageExternalCRDs: true - - # Enables Consul on Kubernets to manage only the non-standard CRDs used for Gateway API. If manageExternalCRDs is true - # then all CRDs will be installed; otherwise, if manageNonStandardCRDs is true then only TCPRoute, GatewayClassConfig and MeshService - # will be installed. - manageNonStandardCRDs: false - - # Configuration settings for the GatewayClass installed by Consul on Kubernetes. - managedGatewayClass: - # This value defines [`nodeSelector`](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector) - # labels for gateway pod assignment, formatted as a multi-line string. - # - # Example: - # - # ```yaml - # nodeSelector: | - # beta.kubernetes.io/arch: amd64 - # ``` - # - # @type: string - nodeSelector: null - - # Toleration settings for gateway pods created with the managed gateway class. - # This should be a multi-line string matching the - # [Tolerations](https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/) array in a Pod spec. - # - # @type: string - tolerations: null - - # This value defines the type of Service created for gateways (e.g. LoadBalancer, ClusterIP) - serviceType: LoadBalancer - - # Configuration settings for annotations to be copied from the Gateway to other child resources. - copyAnnotations: - # This value defines a list of annotations to be copied from the Gateway to the Service created, formatted as a multi-line string. - # - # Example: - # - # ```yaml - # service: - # annotations: | - # - external-dns.alpha.kubernetes.io/hostname - # ``` - # - # @type: string - service: null - - # Metrics settings for gateways created with this gateway class configuration. - metrics: - # This value enables or disables metrics collection on a gateway, overriding the global gateway metrics collection settings. - # @type: boolean - enabled: "-" - # This value sets the port to use for scraping gateway metrics via prometheus, defaults to 20200 if not set. Must be in the port - # range of 1024-65535. - # @type: int - port: null - # This value sets the path to use for scraping gateway metrics via prometheus, defaults to /metrics if not set. - # @type: string - path: null - - # The resource settings for Pods handling traffic for Gateway API. - # @recurse: false - # @type: map - resources: - requests: - memory: "100Mi" - cpu: "100m" - limits: - memory: "100Mi" - cpu: "100m" - - # This value defines the number of pods to deploy for each Gateway as well as a min and max number of pods for all Gateways - deployment: - defaultInstances: 1 - maxInstances: 1 - minInstances: 1 - - # The name of the OpenShift SecurityContextConstraints resource to use for Gateways. - # Only applicable if `global.openshift.enabled` is true. - # @type: string - openshiftSCCName: "restricted-v2" - - # This value defines the amount we will add to privileged container ports on gateways that use this class. - # This is useful if you don't want to give your containers extra permissions to run privileged ports. - # Example: The gateway listener is defined on port 80, but the underlying value of the port on the container - # will be the 80 + the number defined below. - mapPrivilegedContainerPorts: 0 - - # This value contains settings related to the gateway_resources_job that runs on helm install - resourceJob: - # The resource requests (CPU, memory, etc.) for the server-acl-init and server-acl-init-cleanup pods. - # This should be a YAML map corresponding to a Kubernetes - # [`ResourceRequirements``](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.27/#resourcerequirements-v1-core) - # object. - # - # Example: - # - # ```yaml - # resources: - # requests: - # memory: '200Mi' - # cpu: '100m' - # limits: - # memory: '200Mi' - # cpu: '100m' - # ``` - # - # @recurse: false - # @type: map - resources: - requests: - memory: "50Mi" - cpu: "50m" - limits: - memory: "50Mi" - cpu: "50m" - - # Configuration for the ServiceAccount created for the api-gateway component - serviceAccount: - # This value defines additional annotations for the client service account. This should be formatted as a multi-line - # string. - # - # ```yaml - # annotations: | - # "sample/annotation1": "foo" - # "sample/annotation2": "bar" - # ``` - # - # @type: string - annotations: null - - # Configures consul-cni plugin for Consul Service mesh services - cni: - # If true, then all traffic redirection setup uses the consul-cni plugin. - # Requires connectInject.enabled to also be true. - # @type: boolean - enabled: false - - # If true, then use projected service account tokens for the CNI plugin and - # Uses auto-rotated projected token everytime when interacting with Kubernetes API. - # @type: boolean - autorotateToken: false - - # Set the CNI plugin ServiceAccount token validity period. Applicable only when autorotateToken is true. - # In some environments this may not work(eg. azure 1.30+ with oidc enabled) as providers may have native expiration limits. - # Optional and setup to 1 hour by default. Value is in seconds. - # @type: Integer - tokenExpiration: 3600 - - # Log level for the installer and plugin. Overrides global.logLevel. One of "trace", "debug", "info", "warn", or "error". - # @type: string - logLevel: null - - # Set the namespace to install the CNI plugin into. Overrides global namespace settings for CNI resources. - # Ex: "kube-system" - # @type: string - namespace: null - - # Location on the kubernetes node where the CNI plugin is installed. Shoud be the absolute path and start with a '/' - # Example on GKE: - # - # ```yaml - # cniBinDir: "/home/kubernetes/bin" - # ``` - # @type: string - cniBinDir: "/opt/cni/bin" - - # Location on the kubernetes node of all CNI configuration. Should be the absolute path and start with a '/' - # @type: string - cniNetDir: "/etc/cni/net.d" - - # If multus CNI plugin is enabled with consul-cni. When enabled, consul-cni will not be installed as a chained - # CNI plugin. Instead, a NetworkAttachementDefinition CustomResourceDefinition (CRD) will be created in the helm - # release namespace. Following multus plugin standards, an annotation is required in order for the consul-cni plugin - # to be executed and for your service to be added to the Consul Service Mesh. - # - # Add the annotation `'k8s.v1.cni.cncf.io/networks': '[{ "name":"consul-cni","namespace": "consul" }]'` to your pod - # to use the default installed NetworkAttachementDefinition CRD. - # - # Please refer to the [Multus Quickstart Guide](https://github.com/k8snetworkplumbingwg/multus-cni/blob/master/docs/quickstart.md) - # for more information about using multus. - # @type: string - multus: false - - # The resource settings for CNI installer daemonset. - # @recurse: false - # @type: map - resources: - requests: - memory: "75Mi" - cpu: "75m" - limits: - memory: "100Mi" - cpu: "100m" - - # Resource quotas for running the daemonset as system critical pods - resourceQuota: - pods: 5000 - - # The security context for the CNI installer daemonset. This should be a YAML map corresponding to a - # Kubernetes [SecurityContext](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/) object. - # By default, servers will run as root, with user ID `0` and group ID `0`. - # Note: if running on OpenShift, this setting is ignored because the user and group are set automatically - # by the OpenShift platform. - # @type: map - # @recurse: false - securityContext: - runAsNonRoot: false - runAsGroup: 0 - runAsUser: 0 - - consulNode: - # meta specifies an arbitrary metadata key/value pair to associate with the node. - # - # Example: - # - # ```yaml - # meta: - # cluster: test-cluster - # persistent: true - # ``` - # - # @type: map - meta: null - - # Configures metrics for Consul service mesh services. All values are overridable - # via annotations on a per-pod basis. - metrics: - # If true, the connect-injector will automatically - # add prometheus annotations to connect-injected pods. It will also - # add a listener on the Envoy sidecar to expose metrics. The exposed - # metrics will depend on whether metrics merging is enabled: - # - If metrics merging is enabled: - # the consul-dataplane will run a merged metrics server - # combining Envoy sidecar and Connect service metrics, - # i.e. if your service exposes its own Prometheus metrics. - # - If metrics merging is disabled: - # the listener will just expose Envoy sidecar metrics. - # This will inherit from `global.metrics.enabled`. - defaultEnabled: "-" - # Configures the consul-dataplane to run a merged metrics server - # to combine and serve both Envoy and Connect service metrics. - # This feature is available only in Consul v1.10.0 or greater. - defaultEnableMerging: false - # Configures the port at which the consul-dataplane will listen on to return - # combined metrics. This port only needs to be changed if it conflicts with - # the application's ports. - defaultMergedMetricsPort: 20100 - # Configures the port Prometheus will scrape metrics from, by configuring - # the Pod annotation `prometheus.io/port` and the corresponding listener in - # the Envoy sidecar. - # NOTE: This is *not* the port that your application exposes metrics on. - # That can be configured with the - # `consul.hashicorp.com/service-metrics-port` annotation. - defaultPrometheusScrapePort: 20200 - # Configures the path Prometheus will scrape metrics from, by configuring the pod - # annotation `prometheus.io/path` and the corresponding handler in the Envoy - # sidecar. - # NOTE: This is *not* the path that your application exposes metrics on. - # That can be configured with the - # `consul.hashicorp.com/service-metrics-path` annotation. - defaultPrometheusScrapePath: "/metrics" - - # Used to pass arguments to the injected envoy sidecar. - # Valid arguments to pass to envoy can be found here: https://www.envoyproxy.io/docs/envoy/latest/operations/cli - # e.g "--log-level debug --disable-hot-restart" - # @type: string - envoyExtraArgs: null - - # Optional priorityClassName. - priorityClassName: "" - - # Extra labels to attach to the connect inject pods. This should be a YAML map. - # - # Example: - # - # ```yaml - # extraLabels: - # labelKey: label-value - # anotherLabelKey: another-label-value - # ``` - # - # @type: map - extraLabels: null - - # This value defines additional annotations for - # connect inject pods. This should be formatted as a multi-line string. - # - # ```yaml - # annotations: | - # "sample/annotation1": "foo" - # "sample/annotation2": "bar" - # ``` - # - # @type: string - annotations: null - - # The Docker image for Consul to use when performing Connect injection. - # Defaults to global.image. - # @type: string - imageConsul: null - - # Sets the `logLevel` for the `consul-dataplane` sidecar and the `consul-connect-inject-init` container. When set, this value overrides the global log verbosity level. One of "debug", "info", "warn", or "error". - # @type: string - logLevel: "" - - serviceAccount: - # This value defines additional annotations for the injector service account. This should be formatted as a - # multi-line string. - # - # ```yaml - # annotations: | - # "sample/annotation1": "foo" - # "sample/annotation2": "bar" - # ``` - # - # @type: string - annotations: null - - # The resource settings for connect inject pods. The defaults, are optimized for getting started worklows on developer deployments. The settings should be tweaked for production deployments. - # @type: map - resources: - requests: - # Recommended production default: 500Mi - # @type: string - memory: "200Mi" - # Recommended production default: 250m - # @type: string - cpu: "50m" - limits: - # Recommended production default: 500Mi - # @type: string - memory: "200Mi" - # Recommended production default: 250m - # @type: string - cpu: "50m" - - # Sets the failurePolicy for the mutating webhook. By default this will cause pods not part of the consul installation to fail scheduling while the webhook - # is offline. This prevents a pod from skipping mutation if the webhook were to be momentarily offline. - # Once the webhook is back online the pod will be scheduled. - # In some environments such as Kind this may have an undesirable effect as it may prevent volume provisioner pods from running - # which can lead to hangs. In these environments it is recommend to use "Ignore" instead. - # This setting can be safely disabled by setting to "Ignore". - failurePolicy: "Fail" - - # Selector for restricting the webhook to only specific namespaces. - # Use with `connectInject.default: true` to automatically inject all pods in namespaces that match the selector. This should be set to a multiline string. - # Refer to https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/#matching-requests-namespaceselector - # for more details. - # - # By default, we exclude kube-system since usually users won't - # want those pods injected and local-path-storage and openebs so that - # Kind (Kubernetes In Docker) and [OpenEBS](https://openebs.io/) respectively can provision Pods used to create PVCs. - # We also exclude gmp-system and gke-managed-cim namespaces that are used by GKE for managing the cluster. - # Note that this exclusion is only supported in Kubernetes v1.21.1+. - # - # Example: - # - # ```yaml - # namespaceSelector: | - # matchLabels: - # namespace-label: label-value - # ``` - # @type: string - namespaceSelector: | - matchExpressions: - - key: "kubernetes.io/metadata.name" - operator: "NotIn" - values: ["kube-system","local-path-storage","openebs","gmp-system","gke-managed-cim"] - - # List of k8s namespaces to allow Connect sidecar - # injection in. If a k8s namespace is not included or is listed in `k8sDenyNamespaces`, - # pods in that k8s namespace will not be injected even if they are explicitly - # annotated. Use `["*"]` to automatically allow all k8s namespaces. - # - # For example, `["namespace1", "namespace2"]` will only allow pods in the k8s - # namespaces `namespace1` and `namespace2` to have Consul service mesh sidecars injected - # and registered with Consul. All other k8s namespaces will be ignored. - # - # To deny all namespaces, set this to `[]`. - # - # Note: `k8sDenyNamespaces` takes precedence over values defined here and - # `namespaceSelector` takes precedence over both since it is applied first. - # `kube-system` and `kube-public` are never injected, even if included here. - # @type: array - k8sAllowNamespaces: ["*"] - - # List of k8s namespaces that should not allow Connect - # sidecar injection. This list takes precedence over `k8sAllowNamespaces`. - # `*` is not supported because then nothing would be allowed to be injected. - # - # For example, if `k8sAllowNamespaces` is `["*"]` and k8sDenyNamespaces is - # `["namespace1", "namespace2"]`, then all k8s namespaces besides "namespace1" - # and "namespace2" will be available for injection. - # - # Note: `namespaceSelector` takes precedence over this since it is applied first. - # `kube-system` and `kube-public` are never injected. - # @type: array - k8sDenyNamespaces: [] - - # [Enterprise Only] These settings manage the connect injector's interaction with - # Consul namespaces (requires consul-ent v1.7+). - # Also, `global.enableConsulNamespaces` must be true. - consulNamespaces: - # Name of the Consul namespace to register all - # k8s pods into. If the Consul namespace does not already exist, - # it will be created. This will be ignored if `mirroringK8S` is true. - consulDestinationNamespace: "default" - - # Causes k8s pods to be registered into a Consul namespace - # of the same name as their k8s namespace, optionally prefixed if - # `mirroringK8SPrefix` is set below. If the Consul namespace does not - # already exist, it will be created. Turning this on overrides the - # `consulDestinationNamespace` setting. If mirroring is enabled, avoid creating any Consul - # resources in the following Kubernetes namespaces, as Consul currently reserves these - # namespaces for system use: "system", "universal", "operator", "root". - mirroringK8S: true - - # If `mirroringK8S` is set to true, `mirroringK8SPrefix` allows each Consul namespace - # to be given a prefix. For example, if `mirroringK8SPrefix` is set to "k8s-", a - # pod in the k8s `staging` namespace will be registered into the - # `k8s-staging` Consul namespace. - mirroringK8SPrefix: "" - - # Selector labels for connectInject pod assignment, formatted as a multi-line string. - # ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector - # - # Example: - # - # ```yaml - # nodeSelector: | - # beta.kubernetes.io/arch: amd64 - # ``` - # @type: string - nodeSelector: null - - # Affinity Settings - # This should be a multi-line string matching the affinity object - # @type: string - affinity: null - - # Toleration Settings - # This should be a multi-line string matching the Toleration array - # in a PodSpec. - # @type: string - tolerations: null - - # Query that defines which Service Accounts - # can authenticate to Consul and receive an ACL token during Connect injection. - # The default setting, i.e. serviceaccount.name!=default, prevents the - # 'default' Service Account from logging in. - # If set to an empty string all service accounts can log in. - # This only has effect if ACLs are enabled. - # - # Refer to Auth methods [Binding rules](https://developer.hashicorp.com/consul/docs/security/acl/auth-methods#binding-rules) - # and [Trusted identiy attributes](https://developer.hashicorp.com/consul/docs/security/acl/auth-methods/kubernetes#trusted-identity-attributes) - # for more details. - # Requires Consul >= v1.5. - aclBindingRuleSelector: "serviceaccount.name!=default" - - # If you are not using global.acls.manageSystemACLs and instead manually setting up an - # auth method for Connect inject, set this to the name of your auth method. - overrideAuthMethodName: "" - - # Refers to a Kubernetes secret that you have created that contains - # an ACL token for your Consul cluster which allows the Connect injector the correct - # permissions. This is only needed if Consul namespaces [Enterprise Only] and ACLs - # are enabled on the Consul cluster and you are not setting - # `global.acls.manageSystemACLs` to `true`. - # This token needs to have `operator = "write"` privileges to be able to - # create Consul namespaces. - aclInjectToken: - # The name of the Vault secret that holds the ACL inject token. - # @type: string - secretName: null - # The key within the Vault secret that holds the ACL inject token. - # @type: string - secretKey: null - - sidecarProxy: - # The number of worker threads to be used by the Envoy proxy. - # By default the threading model of Envoy will use one thread per CPU core per envoy proxy. This - # leads to unnecessary thread and memory usage and leaves unnecessary idle connections open. It is - # advised to keep this number low for sidecars and high for edge proxies. - # This will control the `--concurrency` flag to Envoy. - # For additional information, refer to https://blog.envoyproxy.io/envoy-threading-model-a8d44b922310 - # - # This setting can be overridden on a per-pod basis via this annotation: - # - `consul.hashicorp.com/consul-envoy-proxy-concurrency` - # @type: string - concurrency: 2 - - # Set default resources for sidecar proxy. If null, that resource won't - # be set. - # These settings can be overridden on a per-pod basis via these annotations: - # - # - `consul.hashicorp.com/sidecar-proxy-cpu-limit` - # - `consul.hashicorp.com/sidecar-proxy-cpu-request` - # - `consul.hashicorp.com/sidecar-proxy-memory-limit` - # - `consul.hashicorp.com/sidecar-proxy-memory-request` - # @type: map - resources: - requests: - # Recommended production default: 100Mi - # @type: string - memory: null - # Recommended production default: 100m - # @type: string - cpu: null - limits: - # Recommended production default: 100Mi - # @type: string - memory: null - # Recommended production default: 100m - # @type: string - cpu: null - # Set default lifecycle management configuration for sidecar proxy. - # These settings can be overridden on a per-pod basis via these annotations: - # - # - `consul.hashicorp.com/enable-sidecar-proxy-lifecycle` - # - `consul.hashicorp.com/enable-sidecar-proxy-shutdown-drain-listeners` - # - `consul.hashicorp.com/sidecar-proxy-lifecycle-shutdown-grace-period-seconds` - # - `consul.hashicorp.com/sidecar-proxy-lifecycle-startup-grace-period-seconds` - # - `consul.hashicorp.com/sidecar-proxy-lifecycle-graceful-port` - # - `consul.hashicorp.com/sidecar-proxy-lifecycle-graceful-shutdown-path` - # - `consul.hashicorp.com/sidecar-proxy-lifecycle-graceful-startup-path` - # @type: map - lifecycle: - # @type: boolean - defaultEnabled: true - # @type: boolean - defaultEnableShutdownDrainListeners: true - # @type: integer - defaultShutdownGracePeriodSeconds: 30 - # @type: integer - defaultStartupGracePeriodSeconds: 0 - # @type: integer - defaultGracefulPort: 20600 - # @type: string - defaultGracefulShutdownPath: "/graceful_shutdown" - # @type: string - defaultGracefulStartupPath: "/graceful_startup" - - # Configures how long the k8s startup probe will wait before the proxy is considered to be unhealthy and the container is restarted. - # A value of zero disables the probe. - defaultStartupFailureSeconds: 0 - # Configures how long the k8s liveness probe will wait before the proxy is considered to be unhealthy and the container is restarted. - # A value of zero disables the probe. - defaultLivenessFailureSeconds: 0 - - # The resource settings for the Connect injected init container. If null, the resources - # won't be set for the initContainer. The defaults are optimized for developer instances of - # Kubernetes, however they should be tweaked with the recommended defaults as shown below to speed up service registration times. - # @type: map - initContainer: - resources: - requests: - # Recommended production default: 150Mi - # @type: string - memory: "25Mi" - # Recommended production default: 250m - # @type: string - cpu: "50m" - limits: - # Recommended production default: 150Mi - # @type: string - memory: "150Mi" - # Recommended production default: 500m - # @type: string - cpu: null - -# [Mesh Gateways](https://developer.hashicorp.com/consul/docs/connect/gateways/mesh-gateway) enable Consul Connect to work across Consul datacenters. -meshGateway: - # If [mesh gateways](https://developer.hashicorp.com/consul/docs/connect/gateways/mesh-gateway) are enabled, a Deployment will be created that runs - # gateways and Consul service mesh will be configured to use gateways. - # This setting is required for [Cluster Peering](https://developer.hashicorp.com/consul/docs/connect/cluster-peering/k8s). - # Requirements: consul 1.6.0+ if using `global.acls.manageSystemACLs``. - enabled: false - - # Override global log verbosity level for mesh-gateway-deployment pods. One of "trace", "debug", "info", "warn", or "error". - # @type: string - logLevel: "" - - # Number of replicas for the Deployment. - replicas: 1 - - # What gets registered as WAN address for the gateway. - wanAddress: - # source configures where to retrieve the WAN address (and possibly port) - # for the mesh gateway from. - # Can be set to either: `Service`, `NodeIP`, `NodeName` or `Static`. - # - # - `Service` - Determine the address based on the service type. - # - # - If `service.type=LoadBalancer` use the external IP or hostname of - # the service. Use the port set by `service.port`. - # - # - If `service.type=NodePort` use the Node IP. The port will be set to - # `service.nodePort` so `service.nodePort` cannot be null. - # - # - If `service.type=ClusterIP` use the `ClusterIP`. The port will be set to - # `service.port`. - # - # - `service.type=ExternalName` is not supported. - # - # - `NodeIP` - The node IP as provided by the Kubernetes downward API. - # - # - `NodeName` - The name of the node as provided by the Kubernetes downward - # API. This is useful if the node names are DNS entries that - # are routable from other datacenters. - # - # - `Static` - Use the address hardcoded in `meshGateway.wanAddress.static`. - source: Service - - # Port that gets registered for WAN traffic. - # If source is set to "Service" then this setting will have no effect. - # Refer to the documentation for source as to which port will be used in that - # case. - port: 443 - - # If source is set to "Static" then this value will be used as the WAN - # address of the mesh gateways. This is useful if you've configured a - # DNS entry to point to your mesh gateways. - static: "" - - # The service option configures the Service that fronts the Gateway Deployment. - service: - # Type of service, ex. LoadBalancer, ClusterIP. - type: LoadBalancer - - # Port that the service will be exposed on. - # The targetPort will be set to meshGateway.containerPort. - port: 443 - - # Optionally set the nodePort value of the service if using a NodePort service. - # If not set and using a NodePort service, Kubernetes will automatically assign - # a port. - # @type: integer - nodePort: null - - # Annotations to apply to the mesh gateway service. - # - # Example: - # - # ```yaml - # annotations: | - # 'annotation-key': annotation-value - # ``` - # @type: string - annotations: null - - # Optional YAML string that will be appended to the Service spec. - # @type: string - additionalSpec: null - - # If set to true, gateway Pods will run on the host network. - hostNetwork: false - - # dnsPolicy to use. - # @type: string - dnsPolicy: null - - # Consul service name for the mesh gateways. - # Cannot be set to anything other than "mesh-gateway" if - # global.acls.manageSystemACLs is true since the ACL token - # generated is only for the name 'mesh-gateway'. - consulServiceName: "mesh-gateway" - - # Port that the gateway will run on inside the container. - containerPort: 8443 - - # Optional hostPort for the gateway to be exposed on. - # This can be used with wanAddress.port and wanAddress.useNodeIP - # to expose the gateways directly from the node. - # If hostNetwork is true, this must be null or set to the same port as - # containerPort. - # NOTE: Cannot set to 8500 or 8502 because those are reserved for the Consul - # agent. - # @type: integer - hostPort: null - - serviceAccount: - # This value defines additional annotations for the mesh gateways' service account. This should be formatted as a - # multi-line string. - # - # ```yaml - # annotations: | - # "sample/annotation1": "foo" - # "sample/annotation2": "bar" - # ``` - # - # @type: string - annotations: null - - # The resource settings for mesh gateway pods. - # NOTE: The use of a YAML string is deprecated. Instead, set directly as a - # YAML map. - # @recurse: false - # @type: map - resources: - requests: - memory: "100Mi" - cpu: "100m" - limits: - memory: "100Mi" - cpu: "100m" - - # The resource settings for the `service-init` init container. - # @recurse: false - # @type: map - initServiceInitContainer: - resources: - requests: - memory: "50Mi" - cpu: "50m" - limits: - memory: "50Mi" - cpu: "50m" - - # This value defines the [affinity](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity) - # for mesh gateway pods. It defaults to `null` thereby allowing multiple gateway pods on each node. But if one would prefer - # a mode which minimizes risk of the cluster becoming unusable if a node is lost, set this value - # to the value in the example below. - # - # Example: - # - # ```yaml - # affinity: | - # podAntiAffinity: - # requiredDuringSchedulingIgnoredDuringExecution: - # - labelSelector: - # matchLabels: - # app: {{ template "consul.name" . }} - # release: "{{ .Release.Name }}" - # component: mesh-gateway - # topologyKey: kubernetes.io/hostname - # ``` - # @type: string - affinity: null - - # Optional YAML string to specify tolerations. - # @type: string - tolerations: null - - # Pod topology spread constraints for mesh gateway pods. - # This should be a multi-line YAML string matching the - # [`topologySpreadConstraints`](https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/) - # array in a Pod Spec. - # - # This requires K8S >= 1.18 (beta) or 1.19 (stable). - # - # Example: - # - # ```yaml - # topologySpreadConstraints: | - # - maxSkew: 1 - # topologyKey: topology.kubernetes.io/zone - # whenUnsatisfiable: DoNotSchedule - # labelSelector: - # matchLabels: - # app: {{ template "consul.name" . }} - # release: "{{ .Release.Name }}" - # component: mesh-gateway - # ``` - topologySpreadConstraints: "" - - # Optional YAML string to specify a nodeSelector config. - # @type: string - nodeSelector: null - - # Optional priorityClassName. - priorityClassName: "" - - # Annotations to apply to the mesh gateway deployment. - # - # Example: - # - # ```yaml - # annotations: | - # 'annotation-key': annotation-value - # ``` - # @type: string - annotations: null - -# Configuration options for ingress gateways. Default values for all -# ingress gateways are defined in `ingressGateways.defaults`. Any of -# these values may be overridden in `ingressGateways.gateways` for a -# specific gateway with the exception of annotations. Annotations will -# include both the default annotations and any additional ones defined -# for a specific gateway. -# Requirements: consul >= 1.8.0 -ingressGateways: - # Enable ingress gateway deployment. Requires `connectInject.enabled=true`. - enabled: false - - # Override global log verbosity level for ingress-gateways-deployment pods. One of "trace", "debug", "info", "warn", or "error". - # @type: string - logLevel: "" - - # Defaults sets default values for all gateway fields. With the exception - # of annotations, defining any of these values in the `gateways` list - # will override the default values provided here. Annotations will - # include both the default annotations and any additional ones defined - # for a specific gateway. - defaults: - # Number of replicas for each ingress gateway defined. - replicas: 1 - - # The service options configure the Service that fronts the gateway Deployment. - service: - # Type of service: LoadBalancer, ClusterIP or NodePort. If using NodePort service - # type, you must set the desired nodePorts in the `ports` setting below. - type: ClusterIP - - # Ports that will be exposed on the service and gateway container. Any - # ports defined as ingress listeners on the gateway's Consul configuration - # entry should be included here. The first port will be used as part of - # the Consul service registration for the gateway and be listed in its - # SRV record. If using a NodePort service type, you must specify the - # desired nodePort for each exposed port. - # @type: array - # @default: [{port: 8080, port: 8443}] - # @recurse: false - ports: - - port: 8080 - nodePort: null - - port: 8443 - nodePort: null - - # Annotations to apply to the ingress gateway service. Annotations defined - # here will be applied to all ingress gateway services in addition to any - # service annotations defined for a specific gateway in `ingressGateways.gateways`. - # - # Example: - # - # ```yaml - # annotations: | - # 'annotation-key': annotation-value - # ``` - # @type: string - annotations: null - - # Optional YAML string that will be appended to the Service spec. - # @type: string - additionalSpec: null - - serviceAccount: - # This value defines additional annotations for the ingress gateways' service account. This should be formatted - # as a multi-line string. - # - # ```yaml - # annotations: | - # "sample/annotation1": "foo" - # "sample/annotation2": "bar" - # ``` - # - # @type: string - annotations: null - - # Resource limits for all ingress gateway pods - # @recurse: false - # @type: map - resources: - requests: - memory: "100Mi" - cpu: "100m" - limits: - memory: "100Mi" - cpu: "100m" - - # This value defines the [affinity](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity) - # for ingress gateway pods. It defaults to `null` thereby allowing multiple gateway pods on each node. But if one would prefer - # a mode which minimizes risk of the cluster becoming unusable if a node is lost, set this value - # to the value in the example below. - # - # Example: - # - # ```yaml - # affinity: | - # podAntiAffinity: - # requiredDuringSchedulingIgnoredDuringExecution: - # - labelSelector: - # matchLabels: - # app: {{ template "consul.name" . }} - # release: "{{ .Release.Name }}" - # component: ingress-gateway - # topologyKey: kubernetes.io/hostname - # ``` - # @type: string - affinity: null - - # Optional YAML string to specify tolerations. - # @type: string - tolerations: null - - # Pod topology spread constraints for ingress gateway pods. - # This should be a multi-line YAML string matching the - # [`topologySpreadConstraints`](https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/) - # array in a Pod Spec. - # - # This requires K8S >= 1.18 (beta) or 1.19 (stable). - # - # Example: - # - # ```yaml - # topologySpreadConstraints: | - # - maxSkew: 1 - # topologyKey: topology.kubernetes.io/zone - # whenUnsatisfiable: DoNotSchedule - # labelSelector: - # matchLabels: - # app: {{ template "consul.name" . }} - # release: "{{ .Release.Name }}" - # component: ingress-gateway - # ``` - topologySpreadConstraints: "" - - # Optional YAML string to specify a nodeSelector config. - # @type: string - nodeSelector: null - - # Optional priorityClassName. - priorityClassName: "" - - # Amount of seconds to wait for graceful termination before killing the pod. - terminationGracePeriodSeconds: 10 - - # Annotations to apply to the ingress gateway deployment. Annotations defined - # here will be applied to all ingress gateway deployments in addition to any - # annotations defined for a specific gateway in `ingressGateways.gateways`. - # - # Example: - # - # ```yaml - # annotations: | - # "annotation-key": 'annotation-value' - # ``` - # @type: string - annotations: null - - # [Enterprise Only] `consulNamespace` defines the Consul namespace to register - # the gateway into. Requires `global.enableConsulNamespaces` to be true and - # Consul Enterprise v1.7+ with a valid Consul Enterprise license. - # Note: The Consul namespace MUST exist before the gateway is deployed. - consulNamespace: "default" - - # Gateways is a list of gateway objects. The only required field for - # each is `name`, though they can also contain any of the fields in - # `defaults`. You must provide a unique name for each ingress gateway. These names - # must be unique across different namespaces. - # Values defined here override the defaults, except in the case of annotations where both will be applied. - # @type: array - gateways: - - name: ingress-gateway - -# Configuration options for terminating gateways. Default values for all -# terminating gateways are defined in `terminatingGateways.defaults`. Any of -# these values may be overridden in `terminatingGateways.gateways` for a -# specific gateway with the exception of annotations. Annotations will -# include both the default annotations and any additional ones defined -# for a specific gateway. -# Requirements: consul >= 1.8.0 -terminatingGateways: - # Enable terminating gateway deployment. Requires `connectInject.enabled=true`. - enabled: false - - # Override global log verbosity level. One of "trace", "debug", "info", "warn", or "error". - # @type: string - logLevel: "" - - # Defaults sets default values for all gateway fields. With the exception - # of annotations, defining any of these values in the `gateways` list - # will override the default values provided here. Annotations will - # include both the default annotations and any additional ones defined - # for a specific gateway. - defaults: - # Number of replicas for each terminating gateway defined. - replicas: 1 - - # A list of extra volumes to mount. These will be exposed to Consul in the path `/consul/userconfig//`. - # - # Example: - # - # ```yaml - # extraVolumes: - # - type: secret - # name: my-secret - # items: # optional items array - # - key: key - # path: path # secret will now mount to /consul/userconfig/my-secret/path - # ``` - # @type: array - extraVolumes: [] - - # Resource limits for all terminating gateway pods - # @recurse: false - # @type: map - resources: - requests: - memory: "100Mi" - cpu: "100m" - limits: - memory: "100Mi" - cpu: "100m" - - # This value defines the [affinity](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity) - # for terminating gateway pods. It defaults to `null` thereby allowing multiple gateway pods on each node. But if one would prefer - # a mode which minimizes risk of the cluster becoming unusable if a node is lost, set this value - # to the value in the example below. - # - # Example: - # - # ```yaml - # affinity: | - # podAntiAffinity: - # requiredDuringSchedulingIgnoredDuringExecution: - # - labelSelector: - # matchLabels: - # app: {{ template "consul.name" . }} - # release: "{{ .Release.Name }}" - # component: terminating-gateway - # topologyKey: kubernetes.io/hostname - # ``` - # @type: string - affinity: null - - # Optional YAML string to specify tolerations. - # @type: string - tolerations: null - - # Pod topology spread constraints for terminating gateway pods. - # This should be a multi-line YAML string matching the - # [`topologySpreadConstraints`](https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/) - # array in a Pod Spec. - # - # This requires K8S >= 1.18 (beta) or 1.19 (stable). - # - # Example: - # - # ```yaml - # topologySpreadConstraints: | - # - maxSkew: 1 - # topologyKey: topology.kubernetes.io/zone - # whenUnsatisfiable: DoNotSchedule - # labelSelector: - # matchLabels: - # app: {{ template "consul.name" . }} - # release: "{{ .Release.Name }}" - # component: terminating-gateway - # ``` - topologySpreadConstraints: "" - - # Optional YAML string to specify a nodeSelector config. - # @type: string - nodeSelector: null - - # Optional priorityClassName. - # @type: string - priorityClassName: "" - - # Annotations to apply to the terminating gateway deployment. Annotations defined - # here will be applied to all terminating gateway deployments in addition to any - # annotations defined for a specific gateway in `terminatingGateways.gateways`. - # - # Example: - # - # ```yaml - # annotations: | - # 'annotation-key': annotation-value - # ``` - # @type: string - annotations: null - - serviceAccount: - # This value defines additional annotations for the terminating gateways' service account. This should be - # formatted as a multi-line string. - # - # ```yaml - # annotations: | - # "sample/annotation1": "foo" - # "sample/annotation2": "bar" - # ``` - # - # @type: string - annotations: null - - # [Enterprise Only] `consulNamespace` defines the Consul namespace to register - # the gateway into. Requires `global.enableConsulNamespaces` to be true and - # Consul Enterprise v1.7+ with a valid Consul Enterprise license. - # Note: The Consul namespace MUST exist before the gateway is deployed. - consulNamespace: "default" - - # Gateways is a list of gateway objects. The only required field for - # each is `name`, though they can also contain any of the fields in - # `defaults`. Values defined here override the defaults except in the - # case of annotations where both will be applied. - # @type: array - gateways: - - name: terminating-gateway - -# Configuration settings for the webhook-cert-manager -# `webhook-cert-manager` ensures that cert bundles are up to date for the mutating webhook. -webhookCertManager: - # Toleration Settings - # This should be a multi-line string matching the Toleration array - # in a PodSpec. - # @type: string - tolerations: null - - # This value defines [`nodeSelector`](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector) - # labels for the webhook-cert-manager pod assignment, formatted as a multi-line string. - # - # Example: - # - # ```yaml - # nodeSelector: | - # beta.kubernetes.io/arch: amd64 - # ``` - # - # @type: string - nodeSelector: null - - # The resource requests (CPU, memory, etc.) for the server-acl-init and server-acl-init-cleanup pods. - # This should be a YAML map corresponding to a Kubernetes - # [`ResourceRequirements``](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.27/#resourcerequirements-v1-core) - # object. - # - # Example: - # - # ```yaml - # resources: - # requests: - # memory: '200Mi' - # cpu: '100m' - # limits: - # memory: '200Mi' - # cpu: '100m' - # ``` - # - # @recurse: false - # @type: map - resources: - requests: - memory: "50Mi" - cpu: "100m" - limits: - memory: "50Mi" - cpu: "100m" - -# Configures a demo Prometheus installation. -prometheus: - # When true, the Helm chart will install a demo Prometheus server instance - # alongside Consul. - enabled: false - -# Control whether a test Pod manifest is generated when running helm template. -# When using helm install, the test Pod is not submitted to the cluster so this -# is only useful when running helm template. -tests: - enabled: true - -telemetryCollector: - # Enables the consul-telemetry-collector deployment - # @type: boolean - enabled: false - - # Override global log verbosity level. One of "trace", "debug", "info", "warn", or "error". - # @type: string - logLevel: "" - - # The name of the Docker image (including any tag) for the containers running - # the consul-telemetry-collector - # @type: string - image: "hashicorp/consul-telemetry-collector:0.0.2" - - # The resource settings for consul-telemetry-collector pods. - # @recurse: false - # @type: map - resources: - requests: - memory: "512Mi" - cpu: "1000m" - limits: - memory: "512Mi" - cpu: "1000m" - - # This value sets the number of consul-telemetry-collector replicas to deploy. - replicas: 1 - - # This value defines additional configuration for the telemetry collector. It should be formatted as a multi-line - # json blob string - # - # ```yaml - # customExporterConfig: | - # {"http_collector_endpoint": "other-otel-collector"} - # ``` - # - # @type: string - customExporterConfig: null - - service: - # This value defines additional annotations for the telemetry-collector's service account. This should be formatted as a multi-line - # string. - # - # ```yaml - # annotations: | - # "sample/annotation1": "foo" - # "sample/annotation2": "bar" - # ``` - # - # @type: string - annotations: null - - serviceAccount: - # This value defines additional annotations for the telemetry-collector's service account. This should be formatted - # as a multi-line string. - # - # ```yaml - # annotations: | - # "sample/annotation1": "foo" - # "sample/annotation2": "bar" - # ``` - # - # @type: string - annotations: null - - cloud: - # The resource id of the HCP Consul Central cluster to push metrics for. Eg: - # `organization/27109cd4-a309-4bf3-9986-e1d071914b18/project/fcef6c24-259d-4510-bb8d-1d812e120e34/hashicorp.consul.global-network-manager.cluster/consul-cluster` - # - # This is used for HCP Consul Central-linked or HCP Consul Dedicated clusters where global.cloud.resourceId is unset. For example, when using externalServers - # with HCP Consul Dedicated clusters or HCP Consul Central-linked clusters in a different admin partition. - # - # If global.cloud.resourceId is set, this should either be unset (defaulting to global.cloud.resourceId) or be the same as global.cloud.resourceId. - # - # @default: global.cloud.resourceId - resourceId: - # The name of the Kubernetes secret that holds the resource id. - # @type: string - secretName: null - # The key within the Kubernetes secret that holds the resource id. - # @type: string - secretKey: null - - # The client id portion of a [service principal](https://developer.hashicorp.com/hcp/docs/hcp/admin/iam/service-principals#service-principals) with authorization to push metrics to HCP - # - # This is set in two scenarios: - # - the service principal in global.cloud is unset - # - the HCP UI provides a service principal with more narrowly scoped permissions that the service principal used in global.cloud - # - # @default: global.cloud.clientId - clientId: - # The name of the Kubernetes secret that holds the client id. - # @type: string - secretName: null - # The key within the Kubernetes secret that holds the client id. - # @type: string - secretKey: null - - # The client secret portion of a [service principal](https://developer.hashicorp.com/hcp/docs/hcp/admin/iam/service-principals#service-principals) with authorization to push metrics to HCP. - # - # This is set in two scenarios: - # - the service principal in global.cloud is unset - # - the HCP UI provides a service principal with more narrowly scoped permissions that the service principal used in global.cloud - # - # @default: global.cloud.clientSecret - clientSecret: - # The name of the Kubernetes secret that holds the client secret. - # @type: string - secretName: null - # The key within the Kubernetes secret that holds the client secret. - # @type: string - secretKey: null - - initContainer: - # The resource settings for consul-telemetry-collector initContainer. - # @recurse: false - # @type: map - resources: {} - - # Optional YAML string to specify a nodeSelector config. - # @type: string - nodeSelector: null - - # Optional priorityClassName. - # @type: string - priorityClassName: "" - - # A list of extra environment variables to set within the deployment. - # These could be used to include proxy settings required for cloud auto-join - # feature, in case kubernetes cluster is behind egress http proxies. Additionally, - # it could be used to configure custom consul parameters. - # @type: map - extraEnvironmentVars: {} diff --git a/scripts/argocd-init.txt b/misc/argocd-init.txt similarity index 100% rename from scripts/argocd-init.txt rename to misc/argocd-init.txt diff --git a/cdktf/README.md b/misc/cdktf-example-timeweb/README.md similarity index 100% rename from cdktf/README.md rename to misc/cdktf-example-timeweb/README.md diff --git a/cdktf/code/go/README.sh b/misc/cdktf-example-timeweb/code/go/README.sh similarity index 100% rename from cdktf/code/go/README.sh rename to misc/cdktf-example-timeweb/code/go/README.sh diff --git a/cdktf/code/go/cdktf.json b/misc/cdktf-example-timeweb/code/go/cdktf.json similarity index 100% rename from cdktf/code/go/cdktf.json rename to misc/cdktf-example-timeweb/code/go/cdktf.json diff --git a/cdktf/code/go/main.go b/misc/cdktf-example-timeweb/code/go/main.go similarity index 100% rename from cdktf/code/go/main.go rename to misc/cdktf-example-timeweb/code/go/main.go diff --git a/cdktf/code/js/README.sh b/misc/cdktf-example-timeweb/code/js/README.sh similarity index 100% rename from cdktf/code/js/README.sh rename to misc/cdktf-example-timeweb/code/js/README.sh diff --git a/cdktf/code/js/cdktf.json b/misc/cdktf-example-timeweb/code/js/cdktf.json similarity index 100% rename from cdktf/code/js/cdktf.json rename to misc/cdktf-example-timeweb/code/js/cdktf.json diff --git a/cdktf/code/js/main.ts b/misc/cdktf-example-timeweb/code/js/main.ts similarity index 100% rename from cdktf/code/js/main.ts rename to misc/cdktf-example-timeweb/code/js/main.ts diff --git a/cdktf/code/python/README.sh b/misc/cdktf-example-timeweb/code/python/README.sh similarity index 100% rename from cdktf/code/python/README.sh rename to misc/cdktf-example-timeweb/code/python/README.sh diff --git a/cdktf/code/python/cdktf.json b/misc/cdktf-example-timeweb/code/python/cdktf.json similarity index 100% rename from cdktf/code/python/cdktf.json rename to misc/cdktf-example-timeweb/code/python/cdktf.json diff --git a/cdktf/code/python/main.py b/misc/cdktf-example-timeweb/code/python/main.py similarity index 100% rename from cdktf/code/python/main.py rename to misc/cdktf-example-timeweb/code/python/main.py diff --git a/cdktf/db-230-rub.hcl b/misc/cdktf-example-timeweb/db-230-rub.hcl similarity index 100% rename from cdktf/db-230-rub.hcl rename to misc/cdktf-example-timeweb/db-230-rub.hcl diff --git a/cdktf/db.hcl b/misc/cdktf-example-timeweb/db.hcl similarity index 100% rename from cdktf/db.hcl rename to misc/cdktf-example-timeweb/db.hcl diff --git a/cdktf/k8s-multi-master.hcl b/misc/cdktf-example-timeweb/k8s-multi-master.hcl similarity index 100% rename from cdktf/k8s-multi-master.hcl rename to misc/cdktf-example-timeweb/k8s-multi-master.hcl diff --git a/cdktf/k8s-single-master.hcl b/misc/cdktf-example-timeweb/k8s-single-master.hcl similarity index 100% rename from cdktf/k8s-single-master.hcl rename to misc/cdktf-example-timeweb/k8s-single-master.hcl diff --git a/cdktf/s3.hcl b/misc/cdktf-example-timeweb/s3.hcl similarity index 100% rename from cdktf/s3.hcl rename to misc/cdktf-example-timeweb/s3.hcl diff --git a/cdktf/vm.hcl b/misc/cdktf-example-timeweb/vm.hcl similarity index 100% rename from cdktf/vm.hcl rename to misc/cdktf-example-timeweb/vm.hcl diff --git a/scripts/context-chunk-export.sh b/misc/context-chunk-export.sh similarity index 100% rename from scripts/context-chunk-export.sh rename to misc/context-chunk-export.sh diff --git a/crewai-example.yaml b/misc/crewai-example.yaml similarity index 100% rename from crewai-example.yaml rename to misc/crewai-example.yaml diff --git a/scripts/ddd.png b/misc/ddd.png similarity index 100% rename from scripts/ddd.png rename to misc/ddd.png diff --git a/scripts/ddd/app-infra-root.yaml b/misc/ddd/app-infra-root.yaml similarity index 100% rename from scripts/ddd/app-infra-root.yaml rename to misc/ddd/app-infra-root.yaml diff --git a/scripts/ddd/core/crds/app-crds.yaml b/misc/ddd/core/crds/app-crds.yaml similarity index 100% rename from scripts/ddd/core/crds/app-crds.yaml rename to misc/ddd/core/crds/app-crds.yaml diff --git a/scripts/ddd/core/issuer/issuer-cluster.yaml b/misc/ddd/core/issuer/issuer-cluster.yaml similarity index 100% rename from scripts/ddd/core/issuer/issuer-cluster.yaml rename to misc/ddd/core/issuer/issuer-cluster.yaml diff --git a/scripts/ddd/core/namespaces/chat-api-namespace.yaml b/misc/ddd/core/namespaces/chat-api-namespace.yaml similarity index 100% rename from scripts/ddd/core/namespaces/chat-api-namespace.yaml rename to misc/ddd/core/namespaces/chat-api-namespace.yaml diff --git a/scripts/ddd/core/namespaces/longhorn-system-namespace.yaml b/misc/ddd/core/namespaces/longhorn-system-namespace.yaml similarity index 100% rename from scripts/ddd/core/namespaces/longhorn-system-namespace.yaml rename to misc/ddd/core/namespaces/longhorn-system-namespace.yaml diff --git a/scripts/ddd/core/namespaces/nginx-namespace.yaml b/misc/ddd/core/namespaces/nginx-namespace.yaml similarity index 100% rename from scripts/ddd/core/namespaces/nginx-namespace.yaml rename to misc/ddd/core/namespaces/nginx-namespace.yaml diff --git a/scripts/ddd/core/namespaces/observability-namespace.yaml b/misc/ddd/core/namespaces/observability-namespace.yaml similarity index 100% rename from scripts/ddd/core/namespaces/observability-namespace.yaml rename to misc/ddd/core/namespaces/observability-namespace.yaml diff --git a/scripts/ddd/data/postgree/pg-secrets-sealed.yaml b/misc/ddd/data/postgree/pg-secrets-sealed.yaml similarity index 100% rename from scripts/ddd/data/postgree/pg-secrets-sealed.yaml rename to misc/ddd/data/postgree/pg-secrets-sealed.yaml diff --git a/scripts/ddd/gateway/app.yaml b/misc/ddd/gateway/app.yaml similarity index 100% rename from scripts/ddd/gateway/app.yaml rename to misc/ddd/gateway/app.yaml diff --git a/scripts/ddd/gateway/ingress-argo.yaml b/misc/ddd/gateway/ingress-argo.yaml similarity index 100% rename from scripts/ddd/gateway/ingress-argo.yaml rename to misc/ddd/gateway/ingress-argo.yaml diff --git a/scripts/ddd/gateway/ingress-chat.yaml b/misc/ddd/gateway/ingress-chat.yaml similarity index 100% rename from scripts/ddd/gateway/ingress-chat.yaml rename to misc/ddd/gateway/ingress-chat.yaml diff --git a/scripts/ddd/gateway/ingress-grafana.yaml b/misc/ddd/gateway/ingress-grafana.yaml similarity index 100% rename from scripts/ddd/gateway/ingress-grafana.yaml rename to misc/ddd/gateway/ingress-grafana.yaml diff --git a/scripts/ddd/llm/gateway/litellm-configmap.yaml b/misc/ddd/llm/gateway/litellm-configmap.yaml similarity index 100% rename from scripts/ddd/llm/gateway/litellm-configmap.yaml rename to misc/ddd/llm/gateway/litellm-configmap.yaml diff --git a/scripts/ddd/llm/gateway/litellm-deployment.yaml b/misc/ddd/llm/gateway/litellm-deployment.yaml similarity index 100% rename from scripts/ddd/llm/gateway/litellm-deployment.yaml rename to misc/ddd/llm/gateway/litellm-deployment.yaml diff --git a/scripts/ddd/llm/gateway/litellm-secrets-sealed.yaml b/misc/ddd/llm/gateway/litellm-secrets-sealed.yaml similarity index 100% rename from scripts/ddd/llm/gateway/litellm-secrets-sealed.yaml rename to misc/ddd/llm/gateway/litellm-secrets-sealed.yaml diff --git a/scripts/ddd/llm/gateway/litellm-service.yaml b/misc/ddd/llm/gateway/litellm-service.yaml similarity index 100% rename from scripts/ddd/llm/gateway/litellm-service.yaml rename to misc/ddd/llm/gateway/litellm-service.yaml diff --git a/scripts/ddd/llm/gateway/litellm-vector-configmap.yaml b/misc/ddd/llm/gateway/litellm-vector-configmap.yaml similarity index 100% rename from scripts/ddd/llm/gateway/litellm-vector-configmap.yaml rename to misc/ddd/llm/gateway/litellm-vector-configmap.yaml diff --git a/scripts/ddd/observability/grafana/app-grafana.yaml b/misc/ddd/observability/grafana/app-grafana.yaml similarity index 100% rename from scripts/ddd/observability/grafana/app-grafana.yaml rename to misc/ddd/observability/grafana/app-grafana.yaml diff --git a/scripts/ddd/observability/loki/app-loki.yml b/misc/ddd/observability/loki/app-loki.yml similarity index 100% rename from scripts/ddd/observability/loki/app-loki.yml rename to misc/ddd/observability/loki/app-loki.yml diff --git a/scripts/ddd/observability/loki/loki-pv.yaml b/misc/ddd/observability/loki/loki-pv.yaml similarity index 100% rename from scripts/ddd/observability/loki/loki-pv.yaml rename to misc/ddd/observability/loki/loki-pv.yaml diff --git a/scripts/ddd/observability/loki/loki-pvc.yaml b/misc/ddd/observability/loki/loki-pvc.yaml similarity index 100% rename from scripts/ddd/observability/loki/loki-pvc.yaml rename to misc/ddd/observability/loki/loki-pvc.yaml diff --git a/scripts/ddd/observability/loki/loki-secrets-sealed.yaml b/misc/ddd/observability/loki/loki-secrets-sealed.yaml similarity index 100% rename from scripts/ddd/observability/loki/loki-secrets-sealed.yaml rename to misc/ddd/observability/loki/loki-secrets-sealed.yaml diff --git a/scripts/ddd/security/cert-manager/app.yaml b/misc/ddd/security/cert-manager/app.yaml similarity index 100% rename from scripts/ddd/security/cert-manager/app.yaml rename to misc/ddd/security/cert-manager/app.yaml diff --git a/scripts/ddd/security/cert-manager/cert-cluster.yaml b/misc/ddd/security/cert-manager/cert-cluster.yaml similarity index 100% rename from scripts/ddd/security/cert-manager/cert-cluster.yaml rename to misc/ddd/security/cert-manager/cert-cluster.yaml diff --git a/scripts/ddd/security/cert-manager/secret-cloudflare-cert-manager-sealed.yaml b/misc/ddd/security/cert-manager/secret-cloudflare-cert-manager-sealed.yaml similarity index 100% rename from scripts/ddd/security/cert-manager/secret-cloudflare-cert-manager-sealed.yaml rename to misc/ddd/security/cert-manager/secret-cloudflare-cert-manager-sealed.yaml diff --git a/scripts/ddd/security/external-dns/app-external-dns.yaml b/misc/ddd/security/external-dns/app-external-dns.yaml similarity index 100% rename from scripts/ddd/security/external-dns/app-external-dns.yaml rename to misc/ddd/security/external-dns/app-external-dns.yaml diff --git a/scripts/ddd/security/external-dns/secret-cloudflare-external-dns-sealed.yaml b/misc/ddd/security/external-dns/secret-cloudflare-external-dns-sealed.yaml similarity index 100% rename from scripts/ddd/security/external-dns/secret-cloudflare-external-dns-sealed.yaml rename to misc/ddd/security/external-dns/secret-cloudflare-external-dns-sealed.yaml diff --git a/scripts/ddd/storage/longhorn/app-longhorn.yaml b/misc/ddd/storage/longhorn/app-longhorn.yaml similarity index 100% rename from scripts/ddd/storage/longhorn/app-longhorn.yaml rename to misc/ddd/storage/longhorn/app-longhorn.yaml diff --git a/scripts/k8s-basic.sh b/misc/k8s-basic.sh similarity index 100% rename from scripts/k8s-basic.sh rename to misc/k8s-basic.sh diff --git a/scripts/k8s-export-structured.sh b/misc/k8s-export-structured.sh similarity index 100% rename from scripts/k8s-export-structured.sh rename to misc/k8s-export-structured.sh diff --git a/scripts/k8s-network-overview.sh b/misc/k8s-network-overview.sh similarity index 100% rename from scripts/k8s-network-overview.sh rename to misc/k8s-network-overview.sh diff --git a/local/README.md b/misc/local-setup/README.md similarity index 100% rename from local/README.md rename to misc/local-setup/README.md diff --git a/docker-compose.yml b/misc/local-setup/docker-compose.yml similarity index 100% rename from docker-compose.yml rename to misc/local-setup/docker-compose.yml diff --git a/local/litellm-config.yaml b/misc/local-setup/litellm-config.yaml similarity index 100% rename from local/litellm-config.yaml rename to misc/local-setup/litellm-config.yaml diff --git a/local/loki-config.yaml b/misc/local-setup/loki-config.yaml similarity index 100% rename from local/loki-config.yaml rename to misc/local-setup/loki-config.yaml diff --git a/local/provisioning/datasources/datasource-loki.yaml b/misc/local-setup/provisioning/datasources/datasource-loki.yaml similarity index 100% rename from local/provisioning/datasources/datasource-loki.yaml rename to misc/local-setup/provisioning/datasources/datasource-loki.yaml diff --git a/local/vector.toml b/misc/local-setup/vector.toml similarity index 100% rename from local/vector.toml rename to misc/local-setup/vector.toml diff --git a/scripts/multi-cluster.yaml b/misc/multi-cluster.yaml similarity index 100% rename from scripts/multi-cluster.yaml rename to misc/multi-cluster.yaml diff --git a/scripts/npm-release-test.sh b/misc/npm-release-test.sh similarity index 100% rename from scripts/npm-release-test.sh rename to misc/npm-release-test.sh diff --git a/tests/behavior/test_models.py b/misc/old-tests/behavior/test_models.py similarity index 100% rename from tests/behavior/test_models.py rename to misc/old-tests/behavior/test_models.py diff --git a/tests/test_logging.py b/misc/old-tests/test_logging.py similarity index 100% rename from tests/test_logging.py rename to misc/old-tests/test_logging.py diff --git a/scripts/smoke-local-test.sh b/misc/smoke-local-test.sh similarity index 100% rename from scripts/smoke-local-test.sh rename to misc/smoke-local-test.sh diff --git a/scripts/smoke-public-test.sh b/misc/smoke-public-test.sh similarity index 100% rename from scripts/smoke-public-test.sh rename to misc/smoke-public-test.sh diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index d5e6ae0..0000000 --- a/package-lock.json +++ /dev/null @@ -1,5941 +0,0 @@ -{ - "name": "app-release", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "app-release", - "version": "1.0.0", - "license": "ISC", - "devDependencies": { - "@semantic-release/commit-analyzer": "^13.0.1", - "@semantic-release/github": "^11.0.3", - "@semantic-release/release-notes-generator": "^14.0.3", - "semantic-release": "^24.2.7" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@octokit/auth-token": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz", - "integrity": "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==", - "dev": true, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/core": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.3.tgz", - "integrity": "sha512-oNXsh2ywth5aowwIa7RKtawnkdH6LgU1ztfP9AIUCQCvzysB+WeU8o2kyyosDPwBZutPpjZDKPQGIzzrfTWweQ==", - "dev": true, - "dependencies": { - "@octokit/auth-token": "^6.0.0", - "@octokit/graphql": "^9.0.1", - "@octokit/request": "^10.0.2", - "@octokit/request-error": "^7.0.0", - "@octokit/types": "^14.0.0", - "before-after-hook": "^4.0.0", - "universal-user-agent": "^7.0.0" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/endpoint": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.0.tgz", - "integrity": "sha512-hoYicJZaqISMAI3JfaDr1qMNi48OctWuOih1m80bkYow/ayPw6Jj52tqWJ6GEoFTk1gBqfanSoI1iY99Z5+ekQ==", - "dev": true, - "dependencies": { - "@octokit/types": "^14.0.0", - "universal-user-agent": "^7.0.2" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/graphql": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.1.tgz", - "integrity": "sha512-j1nQNU1ZxNFx2ZtKmL4sMrs4egy5h65OMDmSbVyuCzjOcwsHq6EaYjOTGXPQxgfiN8dJ4CriYHk6zF050WEULg==", - "dev": true, - "dependencies": { - "@octokit/request": "^10.0.2", - "@octokit/types": "^14.0.0", - "universal-user-agent": "^7.0.0" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/openapi-types": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.1.0.tgz", - "integrity": "sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==", - "dev": true - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-13.1.1.tgz", - "integrity": "sha512-q9iQGlZlxAVNRN2jDNskJW/Cafy7/XE52wjZ5TTvyhyOD904Cvx//DNyoO3J/MXJ0ve3rPoNWKEg5iZrisQSuw==", - "dev": true, - "dependencies": { - "@octokit/types": "^14.1.0" - }, - "engines": { - "node": ">= 20" - }, - "peerDependencies": { - "@octokit/core": ">=6" - } - }, - "node_modules/@octokit/plugin-retry": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-8.0.1.tgz", - "integrity": "sha512-KUoYR77BjF5O3zcwDQHRRZsUvJwepobeqiSSdCJ8lWt27FZExzb0GgVxrhhfuyF6z2B2zpO0hN5pteni1sqWiw==", - "dev": true, - "dependencies": { - "@octokit/request-error": "^7.0.0", - "@octokit/types": "^14.0.0", - "bottleneck": "^2.15.3" - }, - "engines": { - "node": ">= 20" - }, - "peerDependencies": { - "@octokit/core": ">=7" - } - }, - "node_modules/@octokit/plugin-throttling": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-11.0.1.tgz", - "integrity": "sha512-S+EVhy52D/272L7up58dr3FNSMXWuNZolkL4zMJBNIfIxyZuUcczsQAU4b5w6dewJXnKYVgSHSV5wxitMSW1kw==", - "dev": true, - "dependencies": { - "@octokit/types": "^14.0.0", - "bottleneck": "^2.15.3" - }, - "engines": { - "node": ">= 20" - }, - "peerDependencies": { - "@octokit/core": "^7.0.0" - } - }, - "node_modules/@octokit/request": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.3.tgz", - "integrity": "sha512-V6jhKokg35vk098iBqp2FBKunk3kMTXlmq+PtbV9Gl3TfskWlebSofU9uunVKhUN7xl+0+i5vt0TGTG8/p/7HA==", - "dev": true, - "dependencies": { - "@octokit/endpoint": "^11.0.0", - "@octokit/request-error": "^7.0.0", - "@octokit/types": "^14.0.0", - "fast-content-type-parse": "^3.0.0", - "universal-user-agent": "^7.0.2" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/request-error": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.0.0.tgz", - "integrity": "sha512-KRA7VTGdVyJlh0cP5Tf94hTiYVVqmt2f3I6mnimmaVz4UG3gQV/k4mDJlJv3X67iX6rmN7gSHCF8ssqeMnmhZg==", - "dev": true, - "dependencies": { - "@octokit/types": "^14.0.0" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/types": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.1.0.tgz", - "integrity": "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==", - "dev": true, - "dependencies": { - "@octokit/openapi-types": "^25.1.0" - } - }, - "node_modules/@pnpm/config.env-replace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", - "dev": true, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "dev": true, - "dependencies": { - "graceful-fs": "4.2.10" - }, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/@pnpm/npm-conf": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", - "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", - "dev": true, - "dependencies": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@sec-ant/readable-stream": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", - "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", - "dev": true - }, - "node_modules/@semantic-release/commit-analyzer": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-13.0.1.tgz", - "integrity": "sha512-wdnBPHKkr9HhNhXOhZD5a2LNl91+hs8CC2vsAVYxtZH3y0dV3wKn+uZSN61rdJQZ8EGxzWB3inWocBHV9+u/CQ==", - "dev": true, - "dependencies": { - "conventional-changelog-angular": "^8.0.0", - "conventional-changelog-writer": "^8.0.0", - "conventional-commits-filter": "^5.0.0", - "conventional-commits-parser": "^6.0.0", - "debug": "^4.0.0", - "import-from-esm": "^2.0.0", - "lodash-es": "^4.17.21", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=20.8.1" - }, - "peerDependencies": { - "semantic-release": ">=20.1.0" - } - }, - "node_modules/@semantic-release/error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz", - "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", - "dev": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@semantic-release/github": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-11.0.3.tgz", - "integrity": "sha512-T2fKUyFkHHkUNa5XNmcsEcDPuG23hwBKptfUVcFXDVG2cSjXXZYDOfVYwfouqbWo/8UefotLaoGfQeK+k3ep6A==", - "dev": true, - "dependencies": { - "@octokit/core": "^7.0.0", - "@octokit/plugin-paginate-rest": "^13.0.0", - "@octokit/plugin-retry": "^8.0.0", - "@octokit/plugin-throttling": "^11.0.0", - "@semantic-release/error": "^4.0.0", - "aggregate-error": "^5.0.0", - "debug": "^4.3.4", - "dir-glob": "^3.0.1", - "globby": "^14.0.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "issue-parser": "^7.0.0", - "lodash-es": "^4.17.21", - "mime": "^4.0.0", - "p-filter": "^4.0.0", - "url-join": "^5.0.0" - }, - "engines": { - "node": ">=20.8.1" - }, - "peerDependencies": { - "semantic-release": ">=24.1.0" - } - }, - "node_modules/@semantic-release/npm": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-12.0.2.tgz", - "integrity": "sha512-+M9/Lb35IgnlUO6OSJ40Ie+hUsZLuph2fqXC/qrKn0fMvUU/jiCjpoL6zEm69vzcmaZJ8yNKtMBEKHWN49WBbQ==", - "dev": true, - "dependencies": { - "@semantic-release/error": "^4.0.0", - "aggregate-error": "^5.0.0", - "execa": "^9.0.0", - "fs-extra": "^11.0.0", - "lodash-es": "^4.17.21", - "nerf-dart": "^1.0.0", - "normalize-url": "^8.0.0", - "npm": "^10.9.3", - "rc": "^1.2.8", - "read-pkg": "^9.0.0", - "registry-auth-token": "^5.0.0", - "semver": "^7.1.2", - "tempy": "^3.0.0" - }, - "engines": { - "node": ">=20.8.1" - }, - "peerDependencies": { - "semantic-release": ">=20.1.0" - } - }, - "node_modules/@semantic-release/release-notes-generator": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-14.0.3.tgz", - "integrity": "sha512-XxAZRPWGwO5JwJtS83bRdoIhCiYIx8Vhr+u231pQAsdFIAbm19rSVJLdnBN+Avvk7CKvNQE/nJ4y7uqKH6WTiw==", - "dev": true, - "dependencies": { - "conventional-changelog-angular": "^8.0.0", - "conventional-changelog-writer": "^8.0.0", - "conventional-commits-filter": "^5.0.0", - "conventional-commits-parser": "^6.0.0", - "debug": "^4.0.0", - "get-stream": "^7.0.0", - "import-from-esm": "^2.0.0", - "into-stream": "^7.0.0", - "lodash-es": "^4.17.21", - "read-package-up": "^11.0.0" - }, - "engines": { - "node": ">=20.8.1" - }, - "peerDependencies": { - "semantic-release": ">=20.1.0" - } - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@sindresorhus/merge-streams": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", - "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true - }, - "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "dev": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/aggregate-error": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", - "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", - "dev": true, - "dependencies": { - "clean-stack": "^5.2.0", - "indent-string": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", - "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", - "dev": true, - "dependencies": { - "environment": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/argv-formatter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", - "integrity": "sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==", - "dev": true - }, - "node_modules/array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", - "dev": true - }, - "node_modules/before-after-hook": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz", - "integrity": "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==", - "dev": true - }, - "node_modules/bottleneck": { - "version": "2.19.5", - "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", - "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", - "dev": true - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/chalk": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.5.0.tgz", - "integrity": "sha512-1tm8DTaJhPBG3bIkVeZt1iZM9GfSX2lzOeDVZH9R9ffRHpmHvxZ/QhgQH/aDTkswQVt+YHdXAdS/In/30OjCbg==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/clean-stack": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.2.0.tgz", - "integrity": "sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==", - "dev": true, - "dependencies": { - "escape-string-regexp": "5.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-highlight": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", - "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "highlight.js": "^10.7.1", - "mz": "^2.4.0", - "parse5": "^5.1.1", - "parse5-htmlparser2-tree-adapter": "^6.0.0", - "yargs": "^16.0.0" - }, - "bin": { - "highlight": "bin/highlight" - }, - "engines": { - "node": ">=8.0.0", - "npm": ">=5.0.0" - } - }, - "node_modules/cli-highlight/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/cli-highlight/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/cli-highlight/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cli-highlight/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/cli-table3": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", - "dev": true, - "dependencies": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - } - }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dev": true, - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/conventional-changelog-angular": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-8.0.0.tgz", - "integrity": "sha512-CLf+zr6St0wIxos4bmaKHRXWAcsCXrJU6F4VdNDrGRK3B8LDLKoX3zuMV5GhtbGkVR/LohZ6MT6im43vZLSjmA==", - "dev": true, - "dependencies": { - "compare-func": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/conventional-changelog-writer": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-8.2.0.tgz", - "integrity": "sha512-Y2aW4596l9AEvFJRwFGJGiQjt2sBYTjPD18DdvxX9Vpz0Z7HQ+g1Z+6iYDAm1vR3QOJrDBkRHixHK/+FhkR6Pw==", - "dev": true, - "dependencies": { - "conventional-commits-filter": "^5.0.0", - "handlebars": "^4.7.7", - "meow": "^13.0.0", - "semver": "^7.5.2" - }, - "bin": { - "conventional-changelog-writer": "dist/cli/index.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/conventional-commits-filter": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-5.0.0.tgz", - "integrity": "sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==", - "dev": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/conventional-commits-parser": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.2.0.tgz", - "integrity": "sha512-uLnoLeIW4XaoFtH37qEcg/SXMJmKF4vi7V0H2rnPueg+VEtFGA/asSCNTcq4M/GQ6QmlzchAEtOoDTtKqWeHag==", - "dev": true, - "dependencies": { - "meow": "^13.0.0" - }, - "bin": { - "conventional-commits-parser": "dist/cli/index.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/convert-hrtime": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-5.0.0.tgz", - "integrity": "sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", - "dev": true, - "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/cosmiconfig/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", - "dev": true, - "dependencies": { - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/crypto-random-string/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - "dev": true, - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/emojilib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", - "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", - "dev": true - }, - "node_modules/env-ci": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-11.1.1.tgz", - "integrity": "sha512-mT3ks8F0kwpo7SYNds6nWj0PaRh+qJxIeBVBXAKTN9hphAzZv7s0QAZQbqnB1fAv/r4pJUGE15BV9UrS31FP2w==", - "dev": true, - "dependencies": { - "execa": "^8.0.0", - "java-properties": "^1.0.2" - }, - "engines": { - "node": "^18.17 || >=20.6.1" - } - }, - "node_modules/env-ci/node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/env-ci/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/env-ci/node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "dev": true, - "engines": { - "node": ">=16.17.0" - } - }, - "node_modules/env-ci/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/env-ci/node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/env-ci/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/env-ci/node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/environment": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/execa": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.0.tgz", - "integrity": "sha512-jpWzZ1ZhwUmeWRhS7Qv3mhpOhLfwI+uAX4e5fOcXqwMR7EcJ0pj2kV1CVzHVMX/LphnKWD3LObjZCoJ71lKpHw==", - "dev": true, - "dependencies": { - "@sindresorhus/merge-streams": "^4.0.0", - "cross-spawn": "^7.0.6", - "figures": "^6.1.0", - "get-stream": "^9.0.0", - "human-signals": "^8.0.1", - "is-plain-obj": "^4.1.0", - "is-stream": "^4.0.1", - "npm-run-path": "^6.0.0", - "pretty-ms": "^9.2.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^4.0.0", - "yoctocolors": "^2.1.1" - }, - "engines": { - "node": "^18.19.0 || >=20.5.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/@sindresorhus/merge-streams": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", - "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/execa/node_modules/get-stream": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", - "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", - "dev": true, - "dependencies": { - "@sec-ant/readable-stream": "^0.4.1", - "is-stream": "^4.0.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/fast-content-type-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz", - "integrity": "sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ] - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/figures": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", - "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", - "dev": true, - "dependencies": { - "is-unicode-supported": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/find-up-simple": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", - "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-versions": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-6.0.0.tgz", - "integrity": "sha512-2kCCtc+JvcZ86IGAz3Z2Y0A1baIz9fL31pH/0S1IqZr9Iwnjq8izfPtrCyQKO6TLMPELLsQMre7VDqeIKCsHkA==", - "dev": true, - "dependencies": { - "semver-regex": "^4.0.5", - "super-regex": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "node_modules/fs-extra": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", - "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/function-timeout": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/function-timeout/-/function-timeout-1.0.2.tgz", - "integrity": "sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-stream": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-7.0.1.tgz", - "integrity": "sha512-3M8C1EOFN6r8AMUhwUAACIoXZJEOufDU5+0gFFN5uNs6XYOralD2Pqkl7m046va6x77FwposWXbAhPPIOus7mQ==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/git-log-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.1.tgz", - "integrity": "sha512-PI+sPDvHXNPl5WNOErAK05s3j0lgwUzMN6o8cyQrDaKfT3qd7TmNJKeXX+SknI5I0QhG5fVPAEwSY4tRGDtYoQ==", - "dev": true, - "dependencies": { - "argv-formatter": "~1.0.0", - "spawn-error-forwarder": "~1.0.0", - "split2": "~1.0.0", - "stream-combiner2": "~1.1.1", - "through2": "~2.0.0", - "traverse": "0.6.8" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globby": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", - "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", - "dev": true, - "dependencies": { - "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.3", - "ignore": "^7.0.3", - "path-type": "^6.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby/node_modules/path-type": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", - "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/highlight.js": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", - "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/hook-std": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-3.0.0.tgz", - "integrity": "sha512-jHRQzjSDzMtFy34AGj1DN+vq54WVuhSvKgrHf0OMiFQTwDD4L/qqofVEWjLOBMTn5+lCD3fPg32W9yOfnEJTTw==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hosted-git-info": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", - "dev": true, - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "dev": true, - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/human-signals": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", - "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", - "dev": true, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-from-esm": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-from-esm/-/import-from-esm-2.0.0.tgz", - "integrity": "sha512-YVt14UZCgsX1vZQ3gKjkWVdBdHQ6eu3MPU1TBgL1H5orXe2+jWD006WCPPtOuwlQm10NuzOW5WawiF1Q9veW8g==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "import-meta-resolve": "^4.0.0" - }, - "engines": { - "node": ">=18.20" - } - }, - "node_modules/import-meta-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", - "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/index-to-position": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.1.0.tgz", - "integrity": "sha512-XPdx9Dq4t9Qk1mTMbWONJqU7boCoumEH7fRET37HX5+khDUl3J2W6PdALxhILYlIYx2amlwYcRPp28p0tSiojg==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/into-stream": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-7.0.0.tgz", - "integrity": "sha512-2dYz766i9HprMBasCMvHMuazJ7u4WzhJwo5kb3iPSiW/iRYV6uPari3zHoqZlnuaR7V1bEiNMxikhp37rdBXbw==", - "dev": true, - "dependencies": { - "from2": "^2.3.0", - "p-is-promise": "^3.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-stream": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", - "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-unicode-supported": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", - "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/issue-parser": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-7.0.1.tgz", - "integrity": "sha512-3YZcUUR2Wt1WsapF+S/WiA2WmlW0cWAoPccMqne7AxEBhCdFeTPjfv/Axb8V2gyCgY3nRw+ksZ3xSUX+R47iAg==", - "dev": true, - "dependencies": { - "lodash.capitalize": "^4.2.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.uniqby": "^4.7.0" - }, - "engines": { - "node": "^18.17 || >=20.6.1" - } - }, - "node_modules/java-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", - "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "dev": true - }, - "node_modules/lodash.capitalize": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", - "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==", - "dev": true - }, - "node_modules/lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", - "dev": true - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "dev": true - }, - "node_modules/lodash.uniqby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", - "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", - "dev": true - }, - "node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true - }, - "node_modules/marked": { - "version": "15.0.12", - "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz", - "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==", - "dev": true, - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/marked-terminal": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-7.3.0.tgz", - "integrity": "sha512-t4rBvPsHc57uE/2nJOLmMbZCQ4tgAccAED3ngXQqW6g+TxA488JzJ+FK3lQkzBQOI1mRV/r/Kq+1ZlJ4D0owQw==", - "dev": true, - "dependencies": { - "ansi-escapes": "^7.0.0", - "ansi-regex": "^6.1.0", - "chalk": "^5.4.1", - "cli-highlight": "^2.1.11", - "cli-table3": "^0.6.5", - "node-emoji": "^2.2.0", - "supports-hyperlinks": "^3.1.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "marked": ">=1 <16" - } - }, - "node_modules/meow": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", - "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/mime/-/mime-4.0.7.tgz", - "integrity": "sha512-2OfDPL+e03E0LrXaGYOtTFIYhiuzep94NSsuhrNULq+stylcJedcHdzHtz0atMUuGwJfFYs0YL5xeC/Ca2x0eQ==", - "dev": true, - "funding": [ - "https://github.com/sponsors/broofa" - ], - "bin": { - "mime": "bin/cli.js" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/nerf-dart": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", - "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==", - "dev": true - }, - "node_modules/node-emoji": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", - "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^4.6.0", - "char-regex": "^1.0.2", - "emojilib": "^2.4.0", - "skin-tone": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/normalize-package-data": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", - "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", - "dev": true, - "dependencies": { - "hosted-git-info": "^7.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/normalize-url": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.2.tgz", - "integrity": "sha512-Ee/R3SyN4BuynXcnTaekmaVdbDAEiNrHqjQIA37mHU8G9pf7aaAD4ZX3XjBLo6rsdcxA/gtkcNYZLt30ACgynw==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm": { - "version": "10.9.3", - "resolved": "https://registry.npmjs.org/npm/-/npm-10.9.3.tgz", - "integrity": "sha512-6Eh1u5Q+kIVXeA8e7l2c/HpnFFcwrkt37xDMujD5be1gloWa9p6j3Fsv3mByXXmqJHy+2cElRMML8opNT7xIJQ==", - "bundleDependencies": [ - "@isaacs/string-locale-compare", - "@npmcli/arborist", - "@npmcli/config", - "@npmcli/fs", - "@npmcli/map-workspaces", - "@npmcli/package-json", - "@npmcli/promise-spawn", - "@npmcli/redact", - "@npmcli/run-script", - "@sigstore/tuf", - "abbrev", - "archy", - "cacache", - "chalk", - "ci-info", - "cli-columns", - "fastest-levenshtein", - "fs-minipass", - "glob", - "graceful-fs", - "hosted-git-info", - "ini", - "init-package-json", - "is-cidr", - "json-parse-even-better-errors", - "libnpmaccess", - "libnpmdiff", - "libnpmexec", - "libnpmfund", - "libnpmhook", - "libnpmorg", - "libnpmpack", - "libnpmpublish", - "libnpmsearch", - "libnpmteam", - "libnpmversion", - "make-fetch-happen", - "minimatch", - "minipass", - "minipass-pipeline", - "ms", - "node-gyp", - "nopt", - "normalize-package-data", - "npm-audit-report", - "npm-install-checks", - "npm-package-arg", - "npm-pick-manifest", - "npm-profile", - "npm-registry-fetch", - "npm-user-validate", - "p-map", - "pacote", - "parse-conflict-json", - "proc-log", - "qrcode-terminal", - "read", - "semver", - "spdx-expression-parse", - "ssri", - "supports-color", - "tar", - "text-table", - "tiny-relative-date", - "treeverse", - "validate-npm-package-name", - "which", - "write-file-atomic" - ], - "dev": true, - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^8.0.1", - "@npmcli/config": "^9.0.0", - "@npmcli/fs": "^4.0.0", - "@npmcli/map-workspaces": "^4.0.2", - "@npmcli/package-json": "^6.2.0", - "@npmcli/promise-spawn": "^8.0.2", - "@npmcli/redact": "^3.2.2", - "@npmcli/run-script": "^9.1.0", - "@sigstore/tuf": "^3.1.1", - "abbrev": "^3.0.1", - "archy": "~1.0.0", - "cacache": "^19.0.1", - "chalk": "^5.4.1", - "ci-info": "^4.2.0", - "cli-columns": "^4.0.0", - "fastest-levenshtein": "^1.0.16", - "fs-minipass": "^3.0.3", - "glob": "^10.4.5", - "graceful-fs": "^4.2.11", - "hosted-git-info": "^8.1.0", - "ini": "^5.0.0", - "init-package-json": "^7.0.2", - "is-cidr": "^5.1.1", - "json-parse-even-better-errors": "^4.0.0", - "libnpmaccess": "^9.0.0", - "libnpmdiff": "^7.0.1", - "libnpmexec": "^9.0.1", - "libnpmfund": "^6.0.1", - "libnpmhook": "^11.0.0", - "libnpmorg": "^7.0.0", - "libnpmpack": "^8.0.1", - "libnpmpublish": "^10.0.1", - "libnpmsearch": "^8.0.0", - "libnpmteam": "^7.0.0", - "libnpmversion": "^7.0.0", - "make-fetch-happen": "^14.0.3", - "minimatch": "^9.0.5", - "minipass": "^7.1.1", - "minipass-pipeline": "^1.2.4", - "ms": "^2.1.2", - "node-gyp": "^11.2.0", - "nopt": "^8.1.0", - "normalize-package-data": "^7.0.0", - "npm-audit-report": "^6.0.0", - "npm-install-checks": "^7.1.1", - "npm-package-arg": "^12.0.2", - "npm-pick-manifest": "^10.0.0", - "npm-profile": "^11.0.1", - "npm-registry-fetch": "^18.0.2", - "npm-user-validate": "^3.0.0", - "p-map": "^7.0.3", - "pacote": "^19.0.1", - "parse-conflict-json": "^4.0.0", - "proc-log": "^5.0.0", - "qrcode-terminal": "^0.12.0", - "read": "^4.1.0", - "semver": "^7.7.2", - "spdx-expression-parse": "^4.0.0", - "ssri": "^12.0.0", - "supports-color": "^9.4.0", - "tar": "^6.2.1", - "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", - "treeverse": "^3.0.0", - "validate-npm-package-name": "^6.0.1", - "which": "^5.0.0", - "write-file-atomic": "^6.0.0" - }, - "bin": { - "npm": "bin/npm-cli.js", - "npx": "bin/npx-cli.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm-run-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", - "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", - "dev": true, - "dependencies": { - "path-key": "^4.0.0", - "unicorn-magic": "^0.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/@isaacs/cliui": { - "version": "8.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/npm/node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.4" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/npm/node_modules/@isaacs/string-locale-compare": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/@npmcli/agent": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "agent-base": "^7.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "lru-cache": "^10.0.1", - "socks-proxy-agent": "^8.0.3" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "8.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/fs": "^4.0.0", - "@npmcli/installed-package-contents": "^3.0.0", - "@npmcli/map-workspaces": "^4.0.1", - "@npmcli/metavuln-calculator": "^8.0.0", - "@npmcli/name-from-folder": "^3.0.0", - "@npmcli/node-gyp": "^4.0.0", - "@npmcli/package-json": "^6.0.1", - "@npmcli/query": "^4.0.0", - "@npmcli/redact": "^3.0.0", - "@npmcli/run-script": "^9.0.1", - "bin-links": "^5.0.0", - "cacache": "^19.0.1", - "common-ancestor-path": "^1.0.1", - "hosted-git-info": "^8.0.0", - "json-parse-even-better-errors": "^4.0.0", - "json-stringify-nice": "^1.1.4", - "lru-cache": "^10.2.2", - "minimatch": "^9.0.4", - "nopt": "^8.0.0", - "npm-install-checks": "^7.1.0", - "npm-package-arg": "^12.0.0", - "npm-pick-manifest": "^10.0.0", - "npm-registry-fetch": "^18.0.1", - "pacote": "^19.0.0", - "parse-conflict-json": "^4.0.0", - "proc-log": "^5.0.0", - "proggy": "^3.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^3.0.1", - "read-package-json-fast": "^4.0.0", - "semver": "^7.3.7", - "ssri": "^12.0.0", - "treeverse": "^3.0.0", - "walk-up-path": "^3.0.1" - }, - "bin": { - "arborist": "bin/index.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/@npmcli/config": { - "version": "9.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/map-workspaces": "^4.0.1", - "@npmcli/package-json": "^6.0.1", - "ci-info": "^4.0.0", - "ini": "^5.0.0", - "nopt": "^8.0.0", - "proc-log": "^5.0.0", - "semver": "^7.3.5", - "walk-up-path": "^3.0.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/@npmcli/fs": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/@npmcli/git": { - "version": "6.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/promise-spawn": "^8.0.0", - "ini": "^5.0.0", - "lru-cache": "^10.0.1", - "npm-pick-manifest": "^10.0.0", - "proc-log": "^5.0.0", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^5.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/@npmcli/installed-package-contents": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-bundled": "^4.0.0", - "npm-normalize-package-bin": "^4.0.0" - }, - "bin": { - "installed-package-contents": "bin/index.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/@npmcli/map-workspaces": { - "version": "4.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/name-from-folder": "^3.0.0", - "@npmcli/package-json": "^6.0.0", - "glob": "^10.2.2", - "minimatch": "^9.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { - "version": "8.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "cacache": "^19.0.0", - "json-parse-even-better-errors": "^4.0.0", - "pacote": "^20.0.0", - "proc-log": "^5.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote": { - "version": "20.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^6.0.0", - "@npmcli/installed-package-contents": "^3.0.0", - "@npmcli/package-json": "^6.0.0", - "@npmcli/promise-spawn": "^8.0.0", - "@npmcli/run-script": "^9.0.0", - "cacache": "^19.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^7.0.2", - "npm-package-arg": "^12.0.0", - "npm-packlist": "^9.0.0", - "npm-pick-manifest": "^10.0.0", - "npm-registry-fetch": "^18.0.0", - "proc-log": "^5.0.0", - "promise-retry": "^2.0.1", - "sigstore": "^3.0.0", - "ssri": "^12.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "bin/index.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/@npmcli/name-from-folder": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/@npmcli/node-gyp": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/@npmcli/package-json": { - "version": "6.2.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^6.0.0", - "glob": "^10.2.2", - "hosted-git-info": "^8.0.0", - "json-parse-even-better-errors": "^4.0.0", - "proc-log": "^5.0.0", - "semver": "^7.5.3", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "8.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "which": "^5.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/@npmcli/query": { - "version": "4.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/@npmcli/redact": { - "version": "3.2.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/@npmcli/run-script": { - "version": "9.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/node-gyp": "^4.0.0", - "@npmcli/package-json": "^6.0.0", - "@npmcli/promise-spawn": "^8.0.0", - "node-gyp": "^11.0.0", - "proc-log": "^5.0.0", - "which": "^5.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/npm/node_modules/@sigstore/protobuf-specs": { - "version": "0.4.3", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/@sigstore/tuf": { - "version": "3.1.1", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.4.1", - "tuf-js": "^3.0.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/@tufjs/canonical-json": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/abbrev": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/agent-base": { - "version": "7.1.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/npm/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/ansi-styles": { - "version": "6.2.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/npm/node_modules/aproba": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/archy": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/balanced-match": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/bin-links": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "cmd-shim": "^7.0.0", - "npm-normalize-package-bin": "^4.0.0", - "proc-log": "^5.0.0", - "read-cmd-shim": "^5.0.0", - "write-file-atomic": "^6.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/binary-extensions": { - "version": "2.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/brace-expansion": { - "version": "2.0.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/npm/node_modules/cacache": { - "version": "19.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^4.0.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^10.0.1", - "minipass": "^7.0.3", - "minipass-collect": "^2.0.1", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^7.0.2", - "ssri": "^12.0.0", - "tar": "^7.4.3", - "unique-filename": "^4.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/cacache/node_modules/chownr": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/npm/node_modules/cacache/node_modules/mkdirp": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/cacache/node_modules/tar": { - "version": "7.4.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/npm/node_modules/cacache/node_modules/yallist": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/npm/node_modules/chalk": { - "version": "5.4.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/npm/node_modules/chownr": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/ci-info": { - "version": "4.2.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/cidr-regex": { - "version": "4.1.3", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "ip-regex": "^5.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/npm/node_modules/cli-columns": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/cmd-shim": { - "version": "7.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/npm/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/common-ancestor-path": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/cross-spawn": { - "version": "7.0.6", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/cssesc": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/debug": { - "version": "4.4.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/npm/node_modules/diff": { - "version": "5.2.0", - "dev": true, - "inBundle": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/npm/node_modules/eastasianwidth": { - "version": "0.2.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/encoding": { - "version": "0.1.13", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/npm/node_modules/env-paths": { - "version": "2.2.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/err-code": { - "version": "2.0.3", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/exponential-backoff": { - "version": "3.1.2", - "dev": true, - "inBundle": true, - "license": "Apache-2.0" - }, - "node_modules/npm/node_modules/fastest-levenshtein": { - "version": "1.0.16", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/npm/node_modules/foreground-child": { - "version": "3.3.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/fs-minipass": { - "version": "3.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/glob": { - "version": "10.4.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/graceful-fs": { - "version": "4.2.11", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/hosted-git-info": { - "version": "8.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/http-cache-semantics": { - "version": "4.2.0", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause" - }, - "node_modules/npm/node_modules/http-proxy-agent": { - "version": "7.0.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/npm/node_modules/https-proxy-agent": { - "version": "7.0.6", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/npm/node_modules/iconv-lite": { - "version": "0.6.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/ignore-walk": { - "version": "7.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minimatch": "^9.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/imurmurhash": { - "version": "0.1.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/npm/node_modules/ini": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/init-package-json": { - "version": "7.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/package-json": "^6.0.0", - "npm-package-arg": "^12.0.0", - "promzard": "^2.0.0", - "read": "^4.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^6.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/ip-address": { - "version": "9.0.5", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/npm/node_modules/ip-regex": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/is-cidr": { - "version": "5.1.1", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "cidr-regex": "^4.1.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/npm/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/isexe": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/jackspeak": { - "version": "3.4.3", - "dev": true, - "inBundle": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/npm/node_modules/jsbn": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/json-stringify-nice": { - "version": "1.1.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/jsonparse": { - "version": "1.3.1", - "dev": true, - "engines": [ - "node >= 0.2.0" - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/just-diff": { - "version": "6.0.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/just-diff-apply": { - "version": "5.5.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/libnpmaccess": { - "version": "9.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-package-arg": "^12.0.0", - "npm-registry-fetch": "^18.0.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/libnpmdiff": { - "version": "7.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^8.0.1", - "@npmcli/installed-package-contents": "^3.0.0", - "binary-extensions": "^2.3.0", - "diff": "^5.1.0", - "minimatch": "^9.0.4", - "npm-package-arg": "^12.0.0", - "pacote": "^19.0.0", - "tar": "^6.2.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/libnpmexec": { - "version": "9.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^8.0.1", - "@npmcli/run-script": "^9.0.1", - "ci-info": "^4.0.0", - "npm-package-arg": "^12.0.0", - "pacote": "^19.0.0", - "proc-log": "^5.0.0", - "read": "^4.0.0", - "read-package-json-fast": "^4.0.0", - "semver": "^7.3.7", - "walk-up-path": "^3.0.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/libnpmfund": { - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^8.0.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/libnpmhook": { - "version": "11.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^18.0.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/libnpmorg": { - "version": "7.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^18.0.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/libnpmpack": { - "version": "8.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^8.0.1", - "@npmcli/run-script": "^9.0.1", - "npm-package-arg": "^12.0.0", - "pacote": "^19.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/libnpmpublish": { - "version": "10.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "ci-info": "^4.0.0", - "normalize-package-data": "^7.0.0", - "npm-package-arg": "^12.0.0", - "npm-registry-fetch": "^18.0.1", - "proc-log": "^5.0.0", - "semver": "^7.3.7", - "sigstore": "^3.0.0", - "ssri": "^12.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/libnpmsearch": { - "version": "8.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-registry-fetch": "^18.0.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/libnpmteam": { - "version": "7.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^18.0.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/libnpmversion": { - "version": "7.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^6.0.1", - "@npmcli/run-script": "^9.0.1", - "json-parse-even-better-errors": "^4.0.0", - "proc-log": "^5.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/lru-cache": { - "version": "10.4.3", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/make-fetch-happen": { - "version": "14.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/agent": "^3.0.0", - "cacache": "^19.0.1", - "http-cache-semantics": "^4.1.1", - "minipass": "^7.0.2", - "minipass-fetch": "^4.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^1.0.0", - "proc-log": "^5.0.0", - "promise-retry": "^2.0.1", - "ssri": "^12.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/make-fetch-happen/node_modules/negotiator": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/npm/node_modules/minimatch": { - "version": "9.0.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/minipass": { - "version": "7.1.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/npm/node_modules/minipass-collect": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/npm/node_modules/minipass-fetch": { - "version": "4.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^3.0.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/npm/node_modules/minipass-flush": { - "version": "1.0.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-pipeline": { - "version": "1.2.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-sized": { - "version": "1.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minizlib": { - "version": "3.0.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "minipass": "^7.1.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/npm/node_modules/mkdirp": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/ms": { - "version": "2.1.3", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/mute-stream": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/node-gyp": { - "version": "11.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^14.0.3", - "nopt": "^8.0.0", - "proc-log": "^5.0.0", - "semver": "^7.3.5", - "tar": "^7.4.3", - "tinyglobby": "^0.2.12", - "which": "^5.0.0" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/chownr": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/mkdirp": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/tar": { - "version": "7.4.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/yallist": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/npm/node_modules/nopt": { - "version": "8.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "abbrev": "^3.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/normalize-package-data": { - "version": "7.0.0", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^8.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/npm-audit-report": { - "version": "6.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/npm-bundled": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-normalize-package-bin": "^4.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/npm-install-checks": { - "version": "7.1.1", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/npm-normalize-package-bin": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/npm-package-arg": { - "version": "12.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "hosted-git-info": "^8.0.0", - "proc-log": "^5.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^6.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/npm-packlist": { - "version": "9.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "ignore-walk": "^7.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/npm-pick-manifest": { - "version": "10.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-install-checks": "^7.1.0", - "npm-normalize-package-bin": "^4.0.0", - "npm-package-arg": "^12.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/npm-profile": { - "version": "11.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-registry-fetch": "^18.0.0", - "proc-log": "^5.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/npm-registry-fetch": { - "version": "18.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/redact": "^3.0.0", - "jsonparse": "^1.3.1", - "make-fetch-happen": "^14.0.0", - "minipass": "^7.0.2", - "minipass-fetch": "^4.0.0", - "minizlib": "^3.0.1", - "npm-package-arg": "^12.0.0", - "proc-log": "^5.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/npm-user-validate": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/p-map": { - "version": "7.0.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/package-json-from-dist": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/npm/node_modules/pacote": { - "version": "19.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^6.0.0", - "@npmcli/installed-package-contents": "^3.0.0", - "@npmcli/package-json": "^6.0.0", - "@npmcli/promise-spawn": "^8.0.0", - "@npmcli/run-script": "^9.0.0", - "cacache": "^19.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^7.0.2", - "npm-package-arg": "^12.0.0", - "npm-packlist": "^9.0.0", - "npm-pick-manifest": "^10.0.0", - "npm-registry-fetch": "^18.0.0", - "proc-log": "^5.0.0", - "promise-retry": "^2.0.1", - "sigstore": "^3.0.0", - "ssri": "^12.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "bin/index.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/parse-conflict-json": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^4.0.0", - "just-diff": "^6.0.0", - "just-diff-apply": "^5.2.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/path-key": { - "version": "3.1.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/path-scurry": { - "version": "1.11.1", - "dev": true, - "inBundle": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/postcss-selector-parser": { - "version": "7.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/proc-log": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/proggy": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/promise-all-reject-late": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promise-call-limit": { - "version": "3.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promise-retry": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/promzard": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "read": "^4.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/qrcode-terminal": { - "version": "0.12.0", - "dev": true, - "inBundle": true, - "bin": { - "qrcode-terminal": "bin/qrcode-terminal.js" - } - }, - "node_modules/npm/node_modules/read": { - "version": "4.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "mute-stream": "^2.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/read-cmd-shim": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/read-package-json-fast": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^4.0.0", - "npm-normalize-package-bin": "^4.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/retry": { - "version": "0.12.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/npm/node_modules/safer-buffer": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true - }, - "node_modules/npm/node_modules/semver": { - "version": "7.7.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/shebang-command": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/shebang-regex": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/signal-exit": { - "version": "4.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/sigstore": { - "version": "3.1.0", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^3.1.0", - "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.4.0", - "@sigstore/sign": "^3.1.0", - "@sigstore/tuf": "^3.1.0", - "@sigstore/verify": "^2.1.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/sigstore/node_modules/@sigstore/bundle": { - "version": "3.1.0", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.4.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/sigstore/node_modules/@sigstore/core": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign": { - "version": "3.1.0", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^3.1.0", - "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.4.0", - "make-fetch-happen": "^14.0.2", - "proc-log": "^5.0.0", - "promise-retry": "^2.0.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/sigstore/node_modules/@sigstore/verify": { - "version": "2.1.1", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^3.1.0", - "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.4.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/smart-buffer": { - "version": "4.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks": { - "version": "2.8.5", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks-proxy-agent": { - "version": "8.0.5", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/npm/node_modules/spdx-correct": { - "version": "3.2.0", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-correct/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-exceptions": { - "version": "2.5.0", - "dev": true, - "inBundle": true, - "license": "CC-BY-3.0" - }, - "node_modules/npm/node_modules/spdx-expression-parse": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.21", - "dev": true, - "inBundle": true, - "license": "CC0-1.0" - }, - "node_modules/npm/node_modules/sprintf-js": { - "version": "1.1.3", - "dev": true, - "inBundle": true, - "license": "BSD-3-Clause" - }, - "node_modules/npm/node_modules/ssri": { - "version": "12.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/supports-color": { - "version": "9.4.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/npm/node_modules/tar": { - "version": "6.2.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/tar/node_modules/fs-minipass": { - "version": "2.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/tar/node_modules/minizlib": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/tar/node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/text-table": { - "version": "0.2.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/tiny-relative-date": { - "version": "1.3.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/tinyglobby": { - "version": "0.2.14", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/npm/node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.6", - "dev": true, - "inBundle": true, - "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/npm/node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/npm/node_modules/treeverse": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/tuf-js": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "@tufjs/models": "3.0.1", - "debug": "^4.3.6", - "make-fetch-happen": "^14.0.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/tuf-js/node_modules/@tufjs/models": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "@tufjs/canonical-json": "2.0.0", - "minimatch": "^9.0.5" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/unique-filename": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^5.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/unique-slug": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/util-deprecate": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/validate-npm-package-license": { - "version": "3.0.4", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/npm/node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/validate-npm-package-name": { - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/walk-up-path": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/which": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/which/node_modules/isexe": { - "version": "3.1.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=16" - } - }, - "node_modules/npm/node_modules/wrap-ansi": { - "version": "8.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/npm/node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "9.2.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/wrap-ansi/node_modules/string-width": { - "version": "5.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/npm/node_modules/write-file-atomic": { - "version": "6.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-each-series": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-3.0.0.tgz", - "integrity": "sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-filter": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-4.1.0.tgz", - "integrity": "sha512-37/tPdZ3oJwHaS3gNJdenCDB3Tz26i9sjhnguBtvN0vYlRIiDNnvTWkuh+0hETV9rLPdJ3rlL3yVOYPIAnM8rw==", - "dev": true, - "dependencies": { - "p-map": "^7.0.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-is-promise": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", - "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-map": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", - "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-reduce": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-3.0.0.tgz", - "integrity": "sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", - "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.26.2", - "index-to-position": "^1.1.0", - "type-fest": "^4.39.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-ms": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", - "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", - "dev": true - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", - "dev": true, - "dependencies": { - "parse5": "^6.0.1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", - "integrity": "sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==", - "dev": true, - "dependencies": { - "find-up": "^2.0.0", - "load-json-file": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pretty-ms": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.2.0.tgz", - "integrity": "sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==", - "dev": true, - "dependencies": { - "parse-ms": "^4.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/read-package-up": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-11.0.0.tgz", - "integrity": "sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==", - "dev": true, - "dependencies": { - "find-up-simple": "^1.0.0", - "read-pkg": "^9.0.0", - "type-fest": "^4.6.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", - "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.3", - "normalize-package-data": "^6.0.0", - "parse-json": "^8.0.0", - "type-fest": "^4.6.0", - "unicorn-magic": "^0.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg/node_modules/unicorn-magic": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/registry-auth-token": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.0.tgz", - "integrity": "sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==", - "dev": true, - "dependencies": { - "@pnpm/npm-conf": "^2.1.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/semantic-release": { - "version": "24.2.7", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-24.2.7.tgz", - "integrity": "sha512-g7RssbTAbir1k/S7uSwSVZFfFXwpomUB9Oas0+xi9KStSCmeDXcA7rNhiskjLqvUe/Evhx8fVCT16OSa34eM5g==", - "dev": true, - "dependencies": { - "@semantic-release/commit-analyzer": "^13.0.0-beta.1", - "@semantic-release/error": "^4.0.0", - "@semantic-release/github": "^11.0.0", - "@semantic-release/npm": "^12.0.2", - "@semantic-release/release-notes-generator": "^14.0.0-beta.1", - "aggregate-error": "^5.0.0", - "cosmiconfig": "^9.0.0", - "debug": "^4.0.0", - "env-ci": "^11.0.0", - "execa": "^9.0.0", - "figures": "^6.0.0", - "find-versions": "^6.0.0", - "get-stream": "^6.0.0", - "git-log-parser": "^1.2.0", - "hook-std": "^3.0.0", - "hosted-git-info": "^8.0.0", - "import-from-esm": "^2.0.0", - "lodash-es": "^4.17.21", - "marked": "^15.0.0", - "marked-terminal": "^7.3.0", - "micromatch": "^4.0.2", - "p-each-series": "^3.0.0", - "p-reduce": "^3.0.0", - "read-package-up": "^11.0.0", - "resolve-from": "^5.0.0", - "semver": "^7.3.2", - "semver-diff": "^4.0.0", - "signale": "^1.2.1", - "yargs": "^17.5.1" - }, - "bin": { - "semantic-release": "bin/semantic-release.js" - }, - "engines": { - "node": ">=20.8.1" - } - }, - "node_modules/semantic-release/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/hosted-git-info": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", - "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", - "dev": true, - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", - "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semver-regex": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-4.0.5.tgz", - "integrity": "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/signale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz", - "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==", - "dev": true, - "dependencies": { - "chalk": "^2.3.2", - "figures": "^2.0.0", - "pkg-conf": "^2.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/signale/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/signale/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/signale/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/signale/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/signale/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/signale/node_modules/figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/signale/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/signale/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/skin-tone": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", - "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", - "dev": true, - "dependencies": { - "unicode-emoji-modifier-base": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spawn-error-forwarder": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", - "integrity": "sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==", - "dev": true - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", - "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", - "dev": true - }, - "node_modules/split2": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", - "integrity": "sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==", - "dev": true, - "dependencies": { - "through2": "~2.0.0" - } - }, - "node_modules/stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", - "dev": true, - "dependencies": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-final-newline": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", - "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/super-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/super-regex/-/super-regex-1.0.0.tgz", - "integrity": "sha512-CY8u7DtbvucKuquCmOFEKhr9Besln7n9uN8eFbwcoGYWXOMW07u2o8njWaiXt11ylS3qoGF55pILjRmPlbodyg==", - "dev": true, - "dependencies": { - "function-timeout": "^1.0.1", - "time-span": "^5.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", - "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=14.18" - }, - "funding": { - "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" - } - }, - "node_modules/temp-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", - "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", - "dev": true, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/tempy": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.1.0.tgz", - "integrity": "sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==", - "dev": true, - "dependencies": { - "is-stream": "^3.0.0", - "temp-dir": "^3.0.0", - "type-fest": "^2.12.2", - "unique-string": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/time-span": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/time-span/-/time-span-5.1.0.tgz", - "integrity": "sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==", - "dev": true, - "dependencies": { - "convert-hrtime": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/traverse": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.8.tgz", - "integrity": "sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/uglify-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", - "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", - "dev": true, - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/unicode-emoji-modifier-base": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", - "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicorn-magic": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", - "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/unique-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", - "dev": true, - "dependencies": { - "crypto-random-string": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/universal-user-agent": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz", - "integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==", - "dev": true - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/url-join": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-5.0.0.tgz", - "integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/yoctocolors": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.1.tgz", - "integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -}